@@ -73,10 +73,12 @@ import (
7373 actions_model "code.gitea.io/gitea/models/actions"
7474 auth_model "code.gitea.io/gitea/models/auth"
7575 "code.gitea.io/gitea/models/db"
76+ group_model "code.gitea.io/gitea/models/group"
7677 "code.gitea.io/gitea/models/organization"
7778 "code.gitea.io/gitea/models/perm"
7879 access_model "code.gitea.io/gitea/models/perm/access"
7980 repo_model "code.gitea.io/gitea/models/repo"
81+ shared_group_model "code.gitea.io/gitea/models/shared/group"
8082 "code.gitea.io/gitea/models/unit"
8183 user_model "code.gitea.io/gitea/models/user"
8284 "code.gitea.io/gitea/modules/log"
@@ -207,7 +209,7 @@ func repoAssignment() func(ctx *context.APIContext) {
207209 ctx .Repo .Permission .AccessMode = perm .AccessModeWrite
208210 }
209211
210- if err : = ctx .Repo .Repository .LoadUnits (ctx ); err != nil {
212+ if err = ctx .Repo .Repository .LoadUnits (ctx ); err != nil {
211213 ctx .APIErrorInternal (err )
212214 return
213215 }
@@ -509,6 +511,60 @@ func reqOrgOwnership() func(ctx *context.APIContext) {
509511 }
510512}
511513
514+ // reqGroupMembership user should be organization owner,
515+ // a member of a team with access to the group, or site admin
516+ func reqGroupMembership (mode perm.AccessMode , needsCreatePerm bool ) func (ctx * context.APIContext ) {
517+ return func (ctx * context.APIContext ) {
518+ if ctx .IsUserSiteAdmin () {
519+ return
520+ }
521+ gid := ctx .PathParamInt64 ("group_id" )
522+ g , err := group_model .GetGroupByID (ctx , gid )
523+ if err != nil {
524+ ctx .APIErrorInternal (err )
525+ return
526+ }
527+ err = g .LoadOwner (ctx )
528+ if err != nil {
529+ ctx .APIErrorInternal (err )
530+ return
531+ }
532+ var canAccess bool
533+ if ctx .IsSigned {
534+ canAccess , err = g .CanAccessAtLevel (ctx , ctx .Doer .ID , mode )
535+ } else {
536+ canAccess , err = g .CanAccessAtLevel (ctx , 0 , mode )
537+ }
538+ if err != nil {
539+ ctx .APIErrorInternal (err )
540+ return
541+ }
542+ igm , err := shared_group_model .IsGroupMember (ctx , gid , ctx .Doer )
543+ if err != nil {
544+ ctx .APIErrorInternal (err )
545+ return
546+ }
547+ if ! igm && ! canAccess {
548+ ctx .APIErrorNotFound ()
549+ return
550+ }
551+ if needsCreatePerm {
552+ canCreateIn := false
553+ if ctx .IsSigned {
554+ canCreateIn , err = g .CanCreateIn (ctx , ctx .Doer .ID )
555+ if err != nil {
556+ ctx .APIErrorInternal (err )
557+ return
558+ }
559+ }
560+ if ! canCreateIn {
561+ ctx .APIError (http .StatusForbidden , fmt .Sprintf ("User[%d] does not have permission to create new items in group[%d]" , ctx .Doer .ID , gid ))
562+ return
563+ }
564+ }
565+ }
566+ }
567+
512568// reqTeamMembership user should be an team member, or a site admin
513569func reqTeamMembership () func (ctx * context.APIContext ) {
514570 return func (ctx * context.APIContext ) {
@@ -1189,6 +1245,7 @@ func Routes() *web.Router {
11891245 m .Combo ("" ).Get (reqAnyRepoReader (), repo .Get ).
11901246 Delete (reqToken (), reqOwner (), repo .Delete ).
11911247 Patch (reqToken (), reqAdmin (), bind (api.EditRepoOption {}), repo .Edit )
1248+ m .Post ("/groups/move" , reqToken (), bind (api.EditGroupOption {}), reqOrgMembership (), reqGroupMembership (perm .AccessModeWrite , false ), repo .MoveRepoToGroup )
11921249 m .Post ("/generate" , reqToken (), reqRepoReader (unit .TypeCode ), bind (api.GenerateRepoOption {}), repo .Generate )
11931250 m .Group ("/transfer" , func () {
11941251 m .Post ("" , reqOwner (), bind (api.TransferRepoOption {}), repo .Transfer )
@@ -1688,6 +1745,10 @@ func Routes() *web.Router {
16881745 m .Delete ("" , org .UnblockUser )
16891746 })
16901747 }, reqToken (), reqOrgOwnership ())
1748+ m .Group ("/groups" , func () {
1749+ m .Post ("/new" , reqToken (), reqGroupMembership (perm .AccessModeWrite , true ), group .NewGroup )
1750+ m .Post ("/{group_id}/move" , reqToken (), reqGroupMembership (perm .AccessModeWrite , false ), group .MoveGroup )
1751+ })
16911752 }, tokenRequiresScopes (auth_model .AccessTokenScopeCategoryOrganization ), orgAssignment (true ), checkTokenPublicOnly ())
16921753 m .Group ("/teams/{teamid}" , func () {
16931754 m .Combo ("" ).Get (reqToken (), org .GetTeam ).
@@ -1770,7 +1831,15 @@ func Routes() *web.Router {
17701831 m .Get ("/search" , repo .TopicSearch )
17711832 }, tokenRequiresScopes (auth_model .AccessTokenScopeCategoryRepository ))
17721833 }, sudo ())
1773-
1834+ m .Group ("/groups" , func () {
1835+ m .Group ("/{group_id}" , func () {
1836+ m .Combo ("" ).
1837+ Get (reqGroupMembership (perm .AccessModeRead , false ), group .GetGroup ).
1838+ Patch (reqToken (), reqGroupMembership (perm .AccessModeWrite , false ), bind (api.EditGroupOption {}), group .EditGroup ).
1839+ Delete (reqToken (), reqGroupMembership (perm .AccessModeAdmin , false ), group .DeleteGroup )
1840+ m .Post ("/new" , reqToken (), reqGroupMembership (perm .AccessModeWrite , true ), bind (api.NewGroupOption {}), group .NewSubGroup )
1841+ })
1842+ })
17741843 return m
17751844}
17761845
0 commit comments