Skip to content

Commit 563b414

Browse files
committed
Merge remote-tracking branch 'upstream/main'
* upstream/main: change org_type.go to visible_type.go and fix the notes (go-gitea#22752) Improve notification and stopwatch styles (go-gitea#22169) Fix blame view missing lines (go-gitea#22826) Load issue before accessing index in merge message (go-gitea#22822) include build info in Prometheus metrics (go-gitea#22819) Fix rerun button of Actions (go-gitea#22798) Map OIDC groups to Orgs/Teams (go-gitea#21441) Fix links for the menus in the view file page (go-gitea#22795)
2 parents dee12a7 + 7ae10cb commit 563b414

Some content is hidden

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

47 files changed

+634
-483
lines changed

Diff for: cmd/admin.go

+17
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,15 @@ var (
372372
Value: "",
373373
Usage: "Group Claim value for restricted users",
374374
},
375+
cli.StringFlag{
376+
Name: "group-team-map",
377+
Value: "",
378+
Usage: "JSON mapping between groups and org teams",
379+
},
380+
cli.BoolFlag{
381+
Name: "group-team-map-removal",
382+
Usage: "Activate automatic team membership removal depending on groups",
383+
},
375384
}
376385

377386
microcmdAuthUpdateOauth = cli.Command{
@@ -853,6 +862,8 @@ func parseOAuth2Config(c *cli.Context) *oauth2.Source {
853862
GroupClaimName: c.String("group-claim-name"),
854863
AdminGroup: c.String("admin-group"),
855864
RestrictedGroup: c.String("restricted-group"),
865+
GroupTeamMap: c.String("group-team-map"),
866+
GroupTeamMapRemoval: c.Bool("group-team-map-removal"),
856867
}
857868
}
858869

