|  | @@ -68,25 +68,27 @@ type AzureLoginService struct {
 | 
	
		
			
				|  |  |  	apiHelper  apiHelper
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -const tokenFilename = "dockerAccessToken.json"
 | 
	
		
			
				|  |  | +const tokenStoreFilename = "dockerAccessToken.json"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func getTokenStorePath() string {
 | 
	
		
			
				|  |  |  	cliPath, _ := cli.AccessTokensPath()
 | 
	
		
			
				|  |  | -	return filepath.Join(filepath.Dir(cliPath), tokenFilename)
 | 
	
		
			
				|  |  | +	return filepath.Join(filepath.Dir(cliPath), tokenStoreFilename)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // NewAzureLoginService creates a NewAzureLoginService
 | 
	
		
			
				|  |  | -func NewAzureLoginService() AzureLoginService {
 | 
	
		
			
				|  |  | +func NewAzureLoginService() (AzureLoginService, error) {
 | 
	
		
			
				|  |  |  	return newAzureLoginServiceFromPath(getTokenStorePath(), azureAPIHelper{})
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func newAzureLoginServiceFromPath(tokenStorePath string, helper apiHelper) AzureLoginService {
 | 
	
		
			
				|  |  | -	return AzureLoginService{
 | 
	
		
			
				|  |  | -		tokenStore: tokenStore{
 | 
	
		
			
				|  |  | -			filePath: tokenStorePath,
 | 
	
		
			
				|  |  | -		},
 | 
	
		
			
				|  |  | -		apiHelper: helper,
 | 
	
		
			
				|  |  | +func newAzureLoginServiceFromPath(tokenStorePath string, helper apiHelper) (AzureLoginService, error) {
 | 
	
		
			
				|  |  | +	store, err := newTokenStore(tokenStorePath)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return AzureLoginService{}, err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +	return AzureLoginService{
 | 
	
		
			
				|  |  | +		tokenStore: store,
 | 
	
		
			
				|  |  | +		apiHelper:  helper,
 | 
	
		
			
				|  |  | +	}, nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  type apiHelper interface {
 | 
	
	
		
			
				|  | @@ -229,20 +231,21 @@ func queryHandler(queryCh chan url.Values) func(w http.ResponseWriter, r *http.R
 | 
	
		
			
				|  |  |  	return queryHandler
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func (helper azureAPIHelper) queryToken(data url.Values, tenantID string) (token azureToken, err error) {
 | 
	
		
			
				|  |  | +func (helper azureAPIHelper) queryToken(data url.Values, tenantID string) (azureToken, error) {
 | 
	
		
			
				|  |  |  	res, err := http.Post(fmt.Sprintf(tokenEndpoint, tenantID), "application/x-www-form-urlencoded", strings.NewReader(data.Encode()))
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  | -		return token, err
 | 
	
		
			
				|  |  | +		return azureToken{}, err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	if res.StatusCode != 200 {
 | 
	
		
			
				|  |  | -		return token, errors.Errorf("error while renewing access token, status : %s", res.Status)
 | 
	
		
			
				|  |  | +		return azureToken{}, errors.Errorf("error while renewing access token, status : %s", res.Status)
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	bits, err := ioutil.ReadAll(res.Body)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  | -		return token, err
 | 
	
		
			
				|  |  | +		return azureToken{}, err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +	token := azureToken{}
 | 
	
		
			
				|  |  |  	if err := json.Unmarshal(bits, &token); err != nil {
 | 
	
		
			
				|  |  | -		return token, err
 | 
	
		
			
				|  |  | +		return azureToken{}, err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	return token, nil
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -259,7 +262,11 @@ func toOAuthToken(token azureToken) oauth2.Token {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // NewAuthorizerFromLogin creates an authorizer based on login access token
 | 
	
		
			
				|  |  | -func (login AzureLoginService) NewAuthorizerFromLogin() (autorest.Authorizer, error) {
 | 
	
		
			
				|  |  | +func NewAuthorizerFromLogin() (autorest.Authorizer, error) {
 | 
	
		
			
				|  |  | +	login, err := NewAzureLoginService()
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return nil, err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  	oauthToken, err := login.GetValidToken()
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		return nil, err
 | 
	
	
		
			
				|  | @@ -278,28 +285,28 @@ func (login AzureLoginService) NewAuthorizerFromLogin() (autorest.Authorizer, er
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // GetValidToken returns an access token. Refresh token if needed
 | 
	
		
			
				|  |  | -func (login AzureLoginService) GetValidToken() (token oauth2.Token, err error) {
 | 
	
		
			
				|  |  | +func (login AzureLoginService) GetValidToken() (oauth2.Token, error) {
 | 
	
		
			
				|  |  |  	loginInfo, err := login.tokenStore.readToken()
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  | -		return token, err
 | 
	
		
			
				|  |  | +		return oauth2.Token{}, err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	token = loginInfo.Token
 | 
	
		
			
				|  |  | +	token := loginInfo.Token
 | 
	
		
			
				|  |  |  	if token.Valid() {
 | 
	
		
			
				|  |  |  		return token, nil
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	tenantID := loginInfo.TenantID
 | 
	
		
			
				|  |  |  	token, err = login.refreshToken(token.RefreshToken, tenantID)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  | -		return token, errors.Wrap(err, "access token request failed. Maybe you need to login to azure again.")
 | 
	
		
			
				|  |  | +		return oauth2.Token{}, errors.Wrap(err, "access token request failed. Maybe you need to login to azure again.")
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	err = login.tokenStore.writeLoginInfo(TokenInfo{TenantID: tenantID, Token: token})
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  | -		return token, err
 | 
	
		
			
				|  |  | +		return oauth2.Token{}, err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	return token, nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func (login AzureLoginService) refreshToken(currentRefreshToken string, tenantID string) (oauthToken oauth2.Token, err error) {
 | 
	
		
			
				|  |  | +func (login AzureLoginService) refreshToken(currentRefreshToken string, tenantID string) (oauth2.Token, error) {
 | 
	
		
			
				|  |  |  	data := url.Values{
 | 
	
		
			
				|  |  |  		"grant_type":    []string{"refresh_token"},
 | 
	
		
			
				|  |  |  		"client_id":     []string{clientID},
 | 
	
	
		
			
				|  | @@ -308,7 +315,7 @@ func (login AzureLoginService) refreshToken(currentRefreshToken string, tenantID
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	token, err := login.apiHelper.queryToken(data, tenantID)
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  | -		return oauthToken, err
 | 
	
		
			
				|  |  | +		return oauth2.Token{}, err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	return toOAuthToken(token), nil
 |