@@ -11,7 +11,6 @@ import (
1111	"code.gitea.io/gitea/models/perm" 
1212	"code.gitea.io/gitea/models/unit" 
1313	user_model "code.gitea.io/gitea/models/user" 
14- 	"code.gitea.io/gitea/modules/log" 
1514	"code.gitea.io/gitea/modules/setting" 
1615	"code.gitea.io/gitea/modules/structs" 
1716)
@@ -31,29 +30,34 @@ type Organization struct {
3130}
3231
3332func  (org  * Organization ) CanWriteUnit (ctx  * Context , unitType  unit.Type ) bool  {
34- 	if  ctx .Doer  ==  nil  {
35- 		return  false 
36- 	}
37- 	return  org .UnitPermission (ctx , ctx .Doer .ID , unitType ) >=  perm .AccessModeWrite 
33+ 	return  org .Organization .UnitPermission (ctx , ctx .Doer , unitType ) >=  perm .AccessModeWrite 
3834}
3935
40- func  (org  * Organization ) UnitPermission (ctx  * Context , doerID  int64 , unitType  unit.Type ) perm.AccessMode  {
41- 	if  doerID  >  0  {
42- 		teams , err  :=  organization .GetUserOrgTeams (ctx , org .Organization .ID , doerID )
43- 		if  err  !=  nil  {
44- 			log .Error ("GetUserOrgTeams: %v" , err )
45- 			return  perm .AccessModeNone 
46- 		}
47- 		if  len (teams ) >  0  {
48- 			return  teams .UnitMaxAccess (unitType )
49- 		}
50- 	}
36+ func  (org  * Organization ) CanReadUnit (ctx  * Context , unitType  unit.Type ) bool  {
37+ 	return  org .Organization .UnitPermission (ctx , ctx .Doer , unitType ) >=  perm .AccessModeRead 
38+ }
5139
52- 	if  org .Organization .Visibility  ==  structs .VisibleTypePublic  {
53- 		return  perm .AccessModeRead 
54- 	}
40+ func  GetOrganizationByParams (ctx  * Context ) {
41+ 	orgName  :=  ctx .Params (":org" )
42+ 
43+ 	var  err  error 
5544
56- 	return  perm .AccessModeNone 
45+ 	ctx .Org .Organization , err  =  organization .GetOrgByName (ctx , orgName )
46+ 	if  err  !=  nil  {
47+ 		if  organization .IsErrOrgNotExist (err ) {
48+ 			redirectUserID , err  :=  user_model .LookupUserRedirect (orgName )
49+ 			if  err  ==  nil  {
50+ 				RedirectToUser (ctx , orgName , redirectUserID )
51+ 			} else  if  user_model .IsErrUserRedirectNotExist (err ) {
52+ 				ctx .NotFound ("GetUserByName" , err )
53+ 			} else  {
54+ 				ctx .ServerError ("LookupUserRedirect" , err )
55+ 			}
56+ 		} else  {
57+ 			ctx .ServerError ("GetUserByName" , err )
58+ 		}
59+ 		return 
60+ 	}
5761}
5862
5963// HandleOrgAssignment handles organization assignment 
@@ -77,25 +81,26 @@ func HandleOrgAssignment(ctx *Context, args ...bool) {
7781		requireTeamAdmin  =  args [3 ]
7882	}
7983
80- 	orgName  :=  ctx .Params (":org" )
81- 
8284	var  err  error 
83- 	ctx .Org .Organization , err  =  organization .GetOrgByName (ctx , orgName )
84- 	if  err  !=  nil  {
85- 		if  organization .IsErrOrgNotExist (err ) {
86- 			redirectUserID , err  :=  user_model .LookupUserRedirect (orgName )
87- 			if  err  ==  nil  {
88- 				RedirectToUser (ctx , orgName , redirectUserID )
89- 			} else  if  user_model .IsErrUserRedirectNotExist (err ) {
90- 				ctx .NotFound ("GetUserByName" , err )
91- 			} else  {
92- 				ctx .ServerError ("LookupUserRedirect" , err )
85+ 
86+ 	if  ctx .ContextUser  ==  nil  {
87+ 		// if Organization is not defined, get it from params 
88+ 		if  ctx .Org .Organization  ==  nil  {
89+ 			GetOrganizationByParams (ctx )
90+ 			if  ctx .Written () {
91+ 				return 
9392			}
94- 		} else  {
95- 			ctx .ServerError ("GetUserByName" , err )
9693		}
94+ 	} else  if  ctx .ContextUser .IsOrganization () {
95+ 		if  ctx .Org  ==  nil  {
96+ 			ctx .Org  =  & Organization {}
97+ 		}
98+ 		ctx .Org .Organization  =  (* organization .Organization )(ctx .ContextUser )
99+ 	} else  {
100+ 		// ContextUser is an individual User 
97101		return 
98102	}
103+ 
99104	org  :=  ctx .Org .Organization 
100105
101106	// Handle Visibility 
@@ -156,6 +161,7 @@ func HandleOrgAssignment(ctx *Context, args ...bool) {
156161	}
157162	ctx .Data ["IsOrganizationOwner" ] =  ctx .Org .IsOwner 
158163	ctx .Data ["IsOrganizationMember" ] =  ctx .Org .IsMember 
164+ 	ctx .Data ["IsProjectEnabled" ] =  true 
159165	ctx .Data ["IsPackageEnabled" ] =  setting .Packages .Enabled 
160166	ctx .Data ["IsRepoIndexerEnabled" ] =  setting .Indexer .RepoIndexerEnabled 
161167	ctx .Data ["IsPublicMember" ] =  func (uid  int64 ) bool  {
@@ -231,6 +237,10 @@ func HandleOrgAssignment(ctx *Context, args ...bool) {
231237			return 
232238		}
233239	}
240+ 
241+ 	ctx .Data ["CanReadProjects" ] =  ctx .Org .CanReadUnit (ctx , unit .TypeProjects )
242+ 	ctx .Data ["CanReadPackages" ] =  ctx .Org .CanReadUnit (ctx , unit .TypePackages )
243+ 	ctx .Data ["CanReadCode" ] =  ctx .Org .CanReadUnit (ctx , unit .TypeCode )
234244}
235245
236246// OrgAssignment returns a middleware to handle organization assignment 
0 commit comments