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 @@ - - -