@@ -20,7 +20,6 @@ import ( "errors" "code.vikunja.io/api/pkg/user"
Show 5 hidden lines
- "code.vikunja.io/api/pkg/utils" "code.vikunja.io/api/pkg/web" "xorm.io/xorm"@@ -165,11 +164,8 @@ func checkReadPermissionsForProjects(s *xorm.Session, a web.Auth, projectIDs []i
for _, projectID := range projectIDsWithRow { permission := &projectReadPermission{project: projects[projectID]} if pp, has := projectPermissions[projectID]; has {- switch pp.MaxPermission {- case PermissionRead, PermissionWrite, PermissionAdmin:- permission.canRead = true- permission.maxPermission = int(pp.MaxPermission)- }+ permission.canRead = true+ permission.maxPermission = int(pp) } permissions[projectID] = permission }
Show 1 hidden lines
@@ -347,90 +343,30 @@ func (p *Project) checkPermission(s *xorm.Session, u *user.User, permissions ...
} for _, r := range permissions {- if r == permission.MaxPermission {+ if r == permission { return true, nil }
Show 4 hidden lines
} return false, nil }
-type projectPermission struct {- ID int64 `xorm:"pk autoincr"`- MaxPermission Permission-}--func checkPermissionsForProjects(s *xorm.Session, u *user.User, projectIDs []int64) (projectPermissionMap map[int64]*projectPermission, err error) {- projectPermissionMap = make(map[int64]*projectPermission)-+// checkPermissionsForProjects returns the effective permission of the user on each of+// the given projects. Projects the user cannot access are absent from the result.+func checkPermissionsForProjects(s *xorm.Session, u *user.User, projectIDs []int64) (map[int64]Permission, error) {+ permissions := make(map[int64]Permission, len(projectIDs)) if len(projectIDs) < 1 {- return
Show 41 hidden lines
- }-- args := []interface{}{- u.ID,- u.ID,- u.ID,- u.ID,- u.ID,- u.ID,- }-- err = s.SQL(`-WITH RECURSIVE- project_hierarchy AS (- -- Base case: Start with the specified projects- SELECT id,- parent_project_id,- 0 AS level,- id AS original_project_id- FROM projects- WHERE id IN (`+utils.JoinInt64Slice(projectIDs, ", ")+`)-- UNION ALL-- -- Recursive case: Traverse up the hierarchy- SELECT p.id,- p.parent_project_id,- ph.level + 1,- ph.original_project_id- FROM projects p- INNER JOIN project_hierarchy ph ON p.id = ph.parent_project_id),-- -- Calculate max team permission for each project/user combination- max_team_permissions AS (- SELECT tl.project_id,- MAX(tl.permission) AS max_team_permission- FROM team_projects tl- INNER JOIN team_members tm ON tm.team_id = tl.team_id AND tm.user_id = ?- GROUP BY tl.project_id- ),-
This change makes checkPermissionsForProjects return one effective Permission per project and updates checkReadPermissionsForProjects to use it, routing access through the MAX memo. An inherited ADMIN can thus override a lower child grant.