diff --git a/src/main/scala/gitbucket/core/controller/WikiController.scala b/src/main/scala/gitbucket/core/controller/WikiController.scala index 3587918..07153c1 100644 --- a/src/main/scala/gitbucket/core/controller/WikiController.scala +++ b/src/main/scala/gitbucket/core/controller/WikiController.scala @@ -242,8 +242,8 @@ private def isEditable(repository: RepositoryInfo)(implicit context: Context): Boolean = { repository.repository.options.wikiOption match { - case "ALL" => true // TODO read permission - case "PUBLIC" => true // TODO read permission + case "ALL" => repository.repository.isPrivate == false || hasReadPermission(repository.owner, repository.name, context.loginAccount) + case "PUBLIC" => hasReadPermission(repository.owner, repository.name, context.loginAccount) case "PRIVATE" => hasWritePermission(repository.owner, repository.name, context.loginAccount) case "DISABLE" => false } diff --git a/src/main/scala/gitbucket/core/service/RepositoryService.scala b/src/main/scala/gitbucket/core/service/RepositoryService.scala index 24db2df..96bbe81 100644 --- a/src/main/scala/gitbucket/core/service/RepositoryService.scala +++ b/src/main/scala/gitbucket/core/service/RepositoryService.scala @@ -38,9 +38,9 @@ parentUserName = parentUserName, parentRepositoryName = parentRepositoryName, options = RepositoryOptions( - issuesOption = "PRIVATE", + issuesOption = "PRIVATE", // TODO DISABLE for the forked repository? externalIssuesUrl = None, - wikiOption = "PUBLIC", + wikiOption = "PUBLIC", // TODO DISABLE for the forked repository? externalWikiUrl = None, allowFork = true ) @@ -360,13 +360,15 @@ * If a group is added as a collaborator, this method returns users who are belong to that group. */ def getCollaboratorUserNames(userName: String, repositoryName: String, filter: Seq[Permission] = Nil)(implicit s: Session): List[String] = { - val q1 = Collaborators.filter(_.byRepository(userName, repositoryName)) + val q1 = Collaborators .innerJoin(Accounts).on { case (t1, t2) => (t1.collaboratorName === t2.userName) && (t2.groupAccount === false.bind) } + .filter { case (t1, t2) => t1.byRepository(userName, repositoryName) } .map { case (t1, t2) => t1.collaboratorName } - val q2 = Collaborators.filter(_.byRepository(userName, repositoryName)) + val q2 = Collaborators .innerJoin(Accounts).on { case (t1, t2) => (t1.collaboratorName === t2.userName) && (t2.groupAccount === true.bind) } .innerJoin(GroupMembers).on { case ((t1, t2), t3) => t2.userName === t3.groupName } + .filter { case ((t1, t2), t3) => t1.byRepository(userName, repositoryName) } .map { case ((t1, t2), t3) => t3.userName } q1.union(q2).list.filter { x => filter.isEmpty || filter.exists(_.name == x) } @@ -383,6 +385,16 @@ } } + def hasReadPermission(owner: String, repository: String, loginAccount: Option[Account])(implicit s: Session): Boolean = { + loginAccount match { + case Some(a) if(a.isAdmin) => true + case Some(a) if(a.userName == owner) => true + case Some(a) if(getGroupMembers(owner).exists(_.userName == a.userName)) => true + case Some(a) if(getCollaboratorUserNames(owner, repository, Seq(Permission.ADMIN, Permission.WRITE, Permission.READ)).contains(a.userName)) => true + case _ => false + } + } + private def getForkedCount(userName: String, repositoryName: String)(implicit s: Session): Int = Query(Repositories.filter { t => (t.originUserName === userName.bind) && (t.originRepositoryName === repositoryName.bind) diff --git a/src/main/twirl/gitbucket/core/settings/options.scala.html b/src/main/twirl/gitbucket/core/settings/options.scala.html index 6952a02..580dcd3 100644 --- a/src/main/twirl/gitbucket/core/settings/options.scala.html +++ b/src/main/twirl/gitbucket/core/settings/options.scala.html @@ -39,45 +39,6 @@ - - -
-
Features
-
-
- @* TODO Make radio to choose issues option - - *@ - - -
-
- @* TODO Make radio to choose wiki option - - - *@ - - -
+
+
Issues
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+ + +
+
+
+
+
Wiki
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+ + +
+
+
@@ -100,14 +123,13 @@ $(function(){ updateFeatures(); - $('#enableIssues, #enableWiki').click(function(){ + $('input[name=issuesOption], input[name=wikiOption]').click(function(){ updateFeatures(); }); }); function updateFeatures() { - $('#externalIssuesUrl').prop('disabled', $('#enableIssues').prop('checked')); - $('#allowWikiEditing').prop('disabled', !$('#enableWiki').prop('checked')); - $('#externalWikiUrl').prop('disabled', $('#enableWiki').prop('checked')); + $('#externalIssuesUrl').prop('disabled', !$('input[name=issuesOption]').select('[value=DISABLE]').prop('checked')); + $('#externalWikiUrl').prop('disabled', !$('input[name=wikiOption]').select('[value=DISABLE]').prop('checked')); } diff --git a/src/main/twirl/gitbucket/core/wiki/compare.scala.html b/src/main/twirl/gitbucket/core/wiki/compare.scala.html index 3745cb7..e2fe163 100644 --- a/src/main/twirl/gitbucket/core/wiki/compare.scala.html +++ b/src/main/twirl/gitbucket/core/wiki/compare.scala.html @@ -3,7 +3,7 @@ to: String, diffs: Seq[gitbucket.core.util.JGitUtil.DiffInfo], repository: gitbucket.core.service.RepositoryService.RepositoryInfo, - hasWritePermission: Boolean, + isEditable: Boolean, info: Option[Any])(implicit context: gitbucket.core.controller.Context) @import gitbucket.core.view.helpers @gitbucket.core.html.main(s"Compare Revisions - ${repository.owner}/${repository.name}", Some(repository)){ @@ -27,7 +27,7 @@
@gitbucket.core.helper.html.diff(diffs, repository, None, None, false, None, false, false)
- @if(hasWritePermission){ + @if(isEditable){
@if(pageName.isDefined){ Revert Changes diff --git a/src/main/twirl/gitbucket/core/wiki/page.scala.html b/src/main/twirl/gitbucket/core/wiki/page.scala.html index 6117140..ac201e5 100644 --- a/src/main/twirl/gitbucket/core/wiki/page.scala.html +++ b/src/main/twirl/gitbucket/core/wiki/page.scala.html @@ -2,7 +2,7 @@ page: gitbucket.core.service.WikiService.WikiPageInfo, pages: List[String], repository: gitbucket.core.service.RepositoryService.RepositoryInfo, - hasWritePermission: Boolean, + isEditable: Boolean, sidebar: Option[gitbucket.core.service.WikiService.WikiPageInfo], footer: Option[gitbucket.core.service.WikiService.WikiPageInfo])(implicit context: gitbucket.core.controller.Context) @import gitbucket.core.view.helpers @@ -12,7 +12,7 @@
Page History - @if(hasWritePermission){ + @if(isEditable){ Edit Page New Page } @@ -49,13 +49,13 @@ } @sidebar.map { sidebarPage =>
- @if(hasWritePermission){ + @if(isEditable){ } @helpers.markdown(sidebarPage.content, repository, true, false, false, false, pages)
}.getOrElse{ - @if(hasWritePermission){ + @if(isEditable){
Add a custom sidebar
@@ -88,13 +88,13 @@
@footer.map { footerPage => }.getOrElse{ - @if(hasWritePermission){ + @if(isEditable){
Add a custom footer
diff --git a/src/main/twirl/gitbucket/core/wiki/pages.scala.html b/src/main/twirl/gitbucket/core/wiki/pages.scala.html index cf6fd59..e947f21 100644 --- a/src/main/twirl/gitbucket/core/wiki/pages.scala.html +++ b/src/main/twirl/gitbucket/core/wiki/pages.scala.html @@ -1,6 +1,6 @@ @(pages: List[String], repository: gitbucket.core.service.RepositoryService.RepositoryInfo, - hasWritePermission: Boolean)(implicit context: gitbucket.core.controller.Context) + isEditable: Boolean)(implicit context: gitbucket.core.controller.Context) @import gitbucket.core.view.helpers @gitbucket.core.html.main(s"Pages - ${repository.owner}/${repository.name}", Some(repository)){ @gitbucket.core.html.menu("wiki", repository){ @@ -10,7 +10,7 @@
  • - @if(hasWritePermission){ + @if(isEditable){ New Page }