From 4f11172ee721f7af12f4ff39cfa96a698fc88342 Mon Sep 17 00:00:00 2001 From: Zach Smith Date: Wed, 3 May 2017 18:16:38 -0700 Subject: Override hashCode equals and toString, rename to AuthorizedRequestContext --- src/main/scala/xyz/driver/core/rest.scala | 41 ++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 11 deletions(-) (limited to 'src/main/scala') diff --git a/src/main/scala/xyz/driver/core/rest.scala b/src/main/scala/xyz/driver/core/rest.scala index 4e965aa..bacb120 100644 --- a/src/main/scala/xyz/driver/core/rest.scala +++ b/src/main/scala/xyz/driver/core/rest.scala @@ -100,23 +100,42 @@ package rest { def permissionsToken: Option[PermissionsToken] = contextHeaders.get(AuthProvider.PermissionsTokenHeader).map(PermissionsToken.apply) - def withAuthenticatedUser[U <: User](authToken: AuthToken, user: U): AuthenticatedRequestContext[U] = - new AuthenticatedRequestContext(trackingId, + def withAuthenticatedUser[U <: User](authToken: AuthToken, user: U): AuthorizedRequestContext[U] = + new AuthorizedRequestContext(trackingId, contextHeaders.updated(AuthProvider.AuthenticationTokenHeader, authToken.value), user) + + override def hashCode(): Int = + Seq[Any](trackingId, contextHeaders).foldLeft(31)((result, obj) => 31 * result + obj.hashCode()) + + override def equals(obj: Any): Boolean = obj match { + case ctx: RequestContext => trackingId == ctx.trackingId && contextHeaders == ctx.contextHeaders + case _ => false + } + + override def toString: String = s"RequestContext($trackingId, $contextHeaders)" } - class AuthenticatedRequestContext[U <: User](override val trackingId: String = generators.nextUuid().toString, - override val contextHeaders: Map[String, String] = + class AuthorizedRequestContext[U <: User](override val trackingId: String = generators.nextUuid().toString, + override val contextHeaders: Map[String, String] = Map.empty[String, String], - val authenticatedUser: U) + val authenticatedUser: U) extends RequestContext { - def withPermissionsToken(permissionsToken: PermissionsToken): AuthenticatedRequestContext[U] = - new AuthenticatedRequestContext[U]( + def withPermissionsToken(permissionsToken: PermissionsToken): AuthorizedRequestContext[U] = + new AuthorizedRequestContext[U]( trackingId, contextHeaders.updated(AuthProvider.PermissionsTokenHeader, permissionsToken.value), authenticatedUser) + + override def hashCode(): Int = 31 * super.hashCode() + authenticatedUser.hashCode() + + override def equals(obj: Any): Boolean = obj match { + case ctx: AuthorizedRequestContext[U] => super.equals(ctx) && ctx.authenticatedUser == authenticatedUser + case _ => false + } + + override def toString: String = s"AuthenticatedRequestContext($trackingId, $contextHeaders, $authenticatedUser)" } object ContextHeaders { @@ -135,13 +154,13 @@ package rest { trait Authorization[U <: User] { def userHasPermissions(permissions: Seq[Permission])( - implicit ctx: AuthenticatedRequestContext[U]): OptionT[Future, + implicit ctx: AuthorizedRequestContext[U]): OptionT[Future, (Map[Permission, Boolean], PermissionsToken)] } class AlwaysAllowAuthorization[U <: User] extends Authorization[U] { override def userHasPermissions(permissions: Seq[Permission])( - implicit ctx: AuthenticatedRequestContext[U]): OptionT[Future, + implicit ctx: AuthorizedRequestContext[U]): OptionT[Future, (Map[Permission, Boolean], PermissionsToken)] = OptionT.optionT(Future.successful(Option((permissions.map(_ -> true).toMap, PermissionsToken(""))))) } @@ -165,7 +184,7 @@ package rest { /** * Verifies if request is authenticated and authorized to have `permissions` */ - def authorize(permissions: Permission*): Directive1[AuthenticatedRequestContext[U]] = { + def authorize(permissions: Permission*): Directive1[AuthorizedRequestContext[U]] = { serviceContext flatMap { ctx => onComplete { (for { @@ -194,7 +213,7 @@ package rest { } protected def userHasPermission(user: U, permissions: Seq[Permission])( - ctx: AuthenticatedRequestContext[U]): OptionT[Future, (Boolean, PermissionsToken)] = { + ctx: AuthorizedRequestContext[U]): OptionT[Future, (Boolean, PermissionsToken)] = { import spray.json._ def authorizedByToken: OptionT[Future, (Boolean, PermissionsToken)] = { -- cgit v1.2.3