Skip to content

Commit be1b906

Browse files
committed
Merge remote-tracking branch 'giteaofficial/main'
* giteaofficial/main: Send mail to issue/pr assignee/reviewer also when OnMention is set (go-gitea#18707) Reduce CI go module downloads, add make targets (go-gitea#18708) Add number in queue status to monitor page (go-gitea#18712) Fix source code line highlighting (go-gitea#18729) Fix forked repositories missed tags (go-gitea#18719) [skip ci] Updated translations via Crowdin Fix release typo (go-gitea#18728) Display template path of current page in dev mode (go-gitea#18717) Separate the details links of commit-statuses in headers (go-gitea#18661) Add LDAP group sync to Teams, fixes go-gitea#1395 (go-gitea#16299) Change git.cmd to RunWithContext (go-gitea#18693)
2 parents 0f73b87 + a39287c commit be1b906

Some content is hidden

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

61 files changed

+1284
-310
lines changed

.drone.yml

Lines changed: 194 additions & 61 deletions
Large diffs are not rendered by default.

.golangci.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ linters:
2424

2525
run:
2626
timeout: 3m
27+
skip-dirs:
28+
- node_modules
29+
- public
30+
- web_src
2731

2832
linters-settings:
2933
gocritic:

Makefile

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,9 @@ help:
166166
@echo " - watch-backend watch backend files and continuously rebuild"
167167
@echo " - clean delete backend and integration files"
168168
@echo " - clean-all delete backend, frontend and integration files"
169+
@echo " - deps install dependencies"
170+
@echo " - deps-frontend install frontend dependencies"
171+
@echo " - deps-backend install backend dependencies"
169172
@echo " - lint lint everything"
170173
@echo " - lint-frontend lint frontend files"
171174
@echo " - lint-backend lint backend files"
@@ -662,6 +665,16 @@ docs:
662665
fi
663666
cd docs; make trans-copy clean build-offline;
664667

668+
.PHONY: deps
669+
deps: deps-frontend deps-backend
670+
671+
.PHONY: deps-frontend
672+
deps-frontend: node_modules
673+
674+
.PHONY: deps-backend
675+
deps-backend:
676+
$(GO) mod download
677+
665678
node_modules: package-lock.json
666679
npm install --no-save
667680
@touch node_modules

cmd/admin_auth_ldap.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,6 @@ func parseLdapConfig(c *cli.Context, config *ldap.Source) error {
260260
if c.IsSet("skip-local-2fa") {
261261
config.SkipLocalTwoFA = c.Bool("skip-local-2fa")
262262
}
263-
264263
return nil
265264
}
266265

integrations/auth_ldap_test.go

Lines changed: 118 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import (
1111
"strings"
1212
"testing"
1313

14+
"code.gitea.io/gitea/models"
15+
"code.gitea.io/gitea/models/unittest"
16+
user_model "code.gitea.io/gitea/models/user"
1417
"code.gitea.io/gitea/services/auth"
1518

1619
"github.com/stretchr/testify/assert"
@@ -97,7 +100,13 @@ func getLDAPServerHost() string {
97100
return host
98101
}
99102

100-
func addAuthSourceLDAP(t *testing.T, sshKeyAttribute string) {
103+
func addAuthSourceLDAP(t *testing.T, sshKeyAttribute string, groupMapParams ...string) {
104+
groupTeamMapRemoval := "off"
105+
groupTeamMap := ""
106+
if len(groupMapParams) == 2 {
107+
groupTeamMapRemoval = groupMapParams[0]
108+
groupTeamMap = groupMapParams[1]
109+
}
101110
session := loginUser(t, "user1")
102111
csrf := GetCSRF(t, session, "/admin/auths/new")
103112
req := NewRequestWithValues(t, "POST", "/admin/auths/new", map[string]string{
@@ -119,6 +128,12 @@ func addAuthSourceLDAP(t *testing.T, sshKeyAttribute string) {
119128
"attribute_ssh_public_key": sshKeyAttribute,
120129
"is_sync_enabled": "on",
121130
"is_active": "on",
131+
"groups_enabled": "on",
132+
"group_dn": "ou=people,dc=planetexpress,dc=com",
133+
"group_member_uid": "member",
134+
"group_team_map": groupTeamMap,
135+
"group_team_map_removal": groupTeamMapRemoval,
136+
"user_uid": "DN",
122137
})
123138
session.MakeRequest(t, req, http.StatusFound)
124139
}
@@ -294,3 +309,105 @@ func TestLDAPUserSSHKeySync(t *testing.T) {
294309
assert.ElementsMatch(t, u.SSHKeys, syncedKeys, "Unequal number of keys synchronized for user: %s", u.UserName)
295310
}
296311
}
312+
313+
func TestLDAPGroupTeamSyncAddMember(t *testing.T) {
314+
if skipLDAPTests() {
315+
t.Skip()
316+
return
317+
}
318+
defer prepareTestEnv(t)()
319+
addAuthSourceLDAP(t, "", "on", `{"cn=ship_crew,ou=people,dc=planetexpress,dc=com":{"org26": ["team11"]},"cn=admin_staff,ou=people,dc=planetexpress,dc=com": {"non-existent": ["non-existent"]}}`)
320+
org, err := models.GetOrgByName("org26")
321+
assert.NoError(t, err)
322+
team, err := models.GetTeam(org.ID, "team11")
323+
assert.NoError(t, err)
324+
auth.SyncExternalUsers(context.Background(), true)
325+
for _, gitLDAPUser := range gitLDAPUsers {
326+
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{
327+
Name: gitLDAPUser.UserName,
328+
}).(*user_model.User)
329+
usersOrgs, err := models.FindOrgs(models.FindOrgOptions{
330+
UserID: user.ID,
331+
IncludePrivate: true,
332+
})
333+
assert.NoError(t, err)
334+
allOrgTeams, err := models.GetUserOrgTeams(org.ID, user.ID)
335+
assert.NoError(t, err)
336+
if user.Name == "fry" || user.Name == "leela" || user.Name == "bender" {
337+
// assert members of LDAP group "cn=ship_crew" are added to mapped teams
338+
assert.Equal(t, len(usersOrgs), 1, "User [%s] should be member of one organization", user.Name)
339+
assert.Equal(t, usersOrgs[0].Name, "org26", "Membership should be added to the right organization")
340+
isMember, err := models.IsTeamMember(usersOrgs[0].ID, team.ID, user.ID)
341+
assert.NoError(t, err)
342+
assert.True(t, isMember, "Membership should be added to the right team")
343+
err = team.RemoveMember(user.ID)
344+
assert.NoError(t, err)
345+
err = usersOrgs[0].RemoveMember(user.ID)
346+
assert.NoError(t, err)
347+
} else {
348+
// assert members of LDAP group "cn=admin_staff" keep initial team membership since mapped team does not exist
349+
assert.Empty(t, usersOrgs, "User should be member of no organization")
350+
isMember, err := models.IsTeamMember(org.ID, team.ID, user.ID)
351+
assert.NoError(t, err)
352+
assert.False(t, isMember, "User should no be added to this team")
353+
assert.Empty(t, allOrgTeams, "User should not be added to any team")
354+
}
355+
}
356+
}
357+
358+
func TestLDAPGroupTeamSyncRemoveMember(t *testing.T) {
359+
if skipLDAPTests() {
360+
t.Skip()
361+
return
362+
}
363+
defer prepareTestEnv(t)()
364+
addAuthSourceLDAP(t, "", "on", `{"cn=dispatch,ou=people,dc=planetexpress,dc=com": {"org26": ["team11"]}}`)
365+
org, err := models.GetOrgByName("org26")
366+
assert.NoError(t, err)
367+
team, err := models.GetTeam(org.ID, "team11")
368+
assert.NoError(t, err)
369+
loginUserWithPassword(t, gitLDAPUsers[0].UserName, gitLDAPUsers[0].Password)
370+
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{
371+
Name: gitLDAPUsers[0].UserName,
372+
}).(*user_model.User)
373+
err = org.AddMember(user.ID)
374+
assert.NoError(t, err)
375+
err = team.AddMember(user.ID)
376+
assert.NoError(t, err)
377+
isMember, err := models.IsOrganizationMember(org.ID, user.ID)
378+
assert.NoError(t, err)
379+
assert.True(t, isMember, "User should be member of this organization")
380+
isMember, err = models.IsTeamMember(org.ID, team.ID, user.ID)
381+
assert.NoError(t, err)
382+
assert.True(t, isMember, "User should be member of this team")
383+
// assert team member "professor" gets removed from org26 team11
384+
loginUserWithPassword(t, gitLDAPUsers[0].UserName, gitLDAPUsers[0].Password)
385+
isMember, err = models.IsOrganizationMember(org.ID, user.ID)
386+
assert.NoError(t, err)
387+
assert.False(t, isMember, "User membership should have been removed from organization")
388+
isMember, err = models.IsTeamMember(org.ID, team.ID, user.ID)
389+
assert.NoError(t, err)
390+
assert.False(t, isMember, "User membership should have been removed from team")
391+
}
392+
393+
// Login should work even if Team Group Map contains a broken JSON
394+
func TestBrokenLDAPMapUserSignin(t *testing.T) {
395+
if skipLDAPTests() {
396+
t.Skip()
397+
return
398+
}
399+
defer prepareTestEnv(t)()
400+
addAuthSourceLDAP(t, "", "on", `{"NOT_A_VALID_JSON"["MISSING_DOUBLE_POINT"]}`)
401+
402+
u := gitLDAPUsers[0]
403+
404+
session := loginUserWithPassword(t, u.UserName, u.Password)
405+
req := NewRequest(t, "GET", "/user/settings")
406+
resp := session.MakeRequest(t, req, http.StatusOK)
407+
408+
htmlDoc := NewHTMLParser(t, resp.Body)
409+
410+
assert.Equal(t, u.UserName, htmlDoc.GetInputValueByName("name"))
411+
assert.Equal(t, u.FullName, htmlDoc.GetInputValueByName("full_name"))
412+
assert.Equal(t, u.Email, htmlDoc.Find(`label[for="email"]`).Siblings().First().Text())
413+
}

integrations/pull_merge_test.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,13 @@ func TestCantMergeUnrelated(t *testing.T) {
274274

275275
stdin := bytes.NewBufferString("Unrelated File")
276276
var stdout strings.Builder
277-
err = git.NewCommand(git.DefaultContext, "hash-object", "-w", "--stdin").RunInDirFullPipeline(path, &stdout, nil, stdin)
277+
err = git.NewCommand(git.DefaultContext, "hash-object", "-w", "--stdin").RunWithContext(&git.RunContext{
278+
Timeout: -1,
279+
Dir: path,
280+
Stdin: stdin,
281+
Stdout: &stdout,
282+
})
283+
278284
assert.NoError(t, err)
279285
sha := strings.TrimSpace(stdout.String())
280286

@@ -301,7 +307,14 @@ func TestCantMergeUnrelated(t *testing.T) {
301307
_, _ = messageBytes.WriteString("\n")
302308

303309
stdout.Reset()
304-
err = git.NewCommand(git.DefaultContext, "commit-tree", treeSha).RunInDirTimeoutEnvFullPipeline(env, -1, path, &stdout, nil, messageBytes)
310+
err = git.NewCommand(git.DefaultContext, "commit-tree", treeSha).
311+
RunWithContext(&git.RunContext{
312+
Env: env,
313+
Timeout: -1,
314+
Dir: path,
315+
Stdin: messageBytes,
316+
Stdout: &stdout,
317+
})
305318
assert.NoError(t, err)
306319
commitSha := strings.TrimSpace(stdout.String())
307320

modules/context/context.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,10 @@ func (ctx *Context) RedirectToFirst(location ...string) {
197197
func (ctx *Context) HTML(status int, name base.TplName) {
198198
log.Debug("Template: %s", name)
199199
tmplStartTime := time.Now()
200-
ctx.Data["TmplLoadTimes"] = func() string {
200+
if !setting.IsProd {
201+
ctx.Data["TemplateName"] = name
202+
}
203+
ctx.Data["TemplateLoadTimes"] = func() string {
201204
return strconv.FormatInt(time.Since(tmplStartTime).Nanoseconds()/1e6, 10) + "ms"
202205
}
203206
if err := ctx.Render.HTML(ctx.Resp, status, string(name), ctx.Data); err != nil {

modules/git/batch_reader.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ func EnsureValidGitRepository(ctx context.Context, repoPath string) error {
3434
stderr := strings.Builder{}
3535
err := NewCommand(ctx, "rev-parse").
3636
SetDescription(fmt.Sprintf("%s rev-parse [repo_path: %s]", GitExecutable, repoPath)).
37-
RunInDirFullPipeline(repoPath, nil, &stderr, nil)
37+
RunWithContext(&RunContext{
38+
Timeout: -1,
39+
Dir: repoPath,
40+
Stderr: &stderr,
41+
})
3842
if err != nil {
3943
return ConcatenateError(err, (&stderr).String())
4044
}
@@ -61,7 +65,13 @@ func CatFileBatchCheck(ctx context.Context, repoPath string) (WriteCloserError,
6165
stderr := strings.Builder{}
6266
err := NewCommand(ctx, "cat-file", "--batch-check").
6367
SetDescription(fmt.Sprintf("%s cat-file --batch-check [repo_path: %s] (%s:%d)", GitExecutable, repoPath, filename, line)).
64-
RunInDirFullPipeline(repoPath, batchStdoutWriter, &stderr, batchStdinReader)
68+
RunWithContext(&RunContext{
69+
Timeout: -1,
70+
Dir: repoPath,
71+
Stdin: batchStdinReader,
72+
Stdout: batchStdoutWriter,
73+
Stderr: &stderr,
74+
})
6575
if err != nil {
6676
_ = batchStdoutWriter.CloseWithError(ConcatenateError(err, (&stderr).String()))
6777
_ = batchStdinReader.CloseWithError(ConcatenateError(err, (&stderr).String()))
@@ -100,7 +110,13 @@ func CatFileBatch(ctx context.Context, repoPath string) (WriteCloserError, *bufi
100110
stderr := strings.Builder{}
101111
err := NewCommand(ctx, "cat-file", "--batch").
102112
SetDescription(fmt.Sprintf("%s cat-file --batch [repo_path: %s] (%s:%d)", GitExecutable, repoPath, filename, line)).
103-
RunInDirFullPipeline(repoPath, batchStdoutWriter, &stderr, batchStdinReader)
113+
RunWithContext(&RunContext{
114+
Timeout: -1,
115+
Dir: repoPath,
116+
Stdin: batchStdinReader,
117+
Stdout: batchStdoutWriter,
118+
Stderr: &stderr,
119+
})
104120
if err != nil {
105121
_ = batchStdoutWriter.CloseWithError(ConcatenateError(err, (&stderr).String()))
106122
_ = batchStdinReader.CloseWithError(ConcatenateError(err, (&stderr).String()))

modules/git/commit.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,12 @@ func GetCommitFileStatus(ctx context.Context, repoPath, commitID string) (*Commi
486486
stderr := new(bytes.Buffer)
487487
args := []string{"log", "--name-status", "-c", "--pretty=format:", "--parents", "--no-renames", "-z", "-1", commitID}
488488

489-
err := NewCommand(ctx, args...).RunInDirPipeline(repoPath, w, stderr)
489+
err := NewCommand(ctx, args...).RunWithContext(&RunContext{
490+
Timeout: -1,
491+
Dir: repoPath,
492+
Stdout: w,
493+
Stderr: stderr,
494+
})
490495
w.Close() // Close writer to exit parsing goroutine
491496
if err != nil {
492497
return nil, ConcatenateError(err, stderr.String())

modules/git/diff.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -301,9 +301,12 @@ func GetAffectedFiles(repo *Repository, oldCommitID, newCommitID string, env []s
301301

302302
// Run `git diff --name-only` to get the names of the changed files
303303
err = NewCommand(repo.Ctx, "diff", "--name-only", oldCommitID, newCommitID).
304-
RunInDirTimeoutEnvFullPipelineFunc(env, -1, repo.Path,
305-
stdoutWriter, nil, nil,
306-
func(ctx context.Context, cancel context.CancelFunc) error {
304+
RunWithContext(&RunContext{
305+
Env: env,
306+
Timeout: -1,
307+
Dir: repo.Path,
308+
Stdout: stdoutWriter,
309+
PipelineFunc: func(ctx context.Context, cancel context.CancelFunc) error {
307310
// Close the writer end of the pipe to begin processing
308311
_ = stdoutWriter.Close()
309312
defer func() {
@@ -320,7 +323,8 @@ func GetAffectedFiles(repo *Repository, oldCommitID, newCommitID string, env []s
320323
affectedFiles = append(affectedFiles, path)
321324
}
322325
return scanner.Err()
323-
})
326+
},
327+
})
324328
if err != nil {
325329
log.Error("Unable to get affected files for commits from %s to %s in %s: %v", oldCommitID, newCommitID, repo.Path, err)
326330
}

modules/git/log_name_status.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,12 @@ func LogNameStatusRepo(ctx context.Context, repository, head, treepath string, p
5555

5656
go func() {
5757
stderr := strings.Builder{}
58-
err := NewCommand(ctx, args...).RunInDirFullPipeline(repository, stdoutWriter, &stderr, nil)
58+
err := NewCommand(ctx, args...).RunWithContext(&RunContext{
59+
Timeout: -1,
60+
Dir: repository,
61+
Stdout: stdoutWriter,
62+
Stderr: &stderr,
63+
})
5964
if err != nil {
6065
_ = stdoutWriter.CloseWithError(ConcatenateError(err, (&stderr).String()))
6166
} else {

modules/git/pipeline/catfile.go

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,13 @@ func CatFileBatchCheck(ctx context.Context, shasToCheckReader *io.PipeReader, ca
2727
stderr := new(bytes.Buffer)
2828
var errbuf strings.Builder
2929
cmd := git.NewCommand(ctx, "cat-file", "--batch-check")
30-
if err := cmd.RunInDirFullPipeline(tmpBasePath, catFileCheckWriter, stderr, shasToCheckReader); err != nil {
30+
if err := cmd.RunWithContext(&git.RunContext{
31+
Timeout: -1,
32+
Dir: tmpBasePath,
33+
Stdin: shasToCheckReader,
34+
Stdout: catFileCheckWriter,
35+
Stderr: stderr,
36+
}); err != nil {
3137
_ = catFileCheckWriter.CloseWithError(fmt.Errorf("git cat-file --batch-check [%s]: %v - %s", tmpBasePath, err, errbuf.String()))
3238
}
3339
}
@@ -40,7 +46,12 @@ func CatFileBatchCheckAllObjects(ctx context.Context, catFileCheckWriter *io.Pip
4046
stderr := new(bytes.Buffer)
4147
var errbuf strings.Builder
4248
cmd := git.NewCommand(ctx, "cat-file", "--batch-check", "--batch-all-objects")
43-
if err := cmd.RunInDirPipeline(tmpBasePath, catFileCheckWriter, stderr); err != nil {
49+
if err := cmd.RunWithContext(&git.RunContext{
50+
Timeout: -1,
51+
Dir: tmpBasePath,
52+
Stdout: catFileCheckWriter,
53+
Stderr: stderr,
54+
}); err != nil {
4455
log.Error("git cat-file --batch-check --batch-all-object [%s]: %v - %s", tmpBasePath, err, errbuf.String())
4556
err = fmt.Errorf("git cat-file --batch-check --batch-all-object [%s]: %v - %s", tmpBasePath, err, errbuf.String())
4657
_ = catFileCheckWriter.CloseWithError(err)
@@ -56,7 +67,13 @@ func CatFileBatch(ctx context.Context, shasToBatchReader *io.PipeReader, catFile
5667

5768
stderr := new(bytes.Buffer)
5869
var errbuf strings.Builder
59-
if err := git.NewCommand(ctx, "cat-file", "--batch").RunInDirFullPipeline(tmpBasePath, catFileBatchWriter, stderr, shasToBatchReader); err != nil {
70+
if err := git.NewCommand(ctx, "cat-file", "--batch").RunWithContext(&git.RunContext{
71+
Timeout: -1,
72+
Dir: tmpBasePath,
73+
Stdout: catFileBatchWriter,
74+
Stdin: shasToBatchReader,
75+
Stderr: stderr,
76+
}); err != nil {
6077
_ = shasToBatchReader.CloseWithError(fmt.Errorf("git rev-list [%s]: %v - %s", tmpBasePath, err, errbuf.String()))
6178
}
6279
}

modules/git/pipeline/lfs_nogogit.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,12 @@ func FindLFSFile(repo *git.Repository, hash git.SHA1) ([]*LFSResult, error) {
5353

5454
go func() {
5555
stderr := strings.Builder{}
56-
err := git.NewCommand(repo.Ctx, "rev-list", "--all").RunInDirPipeline(repo.Path, revListWriter, &stderr)
56+
err := git.NewCommand(repo.Ctx, "rev-list", "--all").RunWithContext(&git.RunContext{
57+
Timeout: -1,
58+
Dir: repo.Path,
59+
Stdout: revListWriter,
60+
Stderr: &stderr,
61+
})
5762
if err != nil {
5863
_ = revListWriter.CloseWithError(git.ConcatenateError(err, (&stderr).String()))
5964
} else {

0 commit comments

Comments
 (0)