@@ -935,6 +946,12 @@ func runUpdateOauth(c *cli.Context) error {
935946
if c.IsSet("restricted-group") {
936947
oAuth2Config.RestrictedGroup = c.String("restricted-group")
937948
}
949+
if c.IsSet("group-team-map") {
950+
oAuth2Config.GroupTeamMap = c.String("group-team-map")
951+
}
952+
if c.IsSet("group-team-map-removal") {
953+
oAuth2Config.GroupTeamMapRemoval = c.Bool("group-team-map-removal")
954+
}
938955

939956
// update custom URL mapping
940957
customURLMapping := &oauth2.CustomURLMapping{}

Diff for: docs/content/doc/usage/command-line.en-us.md

+2
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ Admin operations:
137137
- `--group-claim-name`: Claim name providing group names for this source. (Optional)
138138
- `--admin-group`: Group Claim value for administrator users. (Optional)
139139
- `--restricted-group`: Group Claim value for restricted users. (Optional)
140+
- `--group-team-map`: JSON mapping between groups and org teams. (Optional)
141+
- `--group-team-map-removal`: Activate automatic team membership removal depending on groups. (Optional)
140142
- Examples:
141143
- `gitea admin auth add-oauth --name external-github --provider github --key OBTAIN_FROM_SOURCE --secret OBTAIN_FROM_SOURCE`
142144
- `update-oauth`:

Diff for: models/organization/org.go

+6-14
Original file line numberDiff line numberDiff line change
@@ -110,22 +110,14 @@ func (org *Organization) CanCreateOrgRepo(uid int64) (bool, error) {
110110
return CanCreateOrgRepo(db.DefaultContext, org.ID, uid)
111111
}
112112

113-
func (org *Organization) getTeam(ctx context.Context, name string) (*Team, error) {
114-
return GetTeam(ctx, org.ID, name)
115-
}
116-
117113
// GetTeam returns named team of organization.
118-
func (org *Organization) GetTeam(name string) (*Team, error) {
119-
return org.getTeam(db.DefaultContext, name)
120-
}
121-
122-
func (org *Organization) getOwnerTeam(ctx context.Context) (*Team, error) {
123-
return org.getTeam(ctx, OwnerTeamName)
114+
func (org *Organization) GetTeam(ctx context.Context, name string) (*Team, error) {
115+
return GetTeam(ctx, org.ID, name)
124116
}
125117

126118
// GetOwnerTeam returns owner team of organization.
127-
func (org *Organization) GetOwnerTeam() (*Team, error) {
128-
return org.getOwnerTeam(db.DefaultContext)
119+
func (org *Organization) GetOwnerTeam(ctx context.Context) (*Team, error) {
120+
return org.GetTeam(ctx, OwnerTeamName)
129121
}
130122

131123
// FindOrgTeams returns all teams of a given organization
@@ -342,15 +334,15 @@ func CreateOrganization(org *Organization, owner *user_model.User) (err error) {
342334
}
343335

344336
// GetOrgByName returns organization by given name.
345-
func GetOrgByName(name string) (*Organization, error) {
337+
func GetOrgByName(ctx context.Context, name string) (*Organization, error) {
346338
if len(name) == 0 {
347339
return nil, ErrOrgNotExist{0, name}
348340
}
349341
u := &Organization{
350342
LowerName: strings.ToLower(name),
351343
Type: user_model.UserTypeOrganization,
352344
}
353-
has, err := db.GetEngine(db.DefaultContext).Get(u)
345+
has, err := db.GetEngine(ctx).Get(u)
354346
if err != nil {
355347
return nil, err
356348
} else if !has {

Diff for: models/organization/org_test.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -61,28 +61,28 @@ func TestUser_IsOrgMember(t *testing.T) {
6161
func TestUser_GetTeam(t *testing.T) {
6262
assert.NoError(t, unittest.PrepareTestDatabase())
6363
org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3})
64-
team, err := org.GetTeam("team1")
64+
team, err := org.GetTeam(db.DefaultContext, "team1")
6565
assert.NoError(t, err)
6666
assert.Equal(t, org.ID, team.OrgID)
6767
assert.Equal(t, "team1", team.LowerName)
6868

69-
_, err = org.GetTeam("does not exist")
69+
_, err = org.GetTeam(db.DefaultContext, "does not exist")
7070
assert.True(t, organization.IsErrTeamNotExist(err))
7171

7272
nonOrg := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 2})
73-
_, err = nonOrg.GetTeam("team")
73+
_, err = nonOrg.GetTeam(db.DefaultContext, "team")
7474
assert.True(t, organization.IsErrTeamNotExist(err))
7575
}
7676

7777
func TestUser_GetOwnerTeam(t *testing.T) {
7878
assert.NoError(t, unittest.PrepareTestDatabase())
7979
org := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 3})
80-
team, err := org.GetOwnerTeam()
80+
team, err := org.GetOwnerTeam(db.DefaultContext)
8181
assert.NoError(t, err)
8282
assert.Equal(t, org.ID, team.OrgID)
8383

8484
nonOrg := unittest.AssertExistsAndLoadBean(t, &organization.Organization{ID: 2})
85-
_, err = nonOrg.GetOwnerTeam()
85+
_, err = nonOrg.GetOwnerTeam(db.DefaultContext)
8686
assert.True(t, organization.IsErrTeamNotExist(err))
8787
}
8888

@@ -115,15 +115,15 @@ func TestUser_GetMembers(t *testing.T) {
115115
func TestGetOrgByName(t *testing.T) {
116116
assert.NoError(t, unittest.PrepareTestDatabase())
117117

118-
org, err := organization.GetOrgByName("user3")
118+
org, err := organization.GetOrgByName(db.DefaultContext, "user3")
119119
assert.NoError(t, err)
120120
assert.EqualValues(t, 3, org.ID)
121121
assert.Equal(t, "user3", org.Name)
122122

123-
_, err = organization.GetOrgByName("user2") // user2 is an individual
123+
_, err = organization.GetOrgByName(db.DefaultContext, "user2") // user2 is an individual
124124
assert.True(t, organization.IsErrOrgNotExist(err))
125125

126-
_, err = organization.GetOrgByName("") // corner case
126+
_, err = organization.GetOrgByName(db.DefaultContext, "") // corner case
127127
assert.True(t, organization.IsErrOrgNotExist(err))
128128
}
129129

Diff for: modules/auth/common.go

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Copyright 2022 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package auth
5+
6+
import (
7+
"code.gitea.io/gitea/modules/json"
8+
"code.gitea.io/gitea/modules/log"
9+
)
10+
11+
func UnmarshalGroupTeamMapping(raw string) (map[string]map[string][]string, error) {
12+
groupTeamMapping := make(map[string]map[string][]string)
13+
if raw == "" {
14+
return groupTeamMapping, nil
15+
}
16+
err := json.Unmarshal([]byte(raw), &groupTeamMapping)
17+
if err != nil {
18+
log.Error("Failed to unmarshal group team mapping: %v", err)
19+
return nil, err
20+
}
21+
return groupTeamMapping, nil
22+
}

Diff for: modules/context/api.go

-30
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"code.gitea.io/gitea/modules/log"
2020
"code.gitea.io/gitea/modules/setting"
2121
"code.gitea.io/gitea/modules/web/middleware"
22-
auth_service "code.gitea.io/gitea/services/auth"
2322
)
2423

2524
// APIContext is a specific context for API service
@@ -215,35 +214,6 @@ func (ctx *APIContext) CheckForOTP() {
215214
}
216215
}
217216

