github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/command/v6/oauth_token_command.go (about)

     1  package v6
     2  
     3  import (
     4  	"errors"
     5  	"time"
     6  
     7  	"code.cloudfoundry.org/cli/actor/sharedaction"
     8  	"code.cloudfoundry.org/cli/actor/v2action"
     9  	"code.cloudfoundry.org/cli/api/uaa/constant"
    10  	"code.cloudfoundry.org/cli/command"
    11  	"code.cloudfoundry.org/cli/command/v6/shared"
    12  	"github.com/SermoDigital/jose/jwt"
    13  )
    14  
    15  //go:generate counterfeiter . OauthTokenActor
    16  
    17  type OauthTokenActor interface {
    18  	RefreshAccessToken(refreshToken string) (string, error)
    19  	ParseAccessToken(accessToken string) (jwt.JWT, error)
    20  }
    21  
    22  type OauthTokenCommand struct {
    23  	usage           interface{} `usage:"CF_NAME oauth-token"`
    24  	relatedCommands interface{} `related_commands:"curl"`
    25  
    26  	UI          command.UI
    27  	Config      command.Config
    28  	SharedActor command.SharedActor
    29  	Actor       OauthTokenActor
    30  }
    31  
    32  func (cmd *OauthTokenCommand) Setup(config command.Config, ui command.UI) error {
    33  	cmd.UI = ui
    34  	cmd.Config = config
    35  	cmd.SharedActor = sharedaction.NewActor(config)
    36  
    37  	ccClient, uaaClient, err := shared.GetNewClientsAndConnectToCF(config, ui)
    38  	if err != nil {
    39  		return err
    40  	}
    41  	cmd.Actor = v2action.NewActor(ccClient, uaaClient, config)
    42  
    43  	return nil
    44  }
    45  
    46  func (cmd OauthTokenCommand) Execute(_ []string) error {
    47  	err := cmd.SharedActor.CheckTarget(false, false)
    48  	if err != nil {
    49  		return err
    50  	}
    51  
    52  	if cmd.Config.UAAGrantType() == string(constant.GrantTypeClientCredentials) && cmd.Config.UAAOAuthClientSecret() == "" {
    53  		token, err := cmd.Actor.ParseAccessToken(cmd.Config.AccessToken())
    54  		if err != nil {
    55  			return errors.New(cmd.UI.TranslateText("Access token is invalid."))
    56  		}
    57  
    58  		expiration, success := token.Claims().Expiration()
    59  		if !success {
    60  			return errors.New(cmd.UI.TranslateText("Access token is missing expiration claim."))
    61  		}
    62  
    63  		if expiration.Before(time.Now()) {
    64  			return errors.New(cmd.UI.TranslateText("Access token has expired."))
    65  		}
    66  
    67  		cmd.UI.DisplayText(cmd.Config.AccessToken())
    68  		return nil
    69  	}
    70  
    71  	accessToken, err := cmd.Actor.RefreshAccessToken(cmd.Config.RefreshToken())
    72  	if err != nil {
    73  		return err
    74  	}
    75  
    76  	cmd.UI.DisplayText(accessToken)
    77  	return nil
    78  }