Merge branch 'master' into improve-pullreq-comments

This commit is contained in:
Naoki Takezoe
2018-04-25 11:40:45 +09:00
5 changed files with 70 additions and 90 deletions

View File

@@ -1,4 +1,4 @@
GitBucket [![Gitter chat](https://badges.gitter.im/gitbucket/gitbucket.svg)](https://gitter.im/gitbucket/gitbucket) [![Build Status](https://travis-ci.org/gitbucket/gitbucket.svg?branch=master)](https://travis-ci.org/gitbucket/gitbucket)
GitBucket [![Gitter chat](https://badges.gitter.im/gitbucket/gitbucket.svg)](https://gitter.im/gitbucket/gitbucket) [![Build Status](https://travis-ci.org/gitbucket/gitbucket.svg?branch=master)](https://travis-ci.org/gitbucket/gitbucket) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.gitbucket/gitbucket_2.12/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.github.gitbucket/gitbucket_2.12)
=========
GitBucket is a Git web platform powered by Scala offering:

View File

@@ -1,6 +1,6 @@
scalacOptions ++= Seq("-unchecked", "-deprecation", "-feature")
addSbtPlugin("com.geirsson" % "sbt-scalafmt" % "1.4.0")
addSbtPlugin("com.geirsson" % "sbt-scalafmt" % "1.5.0")
addSbtPlugin("com.typesafe.sbt" % "sbt-twirl" % "1.3.13")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.5")
//addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "4.0.0")

View File

@@ -15,14 +15,10 @@ trait OneselfAuthenticator { self: ControllerBase =>
protected def oneselfOnly[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 (x.isAdmin) => action
case Some(x) if (paths(0) == x.userName) => action
case _ => Unauthorized()
}
}
context.loginAccount match {
case Some(x) if (x.isAdmin) => action
case Some(x) if (request.paths(0) == x.userName) => action
case _ => Unauthorized()
}
}
}
@@ -35,24 +31,22 @@ trait OwnerAuthenticator { self: ControllerBase with RepositoryService with Acco
protected def ownerOnly[T](action: (T, RepositoryInfo) => Any) = (form: T) => { authenticate(action(form, _)) }
private def authenticate(action: (RepositoryInfo) => Any) = {
{
defining(request.paths) { paths =>
getRepository(paths(0), paths(1)).map { repository =>
context.loginAccount match {
case Some(x) if (x.isAdmin) => action(repository)
case Some(x) if (repository.owner == x.userName) => action(repository)
// TODO Repository management is allowed for only group managers?
case Some(x) if (getGroupMembers(repository.owner).exists { m =>
m.userName == x.userName && m.isManager == true
}) =>
action(repository)
case Some(x) if (getCollaboratorUserNames(paths(0), paths(1), Seq(Role.ADMIN)).contains(x.userName)) =>
action(repository)
case _ => Unauthorized()
}
} getOrElse NotFound()
val userName = params("owner")
val repoName = params("repository")
getRepository(userName, repoName).map { repository =>
context.loginAccount match {
case Some(x) if (x.isAdmin) => action(repository)
case Some(x) if (repository.owner == x.userName) => action(repository)
// TODO Repository management is allowed for only group managers?
case Some(x) if (getGroupMembers(repository.owner).exists { m =>
m.userName == x.userName && m.isManager == true
}) =>
action(repository)
case Some(x) if (getCollaboratorUserNames(userName, repoName, Seq(Role.ADMIN)).contains(x.userName)) =>
action(repository)
case _ => Unauthorized()
}
}
} getOrElse NotFound()
}
}
@@ -64,11 +58,9 @@ trait UsersAuthenticator { self: ControllerBase =>
protected def usersOnly[T](action: T => Any) = (form: T) => { authenticate(action(form)) }
private def authenticate(action: => Any) = {
{
context.loginAccount match {
case Some(x) => action
case None => Unauthorized()
}
context.loginAccount match {
case Some(x) => action
case None => Unauthorized()
}
}
}
@@ -81,11 +73,9 @@ trait AdminAuthenticator { self: ControllerBase =>
protected def adminOnly[T](action: T => Any) = (form: T) => { authenticate(action(form)) }
private def authenticate(action: => Any) = {
{
context.loginAccount match {
case Some(x) if (x.isAdmin) => action
case _ => Unauthorized()
}
context.loginAccount match {
case Some(x) if (x.isAdmin) => action
case _ => Unauthorized()
}
}
}
@@ -98,17 +88,15 @@ trait ReferrerAuthenticator { self: ControllerBase with RepositoryService with A
protected def referrersOnly[T](action: (T, RepositoryInfo) => Any) = (form: T) => { authenticate(action(form, _)) }
private def authenticate(action: (RepositoryInfo) => Any) = {
{
defining(request.paths) { paths =>
getRepository(paths(0), paths(1)).map { repository =>
if (isReadable(repository.repository, context.loginAccount)) {
action(repository)
} else {
Unauthorized()
}
} getOrElse NotFound()
val userName = params("owner")
val repoName = params("repository")
getRepository(userName, repoName).map { repository =>
if (isReadable(repository.repository, context.loginAccount)) {
action(repository)
} else {
Unauthorized()
}
}
} getOrElse NotFound()
}
}
@@ -122,20 +110,18 @@ trait ReadableUsersAuthenticator { self: ControllerBase with RepositoryService w
}
private def authenticate(action: (RepositoryInfo) => Any) = {
{
defining(request.paths) { paths =>
getRepository(paths(0), paths(1)).map { repository =>
context.loginAccount match {
case Some(x) if (x.isAdmin) => action(repository)
case Some(x) if (!repository.repository.isPrivate) => action(repository)
case Some(x) if (paths(0) == x.userName) => action(repository)
case Some(x) if (getGroupMembers(repository.owner).exists(_.userName == x.userName)) => action(repository)
case Some(x) if (getCollaboratorUserNames(paths(0), paths(1)).contains(x.userName)) => action(repository)
case _ => Unauthorized()
}
} getOrElse NotFound()
val userName = params("owner")
val repoName = params("repository")
getRepository(userName, repoName).map { repository =>
context.loginAccount match {
case Some(x) if (x.isAdmin) => action(repository)
case Some(x) if (!repository.repository.isPrivate) => action(repository)
case Some(x) if (userName == x.userName) => action(repository)
case Some(x) if (getGroupMembers(repository.owner).exists(_.userName == x.userName)) => action(repository)
case Some(x) if (getCollaboratorUserNames(userName, repoName).contains(x.userName)) => action(repository)
case _ => Unauthorized()
}
}
} getOrElse NotFound()
}
}
@@ -149,22 +135,20 @@ trait WritableUsersAuthenticator { self: ControllerBase with RepositoryService w
}
private def authenticate(action: (RepositoryInfo) => Any) = {
{
defining(request.paths) { paths =>
getRepository(paths(0), paths(1)).map { repository =>
context.loginAccount match {
case Some(x) if (x.isAdmin) => action(repository)
case Some(x) if (paths(0) == x.userName) => action(repository)
case Some(x) if (getGroupMembers(repository.owner).exists(_.userName == x.userName)) => action(repository)
case Some(x)
if (getCollaboratorUserNames(paths(0), paths(1), Seq(Role.ADMIN, Role.DEVELOPER))
.contains(x.userName)) =>
action(repository)
case _ => Unauthorized()
}
} getOrElse NotFound()
val userName = params("owner")
val repoName = params("repository")
getRepository(userName, repoName).map { repository =>
context.loginAccount match {
case Some(x) if (x.isAdmin) => action(repository)
case Some(x) if (userName == x.userName) => action(repository)
case Some(x) if (getGroupMembers(repository.owner).exists(_.userName == x.userName)) => action(repository)
case Some(x)
if (getCollaboratorUserNames(userName, repoName, Seq(Role.ADMIN, Role.DEVELOPER))
.contains(x.userName)) =>
action(repository)
case _ => Unauthorized()
}
}
} getOrElse NotFound()
}
}
@@ -176,16 +160,12 @@ trait GroupManagerAuthenticator { self: ControllerBase with AccountService =>
protected def managersOnly[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)).exists { member =>
member.userName == x.userName && member.isManager
}) =>
action
case _ => Unauthorized()
}
}
context.loginAccount match {
case Some(x) if (getGroupMembers(request.paths(0)).exists { member =>
member.userName == x.userName && member.isManager
}) =>
action
case _ => Unauthorized()
}
}
}

View File

@@ -103,8 +103,8 @@
} else {
@if(diff.newContent != None || diff.oldContent != None){
<div id="diffText-@i" class="diffText"></div>
<textarea id="newText-@i" style="display: none;" data-file-name="@diff.oldPath">@diff.newContent.getOrElse("")</textarea>
<textarea id="oldText-@i" style="display: none;" data-file-name="@diff.newPath">@diff.oldContent.getOrElse("")</textarea>
<textarea id="newText-@i" style="display: none;" data-file-name="@diff.oldPath" data-val='@diff.newContent.getOrElse("")'></textarea>
<textarea id="oldText-@i" style="display: none;" data-file-name="@diff.newPath" data-val='@diff.oldContent.getOrElse("")'></textarea>
} else {
@if(diff.newIsImage || diff.oldIsImage){
<div class="diff-image-render diff2up">

View File

@@ -78,9 +78,9 @@ function displayErrors(data, elem){
function diffUsingJS(oldTextId, newTextId, outputId, viewType, ignoreSpace) {
var old = $('#'+oldTextId), head = $('#'+newTextId);
var render = new JsDiffRender({
oldText: old.val(),
oldText: old.data('val'),
oldTextName: old.data('file-name'),
newText: head.val(),
newText: head.data('val'),
newTextName: head.data('file-name'),
ignoreSpace: ignoreSpace,
contextSize: 4
@@ -116,7 +116,7 @@ function JsDiffRender(params){
return function(ln){
if(dom===null){
var html = prettyPrintOne(
text.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/"/g,'&quot;').replace(/>/g,'&gt;'),
text.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/"/g,'&quot;').replace(/>/g,'&gt;').replace(/^\n/, '\n\n'),
(/\.([^.]*)$/.exec(fileName)||[])[1],
true);
var re = /<li[^>]*id="?L([0-9]+)"?[^>]*>(.*?)<\/li>/gi, h;