218-
// APIAuth converts auth_service.Auth as a middleware
219-
func APIAuth(authMethod auth_service.Method) func(*APIContext) {
220-
return func(ctx *APIContext) {
221-
// Get user from session if logged in.
222-
var err error
223-
ctx.Doer, err = authMethod.Verify(ctx.Req, ctx.Resp, ctx, ctx.Session)
224-
if err != nil {
225-
ctx.Error(http.StatusUnauthorized, "APIAuth", err)
226-
return
227-
}
228-
229-
if ctx.Doer != nil {
230-
if ctx.Locale.Language() != ctx.Doer.Language {
231-
ctx.Locale = middleware.Locale(ctx.Resp, ctx.Req)
232-
}
233-
ctx.IsBasicAuth = ctx.Data["AuthedMethod"].(string) == auth_service.BasicMethodName
234-
ctx.IsSigned = true
235-
ctx.Data["IsSigned"] = ctx.IsSigned
236-
ctx.Data["SignedUser"] = ctx.Doer
237-
ctx.Data["SignedUserID"] = ctx.Doer.ID
238-
ctx.Data["SignedUserName"] = ctx.Doer.Name
239-
ctx.Data["IsAdmin"] = ctx.Doer.IsAdmin
240-
} else {
241-
ctx.Data["SignedUserID"] = int64(0)
242-
ctx.Data["SignedUserName"] = ""
243-
}
244-
}
245-
}
246-
247217
// APIContexter returns apicontext as middleware
248218
func APIContexter() func(http.Handler) http.Handler {
249219
return func(next http.Handler) http.Handler {

Diff for: modules/context/context.go

-32
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ import (
3636
"code.gitea.io/gitea/modules/typesniffer"
3737
"code.gitea.io/gitea/modules/util"
3838
"code.gitea.io/gitea/modules/web/middleware"
39-
"code.gitea.io/gitea/services/auth"
4039

4140
"gitea.com/go-chi/cache"
4241
"gitea.com/go-chi/session"
@@ -659,37 +658,6 @@ func getCsrfOpts() CsrfOptions {
659658
}
660659
}
661660

662-
// Auth converts auth.Auth as a middleware
663-
func Auth(authMethod auth.Method) func(*Context) {
664-
return func(ctx *Context) {
665-
var err error
666-
ctx.Doer, err = authMethod.Verify(ctx.Req, ctx.Resp, ctx, ctx.Session)
667-
if err != nil {
668-
log.Error("Failed to verify user %v: %v", ctx.Req.RemoteAddr, err)
669-
ctx.Error(http.StatusUnauthorized, "Verify")
670-
return
671-
}
672-
if ctx.Doer != nil {
673-
if ctx.Locale.Language() != ctx.Doer.Language {
674-
ctx.Locale = middleware.Locale(ctx.Resp, ctx.Req)
675-
}
676-
ctx.IsBasicAuth = ctx.Data["AuthedMethod"].(string) == auth.BasicMethodName
677-
ctx.IsSigned = true
678-
ctx.Data["IsSigned"] = ctx.IsSigned
679-
ctx.Data["SignedUser"] = ctx.Doer
680-
ctx.Data["SignedUserID"] = ctx.Doer.ID
681-
ctx.Data["SignedUserName"] = ctx.Doer.Name
682-
ctx.Data["IsAdmin"] = ctx.Doer.IsAdmin
683-
} else {
684-
ctx.Data["SignedUserID"] = int64(0)
685-
ctx.Data["SignedUserName"] = ""
686-
687-
// ensure the session uid is deleted
688-
_ = ctx.Session.Delete("uid")
689-
}
690-
}
691-
}
692-
693661
// Contexter initializes a classic context for a request.
694662
func Contexter(ctx context.Context) func(next http.Handler) http.Handler {
695663
_, rnd := templates.HTMLRenderer(ctx)

Diff for: modules/context/org.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func HandleOrgAssignment(ctx *Context, args ...bool) {
8080
orgName := ctx.Params(":org")
8181

8282
var err error
83-
ctx.Org.Organization, err = organization.GetOrgByName(orgName)
83+
ctx.Org.Organization, err = organization.GetOrgByName(ctx, orgName)
8484
if err != nil {
8585
if organization.IsErrOrgNotExist(err) {
8686
redirectUserID, err := user_model.LookupUserRedirect(orgName)

Diff for: modules/git/blame.go

+17-14
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ type BlamePart struct {
2020

2121
// BlameReader returns part of file blame one by one
2222
type BlameReader struct {
23-
cmd *Command
24-
output io.WriteCloser
25-
reader io.ReadCloser
26-
done chan error
27-
lastSha *string
23+
cmd *Command
24+
output io.WriteCloser
25+
reader io.ReadCloser
26+
bufferedReader *bufio.Reader
27+
done chan error
28+
lastSha *string
2829
}
2930

3031
var shaLineRegex = regexp.MustCompile("^([a-z0-9]{40})")
@@ -33,8 +34,6 @@ var shaLineRegex = regexp.MustCompile("^([a-z0-9]{40})")
3334
func (r *BlameReader) NextPart() (*BlamePart, error) {
3435
var blamePart *BlamePart
3536

36-
reader := bufio.NewReader(r.reader)
37-
3837
if r.lastSha != nil {
3938
blamePart = &BlamePart{*r.lastSha, make([]string, 0)}
4039
}
@@ -44,7 +43,7 @@ func (r *BlameReader) NextPart() (*BlamePart, error) {
4443
var err error
4544

4645
for err != io.EOF {
47-
line, isPrefix, err = reader.ReadLine()
46+
line, isPrefix, err = r.bufferedReader.ReadLine()
4847
if err != nil && err != io.EOF {
4948
return blamePart, err
5049
}
@@ -66,7 +65,7 @@ func (r *BlameReader) NextPart() (*BlamePart, error) {
6665
r.lastSha = &sha1
6766
// need to munch to end of line...
6867
for isPrefix {
69-
_, isPrefix, err = reader.ReadLine()
68+
_, isPrefix, err = r.bufferedReader.ReadLine()
7069
if err != nil && err != io.EOF {
7170
return blamePart, err
7271
}
@@ -81,7 +80,7 @@ func (r *BlameReader) NextPart() (*BlamePart, error) {
8180

8281
// need to munch to end of line...
8382
for isPrefix {
84-
_, isPrefix, err = reader.ReadLine()
83+
_, isPrefix, err = r.bufferedReader.ReadLine()
8584
if err != nil && err != io.EOF {
8685
return blamePart, err
8786
}
@@ -96,6 +95,7 @@ func (r *BlameReader) NextPart() (*BlamePart, error) {
9695
// Close BlameReader - don't run NextPart after invoking that
9796
func (r *BlameReader) Close() error {
9897
err := <-r.done
98+
r.bufferedReader = nil
9999
_ = r.reader.Close()
100100
_ = r.output.Close()
101101
return err
@@ -126,10 +126,13 @@ func CreateBlameReader(ctx context.Context, repoPath, commitID, file string) (*B
126126
done <- err
127127
}(cmd, repoPath, stdout, done)
128128

129+
bufferedReader := bufio.NewReader(reader)
130+
129131
return &BlameReader{
130-
cmd: cmd,
131-
output: stdout,
132-
reader: reader,
133-
done: done,
132+
cmd: cmd,
133+
output: stdout,
134+
reader: reader,
135+
bufferedReader: bufferedReader,
136+
done: done,
134137
}, nil
135138
}

Diff for: modules/git/blame_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func TestReadingBlameOutput(t *testing.T) {
2828
},
2929
{
3030
"f32b0a9dfd09a60f616f29158f772cedd89942d2",
31-
[]string{},
31+
[]string{"", "Do not make any changes to this repo it is used for unit testing"},
3232
},
3333
}
3434

0 commit comments

Comments
 (0)