in app/controllers/LoginComponents.scala [89:122]
override def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]): Future[Result] = {
def checkPassword(user: EmergencyUser, username: String, password: String): Future[Result] = {
if (password.isBcryptedBounded(user.passwordHash)) {
log.info(s"$username is authorised to change the Emergency switch.")
block(request)
} else {
refuseSwitchChange(s"The password provided by $username is incorrect. User will be refused access to change emergency switch.")
}
}
def refuseSwitchChange(logErrorMsg: String): Future[Result] = {
log.warn(logErrorMsg)
Future.successful {
Unauthorized(
views.html.switches.switchChange(
"Authorisation checks failed, the Emergency switch will not be changed. Contact digitalcms.dev@theguardian.com for more help."
))
}
}
try {
val authHeaderUser = EmergencyActions.getBasicAuthDetails(request.headers)
val userId = authHeaderUser.id
val userOpt = deps.emergencyUserDBService.getUser(userId)
userOpt.map {
case Left(error) => refuseSwitchChange(s"Error with reading $userId from Dynamo: ${error.toString}. User will be refused access to change emergency switch.")
case Right(user) => checkPassword(user, userId, authHeaderUser.password)
}.getOrElse(refuseSwitchChange(s"User $userId not found. User will be refused access to change emergency switch."))
} catch {
case e: EmergencyActionsException =>
refuseSwitchChange(e.getMessage)
}
}