diff --git a/src/main/scala/app/ControllerBase.scala b/src/main/scala/app/ControllerBase.scala index 6abacc7..2bdc417 100644 --- a/src/main/scala/app/ControllerBase.scala +++ b/src/main/scala/app/ControllerBase.scala @@ -9,6 +9,7 @@ import org.json4s._ import jp.sf.amateras.scalatra.forms._ import org.apache.commons.io.FileUtils +import slick.jdbc.JdbcBackend import model.Account import service.{SystemSettingsService, AccountService} import javax.servlet.http.{HttpServletResponse, HttpServletRequest} @@ -24,6 +25,10 @@ implicit val jsonFormats = DefaultFormats + // Convert to slick session. + implicit def request2Session(implicit request: HttpServletRequest): JdbcBackend#Session = + request.getAttribute(Keys.Request.DBSession).asInstanceOf[JdbcBackend#Session] + // Don't set content type via Accept header. override def format(implicit request: HttpServletRequest) = "" diff --git a/src/main/scala/servlet/BasicAuthenticationFilter.scala b/src/main/scala/servlet/BasicAuthenticationFilter.scala index c335cbc..aab6e21 100644 --- a/src/main/scala/servlet/BasicAuthenticationFilter.scala +++ b/src/main/scala/servlet/BasicAuthenticationFilter.scala @@ -5,6 +5,7 @@ import service.{SystemSettingsService, AccountService, RepositoryService} import model.Account import org.slf4j.LoggerFactory +import slick.jdbc.JdbcBackend import util.Implicits._ import util.ControlUtil._ import util.Keys @@ -23,6 +24,7 @@ def doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain): Unit = { val request = req.asInstanceOf[HttpServletRequest] val response = res.asInstanceOf[HttpServletResponse] + implicit val session = req.getAttribute(Keys.Request.DBSession).asInstanceOf[JdbcBackend#Session] val wrappedResponse = new HttpServletResponseWrapper(response){ override def setCharacterEncoding(encoding: String) = {} @@ -65,7 +67,8 @@ } } - private def getWritableUser(username: String, password: String, repository: RepositoryService.RepositoryInfo): Option[Account] = + private def getWritableUser(username: String, password: String, repository: RepositoryService.RepositoryInfo) + (implicit session: JdbcBackend#Session): Option[Account] = authenticate(loadSystemSettings(), username, password) match { case x @ Some(account) if(hasWritePermission(repository.owner, repository.name, x)) => x case _ => None diff --git a/src/main/scala/servlet/TransactionFilter.scala b/src/main/scala/servlet/TransactionFilter.scala index 12363ad..3cd74c8 100644 --- a/src/main/scala/servlet/TransactionFilter.scala +++ b/src/main/scala/servlet/TransactionFilter.scala @@ -3,6 +3,7 @@ import javax.servlet._ import org.slf4j.LoggerFactory import javax.servlet.http.HttpServletRequest +import util.Keys /** * Controls the transaction with the open session in view pattern. @@ -20,8 +21,9 @@ // assets don't need transaction chain.doFilter(req, res) } else { - Database(req.getServletContext) withTransaction { + Database(req.getServletContext) withTransaction { session => logger.debug("begin transaction") + req.setAttribute(Keys.Request.DBSession, session) chain.doFilter(req, res) logger.debug("end transaction") } @@ -31,8 +33,8 @@ } object Database { - def apply(context: ServletContext): scala.slick.session.Database = - scala.slick.session.Database.forURL(context.getInitParameter("db.url"), + def apply(context: ServletContext): slick.jdbc.JdbcBackend.Database = + slick.jdbc.JdbcBackend.Database.forURL(context.getInitParameter("db.url"), context.getInitParameter("db.user"), context.getInitParameter("db.password")) } diff --git a/src/main/scala/util/Keys.scala b/src/main/scala/util/Keys.scala index 920dfca..a934058 100644 --- a/src/main/scala/util/Keys.scala +++ b/src/main/scala/util/Keys.scala @@ -62,6 +62,11 @@ object Request { /** + * Request key for the Slick Session. + */ + val DBSession = "DB_SESSION" + + /** * Request key for the Ajax request flag. */ val Ajax = "AJAX"