You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

admin_user_generate_access_token.go 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package cmd
  4. import (
  5. "fmt"
  6. auth_model "code.gitea.io/gitea/models/auth"
  7. user_model "code.gitea.io/gitea/models/user"
  8. "github.com/urfave/cli/v2"
  9. )
  10. var microcmdUserGenerateAccessToken = &cli.Command{
  11. Name: "generate-access-token",
  12. Usage: "Generate an access token for a specific user",
  13. Flags: []cli.Flag{
  14. &cli.StringFlag{
  15. Name: "username",
  16. Aliases: []string{"u"},
  17. Usage: "Username",
  18. },
  19. &cli.StringFlag{
  20. Name: "token-name",
  21. Aliases: []string{"t"},
  22. Usage: "Token name",
  23. Value: "gitea-admin",
  24. },
  25. &cli.BoolFlag{
  26. Name: "raw",
  27. Usage: "Display only the token value",
  28. },
  29. &cli.StringFlag{
  30. Name: "scopes",
  31. Value: "",
  32. Usage: "Comma separated list of scopes to apply to access token",
  33. },
  34. },
  35. Action: runGenerateAccessToken,
  36. }
  37. func runGenerateAccessToken(c *cli.Context) error {
  38. if !c.IsSet("username") {
  39. return fmt.Errorf("You must provide a username to generate a token for")
  40. }
  41. ctx, cancel := installSignals()
  42. defer cancel()
  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 fmt.Errorf("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. t.Scope = accessTokenScope
  68. // create the token
  69. if err := auth_model.NewAccessToken(ctx, t); err != nil {
  70. return err
  71. }
  72. if c.Bool("raw") {
  73. fmt.Printf("%s\n", t.Token)
  74. } else {
  75. fmt.Printf("Access token was successfully created: %s\n", t.Token)
  76. }
  77. return nil
  78. }