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  }