in commands/token/revoke/revoke.go [101:212]
func revokeTokenRun(opts *RevokeOptions) error {
httpClient, err := opts.HTTPClient()
if err != nil {
return err
}
var outputToken any
var outputTokenValue string
if opts.User != "" {
user, err := api.UserByName(httpClient, opts.User)
if err != nil {
return cmdutils.FlagError{Err: err}
}
options := &gitlab.ListPersonalAccessTokensOptions{
ListOptions: gitlab.ListOptions{PerPage: 100},
UserID: &user.ID,
}
tokens, err := api.ListPersonalAccessTokens(httpClient, options)
if err != nil {
return err
}
var token *gitlab.PersonalAccessToken
tokens = filter.Filter(tokens, func(t *gitlab.PersonalAccessToken) bool {
return t.Active && (t.Name == opts.Name || t.ID == opts.TokenId)
})
switch len(tokens) {
case 1:
token = tokens[0]
case 0:
return cmdutils.FlagError{Err: fmt.Errorf("no token found with the name '%v'.", opts.Name)}
default:
return cmdutils.FlagError{Err: fmt.Errorf("multiple tokens found with the name '%v'. Use the ID instead.", opts.Name)}
}
if err = api.RevokePersonalAccessToken(httpClient, token.ID); err != nil {
return err
}
token.Revoked = true
outputToken = token
outputTokenValue = fmt.Sprintf("revoked %s %s %d", opts.User, token.Name, token.ID)
} else {
if opts.Group != "" {
options := &gitlab.ListGroupAccessTokensOptions{PerPage: 100}
tokens, err := api.ListGroupAccessTokens(httpClient, opts.Group, options)
if err != nil {
return err
}
var token *gitlab.GroupAccessToken
tokens = filter.Filter(tokens, func(t *gitlab.GroupAccessToken) bool {
return t.Active && (t.Name == opts.Name || t.ID == opts.TokenId)
})
switch len(tokens) {
case 1:
token = tokens[0]
case 0:
return cmdutils.FlagError{Err: fmt.Errorf("no token found with the name '%v'.", opts.Name)}
default:
return cmdutils.FlagError{Err: fmt.Errorf("multiple tokens found with the name '%v'. Use the ID instead.", opts.Name)}
}
if err = api.RevokeGroupAccessToken(httpClient, opts.Group, token.ID); err != nil {
return err
}
token.Revoked = true
outputToken = token
outputTokenValue = fmt.Sprintf("revoked %s %d", token.Name, token.ID)
} else {
repo, err := opts.BaseRepo()
if err != nil {
return err
}
options := &gitlab.ListProjectAccessTokensOptions{ListOptions: gitlab.ListOptions{PerPage: 100}}
tokens, err := api.ListProjectAccessTokens(httpClient, repo.FullName(), options)
if err != nil {
return err
}
tokens = filter.Filter(tokens, func(t *gitlab.ProjectAccessToken) bool {
return t.Active && (t.Name == opts.Name || t.ID == opts.TokenId)
})
var token *gitlab.ProjectAccessToken
switch len(tokens) {
case 1:
token = tokens[0]
case 0:
return cmdutils.FlagError{Err: fmt.Errorf("no token found with the name '%v'.", opts.Name)}
default:
return cmdutils.FlagError{Err: fmt.Errorf("multiple tokens found with the name '%v'. Use the ID instead.", opts.Name)}
}
if err = api.RevokeProjectAccessToken(httpClient, repo.FullName(), token.ID); err != nil {
return err
}
token.Revoked = true
outputToken = token
outputTokenValue = fmt.Sprintf("revoked %s %d", token.Name, token.ID)
}
}
if opts.OutputFormat == "json" {
encoder := json.NewEncoder(opts.IO.StdOut)
if err := encoder.Encode(outputToken); err != nil {
return err
}
} else {
if _, err := opts.IO.StdOut.Write([]byte(outputTokenValue)); err != nil {
return err
}
}
return nil
}