mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-06 05:25:50 +01:00
(refs #198)Allow group editing by group members.
This commit is contained in:
@@ -51,14 +51,20 @@ trait AccountControllerBase extends AccountManagementControllerBase {
|
|||||||
getActivitiesByUser(userName, true))
|
getActivitiesByUser(userName, true))
|
||||||
|
|
||||||
// Members
|
// Members
|
||||||
case "members" if(account.isGroupAccount) =>
|
case "members" if(account.isGroupAccount) => {
|
||||||
_root_.account.html.members(account, getGroupMembers(account.userName))
|
val members = getGroupMembers(account.userName)
|
||||||
|
_root_.account.html.members(account, members,
|
||||||
|
context.loginAccount.exists(x => members.contains(x.userName)))
|
||||||
|
}
|
||||||
|
|
||||||
// Repositories
|
// Repositories
|
||||||
case _ =>
|
case _ => {
|
||||||
|
val members = getGroupMembers(account.userName)
|
||||||
_root_.account.html.repositories(account,
|
_root_.account.html.repositories(account,
|
||||||
if(account.isGroupAccount) Nil else getGroupsByUserName(userName),
|
if(account.isGroupAccount) Nil else getGroupsByUserName(userName),
|
||||||
getVisibleRepositories(context.loginAccount, baseUrl, Some(userName)))
|
getVisibleRepositories(context.loginAccount, baseUrl, Some(userName)),
|
||||||
|
context.loginAccount.exists(x => members.contains(x.userName)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} getOrElse NotFound
|
} getOrElse NotFound
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,14 +13,14 @@ import org.apache.commons.io.FileUtils
|
|||||||
|
|
||||||
class CreateController extends CreateControllerBase
|
class CreateController extends CreateControllerBase
|
||||||
with RepositoryService with AccountService with WikiService with LabelsService with ActivityService
|
with RepositoryService with AccountService with WikiService with LabelsService with ActivityService
|
||||||
with UsersAuthenticator with ReadableUsersAuthenticator
|
with UsersAuthenticator with ReadableUsersAuthenticator with GroupMemberAuthenticator
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates new repository or group.
|
* Creates new repository or group.
|
||||||
*/
|
*/
|
||||||
trait CreateControllerBase extends AccountManagementControllerBase {
|
trait CreateControllerBase extends AccountManagementControllerBase {
|
||||||
self: RepositoryService with AccountService with WikiService with LabelsService with ActivityService
|
self: RepositoryService with AccountService with WikiService with LabelsService with ActivityService
|
||||||
with UsersAuthenticator with ReadableUsersAuthenticator =>
|
with UsersAuthenticator with ReadableUsersAuthenticator with GroupMemberAuthenticator =>
|
||||||
|
|
||||||
case class RepositoryCreationForm(owner: String, name: String, description: Option[String],
|
case class RepositoryCreationForm(owner: String, name: String, description: Option[String],
|
||||||
isPrivate: Boolean, createReadme: Boolean)
|
isPrivate: Boolean, createReadme: Boolean)
|
||||||
@@ -207,13 +207,13 @@ trait CreateControllerBase extends AccountManagementControllerBase {
|
|||||||
redirect(s"/${form.groupName}")
|
redirect(s"/${form.groupName}")
|
||||||
})
|
})
|
||||||
|
|
||||||
get("/:groupName/_edit")(usersOnly { // TODO group manager only
|
get("/:groupName/_edit")(membersOnly {
|
||||||
defining(params("groupName")){ groupName =>
|
defining(params("groupName")){ groupName =>
|
||||||
html.group(getAccountByUserName(groupName, true), getGroupMembers(groupName))
|
html.group(getAccountByUserName(groupName, true), getGroupMembers(groupName))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
post("/:groupName/_edit", editGroupForm)(usersOnly { form => // TODO group manager only
|
post("/:groupName/_edit", editGroupForm)(membersOnly { form =>
|
||||||
defining(params("groupName"), form.memberNames.map(_.split(",").toList).getOrElse(Nil)){ case (groupName, memberNames) =>
|
defining(params("groupName"), form.memberNames.map(_.split(",").toList).getOrElse(Nil)){ case (groupName, memberNames) =>
|
||||||
getAccountByUserName(groupName, true).map { account =>
|
getAccountByUserName(groupName, true).map { account =>
|
||||||
updateGroup(groupName, form.url, form.isRemoved)
|
updateGroup(groupName, form.url, form.isRemoved)
|
||||||
|
|||||||
@@ -155,3 +155,22 @@ trait ReadableUsersAuthenticator { self: ControllerBase with RepositoryService =
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows only the group members.
|
||||||
|
*/
|
||||||
|
trait GroupMemberAuthenticator { self: ControllerBase with AccountService =>
|
||||||
|
protected def membersOnly(action: => Any) = { authenticate(action) }
|
||||||
|
protected def membersOnly[T](action: T => Any) = (form: T) => { authenticate(action(form)) }
|
||||||
|
|
||||||
|
private def authenticate(action: => Any) = {
|
||||||
|
{
|
||||||
|
defining(request.paths){ paths =>
|
||||||
|
context.loginAccount match {
|
||||||
|
case Some(x) if(getGroupMembers(paths(0)).contains(x.userName)) => action
|
||||||
|
case _ => Unauthorized()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
@(account: model.Account, groupNames: List[String], active: String)(body: Html)(implicit context: app.Context)
|
@(account: model.Account, groupNames: List[String], active: String,
|
||||||
|
isGroupMember: Boolean = false)(body: Html)(implicit context: app.Context)
|
||||||
@import context._
|
@import context._
|
||||||
@import view.helpers._
|
@import view.helpers._
|
||||||
@html.main(account.userName){
|
@html.main(account.userName){
|
||||||
@@ -41,7 +42,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
}
|
}
|
||||||
@if(loginAccount.isDefined && account.isGroupAccount){
|
@if(loginAccount.isDefined && account.isGroupAccount && isGroupMember){
|
||||||
<li class="pull-right">
|
<li class="pull-right">
|
||||||
<div class="button-group">
|
<div class="button-group">
|
||||||
<a href="@url(account.userName)/_edit" class="btn">Edit Group</a>
|
<a href="@url(account.userName)/_edit" class="btn">Edit Group</a>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
@(account: model.Account, members: List[String])(implicit context: app.Context)
|
@(account: model.Account, members: List[String], isGroupMember: Boolean)(implicit context: app.Context)
|
||||||
@import context._
|
@import context._
|
||||||
@import view.helpers._
|
@import view.helpers._
|
||||||
@main(account, Nil, "members"){
|
@main(account, Nil, "members", isGroupMember){
|
||||||
@if(members.isEmpty){
|
@if(members.isEmpty){
|
||||||
No members
|
No members
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
@(account: model.Account, groupNames: List[String], repositories: List[service.RepositoryService.RepositoryInfo])(implicit context: app.Context)
|
@(account: model.Account, groupNames: List[String],
|
||||||
|
repositories: List[service.RepositoryService.RepositoryInfo],
|
||||||
|
isGroupMember: Boolean)(implicit context: app.Context)
|
||||||
@import context._
|
@import context._
|
||||||
@import view.helpers._
|
@import view.helpers._
|
||||||
@main(account, groupNames, "repositories"){
|
@main(account, groupNames, "repositories", isGroupMember){
|
||||||
@if(repositories.isEmpty){
|
@if(repositories.isEmpty){
|
||||||
No repositories
|
No repositories
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
@import view.helpers._
|
@import view.helpers._
|
||||||
@main("Create a group"){
|
@main("Create a group"){
|
||||||
<div style="width: 700px; margin: 10px auto;">
|
<div style="width: 700px; margin: 10px auto;">
|
||||||
<form id="form" method="post" action="@path/groups/new" validate="true">
|
<form id="form" method="post" action="@if(account.isEmpty){@path/groups/new} else {@path/@account.get.userName/_edit}" validate="true">
|
||||||
<div class="row-fluid">
|
<div class="row-fluid">
|
||||||
<div class="span7">
|
<div class="span7">
|
||||||
<fieldset>
|
<fieldset>
|
||||||
|
|||||||
Reference in New Issue
Block a user