gitea源码

admin_user_generate_access_token.go 2.2KB

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