code.gitea.io/gitea@v1.22.3/cmd/admin_user_generate_access_token.go (about)

     1  // Copyright 2023 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package cmd
     5  
     6  import (
     7  	"errors"
     8  	"fmt"
     9  
    10  	auth_model "code.gitea.io/gitea/models/auth"
    11  	user_model "code.gitea.io/gitea/models/user"
    12  
    13  	"github.com/urfave/cli/v2"
    14  )
    15  
    16  var microcmdUserGenerateAccessToken = &cli.Command{
    17  	Name:  "generate-access-token",
    18  	Usage: "Generate an access token for a specific user",
    19  	Flags: []cli.Flag{
    20  		&cli.StringFlag{
    21  			Name:    "username",
    22  			Aliases: []string{"u"},
    23  			Usage:   "Username",
    24  		},
    25  		&cli.StringFlag{
    26  			Name:    "token-name",
    27  			Aliases: []string{"t"},
    28  			Usage:   "Token name",
    29  			Value:   "gitea-admin",
    30  		},
    31  		&cli.BoolFlag{
    32  			Name:  "raw",
    33  			Usage: "Display only the token value",
    34  		},
    35  		&cli.StringFlag{
    36  			Name:  "scopes",
    37  			Value: "",
    38  			Usage: "Comma separated list of scopes to apply to access token",
    39  		},
    40  	},
    41  	Action: runGenerateAccessToken,
    42  }
    43  
    44  func runGenerateAccessToken(c *cli.Context) error {
    45  	if !c.IsSet("username") {
    46  		return errors.New("You must provide a username to generate a token for")
    47  	}
    48  
    49  	ctx, cancel := installSignals()
    50  	defer cancel()
    51  
    52  	if err := initDB(ctx); err != nil {
    53  		return err
    54  	}
    55  
    56  	user, err := user_model.GetUserByName(ctx, c.String("username"))
    57  	if err != nil {
    58  		return err
    59  	}
    60  
    61  	// construct token with name and user so we can make sure it is unique
    62  	t := &auth_model.AccessToken{
    63  		Name: c.String("token-name"),
    64  		UID:  user.ID,
    65  	}
    66  
    67  	exist, err := auth_model.AccessTokenByNameExists(ctx, t)
    68  	if err != nil {
    69  		return err
    70  	}
    71  	if exist {
    72  		return errors.New("access token name has been used already")
    73  	}
    74  
    75  	// make sure the scopes are valid
    76  	accessTokenScope, err := auth_model.AccessTokenScope(c.String("scopes")).Normalize()
    77  	if err != nil {
    78  		return fmt.Errorf("invalid access token scope provided: %w", err)
    79  	}
    80  	t.Scope = accessTokenScope
    81  
    82  	// create the token
    83  	if err := auth_model.NewAccessToken(ctx, t); err != nil {
    84  		return err
    85  	}
    86  
    87  	if c.Bool("raw") {
    88  		fmt.Printf("%s\n", t.Token)
    89  	} else {
    90  		fmt.Printf("Access token was successfully created: %s\n", t.Token)
    91  	}
    92  
    93  	return nil
    94  }