2014-08-14 14:12:21 +08:00
|
|
|
// Copyright 2014 The Gogs Authors. All rights reserved.
|
|
|
|
|
// 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"
|
|
|
|
|
|
2015-10-15 21:28:12 -04:00
|
|
|
"gopkg.in/macaron.v1"
|
2014-08-14 14:12:21 +08:00
|
|
|
|
2020-02-22 09:05:26 +08:00
|
|
|
"gogs.io/gogs/internal/conf"
|
2019-10-24 01:51:46 -07:00
|
|
|
"gogs.io/gogs/internal/db"
|
2014-08-14 14:12:21 +08:00
|
|
|
)
|
|
|
|
|
|
2016-03-13 17:37:44 -04:00
|
|
|
type Organization struct {
|
|
|
|
|
IsOwner bool
|
|
|
|
|
IsMember bool
|
|
|
|
|
IsTeamMember bool // Is member of team.
|
|
|
|
|
IsTeamAdmin bool // In owner team or team that has admin permission level.
|
2019-10-24 01:51:46 -07:00
|
|
|
Organization *db.User
|
2016-03-13 17:37:44 -04:00
|
|
|
OrgLink string
|
|
|
|
|
|
2019-10-24 01:51:46 -07:00
|
|
|
Team *db.Team
|
2016-03-13 17:37:44 -04:00
|
|
|
}
|
|
|
|
|
|
2017-06-03 07:26:09 -04:00
|
|
|
func HandleOrgAssignment(c *Context, args ...bool) {
|
2015-11-24 19:14:00 -05:00
|
|
|
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
|
|
|
|
2017-06-03 07:26:09 -04:00
|
|
|
orgName := c.Params(":org")
|
2014-08-14 14:12:21 +08:00
|
|
|
|
2015-11-24 19:14:00 -05:00
|
|
|
var err error
|
2019-10-24 01:51:46 -07:00
|
|
|
c.Org.Organization, err = db.GetUserByName(orgName)
|
2015-11-24 19:14:00 -05:00
|
|
|
if err != nil {
|
2020-03-16 01:22:27 +08:00
|
|
|
c.NotFoundOrError(err, "get organization by name")
|
2015-11-24 19:14:00 -05:00
|
|
|
return
|
|
|
|
|
}
|
2017-06-03 07:26:09 -04:00
|
|
|
org := c.Org.Organization
|
|
|
|
|
c.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() {
|
2017-06-03 07:26:09 -04:00
|
|
|
c.Redirect("/" + org.Name)
|
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.
|
2017-06-03 07:26:09 -04:00
|
|
|
if c.IsLogged && c.User.IsAdmin {
|
|
|
|
|
c.Org.IsOwner = true
|
|
|
|
|
c.Org.IsMember = true
|
|
|
|
|
c.Org.IsTeamMember = true
|
|
|
|
|
c.Org.IsTeamAdmin = true
|
|
|
|
|
} else if c.IsLogged {
|
|
|
|
|
c.Org.IsOwner = org.IsOwnedBy(c.User.ID)
|
|
|
|
|
if c.Org.IsOwner {
|
|
|
|
|
c.Org.IsMember = true
|
|
|
|
|
c.Org.IsTeamMember = true
|
|
|
|
|
c.Org.IsTeamAdmin = true
|
2022-03-06 16:39:14 +08:00
|
|
|
} else if org.IsOrgMember(c.User.ID) {
|
|
|
|
|
c.Org.IsMember = true
|
2014-08-14 14:12:21 +08:00
|
|
|
}
|
2015-11-24 19:14:00 -05:00
|
|
|
} else {
|
|
|
|
|
// Fake data.
|
2019-10-24 01:51:46 -07:00
|
|
|
c.Data["SignedUser"] = &db.User{}
|
2015-11-24 19:14:00 -05:00
|
|
|
}
|
2017-06-03 07:26:09 -04:00
|
|
|
if (requireMember && !c.Org.IsMember) ||
|
|
|
|
|
(requireOwner && !c.Org.IsOwner) {
|
2020-03-16 01:22:27 +08:00
|
|
|
c.NotFound()
|
2015-11-24 19:14:00 -05:00
|
|
|
return
|
|
|
|
|
}
|
2017-06-03 07:26:09 -04:00
|
|
|
c.Data["IsOrganizationOwner"] = c.Org.IsOwner
|
|
|
|
|
c.Data["IsOrganizationMember"] = c.Org.IsMember
|
2014-08-15 18:29:41 +08:00
|
|
|
|
2020-02-22 09:05:26 +08:00
|
|
|
c.Org.OrgLink = conf.Server.Subpath + "/org/" + org.Name
|
2017-06-03 07:26:09 -04:00
|
|
|
c.Data["OrgLink"] = c.Org.OrgLink
|
2014-08-16 16:21:17 +08:00
|
|
|
|
2015-11-24 19:14:00 -05:00
|
|
|
// Team.
|
2017-06-03 07:26:09 -04:00
|
|
|
if c.Org.IsMember {
|
|
|
|
|
if c.Org.IsOwner {
|
2016-01-31 16:13:31 +00:00
|
|
|
if err := org.GetTeams(); err != nil {
|
2020-03-16 01:22:27 +08:00
|
|
|
c.Error(err, "get teams")
|
2016-01-31 16:13:31 +00:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2017-06-03 07:26:09 -04:00
|
|
|
org.Teams, err = org.GetUserTeams(c.User.ID)
|
2016-07-24 18:09:45 +08:00
|
|
|
if err != nil {
|
2020-03-16 01:22:27 +08:00
|
|
|
c.Error(err, "get user teams")
|
2016-01-31 16:13:31 +00:00
|
|
|
return
|
|
|
|
|
}
|
2016-01-31 13:28:42 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-03 07:26:09 -04:00
|
|
|
teamName := c.Params(":team")
|
2015-11-24 19:14:00 -05:00
|
|
|
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
|
2017-06-03 07:26:09 -04:00
|
|
|
c.Org.Team = team
|
|
|
|
|
c.Org.IsTeamMember = true
|
|
|
|
|
c.Data["Team"] = c.Org.Team
|
2016-01-31 13:28:42 +00:00
|
|
|
break
|
2014-08-16 16:21:17 +08:00
|
|
|
}
|
2016-01-31 13:28:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if !teamExists {
|
2020-03-16 01:22:27 +08:00
|
|
|
c.NotFound()
|
2016-01-31 13:28:42 +00:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-03 07:26:09 -04:00
|
|
|
c.Data["IsTeamMember"] = c.Org.IsTeamMember
|
|
|
|
|
if requireTeamMember && !c.Org.IsTeamMember {
|
2020-03-16 01:22:27 +08:00
|
|
|
c.NotFound()
|
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
|
|
|
|
2020-04-04 21:14:15 +08:00
|
|
|
c.Org.IsTeamAdmin = c.Org.Team.IsOwnerTeam() || c.Org.Team.Authorize >= db.AccessModeAdmin
|
2017-06-03 07:26:09 -04:00
|
|
|
c.Data["IsTeamAdmin"] = c.Org.IsTeamAdmin
|
|
|
|
|
if requireTeamAdmin && !c.Org.IsTeamAdmin {
|
2020-03-16 01:22:27 +08:00
|
|
|
c.NotFound()
|
2016-01-31 13:28:42 +00:00
|
|
|
return
|
|
|
|
|
}
|
2015-11-24 19:14:00 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func OrgAssignment(args ...bool) macaron.Handler {
|
2017-06-03 07:26:09 -04:00
|
|
|
return func(c *Context) {
|
|
|
|
|
HandleOrgAssignment(c, args...)
|
2014-08-14 14:12:21 +08:00
|
|
|
}
|
|
|
|
|
}
|