From 1ea8a5c1298edae003f5d4d8c4b9e8581d834b04 Mon Sep 17 00:00:00 2001 From: Aleksandr Date: Mon, 12 Mar 2018 17:18:04 +0700 Subject: Implemented extraction of fingerprint header; Added fingerprint hash to ServiceRequestContext and AuthorizedServiceRequestContext classes --- src/main/scala/xyz/driver/core/rest/package.scala | 9 ++++++++- .../scala/xyz/driver/core/rest/serviceRequestContext.scala | 14 ++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/scala/xyz/driver/core/rest/package.scala b/src/main/scala/xyz/driver/core/rest/package.scala index 632091a..3b17167 100644 --- a/src/main/scala/xyz/driver/core/rest/package.scala +++ b/src/main/scala/xyz/driver/core/rest/package.scala @@ -91,12 +91,12 @@ object `package` { "Content-Length", "Accept", "X-Trace", - ContextHeaders.ClientFingerprintHeader, "Access-Control-Allow-Methods", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Server", "Date", + ContextHeaders.ClientFingerprintHeader, ContextHeaders.TrackingIdHeader, ContextHeaders.TraceHeaderName, ContextHeaders.SpanHeaderName, @@ -148,6 +148,7 @@ object `package` { new ServiceRequestContext( extractTrackingId(request), extractOriginatingIP(request, remoteAddress), + extractFingerprintHash(request), extractContextHeaders(request)) def extractTrackingId(request: HttpRequest): String = { @@ -156,6 +157,12 @@ object `package` { .fold(java.util.UUID.randomUUID.toString)(_.value()) } + def extractFingerprintHash(request: HttpRequest): Option[String] = { + request.headers + .find(_.name === ContextHeaders.ClientFingerprintHeader) + .map(_.value()) + } + def extractOriginatingIP(request: HttpRequest, remoteAddress: RemoteAddress): Option[InetAddress] = { request.headers .find(_.name === ContextHeaders.OriginatingIpHeader) diff --git a/src/main/scala/xyz/driver/core/rest/serviceRequestContext.scala b/src/main/scala/xyz/driver/core/rest/serviceRequestContext.scala index 5282956..7206049 100644 --- a/src/main/scala/xyz/driver/core/rest/serviceRequestContext.scala +++ b/src/main/scala/xyz/driver/core/rest/serviceRequestContext.scala @@ -6,11 +6,13 @@ import xyz.driver.core.auth.{AuthToken, PermissionsToken, User} import xyz.driver.core.generators import scalaz.Scalaz.{mapEqual, stringInstance} +import scalaz.Scalaz.optionEqual import scalaz.syntax.equal._ class ServiceRequestContext( val trackingId: String = generators.nextUuid().toString, val originatingIp: Option[InetAddress] = None, + val fingerprintHash: Option[String] = None, val contextHeaders: Map[String, String] = Map.empty[String, String]) { def authToken: Option[AuthToken] = contextHeaders.get(AuthProvider.AuthenticationTokenHeader).map(AuthToken.apply) @@ -22,6 +24,7 @@ class ServiceRequestContext( new ServiceRequestContext( trackingId, originatingIp, + fingerprintHash, contextHeaders.updated(AuthProvider.AuthenticationTokenHeader, authToken.value) ) @@ -29,16 +32,21 @@ class ServiceRequestContext( new AuthorizedServiceRequestContext( trackingId, originatingIp, + fingerprintHash, contextHeaders.updated(AuthProvider.AuthenticationTokenHeader, authToken.value), user ) override def hashCode(): Int = - Seq[Any](trackingId, originatingIp, contextHeaders).foldLeft(31)((result, obj) => 31 * result + obj.hashCode()) + Seq[Any](trackingId, originatingIp, fingerprintHash, contextHeaders) + .foldLeft(31)((result, obj) => 31 * result + obj.hashCode()) override def equals(obj: Any): Boolean = obj match { case ctx: ServiceRequestContext => - trackingId === ctx.trackingId && originatingIp == originatingIp && contextHeaders === ctx.contextHeaders + trackingId === ctx.trackingId && + originatingIp == originatingIp && + fingerprintHash === ctx.fingerprintHash && + contextHeaders === ctx.contextHeaders case _ => false } @@ -48,6 +56,7 @@ class ServiceRequestContext( class AuthorizedServiceRequestContext[U <: User]( override val trackingId: String = generators.nextUuid().toString, override val originatingIp: Option[InetAddress] = None, + override val fingerprintHash: Option[String] = None, override val contextHeaders: Map[String, String] = Map.empty[String, String], val authenticatedUser: U) extends ServiceRequestContext { @@ -56,6 +65,7 @@ class AuthorizedServiceRequestContext[U <: User]( new AuthorizedServiceRequestContext[U]( trackingId, originatingIp, + fingerprintHash, contextHeaders.updated(AuthProvider.PermissionsTokenHeader, permissionsToken.value), authenticatedUser) -- cgit v1.2.3