mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-06 21:45:50 +01:00
Fix authentication for git repository.
This commit is contained in:
@@ -2,11 +2,15 @@ package servlet
|
|||||||
|
|
||||||
import javax.servlet._
|
import javax.servlet._
|
||||||
import javax.servlet.http._
|
import javax.servlet.http._
|
||||||
|
import service.{AccountService, RepositoryService}
|
||||||
|
import org.slf4j.LoggerFactory
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides BASIC Authentication for [[app.GitRepositoryServlet]].
|
* Provides BASIC Authentication for [[servlet.GitRepositoryServlet]].
|
||||||
*/
|
*/
|
||||||
class BasicAuthenticationFilter extends Filter {
|
class BasicAuthenticationFilter extends Filter with RepositoryService with AccountService {
|
||||||
|
|
||||||
|
private val logger = LoggerFactory.getLogger(classOf[BasicAuthenticationFilter])
|
||||||
|
|
||||||
def init(config: FilterConfig) = {}
|
def init(config: FilterConfig) = {}
|
||||||
|
|
||||||
@@ -15,25 +19,40 @@ class BasicAuthenticationFilter extends Filter {
|
|||||||
def doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain): Unit = {
|
def doFilter(req: ServletRequest, res: ServletResponse, chain: FilterChain): Unit = {
|
||||||
val request = req.asInstanceOf[HttpServletRequest]
|
val request = req.asInstanceOf[HttpServletRequest]
|
||||||
val response = res.asInstanceOf[HttpServletResponse]
|
val response = res.asInstanceOf[HttpServletResponse]
|
||||||
val session = request.getSession
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
session.getAttribute("USER_INFO") match {
|
request.getHeader("Authorization") match {
|
||||||
case null => request.getHeader("Authorization") match {
|
case null => requireAuth(response)
|
||||||
case null => requireAuth(response)
|
case auth => decodeAuthHeader(auth).split(":") match {
|
||||||
case auth => decodeAuthHeader(auth).split(":") match {
|
case Array(username, password) if(isValidUser(username, password, request)) => {
|
||||||
// TODO authenticate using registered user info
|
request.setAttribute("USER_NAME", username)
|
||||||
case Array(username, password) if(username == "gitbucket" && password == "password") => {
|
chain.doFilter(req, res)
|
||||||
session.setAttribute("USER_INFO", "gitbucket")
|
|
||||||
chain.doFilter(req, res)
|
|
||||||
}
|
|
||||||
case _ => requireAuth(response)
|
|
||||||
}
|
}
|
||||||
|
case _ => requireAuth(response)
|
||||||
}
|
}
|
||||||
case user => chain.doFilter(req, res)
|
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
case _: Exception => requireAuth(response)
|
case ex: Exception => {
|
||||||
|
logger.error("error", ex)
|
||||||
|
requireAuth(response)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO If the repository is public, it must allow users which have readable right.
|
||||||
|
private def isValidUser(username: String, password: String, request: HttpServletRequest): Boolean = {
|
||||||
|
val paths = request.getRequestURI.split("/")
|
||||||
|
getAccountByUserName(username) match {
|
||||||
|
case Some(account) if(account.password == password) => {
|
||||||
|
if(account.userType == AccountService.Administrator // administrator
|
||||||
|
|| account.userName == paths(2) // repository owner
|
||||||
|
|| getCollaborators(paths(2), paths(3).replaceFirst("\\.git$", "")).contains(account.userName)){ // collaborator
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case _ => false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import util.{JGitUtil, Directory}
|
|||||||
* Provides Git repository via HTTP.
|
* Provides Git repository via HTTP.
|
||||||
*
|
*
|
||||||
* This servlet provides only Git repository functionality.
|
* This servlet provides only Git repository functionality.
|
||||||
* Authentication is provided by [[app.BasicAuthenticationFilter]].
|
* Authentication is provided by [[servlet.BasicAuthenticationFilter]].
|
||||||
*/
|
*/
|
||||||
class GitRepositoryServlet extends GitServlet {
|
class GitRepositoryServlet extends GitServlet {
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@ class GitBucketRecievePackFactory extends ReceivePackFactory[HttpServletRequest]
|
|||||||
|
|
||||||
override def create(req: HttpServletRequest, db: Repository): ReceivePack = {
|
override def create(req: HttpServletRequest, db: Repository): ReceivePack = {
|
||||||
val receivePack = new ReceivePack(db)
|
val receivePack = new ReceivePack(db)
|
||||||
val userName = req.getSession.getAttribute("USER_INFO")
|
val userName = req.getAttribute("USER_NAME")
|
||||||
|
|
||||||
logger.debug("requestURI: " + req.getRequestURI)
|
logger.debug("requestURI: " + req.getRequestURI)
|
||||||
logger.debug("userName:" + userName)
|
logger.debug("userName:" + userName)
|
||||||
|
|||||||
Reference in New Issue
Block a user