in backend/app/utils/auth/providers/PanDomainUserProvider.scala [28:69]
override def clientConfig: Map[String, JsValue] = Map(
"loginUrl" -> JsString(config.loginUrl)
)
override def authenticate(request: Request[AnyContent], time: Epoch): Attempt[PartialUser] = {
def validateUser(user: AuthenticatedUser): Boolean = {
val passesMultifactor = if (config.require2FA) user.multiFactor else true
val dbUser = users.getUser(user.user.email.toLowerCase()).awaitEither(10.seconds)
dbUser.isRight && passesMultifactor
}
val maybeCookie = request.cookies.get(config.cookieName)
maybeCookie match {
case Some(cookieData) =>
val status = PanDomain.authStatus(cookieData.value, verificationProvider(), validateUser, 0L, "giant", false, false)
status match {
case Authenticated(authedUser) =>
val downcasedAuthedUser = authedUser.copy(user = authedUser.user.copy(email = authedUser.user.email.toLowerCase()))
for {
user <- users.getUser(downcasedAuthedUser.user.email)
displayName = s"${downcasedAuthedUser.user.firstName} ${downcasedAuthedUser.user.lastName}"
_ <- if (user.registered)
Attempt.Right(user)
else {
users.registerUser(user.username, displayName, None, None)
}
} yield {
metricsService.recordUsageEvent(user.username)
PartialUser(user.username, user.displayName.getOrElse(displayName))
}
case NotAuthorized(authedUser) => Attempt.Left(PanDomainCookieInvalid(s"User ${authedUser.user.email} is not authorised to use this system.", reportAsFailure = true))
case InvalidCookie(integrityFailure) => Attempt.Left(PanDomainCookieInvalid(s"Pan domain cookie invalid: $integrityFailure", reportAsFailure = true))
case Expired(authedUser) => Attempt.Left(PanDomainCookieInvalid(s"User ${authedUser.user.email} panda cookie has expired.", reportAsFailure = false))
case other =>
logger.warn(s"Pan domain auth failure: $other")
Attempt.Left(AuthenticationFailure(s"Pan domain auth failed: $other", reportAsFailure = true))
}
case None => Attempt.Left(PanDomainCookieInvalid(s"No pan domain cookie available in request with name ${config.cookieName}", reportAsFailure = false))
}
}