2014-08-14 14:12:21 +08:00
// Copyright 2014 The Gogs Authors. All rights reserved.
2020-01-24 19:00:29 +00:00
// Copyright 2020 The Gitea Authors.
2014-08-14 14:12:21 +08:00
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2016-03-11 11:56:52 -05:00
package context
2014-08-14 14:12:21 +08:00
import (
2016-01-31 13:28:42 +00:00
"strings"
2016-11-10 17:24:48 +01:00
"code.gitea.io/gitea/models"
2014-08-14 14:12:21 +08:00
)
2016-11-25 14:51:01 +08:00
// Organization contains organization context
2016-03-13 17:37:44 -04:00
type Organization struct {
2019-11-20 12:27:49 +01:00
IsOwner bool
IsMember bool
IsTeamMember bool // Is member of team.
IsTeamAdmin bool // In owner team or team that has admin permission level.
Organization * models . User
OrgLink string
CanCreateOrgRepo bool
2016-03-13 17:37:44 -04:00
Team * models . Team
}
2016-11-25 14:51:01 +08:00
// HandleOrgAssignment handles organization assignment
2015-11-24 19:14:00 -05:00
func HandleOrgAssignment ( ctx * Context , args ... bool ) {
var (
2016-01-31 13:28:42 +00:00
requireMember bool
requireOwner bool
requireTeamMember bool
2016-01-31 15:18:28 +00:00
requireTeamAdmin bool
2015-11-24 19:14:00 -05:00
)
if len ( args ) >= 1 {
requireMember = args [ 0 ]
}
if len ( args ) >= 2 {
requireOwner = args [ 1 ]
}
if len ( args ) >= 3 {
2016-01-31 13:28:42 +00:00
requireTeamMember = args [ 2 ]
}
if len ( args ) >= 4 {
2016-01-31 15:18:28 +00:00
requireTeamAdmin = args [ 3 ]
2015-11-24 19:14:00 -05:00
}
2014-08-14 14:12:21 +08:00
2015-11-24 19:14:00 -05:00
orgName := ctx . Params ( ":org" )
2014-08-14 14:12:21 +08:00
2015-11-24 19:14:00 -05:00
var err error
ctx . Org . Organization , err = models . GetUserByName ( orgName )
if err != nil {
if models . IsErrUserNotExist ( err ) {
2021-01-24 10:23:05 -05:00
redirectUserID , err := models . LookupUserRedirect ( orgName )
if err == nil {
RedirectToUser ( ctx , orgName , redirectUserID )
} else if models . IsErrUserRedirectNotExist ( err ) {
ctx . NotFound ( "GetUserByName" , err )
} else {
ctx . ServerError ( "LookupUserRedirect" , err )
}
2015-11-24 19:14:00 -05:00
} else {
2018-01-10 22:34:17 +01:00
ctx . ServerError ( "GetUserByName" , err )
2014-08-14 14:12:21 +08:00
}
2015-11-24 19:14:00 -05:00
return
}
org := ctx . Org . Organization
ctx . Data [ "Org" ] = org
2014-08-14 14:12:21 +08:00
2015-11-24 19:14:00 -05:00
// Force redirection when username is actually a user.
if ! org . IsOrganization ( ) {
2021-04-30 19:25:13 +02:00
ctx . Redirect ( org . HomeLink ( ) )
2015-11-24 19:14:00 -05:00
return
}
2015-07-26 19:22:17 +08:00
2015-11-28 22:31:06 +01:00
// Admin has super access.
if ctx . IsSigned && ctx . User . IsAdmin {
ctx . Org . IsOwner = true
ctx . Org . IsMember = true
2016-01-31 13:28:42 +00:00
ctx . Org . IsTeamMember = true
2016-01-31 15:18:28 +00:00
ctx . Org . IsTeamAdmin = true
2019-11-20 12:27:49 +01:00
ctx . Org . CanCreateOrgRepo = true
2015-11-28 22:31:06 +01:00
} else if ctx . IsSigned {
2017-12-20 23:43:26 -08:00
ctx . Org . IsOwner , err = org . IsOwnedBy ( ctx . User . ID )
if err != nil {
2018-01-10 22:34:17 +01:00
ctx . ServerError ( "IsOwnedBy" , err )
2017-12-20 23:43:26 -08:00
return
}
2015-11-24 19:14:00 -05:00
if ctx . Org . IsOwner {
ctx . Org . IsMember = true
2016-01-31 13:28:42 +00:00
ctx . Org . IsTeamMember = true
2016-01-31 15:18:28 +00:00
ctx . Org . IsTeamAdmin = true
2019-11-20 12:27:49 +01:00
ctx . Org . CanCreateOrgRepo = true
2015-11-24 19:14:00 -05:00
} else {
2017-12-20 23:43:26 -08:00
ctx . Org . IsMember , err = org . IsOrgMember ( ctx . User . ID )
if err != nil {
2018-01-10 22:34:17 +01:00
ctx . ServerError ( "IsOrgMember" , err )
2017-12-20 23:43:26 -08:00
return
2014-08-14 14:12:21 +08:00
}
2019-11-20 12:27:49 +01:00
ctx . Org . CanCreateOrgRepo , err = org . CanCreateOrgRepo ( ctx . User . ID )
if err != nil {
ctx . ServerError ( "CanCreateOrgRepo" , err )
return
}
2014-08-14 14:12:21 +08:00
}
2015-11-24 19:14:00 -05:00
} else {
// Fake data.
ctx . Data [ "SignedUser" ] = & models . User { }
}
if ( requireMember && ! ctx . Org . IsMember ) ||
( requireOwner && ! ctx . Org . IsOwner ) {
2018-01-10 22:34:17 +01:00
ctx . NotFound ( "OrgAssignment" , err )
2015-11-24 19:14:00 -05:00
return
}
ctx . Data [ "IsOrganizationOwner" ] = ctx . Org . IsOwner
2015-11-28 22:31:06 +01:00
ctx . Data [ "IsOrganizationMember" ] = ctx . Org . IsMember
2019-11-20 12:27:49 +01:00
ctx . Data [ "CanCreateOrgRepo" ] = ctx . Org . CanCreateOrgRepo
2014-08-15 18:29:41 +08:00
2021-04-30 19:25:13 +02:00
ctx . Org . OrgLink = org . OrganisationLink ( )
2015-11-24 19:14:00 -05:00
ctx . Data [ "OrgLink" ] = ctx . Org . OrgLink
2014-08-16 16:21:17 +08:00
2015-11-24 19:14:00 -05:00
// Team.
2016-01-31 13:28:42 +00:00
if ctx . Org . IsMember {
2016-01-31 16:13:31 +00:00
if ctx . Org . IsOwner {
2020-01-24 19:00:29 +00:00
if err := org . GetTeams ( & models . SearchTeamOptions { } ) ; err != nil {
2018-01-10 22:34:17 +01:00
ctx . ServerError ( "GetTeams" , err )
2016-01-31 16:13:31 +00:00
return
}
} else {
2016-07-24 18:09:45 +08:00
org . Teams , err = org . GetUserTeams ( ctx . User . ID )
if err != nil {
2018-01-10 22:34:17 +01:00
ctx . ServerError ( "GetUserTeams" , err )
2016-01-31 16:13:31 +00:00
return
}
2016-01-31 13:28:42 +00:00
}
}
2015-11-24 19:14:00 -05:00
teamName := ctx . Params ( ":team" )
if len ( teamName ) > 0 {
2016-01-31 13:28:42 +00:00
teamExists := false
for _ , team := range org . Teams {
2016-02-04 13:03:34 -05:00
if team . LowerName == strings . ToLower ( teamName ) {
2016-01-31 13:28:42 +00:00
teamExists = true
ctx . Org . Team = team
ctx . Org . IsTeamMember = true
ctx . Data [ "Team" ] = ctx . Org . Team
break
2014-08-16 16:21:17 +08:00
}
2016-01-31 13:28:42 +00:00
}
if ! teamExists {
2018-01-10 22:34:17 +01:00
ctx . NotFound ( "OrgAssignment" , err )
2016-01-31 13:28:42 +00:00
return
}
ctx . Data [ "IsTeamMember" ] = ctx . Org . IsTeamMember
if requireTeamMember && ! ctx . Org . IsTeamMember {
2018-01-10 22:34:17 +01:00
ctx . NotFound ( "OrgAssignment" , err )
2014-08-24 21:09:05 +08:00
return
2014-08-16 16:21:17 +08:00
}
2016-01-31 13:28:42 +00:00
2016-11-07 17:20:37 +01:00
ctx . Org . IsTeamAdmin = ctx . Org . Team . IsOwnerTeam ( ) || ctx . Org . Team . Authorize >= models . AccessModeAdmin
2016-01-31 15:18:28 +00:00
ctx . Data [ "IsTeamAdmin" ] = ctx . Org . IsTeamAdmin
if requireTeamAdmin && ! ctx . Org . IsTeamAdmin {
2018-01-10 22:34:17 +01:00
ctx . NotFound ( "OrgAssignment" , err )
2016-01-31 13:28:42 +00:00
return
}
2015-11-24 19:14:00 -05:00
}
}
2021-01-29 23:35:30 +08:00
// OrgAssignment returns a middleware to handle organization assignment
2021-01-26 23:36:53 +08:00
func OrgAssignment ( args ... bool ) func ( ctx * Context ) {
2015-11-24 19:14:00 -05:00
return func ( ctx * Context ) {
HandleOrgAssignment ( ctx , args ... )
2014-08-14 14:12:21 +08:00
}
}