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