From 4661dc3124ee378aa3a62e9f94ace1311dc6e050 Mon Sep 17 00:00:00 2001 From: KOUNOIKE Date: Sun, 20 Jan 2019 02:26:39 +0900 Subject: [PATCH] lock repository when git access --- .../servlet/GitAuthenticationFilter.scala | 1 + .../core/servlet/GitRepositoryServlet.scala | 19 ++++++++++++++++--- src/main/scala/gitbucket/core/util/Keys.scala | 5 +++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/main/scala/gitbucket/core/servlet/GitAuthenticationFilter.scala b/src/main/scala/gitbucket/core/servlet/GitAuthenticationFilter.scala index f542230db..71d8144a4 100644 --- a/src/main/scala/gitbucket/core/servlet/GitAuthenticationFilter.scala +++ b/src/main/scala/gitbucket/core/servlet/GitAuthenticationFilter.scala @@ -106,6 +106,7 @@ class GitAuthenticationFilter extends Filter with RepositoryService with Account if (isUpdating) { if (hasDeveloperRole(repository.owner, repository.name, Some(account))) { request.setAttribute(Keys.Request.UserName, account.userName) + request.setAttribute(Keys.Request.RepositoryLockKey, s"${repository.owner}/${repository.name}") true } else false } else if (repository.repository.isPrivate) { diff --git a/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala b/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala index de87ee266..2c9e43f48 100644 --- a/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala +++ b/src/main/scala/gitbucket/core/servlet/GitRepositoryServlet.scala @@ -55,11 +55,24 @@ class GitRepositoryServlet extends GitServlet with SystemSettingsService { res.sendRedirect(baseUrl(req) + "/" + paths.dropRight(1).last + "/" + paths.last) } else if (req.getMethod.toUpperCase == "POST" && req.getRequestURI.endsWith("/info/lfs/objects/batch")) { - serviceGitLfsBatchAPI(req, res) - + withLockRepository(req) { + serviceGitLfsBatchAPI(req, res) + } } else { // response for git client - super.service(req, res) + withLockRepository(req) { + super.service(req, res) + } + } + } + + private def withLockRepository[T](req: HttpServletRequest)(f: => T): T = { + if (req.hasAttribute(Keys.Request.RepositoryLockKey)) { + LockUtil.lock(req.getAttribute(Keys.Request.RepositoryLockKey).asInstanceOf[String]) { + f + } + } else { + f } } diff --git a/src/main/scala/gitbucket/core/util/Keys.scala b/src/main/scala/gitbucket/core/util/Keys.scala index cf3135cf9..cf24913bb 100644 --- a/src/main/scala/gitbucket/core/util/Keys.scala +++ b/src/main/scala/gitbucket/core/util/Keys.scala @@ -86,6 +86,11 @@ object Keys { */ val UserName = "USER_NAME" + /** + * Request key for the Lock key which is used during Git repository write access. + */ + val RepositoryLockKey = "REPOSITORY_LOCK_KEY" + /** * Generate request key for the request cache. */