From ae806b6bcda843bece15de7d19e5804a45f87ba4 Mon Sep 17 00:00:00 2001 From: Nathaniel Fischer Date: Thu, 20 May 2021 15:30:42 -0700 Subject: [PATCH] Use parasitic EC for sync JWT validation (#39) --- jose/src/black/door/jose/jwt/Jwt.scala | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/jose/src/black/door/jose/jwt/Jwt.scala b/jose/src/black/door/jose/jwt/Jwt.scala index fb19228..2f8bc6a 100644 --- a/jose/src/black/door/jose/jwt/Jwt.scala +++ b/jose/src/black/door/jose/jwt/Jwt.scala @@ -8,7 +8,7 @@ import cats.data.{EitherT, OptionT} import cats.implicits._ import java.security.KeyException -import java.util.concurrent.{Executors, TimeUnit} +import java.util.concurrent.TimeUnit import scala.collection.immutable.Seq import scala.concurrent.duration.Duration import scala.concurrent.{Await, ExecutionContext, Future} @@ -67,15 +67,6 @@ object Jwt { OptionT(jwtValidator.orElse(fallbackJwtValidator).apply(jwt)).toLeft(jwt) }.value - private val threadFactory = Executors.defaultThreadFactory() - - private val sadSpasticLittleEc = - ExecutionContext.fromExecutor(Executors.newCachedThreadPool { r => - val t = threadFactory.newThread(r) - t.setDaemon(true) - t - }) - def validate(compact: String) = new UnitValidation(compact) protected class UnitValidation(protected val compact: String) extends TypedValidation[Unit] { @@ -86,6 +77,11 @@ object Jwt { } } + private val sameThreadExecutionContext = new ExecutionContext { + def execute(runnable: Runnable) = runnable.run() + def reportFailure(cause: Throwable) = cause.printStackTrace() + } + sealed trait TypedValidation[C] { protected def compact: String @@ -113,9 +109,9 @@ object Jwt { validate(compact, keyResolver, jwtValidator, fallbackJwtValidator, algorithms)( payloadDeserializer, headerDeserializer, - sadSpasticLittleEc + sameThreadExecutionContext ), - Duration(5, TimeUnit.SECONDS) + Duration(30, TimeUnit.SECONDS) ) def async(implicit ec: ExecutionContext) =