From 587ac0f1533ced870612bef3be918218229f1c4c Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 25 Nov 2021 11:57:36 +0800 Subject: [PATCH 01/60] Team permission allow different unit has different permission --- models/migrations/migrations.go | 2 ++ models/migrations/v205.go | 30 +++++++++++++++++++ models/org_team.go | 22 +++++++++++--- models/repo_permission.go | 7 +++-- templates/org/team/new.tmpl | 51 ++++++++++++++++++++++++--------- 5 files changed, 91 insertions(+), 21 deletions(-) create mode 100644 models/migrations/v205.go diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index cc72ba99abf41..aed9fc7131a4c 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -363,6 +363,8 @@ var migrations = []Migration{ NewMigration("Add Sorting to ProjectIssue table", addProjectIssueSorting), // v204 -> v205 NewMigration("Add key is verified to ssh key", addSSHKeyIsVerified), + // v205 -> v206 + NewMigration("Add column authorize column for team_unit table", addAuthorizeColForTeamUnit), } // GetCurrentDBVersion returns the current db version diff --git a/models/migrations/v205.go b/models/migrations/v205.go new file mode 100644 index 0000000000000..3449bebbdf475 --- /dev/null +++ b/models/migrations/v205.go @@ -0,0 +1,30 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + + "xorm.io/xorm" +) + +func addAuthorizeColForTeamUnit(x *xorm.Engine) error { + type TeamUnit struct { + ID int64 `xorm:"pk autoincr"` + OrgID int64 `xorm:"INDEX"` + TeamID int64 `xorm:"UNIQUE(s)"` + Type int `xorm:"UNIQUE(s)"` + Authorize int + } + + if err := x.Sync2(new(TeamUnit)); err != nil { + return fmt.Errorf("sync2: %v", err) + } + + // migrate old permission + _, err := x.Exec("UPDATE team_unit SET authorize = (SELECT authorize FROM team WHERE team.id = team_unit.team_id)") + return err + +} diff --git a/models/org_team.go b/models/org_team.go index 7eac0f7bc52fe..ce270ca19942b 100644 --- a/models/org_team.go +++ b/models/org_team.go @@ -454,6 +454,19 @@ func (t *Team) UnitEnabled(tp unit.Type) bool { return t.unitEnabled(db.GetEngine(db.DefaultContext), tp) } +func (t *Team) unitAccessMode(e db.Engine, tp unit.Type) AccessMode { + if err := t.getUnits(e); err != nil { + log.Warn("Error loading team (ID: %d) units: %s", t.ID, err.Error()) + } + + for _, unit := range t.Units { + if unit.Type == tp { + return unit.Authorize + } + } + return AccessModeNone +} + func (t *Team) unitEnabled(e db.Engine, tp unit.Type) bool { if err := t.getUnits(e); err != nil { log.Warn("Error loading team (ID: %d) units: %s", t.ID, err.Error()) @@ -1033,10 +1046,11 @@ func GetTeamsWithAccessToRepo(orgID, repoID int64, mode perm.AccessMode) ([]*Tea // TeamUnit describes all units of a repository type TeamUnit struct { - ID int64 `xorm:"pk autoincr"` - OrgID int64 `xorm:"INDEX"` - TeamID int64 `xorm:"UNIQUE(s)"` - Type unit.Type `xorm:"UNIQUE(s)"` + ID int64 `xorm:"pk autoincr"` + OrgID int64 `xorm:"INDEX"` + TeamID int64 `xorm:"UNIQUE(s)"` + Type unit.Type `xorm:"UNIQUE(s)"` + Authorize AccessMode } // Unit returns Unit diff --git a/models/repo_permission.go b/models/repo_permission.go index 40b63aa804313..5bef6139913b6 100644 --- a/models/repo_permission.go +++ b/models/repo_permission.go @@ -249,10 +249,11 @@ func getUserRepoPermission(ctx context.Context, repo *repo_model.Repository, use for _, u := range repo.Units { var found bool for _, team := range teams { - if team.unitEnabled(e, u.Type) { + teamMode := team.unitAccessMode(e, u.Type) + if teamMode > AccessModeNone { m := perm.UnitsMode[u.Type] - if m < team.Authorize { - perm.UnitsMode[u.Type] = team.Authorize + if m < teamMode { + perm.UnitsMode[u.Type] = teamMode } found = true } diff --git a/templates/org/team/new.tmpl b/templates/org/team/new.tmpl index 783e025ebdc08..000befe88cef9 100644 --- a/templates/org/team/new.tmpl +++ b/templates/org/team/new.tmpl @@ -81,21 +81,44 @@