app/util/Acl.scala (121 lines of code) (raw):

package util import com.gu.permissions.{PermissionDefinition, PermissionsProvider} import logging.Logging import permissions._ import play.api.libs.json.{JsBoolean, JsValue, Json, OWrites, Writes} import switchboard.SwitchManager object Authorization { implicit val authorizationWrites: Writes[Authorization] = new Writes[Authorization] { def writes(access: Authorization): JsValue = access match { case AccessGranted => JsBoolean(true) case AccessDenied => JsBoolean(false) } } } sealed trait Authorization object AccessGranted extends Authorization object AccessDenied extends Authorization object AclJson { implicit val jsonWrites: OWrites[AclJson] = Json.writes[AclJson] } case class AclJson( fronts: Map[String, Authorization], editions: Map[String, Authorization], permissions: Map[String, Authorization] ) class Acl(permissions: PermissionsProvider) extends Logging { def testUser(permission: PermissionDefinition, switch: String)( email: String ): Authorization = { permissions.hasPermission(permission, email) match { case _ if SwitchManager.getStatus(switch) => AccessGranted case true => AccessGranted case false => AccessDenied } } def testUserAndCollections( restrictedCollections: Set[String], permission: PermissionDefinition, switch: String )(email: String, collectionIds: Set[String]): Authorization = { if ((restrictedCollections intersect collectionIds).nonEmpty) testUser(permission, switch)(email) else AccessGranted } def testUserGroupsAndCollections( editorialPermission: PermissionDefinition, commercialPermission: PermissionDefinition, trainingPermission: PermissionDefinition, emailPermission: PermissionDefinition, editorialSwitch: String )(email: String, priorities: Set[PermissionsPriority]): Authorization = { val hasCommercialPermissions = testUser( commercialPermission, "facia-tool-allow-launch-commercial-fronts-for-all" )(email) val hasEditorialPermissions = testUser(editorialPermission, editorialSwitch)(email) val hasTrainingPermissions = testUser(trainingPermission, "facia-tool-permissions-access")(email) val hasEmailPermissions = testUser(emailPermission, "facia-tool-email-access")(email) PermissionsChecker.check( hasCommercialPermissions, hasEditorialPermissions, hasTrainingPermissions, hasEmailPermissions, priorities ) match { case AccessGranted => AccessGranted case AccessDenied => { logger.warn( s"User with e-mail ${email} and with the following permissions commercial: $hasCommercialPermissions, " + s"editorial: $hasEditorialPermissions and training: $hasTrainingPermissions is not authorized to modify " + s"collection with priorities " + s"$priorities" ) AccessDenied } } } } object PermissionsChecker { def check( hasCommercialPermissions: Authorization, hasEditorialPermissions: Authorization, hasTrainingPermissions: Authorization, hasEmailPermissions: Authorization, priorities: Set[PermissionsPriority] ): Authorization = { val trainingPermissionIsValid = priorities.contains(TrainingPermission) val editorialPermissionIsValid = priorities.contains( EditorialPermission ) || priorities.contains(EmailPermission) val commercialPermissionIsValid = priorities.contains(CommercialPermission) val emailPermissionIsValid = priorities.contains(EmailPermission) if (trainingPermissionIsValid) hasTrainingPermissions else { if (editorialPermissionIsValid && commercialPermissionIsValid) { if ( List(hasCommercialPermissions, hasEditorialPermissions).contains( AccessGranted ) ) { AccessGranted } else AccessDenied } else if (commercialPermissionIsValid) { hasCommercialPermissions } else if (editorialPermissionIsValid) hasEditorialPermissions else if (emailPermissionIsValid) { hasEmailPermissions } else AccessDenied } } }