blob: 131e7fc029ad552352556d65ee08255b9884c676 (
plain) (
tree)
|
|
package xyz.driver.core.rest.auth
import xyz.driver.core.auth.{Permission, User}
import xyz.driver.core.rest.ServiceRequestContext
import scala.concurrent.{ExecutionContext, Future}
import scalaz.Scalaz.{futureInstance, listInstance}
import scalaz.syntax.semigroup._
import scalaz.syntax.traverse._
class ChainedAuthorization[U <: User](authorizations: Authorization[U]*)(implicit execution: ExecutionContext)
extends Authorization[U] {
override def userHasPermissions(user: U, permissions: Seq[Permission])(
implicit ctx: ServiceRequestContext): Future[AuthorizationResult] = {
def allAuthorized(permissionsMap: Map[Permission, Boolean]): Boolean =
permissions.forall(permissionsMap.getOrElse(_, false))
authorizations.toList.foldLeftM[Future, AuthorizationResult](AuthorizationResult.unauthorized) {
(authResult, authorization) =>
if (allAuthorized(authResult.authorized)) Future.successful(authResult)
else {
authorization.userHasPermissions(user, permissions).map(authResult |+| _)
}
}
}
}
|