From 28cafbcad2778b6e740fd60bc708d3daee4cd13a Mon Sep 17 00:00:00 2001 From: takezoe Date: Fri, 12 Jul 2013 02:14:27 +0900 Subject: [PATCH] (refs #35)Fixed. --- src/main/scala/app/WikiController.scala | 32 +++++++++++++++++-------- src/main/scala/util/StringUtil.scala | 6 +++++ src/main/scala/view/helpers.scala | 4 ++++ src/main/twirl/wiki/compare.scala.html | 4 ++-- src/main/twirl/wiki/edit.scala.html | 6 ++--- src/main/twirl/wiki/history.scala.html | 6 ++--- src/main/twirl/wiki/page.scala.html | 7 ++---- src/main/twirl/wiki/pages.scala.html | 2 +- 8 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/main/scala/app/WikiController.scala b/src/main/scala/app/WikiController.scala index d746367d0c..932f9e23a2 100644 --- a/src/main/scala/app/WikiController.scala +++ b/src/main/scala/app/WikiController.scala @@ -1,7 +1,7 @@ package app import service._ -import util.{CollaboratorsAuthenticator, ReferrerAuthenticator, JGitUtil} +import util.{CollaboratorsAuthenticator, ReferrerAuthenticator, JGitUtil, StringUtil} import util.Directory._ 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) 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))), "message" -> trim(label("Message" , optional(text()))), "currentPageName" -> trim(label("Current page name" , text())) )(WikiPageEditForm.apply) 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))), "message" -> trim(label("Message" , optional(text()))), "currentPageName" -> trim(label("Current page name" , text(required))) @@ -36,7 +36,7 @@ trait WikiControllerBase extends ControllerBase { }) 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 => 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 => - val pageName = params("page") + val pageName = StringUtil.urlDecode(params("page")) JGitUtil.withGit(getWikiRepositoryDir(repository.owner, repository.name)){ git => 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 => - val pageName = params("page") + val pageName = StringUtil.urlDecode(params("page")) val commitId = params("commitId").split("\\.\\.\\.") JGitUtil.withGit(getWikiRepositoryDir(repository.owner, repository.name)){ git => @@ -72,7 +72,7 @@ trait WikiControllerBase extends ControllerBase { }) 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) }) @@ -85,7 +85,7 @@ trait WikiControllerBase extends ControllerBase { updateLastActivityDate(repository.owner, repository.name) 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 { @@ -101,11 +101,11 @@ trait WikiControllerBase extends ControllerBase { updateLastActivityDate(repository.owner, repository.name) 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 => - val pageName = params("page") + val pageName = StringUtil.urlDecode(params("page")) deleteWikiPage(repository.owner, repository.name, pageName, context.loginAccount.get.userName, s"Delete ${pageName}") updateLastActivityDate(repository.owner, repository.name) @@ -139,4 +139,16 @@ trait WikiControllerBase extends ControllerBase { 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 + } + } + + } \ No newline at end of file diff --git a/src/main/scala/util/StringUtil.scala b/src/main/scala/util/StringUtil.scala index 9cce293d24..ae6d8688bb 100644 --- a/src/main/scala/util/StringUtil.scala +++ b/src/main/scala/util/StringUtil.scala @@ -1,5 +1,7 @@ package util +import java.net.{URLDecoder, URLEncoder} + object StringUtil { def sha1(value: String): String = { @@ -14,4 +16,8 @@ object StringUtil { 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") + } diff --git a/src/main/scala/view/helpers.scala b/src/main/scala/view/helpers.scala index d80a4d8fcd..74d06bfb37 100644 --- a/src/main/scala/view/helpers.scala +++ b/src/main/scala/view/helpers.scala @@ -44,6 +44,10 @@ object helpers { .replaceAll("\\[user:([^\\s]+?)\\]" , s"""$$1""") ) + def urlEncode(value: String): String = StringUtil.urlEncode(value) + + def urlEncode(value: Option[String]): String = value.map(urlEncode).getOrElse("") + /** * Generates the url to the repository. */ diff --git a/src/main/twirl/wiki/compare.scala.html b/src/main/twirl/wiki/compare.scala.html index 3e41c8c24d..1f4561ded9 100644 --- a/src/main/twirl/wiki/compare.scala.html +++ b/src/main/twirl/wiki/compare.scala.html @@ -14,8 +14,8 @@

Compare Revisions

  • @if(pageName.isDefined){ - View Page - Back to Page History + View Page + Back to Page History } else { Back to Wiki History } diff --git a/src/main/twirl/wiki/edit.scala.html b/src/main/twirl/wiki/edit.scala.html index c3ebc42e04..3da2b6c8b1 100644 --- a/src/main/twirl/wiki/edit.scala.html +++ b/src/main/twirl/wiki/edit.scala.html @@ -13,9 +13,9 @@

    Editing @if(pageName == ""){Ne
  • diff --git a/src/main/twirl/wiki/history.scala.html b/src/main/twirl/wiki/history.scala.html index d40a0c0911..bf0b0b3159 100644 --- a/src/main/twirl/wiki/history.scala.html +++ b/src/main/twirl/wiki/history.scala.html @@ -23,9 +23,9 @@

    New Page } } else { - View Page + View Page @if(loginAccount.isDefined){ - Edit Page + Edit Page } }

    @@ -58,7 +58,7 @@

    location.href = '@url(repository)/wiki/_compare/' + $(e.get(1)).attr('value') + '...' + $(e.get(0)).attr('value'); } 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'); } } diff --git a/src/main/twirl/wiki/page.scala.html b/src/main/twirl/wiki/page.scala.html index cafd9ac0cd..102454dc34 100644 --- a/src/main/twirl/wiki/page.scala.html +++ b/src/main/twirl/wiki/page.scala.html @@ -15,9 +15,9 @@

    @pageName

    @if(hasWritePermission){ New Page - Edit Page + Edit Page } - Page History + Page History
  • @@ -28,6 +28,3 @@

    @pageName

    Last edited by @page.committer at @datetime(page.time) } - diff --git a/src/main/twirl/wiki/pages.scala.html b/src/main/twirl/wiki/pages.scala.html index 1071617869..38a3663ad2 100644 --- a/src/main/twirl/wiki/pages.scala.html +++ b/src/main/twirl/wiki/pages.scala.html @@ -18,7 +18,7 @@

    Pages