diff --git a/src/main/scala/app/AccountController.scala b/src/main/scala/app/AccountController.scala index 0b21de4..d8e6362 100644 --- a/src/main/scala/app/AccountController.scala +++ b/src/main/scala/app/AccountController.scala @@ -70,7 +70,7 @@ val userName = params("userName") getAccountByUserName(userName).map { account => updateAccount(account.copy( - password = form.password.map(encrypt).getOrElse(account.password), + password = form.password.map(sha1).getOrElse(account.password), mailAddress = form.mailAddress, url = form.url)) @@ -93,7 +93,7 @@ post("/register", newForm){ form => if(loadSystemSettings().allowAccountRegistration){ - createAccount(form.userName, encrypt(form.password), form.mailAddress, false, form.url) + createAccount(form.userName, sha1(form.password), form.mailAddress, false, form.url) updateImage(form.userName, form.fileId, false) redirect("/signin") } else NotFound diff --git a/src/main/scala/app/ControllerBase.scala b/src/main/scala/app/ControllerBase.scala index 7d88da8..b338f36 100644 --- a/src/main/scala/app/ControllerBase.scala +++ b/src/main/scala/app/ControllerBase.scala @@ -95,7 +95,23 @@ /** * Context object for the current request. */ -case class Context(path: String, loginAccount: Option[Account], currentUrl: String, request: HttpServletRequest) +case class Context(path: String, loginAccount: Option[Account], currentUrl: String, request: HttpServletRequest){ + + /** + * Get object from cache. + * + * If object has not been cached with the specified key then retrieves by given action. + * Cached object are available during a request. + */ + def cache[A](key: String)(action: => A): A = { + Option(request.getAttribute("cache." + key).asInstanceOf[A]).getOrElse { + val newObject = action + request.setAttribute("cache." + key, newObject) + newObject + } + } + +} /** * Base trait for controllers which manages account information. diff --git a/src/main/scala/app/RepositoryViewerController.scala b/src/main/scala/app/RepositoryViewerController.scala index 2d1b6a3..4ba43cb 100644 --- a/src/main/scala/app/RepositoryViewerController.scala +++ b/src/main/scala/app/RepositoryViewerController.scala @@ -213,11 +213,17 @@ if(repository.commitCount == 0){ repo.html.guide(repository) } else { - val revision = if(revstr.isEmpty) repository.repository.defaultBranch else revstr - JGitUtil.withGit(getRepositoryDir(repository.owner, repository.name)){ git => - // get latest commit - val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(revision)) + // get specified commit + val (revCommit, revision) = try { + val revision = if(revstr.isEmpty) repository.repository.defaultBranch else revstr + (JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(revision)), revision) + } catch { + case e: NullPointerException => { + val revision = repository.branchList.head + (JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(revision)), revision) + } + } // get files val files = JGitUtil.getFileList(git, revision, path) // process README.md @@ -225,20 +231,10 @@ new String(JGitUtil.getContent(Git.open(getRepositoryDir(repository.owner, repository.name)), file.id, true).get, "UTF-8") } - repo.html.files( - // current branch - revision, - // repository - repository, - // current path - if(path == ".") Nil else path.split("/").toList, - // latest commit - new JGitUtil.CommitInfo(revCommit), - // file list - files, - // readme - readme - ) + repo.html.files(revision, repository, + if(path == ".") Nil else path.split("/").toList, // current path + new JGitUtil.CommitInfo(revCommit), // latest commit + files, readme) } } } diff --git a/src/main/scala/app/SignInController.scala b/src/main/scala/app/SignInController.scala index 3e00963..becc3b2 100644 --- a/src/main/scala/app/SignInController.scala +++ b/src/main/scala/app/SignInController.scala @@ -25,7 +25,7 @@ post("/signin", form){ form => val account = getAccountByUserName(form.userName) - if(account.isEmpty || account.get.password != encrypt(form.password)){ + if(account.isEmpty || account.get.password != sha1(form.password)){ redirect("/signin") } else { session.setAttribute("LOGIN_ACCOUNT", account.get) diff --git a/src/main/scala/app/UserManagementController.scala b/src/main/scala/app/UserManagementController.scala index d21308a..e5673d4 100644 --- a/src/main/scala/app/UserManagementController.scala +++ b/src/main/scala/app/UserManagementController.scala @@ -47,7 +47,7 @@ }) post("/admin/users/_new", newForm)(adminOnly { form => - createAccount(form.userName, encrypt(form.password), form.mailAddress, form.isAdmin, form.url) + createAccount(form.userName, sha1(form.password), form.mailAddress, form.isAdmin, form.url) updateImage(form.userName, form.fileId, false) redirect("/admin/users") }) @@ -61,7 +61,7 @@ val userName = params("userName") getAccountByUserName(userName).map { account => updateAccount(getAccountByUserName(userName).get.copy( - password = form.password.map(encrypt).getOrElse(account.password), + password = form.password.map(sha1).getOrElse(account.password), mailAddress = form.mailAddress, isAdmin = form.isAdmin, url = form.url)) diff --git a/src/main/scala/servlet/BasicAuthenticationFilter.scala b/src/main/scala/servlet/BasicAuthenticationFilter.scala index 1f6e8f7..a69c237 100644 --- a/src/main/scala/servlet/BasicAuthenticationFilter.scala +++ b/src/main/scala/servlet/BasicAuthenticationFilter.scala @@ -59,7 +59,7 @@ private def isWritableUser(username: String, password: String, repository: RepositoryService.RepositoryInfo): Boolean = { getAccountByUserName(username).map { account => - account.password == encrypt(password) && hasWritePermission(repository.owner, repository.name, Some(account)) + account.password == sha1(password) && hasWritePermission(repository.owner, repository.name, Some(account)) } getOrElse false } diff --git a/src/main/scala/util/Implicits.scala b/src/main/scala/util/Implicits.scala index 92f1d1d..1de9e24 100644 --- a/src/main/scala/util/Implicits.scala +++ b/src/main/scala/util/Implicits.scala @@ -7,8 +7,8 @@ * Provides some usable implicit conversions. */ object Implicits { - - implicit def extendsSeq[A](seq: Seq[A]) = new { + + implicit class RichSeq[A](seq: Seq[A]) { def splitWith(condition: (A, A) => Boolean): Seq[Seq[A]] = split(seq)(condition) @@ -26,7 +26,7 @@ } // TODO Should this implicit conversion move to model.Functions? - implicit def extendsColumn(c1: Column[Boolean]) = new { + implicit class RichColumn(c1: Column[Boolean]){ def &&(c2: => Column[Boolean], guard: => Boolean): Column[Boolean] = if(guard) c1 && c2 else c1 } diff --git a/src/main/scala/util/StringUtil.scala b/src/main/scala/util/StringUtil.scala index bc478c7..9cce293 100644 --- a/src/main/scala/util/StringUtil.scala +++ b/src/main/scala/util/StringUtil.scala @@ -2,7 +2,7 @@ object StringUtil { - def encrypt(value: String): String = { + def sha1(value: String): String = { val md = java.security.MessageDigest.getInstance("SHA-1") md.update(value.getBytes) md.digest.map(b => "%02x".format(b)).mkString diff --git a/src/main/scala/view/helpers.scala b/src/main/scala/view/helpers.scala index fdb3734..b12f644 100644 --- a/src/main/scala/view/helpers.scala +++ b/src/main/scala/view/helpers.scala @@ -75,16 +75,14 @@ // convert commit id to link .replaceAll("(^|\\W)([a-f0-9]{40})(\\W|$)", "$1$2$3").format(context.path, repository.owner, repository.name)) + /** * Returns <img> which displays the avatar icon. * Looks up Gravatar if avatar icon has not been configured in user settings. */ def avatar(userName: String, size: Int, tooltip: Boolean = false)(implicit context: app.Context): Html = { - val account = Option(context.request.getAttribute("cache.account." + userName).asInstanceOf[model.Account]).orElse { - new AccountService {}.getAccountByUserName(userName).map { account => - context.request.setAttribute("cache.account." + userName, account) - account - } + val account = context.cache(s"account.${userName}"){ + new AccountService {}.getAccountByUserName(userName) } val src = account.collect { case account if(account.image.isEmpty) => s"""http://www.gravatar.com/avatar/${StringUtil.md5(account.mailAddress)}?s=${size}""" @@ -92,16 +90,16 @@ s"""${context.path}/${userName}/_avatar""" } if(tooltip){ - Html(s"""""") + Html(s"""""") } else { - Html(s"""""") + Html(s"""""") } } /** * Implicit conversion to add mkHtml() to Seq[Html]. */ - implicit def extendsHtmlSeq(seq: Seq[Html]) = new { + implicit class RichHtmlSeq(seq: Seq[Html]) { def mkHtml(separator: String) = Html(seq.mkString(separator)) def mkHtml(separator: scala.xml.Elem) = Html(seq.mkString(separator.toString)) } diff --git a/src/main/twirl/issues/create.scala.html b/src/main/twirl/issues/create.scala.html index cfa330a..68d8eff 100644 --- a/src/main/twirl/issues/create.scala.html +++ b/src/main/twirl/issues/create.scala.html @@ -11,10 +11,11 @@
-
+
@avatar(loginAccount.get.userName, 48)
+
- +
No one is assigned @if(hasWritePermission){ @@ -42,10 +43,12 @@

- @helper.html.preview(repository, "", false, true, true, "width: 650px; height: 200px;") + @helper.html.preview(repository, "", false, true, true, "width: 600px; height: 200px;")
- +
+ +
@if(hasWritePermission){ diff --git a/src/main/twirl/issues/editcomment.scala.html b/src/main/twirl/issues/editcomment.scala.html index f5b9354..683956a 100644 --- a/src/main/twirl/issues/editcomment.scala.html +++ b/src/main/twirl/issues/editcomment.scala.html @@ -1,7 +1,7 @@ @(content: String, commentId: Int, owner: String, repository: String)(implicit context: app.Context) @import context._ - + Cancel