diff --git a/src/main/scala/app/BasicAuthenticationFilter.scala b/src/main/scala/app/BasicAuthenticationFilter.scala deleted file mode 100644 index b972c19..0000000 --- a/src/main/scala/app/BasicAuthenticationFilter.scala +++ /dev/null @@ -1,52 +0,0 @@ -package app - -import javax.servlet._ -import javax.servlet.http._ - -/** - * Provides BASIC Authentication for [[app.GitRepositoryServlet]]. - */ -class BasicAuthenticationFilter extends Filter { - - def init(config: FilterConfig) = {} - - def destroy(): Unit = {} - - def doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain): Unit = { - val request = req.asInstanceOf[HttpServletRequest] - val response = res.asInstanceOf[HttpServletResponse] - val session = request.getSession - - try { - session.getAttribute("USER_INFO") match { - case null => request.getHeader("Authorization") match { - case null => requireAuth(response) - case auth => decodeAuthHeader(auth).split(":") match { - // TODO authenticate using registered user info - case Array(username, password) if(username == "gitbucket" && password == "password") => { - session.setAttribute("USER_INFO", "gitbucket") - chain.doFilter(req, res) - } - case _ => requireAuth(response) - } - } - case user => chain.doFilter(req, res) - } - } catch { - case _: Exception => requireAuth(response) - } - } - - private def requireAuth(response: HttpServletResponse): Unit = { - response.setHeader("WWW-Authenticate", "BASIC realm=\"GitBucket\"") - response.sendError(HttpServletResponse.SC_UNAUTHORIZED) - } - - private def decodeAuthHeader(header: String): String = { - try { - new String(new sun.misc.BASE64Decoder().decodeBuffer(header.substring(6))) - } catch { - case _: Throwable => "" - } - } -} \ No newline at end of file diff --git a/src/main/scala/app/ControllerBase.scala b/src/main/scala/app/ControllerBase.scala new file mode 100644 index 0000000..61f4383 --- /dev/null +++ b/src/main/scala/app/ControllerBase.scala @@ -0,0 +1,23 @@ +package app + +import org.scalatra._ +import org.scalatra.json._ +import org.json4s._ +import org.json4s.jackson._ +import jp.sf.amateras.scalatra.forms._ + +/** + * Provides generic features for ScalatraServlet implementations. + */ +abstract class ControllerBase extends ScalatraFilter with ClientSideValidationFormSupport with JacksonJsonSupport { + + implicit val jsonFormats = DefaultFormats + + implicit def context: Context = Context(servletContext.getContextPath) + + // TODO get from session + val LoginUser = System.getProperty("user.name") + +} + +case class Context(path: String) \ No newline at end of file diff --git a/src/main/scala/app/GitRepositoryServlet.scala b/src/main/scala/app/GitRepositoryServlet.scala deleted file mode 100644 index 2294e56..0000000 --- a/src/main/scala/app/GitRepositoryServlet.scala +++ /dev/null @@ -1,39 +0,0 @@ -package app - -import java.io._ -import javax.servlet._ -import javax.servlet.http._ -import util.Directory -import org.eclipse.jgit.api.Git -import org.eclipse.jgit.lib.Ref -import org.eclipse.jgit.http.server.GitServlet -import org.slf4j.LoggerFactory - -/** - * Provides Git repository via HTTP. - * - * This servlet provides only Git repository functionality. - * Authentication is provided by [[app.BasicAuthenticationFilter]]. - */ -class GitRepositoryServlet extends GitServlet { - - private val logger = LoggerFactory.getLogger(classOf[GitRepositoryServlet]) - - // TODO are there any other ways...? - override def init(config: ServletConfig): Unit = { - super.init(new ServletConfig(){ - def getInitParameter(name: String): String = name match { - case "base-path" => Directory.RepositoryHome - case "export-all" => "true" - case name => config.getInitParameter(name) - } - def getInitParameterNames(): java.util.Enumeration[String] = { - config.getInitParameterNames - } - - def getServletContext(): ServletContext = config.getServletContext - def getServletName(): String = config.getServletName - }); - } - -} diff --git a/src/main/scala/app/ServletBase.scala b/src/main/scala/app/ServletBase.scala deleted file mode 100644 index 61f4383..0000000 --- a/src/main/scala/app/ServletBase.scala +++ /dev/null @@ -1,23 +0,0 @@ -package app - -import org.scalatra._ -import org.scalatra.json._ -import org.json4s._ -import org.json4s.jackson._ -import jp.sf.amateras.scalatra.forms._ - -/** - * Provides generic features for ScalatraServlet implementations. - */ -abstract class ControllerBase extends ScalatraFilter with ClientSideValidationFormSupport with JacksonJsonSupport { - - implicit val jsonFormats = DefaultFormats - - implicit def context: Context = Context(servletContext.getContextPath) - - // TODO get from session - val LoginUser = System.getProperty("user.name") - -} - -case class Context(path: String) \ No newline at end of file diff --git a/src/main/scala/util/BasicAuthenticationFilter.scala b/src/main/scala/util/BasicAuthenticationFilter.scala new file mode 100644 index 0000000..c81c221 --- /dev/null +++ b/src/main/scala/util/BasicAuthenticationFilter.scala @@ -0,0 +1,52 @@ +package util + +import javax.servlet._ +import javax.servlet.http._ + +/** + * Provides BASIC Authentication for [[app.GitRepositoryServlet]]. + */ +class BasicAuthenticationFilter extends Filter { + + def init(config: FilterConfig) = {} + + def destroy(): Unit = {} + + def doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain): Unit = { + val request = req.asInstanceOf[HttpServletRequest] + val response = res.asInstanceOf[HttpServletResponse] + val session = request.getSession + + try { + session.getAttribute("USER_INFO") match { + case null => request.getHeader("Authorization") match { + case null => requireAuth(response) + case auth => decodeAuthHeader(auth).split(":") match { + // TODO authenticate using registered user info + case Array(username, password) if(username == "gitbucket" && password == "password") => { + session.setAttribute("USER_INFO", "gitbucket") + chain.doFilter(req, res) + } + case _ => requireAuth(response) + } + } + case user => chain.doFilter(req, res) + } + } catch { + case _: Exception => requireAuth(response) + } + } + + private def requireAuth(response: HttpServletResponse): Unit = { + response.setHeader("WWW-Authenticate", "BASIC realm=\"GitBucket\"") + response.sendError(HttpServletResponse.SC_UNAUTHORIZED) + } + + private def decodeAuthHeader(header: String): String = { + try { + new String(new sun.misc.BASE64Decoder().decodeBuffer(header.substring(6))) + } catch { + case _: Throwable => "" + } + } +} \ No newline at end of file diff --git a/src/main/scala/util/GitRepositoryServlet.scala b/src/main/scala/util/GitRepositoryServlet.scala new file mode 100644 index 0000000..49df1f0 --- /dev/null +++ b/src/main/scala/util/GitRepositoryServlet.scala @@ -0,0 +1,37 @@ +package util + +import java.io._ +import javax.servlet._ +import javax.servlet.http._ +import util.Directory +import org.eclipse.jgit.http.server.GitServlet +import org.slf4j.LoggerFactory + +/** + * Provides Git repository via HTTP. + * + * This servlet provides only Git repository functionality. + * Authentication is provided by [[app.BasicAuthenticationFilter]]. + */ +class GitRepositoryServlet extends GitServlet { + + private val logger = LoggerFactory.getLogger(classOf[GitRepositoryServlet]) + + // TODO are there any other ways...? + override def init(config: ServletConfig): Unit = { + super.init(new ServletConfig(){ + def getInitParameter(name: String): String = name match { + case "base-path" => Directory.RepositoryHome + case "export-all" => "true" + case name => config.getInitParameter(name) + } + def getInitParameterNames(): java.util.Enumeration[String] = { + config.getInitParameterNames + } + + def getServletContext(): ServletContext = config.getServletContext + def getServletName(): String = config.getServletName + }); + } + +} diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 93bc19d..9799689 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -13,7 +13,7 @@ GitRepositoryServlet - app.GitRepositoryServlet + util.GitRepositoryServlet @@ -23,7 +23,7 @@ BasicAuthenticationFilter - app.BasicAuthenticationFilter + util.BasicAuthenticationFilter