Skip to content

Commit ff1dea1

Browse files
committed
Merge branch 'swift-package-manager-publishing-using-commandline-throws-error' of github.com:wgr1984/gitea into swift-package-manager-publishing-using-commandline-throws-error
2 parents b301b6c + feaff14 commit ff1dea1

File tree

699 files changed

+4658
-3781
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

699 files changed

+4658
-3781
lines changed

.golangci.yml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,17 @@ linters:
1313
- gocritic
1414
- govet
1515
- ineffassign
16+
- mirror
1617
- nakedret
1718
- nolintlint
19+
- perfsprint
1820
- revive
1921
- staticcheck
2022
- testifylint
2123
- unconvert
2224
- unparam
2325
- unused
26+
- usestdlibvars
2427
- usetesting
2528
- wastedassign
2629
settings:
@@ -92,10 +95,6 @@ linters:
9295
disable:
9396
- go-require
9497
- require-error
95-
- equal-values
96-
- empty
97-
- formatter
98-
- len
9998
usetesting:
10099
os-temp-dir: true
101100
exclusions:

cmd/admin_auth_ldap_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -229,11 +229,11 @@ func TestAddLdapBindDn(t *testing.T) {
229229
return nil
230230
},
231231
updateAuthSource: func(ctx context.Context, authSource *auth.Source) error {
232-
assert.FailNow(t, "case %d: should not call updateAuthSource", n)
232+
assert.FailNow(t, "updateAuthSource called", "case %d: should not call updateAuthSource", n)
233233
return nil
234234
},
235235
getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) {
236-
assert.FailNow(t, "case %d: should not call getAuthSourceByID", n)
236+
assert.FailNow(t, "getAuthSourceByID called", "case %d: should not call getAuthSourceByID", n)
237237
return nil, nil
238238
},
239239
}
@@ -460,11 +460,11 @@ func TestAddLdapSimpleAuth(t *testing.T) {
460460
return nil
461461
},
462462
updateAuthSource: func(ctx context.Context, authSource *auth.Source) error {
463-
assert.FailNow(t, "case %d: should not call updateAuthSource", n)
463+
assert.FailNow(t, "updateAuthSource called", "case %d: should not call updateAuthSource", n)
464464
return nil
465465
},
466466
getAuthSourceByID: func(ctx context.Context, id int64) (*auth.Source, error) {
467-
assert.FailNow(t, "case %d: should not call getAuthSourceByID", n)
467+
assert.FailNow(t, "getAuthSourceById called", "case %d: should not call getAuthSourceByID", n)
468468
return nil, nil
469469
},
470470
}
@@ -925,7 +925,7 @@ func TestUpdateLdapBindDn(t *testing.T) {
925925
return nil
926926
},
927927
createAuthSource: func(ctx context.Context, authSource *auth.Source) error {
928-
assert.FailNow(t, "case %d: should not call createAuthSource", n)
928+
assert.FailNow(t, "createAuthSource called", "case %d: should not call createAuthSource", n)
929929
return nil
930930
},
931931
updateAuthSource: func(ctx context.Context, authSource *auth.Source) error {
@@ -1315,7 +1315,7 @@ func TestUpdateLdapSimpleAuth(t *testing.T) {
13151315
return nil
13161316
},
13171317
createAuthSource: func(ctx context.Context, authSource *auth.Source) error {
1318-
assert.FailNow(t, "case %d: should not call createAuthSource", n)
1318+
assert.FailNow(t, "createAuthSource called", "case %d: should not call createAuthSource", n)
13191319
return nil
13201320
},
13211321
updateAuthSource: func(ctx context.Context, authSource *auth.Source) error {

cmd/admin_user_create.go

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"errors"
99
"fmt"
10+
"strings"
1011

1112
auth_model "code.gitea.io/gitea/models/auth"
1213
"code.gitea.io/gitea/models/db"
@@ -66,6 +67,16 @@ var microcmdUserCreate = &cli.Command{
6667
Name: "access-token",
6768
Usage: "Generate access token for the user",
6869
},
70+
&cli.StringFlag{
71+
Name: "access-token-name",
72+
Usage: `Name of the generated access token`,
73+
Value: "gitea-admin",
74+
},
75+
&cli.StringFlag{
76+
Name: "access-token-scopes",
77+
Usage: `Scopes of the generated access token, comma separated. Examples: "all", "public-only,read:issue", "write:repository,write:user"`,
78+
Value: "all",
79+
},
6980
&cli.BoolFlag{
7081
Name: "restricted",
7182
Usage: "Make a restricted user account",
@@ -187,23 +198,40 @@ func runCreateUser(c *cli.Context) error {
187198
IsRestricted: restricted,
188199
}
189200

201+
var accessTokenName string
202+
var accessTokenScope auth_model.AccessTokenScope
203+
if c.IsSet("access-token") {
204+
accessTokenName = strings.TrimSpace(c.String("access-token-name"))
205+
if accessTokenName == "" {
206+
return errors.New("access-token-name cannot be empty")
207+
}
208+
var err error
209+
accessTokenScope, err = auth_model.AccessTokenScope(c.String("access-token-scopes")).Normalize()
210+
if err != nil {
211+
return fmt.Errorf("invalid access token scope provided: %w", err)
212+
}
213+
if !accessTokenScope.HasPermissionScope() {
214+
return errors.New("access token does not have any permission")
215+
}
216+
} else if c.IsSet("access-token-name") || c.IsSet("access-token-scopes") {
217+
return errors.New("access-token-name and access-token-scopes flags are only valid when access-token flag is set")
218+
}
219+
220+
// arguments should be prepared before creating the user & access token, in case there is anything wrong
221+
222+
// create the user
190223
if err := user_model.CreateUser(ctx, u, &user_model.Meta{}, overwriteDefault); err != nil {
191224
return fmt.Errorf("CreateUser: %w", err)
192225
}
226+
fmt.Printf("New user '%s' has been successfully created!\n", username)
193227

194-
if c.Bool("access-token") {
195-
t := &auth_model.AccessToken{
196-
Name: "gitea-admin",
197-
UID: u.ID,
198-
}
199-
228+
// create the access token
229+
if accessTokenScope != "" {
230+
t := &auth_model.AccessToken{Name: accessTokenName, UID: u.ID, Scope: accessTokenScope}
200231
if err := auth_model.NewAccessToken(ctx, t); err != nil {
201232
return err
202233
}
203-
204234
fmt.Printf("Access token was successfully created... %s\n", t.Token)
205235
}
206-
207-
fmt.Printf("New user '%s' has been successfully created!\n", username)
208236
return nil
209237
}

cmd/admin_user_create_test.go

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"strings"
99
"testing"
1010

11+
auth_model "code.gitea.io/gitea/models/auth"
1112
"code.gitea.io/gitea/models/db"
1213
"code.gitea.io/gitea/models/unittest"
1314
user_model "code.gitea.io/gitea/models/user"
@@ -22,6 +23,7 @@ func TestAdminUserCreate(t *testing.T) {
2223
reset := func() {
2324
require.NoError(t, db.TruncateBeans(db.DefaultContext, &user_model.User{}))
2425
require.NoError(t, db.TruncateBeans(db.DefaultContext, &user_model.EmailAddress{}))
26+
require.NoError(t, db.TruncateBeans(db.DefaultContext, &auth_model.AccessToken{}))
2527
}
2628

2729
t.Run("MustChangePassword", func(t *testing.T) {
@@ -48,11 +50,11 @@ func TestAdminUserCreate(t *testing.T) {
4850
assert.Equal(t, check{IsAdmin: false, MustChangePassword: false}, createCheck("u5", "--must-change-password=false"))
4951
})
5052

51-
t.Run("UserType", func(t *testing.T) {
52-
createUser := func(name, args string) error {
53-
return app.Run(strings.Fields(fmt.Sprintf("./gitea admin user create --username %s --email %[email protected] %s", name, name, args)))
54-
}
53+
createUser := func(name, args string) error {
54+
return app.Run(strings.Fields(fmt.Sprintf("./gitea admin user create --username %s --email %[email protected] %s", name, name, args)))
55+
}
5556

57+
t.Run("UserType", func(t *testing.T) {
5658
reset()
5759
assert.ErrorContains(t, createUser("u", "--user-type invalid"), "invalid user type")
5860
assert.ErrorContains(t, createUser("u", "--user-type bot --password 123"), "can only be set for individual users")
@@ -61,6 +63,58 @@ func TestAdminUserCreate(t *testing.T) {
6163
assert.NoError(t, createUser("u", "--user-type bot"))
6264
u := unittest.AssertExistsAndLoadBean(t, &user_model.User{LowerName: "u"})
6365
assert.Equal(t, user_model.UserTypeBot, u.Type)
64-
assert.Equal(t, "", u.Passwd)
66+
assert.Empty(t, u.Passwd)
67+
})
68+
69+
t.Run("AccessToken", func(t *testing.T) {
70+
// no generated access token
71+
reset()
72+
assert.NoError(t, createUser("u", "--random-password"))
73+
assert.Equal(t, 1, unittest.GetCount(t, &user_model.User{}))
74+
assert.Equal(t, 0, unittest.GetCount(t, &auth_model.AccessToken{}))
75+
76+
// using "--access-token" only means "all" access
77+
reset()
78+
assert.NoError(t, createUser("u", "--random-password --access-token"))
79+
assert.Equal(t, 1, unittest.GetCount(t, &user_model.User{}))
80+
assert.Equal(t, 1, unittest.GetCount(t, &auth_model.AccessToken{}))
81+
accessToken := unittest.AssertExistsAndLoadBean(t, &auth_model.AccessToken{Name: "gitea-admin"})
82+
hasScopes, err := accessToken.Scope.HasScope(auth_model.AccessTokenScopeWriteAdmin, auth_model.AccessTokenScopeWriteRepository)
83+
assert.NoError(t, err)
84+
assert.True(t, hasScopes)
85+
86+
// using "--access-token" with name & scopes
87+
reset()
88+
assert.NoError(t, createUser("u", "--random-password --access-token --access-token-name new-token-name --access-token-scopes read:issue,read:user"))
89+
assert.Equal(t, 1, unittest.GetCount(t, &user_model.User{}))
90+
assert.Equal(t, 1, unittest.GetCount(t, &auth_model.AccessToken{}))
91+
accessToken = unittest.AssertExistsAndLoadBean(t, &auth_model.AccessToken{Name: "new-token-name"})
92+
hasScopes, err = accessToken.Scope.HasScope(auth_model.AccessTokenScopeReadIssue, auth_model.AccessTokenScopeReadUser)
93+
assert.NoError(t, err)
94+
assert.True(t, hasScopes)
95+
hasScopes, err = accessToken.Scope.HasScope(auth_model.AccessTokenScopeWriteAdmin, auth_model.AccessTokenScopeWriteRepository)
96+
assert.NoError(t, err)
97+
assert.False(t, hasScopes)
98+
99+
// using "--access-token-name" without "--access-token"
100+
reset()
101+
err = createUser("u", "--random-password --access-token-name new-token-name")
102+
assert.Equal(t, 0, unittest.GetCount(t, &user_model.User{}))
103+
assert.Equal(t, 0, unittest.GetCount(t, &auth_model.AccessToken{}))
104+
assert.ErrorContains(t, err, "access-token-name and access-token-scopes flags are only valid when access-token flag is set")
105+
106+
// using "--access-token-scopes" without "--access-token"
107+
reset()
108+
err = createUser("u", "--random-password --access-token-scopes read:issue")
109+
assert.Equal(t, 0, unittest.GetCount(t, &user_model.User{}))
110+
assert.Equal(t, 0, unittest.GetCount(t, &auth_model.AccessToken{}))
111+
assert.ErrorContains(t, err, "access-token-name and access-token-scopes flags are only valid when access-token flag is set")
112+
113+
// empty permission
114+
reset()
115+
err = createUser("u", "--random-password --access-token --access-token-scopes public-only")
116+
assert.Equal(t, 0, unittest.GetCount(t, &user_model.User{}))
117+
assert.Equal(t, 0, unittest.GetCount(t, &auth_model.AccessToken{}))
118+
assert.ErrorContains(t, err, "access token does not have any permission")
65119
})
66120
}

cmd/admin_user_generate_access_token.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,16 @@ var microcmdUserGenerateAccessToken = &cli.Command{
3434
},
3535
&cli.StringFlag{
3636
Name: "scopes",
37-
Value: "",
38-
Usage: "Comma separated list of scopes to apply to access token",
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"`,
3939
},
4040
},
4141
Action: runGenerateAccessToken,
4242
}
4343

4444
func runGenerateAccessToken(c *cli.Context) error {
4545
if !c.IsSet("username") {
46-
return errors.New("You must provide a username to generate a token for")
46+
return errors.New("you must provide a username to generate a token for")
4747
}
4848

4949
ctx, cancel := installSignals()
@@ -77,6 +77,9 @@ func runGenerateAccessToken(c *cli.Context) error {
7777
if err != nil {
7878
return fmt.Errorf("invalid access token scope provided: %w", err)
7979
}
80+
if !accessTokenScope.HasPermissionScope() {
81+
return errors.New("access token does not have any permission")
82+
}
8083
t.Scope = accessTokenScope
8184

8285
// create the token

cmd/dump.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package cmd
66

77
import (
8-
"fmt"
98
"os"
109
"path"
1110
"path/filepath"
@@ -93,7 +92,7 @@ var CmdDump = &cli.Command{
9392
},
9493
&cli.StringFlag{
9594
Name: "type",
96-
Usage: fmt.Sprintf(`Dump output format, default to "zip", supported types: %s`, strings.Join(dump.SupportedOutputTypes, ", ")),
95+
Usage: `Dump output format, default to "zip", supported types: ` + strings.Join(dump.SupportedOutputTypes, ", "),
9796
},
9897
},
9998
}

cmd/main_test.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package cmd
55

66
import (
7+
"errors"
78
"fmt"
89
"io"
910
"path/filepath"
@@ -127,31 +128,31 @@ func TestCliCmd(t *testing.T) {
127128
}
128129

129130
func TestCliCmdError(t *testing.T) {
130-
app := newTestApp(func(ctx *cli.Context) error { return fmt.Errorf("normal error") })
131+
app := newTestApp(func(ctx *cli.Context) error { return errors.New("normal error") })
131132
r, err := runTestApp(app, "./gitea", "test-cmd")
132133
assert.Error(t, err)
133134
assert.Equal(t, 1, r.ExitCode)
134-
assert.Equal(t, "", r.Stdout)
135+
assert.Empty(t, r.Stdout)
135136
assert.Equal(t, "Command error: normal error\n", r.Stderr)
136137

137138
app = newTestApp(func(ctx *cli.Context) error { return cli.Exit("exit error", 2) })
138139
r, err = runTestApp(app, "./gitea", "test-cmd")
139140
assert.Error(t, err)
140141
assert.Equal(t, 2, r.ExitCode)
141-
assert.Equal(t, "", r.Stdout)
142+
assert.Empty(t, r.Stdout)
142143
assert.Equal(t, "exit error\n", r.Stderr)
143144

144145
app = newTestApp(func(ctx *cli.Context) error { return nil })
145146
r, err = runTestApp(app, "./gitea", "test-cmd", "--no-such")
146147
assert.Error(t, err)
147148
assert.Equal(t, 1, r.ExitCode)
148149
assert.Equal(t, "Incorrect Usage: flag provided but not defined: -no-such\n\n", r.Stdout)
149-
assert.Equal(t, "", r.Stderr) // the cli package's strange behavior, the error message is not in stderr ....
150+
assert.Empty(t, r.Stderr) // the cli package's strange behavior, the error message is not in stderr ....
150151

151152
app = newTestApp(func(ctx *cli.Context) error { return nil })
152153
r, err = runTestApp(app, "./gitea", "test-cmd")
153154
assert.NoError(t, err)
154155
assert.Equal(t, -1, r.ExitCode) // the cli.OsExiter is not called
155-
assert.Equal(t, "", r.Stdout)
156-
assert.Equal(t, "", r.Stderr)
156+
assert.Empty(t, r.Stdout)
157+
assert.Empty(t, r.Stderr)
157158
}

cmd/migrate_storage_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,6 @@ func TestMigratePackages(t *testing.T) {
6969
entries, err := os.ReadDir(p)
7070
assert.NoError(t, err)
7171
assert.Len(t, entries, 2)
72-
assert.EqualValues(t, "01", entries[0].Name())
73-
assert.EqualValues(t, "tmp", entries[1].Name())
72+
assert.Equal(t, "01", entries[0].Name())
73+
assert.Equal(t, "tmp", entries[1].Name())
7474
}

cmd/serv.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ func getLFSAuthToken(ctx context.Context, lfsVerb string, results *private.ServC
173173
if err != nil {
174174
return "", fail(ctx, "Failed to sign JWT Token", "Failed to sign JWT token: %v", err)
175175
}
176-
return fmt.Sprintf("Bearer %s", tokenString), nil
176+
return "Bearer " + tokenString, nil
177177
}
178178

179179
func runServ(c *cli.Context) error {
@@ -372,9 +372,9 @@ func runServ(c *cli.Context) error {
372372
repo_module.EnvPusherEmail+"="+results.UserEmail,
373373
repo_module.EnvPusherID+"="+strconv.FormatInt(results.UserID, 10),
374374
repo_module.EnvRepoID+"="+strconv.FormatInt(results.RepoID, 10),
375-
repo_module.EnvPRID+"="+fmt.Sprintf("%d", 0),
376-
repo_module.EnvDeployKeyID+"="+fmt.Sprintf("%d", results.DeployKeyID),
377-
repo_module.EnvKeyID+"="+fmt.Sprintf("%d", results.KeyID),
375+
repo_module.EnvPRID+"="+strconv.Itoa(0),
376+
repo_module.EnvDeployKeyID+"="+strconv.FormatInt(results.DeployKeyID, 10),
377+
repo_module.EnvKeyID+"="+strconv.FormatInt(results.KeyID, 10),
378378
repo_module.EnvAppURL+"="+setting.AppURL,
379379
)
380380
// to avoid breaking, here only use the minimal environment variables for the "gitea serv" command.

cmd/web_acme.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func runACME(listenAddr string, m http.Handler) error {
136136
}
137137

138138
func runLetsEncryptFallbackHandler(w http.ResponseWriter, r *http.Request) {
139-
if r.Method != "GET" && r.Method != "HEAD" {
139+
if r.Method != http.MethodGet && r.Method != http.MethodHead {
140140
http.Error(w, "Use HTTPS", http.StatusBadRequest)
141141
return
142142
}

0 commit comments

Comments
 (0)