Newer
Older
gitbucket_jkp / src / main / scala / util / Authenticator.scala
package util

import app.ControllerBase
import service._

/**
 * Allows only the repository owner and administrators.
 */
trait OwnerOnlyAuthenticator { self: ControllerBase =>

  protected def ownerOnly(action: => Any) = {
    {
      context.loginAccount match {
        case Some(x) if(x.userType == AccountService.Administrator) => action
        case Some(x) if(request.getRequestURI.split("/")(1) == x.userName) => action
        case _ => redirect("/signin")
      }
    }
  }

  protected def ownerOnly[T](action: T => Any) = {
    (form: T) => {
      context.loginAccount match {
        case Some(x) if(x.userType == AccountService.Administrator) => action(form)
        case Some(x) if(request.getRequestURI.split("/")(1) == x.userName) => action(form)
        case _ => redirect("/signin")
      }
    }
  }
}

/**
 * Allows only signed in users.
 */
trait UsersOnlyAuthenticator { self: ControllerBase =>

  protected def usersOnly(action: => Any) = {
    {
      context.loginAccount match {
        case Some(x) => action
        case None    => redirect("/signin")
      }
    }
  }

  protected def usersOnly[T](action: T => Any) = {
    (form: T) => {
      context.loginAccount match {
        case Some(x) => action(form)
        case None    => redirect("/signin")
      }
    }
  }
}

/**
 * Allows only collaborators and administrators.
 */
trait CollaboratorsOnlyAuthenticator { self: ControllerBase with RepositoryService =>

  protected def collaboratorsOnly(action: => Any) = {
    {
      context.loginAccount match {
        case Some(x) if(x.userType == AccountService.Administrator) => action
        case Some(x) if(request.getRequestURI.split("/")(1) == x.userName) => action
        case Some(x) => {
          val paths = request.getRequestURI.split("/")
          if(getCollaborators(paths(1), paths(2)).contains(x.userName)){
            action
          } else {
            redirect("/signin")
          }
        }
        case None => redirect("/signin")
      }
    }
  }

  protected def collaboratorsOnly[T](action: T => Any) = {
    (form: T) => {
      context.loginAccount match {
        case Some(x) if(x.userType == AccountService.Administrator) => action(form)
        case Some(x) if(request.getRequestURI.split("/")(1) == x.userName) => action(form)
        case Some(x) => {
          val paths = request.getRequestURI.split("/")
          if(getCollaborators(paths(1), paths(2)).contains(x.userName)){
            action(form)
          } else {
            redirect("/signin")
          }
        }
        case None => redirect("/signin")
      }
    }
  }
}