Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package context
  5. import (
  6. "strings"
  7. "code.gitea.io/gitea/models"
  8. "code.gitea.io/gitea/modules/setting"
  9. "gitea.com/macaron/macaron"
  10. )
  11. // Organization contains organization context
  12. type Organization struct {
  13. IsOwner bool
  14. IsMember bool
  15. IsTeamMember bool // Is member of team.
  16. IsTeamAdmin bool // In owner team or team that has admin permission level.
  17. Organization *models.User
  18. OrgLink string
  19. CanCreateOrgRepo bool
  20. Team *models.Team
  21. }
  22. // HandleOrgAssignment handles organization assignment
  23. func HandleOrgAssignment(ctx *Context, args ...bool) {
  24. var (
  25. requireMember bool
  26. requireOwner bool
  27. requireTeamMember bool
  28. requireTeamAdmin bool
  29. )
  30. if len(args) >= 1 {
  31. requireMember = args[0]
  32. }
  33. if len(args) >= 2 {
  34. requireOwner = args[1]
  35. }
  36. if len(args) >= 3 {
  37. requireTeamMember = args[2]
  38. }
  39. if len(args) >= 4 {
  40. requireTeamAdmin = args[3]
  41. }
  42. orgName := ctx.Params(":org")
  43. var err error
  44. ctx.Org.Organization, err = models.GetUserByName(orgName)
  45. if err != nil {
  46. if models.IsErrUserNotExist(err) {
  47. ctx.NotFound("GetUserByName", err)
  48. } else {
  49. ctx.ServerError("GetUserByName", err)
  50. }
  51. return
  52. }
  53. org := ctx.Org.Organization
  54. ctx.Data["Org"] = org
  55. // Force redirection when username is actually a user.
  56. if !org.IsOrganization() {
  57. ctx.Redirect(setting.AppSubURL + "/" + org.Name)
  58. return
  59. }
  60. // Admin has super access.
  61. if ctx.IsSigned && ctx.User.IsAdmin {
  62. ctx.Org.IsOwner = true
  63. ctx.Org.IsMember = true
  64. ctx.Org.IsTeamMember = true
  65. ctx.Org.IsTeamAdmin = true
  66. ctx.Org.CanCreateOrgRepo = true
  67. } else if ctx.IsSigned {
  68. ctx.Org.IsOwner, err = org.IsOwnedBy(ctx.User.ID)
  69. if err != nil {
  70. ctx.ServerError("IsOwnedBy", err)
  71. return
  72. }
  73. if ctx.Org.IsOwner {
  74. ctx.Org.IsMember = true
  75. ctx.Org.IsTeamMember = true
  76. ctx.Org.IsTeamAdmin = true
  77. ctx.Org.CanCreateOrgRepo = true
  78. } else {
  79. ctx.Org.IsMember, err = org.IsOrgMember(ctx.User.ID)
  80. if err != nil {
  81. ctx.ServerError("IsOrgMember", err)
  82. return
  83. }
  84. ctx.Org.CanCreateOrgRepo, err = org.CanCreateOrgRepo(ctx.User.ID)
  85. if err != nil {
  86. ctx.ServerError("CanCreateOrgRepo", err)
  87. return
  88. }
  89. }
  90. } else {
  91. // Fake data.
  92. ctx.Data["SignedUser"] = &models.User{}
  93. }
  94. if (requireMember && !ctx.Org.IsMember) ||
  95. (requireOwner && !ctx.Org.IsOwner) {
  96. ctx.NotFound("OrgAssignment", err)
  97. return
  98. }
  99. ctx.Data["IsOrganizationOwner"] = ctx.Org.IsOwner
  100. ctx.Data["IsOrganizationMember"] = ctx.Org.IsMember
  101. ctx.Data["CanCreateOrgRepo"] = ctx.Org.CanCreateOrgRepo
  102. ctx.Org.OrgLink = setting.AppSubURL + "/org/" + org.Name
  103. ctx.Data["OrgLink"] = ctx.Org.OrgLink
  104. // Team.
  105. if ctx.Org.IsMember {
  106. if ctx.Org.IsOwner {
  107. if err := org.GetTeams(); err != nil {
  108. ctx.ServerError("GetTeams", err)
  109. return
  110. }
  111. } else {
  112. org.Teams, err = org.GetUserTeams(ctx.User.ID)
  113. if err != nil {
  114. ctx.ServerError("GetUserTeams", err)
  115. return
  116. }
  117. }
  118. }
  119. teamName := ctx.Params(":team")
  120. if len(teamName) > 0 {
  121. teamExists := false
  122. for _, team := range org.Teams {
  123. if team.LowerName == strings.ToLower(teamName) {
  124. teamExists = true
  125. ctx.Org.Team = team
  126. ctx.Org.IsTeamMember = true
  127. ctx.Data["Team"] = ctx.Org.Team
  128. break
  129. }
  130. }
  131. if !teamExists {
  132. ctx.NotFound("OrgAssignment", err)
  133. return
  134. }
  135. ctx.Data["IsTeamMember"] = ctx.Org.IsTeamMember
  136. if requireTeamMember && !ctx.Org.IsTeamMember {
  137. ctx.NotFound("OrgAssignment", err)
  138. return
  139. }
  140. ctx.Org.IsTeamAdmin = ctx.Org.Team.IsOwnerTeam() || ctx.Org.Team.Authorize >= models.AccessModeAdmin
  141. ctx.Data["IsTeamAdmin"] = ctx.Org.IsTeamAdmin
  142. if requireTeamAdmin && !ctx.Org.IsTeamAdmin {
  143. ctx.NotFound("OrgAssignment", err)
  144. return
  145. }
  146. }
  147. }
  148. // OrgAssignment returns a macaron middleware to handle organization assignment
  149. func OrgAssignment(args ...bool) macaron.Handler {
  150. return func(ctx *Context) {
  151. HandleOrgAssignment(ctx, args...)
  152. }
  153. }