github.com/jfrog/jfrog-cli-core/v2@v2.51.0/artifactory/commands/generic/createaccesstoken.go (about) 1 package generic 2 3 import ( 4 "encoding/json" 5 "github.com/jfrog/jfrog-client-go/auth" 6 "strings" 7 8 rtUtils "github.com/jfrog/jfrog-cli-core/v2/artifactory/utils" 9 "github.com/jfrog/jfrog-cli-core/v2/utils/config" 10 "github.com/jfrog/jfrog-client-go/artifactory/services" 11 "github.com/jfrog/jfrog-client-go/utils/errorutils" 12 ) 13 14 const ( 15 GroupsPrefix = "member-of-groups:" 16 UserScopedNotation = "*" 17 AdminPrivilegesSuffix = ":admin" 18 ) 19 20 type AccessTokenCreateCommand struct { 21 serverDetails *config.ServerDetails 22 refreshable bool 23 expiry int 24 userName string 25 audience string 26 groups string 27 grantAdmin bool 28 response *auth.CreateTokenResponseData 29 } 30 31 func NewAccessTokenCreateCommand() *AccessTokenCreateCommand { 32 return &AccessTokenCreateCommand{response: new(auth.CreateTokenResponseData)} 33 } 34 35 func (atcc *AccessTokenCreateCommand) SetServerDetails(serverDetails *config.ServerDetails) *AccessTokenCreateCommand { 36 atcc.serverDetails = serverDetails 37 return atcc 38 } 39 40 func (atcc *AccessTokenCreateCommand) SetRefreshable(refreshable bool) *AccessTokenCreateCommand { 41 atcc.refreshable = refreshable 42 return atcc 43 } 44 45 func (atcc *AccessTokenCreateCommand) SetExpiry(expiry int) *AccessTokenCreateCommand { 46 atcc.expiry = expiry 47 return atcc 48 } 49 50 func (atcc *AccessTokenCreateCommand) SetUserName(userName string) *AccessTokenCreateCommand { 51 atcc.userName = userName 52 return atcc 53 } 54 55 func (atcc *AccessTokenCreateCommand) SetAudience(audience string) *AccessTokenCreateCommand { 56 atcc.audience = audience 57 return atcc 58 } 59 60 func (atcc *AccessTokenCreateCommand) SetGrantAdmin(grantAdmin bool) *AccessTokenCreateCommand { 61 atcc.grantAdmin = grantAdmin 62 return atcc 63 } 64 65 func (atcc *AccessTokenCreateCommand) SetGroups(groups string) *AccessTokenCreateCommand { 66 atcc.groups = groups 67 return atcc 68 } 69 70 func (atcc *AccessTokenCreateCommand) Response() ([]byte, error) { 71 content, err := json.Marshal(*atcc.response) 72 return content, errorutils.CheckError(err) 73 } 74 75 func (atcc *AccessTokenCreateCommand) ServerDetails() (*config.ServerDetails, error) { 76 return atcc.serverDetails, nil 77 } 78 79 func (atcc *AccessTokenCreateCommand) CommandName() string { 80 return "rt_create_access_token" 81 } 82 83 func (atcc *AccessTokenCreateCommand) Run() error { 84 servicesManager, err := rtUtils.CreateServiceManager(atcc.serverDetails, -1, 0, false) 85 if err != nil { 86 return err 87 } 88 tokenParams, err := atcc.getTokenParams() 89 if err != nil { 90 return err 91 } 92 93 *atcc.response, err = servicesManager.CreateToken(tokenParams) 94 return err 95 } 96 97 func (atcc *AccessTokenCreateCommand) getTokenParams() (tokenParams services.CreateTokenParams, err error) { 98 tokenParams = services.NewCreateTokenParams() 99 tokenParams.ExpiresIn = atcc.expiry 100 tokenParams.Refreshable = atcc.refreshable 101 tokenParams.Audience = atcc.audience 102 // Artifactory expects the username to be lower-cased. In case it is not, 103 // Artifactory will still accept a non-lower-cased user, except for token related actions. 104 tokenParams.Username = strings.ToLower(atcc.userName) 105 // By default, we will create "user-scoped token", unless specific groups or admin-privilege-instance were specified 106 if len(atcc.groups) == 0 && !atcc.grantAdmin { 107 atcc.groups = UserScopedNotation 108 } 109 if len(atcc.groups) > 0 { 110 tokenParams.Scope = GroupsPrefix + atcc.groups 111 } 112 if atcc.grantAdmin { 113 instanceId, err := getInstanceId(atcc.serverDetails) 114 if err != nil { 115 return tokenParams, err 116 } 117 if len(tokenParams.Scope) > 0 { 118 tokenParams.Scope += " " 119 } 120 tokenParams.Scope += instanceId + AdminPrivilegesSuffix 121 } 122 123 return 124 } 125 126 func getInstanceId(serverDetails *config.ServerDetails) (string, error) { 127 servicesManager, err := rtUtils.CreateServiceManager(serverDetails, -1, 0, false) 128 if err != nil { 129 return "", err 130 } 131 return servicesManager.GetServiceId() 132 }