diff --git a/src/main/scala/app/BasicAuthenticationFilter.scala b/src/main/scala/app/BasicAuthenticationFilter.scala new file mode 100644 index 0000000..0b8952c --- /dev/null +++ b/src/main/scala/app/BasicAuthenticationFilter.scala @@ -0,0 +1,52 @@ +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 _ => "" + } + } +} \ No newline at end of file diff --git a/src/main/scala/app/GitRepositoryServlet.scala b/src/main/scala/app/GitRepositoryServlet.scala new file mode 100644 index 0000000..0d704db --- /dev/null +++ b/src/main/scala/app/GitRepositoryServlet.scala @@ -0,0 +1,34 @@ +package app + +import javax.servlet.ServletConfig +import javax.servlet.ServletException +import org.eclipse.jgit.http.server.GitServlet +import javax.servlet.ServletContext +import util.Directory +import java.io.File + +/** + * Provides Git repository via HTTP. + * + * This servlet provides only Git repository functionality. + * Authentication is provided by [[app.BasicAuthenticationFilter]]. + */ +class GitRepositoryServlet extends GitServlet { + + 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 + }); + } + +} \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 01839e7..5ee959c 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -14,21 +14,23 @@ - GitServlet - org.eclipse.jgit.http.server.GitServlet - - base-path - C:/Users/takezoe/gitbucket/repositories - - - export-all - true - + GitRepositoryServlet + app.GitRepositoryServlet - GitServlet + GitRepositoryServlet /git/* + + BasicAuthenticationFilter + app.BasicAuthenticationFilter + + + + BasicAuthenticationFilter + /git/* + + \ No newline at end of file