mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-06 21:45:50 +01:00
(refs #35)Fixed.
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
package app
|
package app
|
||||||
|
|
||||||
import service._
|
import service._
|
||||||
import util.{CollaboratorsAuthenticator, ReferrerAuthenticator, JGitUtil}
|
import util.{CollaboratorsAuthenticator, ReferrerAuthenticator, JGitUtil, StringUtil}
|
||||||
import util.Directory._
|
import util.Directory._
|
||||||
import jp.sf.amateras.scalatra.forms._
|
import jp.sf.amateras.scalatra.forms._
|
||||||
|
|
||||||
@@ -16,14 +16,14 @@ trait WikiControllerBase extends ControllerBase {
|
|||||||
case class WikiPageEditForm(pageName: String, content: String, message: Option[String], currentPageName: String)
|
case class WikiPageEditForm(pageName: String, content: String, message: Option[String], currentPageName: String)
|
||||||
|
|
||||||
val newForm = mapping(
|
val newForm = mapping(
|
||||||
"pageName" -> trim(label("Page name" , text(required, maxlength(40), identifier, unique))),
|
"pageName" -> trim(label("Page name" , text(required, maxlength(40), pagename, unique))),
|
||||||
"content" -> trim(label("Content" , text(required))),
|
"content" -> trim(label("Content" , text(required))),
|
||||||
"message" -> trim(label("Message" , optional(text()))),
|
"message" -> trim(label("Message" , optional(text()))),
|
||||||
"currentPageName" -> trim(label("Current page name" , text()))
|
"currentPageName" -> trim(label("Current page name" , text()))
|
||||||
)(WikiPageEditForm.apply)
|
)(WikiPageEditForm.apply)
|
||||||
|
|
||||||
val editForm = mapping(
|
val editForm = mapping(
|
||||||
"pageName" -> trim(label("Page name" , text(required, maxlength(40), identifier))),
|
"pageName" -> trim(label("Page name" , text(required, maxlength(40), pagename))),
|
||||||
"content" -> trim(label("Content" , text(required))),
|
"content" -> trim(label("Content" , text(required))),
|
||||||
"message" -> trim(label("Message" , optional(text()))),
|
"message" -> trim(label("Message" , optional(text()))),
|
||||||
"currentPageName" -> trim(label("Current page name" , text(required)))
|
"currentPageName" -> trim(label("Current page name" , text(required)))
|
||||||
@@ -36,7 +36,7 @@ trait WikiControllerBase extends ControllerBase {
|
|||||||
})
|
})
|
||||||
|
|
||||||
get("/:owner/:repository/wiki/:page")(referrersOnly { repository =>
|
get("/:owner/:repository/wiki/:page")(referrersOnly { repository =>
|
||||||
val pageName = params("page")
|
val pageName = StringUtil.urlDecode(params("page"))
|
||||||
|
|
||||||
getWikiPage(repository.owner, repository.name, pageName).map { page =>
|
getWikiPage(repository.owner, repository.name, pageName).map { page =>
|
||||||
wiki.html.page(pageName, page, repository, hasWritePermission(repository.owner, repository.name, context.loginAccount))
|
wiki.html.page(pageName, page, repository, hasWritePermission(repository.owner, repository.name, context.loginAccount))
|
||||||
@@ -44,7 +44,7 @@ trait WikiControllerBase extends ControllerBase {
|
|||||||
})
|
})
|
||||||
|
|
||||||
get("/:owner/:repository/wiki/:page/_history")(referrersOnly { repository =>
|
get("/:owner/:repository/wiki/:page/_history")(referrersOnly { repository =>
|
||||||
val pageName = params("page")
|
val pageName = StringUtil.urlDecode(params("page"))
|
||||||
|
|
||||||
JGitUtil.withGit(getWikiRepositoryDir(repository.owner, repository.name)){ git =>
|
JGitUtil.withGit(getWikiRepositoryDir(repository.owner, repository.name)){ git =>
|
||||||
JGitUtil.getCommitLog(git, "master", path = pageName + ".md") match {
|
JGitUtil.getCommitLog(git, "master", path = pageName + ".md") match {
|
||||||
@@ -55,7 +55,7 @@ trait WikiControllerBase extends ControllerBase {
|
|||||||
})
|
})
|
||||||
|
|
||||||
get("/:owner/:repository/wiki/:page/_compare/:commitId")(referrersOnly { repository =>
|
get("/:owner/:repository/wiki/:page/_compare/:commitId")(referrersOnly { repository =>
|
||||||
val pageName = params("page")
|
val pageName = StringUtil.urlDecode(params("page"))
|
||||||
val commitId = params("commitId").split("\\.\\.\\.")
|
val commitId = params("commitId").split("\\.\\.\\.")
|
||||||
|
|
||||||
JGitUtil.withGit(getWikiRepositoryDir(repository.owner, repository.name)){ git =>
|
JGitUtil.withGit(getWikiRepositoryDir(repository.owner, repository.name)){ git =>
|
||||||
@@ -72,7 +72,7 @@ trait WikiControllerBase extends ControllerBase {
|
|||||||
})
|
})
|
||||||
|
|
||||||
get("/:owner/:repository/wiki/:page/_edit")(collaboratorsOnly { repository =>
|
get("/:owner/:repository/wiki/:page/_edit")(collaboratorsOnly { repository =>
|
||||||
val pageName = params("page")
|
val pageName = StringUtil.urlDecode(params("page"))
|
||||||
wiki.html.edit(pageName, getWikiPage(repository.owner, repository.name, pageName), repository)
|
wiki.html.edit(pageName, getWikiPage(repository.owner, repository.name, pageName), repository)
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -85,7 +85,7 @@ trait WikiControllerBase extends ControllerBase {
|
|||||||
updateLastActivityDate(repository.owner, repository.name)
|
updateLastActivityDate(repository.owner, repository.name)
|
||||||
recordEditWikiPageActivity(repository.owner, repository.name, loginAccount.userName, form.pageName)
|
recordEditWikiPageActivity(repository.owner, repository.name, loginAccount.userName, form.pageName)
|
||||||
|
|
||||||
redirect(s"/${repository.owner}/${repository.name}/wiki/${form.pageName}")
|
redirect(s"/${repository.owner}/${repository.name}/wiki/${StringUtil.urlEncode(form.pageName)}")
|
||||||
})
|
})
|
||||||
|
|
||||||
get("/:owner/:repository/wiki/_new")(collaboratorsOnly {
|
get("/:owner/:repository/wiki/_new")(collaboratorsOnly {
|
||||||
@@ -101,11 +101,11 @@ trait WikiControllerBase extends ControllerBase {
|
|||||||
updateLastActivityDate(repository.owner, repository.name)
|
updateLastActivityDate(repository.owner, repository.name)
|
||||||
recordCreateWikiPageActivity(repository.owner, repository.name, loginAccount.userName, form.pageName)
|
recordCreateWikiPageActivity(repository.owner, repository.name, loginAccount.userName, form.pageName)
|
||||||
|
|
||||||
redirect(s"/${repository.owner}/${repository.name}/wiki/${form.pageName}")
|
redirect(s"/${repository.owner}/${repository.name}/wiki/${StringUtil.urlEncode(form.pageName)}")
|
||||||
})
|
})
|
||||||
|
|
||||||
get("/:owner/:repository/wiki/:page/_delete")(collaboratorsOnly { repository =>
|
get("/:owner/:repository/wiki/:page/_delete")(collaboratorsOnly { repository =>
|
||||||
val pageName = params("page")
|
val pageName = StringUtil.urlDecode(params("page"))
|
||||||
|
|
||||||
deleteWikiPage(repository.owner, repository.name, pageName, context.loginAccount.get.userName, s"Delete ${pageName}")
|
deleteWikiPage(repository.owner, repository.name, pageName, context.loginAccount.get.userName, s"Delete ${pageName}")
|
||||||
updateLastActivityDate(repository.owner, repository.name)
|
updateLastActivityDate(repository.owner, repository.name)
|
||||||
@@ -139,4 +139,16 @@ trait WikiControllerBase extends ControllerBase {
|
|||||||
getWikiPageList(params("owner"), params("repository")).find(_ == value).map(_ => "Page already exists.")
|
getWikiPageList(params("owner"), params("repository")).find(_ == value).map(_ => "Page already exists.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private def pagename: Constraint = new Constraint(){
|
||||||
|
def validate(name: String, value: String): Option[String] =
|
||||||
|
if(value.exists("\\/:*?\"<>|".contains(_))){
|
||||||
|
Some(s"${name} contains invalid character.")
|
||||||
|
} else if(value.startsWith("_") || value.startsWith("-")){
|
||||||
|
Some(s"${name} starts with invalid character.")
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
package util
|
package util
|
||||||
|
|
||||||
|
import java.net.{URLDecoder, URLEncoder}
|
||||||
|
|
||||||
object StringUtil {
|
object StringUtil {
|
||||||
|
|
||||||
def sha1(value: String): String = {
|
def sha1(value: String): String = {
|
||||||
@@ -14,4 +16,8 @@ object StringUtil {
|
|||||||
md.digest.map(b => "%02x".format(b)).mkString
|
md.digest.map(b => "%02x".format(b)).mkString
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def urlEncode(value: String): String = URLEncoder.encode(value, "UTF-8")
|
||||||
|
|
||||||
|
def urlDecode(value: String): String = URLDecoder.decode(value, "UTF-8")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,10 @@ object helpers {
|
|||||||
.replaceAll("\\[user:([^\\s]+?)\\]" , s"""<a href="${context.path}/$$1">$$1</a>""")
|
.replaceAll("\\[user:([^\\s]+?)\\]" , s"""<a href="${context.path}/$$1">$$1</a>""")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def urlEncode(value: String): String = StringUtil.urlEncode(value)
|
||||||
|
|
||||||
|
def urlEncode(value: Option[String]): String = value.map(urlEncode).getOrElse("")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates the url to the repository.
|
* Generates the url to the repository.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -14,8 +14,8 @@
|
|||||||
<li class="pull-right">
|
<li class="pull-right">
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
@if(pageName.isDefined){
|
@if(pageName.isDefined){
|
||||||
<a class="btn" href="@url(repository)/wiki/@pageName">View Page</a>
|
<a class="btn" href="@url(repository)/wiki/@urlEncode(pageName)">View Page</a>
|
||||||
<a class="btn" href="@url(repository)/wiki/@pageName/_history">Back to Page History</a>
|
<a class="btn" href="@url(repository)/wiki/@urlEncode(pageName)/_history">Back to Page History</a>
|
||||||
} else {
|
} else {
|
||||||
<a class="btn" href="@url(repository)/wiki/_history">Back to Wiki History</a>
|
<a class="btn" href="@url(repository)/wiki/_history">Back to Wiki History</a>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,9 +13,9 @@
|
|||||||
<li class="pull-right">
|
<li class="pull-right">
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
@if(pageName != ""){
|
@if(pageName != ""){
|
||||||
<a class="btn" href="@url(repository)/wiki/@pageName">View Page</a>
|
<a class="btn" href="@url(repository)/wiki/@urlEncode(pageName)">View Page</a>
|
||||||
<a class="btn" href="@url(repository)/wiki/@pageName/_delete" id="delete">Delete Page</a>
|
<a class="btn" href="@url(repository)/wiki/@urlEncode(pageName)/_delete" id="delete">Delete Page</a>
|
||||||
<a class="btn" href="@url(repository)/wiki/@pageName/_history">Page History</a>
|
<a class="btn" href="@url(repository)/wiki/@urlEncode(pageName)/_history">Page History</a>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@@ -23,9 +23,9 @@
|
|||||||
<a class="btn" href="@url(repository)/wiki/_new">New Page</a>
|
<a class="btn" href="@url(repository)/wiki/_new">New Page</a>
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
<a class="btn" href="@url(repository)/wiki/@pageName">View Page</a>
|
<a class="btn" href="@url(repository)/wiki/@urlEncode(pageName)">View Page</a>
|
||||||
@if(loginAccount.isDefined){
|
@if(loginAccount.isDefined){
|
||||||
<a class="btn" href="@url(repository)/wiki/@pageName/_edit">Edit Page</a>
|
<a class="btn" href="@url(repository)/wiki/@urlEncode(pageName)/_edit">Edit Page</a>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
@@ -58,7 +58,7 @@
|
|||||||
location.href = '@url(repository)/wiki/_compare/' +
|
location.href = '@url(repository)/wiki/_compare/' +
|
||||||
$(e.get(1)).attr('value') + '...' + $(e.get(0)).attr('value');
|
$(e.get(1)).attr('value') + '...' + $(e.get(0)).attr('value');
|
||||||
} else {
|
} else {
|
||||||
location.href = '@url(repository)/wiki/@pageName.get/_compare/' +
|
location.href = '@url(repository)/wiki/@urlEncode(pageName.get)/_compare/' +
|
||||||
$(e.get(1)).attr('value') + '...' + $(e.get(0)).attr('value');
|
$(e.get(1)).attr('value') + '...' + $(e.get(0)).attr('value');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,9 +15,9 @@
|
|||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
@if(hasWritePermission){
|
@if(hasWritePermission){
|
||||||
<a class="btn" href="@url(repository)/wiki/_new">New Page</a>
|
<a class="btn" href="@url(repository)/wiki/_new">New Page</a>
|
||||||
<a class="btn" href="@url(repository)/wiki/@pageName/_edit">Edit Page</a>
|
<a class="btn" href="@url(repository)/wiki/@urlEncode(pageName)/_edit">Edit Page</a>
|
||||||
}
|
}
|
||||||
<a class="btn" href="@url(repository)/wiki/@pageName/_history">Page History</a>
|
<a class="btn" href="@url(repository)/wiki/@urlEncode(pageName)/_history">Page History</a>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -28,6 +28,3 @@
|
|||||||
<span class="muted">Last edited by @page.committer at @datetime(page.time)</span>
|
<span class="muted">Last edited by @page.committer at @datetime(page.time)</span>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<script>
|
|
||||||
$(function(){ prettyPrint(); });
|
|
||||||
</script>
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
</ul>
|
</ul>
|
||||||
<ul>
|
<ul>
|
||||||
@pages.map { page =>
|
@pages.map { page =>
|
||||||
<li><a href="@url(repository)/wiki/@page">@page</a></li>
|
<li><a href="@url(repository)/wiki/@urlEncode(page)">@page</a></li>
|
||||||
}
|
}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user