|  | @@ -22,14 +22,13 @@ import (
 | 
											
												
													
														|  |  	"fmt"
 |  |  	"fmt"
 | 
											
												
													
														|  |  	"net/http"
 |  |  	"net/http"
 | 
											
												
													
														|  |  	"net/url"
 |  |  	"net/url"
 | 
											
												
													
														|  | -	"path/filepath"
 |  | 
 | 
											
												
													
														|  | 
 |  | +	"os"
 | 
											
												
													
														|  |  	"strconv"
 |  |  	"strconv"
 | 
											
												
													
														|  |  	"time"
 |  |  	"time"
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	"github.com/Azure/go-autorest/autorest"
 |  |  	"github.com/Azure/go-autorest/autorest"
 | 
											
												
													
														|  |  	"github.com/Azure/go-autorest/autorest/adal"
 |  |  	"github.com/Azure/go-autorest/autorest/adal"
 | 
											
												
													
														|  |  	auth2 "github.com/Azure/go-autorest/autorest/azure/auth"
 |  |  	auth2 "github.com/Azure/go-autorest/autorest/azure/auth"
 | 
											
												
													
														|  | -	"github.com/Azure/go-autorest/autorest/azure/cli"
 |  | 
 | 
											
												
													
														|  |  	"github.com/Azure/go-autorest/autorest/date"
 |  |  	"github.com/Azure/go-autorest/autorest/date"
 | 
											
												
													
														|  |  	"github.com/pkg/errors"
 |  |  	"github.com/pkg/errors"
 | 
											
												
													
														|  |  	"golang.org/x/oauth2"
 |  |  	"golang.org/x/oauth2"
 | 
											
										
											
												
													
														|  | @@ -80,7 +79,7 @@ const tokenStoreFilename = "dockerAccessToken.json"
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  // NewAzureLoginService creates a NewAzureLoginService
 |  |  // NewAzureLoginService creates a NewAzureLoginService
 | 
											
												
													
														|  |  func NewAzureLoginService() (AzureLoginService, error) {
 |  |  func NewAzureLoginService() (AzureLoginService, error) {
 | 
											
												
													
														|  | -	return newAzureLoginServiceFromPath(getTokenStorePath(), azureAPIHelper{})
 |  | 
 | 
											
												
													
														|  | 
 |  | +	return newAzureLoginServiceFromPath(GetTokenStorePath(), azureAPIHelper{})
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  func newAzureLoginServiceFromPath(tokenStorePath string, helper apiHelper) (AzureLoginService, error) {
 |  |  func newAzureLoginServiceFromPath(tokenStorePath string, helper apiHelper) (AzureLoginService, error) {
 | 
											
										
											
												
													
														|  | @@ -120,6 +119,15 @@ func (login AzureLoginService) TestLoginFromServicePrincipal(clientID string, cl
 | 
											
												
													
														|  |  	return nil
 |  |  	return nil
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +// Logout remove azure token data
 | 
											
												
													
														|  | 
 |  | +func (login AzureLoginService) Logout(ctx context.Context) error {
 | 
											
												
													
														|  | 
 |  | +	err := login.tokenStore.removeData()
 | 
											
												
													
														|  | 
 |  | +	if os.IsNotExist(err) {
 | 
											
												
													
														|  | 
 |  | +		return errors.New("No Azure login data to be removed")
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	return err
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  // Login performs an Azure login through a web browser
 |  |  // Login performs an Azure login through a web browser
 | 
											
												
													
														|  |  func (login AzureLoginService) Login(ctx context.Context, requestedTenantID string) error {
 |  |  func (login AzureLoginService) Login(ctx context.Context, requestedTenantID string) error {
 | 
											
												
													
														|  |  	queryCh := make(chan localResponse, 1)
 |  |  	queryCh := make(chan localResponse, 1)
 | 
											
										
											
												
													
														|  | @@ -208,11 +216,6 @@ func getTenantID(tenantValues []tenantValue, requestedTenantID string) (string,
 | 
											
												
													
														|  |  	return "", errors.Errorf("could not find requested azure tenant %s", requestedTenantID)
 |  |  	return "", errors.Errorf("could not find requested azure tenant %s", requestedTenantID)
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -func getTokenStorePath() string {
 |  | 
 | 
											
												
													
														|  | -	cliPath, _ := cli.AccessTokensPath()
 |  | 
 | 
											
												
													
														|  | -	return filepath.Join(filepath.Dir(cliPath), tokenStoreFilename)
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  |  func toOAuthToken(token azureToken) oauth2.Token {
 |  |  func toOAuthToken(token azureToken) oauth2.Token {
 | 
											
												
													
														|  |  	expireTime := time.Now().Add(time.Duration(token.ExpiresIn) * time.Second)
 |  |  	expireTime := time.Now().Add(time.Duration(token.ExpiresIn) * time.Second)
 | 
											
												
													
														|  |  	oauthToken := oauth2.Token{
 |  |  	oauthToken := oauth2.Token{
 | 
											
										
											
												
													
														|  | @@ -241,7 +244,7 @@ func spToOAuthToken(token adal.Token) (oauth2.Token, error) {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  // NewAuthorizerFromLogin creates an authorizer based on login access token
 |  |  // NewAuthorizerFromLogin creates an authorizer based on login access token
 | 
											
												
													
														|  |  func NewAuthorizerFromLogin() (autorest.Authorizer, error) {
 |  |  func NewAuthorizerFromLogin() (autorest.Authorizer, error) {
 | 
											
												
													
														|  | -	return newAuthorizerFromLoginStorePath(getTokenStorePath())
 |  | 
 | 
											
												
													
														|  | 
 |  | +	return newAuthorizerFromLoginStorePath(GetTokenStorePath())
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  func newAuthorizerFromLoginStorePath(storeTokenPath string) (autorest.Authorizer, error) {
 |  |  func newAuthorizerFromLoginStorePath(storeTokenPath string) (autorest.Authorizer, error) {
 |