loading up the forgejo repo on tangled to test page performance
1// Copyright 2023 The Gitea Authors. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4package cmd
5
6import (
7 "errors"
8 "fmt"
9
10 auth_model "forgejo.org/models/auth"
11 user_model "forgejo.org/models/user"
12
13 "github.com/urfave/cli/v2"
14)
15
16var 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: "all",
38 Usage: `Comma separated list of scopes to apply to access token, examples: "all", "public-only,read:issue", "write:repository,write:user"`,
39 },
40 },
41 Action: runGenerateAccessToken,
42}
43
44func 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 if !accessTokenScope.HasPermissionScope() {
81 return errors.New("access token does not have any permission")
82 }
83 t.Scope = accessTokenScope
84
85 // create the token
86 if err := auth_model.NewAccessToken(ctx, t); err != nil {
87 return err
88 }
89
90 if c.Bool("raw") {
91 fmt.Printf("%s\n", t.Token)
92 } else {
93 fmt.Printf("Access token was successfully created: %s\n", t.Token)
94 }
95
96 return nil
97}