app/controllers/BaseFaciaController.scala (114 lines of code) (raw):
package controllers
import java.util.Locale
import com.gu.pandomainauth.action.{AuthActions, UserRequest}
import com.gu.pandomainauth.model.AuthenticatedUser
import com.gu.pandomainauth.{
PanDomain,
PanDomainAuthSettingsRefresher,
S3BucketLoader
}
import com.gu.permissions.{PermissionsConfig, PermissionsProvider}
import conf.ApplicationConfiguration
import logging.Logging
import permissions._
import play.api.ApplicationLoader.Context
import play.api.libs.ws.WSClient
import play.api.libs.ws.ahc.AhcWSComponents
import play.api.mvc._
import play.api.BuiltInComponentsFromContext
import play.filters.cors.CORSComponents
import logging.Logging
import util.Acl
import scala.concurrent.ExecutionContext
abstract class BaseFaciaControllerComponents(context: Context)
extends BuiltInComponentsFromContext(context)
with AhcWSComponents
with AssetsComponents
with CORSComponents
with Logging {
def config: ApplicationConfiguration
lazy val panDomainSettings: PanDomainAuthSettingsRefresher =
PanDomainAuthSettingsRefresher(
domain = config.pandomain.domain,
system = config.pandomain.service,
S3BucketLoader.forAwsSdkV1(
config.aws.s3Client,
"pan-domain-auth-settings"
)
)
lazy val permissions = PermissionsProvider(
PermissionsConfig(
stage = config.environment.stage.toUpperCase(Locale.UK),
region = config.aws.region,
awsCredentials = config.aws.cmsFrontsAccountCredentials
)
)
}
abstract class BaseFaciaController(deps: BaseFaciaControllerComponents)
extends BaseController
with AuthActions
with Logging {
final override def wsClient: WSClient = deps.wsClient
final override def controllerComponents: ControllerComponents =
deps.controllerComponents
final def config: ApplicationConfiguration = deps.config
override def cacheValidation = true
override def authCallbackUrl: String =
config.pandomain.host + "/oauthCallback"
private val accessPermissionCheck = new AccessEditorialFrontsPermissionCheck(
deps.permissions
)(deps.executionContext)
private val editEditionsPermissionCheck = new EditEditionsPermissionCheck(
deps.permissions
)(deps.executionContext)
final def AccessAuthAction = AuthAction andThen accessPermissionCheck
final def AccessAPIAuthAction = APIAuthAction andThen accessPermissionCheck
final def EditEditionsAuthAction =
APIAuthAction andThen editEditionsPermissionCheck
def getCollectionPermissionFilterByPriority(priority: String, acl: Acl)(
implicit ec: ExecutionContext
): ActionBuilder[UserRequest, AnyContent] = {
val permissionsPriority =
PermissionsPriority.stringToPermissionPriority(priority)
permissionsPriority match {
case Some(EditorialPermission) =>
AccessAuthAction andThen new EditEditorialFrontsPermissionCheck(acl)
case Some(CommercialPermission) =>
AccessAuthAction andThen new LaunchCommercialFrontsPermissionCheck(acl)
case Some(EmailPermission) =>
AccessAuthAction andThen new EditEmailFrontsPermissionCheck(acl)
case Some(EditionsPermission) =>
AccessAuthAction andThen new AccessEditionsPermissionCheck(acl)
case _ => AccessAuthAction
}
}
private def userInGroups(authedUser: AuthenticatedUser): Boolean = {
deps.permissions.hasPermission(
Permissions.FrontsAccess,
authedUser.user.email
)
}
override def validateUser(authedUser: AuthenticatedUser): Boolean =
PanDomain.guardianValidation(authedUser) && userInGroups(authedUser)
override lazy val panDomainSettings: PanDomainAuthSettingsRefresher =
deps.panDomainSettings
override def showUnauthedMessage(
message: String
)(implicit request: RequestHeader): Result = {
logger.info(message)
Ok(views.html.auth.login(Some(message)))
}
override def invalidUserMessage(claimedAuth: AuthenticatedUser): String = {
if (
(claimedAuth.user.emailDomain == "guardian.co.uk") && !claimedAuth.multiFactor
)
s"${claimedAuth.user.email} is not valid for use with the Fronts Tool. You need to have two factor authentication enabled and be granted permission." +
s" Please contact Central Production by emailing central.production@theguardian.com and request access to The Fronts Tool."
else if (!userInGroups(claimedAuth))
s"${claimedAuth.user.email} does not have permission to access the Fronts tool. Please contact Central Production by emailing core.central.production@guardian.co.uk"
else
s"${claimedAuth.user.email} is not valid for use with the Fronts Tool. You need to use your Guardian Google account to login. Please sign in with your Guardian Google account first, then retry logging in."
}
val telemetryUrl =
s"https://user-telemetry.${config.environment.correspondingToolsDomainSuffix}/guardian-tool-accessed?app=facia-tool&stage=${config.environment.stage.toUpperCase()}"
}