play.api.Configuration Scala Examples
The following examples show how to use play.api.Configuration.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
Example 1
Source File: PreferencesFrontendService.scala From pertax-frontend with Apache License 2.0 | 6 votes |
package services import com.kenshoo.play.metrics.Metrics import config.ConfigDecorator import controllers.auth.requests.UserRequest import com.google.inject.{Inject, Singleton} import metrics.HasMetrics import models.{ActivatePaperlessActivatedResponse, ActivatePaperlessNotAllowedResponse, ActivatePaperlessRequiresUserActionResponse, ActivatePaperlessResponse} import play.api.Mode.Mode import play.api.i18n.{I18nSupport, Messages, MessagesApi} import play.api.libs.json.{JsObject, Json} import play.api.{Configuration, Environment, Logger} import uk.gov.hmrc.play.bootstrap.http.DefaultHttpClient import uk.gov.hmrc.crypto.PlainText import uk.gov.hmrc.play.bootstrap.config.ServicesConfig import uk.gov.hmrc.play.bootstrap.filters.frontend.crypto.SessionCookieCrypto import uk.gov.hmrc.play.partials.HeaderCarrierForPartialsConverter import util.Tools import scala.concurrent.{ExecutionContext, Future} @Singleton class PreferencesFrontendService @Inject()( environment: Environment, runModeConfiguration: Configuration, val simpleHttp: DefaultHttpClient, val messagesApi: MessagesApi, val metrics: Metrics, val configDecorator: ConfigDecorator, val sessionCookieCrypto: SessionCookieCrypto, val tools: Tools, servicesConfig: ServicesConfig)(implicit ec: ExecutionContext) extends HeaderCarrierForPartialsConverter with HasMetrics with I18nSupport { val mode: Mode = environment.mode val preferencesFrontendUrl = servicesConfig.baseUrl("preferences-frontend") override def crypto: String => String = cookie => cookie def getPaperlessPreference()(implicit request: UserRequest[_]): Future[ActivatePaperlessResponse] = { def absoluteUrl = configDecorator.pertaxFrontendHost + request.uri def activatePaperless: Future[ActivatePaperlessResponse] = withMetricsTimer("get-activate-paperless") { timer => val url = s"$preferencesFrontendUrl/paperless/activate?returnUrl=${tools.encryptAndEncode(absoluteUrl)}&returnLinkText=${tools .encryptAndEncode(Messages("label.continue"))}" //TODO remove ref to Messages simpleHttp.PUT[JsObject, ActivatePaperlessResponse](url, Json.obj("active" -> true)) map { case ActivatePaperlessActivatedResponse => timer.completeTimerAndIncrementSuccessCounter() ActivatePaperlessActivatedResponse case response: ActivatePaperlessRequiresUserActionResponse => timer.completeTimerAndIncrementSuccessCounter() response case ActivatePaperlessNotAllowedResponse => timer.completeTimerAndIncrementFailedCounter() ActivatePaperlessNotAllowedResponse } recover { case e => timer.completeTimerAndIncrementFailedCounter() Logger.warn("Error getting paperless preference record from preferences-frontend-service", e) ActivatePaperlessNotAllowedResponse } } if (request.isGovernmentGateway) { activatePaperless } else { Future.successful(ActivatePaperlessNotAllowedResponse) } } }
Example 2
Source File: AddressLookupService.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package services import com.kenshoo.play.metrics.Metrics import config.ConfigDecorator import com.google.inject.{Inject, Singleton} import metrics._ import models.addresslookup.RecordSet import play.api.Mode.Mode import play.api.{Configuration, Environment, Logger} import services.http.SimpleHttp import uk.gov.hmrc.http.{HeaderCarrier, HttpResponse} import uk.gov.hmrc.play.bootstrap.config.ServicesConfig import util._ import scala.concurrent.Future sealed trait AddressLookupResponse final case class AddressLookupSuccessResponse(addressList: RecordSet) extends AddressLookupResponse final case class AddressLookupUnexpectedResponse(r: HttpResponse) extends AddressLookupResponse final case class AddressLookupErrorResponse(cause: Exception) extends AddressLookupResponse @Singleton class AddressLookupService @Inject()( environment: Environment, configuration: Configuration, configDecorator: ConfigDecorator, val simpleHttp: SimpleHttp, val metrics: Metrics, val tools: Tools, servicesConfig: ServicesConfig) extends HasMetrics { val mode: Mode = environment.mode val runModeConfiguration: Configuration = configuration lazy val addressLookupUrl = servicesConfig.baseUrl("address-lookup") def lookup(postcode: String, filter: Option[String] = None)( implicit hc: HeaderCarrier): Future[AddressLookupResponse] = withMetricsTimer("address-lookup") { t => val hn = tools.urlEncode(filter.getOrElse("")) val pc = postcode.replaceAll(" ", "") val newHc = hc.withExtraHeaders("X-Hmrc-Origin" -> configDecorator.origin) simpleHttp.get[AddressLookupResponse](s"$addressLookupUrl/v1/gb/addresses.json?postcode=$pc&filter=$hn")( onComplete = { case r if r.status >= 200 && r.status < 300 => t.completeTimerAndIncrementSuccessCounter() AddressLookupSuccessResponse(RecordSet.fromJsonAddressLookupService(r.json)) case r => t.completeTimerAndIncrementFailedCounter() Logger.warn(s"Unexpected ${r.status} response getting address record from address lookup service") AddressLookupUnexpectedResponse(r) }, onError = { case e => t.completeTimerAndIncrementFailedCounter() Logger.warn("Error getting address record from address lookup service", e) AddressLookupErrorResponse(e) } )(newHc) } }
Example 3
Source File: LocalSessionCache.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package services import com.google.inject.{Inject, Singleton} import config.ConfigDecorator import javax.inject.Named import play.api.{Configuration, Environment} import uk.gov.hmrc.http.cache.client.SessionCache import uk.gov.hmrc.play.bootstrap.config.ServicesConfig import uk.gov.hmrc.play.bootstrap.http.HttpClient @Singleton class LocalSessionCache @Inject()( environment: Environment, configuration: Configuration, val appNameConfiguration: Configuration, override val http: HttpClient, configDecorator: ConfigDecorator, servicesConfig: ServicesConfig, @Named("appName") appName: String) extends SessionCache { override lazy val defaultSource = appName override lazy val baseUri = servicesConfig.baseUrl("cachable.session-cache") override lazy val domain = servicesConfig.getConfString("cachable.session-cache.domain", "keystore") }
Example 4
Source File: TaxCalculationService.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package services import com.kenshoo.play.metrics.Metrics import com.google.inject.{Inject, Singleton} import metrics._ import models.{TaxCalculation, TaxYearReconciliation} import play.api.Mode.Mode import play.api.http.Status._ import play.api.{Configuration, Environment, Logger} import services.http.SimpleHttp import uk.gov.hmrc.domain.Nino import uk.gov.hmrc.http.{HeaderCarrier, HttpResponse} import uk.gov.hmrc.play.bootstrap.config.ServicesConfig import uk.gov.hmrc.play.bootstrap.http.HttpClient import scala.concurrent.{ExecutionContext, Future} import scala.util.control.NonFatal sealed trait TaxCalculationResponse case class TaxCalculationSuccessResponse(taxCalculation: TaxCalculation) extends TaxCalculationResponse case object TaxCalculationNotFoundResponse extends TaxCalculationResponse case class TaxCalculationUnexpectedResponse(r: HttpResponse) extends TaxCalculationResponse case class TaxCalculationErrorResponse(cause: Exception) extends TaxCalculationResponse @Singleton class TaxCalculationService @Inject()( environment: Environment, configuration: Configuration, val simpleHttp: SimpleHttp, val metrics: Metrics, val http: HttpClient, servicesConfig: ServicesConfig)(implicit ec: ExecutionContext) extends HasMetrics { val mode: Mode = environment.mode val runModeConfiguration: Configuration = configuration lazy val taxCalcUrl = servicesConfig.baseUrl("taxcalc") def getTaxCalculation(nino: Nino, year: Int)(implicit hc: HeaderCarrier): Future[TaxCalculationResponse] = withMetricsTimer("get-taxcalc-summary") { t => simpleHttp.get[TaxCalculationResponse](s"$taxCalcUrl/taxcalc/$nino/taxSummary/$year")( onComplete = { case r if r.status >= 200 && r.status < 300 => Logger.debug(r.body) t.completeTimerAndIncrementSuccessCounter() TaxCalculationSuccessResponse(r.json.as[TaxCalculation]) case r if r.status == NOT_FOUND => Logger.debug(r.body) t.completeTimerAndIncrementSuccessCounter() TaxCalculationNotFoundResponse case r => Logger.debug(r.body) t.completeTimerAndIncrementFailedCounter() Logger.debug(s"Unexpected ${r.status} response getting tax calculation from tax-calculation-service") TaxCalculationUnexpectedResponse(r) }, onError = { e => Logger.debug(e.toString) t.completeTimerAndIncrementFailedCounter() Logger.warn("Error getting tax calculation from tax-calculation-service", e) TaxCalculationErrorResponse(e) } ) } def getTaxYearReconciliations(nino: Nino)( implicit headerCarrier: HeaderCarrier): Future[List[TaxYearReconciliation]] = http .GET[List[TaxYearReconciliation]](s"$taxCalcUrl/taxcalc/$nino/reconciliations") .recover { case NonFatal(e) => Logger.debug(s"An exception was thrown by taxcalc reconciliations: ${e.getMessage}") Nil } }
Example 5
Source File: IdentityVerificationFrontendService.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package services import com.kenshoo.play.metrics.Metrics import com.google.inject.{Inject, Singleton} import metrics.HasMetrics import play.api.Mode.Mode import play.api.http.Status._ import play.api.{Configuration, Environment, Logger} import services.http.SimpleHttp import uk.gov.hmrc.http.{HeaderCarrier, HttpResponse} import uk.gov.hmrc.play.bootstrap.config.ServicesConfig import scala.concurrent.Future trait IdentityVerificationResponse case class IdentityVerificationSuccessResponse(result: String) extends IdentityVerificationResponse case object IdentityVerificationNotFoundResponse extends IdentityVerificationResponse case class IdentityVerificationUnexpectedResponse(r: HttpResponse) extends IdentityVerificationResponse case class IdentityVerificationErrorResponse(cause: Exception) extends IdentityVerificationResponse object IdentityVerificationSuccessResponse { val Success = "Success" val Incomplete = "Incomplete" val FailedMatching = "FailedMatching" val InsufficientEvidence = "InsufficientEvidence" val LockedOut = "LockedOut" val UserAborted = "UserAborted" val Timeout = "Timeout" val TechnicalIssue = "TechnicalIssue" val PrecondFailed = "PreconditionFailed" } @Singleton class IdentityVerificationFrontendService @Inject()( environment: Environment, configuration: Configuration, val simpleHttp: SimpleHttp, val metrics: Metrics, servicesConfig: ServicesConfig) extends HasMetrics { val mode: Mode = environment.mode val runModeConfiguration: Configuration = configuration lazy val identityVerificationFrontendUrl: String = servicesConfig.baseUrl("identity-verification-frontend") def getIVJourneyStatus(journeyId: String)(implicit hc: HeaderCarrier): Future[IdentityVerificationResponse] = withMetricsTimer("get-iv-journey-status") { t => simpleHttp.get[IdentityVerificationResponse]( s"$identityVerificationFrontendUrl/mdtp/journey/journeyId/$journeyId")( onComplete = { case r if r.status >= 200 && r.status < 300 => t.completeTimerAndIncrementSuccessCounter() val result = List((r.json \ "journeyResult").asOpt[String], (r.json \ "result").asOpt[String]).flatten.head //FIXME - dont use head IdentityVerificationSuccessResponse(result) case r if r.status == NOT_FOUND => t.completeTimerAndIncrementFailedCounter() Logger.warn("Unable to get IV journey status from identity-verification-frontend-service") IdentityVerificationNotFoundResponse case r => t.completeTimerAndIncrementFailedCounter() Logger.warn( s"Unexpected ${r.status} response getting IV journey status from identity-verification-frontend-service") IdentityVerificationUnexpectedResponse(r) }, onError = { case e => t.completeTimerAndIncrementFailedCounter() Logger.warn("Error getting IV journey status from identity-verification-frontend-service", e) IdentityVerificationErrorResponse(e) } ) } }
Example 6
Source File: LifetimeAllowanceService.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package services import com.kenshoo.play.metrics.Metrics import com.google.inject.{Inject, Singleton} import metrics.HasMetrics import models.LtaProtections import play.api.Mode.Mode import play.api.{Configuration, Environment, Logger} import services.http.SimpleHttp import uk.gov.hmrc.domain.Nino import uk.gov.hmrc.http.{HeaderCarrier, HttpReads} import uk.gov.hmrc.play.bootstrap.config.ServicesConfig import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future @Singleton class LifetimeAllowanceService @Inject()( environment: Environment, configuration: Configuration, val simpleHttp: SimpleHttp, val metrics: Metrics, servicesConfig: ServicesConfig) extends HasMetrics { val mode: Mode = environment.mode val runModeConfiguration: Configuration = configuration lazy val lifetimeAllowanceUrl = servicesConfig.baseUrl("pensions-lifetime-allowance") def getCount(nino: Nino)(implicit hc: HeaderCarrier, rds: HttpReads[LtaProtections]): Future[Option[Int]] = withMetricsTimer("has-lta-response") { t => simpleHttp.get[Option[Int]]( lifetimeAllowanceUrl + s"/protect-your-lifetime-allowance/individuals/$nino/protections/count")( onComplete = { case r if r.status >= 200 && r.status < 300 => t.completeTimerAndIncrementSuccessCounter() Some((r.json.as[LtaProtections]).count) case r => t.completeTimerAndIncrementFailedCounter() Logger.warn( s"Unexpected ${r.status} response getting lifetime allowance protections count from LTA service") None }, onError = { case e => t.completeTimerAndIncrementFailedCounter() Logger.warn("Error getting lifetime allowance protections count from LTA service", e) None } ) } def hasLtaProtection(nino: Nino)(implicit hc: HeaderCarrier, rds: HttpReads[LtaProtections]): Future[Boolean] = getCount(nino) map { case (Some(0) | None) => false case _ => true } }
Example 7
Source File: TaiService.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package services import com.kenshoo.play.metrics.Metrics import com.google.inject.{Inject, Singleton} import metrics._ import models._ import play.api.Mode.Mode import play.api.http.Status._ import play.api.{Configuration, Environment, Logger} import services.http.SimpleHttp import uk.gov.hmrc.domain.Nino import uk.gov.hmrc.http.{HeaderCarrier, HttpResponse} import uk.gov.hmrc.play.bootstrap.config.ServicesConfig import scala.concurrent.Future sealed trait TaxComponentsResponse case class TaxComponentsSuccessResponse(taxComponents: TaxComponents) extends TaxComponentsResponse case object TaxComponentsUnavailableResponse extends TaxComponentsResponse case class TaxComponentsUnexpectedResponse(r: HttpResponse) extends TaxComponentsResponse case class TaxComponentsErrorResponse(cause: Exception) extends TaxComponentsResponse @Singleton class TaiService @Inject()( environment: Environment, runModeConfiguration: Configuration, val simpleHttp: SimpleHttp, val metrics: Metrics, servicesConfig: ServicesConfig) extends HasMetrics { val mode: Mode = environment.mode lazy val taiUrl = servicesConfig.baseUrl("tai") def taxComponents(nino: Nino, year: Int)(implicit hc: HeaderCarrier): Future[TaxComponentsResponse] = withMetricsTimer("get-tax-components") { t => simpleHttp.get[TaxComponentsResponse](s"$taiUrl/tai/$nino/tax-account/$year/tax-components")( onComplete = { case r if r.status >= 200 && r.status < 300 => t.completeTimerAndIncrementSuccessCounter() TaxComponentsSuccessResponse(TaxComponents.fromJsonTaxComponents(r.json)) case r if r.status == NOT_FOUND | r.status == BAD_REQUEST => t.completeTimerAndIncrementSuccessCounter() Logger.warn("Unable to find tax components from the tai-service") TaxComponentsUnavailableResponse case r => t.completeTimerAndIncrementFailedCounter() Logger.warn(s"Unexpected ${r.status} response getting tax components from the tai-service") TaxComponentsUnexpectedResponse(r) }, onError = { case e => t.completeTimerAndIncrementFailedCounter() Logger.error("Error getting tax components from the tai-service", e) TaxComponentsErrorResponse(e) } ) } }
Example 8
Source File: SaPartialService.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package services.partials import com.google.inject.{Inject, Singleton} import com.kenshoo.play.metrics.Metrics import config.ConfigDecorator import metrics.HasMetrics import play.api.Mode.Mode import play.api.mvc.RequestHeader import play.api.{Configuration, Environment} import uk.gov.hmrc.play.bootstrap.config.ServicesConfig import uk.gov.hmrc.play.bootstrap.filters.frontend.crypto.SessionCookieCrypto import uk.gov.hmrc.play.bootstrap.http.HttpClient import uk.gov.hmrc.play.partials.HtmlPartial import util.{EnhancedPartialRetriever, Tools} import scala.concurrent.{ExecutionContext, Future} @Singleton class SaPartialService @Inject()( environment: Environment, runModeConfiguration: Configuration, override val http: HttpClient, val metrics: Metrics, val configDecorator: ConfigDecorator, sessionCookieCrypto: SessionCookieCrypto, val tools: Tools, servicesConfig: ServicesConfig)(implicit executionContext: ExecutionContext) extends EnhancedPartialRetriever(sessionCookieCrypto) with HasMetrics { val mode: Mode = environment.mode private val returnUrl = configDecorator.pertaxFrontendHomeUrl private val returnLinkText = configDecorator.saPartialReturnLinkText def getSaAccountSummary(implicit request: RequestHeader): Future[HtmlPartial] = loadPartial( configDecorator.businessTaxAccountService + s"/business-account/partial/sa/account-summary?returnUrl=${tools .urlEncode(returnUrl)}&returnLinkText=${tools.urlEncode(returnLinkText)}") }
Example 9
Source File: MessageFrontendService.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package services.partials import com.google.inject.{Inject, Singleton} import com.kenshoo.play.metrics.Metrics import metrics.HasMetrics import models.MessageCount import play.api.Mode.Mode import play.api.mvc.RequestHeader import play.api.{Configuration, Environment, Logger} import uk.gov.hmrc.http.HeaderCarrier import uk.gov.hmrc.play.bootstrap.config.ServicesConfig import uk.gov.hmrc.play.bootstrap.filters.frontend.crypto.SessionCookieCrypto import uk.gov.hmrc.play.bootstrap.http.HttpClient import uk.gov.hmrc.play.partials.HtmlPartial import util.EnhancedPartialRetriever import scala.concurrent.{ExecutionContext, Future} @Singleton class MessageFrontendService @Inject()( environment: Environment, runModeConfiguration: Configuration, override val http: HttpClient, val metrics: Metrics, val sessionCookieCrypto: SessionCookieCrypto, servicesConfig: ServicesConfig)(implicit executionContext: ExecutionContext) extends EnhancedPartialRetriever(sessionCookieCrypto) with HasMetrics { val mode: Mode = environment.mode lazy val messageFrontendUrl: String = servicesConfig.baseUrl("message-frontend") def getMessageListPartial(implicit request: RequestHeader): Future[HtmlPartial] = loadPartial(messageFrontendUrl + "/messages") def getMessageDetailPartial(messageToken: String)(implicit request: RequestHeader): Future[HtmlPartial] = loadPartial(messageFrontendUrl + "/messages/" + messageToken) def getMessageInboxLinkPartial(implicit request: RequestHeader): Future[HtmlPartial] = loadPartial( messageFrontendUrl + "/messages/inbox-link?messagesInboxUrl=" + controllers.routes.MessageController .messageList()) def getUnreadMessageCount(implicit request: RequestHeader): Future[Option[Int]] = loadJson(messageFrontendUrl + "/messages/count?read=No").map(_.map(_.count)) private def loadJson(url: String)(implicit hc: HeaderCarrier): Future[Option[MessageCount]] = withMetricsTimer("load-json") { t => http.GET[Option[MessageCount]](url) recover { case e => t.completeTimerAndIncrementFailedCounter() Logger.warn(s"Failed to load json", e) None } } }
Example 10
Source File: PreferencesFrontendPartialService.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package services.partials import com.google.inject.{Inject, Singleton} import com.kenshoo.play.metrics.Metrics import metrics.HasMetrics import play.api.Mode.Mode import play.api.mvc.RequestHeader import play.api.{Configuration, Environment} import uk.gov.hmrc.play.bootstrap.config.ServicesConfig import uk.gov.hmrc.play.bootstrap.filters.frontend.crypto.SessionCookieCrypto import uk.gov.hmrc.play.bootstrap.http.HttpClient import uk.gov.hmrc.play.partials.HtmlPartial import util.{EnhancedPartialRetriever, Tools} import scala.concurrent.{ExecutionContext, Future} @Singleton class PreferencesFrontendPartialService @Inject()( environment: Environment, runModeConfiguration: Configuration, val http: HttpClient, val metrics: Metrics, sessionCookieCrypto: SessionCookieCrypto, val tools: Tools, servicesConfig: ServicesConfig)(implicit executionContext: ExecutionContext) extends EnhancedPartialRetriever(sessionCookieCrypto) with HasMetrics { val mode: Mode = environment.mode val preferencesFrontendUrl = servicesConfig.baseUrl("preferences-frontend") def getManagePreferencesPartial(returnUrl: String, returnLinkText: String)( implicit request: RequestHeader): Future[HtmlPartial] = loadPartial(s"$preferencesFrontendUrl/paperless/manage?returnUrl=${tools .encryptAndEncode(returnUrl)}&returnLinkText=${tools.encryptAndEncode(returnLinkText)}") }
Example 11
Source File: FormPartialService.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package services.partials import com.google.inject.{Inject, Singleton} import com.kenshoo.play.metrics.Metrics import config.ConfigDecorator import metrics.HasMetrics import play.api.Mode.Mode import play.api.mvc.RequestHeader import play.api.{Configuration, Environment} import uk.gov.hmrc.play.bootstrap.config.ServicesConfig import uk.gov.hmrc.play.bootstrap.filters.frontend.crypto.SessionCookieCrypto import uk.gov.hmrc.play.bootstrap.http.HttpClient import uk.gov.hmrc.play.partials.HtmlPartial import util.EnhancedPartialRetriever import scala.concurrent.{ExecutionContext, Future} @Singleton class FormPartialService @Inject()( environment: Environment, runModeConfiguration: Configuration, override val http: HttpClient, val metrics: Metrics, val configDecorator: ConfigDecorator, sessionCookieCrypto: SessionCookieCrypto, servicesConfig: ServicesConfig)(implicit executionContext: ExecutionContext) extends EnhancedPartialRetriever(sessionCookieCrypto) with HasMetrics { val mode: Mode = environment.mode def getNationalInsurancePartial(implicit request: RequestHeader): Future[HtmlPartial] = loadPartial(configDecorator.nationalInsuranceFormPartialLinkUrl) def getSelfAssessmentPartial(implicit request: RequestHeader): Future[HtmlPartial] = loadPartial(configDecorator.selfAssessmentFormPartialLinkUrl) }
Example 12
Source File: PaperlessPreferencesController.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package controllers import com.google.inject.Inject import config.ConfigDecorator import controllers.auth._ import controllers.auth.requests.UserRequest import play.api.Mode.Mode import play.api.i18n.{Messages, MessagesApi} import play.api.mvc.{Action, AnyContent, MessagesControllerComponents} import services.partials.PreferencesFrontendPartialService import play.api.mvc.{Action, AnyContent} import play.api.{Configuration, Environment} import uk.gov.hmrc.renderer.{ActiveTabMessages, TemplateRenderer} import util.{LocalPartialRetriever, Tools} import scala.concurrent.{ExecutionContext, Future} class PaperlessPreferencesController @Inject()( val preferencesFrontendPartialService: PreferencesFrontendPartialService, authJourney: AuthJourney, withActiveTabAction: WithActiveTabAction, withBreadcrumbAction: WithBreadcrumbAction, cc: MessagesControllerComponents, tools: Tools)( implicit partialRetriever: LocalPartialRetriever, configDecorator: ConfigDecorator, templateRenderer: TemplateRenderer, ec: ExecutionContext) extends PertaxBaseController(cc) { def managePreferences: Action[AnyContent] = (authJourney.authWithPersonalDetails andThen withActiveTabAction .addActiveTab(ActiveTabMessages) andThen withBreadcrumbAction.addBreadcrumb(baseBreadcrumb)).async { implicit request: UserRequest[_] => if (request.isVerify) { Future.successful( BadRequest( views.html.error( "global.error.BadRequest.title", Some("global.error.BadRequest.heading"), List("global.error.BadRequest.message")))) } else { Future.successful( Redirect( getManagePreferencesUrl(configDecorator.pertaxFrontendHomeUrl, Messages("label.back_to_account_home")))) } } private def getManagePreferencesUrl(returnUrl: String, returnLinkText: String): String = s"${configDecorator.preferencesFrontendService}/paperless/check-settings?returnUrl=${tools.encryptAndEncode(returnUrl)}&returnLinkText=${tools .encryptAndEncode(returnLinkText)}" }
Example 13
Source File: LanguageSwitchController.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package controllers import config.ConfigDecorator import com.google.inject.Inject import play.api.Configuration import play.api.i18n.{Lang, MessagesApi} import play.api.mvc.{Action, AnyContent, ControllerComponents, MessagesControllerComponents} import uk.gov.hmrc.play.language.{LanguageController, LanguageUtils} class LanguageSwitchController @Inject()( configDecorator: ConfigDecorator, configuration: Configuration, languageUtils: LanguageUtils, cc: ControllerComponents) extends LanguageController(configuration, languageUtils, cc) { def enGb(): Action[AnyContent] = switchToLanguage(language = "english") def cyGb(): Action[AnyContent] = switchToLanguage(language = "cymraeg") def fallbackURL: String = configDecorator.pertaxFrontendService def languageMap: Map[String, Lang] = Map( "english" -> Lang("en"), "cymraeg" -> Lang("cy") ) }
Example 14
Source File: MinimumAuthAction.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package controllers.auth import com.google.inject.Inject import config.ConfigDecorator import controllers.auth.requests.{AuthenticatedRequest, SelfAssessmentEnrolment, SelfAssessmentStatus} import controllers.routes import models.UserName import play.api.Configuration import play.api.mvc._ import uk.gov.hmrc.auth.core._ import uk.gov.hmrc.auth.core.retrieve.v2.Retrievals import uk.gov.hmrc.auth.core.retrieve.{Name, v2, ~} import uk.gov.hmrc.domain import uk.gov.hmrc.domain.SaUtr import uk.gov.hmrc.http.HeaderCarrier import uk.gov.hmrc.play.HeaderCarrierConverter import scala.concurrent.{ExecutionContext, Future} class MinimumAuthAction @Inject()( val authConnector: AuthConnector, configuration: Configuration, configDecorator: ConfigDecorator, sessionAuditor: SessionAuditor, cc: ControllerComponents)(implicit ec: ExecutionContext) extends AuthAction with AuthorisedFunctions { override def invokeBlock[A](request: Request[A], block: AuthenticatedRequest[A] => Future[Result]): Future[Result] = { implicit val hc: HeaderCarrier = HeaderCarrierConverter.fromHeadersAndSession(request.headers, Some(request.session)) authorised(ConfidenceLevel.L50) .retrieve( Retrievals.nino and Retrievals.allEnrolments and Retrievals.credentials and Retrievals.confidenceLevel and Retrievals.name and Retrievals.trustedHelper and Retrievals.profile) { case nino ~ Enrolments(enrolments) ~ Some(credentials) ~ confidenceLevel ~ name ~ trustedHelper ~ profile => val saEnrolment = enrolments.find(_.key == "IR-SA").flatMap { enrolment => enrolment.identifiers .find(id => id.key == "UTR") .map(key => SelfAssessmentEnrolment(SaUtr(key.value), SelfAssessmentStatus.fromString(enrolment.state))) } val trimmedRequest: Request[A] = request .map { case AnyContentAsFormUrlEncoded(data) => AnyContentAsFormUrlEncoded(data.map { case (key, vals) => (key, vals.map(_.trim)) }) case b => b } .asInstanceOf[Request[A]] val authenticatedRequest = AuthenticatedRequest[A]( nino.map(domain.Nino), saEnrolment, credentials, confidenceLevel, Some(UserName(name.getOrElse(Name(None, None)))), trustedHelper, profile, enrolments, trimmedRequest ) for { result <- block(authenticatedRequest) updatedResult <- sessionAuditor.auditOnce(authenticatedRequest, result) } yield updatedResult case _ => throw new RuntimeException("Can't find credentials for user") } } recover { case _: NoActiveSession => Results.Redirect(routes.PublicController.sessionTimeout()).withNewSession case _: InsufficientEnrolments => throw InsufficientEnrolments("") } override def parser: BodyParser[AnyContent] = cc.parsers.defaultBodyParser override protected def executionContext: ExecutionContext = cc.executionContext }
Example 15
Source File: LocalTemplateRenderer.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package config import com.google.inject.Inject import play.api.Mode.Mode import play.api.{Configuration, Environment} import uk.gov.hmrc.http.HeaderCarrier import uk.gov.hmrc.play.bootstrap.config.ServicesConfig import uk.gov.hmrc.play.bootstrap.http.HttpClient import uk.gov.hmrc.renderer.TemplateRenderer import scala.concurrent.duration._ import scala.concurrent.{ExecutionContext, Future} class LocalTemplateRenderer @Inject()( environment: Environment, configuration: Configuration, wsHttp: HttpClient, servicesConfig: ServicesConfig)(implicit executionContext: ExecutionContext) extends TemplateRenderer { val mode: Mode = environment.mode val runModeConfiguration: Configuration = configuration override lazy val templateServiceBaseUrl = servicesConfig.baseUrl("frontend-template-provider") override lazy val refreshAfter: Duration = runModeConfiguration.getInt("template.refreshInterval").getOrElse(600) seconds private implicit val hc = HeaderCarrier() override def fetchTemplate(path: String): Future[String] = wsHttp.GET(path).map(_.body) }
Example 16
Source File: PdfGeneratorConnector.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package connectors import com.google.inject.{ImplementedBy, Inject, Singleton} import play.api.Mode import play.api.libs.ws.{WSClient, WSResponse} import play.api.{Configuration, Environment} import uk.gov.hmrc.play.bootstrap.config.ServicesConfig import scala.concurrent.Future @ImplementedBy(classOf[FrontendPdfGeneratorConnector]) trait PdfGeneratorConnector { val serviceURL: String def getWsClient: WSClient def generatePdf(html: String): Future[WSResponse] = getWsClient.url(serviceURL).post(Map("html" -> Seq(html))) } @Singleton class FrontendPdfGeneratorConnector @Inject()( environment: Environment, runModeConfiguration: Configuration, wsClient: WSClient, servicesConfig: ServicesConfig) extends PdfGeneratorConnector { val mode: Mode = environment.mode val pdfServiceUrl: String = servicesConfig.baseUrl("pdf-generator-service") val serviceURL = pdfServiceUrl + "/pdf-generator-service/generate" override def getWsClient: WSClient = wsClient }
Example 17
Source File: FormPartialServiceSpec.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package services import com.codahale.metrics.Timer import com.kenshoo.play.metrics.Metrics import config.ConfigDecorator import org.mockito.Matchers._ import org.mockito.Mockito._ import org.scalatestplus.mockito.MockitoSugar import play.api.{Configuration, Environment} import play.twirl.api.Html import services.partials.FormPartialService import uk.gov.hmrc.crypto.ApplicationCrypto import uk.gov.hmrc.play.bootstrap.config.ServicesConfig import uk.gov.hmrc.play.bootstrap.filters.frontend.crypto.SessionCookieCrypto import uk.gov.hmrc.play.bootstrap.http.DefaultHttpClient import uk.gov.hmrc.play.partials.HtmlPartial import util.BaseSpec import util.Fixtures._ import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future class FormPartialServiceSpec extends BaseSpec { trait LocalSetup { val servicesConfig = app.injector.instanceOf[ServicesConfig] val timer = MockitoSugar.mock[Timer.Context] val formPartialService: FormPartialService = new FormPartialService( injected[Environment], injected[Configuration], MockitoSugar.mock[DefaultHttpClient], MockitoSugar.mock[Metrics], MockitoSugar.mock[ConfigDecorator], injected[SessionCookieCrypto], servicesConfig ) { override val metricsOperator: MetricsOperator = MockitoSugar.mock[MetricsOperator] when(metricsOperator.startTimer(any())) thenReturn timer } } "Calling FormPartialServiceSpec" should { "return form list for National insurance" in new LocalSetup { when(formPartialService.http.GET[HtmlPartial](any())(any(), any(), any())) thenReturn Future.successful[HtmlPartial](HtmlPartial.Success(Some("Title"), Html("<title/>"))) formPartialService.getNationalInsurancePartial(buildFakeRequestWithAuth("GET")).map(p => p shouldBe "<title/>") verify(formPartialService.http, times(1)).GET[Html](any())(any(), any(), any()) } "return form list for Self-assessment" in new LocalSetup { when(formPartialService.http.GET[HtmlPartial](any())(any(), any(), any())) thenReturn Future.successful[HtmlPartial](HtmlPartial.Success(Some("Title"), Html("<title/>"))) formPartialService.getSelfAssessmentPartial(buildFakeRequestWithAuth("GET")).map(p => p shouldBe "<title/>") verify(formPartialService.http, times(1)).GET[Html](any())(any(), any(), any()) } } }
Example 18
Source File: IdentityVerificationFrontendServiceSpec.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package services import com.codahale.metrics.Timer import com.kenshoo.play.metrics.Metrics import org.mockito.Matchers._ import org.mockito.Mockito._ import org.scalatestplus.mockito.MockitoSugar import play.api.http.Status._ import play.api.libs.json.Json import play.api.{Configuration, Environment} import services.http.FakeSimpleHttp import uk.gov.hmrc.http.HttpResponse import uk.gov.hmrc.play.bootstrap.config.ServicesConfig import util.BaseSpec class IdentityVerificationFrontendServiceSpec extends BaseSpec { trait SpecSetup { def httpResponse: HttpResponse def simulateIdentityVerificationFrontendIsDown: Boolean val anException = new RuntimeException("Any") val metricId = "get-iv-journey-status" lazy val (service, metrics, timer) = { val fakeSimpleHttp = { if (simulateIdentityVerificationFrontendIsDown) new FakeSimpleHttp(Right(anException)) else new FakeSimpleHttp(Left(httpResponse)) } val serviceConfig = app.injector.instanceOf[ServicesConfig] val timer = MockitoSugar.mock[Timer.Context] val identityVerificationFrontendService: IdentityVerificationFrontendService = new IdentityVerificationFrontendService( injected[Environment], injected[Configuration], fakeSimpleHttp, MockitoSugar.mock[Metrics], serviceConfig) { override val metricsOperator: MetricsOperator = MockitoSugar.mock[MetricsOperator] when(metricsOperator.startTimer(any())) thenReturn timer } (identityVerificationFrontendService, identityVerificationFrontendService.metricsOperator, timer) } } "Calling IdentityVerificationFrontend.getIVJourneyStatus" should { "return an IdentityVerificationSuccessResponse containing a journey status object when called with a journeyId" in new SpecSetup { override lazy val httpResponse = HttpResponse(OK, Some(Json.obj("token" -> "1234", "result" -> "LockedOut"))) override lazy val simulateIdentityVerificationFrontendIsDown = false val r = service.getIVJourneyStatus("1234") await(r) shouldBe IdentityVerificationSuccessResponse("LockedOut") verify(metrics, times(1)).startTimer(metricId) verify(metrics, times(1)).incrementSuccessCounter(metricId) verify(timer, times(1)).stop() } "return IdentityVerificationNotFoundResponse when called with a journeyId that causes a NOT FOUND response" in new SpecSetup { override lazy val httpResponse = HttpResponse(NOT_FOUND) override lazy val simulateIdentityVerificationFrontendIsDown = false val r = service.getIVJourneyStatus("4321") await(r) shouldBe IdentityVerificationNotFoundResponse verify(metrics, times(1)).startTimer(metricId) verify(metrics, times(1)).incrementFailedCounter(metricId) verify(timer, times(1)).stop() } "return TaxCalculationUnexpectedResponse when an unexpected status is returned" in new SpecSetup { val seeOtherResponse = HttpResponse(SEE_OTHER) override lazy val httpResponse = seeOtherResponse override lazy val simulateIdentityVerificationFrontendIsDown = false val r = service.getIVJourneyStatus("1234") await(r) shouldBe IdentityVerificationUnexpectedResponse(seeOtherResponse) verify(metrics, times(1)).startTimer(metricId) verify(metrics, times(1)).incrementFailedCounter(metricId) verify(timer, times(1)).stop() } "return IdentityVerificationErrorResponse when called and service is down" in new SpecSetup { override lazy val httpResponse = ??? override lazy val simulateIdentityVerificationFrontendIsDown = true val r = service.getIVJourneyStatus("1234") await(r) shouldBe IdentityVerificationErrorResponse(anException) verify(metrics, times(1)).startTimer(metricId) verify(metrics, times(1)).incrementFailedCounter(metricId) verify(timer, times(1)).stop() } } }
Example 19
Source File: ConfigDecoratorSpec.scala From pertax-frontend with Apache License 2.0 | 5 votes |
package config import java.net.{MalformedURLException, URL} import play.api.i18n.Langs import play.api.{Configuration, Environment} import uk.gov.hmrc.domain.SaUtrGenerator import uk.gov.hmrc.play.bootstrap.config.{RunMode, ServicesConfig} import util.BaseSpec class ConfigDecoratorSpec extends BaseSpec { val saUtr = new SaUtrGenerator().nextSaUtr.utr "Converting urls to sso" should { trait LocalSetup { lazy val configDecorator = new ConfigDecorator( injected[Environment], injected[Configuration], injected[RunMode], injected[Langs], injected[ServicesConfig]) { override lazy val portalBaseUrl = "http://portal.service" override lazy val companyAuthFrontendHost = "http://company-auth-frontend.service" } } "return a properly encoded sso url when calling transformUrlForSso" in new LocalSetup { configDecorator.transformUrlForSso(new URL("http://example.com/some/path?key=val")) shouldBe "http://company-auth-frontend.service/ssoout/non-digital?continue=http%3A%2F%2Fexample.com%2Fsome%2Fpath%3Fkey%3Dval" } "return a properly formatted sa302 url when calling sa302Url" in new LocalSetup { configDecorator.sa302Url(saUtr, "1516") shouldBe s"/self-assessment-file/1516/ind/$saUtr/return/viewYourCalculation/reviewYourFullCalculation" } "return a properly formatted SA Account Summary Url url when calling ssoToSaAccountSummaryUrl" in new LocalSetup { configDecorator.ssoToSaAccountSummaryUrl(saUtr, "1516") shouldBe s"http://company-auth-frontend.service/ssoout/non-digital?continue=http%3A%2F%2Fportal.service%2Fself-assessment%2Find%2F$saUtr%2Ftaxreturn%2F1516%2Foptions" } } "Calling toPortalUrl" should { trait LocalSetup { def portalBaseUrlToTest: Option[String] lazy val configDecorator = new ConfigDecorator( injected[Environment], injected[Configuration], injected[RunMode], injected[Langs], injected[ServicesConfig]) { override lazy val portalBaseUrl = portalBaseUrlToTest.getOrElse("") } } "return a URL if portalBaseUrl is present and fully qualified" in new LocalSetup { val portalBaseUrlToTest = Some("http://portal.service") configDecorator.toPortalUrl("/some/path").toString shouldBe "http://portal.service/some/path" } "fail with a MalformedURLException if portalBaseUrl is not present" in new LocalSetup { val portalBaseUrlToTest = None a[MalformedURLException] should be thrownBy { configDecorator.toPortalUrl("/some/path") } } "fail with a MalformedURLException if portalBaseUrl is not fully qualified" in new LocalSetup { val portalBaseUrlToTest = Some("/") a[MalformedURLException] should be thrownBy { configDecorator.toPortalUrl("/some/path") } } "fail with a MalformedURLException if portalBaseUrl is protocol-relative" in new LocalSetup { val portalBaseUrlToTest = Some("//portal.service") a[MalformedURLException] should be thrownBy { configDecorator.toPortalUrl("/some/path") } } } }
Example 20
Source File: SignInController.scala From play-silhouette-4.0-slick-postgres-seed with Apache License 2.0 | 5 votes |
package controllers.auth import javax.inject.Inject import com.mohiva.play.silhouette.api.Authenticator.Implicits._ import com.mohiva.play.silhouette.api._ import com.mohiva.play.silhouette.api.exceptions.ProviderException import com.mohiva.play.silhouette.api.repositories.AuthInfoRepository import com.mohiva.play.silhouette.api.util.{ Clock, Credentials } import com.mohiva.play.silhouette.impl.exceptions.IdentityNotFoundException import com.mohiva.play.silhouette.impl.providers._ import controllers.{ WebJarAssets, auth, pages } import forms.auth.SignInForm import models.services.UserService import net.ceedubs.ficus.Ficus._ import play.api.Configuration import play.api.i18n.{ I18nSupport, Messages, MessagesApi } import play.api.libs.concurrent.Execution.Implicits._ import play.api.mvc.{ Action, AnyContent, Controller } import utils.auth.DefaultEnv import scala.concurrent.Future import scala.concurrent.duration._ import scala.language.postfixOps def submit: Action[AnyContent] = silhouette.UnsecuredAction.async { implicit request => SignInForm.form.bindFromRequest.fold( form => Future.successful(BadRequest(views.html.auth.signIn(form, socialProviderRegistry))), data => { val credentials = Credentials(data.email, data.password) credentialsProvider.authenticate(credentials).flatMap { loginInfo => val result = Redirect(pages.routes.ApplicationController.index()) userService.retrieve(loginInfo).flatMap { case Some(user) if !user.activated => Future.successful(Ok(views.html.auth.activateAccount(data.email))) case Some(user) => val c = configuration.underlying silhouette.env.authenticatorService.create(loginInfo).map { case authenticator if data.rememberMe => authenticator.copy( expirationDateTime = clock.now + c.as[FiniteDuration]("silhouette.authenticator.rememberMe.authenticatorExpiry"), idleTimeout = c.getAs[FiniteDuration]("silhouette.authenticator.rememberMe.authenticatorIdleTimeout"), cookieMaxAge = c.getAs[FiniteDuration]("silhouette.authenticator.rememberMe.cookieMaxAge") ) case authenticator => authenticator }.flatMap { authenticator => silhouette.env.eventBus.publish(LoginEvent(user, request)) silhouette.env.authenticatorService.init(authenticator).flatMap { v => silhouette.env.authenticatorService.embed(v, result) } } case None => Future.failed(new IdentityNotFoundException("Couldn't find user")) } }.recover { case e: ProviderException => Redirect(auth.routes.SignInController.view()).flashing("error" -> Messages("invalid.credentials")) } } ) } }
Example 21
Source File: CompaniesConfiguration.scala From crm-seed with Apache License 2.0 | 5 votes |
package com.dataengi.crm.configurations import com.google.inject.{Inject, Singleton} import com.dataengi.crm.common.extensions.awaits._ import com.dataengi.crm.common.extensions.logging._ import play.api.{Configuration, Logger} import scalty.types._ import cats.instances.all._ import com.dataengi.crm.identities.services.CompaniesService import scala.concurrent.ExecutionContext @Singleton class CompaniesConfiguration @Inject()(configuration: Configuration, companiesService: CompaniesService, implicit val executionContext: ExecutionContext) { def loadRootCompany: Unit = { val addRootCompanyOr = for { rootCompanyOpt <- companiesService.findOption(CompaniesConfiguration.RootCompanyName) rootCompanyId <- rootCompanyOpt match { case Some(company) => Logger.info(s"[com.dataengi.crm.identities-initiation][load-root-company] $company already exists") company.id.get.toOr case None => Logger.info(s"[com.dataengi.crm.identities-initiation][load-root-company] creating ${CompaniesConfiguration.RootCompanyName}") companiesService.create(CompaniesConfiguration.RootCompanyName) } } yield rootCompanyId val addRootCompanyResult = addRootCompanyOr.await() Logger.info(s"[com.dataengi.crm.identities-initiation][load-root-company] ${addRootCompanyResult.logResult}") } } object CompaniesConfiguration { val RootCompanyName = "ROOT_COMPANY" }
Example 22
Source File: SilhouetteConfiguration.scala From crm-seed with Apache License 2.0 | 5 votes |
package com.dataengi.crm.configurations import com.google.inject.{Inject, Singleton} import com.mohiva.play.silhouette.api.util.Clock import com.typesafe.config.Config import play.api.Configuration import net.ceedubs.ficus.Ficus._ import com.mohiva.play.silhouette.api.Authenticator.Implicits._ import scala.concurrent.duration.FiniteDuration @Singleton class SilhouetteConfiguration @Inject()(configuration: Configuration, clock: Clock) { val underlying: Config = configuration.underlying def authenticatorExpiry: FiniteDuration = underlying.as[FiniteDuration]("silhouette.authenticator.rememberMe.authenticatorExpiry") def authenticatorIdleTimeout: Option[FiniteDuration] = underlying.getAs[FiniteDuration]("silhouette.authenticator.rememberMe.authenticatorIdleTimeout") def recoverPasswordTimeout: Long = (clock.now + underlying.as[FiniteDuration]("silhouette.authenticator.recoverPasswordExpiry")).getMillis }
Example 23
Source File: RootConfiguration.scala From crm-seed with Apache License 2.0 | 5 votes |
package com.dataengi.crm.configurations import com.dataengi.crm.identities.models.{Company, Role, User} import com.google.inject.{Inject, Singleton} import com.mohiva.play.silhouette.api.LoginInfo import com.mohiva.play.silhouette.api.util.{PasswordHasher} import play.api.Configuration @Singleton class RootConfiguration @Inject()(configuration: Configuration, passwordHasher: PasswordHasher) { private val rootEmail = configuration.getOptional[String]("crm.users.root.email").getOrElse("admin") val rootPassword = configuration.getOptional[String]("crm.users.root.password").getOrElse("admin") val rootLoginInfo = LoginInfo("credentials", rootEmail) val rootPasswordInfo = passwordHasher.hash(rootPassword) def createRootUser(rootCompany: Company, rootRole: Role): User = User( loginInfo = rootLoginInfo, role = rootRole, company = rootCompany ) }
Example 24
Source File: InitiateProfilesTables.scala From crm-seed with Apache License 2.0 | 5 votes |
package com.dataengi.crm.profiles.slick import com.dataengi.crm.identities.slick.tables.TablesInitiation import com.dataengi.crm.profiles.slick.tables.ProfilesTableDescription import com.google.inject.{Inject, Singleton} import play.api.Configuration import play.api.db.slick.DatabaseConfigProvider import scala.collection.immutable.List import scala.concurrent.ExecutionContext @Singleton class InitiateProfilesTables @Inject()(val configuration: Configuration, protected val dbConfigProvider: DatabaseConfigProvider, implicit val executionContext: ExecutionContext) extends ProfilesTableDescription with TablesInitiation { val All = List(Profiles) createTables(All) printMigrationDDL(All) }
Example 25
Source File: SilhouetteModule.scala From crm-seed with Apache License 2.0 | 5 votes |
package com.dataengi.crm.identities.modules import com.dataengi.crm.configurations.{CompaniesConfiguration, RolesConfiguration, RootConfiguration, SilhouetteConfiguration} import com.dataengi.crm.identities.actions.{ActionsProvider, ActionsProviderImplementation} import com.google.inject.name.Named import com.google.inject.{Provides, Singleton} import com.mohiva.play.silhouette.api.actions.SecuredErrorHandler import com.mohiva.play.silhouette.api.crypto.{AuthenticatorEncoder, Crypter, CrypterAuthenticatorEncoder} import com.mohiva.play.silhouette.api.repositories.AuthInfoRepository import com.mohiva.play.silhouette.api.services._ import com.mohiva.play.silhouette.api.util._ import com.mohiva.play.silhouette.api.{Environment, EventBus, Silhouette, SilhouetteProvider} import com.mohiva.play.silhouette.crypto.{JcaCrypter, JcaCrypterSettings} import com.mohiva.play.silhouette.impl.authenticators._ import com.mohiva.play.silhouette.impl.providers._ import com.mohiva.play.silhouette.impl.services._ import net.ceedubs.ficus.readers.EnumerationReader._ import com.mohiva.play.silhouette.impl.util._ import com.mohiva.play.silhouette.password.BCryptPasswordHasher import com.mohiva.play.silhouette.persistence.daos.DelegableAuthInfoDAO import com.mohiva.play.silhouette.persistence.repositories.DelegableAuthInfoRepository import net.ceedubs.ficus.Ficus._ import net.ceedubs.ficus.readers.ArbitraryTypeReader._ import net.codingwell.scalaguice.ScalaModule import play.api.Configuration import play.api.libs.ws.WSClient import com.dataengi.crm.identities.daos._ import com.dataengi.crm.identities.repositories._ import com.dataengi.crm.identities.services._ import com.dataengi.crm.identities.slick.initiation.InitiateTables import com.dataengi.crm.identities.utils.auth.DefaultEnv import scala.concurrent.ExecutionContext class SilhouetteModule extends ScalaModule { def configure() = { // Initiation ORDER make sense bind[InitiateTables].asEagerSingleton() bind[IdentitiesInitiation].asEagerSingleton() // Silhouette bind[SecuredErrorHandler].to[CustomSecuredErrorHandler] bind[Silhouette[DefaultEnv]].to[SilhouetteProvider[DefaultEnv]] bind[CacheLayer].to[PlayCacheLayer] bind[PasswordHasher].toInstance(new BCryptPasswordHasher) bind[FingerprintGenerator].toInstance(new DefaultFingerprintGenerator(false)) bind[EventBus].toInstance(EventBus()) bind[Clock].toInstance(Clock()) // Replace this with the bindings to your concrete DAOs bind[PasswordInfoDAO].to[PasswordInfoDAOSlickImplementation] bind[DelegableAuthInfoDAO[PasswordInfo]].to[PasswordInfoDAO] // Repository bind[RolesRepository].to[RolesRepositoryImplementation] bind[CompaniesRepository].to[CompaniesRepositoryImplementation] bind[InvitesRepository].to[InvitesRepositoryImplementation] bind[JWTAuthenticatorRepository].to[JWTAuthenticatorCacheRepositoryImplementation] bind[UsersRepository].to[UsersRepositoryImplementation] bind[RecoverPasswordInfoRepository].to[RecoverPasswordInfoRepositoryImplementation] // DAOs bind[CompaniesDAO].to[CompaniesSlickDAOImplementation] bind[RolesDAO].to[RolesSlickDAOImplementation] bind[InvitesDAO].to[InvitesSlickDAOImplementation] bind[JWTAuthenticatorDAO].to[JWTAuthenticatorSlickDAOImplementation] bind[UsersDAO].to[UsersSlickDAOImplementation] bind[RecoverPasswordInfoDAO].to[RecoverPasswordInfoSlickDAOImplementation] // Services bind[UsersService].to[UsersServiceImplementation] bind[CompaniesService].to[CompaniesServiceImplementation] bind[RolesService].to[RolesServiceImplementation] bind[InvitesService].to[InvitesServiceImplementation] bind[AuthenticationService].to[AuthenticationServiceImplementation] bind[UsersManagementService].to[UsersManagementServiceImplementation] // Actions bind[ActionsProvider].to[ActionsProviderImplementation] // Configuration bind[RolesConfiguration].asEagerSingleton() bind[CompaniesConfiguration].asEagerSingleton() bind[RootConfiguration].asEagerSingleton() bind[SilhouetteConfiguration].asEagerSingleton() } @Provides def provideCredentialsProvider(authInfoRepository: AuthInfoRepository, passwordHasherRegistry: PasswordHasherRegistry, executionContext: ExecutionContext): CredentialsProvider = { new CredentialsProvider(authInfoRepository, passwordHasherRegistry)(executionContext) } }
Example 26
Source File: TablesInitiation.scala From crm-seed with Apache License 2.0 | 5 votes |
package com.dataengi.crm.identities.slick.tables import java.io.{File, FileWriter} import play.api.{Configuration, Logger} import play.api.db.slick.HasDatabaseConfigProvider import slick.lifted.TableQuery import com.dataengi.crm.common.context.types._ import com.dataengi.crm.common.extensions.awaits._ import com.dataengi.crm.common.extensions.logging._ import scala.concurrent.ExecutionContext trait TablesInitiation extends HasDatabaseConfigProvider[slick.jdbc.JdbcProfile] { implicit val executionContext: ExecutionContext val configuration: Configuration val DDLTag: String = super.getClass.getSimpleName def printMigrationDDL(tables: List[slick.lifted.TableQuery[_ <: slick.relational.RelationalProfile#Table[_]]]) = { val allowPrintDDL = configuration.getOptional[Boolean]("play.db.ddl.print").getOrElse(false) Logger.info(s"[initiate-table][print-ddl] allowPrintDDL=$allowPrintDDL") if (allowPrintDDL) { createDDL(tables, DDLTag) } } private def createDDL(tables: List[TableQuery[_ <: slick.relational.RelationalProfile#Table[_]]], DDLPath: String) = { import profile.api._ val schema = tables.map(_.schema).reduce(_ ++ _) val directory = new File(s"./db/statements/${DDLPath}/") if (!directory.exists()) directory.mkdirs() val migrationFile = new File(directory.getPath + "/migration_ddl.sql") val writer = new FileWriter(migrationFile.getAbsoluteFile) writer.write("# --- !Ups\n\n") schema.createStatements.foreach { s => writer.write(s + ";\n") } writer.write("\n\n# --- !Downs\n\n") schema.dropStatements.foreach { s => writer.write(s + ";\n") } writer.close() } def createTables(tables: List[slick.lifted.TableQuery[_ <: slick.relational.RelationalProfile#Table[_]]]) = { import profile.api._ val allowCreateTables = configuration.getOptional[Boolean]("play.db.create.dynamic").getOrElse(false) val printStatementsTables = configuration.getOptional[Boolean]("play.db.print.statements").getOrElse(false) Logger.info(s"[initiate-table][create] allowCreateTables=$allowCreateTables") if (allowCreateTables) { val schema = tables.map(_.schema).reduce(_ ++ _) val schemaCreateResult = db.run(schema.create).toOr.await() if (printStatementsTables) Logger.info(s"[initiate-table][${DDLTag}] create query: ${schema.create.statements}") if (!List("already exist", "not found").exists(schemaCreateResult.logResult.contains)) { Logger.info(s"[initiate-table][${DDLTag}] create tables: ${schemaCreateResult.logResult}") } } } }
Example 27
Source File: LinksConfiguration.scala From crm-seed with Apache License 2.0 | 5 votes |
package com.dataengi.crm.common.configurations.links import com.google.inject.{Inject, Singleton} import com.dataengi.crm.common.context.types._ import com.dataengi.crm.common.errors.ConfigErrors import play.api.Configuration @Singleton class LinksConfiguration @Inject()(configuration: Configuration) { def domain: Or[String] = { configuration.getOptional[String]("link.domain").toOrWithLeftError(ConfigErrors.ConfigNotFoundError) } def signUpLink: Or[String] = { configuration.getOptional[String]("link.signUp").toOrWithLeftError(ConfigErrors.ConfigNotFoundError) } def recoverPassword: Or[String] = { configuration.getOptional[String]("link.recoverPassword").toOrWithLeftError(ConfigErrors.ConfigNotFoundError) } }
Example 28
Source File: ClientsModule.scala From daf-semantics with Apache License 2.0 | 5 votes |
package modules import com.google.inject.ImplementedBy import play.api.inject.ApplicationLifecycle import javax.inject.Singleton import javax.inject.Inject import play.api.libs.ws.WSClient import play.api.Application import play.api.Environment import play.api.Configuration import scala.concurrent.ExecutionContext import scala.concurrent.Future import play.Logger import clients.OntonetHubClient import com.typesafe.config.ConfigFactory import com.typesafe.config.ConfigRenderOptions @ImplementedBy(classOf[ClientsModuleBase]) trait ClientsModule @Singleton class ClientsModuleBase @Inject() (lifecycle: ApplicationLifecycle, ws: WSClient, configuration: Configuration) extends ClientsModule { val conf_clients = configuration.underlying .getConfig("clients") val ontonethub_config = conf_clients.getConfig("ontonethub") // TODO: verify if default configurations are needed here val ontonethub = new OntonetHubClient(ws, ontonethub_config) // TESTING ................................................ val options = ConfigRenderOptions.concise() .setComments(false).setOriginComments(false) .setFormatted(true).setJson(true) val json = ontonethub_config.root().render(options) // TESTING ................................................ // when application starts... @Inject def onStart( app: Application, env: Environment)(implicit ec: ExecutionContext) { Logger.info("ClientsModuleBase START") println("\n\n\n\n\n\n") println(json) } // when application stops... lifecycle.addStopHook({ () => Future.successful { Logger.info("ClientsModuleBase STOP") } }) }
Example 29
Source File: KBModule.scala From daf-semantics with Apache License 2.0 | 5 votes |
package modules import javax.inject._ import play.api.inject.ApplicationLifecycle import play.api.mvc._ import scala.concurrent.Future import com.google.inject.ImplementedBy import play.api.Play import play.api.Application import play.api.Environment import play.api.Configuration import scala.concurrent.ExecutionContext import play.api.Logger import it.almawave.linkeddata.kb.utils.ConfigHelper import it.almawave.linkeddata.kb.repo._ import scala.concurrent.ExecutionContext.Implicits.global import java.nio.file.Paths import play.api.Mode import java.io.File import it.almawave.linkeddata.kb.repo.RDFRepository import com.typesafe.config.ConfigFactory @ImplementedBy(classOf[KBModuleBase]) trait KBModule @Singleton class KBModuleBase @Inject() (lifecycle: ApplicationLifecycle) extends KBModule { // TODO: SPI per dev / prod val kbrepo = RDFRepository.memory() val logger = Logger.underlyingLogger // when application starts... @Inject def onStart( env: Environment, configuration: Configuration)(implicit ec: ExecutionContext) { // get configs val app_type = configuration.underlying.getString("app.type") val data_dir = app_type match { case "dev" => "./dist/data" case "prod" => "./data" } logger.debug(s"app_type: ${app_type}") logger.debug(s"data_dir: ${data_dir}") // starting VocabularyAPI service var conf_voc = ConfigFactory.parseFile(new File("./conf/semantic_repository.conf").getAbsoluteFile) conf_voc = ConfigHelper.injectParameters(conf_voc, ("data_dir", data_dir)) kbrepo.configuration(conf_voc) logger.info("KBModule.START....") logger.debug("KBModule using configuration:\n" + ConfigHelper.pretty(conf_voc)) println("KBModule using configuration:\n" + ConfigHelper.pretty(conf_voc)) // this is needed for ensure proper connection(s) etc kbrepo.start() // CHECK the initial (total) triples count var triples = kbrepo.store.size() logger.info(s"KBModule> ${triples} triples loaded") } // when application stops... lifecycle.addStopHook({ () => Future.successful { // this is useful for saving files, closing connections, release indexes, etc kbrepo.stop() logger.info("KBModule.STOP....") } }) }
Example 30
Source File: CustomLanguageController.scala From nisp-frontend with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.nisp.controllers import javax.inject.Inject import play.api.{Application, Configuration} import play.api.i18n.{Lang, MessagesApi} import play.api.mvc.Call import uk.gov.hmrc.play.language.{LanguageController, LanguageUtils} class CustomLanguageController @Inject()(implicit override val messagesApi: MessagesApi, application: Application, languageUtils: LanguageUtils, configuration: Configuration ) extends LanguageController(configuration, languageUtils) { def routeToSwitchLanguage = (lang: String) => routes.CustomLanguageController.switchToLanguage(lang) override def languageMap: Map[String, Lang] = Map( "english" -> Lang("en"), "cymraeg" -> Lang("cy") ) }
Example 31
Source File: WSHttp.scala From nisp-frontend with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.nisp.config.wiring import akka.actor.ActorSystem import com.typesafe.config.Config import play.api.{Configuration, Play} import uk.gov.hmrc.http._ import uk.gov.hmrc.http.hooks.HttpHooks import uk.gov.hmrc.play.audit.http.HttpAuditing import uk.gov.hmrc.play.audit.http.connector.AuditConnector import uk.gov.hmrc.play.config.AppName import uk.gov.hmrc.play.http.ws.{WSDelete, WSGet, WSPost, WSPut} trait WSHttp extends HttpGet with WSGet with HttpPut with WSPut with HttpPost with WSPost with HttpDelete with WSDelete with Hooks with AppName object WSHttp extends WSHttp { override protected def appNameConfiguration: Configuration = Play.current.configuration override protected def actorSystem: ActorSystem = Play.current.actorSystem override protected def configuration: Option[Config] = Option(Play.current.configuration.underlying) } trait Hooks extends HttpHooks with HttpAuditing { override val hooks = Seq(AuditingHook) override lazy val auditConnector: AuditConnector = NispAuditConnector }
Example 32
Source File: ApplicationGlobal.scala From nisp-frontend with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.nisp.config import com.typesafe.config.Config import net.ceedubs.ficus.Ficus._ import play.api.Mode.Mode import play.api.i18n.{I18nSupport, Messages, MessagesApi} import play.api.mvc.Request import play.api.{Application, Configuration, Play} import play.twirl.api.Html import uk.gov.hmrc.crypto.ApplicationCrypto import uk.gov.hmrc.nisp.config.wiring.NispAuditConnector import uk.gov.hmrc.nisp.controllers.NispFrontendController import uk.gov.hmrc.nisp.controllers.partial.PartialRetriever import uk.gov.hmrc.play.config.{AppName, ControllerConfig, RunMode} import uk.gov.hmrc.play.frontend.bootstrap.DefaultFrontendGlobal import uk.gov.hmrc.play.frontend.filters.{FrontendAuditFilter, FrontendLoggingFilter, MicroserviceFilterSupport} object ApplicationGlobal extends ApplicationGlobalTrait { override protected def mode: Mode = Play.current.mode override protected def runModeConfiguration: Configuration = Play.current.configuration override def messagesApi = Play.current.injector.instanceOf[MessagesApi] } trait ApplicationGlobalTrait extends DefaultFrontendGlobal with RunMode with PartialRetriever with NispFrontendController with I18nSupport { implicit lazy val app:Application = Play.current override val auditConnector = NispAuditConnector override val loggingFilter = NispLoggingFilter override val frontendAuditFilter = NispFrontendAuditFilter override def onStart(app: Application) { super.onStart(app) new ApplicationCrypto(Play.current.configuration.underlying).verifyConfiguration() } override def internalServerErrorTemplate(implicit request: Request[_]): Html = uk.gov.hmrc.nisp.views.html.service_error_500() override def standardErrorTemplate(pageTitle: String, heading: String, message: String)(implicit request: Request[_]): Html = uk.gov.hmrc.nisp.views.html.global_error(pageTitle, heading, message) override def notFoundTemplate(implicit request: Request[_]): Html = { uk.gov.hmrc.nisp.views.html.page_not_found_template() } override def microserviceMetricsConfig(implicit app: Application): Option[Configuration] = app.configuration.getConfig(s"microservice.metrics") } object ControllerConfiguration extends ControllerConfig { lazy val controllerConfigs = Play.current.configuration.underlying.as[Config]("controllers") } object NispLoggingFilter extends FrontendLoggingFilter with MicroserviceFilterSupport { override def controllerNeedsLogging(controllerName: String): Boolean = ControllerConfiguration.paramsForController(controllerName).needsLogging } object NispFrontendAuditFilter extends FrontendAuditFilter with RunMode with AppName with MicroserviceFilterSupport { override lazy val maskedFormFields = Seq.empty override lazy val applicationPort = None override lazy val auditConnector = NispAuditConnector override def controllerNeedsAuditing(controllerName: String): Boolean = ControllerConfiguration.paramsForController(controllerName).needsAuditing override protected def mode: Mode = Play.current.mode override protected def runModeConfiguration: Configuration = Play.current.configuration override protected def appNameConfiguration: Configuration = Play.current.configuration }
Example 33
Source File: LocalTemplateRenderer.scala From nisp-frontend with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.nisp.config import akka.actor.ActorSystem import com.typesafe.config.Config import play.api.{Configuration, Play} import play.api.Mode.Mode import uk.gov.hmrc.renderer.TemplateRenderer import uk.gov.hmrc.play.config.{AppName, RunMode, ServicesConfig} import uk.gov.hmrc.nisp.config.wiring.{NispAuditConnector, WSHttp} import uk.gov.hmrc.play.audit.http.HttpAuditing import uk.gov.hmrc.play.http.logging.MdcLoggingExecutionContext._ import scala.concurrent.Future import scala.concurrent.duration._ import uk.gov.hmrc.http.HeaderCarrier trait LocalTemplateRenderer extends TemplateRenderer with ServicesConfig { override lazy val templateServiceBaseUrl = baseUrl("frontend-template-provider") override val refreshAfter: Duration = 10 minutes private implicit val hc = HeaderCarrier() val wsHttp: WSHttp override def fetchTemplate(path: String): Future[String] = { wsHttp.GET(path).map(_.body) } } object LocalTemplateRenderer extends LocalTemplateRenderer { override val wsHttp = WsAllMethods override protected def mode: Mode = Play.current.mode override protected def runModeConfiguration: Configuration = Play.current.configuration } trait WsAllMethods extends WSHttp with HttpAuditing with AppName with RunMode object WsAllMethods extends WsAllMethods { override lazy val auditConnector = NispAuditConnector override val hooks = Seq (AuditingHook) override protected def appNameConfiguration: Configuration = Play.current.configuration override protected def mode: Mode = Play.current.mode override protected def runModeConfiguration: Configuration = Play.current.configuration override protected def actorSystem: ActorSystem = Play.current.actorSystem override protected def configuration: Option[Config] = Option(Play.current.configuration.underlying) }
Example 34
Source File: ApplicationConfig.scala From nisp-frontend with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.nisp.config import play.api.{Configuration, Play} import play.api.Mode.Mode import play.api.Play._ import uk.gov.hmrc.nisp.utils.Constants import uk.gov.hmrc.play.config.ServicesConfig trait ApplicationConfig { val assetsPrefix: String val betaFeedbackUrl: String val betaFeedbackUnauthenticatedUrl: String val analyticsToken: Option[String] val analyticsHost: String val ssoUrl: Option[String] val contactFormServiceIdentifier: String val contactFrontendPartialBaseUrl: String val reportAProblemPartialUrl: String val reportAProblemNonJSUrl: String val showGovUkDonePage: Boolean val govUkFinishedPageUrl: String val identityVerification: Boolean val postSignInRedirectUrl: String val notAuthorisedRedirectUrl: String val verifySignIn: String val verifySignInContinue: Boolean val ivUpliftUrl: String val ggSignInUrl: String val pertaxFrontendUrl: String val breadcrumbPartialUrl: String val showFullNI: Boolean val futureProofPersonalMax: Boolean val isWelshEnabled: Boolean val feedbackFrontendUrl: String val frontendTemplatePath: String } object ApplicationConfig extends ApplicationConfig with ServicesConfig { private def loadConfig(key: String) = configuration.getString(key).getOrElse(throw new Exception(s"Missing key: $key")) private val contactFrontendService = baseUrl("contact-frontend") private val contactHost = configuration.getString(s"contact-frontend.host").getOrElse("") override lazy val assetsPrefix: String = loadConfig(s"assets.url") + loadConfig(s"assets.version") + "/" override lazy val betaFeedbackUrl = s"${Constants.baseUrl}/feedback" override lazy val betaFeedbackUnauthenticatedUrl = betaFeedbackUrl override lazy val analyticsToken: Option[String] = configuration.getString(s"google-analytics.token") override lazy val analyticsHost: String = configuration.getString(s"google-analytics.host").getOrElse("auto") override lazy val ssoUrl: Option[String] = configuration.getString(s"portal.ssoUrl") lazy val frontendTemplatePath: String = configuration.getString("microservice.services.frontend-template-provider.path").getOrElse("/template/mustache") override val contactFormServiceIdentifier = "NISP" override lazy val contactFrontendPartialBaseUrl = s"$contactFrontendService" override lazy val reportAProblemPartialUrl = s"$contactHost/contact/problem_reports_ajax?service=$contactFormServiceIdentifier" override lazy val reportAProblemNonJSUrl = s"$contactHost/contact/problem_reports_nonjs?service=$contactFormServiceIdentifier" override val showGovUkDonePage: Boolean = configuration.getBoolean("govuk-done-page.enabled").getOrElse(true) override val govUkFinishedPageUrl: String = loadConfig("govuk-done-page.url") override val identityVerification: Boolean = configuration.getBoolean("microservice.services.features.identityVerification").getOrElse(false) override lazy val verifySignIn: String = configuration.getString("verify-sign-in.url").getOrElse("") override lazy val verifySignInContinue: Boolean = configuration.getBoolean("verify-sign-in.submit-continue-url").getOrElse(false) override lazy val postSignInRedirectUrl = configuration.getString("login-callback.url").getOrElse("") override lazy val notAuthorisedRedirectUrl = configuration.getString("not-authorised-callback.url").getOrElse("") override val ivUpliftUrl: String = configuration.getString(s"identity-verification-uplift.host").getOrElse("") override val ggSignInUrl: String = configuration.getString(s"government-gateway-sign-in.host").getOrElse("") val showUrBanner:Boolean = configuration.getBoolean("urBannerToggle").getOrElse(false) val GaEventAction: String = "home page UR" val isleManLink = runModeConfiguration.getString("isle-man-link.url") val citizenAdviceLinkEn = runModeConfiguration.getString("citizens-advice-link-en.url") val citizenAdviceLinkCy = runModeConfiguration.getString("citizens-advice-link-cy.url") val moneyAdviceLinkEn = runModeConfiguration.getString("money-advice-link-en.url") val moneyAdviceLinkCy = runModeConfiguration.getString("money-advice-link-cy.url") val pensionWiseLink = runModeConfiguration.getString("pension-wise-link.url") private val pertaxFrontendService: String = baseUrl("pertax-frontend") override lazy val pertaxFrontendUrl: String = configuration.getString(s"breadcrumb-service.url").getOrElse("") override lazy val breadcrumbPartialUrl: String = s"$pertaxFrontendService/personal-account/integration/main-content-header" override lazy val showFullNI: Boolean = configuration.getBoolean("microservice.services.features.fullNIrecord").getOrElse(false) override lazy val futureProofPersonalMax: Boolean = configuration.getBoolean("microservice.services.features.future-proof.personalMax").getOrElse(false) override val isWelshEnabled = configuration.getBoolean("microservice.services.features.welsh-translation").getOrElse(false) override val feedbackFrontendUrl: String = loadConfig("feedback-frontend.url") override protected def mode: Mode = Play.current.mode override protected def runModeConfiguration: Configuration = Play.current.configuration }
Example 35
Source File: MockTemplateRenderer.scala From nisp-frontend with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.nisp.utils import org.scalatest.mock.MockitoSugar import play.api.Mode.Mode import play.api.i18n.Messages import play.api.{Configuration, Play} import play.twirl.api.Html import uk.gov.hmrc.nisp.config.{LocalTemplateRenderer, WsAllMethods} import scala.concurrent.duration._ object MockTemplateRenderer extends LocalTemplateRenderer { override lazy val templateServiceBaseUrl = "http://example.com/template/mustache" override val refreshAfter = 10 minutes override val wsHttp = MockitoSugar.mock[WsAllMethods] override def renderDefaultTemplate(path:String, content: Html, extraArgs: Map[String, Any])(implicit messages: Messages) = { Html( "<title>" + extraArgs("pageTitle") + "</title>" + "<sidebar>"+extraArgs("sidebar")+"</sidebar>" + "<navLinks>"+extraArgs("navLinks")+"</navLinks>" + displayUrBanner(extraArgs) + "<mainContentHeader>" +extraArgs("mainContentHeader")+ "</mainContentHeader>" + content) } def displayUrBanner(extraArgs: Map[String, Any]): String ={ if(extraArgs.contains("fullWidthBannerTitle")){ "<div id=full-width-banner>" + "<div class = \"full-width-banner__title\">" + extraArgs("fullWidthBannerTitle") + "</div>" + "<div id = fullWidthBannerLink>" + extraArgs("fullWidthBannerLink") + "</div>"+ "<div>" + extraArgs("fullWidthBannerText")+ "</div>"+ "<div id = fullWidthBannerDismissText>"+extraArgs("fullWidthBannerDismissText")+"</div>" } else "" } override protected def mode: Mode = Play.current.mode override protected def runModeConfiguration: Configuration = Play.current.configuration }
Example 36
Source File: AbstractController.scala From daf with BSD 3-Clause "New" or "Revised" License | 5 votes |
package controllers import it.gov.daf.common.authentication.Authentication import it.gov.daf.common.config.Read import javax.security.auth.login.LoginContext import org.apache.hadoop.security.UserGroupInformation import org.pac4j.play.store.PlaySessionStore import play.api.Configuration import play.api.mvc._ import scala.util.{ Failure, Success, Try } abstract class AbstractController(protected val configuration: Configuration, val playSessionStore: PlaySessionStore) extends Controller { private def prepareEnv() = Try { System.setProperty("javax.security.auth.useSubjectCredsOnly", "false") } private def loginUserFromConf = for { user <- Read.string { "kerberos.principal" }.! path <- Read.string { "kerberos.keytab" }.! } yield UserGroupInformation.loginUserFromKeytab(user, path) private def prepareAuth() = Try { Authentication(configuration, playSessionStore) } private def initUser() = for { _ <- prepareEnv() _ <- loginUserFromConf.read { configuration } _ <- prepareAuth() } yield UserGroupInformation.getLoginUser protected implicit val proxyUser = initUser() match { case Success(null) => throw new RuntimeException("Unable to initialize user for application") case Success(user) => user case Failure(error) => throw new RuntimeException("Unable to initialize user for application", error) } }
Example 37
Source File: CatalogManagerClient.scala From daf with BSD 3-Clause "New" or "Revised" License | 5 votes |
package daf.catalogmanager import java.net.URLEncoder import java.security.AccessControlException import it.gov.daf.common.config.Read import json._ import org.slf4j.LoggerFactory import play.api.Configuration import play.api.libs.json.Json import scalaj.http.{ Http, HttpResponse } import scala.util.{ Failure, Try, Success => TrySuccess } class CatalogManagerClient(serviceUrl: String) { val logger = LoggerFactory.getLogger("it.gov.daf.CatalogManager") private def callService(authorization: String, catalogId: String) = Try { Http(s"$serviceUrl/catalog-manager/v1/catalog-ds/get/${URLEncoder.encode(catalogId,"UTF-8")}") .header("Authorization", authorization) .asString } private def parseCatalog(response: HttpResponse[String]) = if (response.code == 401) Failure { new AccessControlException("Unauthorized") } else if (response.isError) Failure { new RuntimeException(s"Error retrieving catalog data: [${response.code}] with body [${response.body}]") } else Try { Json.parse(response.body).as[MetaCatalog] } def getById(authorization: String, catalogId: String): Try[MetaCatalog] = for { response <- callService(authorization, catalogId) catalog <- parseCatalog(response) } yield catalog } object CatalogManagerClient { def fromConfig(config: Configuration) = Read.string { "daf.catalog_url" }.!.read(config) match { case TrySuccess(baseUrl) => new CatalogManagerClient(baseUrl) case Failure(error) => throw new RuntimeException("Unable to create catalog-manager client", error) } }
Example 38
Source File: TestAbstractModule.scala From daf with BSD 3-Clause "New" or "Revised" License | 5 votes |
package controllers.modules import akka.stream.Materializer import daf.util.TestCache import org.pac4j.play.store.{ PlayCacheSessionStore, PlaySessionStore } import play.api.{ Configuration, Environment } import play.api.inject.Module import play.api.libs.ws.WSClient import play.api.libs.ws.ahc.AhcWSClient import play.api.mvc.BodyParsers import play.cache.{ CacheApi, DefaultCacheApi } import play.api.cache.{ CacheApi => ApiCacheApi } import play.api.inject.guice.GuiceInjectorBuilder abstract class TestAbstractModule extends Module { private lazy val injector = new GuiceInjectorBuilder().bindings(this).injector() private lazy val sessionStoreInstance: PlaySessionStore = injector.instanceOf { classOf[PlaySessionStore] } private lazy val wsClientInstance: WSClient = injector.instanceOf { classOf[WSClient] } private lazy val bodyParsersInstance: BodyParsers = BodyParsers final def sessionStore: PlaySessionStore = sessionStoreInstance final def ws: WSClient = wsClientInstance final def bodyParsers: BodyParsers = bodyParsersInstance protected implicit def materializer: Materializer override def bindings(environment: Environment, configuration: Configuration) = Seq( bind(classOf[ApiCacheApi]).to(classOf[TestCache]), bind(classOf[CacheApi]).to(classOf[DefaultCacheApi]), bind(classOf[PlaySessionStore]).to(classOf[PlayCacheSessionStore]), bind(classOf[BodyParsers]).to(BodyParsers), bind(classOf[WSClient]).toInstance(AhcWSClient()) ) }
Example 39
Source File: CkanService.scala From daf with BSD 3-Clause "New" or "Revised" License | 5 votes |
package it.gov.daf.catalogmanager.service trait CkanServiceComponent { this: CkanRepositoryComponent => val ckanService: CkanService class CkanService { def getMongoUser(name:String, callingUserid :MetadataCat ): JsResult[User] = { ckanRepository.getMongoUser(name, callingUserid) } def verifyCredentials(credentials: Credentials):Boolean = { ckanRepository.verifyCredentials(credentials: Credentials) } def updateOrganization(orgId: String, jsonOrg: JsValue, callingUserid :MetadataCat ): Future[String] = { ckanRepository.updateOrganization(orgId,jsonOrg, callingUserid) } def patchOrganization(orgId: String, jsonOrg: JsValue, callingUserid :MetadataCat ): Future[String] = { ckanRepository.patchOrganization(orgId,jsonOrg, callingUserid) } def createUser(jsonUser: JsValue, callingUserid :MetadataCat): Future[String] = { ckanRepository.createUser(jsonUser, callingUserid) } def getUserOrganizations(userName :String, callingUserid :MetadataCat) : Future[JsResult[Seq[Organization]]] = { ckanRepository.getUserOrganizations(userName, callingUserid) } def createDataset(jsonDataset: JsValue, callingUserid :MetadataCat): Future[String] = { ckanRepository.createDataset(jsonDataset,callingUserid) } def createOrganization(jsonDataset: JsValue, callingUserid :MetadataCat): Future[String] = { ckanRepository.createOrganization(jsonDataset,callingUserid) } def dataset(datasetId: String, callingUserid :MetadataCat): JsValue = { ckanRepository.dataset(datasetId,callingUserid) } def getOrganization(orgId :String, callingUserid :MetadataCat) : Future[JsResult[Organization]] = { ckanRepository.getOrganization(orgId,callingUserid) } def getOrganizations(callingUserid :MetadataCat) : Future[JsValue] = { ckanRepository.getOrganizations(callingUserid) } def getDatasets(callingUserid :MetadataCat) : Future[JsValue] = { ckanRepository.getDatasets(callingUserid) } def searchDatasets( input: (MetadataCat, MetadataCat, ResourceSize, ResourceSize), callingUserid :MetadataCat) : Future[JsResult[Seq[Dataset]]] = { ckanRepository.searchDatasets(input, callingUserid) } def autocompleteDatasets( input: (MetadataCat, ResourceSize), callingUserid :MetadataCat) : Future[JsResult[Seq[AutocompRes]]] = { ckanRepository.autocompleteDatasets(input, callingUserid) } def getDatasetsWithRes( input: (ResourceSize, ResourceSize),callingUserid :MetadataCat ) : Future[JsResult[Seq[Dataset]]] = { ckanRepository.getDatasetsWithRes(input, callingUserid) } def testDataset(datasetId :String, callingUserid :MetadataCat) : Future[JsResult[Dataset]] = { ckanRepository.testDataset(datasetId, callingUserid) } } } object CkanRegistry extends CkanServiceComponent with CkanRepositoryComponent { val conf = Configuration.load(Environment.simple()) val app: String = conf.getString("app.type").getOrElse("dev") val ckanRepository = CkanRepository(app) val ckanService = new CkanService }
Example 40
Source File: AppConfig.scala From daf with BSD 3-Clause "New" or "Revised" License | 5 votes |
package it.gov.daf.catalogmanager.utilities private class AppConfig @Inject()(playConfig: Configuration) { val userIdHeader: Option[String] = playConfig.getString("app.userid.header") val ckanHost: Option[String] = playConfig.getString("app.ckan.url") val dbHost: Option[String] = playConfig.getString("mongo.host") val dbPort: Option[Int] = playConfig.getInt("mongo.port") val userName :Option[String] = playConfig.getString("mongo.username") val password :Option[String] = playConfig.getString("mongo.password") val database :Option[String] = playConfig.getString("mongo.database") val localUrl :Option[String] = playConfig.getString("app.local.url") val securityManHost :Option[String] = playConfig.getString("security.manager.host") val cookieExpiration :Option[Long] = playConfig.getLong("cookie.expiration") val ingestionUrl :Option[String] = playConfig.getString("ingestion.url") val kyloUrl: Option[String] = playConfig.getString("kylo.url") val kyloUser: Option[String] = playConfig.getString("kylo.user") val kyloPwd: Option[String] = playConfig.getString("kylo.pwd") val kafkaProxyUrl: Option[String] = playConfig.getString("kafkaProxy.url") } object ConfigReader { private val config = new AppConfig(Configuration.load(Environment.simple())) require(config.kyloUrl.nonEmpty, "A kylo url must be specified") require(config.kyloUser.nonEmpty, "A kylo user must be specified") require(config.kyloPwd.nonEmpty, "A kylo password must be specified") def userIdHeader: String = config.userIdHeader.getOrElse("userid") def getCkanHost: String = config.ckanHost.getOrElse("localhost") def getDbHost: String = config.dbHost.getOrElse("localhost") def getDbPort: Int = config.dbPort.getOrElse(27017) def database :String = config.database.getOrElse("catalog_manager") def password :String = config.password.getOrElse("") def userName :String = config.userName.getOrElse("") def localUrl :String = config.localUrl.getOrElse("http://localhost:9001") def securityManHost :String = config.securityManHost.getOrElse("http://localhost:9002/security-manager") def cookieExpiration:Long = config.cookieExpiration.getOrElse(30L)// 30 min by default def ingestionUrl :String = config.ingestionUrl.getOrElse("http://localhost:9003") def kyloUrl: String = config.kyloUrl.get def kyloUser: String = config.kyloUser.get def kyloPwd: String = config.kyloPwd.get def kafkaProxyUrl: String = config.kafkaProxyUrl.getOrElse("") }
Example 41
Source File: Authentication.scala From daf with BSD 3-Clause "New" or "Revised" License | 5 votes |
package it.gov.daf.common.authentication import java.util.Date import com.nimbusds.jwt.JWTClaimsSet import org.pac4j.core.profile.{CommonProfile, ProfileManager} import org.pac4j.jwt.config.signature.SecretSignatureConfiguration import org.pac4j.jwt.credentials.authenticator.JwtAuthenticator import org.pac4j.jwt.profile.JwtGenerator import org.pac4j.play.PlayWebContext import org.pac4j.play.store.PlaySessionStore import play.api.Configuration import play.api.mvc.{RequestHeader, Result, Results} import scala.collection.convert.decorateAsScala._ import scala.collection.mutable @SuppressWarnings( Array( "org.wartremover.warts.Throw", "org.wartremover.warts.Var" ) ) object Authentication extends Results { var configuration: Option[Configuration] = None var playSessionStore: Option[PlaySessionStore] = None var secret: Option[String] = None def apply(configuration: Configuration, playSessionStore: PlaySessionStore): Unit = { this.configuration = Some(configuration) this.playSessionStore = Some(playSessionStore) this.secret = this.configuration.flatMap(_.getString("pac4j.jwt_secret")) } def getClaims(requestHeader: RequestHeader): Option[mutable.Map[String, AnyRef]] = { val header: Option[String] = requestHeader.headers.get("Authorization") val token: Option[String] = for { h <- header t <- h.split("Bearer").lastOption } yield t.trim getClaimsFromToken(token) } def getClaimsFromToken(token: Option[String]): Option[mutable.Map[String, AnyRef]] = { val jwtAuthenticator = new JwtAuthenticator() jwtAuthenticator.addSignatureConfiguration(new SecretSignatureConfiguration(secret.getOrElse(throw new Exception("missing secret")))) token.map(jwtAuthenticator.validateTokenAndGetClaims(_).asScala) } def getProfiles(request: RequestHeader): List[CommonProfile] = { val webContext = new PlayWebContext(request, playSessionStore.getOrElse(throw new Exception("missing playSessionStore"))) val profileManager = new ProfileManager[CommonProfile](webContext) profileManager.getAll(true).asScala.toList } def getStringToken: (RequestHeader,Long) => Option[String] = (request: RequestHeader,minutes:Long) => { val generator = new JwtGenerator[CommonProfile](new SecretSignatureConfiguration(secret.getOrElse(throw new Exception("missing secret")))) val profiles = getProfiles(request) val token: Option[String] = profiles.headOption.map(profile => { val expDate = new Date( (new Date).getTime + 1000L*60L*minutes )//*60L*24L val claims = new JWTClaimsSet.Builder().expirationTime(expDate).build() profile.addAttributes(claims.getClaims) generator.generate(profile) }) token } def getToken: (RequestHeader,Long) => Result = (request: RequestHeader, minutes:Long) => { Ok(getStringToken(request,minutes).getOrElse("")) } }
Example 42
Source File: SecurityFilter.scala From daf with BSD 3-Clause "New" or "Revised" License | 5 votes |
package it.gov.daf.common.filters.authentication import javax.inject.{Inject, Singleton} import akka.stream.Materializer import org.pac4j.core.config.Config import org.pac4j.play.store.PlaySessionStore import play.api.Configuration import play.api.mvc._ import play.libs.concurrent.HttpExecutionContext import scala.concurrent.Future @SuppressWarnings( Array( "org.wartremover.warts.Overloading" ) ) @Singleton class SecurityFilter @Inject()(mat: Materializer, configuration: Configuration, playSessionStore: PlaySessionStore, config: Config, ec: HttpExecutionContext) extends org.pac4j.play.filters.SecurityFilter(mat, configuration, playSessionStore, config, ec) { override def apply(nextFilter: (RequestHeader) => Future[play.api.mvc.Result]) (request: RequestHeader): Future[play.api.mvc.Result] = { super.apply(nextFilter)(request) } }
Example 43
Source File: FeatureToggleModel.scala From smui with Apache License 2.0 | 5 votes |
package models import javax.inject.Inject import play.api.Configuration import play.twirl.api.utils.StringEscapeUtils package object FeatureToggleModel { trait JsFeatureToggleValue { def render(): String } class JsBoolFeatureToggleValue(bState: Boolean) extends JsFeatureToggleValue { override def render(): String = { bState.toString } } class JsStringFeatureToggleValue(value: String) extends JsFeatureToggleValue { override def render(): String = s""""${StringEscapeUtils.escapeEcmaScript(value)}"""" } case class JsFeatureToggle(toggleName: String, toggleValue: JsFeatureToggleValue) @javax.inject.Singleton class FeatureToggleService @Inject()(appConfig: Configuration) { private val FEATURE_TOGGLE_UI_CONCEPT_UPDOWN_RULES_COMBINED = "toggle.ui-concept.updown-rules.combined" private val FEATURE_TOGGLE_UI_CONCEPT_ALL_RULES_WITH_SOLR_FIELDS = "toggle.ui-concept.all-rules.with-solr-fields" private val FEATURE_TOGGLE_RULE_DEPLOYMENT_LOG_RULE_ID = "toggle.rule-deployment.log-rule-id" private val FEATURE_TOGGLE_RULE_DEPLOYMENT_SPLIT_DECOMPOUND_RULES_TXT = "toggle.rule-deployment.split-decompound-rules-txt" private val FEATURE_TOGGLE_RULE_DEPLOYMENT_SPLIT_DECOMPOUND_RULES_TXT_DST_CP_FILE_TO = "toggle.rule-deployment.split-decompound-rules-txt-DST_CP_FILE_TO" private val FEATURE_TOGGLE_RULE_DEPLOYMENT_PRE_LIVE_PRESENT = "toggle.rule-deployment.pre-live.present" private val FEATURE_TOGGLE_RULE_DEPLOYMENT_CUSTOM_SCRIPT = "toggle.rule-deployment.custom-script" private val FEATURE_TOGGLE_RULE_DEPLOYMENT_CUSTOM_SCRIPT_SMUI2SOLR_SH_PATH = "toggle.rule-deployment.custom-script-SMUI2SOLR-SH_PATH" private val FEATURE_TOGGLE_HEADLINE = "toggle.headline" private val ACTIVATE_RULE_TAGGING = "toggle.rule-tagging" private val PREDEFINED_TAGS_FILE = "toggle.predefined-tags-file" private val SMUI_AUTH_SIMPLE_LOGOUT = "smui.auth.ui-concept.simple-logout-button-target-url" private val SMUI_VERSION = "smui.version" def getJsFrontendToogleList: List[JsFeatureToggle] = { def jsBoolFeatureToggle(toggleKey: String, bDefault: Boolean): JsFeatureToggle = { JsFeatureToggle( toggleKey, new JsBoolFeatureToggleValue(appConfig.getOptional[Boolean](toggleKey).getOrElse(bDefault)) ) } List( jsBoolFeatureToggle(FEATURE_TOGGLE_UI_CONCEPT_UPDOWN_RULES_COMBINED, true), jsBoolFeatureToggle(FEATURE_TOGGLE_UI_CONCEPT_ALL_RULES_WITH_SOLR_FIELDS, true), jsBoolFeatureToggle(FEATURE_TOGGLE_RULE_DEPLOYMENT_PRE_LIVE_PRESENT, false), jsBoolFeatureToggle(ACTIVATE_RULE_TAGGING, false), JsFeatureToggle(FEATURE_TOGGLE_HEADLINE, new JsStringFeatureToggleValue( appConfig.getOptional[String](FEATURE_TOGGLE_HEADLINE).getOrElse("Search Management UI"))), JsFeatureToggle(SMUI_AUTH_SIMPLE_LOGOUT, new JsStringFeatureToggleValue( appConfig.getOptional[String](SMUI_AUTH_SIMPLE_LOGOUT).getOrElse(""))), JsFeatureToggle(SMUI_VERSION, new JsStringFeatureToggleValue(models.buildInfo.BuildInfo.version)) ) } def getToggleRuleDeploymentLogRuleId: Boolean = { appConfig.getOptional[Boolean](FEATURE_TOGGLE_RULE_DEPLOYMENT_LOG_RULE_ID).getOrElse(false) } def getToggleRuleDeploymentSplitDecompoundRulesTxt: Boolean = { appConfig.getOptional[Boolean](FEATURE_TOGGLE_RULE_DEPLOYMENT_SPLIT_DECOMPOUND_RULES_TXT).getOrElse(false) } def getToggleRuleDeploymentSplitDecompoundRulesTxtDstCpFileTo: String = { appConfig.getOptional[String](FEATURE_TOGGLE_RULE_DEPLOYMENT_SPLIT_DECOMPOUND_RULES_TXT_DST_CP_FILE_TO).getOrElse("") } def getToggleRuleDeploymentCustomScript: Boolean = { appConfig.getOptional[Boolean](FEATURE_TOGGLE_RULE_DEPLOYMENT_CUSTOM_SCRIPT).getOrElse(false) } def getToggleRuleDeploymentCustomScriptSmui2solrShPath: String = { appConfig.getOptional[String](FEATURE_TOGGLE_RULE_DEPLOYMENT_CUSTOM_SCRIPT_SMUI2SOLR_SH_PATH).getOrElse("") } def isRuleTaggingActive: Boolean = { appConfig.get[Boolean](ACTIVATE_RULE_TAGGING) } def predefinedTagsFileName: Option[String] = { appConfig.getOptional[String](PREDEFINED_TAGS_FILE).filter(_.nonEmpty) } } }
Example 44
Source File: BasicAuthAuthenticatedAction.scala From smui with Apache License 2.0 | 5 votes |
package controllers.auth import java.util.Base64 import play.api.{Configuration, Logging} import play.api.mvc._ import scala.concurrent.{ExecutionContext, Future} import scala.util.control.Exception.allCatch class BasicAuthAuthenticatedAction(parser: BodyParsers.Default, appConfig: Configuration)(implicit ec: ExecutionContext) extends ActionBuilderImpl(parser) with Logging { logger.debug("In BasicAuthAuthenticatedAction") val BASIC_AUTH_USER = appConfig.getOptional[String]("smui.BasicAuthAuthenticatedAction.user") match { case Some(strUser: String) => strUser case None => logger.error(":: No value for smui.BasicAuthAuthenticatedAction.user found. Setting user to super-default.") "smui" } val BASIC_AUTH_PASS = appConfig.getOptional[String]("smui.BasicAuthAuthenticatedAction.pass") match { case Some(strUser: String) => strUser case None => logger.error(":: No value for smui.BasicAuthAuthenticatedAction.pass found. Setting pass to super-default.") "smui" } override def invokeBlock[A](request: Request[A], block: Request[A] => Future[Result]): Future[Result] = { logger.debug(s":: invokeBlock :: request.path = ${request.path}") def requestAuthenticated(request: Request[A]): Boolean = { request.headers.get("Authorization") match { case Some(authorization: String) => authorization.split(" ").drop(1).headOption.filter { encoded => val authInfo = new String(Base64.getDecoder().decode(encoded.getBytes)).split(":").toList allCatch.opt { val (username, password) = (authInfo.head, authInfo(1)) username.equals(BASIC_AUTH_USER) && password.equals(BASIC_AUTH_PASS) } getOrElse false }.exists(_ => true) case None => false } } if (requestAuthenticated(request)) { block(request) } else { Future { // TODO return error JSON with authorization violation details, redirect target eventually (instead of empty 401 body) Results.Unauthorized("401 Unauthorized").withHeaders(("WWW-Authenticate", "Basic realm=SMUI")) } } } }
Example 45
Source File: JWTJsonAuthenticatedAction.scala From smui with Apache License 2.0 | 5 votes |
package controllers.auth import com.jayway.jsonpath.JsonPath import net.minidev.json.JSONArray import pdi.jwt.{JwtAlgorithm, JwtClaim, JwtJson} import play.api.mvc._ import play.api.{Configuration, Logging} import scala.concurrent.{ExecutionContext, Future} import scala.util.{Failure, Success, Try} class JWTJsonAuthenticatedAction(parser: BodyParsers.Default, appConfig: Configuration)(implicit ec: ExecutionContext) extends ActionBuilderImpl(parser) with Logging { logger.debug("In JWTJsonAuthenticatedAction") private val JWT_LOGIN_URL = getValueFromConfigWithFallback("smui.JWTJsonAuthenticatedAction.login.url", "") private val JWT_COOKIE = getValueFromConfigWithFallback("smui.JWTJsonAuthenticatedAction.cookie.name", "jwt") private val JWT_PUBLIC_KEY = getValueFromConfigWithFallback("smui.JWTJsonAuthenticatedAction.public.key", "") private val JWT_ALGORITHM = getValueFromConfigWithFallback("smui.JWTJsonAuthenticatedAction.algorithm", "rsa") private val JWT_AUTHORIZATION_ACTIVE = getValueFromConfigWithFallback("smui.JWTJsonAuthenticatedAction.authorization.active", "false").toBoolean private val JWT_ROLES_JSON_PATH = getValueFromConfigWithFallback("smui.JWTJsonAuthenticatedAction.authorization.json.path", "$.roles") private val JWT_AUTHORIZED_ROLES = getValueFromConfigWithFallback("smui.JWTJsonAuthenticatedAction.authorization.roles", "admin") private lazy val authorizedRoles = JWT_AUTHORIZED_ROLES.replaceAll("\\s", "").split(",").toSeq private def getValueFromConfigWithFallback(key: String, default: String): String = { appConfig.getOptional[String](key) match { case Some(value: String) => value case None => logger.error(s":: No value for $key found. Setting pass to super-default.") default } } private def decodeJwtToken(jwt: String): Try[JwtClaim] = { JWT_ALGORITHM match { case "hmac" => JwtJson.decode(jwt, JWT_PUBLIC_KEY, JwtAlgorithm.allHmac()) case "asymmetric" => JwtJson.decode(jwt, JWT_PUBLIC_KEY, JwtAlgorithm.allAsymmetric()) case "rsa" => JwtJson.decode(jwt, JWT_PUBLIC_KEY, JwtAlgorithm.allRSA()) case "ecdsa" => JwtJson.decode(jwt, JWT_PUBLIC_KEY, JwtAlgorithm.allECDSA()) case _ => JwtJson.decode(jwt, JWT_PUBLIC_KEY, JwtAlgorithm.allRSA()) } } private def getJwtCookie[A](request: Request[A]): Option[Cookie] = { request.cookies.get(JWT_COOKIE) } private def isAuthenticated(jwt: String): Option[JwtClaim] = { decodeJwtToken(jwt) match { case Success(token) => Some(token) case Failure(_) => None } } private def isAuthorized(token: String): Boolean = { if (JWT_AUTHORIZATION_ACTIVE) { val rolesInToken = Try(JsonPath.read[JSONArray](token, JWT_ROLES_JSON_PATH).toArray.toSeq) rolesInToken match { case Success(roles) => roles.forall(authorizedRoles.contains) case _ => false } } else true } private def redirectToLoginPage(): Future[Result] = { Future { Results.Redirect(JWT_LOGIN_URL) } } override def invokeBlock[A](request: Request[A], block: Request[A] => Future[Result]): Future[Result] = { logger.debug(s":: invokeBlock :: request.path = ${request.path}") getJwtCookie(request) match { case Some(cookie) => isAuthenticated(cookie.value) match { case Some(token) if isAuthorized(token.content) => block(request) case _ => redirectToLoginPage() } case None => redirectToLoginPage() } } }
Example 46
Source File: AuthActionFactory.scala From smui with Apache License 2.0 | 5 votes |
package controllers.auth import javax.inject.Inject import play.api.{Configuration, Logging} import play.api.mvc._ import scala.concurrent.ExecutionContext class AuthActionFactory @Inject()(parser: BodyParsers.Default, appConfig: Configuration)(implicit ec: ExecutionContext) extends Logging { private def instantiateAuthAction(strClazz: String, defaultAction: ActionBuilder[Request, AnyContent]): ActionBuilder[Request, AnyContent] = { try { // TODO if possible instanciate authenticatedAction only once, not with every controller call def instantiate(clazz: java.lang.Class[_])(args: AnyRef*): AnyRef = { val constructor = clazz.getConstructors()(0) constructor.newInstance(args: _*).asInstanceOf[AnyRef] } val authenticatedAction = instantiate( java.lang.Class.forName(strClazz) )(parser, appConfig, ec) logger.debug(":: having instanciated " + authenticatedAction.toString) authenticatedAction.asInstanceOf[ActionBuilder[Request, AnyContent]] } catch { case e: Throwable => // TODO consider stop serving requests, if an expection during bootstrap of authAction happened. DO NOT return the defaultAction. logger.error(":: Exception during instantiation of smui.authAction :: " + e.getMessage) logger.error(":: Authentication protection IS NOT ACTIVE!") defaultAction } } def getAuthenticatedAction(defaultAction: ActionBuilder[Request, AnyContent]): ActionBuilder[Request, AnyContent] = { appConfig.getOptional[String]("smui.authAction") match { case Some(strClazz: String) => if (strClazz.trim().equals("scala.None")) defaultAction else instantiateAuthAction(strClazz, defaultAction) case None => defaultAction } } }
Example 47
Source File: HomeController.scala From smui with Apache License 2.0 | 5 votes |
package controllers import javax.inject.Inject import controllers.auth.AuthActionFactory import play.api.{Configuration, Logging} import play.api.mvc._ import scala.concurrent.{ExecutionContext, Future} import models.FeatureToggleModel._ class HomeController @Inject()(cc: MessagesControllerComponents, appConfig: Configuration, featureToggleService: FeatureToggleService, authActionFactory: AuthActionFactory)(implicit executionContext: ExecutionContext) extends MessagesAbstractController(cc) with Logging { def index(urlPath: String) = authActionFactory.getAuthenticatedAction(Action).async { Future { logger.debug("In HomeController :: index") Ok( views.html.home( featureToggleService.getJsFrontendToogleList ) ) }(executionContext) // TODO eval withSecurity ... because of play.filters.headers.contentSecurityPolicy (and resolve general setup in application.conf) } // TODO refactor authorizationTestControllerAction into a proper controller behaviour test }
Example 48
Source File: AuthValidator.scala From maha with Apache License 2.0 | 5 votes |
package com.yahoo.maha.core.auth import play.api.Configuration import play.api.mvc.{RequestHeader, Result, Results} import scala.collection.immutable.Map case class ValidationResult(success: Boolean, user: Option[String]) trait AuthValidator { def init(configuration: Configuration) def validate(requestHeader: RequestHeader) : ValidationResult def handleAuthCallback(requestHeader: RequestHeader) : Result def handleAuthFailure(requestHeader: RequestHeader) : Result } class DefaultAuthValidator extends AuthValidator { override def init(configuration: Configuration): Unit = { } override def validate(requestHeader: RequestHeader): ValidationResult = { ValidationResult(success = true, user = None) } override def handleAuthCallback(requestHeader: RequestHeader): Result = { Results.Ok } override def handleAuthFailure(requestHeader: RequestHeader): Result = { Results.Ok } } trait DruidAuthHeaderProvider { def init(configuration: Configuration) def getAuthHeaders : Map[String, String] } class DefaultDruidAuthHeaderProvider extends DruidAuthHeaderProvider { override def init(configuration: Configuration): Unit = { } override def getAuthHeaders: Map[String, String] = { Map.empty } }
Example 49
Source File: Application.scala From checkers with Apache License 2.0 | 5 votes |
package controllers import com.google.inject.Inject import play.api.{Configuration, Environment} import play.api.mvc._ class Application @Inject()(implicit val config: Configuration, env: Environment) extends Controller { def index = Action { Ok(views.html.index("Checkers")) } def benchmarks = Action { Ok(views.html.benchmarks("Benchmarks")) } def logging = Action(parse.anyContent) { implicit request => request.body.asJson.foreach { msg => println(s"CLIENT - $msg") } Ok("") } }
Example 50
Source File: AuditService.scala From vat-api with Apache License 2.0 | 5 votes |
package v1.services import javax.inject.{Inject, Singleton} import play.api.libs.json.{Json, Writes} import play.api.{Configuration, Logger} import uk.gov.hmrc.http.HeaderCarrier import uk.gov.hmrc.play.audit.AuditExtensions import uk.gov.hmrc.play.audit.http.connector.{AuditConnector, AuditResult} import uk.gov.hmrc.play.audit.model.ExtendedDataEvent import uk.gov.hmrc.play.bootstrap.config.AppName import v1.models.audit.AuditEvent import scala.concurrent.{ExecutionContext, Future} @Singleton class AuditService @Inject()(auditConnector: AuditConnector, appNameConfiguration: Configuration) { val logger: Logger = Logger(this.getClass) def auditEvent[T](event: AuditEvent[T])(implicit hc: HeaderCarrier, ec: ExecutionContext, writer: Writes[T]): Future[AuditResult] = { val eventTags = AuditExtensions.auditHeaderCarrier(hc).toAuditTags() + ("transactionName" -> event.transactionName) val dataEvent = ExtendedDataEvent( auditSource = AppName.fromConfiguration(appNameConfiguration), auditType = event.auditType, detail = Json.toJson(event.detail), tags = eventTags ) logger.info(s"Audit event :- dataEvent.tags :: ${dataEvent.tags} -- auditSource:: ${dataEvent.auditSource}" + s" --- detail :: ${dataEvent.detail}") auditConnector.sendExtendedEvent(dataEvent) } }
Example 51
Source File: FeatureSwitch.scala From vat-api with Apache License 2.0 | 5 votes |
package config import play.api.Configuration case class FeatureSwitch(value: Option[Configuration]) { private val versionRegex = """(\d)\.\d""".r def isWhiteListingEnabled: Boolean = { value match { case Some(config) => config.getOptional[Boolean]("white-list.enabled").getOrElse(false) case None => false } } def whiteListedApplicationIds: Seq[String] = { value match { case Some(config) => config .getOptional[Seq[String]]("white-list.applicationIds") .getOrElse(throw new RuntimeException(s"feature-switch.white-list.applicationIds is not configured")) case None => Seq() } } def isVersionEnabled(version: String): Boolean = { val versionNoIfPresent: Option[String] = version match { case versionRegex(v) => Some(v) case _ => None } val enabled = for { versionNo <- versionNoIfPresent config <- value enabled <- config.getOptional[Boolean](s"version-$versionNo.enabled") } yield enabled enabled.getOrElse(false) } def refactorEnabled: Boolean = value match { case Some(config) => config.getOptional[Boolean] ("refactor.enabled").getOrElse(false) case None => false } def refactorProdEnabled: Boolean = value match { case Some(config) => config.getOptional[Boolean] ("refactor.prod.enabled").getOrElse(false) case None => false } }
Example 52
Source File: ControllorConfiguration.scala From vat-api with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.vatapi.config import com.typesafe.config.Config import javax.inject.Inject import net.ceedubs.ficus.Ficus._ import net.ceedubs.ficus.readers.ValueReader import play.api.Configuration import uk.gov.hmrc.play.bootstrap.config.ControllerConfig case class ControllerConfigParams(needsHeaderValidation: Boolean = true, needsLogging: Boolean = true, needsAuditing: Boolean = true, needsTaxYear: Boolean = true) class ControllerConfiguration @Inject()(configuration: Configuration) extends ControllerConfig { private implicit val controllerParamsReader: ValueReader[ControllerConfigParams] = ValueReader.relative[ControllerConfigParams] { config => ControllerConfigParams( needsHeaderValidation = config.getAs[Boolean]("needsHeaderValidation").getOrElse(true), needsLogging = config.getAs[Boolean]("needsLogging").getOrElse(true), needsAuditing = config.getAs[Boolean]("needsAuditing").getOrElse(true), needsTaxYear = config.getAs[Boolean]("needsTaxYear").getOrElse(true) ) } lazy val controllerConfigs: Config = configuration.underlying.as[Config]("controllers") def controllerParamsConfig(controllerName: String): ControllerConfigParams = { controllerConfigs .as[Option[ControllerConfigParams]](controllerName) .getOrElse(ControllerConfigParams()) } }
Example 53
Source File: MockAppConfig.scala From vat-api with Apache License 2.0 | 5 votes |
package mocks import config.AppConfig import org.scalamock.handlers.CallHandler import org.scalamock.scalatest.MockFactory import play.api.Configuration import scala.concurrent.duration.Duration trait MockAppConfig extends MockFactory { val mockAppConfig: AppConfig = mock[AppConfig] object MockedAppConfig { def desBaseUrl: CallHandler[String] = (mockAppConfig.desBaseUrl _: () => String).expects() def desToken: CallHandler[String] = (mockAppConfig.desToken _).expects() def desEnvironment: CallHandler[String] = (mockAppConfig.desEnv _).expects() def featureSwitch: CallHandler[Option[Configuration]] = (mockAppConfig.featureSwitch _: () => Option[Configuration]).expects() def apiGatewayContext: CallHandler[String] = (mockAppConfig.apiGatewayContext _: () => String).expects() def apiStatus: CallHandler[String] = (mockAppConfig.apiStatus: String => String).expects("1.0") def endpointsEnabled: CallHandler[Boolean] = (mockAppConfig.endpointsEnabled: String => Boolean).expects("1.0") // NRS config items def nrsApiKey: CallHandler[String] = (mockAppConfig.nrsApiKey _).expects() def nrsMaxTimeout: CallHandler[Duration] = (mockAppConfig.nrsMaxTimeout _).expects() def appName: CallHandler[String] = (mockAppConfig.appName _).expects() def nrsBaseUrl: CallHandler[String] = (mockAppConfig.nrsBaseUrl _).expects() } }
Example 54
Source File: FeatureSwitchSpec.scala From vat-api with Apache License 2.0 | 5 votes |
package config import com.typesafe.config.ConfigFactory import play.api.Configuration import support.UnitSpec class FeatureSwitchSpec extends UnitSpec { private def createFeatureSwitch(config: String) = FeatureSwitch(Some(Configuration(ConfigFactory.parseString(config)))) "version enabled" when { "no config" must { val featureSwitch = FeatureSwitch(None) "return false" in { featureSwitch.isVersionEnabled("1.0") shouldBe false } } "no config value" must { val featureSwitch = createFeatureSwitch("") "return false" in { featureSwitch.isVersionEnabled("1.0") shouldBe false } } "config set" must { val featureSwitch = createFeatureSwitch(""" |version-1.enabled = false |version-2.enabled = true """.stripMargin) "return false for disabled versions" in { featureSwitch.isVersionEnabled("1.0") shouldBe false } "return true for enabled versions" in { featureSwitch.isVersionEnabled("2.0") shouldBe true } "return false for non-version strings" in { featureSwitch.isVersionEnabled("x.x") shouldBe false featureSwitch.isVersionEnabled("2x") shouldBe false featureSwitch.isVersionEnabled("2.x") shouldBe false } } "refactor enabled" must { "return true when enabled" in { val featureSwitch = createFeatureSwitch( """ |refactor.enabled=true |""".stripMargin) featureSwitch.refactorEnabled shouldBe true } "return false when not enabled" in { val featureSwitch = createFeatureSwitch( """ |refactor.enabled=false |""".stripMargin) featureSwitch.refactorEnabled shouldBe false } } "refactorProd enabled" must { "return true when enabled" in { val featureSwitch = createFeatureSwitch( """ |refactor.prod.enabled=true |""".stripMargin) featureSwitch.refactorProdEnabled shouldBe true } "return false when not enabled" in { val featureSwitch = createFeatureSwitch( """ |refactor.prod.enabled=false |""".stripMargin) featureSwitch.refactorProdEnabled shouldBe false } } } }
Example 55
Source File: ViewHelpers.scala From dr-cla with BSD 3-Clause "New" or "Revised" License | 5 votes |
package helpers import java.net.URL import javax.inject.Inject import play.api.{Configuration, Environment} import scala.io.Source import scala.util.Try class ViewHelpers @Inject() (configuration: Configuration, environment: Environment) { val organizationName = configuration.get[String]("app.organization.name") val maybeOrganizationLogoUrl = configuration.getOptional[String]("app.organization.logo-url") val maybeOrganizationUrl = configuration.getOptional[String]("app.organization.url") val maybeOrganizationClaUrl = configuration.getOptional[String]("app.organization.cla-url") val claText: String = { maybeOrganizationClaUrl .flatMap(claUrl => Try(new URL(claUrl)).toOption) .orElse(environment.resource("sample-cla.html")) .map { claUrl => val text = Source.fromURL(claUrl) text.mkString } getOrElse { throw new Exception("You must set the ORG_CLA environment variable.") } } }
Example 56
Source File: DatabaseModule.scala From dr-cla with BSD 3-Clause "New" or "Revised" License | 5 votes |
package modules import com.github.mauricio.async.db.SSLConfiguration import com.github.mauricio.async.db.pool.{PartitionedConnectionPool, PoolConfiguration} import com.github.mauricio.async.db.postgresql.pool.PostgreSQLConnectionFactory import com.github.mauricio.async.db.postgresql.util.URLParser import io.getquill.{PostgresAsyncContext, SnakeCase} import javax.inject.{Inject, Singleton} import org.slf4j.LoggerFactory import play.api.inject.{ApplicationLifecycle, Binding, Module} import play.api.{Configuration, Environment} import scala.concurrent.ExecutionContext class DatabaseModule extends Module { def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]] = { Seq( bind[Database].to[DatabaseImpl] ) } } trait Database { val ctx: PostgresAsyncContext[SnakeCase] } @Singleton class DatabaseImpl @Inject()(lifecycle: ApplicationLifecycle, playConfig: Configuration) (implicit ec: ExecutionContext) extends Database { private val log = LoggerFactory.getLogger(this.getClass) private val maybeDbUrl = playConfig.getOptional[String]("db.default.url") private val config = maybeDbUrl.map(URLParser.parse(_)).getOrElse(URLParser.DEFAULT) private val configWithMaybeSsl = playConfig.getOptional[String]("db.default.sslmode").fold(config) { sslmode => val sslConfig = SSLConfiguration(Map("sslmode" -> sslmode)) config.copy(ssl = sslConfig) } private val connectionFactory = new PostgreSQLConnectionFactory(configWithMaybeSsl) private val defaultPoolConfig = PoolConfiguration.Default private val maxObjects = playConfig.getOptional[Int]("db.default.max-objects").getOrElse(defaultPoolConfig.maxObjects) private val maxIdleMillis = playConfig.getOptional[Long]("db.default.max-idle-millis").getOrElse(defaultPoolConfig.maxIdle) private val maxQueueSize = playConfig.getOptional[Int]("db.default.max-queue-size").getOrElse(defaultPoolConfig.maxQueueSize) private val validationInterval = playConfig.getOptional[Long]("db.default.max-queue-size").getOrElse(defaultPoolConfig.validationInterval) private val poolConfig = new PoolConfiguration(maxObjects, maxIdleMillis, maxQueueSize, validationInterval) private val numberOfPartitions = playConfig.getOptional[Int]("db.default.number-of-partitions").getOrElse(4) private val pool = new PartitionedConnectionPool( connectionFactory, poolConfig, numberOfPartitions, ec ) lifecycle.addStopHook { () => pool.close } val ctx = new PostgresAsyncContext(SnakeCase, pool) }
Example 57
Source File: Crypto.scala From dr-cla with BSD 3-Clause "New" or "Revised" License | 5 votes |
package utils import java.util.Base64 import javax.crypto.{Cipher, KeyGenerator} import javax.inject.Inject import play.api.Configuration class Crypto @Inject() (configuration: Configuration) { private val secretKey = { val cryptoSecret = configuration.get[String]("play.http.secret.key") val keyGenerator = KeyGenerator.getInstance("AES") keyGenerator.init(128) keyGenerator.generateKey() } def encryptAES(plainText: String): String = { val plainTextBytes = plainText.getBytes val cipher = Cipher.getInstance("AES") cipher.init(Cipher.ENCRYPT_MODE, secretKey) val encryptedButes = cipher.doFinal(plainTextBytes) Base64.getEncoder.encodeToString(encryptedButes) } def decryptAES(encryptedText: String): String = { val encryptedTextBytes = Base64.getDecoder.decode(encryptedText) val cipher = Cipher.getInstance("AES") cipher.init(Cipher.DECRYPT_MODE, secretKey) val decryptedBytes = cipher.doFinal(encryptedTextBytes) new String(decryptedBytes) } }
Example 58
Source File: MetricsRepoService.scala From prometheus-opentsdb-exporter with Apache License 2.0 | 5 votes |
package services import scala.concurrent.duration._ import java.io.{File, FileInputStream} import javax.inject._ import akka.actor.{ActorNotFound, ActorSystem} import akka.util.Timeout import play.api.libs.json._ import play.api.{Configuration, Logger} import models.Metric import actors.MetricsRepoActor import actors.MetricsRepoActor.{RegisterMetrics, ResetMetrics} @Singleton class MetricsRepoService @Inject()( configuration: Configuration, system: ActorSystem ) { private implicit val to: Timeout = 5 seconds private val metricsDir = configuration.getString("metrics.dir").get private implicit val ec = system.dispatcher private def getListOfFiles(dir: String):List[File] = { val d = new File(dir) if (d.exists && d.isDirectory) { d.listFiles.filter(_.isFile).toList.sortBy(_.getAbsolutePath) } else { Logger.warn(s"Metrics dir not found: $dir") Logger.info(s"Working dir: ${new File(".").getAbsolutePath}") List[File]() } } lazy val metricsRepo = { Logger.info(s"Initializing the metrics repo.") system.actorSelection(s"${MetricsRepoActor.name}") .resolveOne() .recover { case ActorNotFound(_) => system.actorOf(MetricsRepoActor.props(), MetricsRepoActor.name) } } def reloadMetrics(): Unit = { metricsRepo.foreach { mr => Logger.info("Loading metrics definitions.") mr ! ResetMetrics getListOfFiles(metricsDir).foreach { f => Logger.info(s"Loading metrics definitions from: ${f.getAbsolutePath}") Json.parse(new FileInputStream(f)).validate[Seq[Metric]].fold( valid = metrics => { Logger.info("Metrics definitions parsed and validating. Reloading...") mr ! RegisterMetrics(metrics) }, invalid = errors => Logger.error(errors.mkString("\n")) ) } } } reloadMetrics() }
Example 59
Source File: BaseConfig.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.models import scala.concurrent.duration.Duration import play.api.Configuration import play.api.libs.json._ import org.elastic4play.utils.Collection.distinctBy case class BaseConfig(name: String, workerNames: Seq[String], items: Seq[ConfigurationDefinitionItem], config: Option[WorkerConfig]) { def +(other: BaseConfig) = BaseConfig(name, workerNames ++ other.workerNames, distinctBy(items ++ other.items)(_.name), config.orElse(other.config)) } object BaseConfig { implicit val writes: Writes[BaseConfig] = Writes[BaseConfig] { baseConfig ⇒ Json.obj( "name" → baseConfig.name, "workers" → baseConfig.workerNames, "configurationItems" → baseConfig.items, "config" → baseConfig.config.fold(JsObject.empty)(_.jsonConfig) ) } def global(tpe: WorkerType.Type, configuration: Configuration): BaseConfig = { val typedItems = tpe match { case WorkerType.responder ⇒ Nil case WorkerType.analyzer ⇒ Seq( ConfigurationDefinitionItem( "auto_extract_artifacts", "extract artifacts from full report automatically", WorkerConfigItemType.boolean, multi = false, required = false, Some(JsFalse) ), ConfigurationDefinitionItem( "jobCache", "maximum time, in minutes, previous result is used if similar job is requested", WorkerConfigItemType.number, multi = false, required = false, configuration.getOptional[Duration]("cache.job").map(d ⇒ JsNumber(d.toMinutes)) ) ) } BaseConfig( "global", Nil, typedItems ++ Seq( ConfigurationDefinitionItem("proxy_http", "url of http proxy", WorkerConfigItemType.string, multi = false, required = false, None), ConfigurationDefinitionItem("proxy_https", "url of https proxy", WorkerConfigItemType.string, multi = false, required = false, None), ConfigurationDefinitionItem("cacerts", "certificate authorities", WorkerConfigItemType.text, multi = false, required = false, None), ConfigurationDefinitionItem( "jobTimeout", "maximum allowed job execution time (in minutes)", WorkerConfigItemType.number, multi = false, required = false, configuration.getOptional[Duration]("job.timeout").map(d ⇒ JsNumber(d.toMinutes)) ) ), None ) } val tlp = BaseConfig( "tlp", Nil, Seq( ConfigurationDefinitionItem("check_tlp", "", WorkerConfigItemType.boolean, multi = false, required = false, None), ConfigurationDefinitionItem("max_tlp", "", WorkerConfigItemType.number, multi = false, required = false, None) ), None ) val pap = BaseConfig( "pap", Nil, Seq( ConfigurationDefinitionItem("check_pap", "", WorkerConfigItemType.boolean, multi = false, required = false, None), ConfigurationDefinitionItem("max_pap", "", WorkerConfigItemType.number, multi = false, required = false, None) ), None ) }
Example 60
Source File: OrganizationSrv.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.services import javax.inject.{Inject, Singleton} import scala.concurrent.Future import scala.concurrent.duration.Duration import play.api.Configuration import play.api.cache.AsyncCacheApi import play.api.libs.json.JsObject import akka.NotUsed import akka.stream.scaladsl.Source import org.thp.cortex.models.{Organization, OrganizationModel} import org.elastic4play.controllers.Fields import org.elastic4play.database.ModifyConfig import org.elastic4play.services._ @Singleton class OrganizationSrv( cacheExpiration: Duration, organizationModel: OrganizationModel, getSrv: GetSrv, updateSrv: UpdateSrv, findSrv: FindSrv, deleteSrv: DeleteSrv, createSrv: CreateSrv, cache: AsyncCacheApi ) { @Inject() def this( config: Configuration, organizationModel: OrganizationModel, getSrv: GetSrv, updateSrv: UpdateSrv, findSrv: FindSrv, deleteSrv: DeleteSrv, createSrv: CreateSrv, cache: AsyncCacheApi ) = this(config.get[Duration]("cache.organization"), organizationModel, getSrv, updateSrv, findSrv, deleteSrv, createSrv, cache) def create(fields: Fields)(implicit authContext: AuthContext): Future[Organization] = createSrv[OrganizationModel, Organization](organizationModel, fields) def get(orgId: String): Future[Organization] = cache.getOrElseUpdate(s"org-$orgId", cacheExpiration) { getSrv[OrganizationModel, Organization](organizationModel, orgId) } def update(orgId: String, fields: Fields)(implicit Context: AuthContext): Future[Organization] = update(orgId, fields, ModifyConfig.default) def update(orgId: String, fields: Fields, modifyConfig: ModifyConfig)(implicit Context: AuthContext): Future[Organization] = { cache.remove(s"org-$orgId") updateSrv[OrganizationModel, Organization](organizationModel, orgId, fields, modifyConfig) } def update(organization: Organization, fields: Fields)(implicit Context: AuthContext): Future[Organization] = update(organization, fields, ModifyConfig.default) def update(organization: Organization, fields: Fields, modifyConfig: ModifyConfig)(implicit Context: AuthContext): Future[Organization] = { cache.remove(s"org-${organization.id}") updateSrv(organization, fields, modifyConfig) } def delete(orgId: String)(implicit Context: AuthContext): Future[Organization] = { cache.remove(s"org-$orgId") deleteSrv[OrganizationModel, Organization](organizationModel, orgId) } def find(queryDef: QueryDef, range: Option[String], sortBy: Seq[String]): (Source[Organization, NotUsed], Future[Long]) = findSrv[OrganizationModel, Organization](organizationModel, queryDef, range, sortBy) def stats(queryDef: QueryDef, aggs: Seq[Agg]): Future[JsObject] = findSrv(organizationModel, queryDef, aggs: _*) }
Example 61
Source File: AnalyzerConfigSrv.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.services import scala.concurrent.{ExecutionContext, Future} import play.api.Configuration import akka.stream.Materializer import javax.inject.{Inject, Singleton} import org.thp.cortex.models.{BaseConfig, WorkerConfigModel, WorkerType} import org.elastic4play.services.{CreateSrv, FindSrv, UpdateSrv} @Singleton class AnalyzerConfigSrv @Inject()( val configuration: Configuration, val workerConfigModel: WorkerConfigModel, val userSrv: UserSrv, val organizationSrv: OrganizationSrv, val workerSrv: WorkerSrv, val createSrv: CreateSrv, val updateSrv: UpdateSrv, val findSrv: FindSrv, implicit val ec: ExecutionContext, implicit val mat: Materializer ) extends WorkerConfigSrv { override val workerType: WorkerType.Type = WorkerType.analyzer def definitions: Future[Map[String, BaseConfig]] = buildDefinitionMap(workerSrv.listAnalyzerDefinitions._1) }
Example 62
Source File: CortexAuthSrv.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.services import javax.inject.{Inject, Singleton} import scala.collection.immutable import scala.concurrent.ExecutionContext import play.api.{Configuration, Logger} import org.elastic4play.services.AuthSrv import org.elastic4play.services.auth.MultiAuthSrv object CortexAuthSrv { private[CortexAuthSrv] lazy val logger = Logger(getClass) def getAuthSrv(authTypes: Seq[String], authModules: immutable.Set[AuthSrv]): Seq[AuthSrv] = ("key" +: authTypes.filterNot(_ == "key")) .flatMap { authType ⇒ authModules .find(_.name == authType) .orElse { logger.error(s"Authentication module $authType not found") None } } } @Singleton class CortexAuthSrv @Inject()( configuration: Configuration, authModules: immutable.Set[AuthSrv], userSrv: UserSrv, implicit override val ec: ExecutionContext ) extends MultiAuthSrv( CortexAuthSrv.getAuthSrv(configuration.getDeprecated[Option[Seq[String]]]("auth.provider", "auth.type").getOrElse(Seq("local")), authModules), ec ) { // Uncomment the following lines if you want to prevent user with key to use password to authenticate // override def authenticate(username: String, password: String)(implicit request: RequestHeader): Future[AuthContext] = // userSrv.get(username) // .transformWith { // case Success(user) if user.key().isDefined ⇒ Future.failed(AuthenticationError("Authentication by password is not permitted for user with key")) // case _: Success[_] ⇒ super.authenticate(username, password) // case _: Failure[_] ⇒ Future.failed(AuthenticationError("Authentication failure")) // } }
Example 63
Source File: SimpleUserMapper.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.services.mappers import scala.concurrent.{ExecutionContext, Future} import play.api.Configuration import play.api.libs.json._ import javax.inject.Inject import org.elastic4play.AuthenticationError import org.elastic4play.controllers.Fields class SimpleUserMapper( loginAttrName: String, nameAttrName: String, rolesAttrName: Option[String], organizationAttrName: Option[String], defaultRoles: Seq[String], defaultOrganization: Option[String], implicit val ec: ExecutionContext ) extends UserMapper { @Inject() def this(configuration: Configuration, ec: ExecutionContext) = this( configuration.getOptional[String]("auth.sso.attributes.login").getOrElse("name"), configuration.getOptional[String]("auth.sso.attributes.name").getOrElse("username"), configuration.getOptional[String]("auth.sso.attributes.roles"), configuration.getOptional[String]("auth.sso.attributes.organization"), configuration.getOptional[Seq[String]]("auth.sso.defaultRoles").getOrElse(Seq()), configuration.getOptional[String]("auth.sso.defaultOrganization"), ec ) override val name: String = "simple" override def getUserFields(jsValue: JsValue, authHeader: Option[(String, String)]): Future[Fields] = { val fields = for { login ← (jsValue \ loginAttrName).validate[String] name ← (jsValue \ nameAttrName).validate[String] roles = rolesAttrName.fold(defaultRoles)(r ⇒ (jsValue \ r).asOpt[Seq[String]].getOrElse(defaultRoles)) organization ← organizationAttrName .flatMap(o ⇒ (jsValue \ o).asOpt[String]) .orElse(defaultOrganization) .fold[JsResult[String]](JsError())(o ⇒ JsSuccess(o)) } yield Fields(Json.obj("login" → login, "name" → name, "roles" → roles, "organization" → organization)) fields match { case JsSuccess(f, _) ⇒ Future.successful(f) case JsError(errors) ⇒ Future.failed(AuthenticationError(s"User info fails: ${errors.map(_._1).mkString}")) } } }
Example 64
Source File: GroupUserMapper.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.services.mappers import scala.concurrent.{ExecutionContext, Future} import play.api.Configuration import play.api.libs.json._ import play.api.libs.ws.WSClient import javax.inject.Inject import org.elastic4play.AuthenticationError import org.elastic4play.controllers.Fields class GroupUserMapper( loginAttrName: String, nameAttrName: String, rolesAttrName: Option[String], groupAttrName: String, organizationAttrName: Option[String], defaultRoles: Seq[String], defaultOrganization: Option[String], groupsUrl: String, mappings: Map[String, Seq[String]], ws: WSClient, implicit val ec: ExecutionContext ) extends UserMapper { @Inject() def this(configuration: Configuration, ws: WSClient, ec: ExecutionContext) = this( configuration.getOptional[String]("auth.sso.attributes.login").getOrElse("name"), configuration.getOptional[String]("auth.sso.attributes.name").getOrElse("username"), configuration.getOptional[String]("auth.sso.attributes.roles"), configuration.getOptional[String]("auth.sso.attributes.groups").getOrElse(""), configuration.getOptional[String]("auth.sso.attributes.organization"), configuration.getOptional[Seq[String]]("auth.sso.defaultRoles").getOrElse(Seq()), configuration.getOptional[String]("auth.sso.defaultOrganization"), configuration.getOptional[String]("auth.sso.groups.url").getOrElse(""), configuration.getOptional[Map[String, Seq[String]]]("auth.sso.groups.mappings").getOrElse(Map()), ws, ec ) override val name: String = "group" override def getUserFields(jsValue: JsValue, authHeader: Option[(String, String)]): Future[Fields] = { val apiCall = authHeader.fold(ws.url(groupsUrl))(headers ⇒ ws.url(groupsUrl).addHttpHeaders(headers)) apiCall.get.flatMap { r ⇒ val jsonGroups = (r.json \ groupAttrName).as[Seq[String]] val mappedRoles = jsonGroups.flatMap(mappings.get).maxBy(_.length) val roles = if (mappedRoles.nonEmpty) mappedRoles else defaultRoles val fields = for { login ← (jsValue \ loginAttrName).validate[String] name ← (jsValue \ nameAttrName).validate[String] organization ← organizationAttrName .flatMap(o ⇒ (jsValue \ o).asOpt[String]) .orElse(defaultOrganization) .fold[JsResult[String]](JsError())(o ⇒ JsSuccess(o)) } yield Fields(Json.obj("login" → login, "name" → name, "roles" → roles, "organization" → organization)) fields match { case JsSuccess(f, _) ⇒ Future.successful(f) case JsError(errors) ⇒ Future.failed(AuthenticationError(s"User info fails: ${errors.map(_._1).mkString}")) } } } }
Example 65
Source File: ResponderConfigSrv.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.services import scala.concurrent.{ExecutionContext, Future} import play.api.Configuration import akka.stream.Materializer import javax.inject.{Inject, Singleton} import org.thp.cortex.models.{BaseConfig, WorkerConfigModel, WorkerType} import org.elastic4play.services.{CreateSrv, FindSrv, UpdateSrv} @Singleton class ResponderConfigSrv @Inject()( val configuration: Configuration, val workerConfigModel: WorkerConfigModel, val userSrv: UserSrv, val organizationSrv: OrganizationSrv, val workerSrv: WorkerSrv, val createSrv: CreateSrv, val updateSrv: UpdateSrv, val findSrv: FindSrv, implicit val ec: ExecutionContext, implicit val mat: Materializer ) extends WorkerConfigSrv { override val workerType: WorkerType.Type = WorkerType.responder def definitions: Future[Map[String, BaseConfig]] = buildDefinitionMap(workerSrv.listResponderDefinitions._1) }
Example 66
Source File: StatusCtrl.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.controllers import scala.concurrent.ExecutionContext import play.api.Configuration import play.api.http.Status import play.api.libs.json.Json.toJsFieldJsValueWrapper import play.api.libs.json.{JsBoolean, JsString, Json} import play.api.mvc.{AbstractController, Action, AnyContent, ControllerComponents} import com.sksamuel.elastic4s.http.ElasticDsl import javax.inject.{Inject, Singleton} import org.elasticsearch.client.Node import org.thp.cortex.models.Worker import org.elastic4play.database.DBIndex import org.elastic4play.services.AuthSrv import org.elastic4play.services.auth.MultiAuthSrv @Singleton class StatusCtrl @Inject()( configuration: Configuration, authSrv: AuthSrv, dbIndex: DBIndex, components: ControllerComponents, implicit val ec: ExecutionContext ) extends AbstractController(components) with Status { private[controllers] def getVersion(c: Class[_]) = Option(c.getPackage.getImplementationVersion).getOrElse("SNAPSHOT") def get: Action[AnyContent] = Action { Ok( Json.obj( "versions" → Json.obj( "Cortex" → getVersion(classOf[Worker]), "Elastic4Play" → getVersion(classOf[AuthSrv]), "Play" → getVersion(classOf[AbstractController]), "Elastic4s" → getVersion(classOf[ElasticDsl]), "ElasticSearch client" → getVersion(classOf[Node]) ), "config" → Json.obj( "protectDownloadsWith" → configuration.get[String]("datastore.attachment.password"), "authType" → (authSrv match { case multiAuthSrv: MultiAuthSrv ⇒ multiAuthSrv.authProviders.map { a ⇒ JsString(a.name) } case _ ⇒ JsString(authSrv.name) }), "capabilities" → authSrv.capabilities.map(c ⇒ JsString(c.toString)), "ssoAutoLogin" → JsBoolean(configuration.getOptional[Boolean]("auth.sso.autologin").getOrElse(false)) ) ) ) } def health: Action[AnyContent] = TODO }
Example 67
Source File: AttachmentCtrl.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.controllers import java.net.URLEncoder import java.nio.file.Files import javax.inject.{Inject, Singleton} import play.api.http.HttpEntity import play.api.libs.Files.DefaultTemporaryFileCreator import play.api.mvc._ import play.api.{mvc, Configuration} import akka.stream.scaladsl.FileIO import net.lingala.zip4j.core.ZipFile import net.lingala.zip4j.model.ZipParameters import net.lingala.zip4j.util.Zip4jConstants import org.thp.cortex.models.Roles import org.elastic4play.Timed import org.elastic4play.controllers.{Authenticated, Renderer} import org.elastic4play.models.AttachmentAttributeFormat import org.elastic4play.services.AttachmentSrv @Timed("controllers.AttachmentCtrl.downloadZip") def downloadZip(hash: String, name: Option[String]): Action[AnyContent] = authenticated(Roles.read) { _ ⇒ if (!name.getOrElse("").intersect(AttachmentAttributeFormat.forbiddenChar).isEmpty) BadRequest("File name is invalid") else { val f = tempFileCreator.create("zip", hash).path Files.delete(f) val zipFile = new ZipFile(f.toFile) val zipParams = new ZipParameters zipParams.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_FASTEST) zipParams.setEncryptFiles(true) zipParams.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD) zipParams.setPassword(password) zipParams.setFileNameInZip(name.getOrElse(hash)) zipParams.setSourceExternalStream(true) zipFile.addStream(attachmentSrv.stream(hash), zipParams) Result( header = ResponseHeader( 200, Map( "Content-Disposition" → s"""attachment; filename="${URLEncoder.encode(name.getOrElse(hash), "utf-8")}.zip"""", "Content-Type" → "application/zip", "Content-Transfer-Encoding" → "binary", "Content-Length" → Files.size(f).toString ) ), body = HttpEntity.Streamed(FileIO.fromPath(f), Some(Files.size(f)), Some("application/zip")) ) } } }
Example 68
Source File: JsonConfig.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex.util import com.typesafe.config.ConfigValueType.{BOOLEAN, NULL, NUMBER, STRING} import com.typesafe.config.{ConfigList, ConfigObject, ConfigValue} import play.api.Configuration import play.api.libs.json._ import scala.collection.JavaConverters._ object JsonConfig { implicit val configValueWrites: Writes[ConfigValue] = Writes( (value: ConfigValue) ⇒ value match { case v: ConfigObject ⇒ configWrites.writes(Configuration(v.toConfig)) case v: ConfigList ⇒ JsArray(v.asScala.map(x ⇒ configValueWrites.writes(x))) case v if v.valueType == NUMBER ⇒ JsNumber(BigDecimal(v.unwrapped.asInstanceOf[Number].toString)) case v if v.valueType == BOOLEAN ⇒ JsBoolean(v.unwrapped.asInstanceOf[Boolean]) case v if v.valueType == NULL ⇒ JsNull case v if v.valueType == STRING ⇒ JsString(v.unwrapped.asInstanceOf[String]) } ) implicit def configWrites = OWrites { (cfg: Configuration) ⇒ JsObject(cfg.subKeys.map(key ⇒ key → configValueWrites.writes(cfg.underlying.getValue(key))).toSeq) } }
Example 69
Source File: Module.scala From Cortex with GNU Affero General Public License v3.0 | 5 votes |
package org.thp.cortex import java.lang.reflect.Modifier import com.google.inject.AbstractModule import net.codingwell.scalaguice.{ScalaModule, ScalaMultibinder} import play.api.libs.concurrent.AkkaGuiceSupport import play.api.{Configuration, Environment, Logger, Mode} import scala.collection.JavaConverters._ import com.google.inject.name.Names import org.reflections.Reflections import org.reflections.scanners.SubTypesScanner import org.reflections.util.ConfigurationBuilder import org.thp.cortex.models.{AuditedModel, Migration} import org.thp.cortex.services._ import org.elastic4play.models.BaseModelDef import org.elastic4play.services.auth.MultiAuthSrv import org.elastic4play.services.{UserSrv ⇒ EUserSrv, AuthSrv, MigrationOperations} import org.thp.cortex.controllers.{AssetCtrl, AssetCtrlDev, AssetCtrlProd} import services.mappers.{MultiUserMapperSrv, UserMapper} class Module(environment: Environment, configuration: Configuration) extends AbstractModule with ScalaModule with AkkaGuiceSupport { private lazy val logger = Logger(s"module") override def configure(): Unit = { val modelBindings = ScalaMultibinder.newSetBinder[BaseModelDef](binder) val auditedModelBindings = ScalaMultibinder.newSetBinder[AuditedModel](binder) val reflectionClasses = new Reflections( new ConfigurationBuilder() .forPackages("org.elastic4play") .addClassLoader(getClass.getClassLoader) .addClassLoader(environment.getClass.getClassLoader) .forPackages("org.thp.cortex") .setExpandSuperTypes(false) .setScanners(new SubTypesScanner(false)) ) reflectionClasses .getSubTypesOf(classOf[BaseModelDef]) .asScala .filterNot(c ⇒ Modifier.isAbstract(c.getModifiers)) .foreach { modelClass ⇒ logger.info(s"Loading model $modelClass") modelBindings.addBinding.to(modelClass) if (classOf[AuditedModel].isAssignableFrom(modelClass)) { auditedModelBindings.addBinding.to(modelClass.asInstanceOf[Class[AuditedModel]]) } } val authBindings = ScalaMultibinder.newSetBinder[AuthSrv](binder) reflectionClasses .getSubTypesOf(classOf[AuthSrv]) .asScala .filterNot(c ⇒ Modifier.isAbstract(c.getModifiers) || c.isMemberClass) .filterNot(c ⇒ c == classOf[MultiAuthSrv] || c == classOf[CortexAuthSrv]) .foreach { authSrvClass ⇒ logger.info(s"Loading authentication module $authSrvClass") authBindings.addBinding.to(authSrvClass) } val ssoMapperBindings = ScalaMultibinder.newSetBinder[UserMapper](binder) reflectionClasses .getSubTypesOf(classOf[UserMapper]) .asScala .filterNot(c ⇒ Modifier.isAbstract(c.getModifiers) || c.isMemberClass) .filterNot(c ⇒ c == classOf[MultiUserMapperSrv]) .foreach(mapperCls ⇒ ssoMapperBindings.addBinding.to(mapperCls)) if (environment.mode == Mode.Prod) bind[AssetCtrl].to[AssetCtrlProd] else bind[AssetCtrl].to[AssetCtrlDev] bind[EUserSrv].to[UserSrv] bind[Int].annotatedWith(Names.named("databaseVersion")).toInstance(models.modelVersion) bind[UserMapper].to[MultiUserMapperSrv] bind[AuthSrv].to[CortexAuthSrv] bind[MigrationOperations].to[Migration] bindActor[AuditActor]("audit") } }
Example 70
Source File: Bindings.scala From dependency with MIT License | 5 votes |
package io.flow.dependency.www.lib import play.api.{Configuration, Environment, Mode} import play.api.inject.Module class DependencyClientProviderModule extends Module { def bindings(env: Environment, conf: Configuration) = { env.mode match { case Mode.Prod | Mode.Dev => Seq( bind[DependencyClientProvider].to[DefaultDependencyClientProvider] ) case Mode.Test => Seq( // TODO: Add mock bind[DependencyClientProvider].to[DependencyClientProvider] ) } } }
Example 71
Source File: Bindings.scala From dependency with MIT License | 5 votes |
package io.flow.dependency.api.lib import play.api.inject.Module import play.api.{Configuration, Environment, Mode} class GithubModule extends Module { def bindings(env: Environment, conf: Configuration) = { env.mode match { case Mode.Prod | Mode.Dev => Seq( bind[Github].to[DefaultGithub] ) case Mode.Test => Seq( bind[Github].to[MockGithub] ) } } }
Example 72
Source File: SimpleServer.scala From akka-http-test with Apache License 2.0 | 5 votes |
package com.github.dnvriend.component.simpleserver import javax.inject.Inject import akka.actor.ActorSystem import akka.event.{ Logging, LoggingAdapter } import akka.http.scaladsl._ import akka.pattern.CircuitBreaker import akka.stream.{ ActorMaterializer, Materializer } import com.github.dnvriend.component.repository.PersonRepository import com.github.dnvriend.component.simpleserver.route._ import com.google.inject.Singleton import play.api.Configuration import scala.concurrent.ExecutionContext import scala.concurrent.duration._ @Singleton class SimpleServer @Inject() (personDao: PersonRepository, cb: CircuitBreaker, interface: String, port: Int)(implicit system: ActorSystem, mat: Materializer, ec: ExecutionContext) { Http().bindAndHandle(SimpleServerRestRoutes.routes(personDao, cb), interface, port) } object SimpleServerLauncher extends App { implicit val system: ActorSystem = ActorSystem() implicit val mat: Materializer = ActorMaterializer() implicit val ec: ExecutionContext = system.dispatcher implicit val log: LoggingAdapter = Logging(system, this.getClass) val maxFailures: Int = 3 val callTimeout: FiniteDuration = 1.seconds val resetTimeout: FiniteDuration = 10.seconds val cb = new CircuitBreaker(system.scheduler, maxFailures, callTimeout, resetTimeout) val config: play.api.Configuration = Configuration(system.settings.config) sys.addShutdownHook { system.terminate() } new SimpleServer(new PersonRepository, cb, config.getString("http.interface").getOrElse("0.0.0.0"), config.getInt("http.port").getOrElse(8080)) }
Example 73
Source File: Module.scala From akka-http-test with Apache License 2.0 | 5 votes |
import javax.inject.Inject import akka.actor.ActorSystem import akka.pattern.CircuitBreaker import akka.stream.Materializer import com.github.dnvriend.component.repository.PersonRepository import com.github.dnvriend.component.simpleserver.SimpleServer import com.google.inject.{ AbstractModule, Provider, Provides } import play.api.Configuration import play.api.libs.concurrent.AkkaGuiceSupport import scala.concurrent.ExecutionContext import scala.concurrent.duration._ class Module extends AbstractModule with AkkaGuiceSupport { override def configure(): Unit = { bind(classOf[SimpleServer]) .toProvider(classOf[SimpleServerProvider]) .asEagerSingleton() } @Provides def circuitBreakerProvider(system: ActorSystem)(implicit ec: ExecutionContext): CircuitBreaker = { val maxFailures: Int = 3 val callTimeout: FiniteDuration = 1.seconds val resetTimeout: FiniteDuration = 10.seconds new CircuitBreaker(system.scheduler, maxFailures, callTimeout, resetTimeout) } } // alternative way to provide services class SimpleServerProvider @Inject() (personRepository: PersonRepository, cb: CircuitBreaker, config: Configuration)(implicit system: ActorSystem, mat: Materializer, ec: ExecutionContext) extends Provider[SimpleServer] { override def get(): SimpleServer = new SimpleServer(personRepository, cb, config.getString("http.interface").getOrElse("0.0.0.0"), config.getInt("http.port").getOrElse(8080)) }
Example 74
Source File: IAMClient.scala From play-zhewbacca with MIT License | 5 votes |
package org.zalando.zhewbacca import java.util.concurrent.atomic.AtomicInteger import javax.inject.{Inject, Singleton} import akka.actor.ActorSystem import akka.pattern.CircuitBreaker import org.zalando.zhewbacca.metrics.PluggableMetrics import play.api.http.Status._ import play.api.libs.ws.WSClient import play.api.{Configuration, Logger} import scala.concurrent.duration._ import scala.concurrent.{ExecutionContext, Future} import scala.util.control.NonFatal import atmos.dsl._ import atmos.dsl.Slf4jSupport._ @Singleton class IAMClient @Inject() ( config: Configuration, pluggableMetrics: PluggableMetrics, ws: WSClient, actorSystem: ActorSystem, implicit val ec: ExecutionContext) extends (OAuth2Token => Future[Option[TokenInfo]]) { val logger: Logger = Logger("security.IAMClient") val METRICS_BREAKER_CLOSED = 0 val METRICS_BREAKER_OPEN = 1 val circuitStatus = new AtomicInteger() pluggableMetrics.gauge { circuitStatus.get } val authEndpoint: String = config.getOptional[String]("authorisation.iam.endpoint").getOrElse( throw new IllegalArgumentException("Authorisation: IAM endpoint is not configured")) val breakerMaxFailures: Int = config.getOptional[Int]("authorisation.iam.cb.maxFailures").getOrElse( throw new IllegalArgumentException("Authorisation: Circuit Breaker max failures is not configured")) val breakerCallTimeout: FiniteDuration = config.getOptional[FiniteDuration]("authorisation.iam.cb.callTimeout").getOrElse( throw new IllegalArgumentException("Authorisation: Circuit Breaker call timeout is not configured")) val breakerResetTimeout: FiniteDuration = config.getOptional[FiniteDuration]("authorisation.iam.cb.resetTimeout").getOrElse( throw new IllegalArgumentException("Authorisation: Circuit Breaker reset timeout is not configured")) val breakerMaxRetries: TerminationPolicy = config.getOptional[Int]("authorisation.iam.maxRetries").getOrElse( throw new IllegalArgumentException("Authorisation: Circuit Breaker max retries is not configured")).attempts val breakerRetryBackoff: FiniteDuration = config.getOptional[FiniteDuration]("authorisation.iam.retry.backoff.duration").getOrElse( throw new IllegalArgumentException("Authorisation: Circuit Breaker the duration of exponential backoff is not configured")) lazy val breaker: CircuitBreaker = new CircuitBreaker( actorSystem.scheduler, breakerMaxFailures, breakerCallTimeout, breakerResetTimeout).onHalfOpen { circuitStatus.set(METRICS_BREAKER_OPEN) }.onOpen { circuitStatus.set(METRICS_BREAKER_OPEN) }.onClose { circuitStatus.set(METRICS_BREAKER_CLOSED) } implicit val retryRecover = retryFor { breakerMaxRetries } using { exponentialBackoff { breakerRetryBackoff } } monitorWith { logger.logger onRetrying logNothing onInterrupted logWarning onAborted logError } override def apply(token: OAuth2Token): Future[Option[TokenInfo]] = { breaker.withCircuitBreaker( pluggableMetrics.timing( retryAsync(s"Calling $authEndpoint") { ws.url(authEndpoint).withQueryStringParameters(("access_token", token.value)).get() })).map { response => response.status match { case OK => Some(response.json.as[TokenInfo]) case _ => None } } recover { case NonFatal(e) => logger.error(s"Exception occurred during validation of token '${token.toSafeString}': $e") None // consider any exception as invalid token } } }
Example 75
Source File: SecurityRulesRepository.scala From play-zhewbacca with MIT License | 5 votes |
package org.zalando.zhewbacca import javax.inject.Inject import com.typesafe.config.{Config, ConfigFactory} import play.api.{Configuration, Logger} import scala.collection.JavaConverters._ import play.api.http.HttpVerbs._ import play.api.mvc.RequestHeader class SecurityRulesRepository @Inject() (configuration: Configuration, provider: AuthProvider) { private val logger = Logger(getClass) private val SupportedHttpMethods: Set[String] = Set(GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS) private val ConfigKeyMethod = "method" private val ConfigKeyPathRegex = "pathRegex" private val ConfigKeyScopes = "scopes" private val ConfigKeyAllowed = "allowed" private val ConfigKeyRules = "rules" private val rules: Seq[StrictRule] = load() def get(requestHeader: RequestHeader): Option[StrictRule] = rules.find(_.isApplicableTo(requestHeader)) private def load(): Seq[StrictRule] = { val securityRulesFileName = configuration.getOptional[String]("authorisation.rules.file").getOrElse("security_rules.conf") logger.info(s"Configuration file for security rules: $securityRulesFileName") if (configFileExists(securityRulesFileName)) { ConfigFactory.load(securityRulesFileName) .getConfigList(ConfigKeyRules).asScala .map(toRule) } else { sys.error(s"configuration file $securityRulesFileName for security rules not found") } } private def toRule(config: Config): StrictRule = { (getHttpMethod(config), config.getString(ConfigKeyPathRegex), getAllowedFlag(config), getScopeNames(config)) match { case (Some(method), pathRegex, Some(true), _) => logger.info(s"Explicitly allowed unauthorized requests for method: '$method' and path regex: '$pathRegex'") ExplicitlyAllowedRule(method, pathRegex) case (Some(method), pathRegex, Some(false), _) => logger.info(s"Explicitly denied all requests for method: '$method' and path regex: '$pathRegex'") ExplicitlyDeniedRule(method, pathRegex) case (Some(method), pathRegex, None, Some(scopeNames)) => logger.info(s"Configured required scopes '$scopeNames' for method '$method' and path regex: '$pathRegex'") ValidateTokenRule(provider, method, pathRegex, Scope(scopeNames)) case _ => sys.error(s"Invalid config: $config") } } private def configFileExists(fileName: String): Boolean = Option(Thread.currentThread() .getContextClassLoader .getResource(fileName)) .isDefined private def getHttpMethod(config: Config): Option[String] = { if (SupportedHttpMethods(config.getString(ConfigKeyMethod))) { Some(config.getString(ConfigKeyMethod)) } else { None } } private def getAllowedFlag(config: Config): Option[Boolean] = { if (config.hasPath(ConfigKeyAllowed)) { Some(config.getBoolean(ConfigKeyAllowed)) } else { None } } private def getScopeNames(config: Config): Option[Set[String]] = { if (config.hasPath(ConfigKeyScopes)) { Some(config.getStringList(ConfigKeyScopes).asScala.toSet) } else { None } } }
Example 76
Source File: SecurityRulesRepositorySpec.scala From play-zhewbacca with MIT License | 5 votes |
package org.zalando.zhewbacca import org.specs2.mock.Mockito import org.specs2.mutable.Specification import play.api.Configuration import play.api.test.FakeRequest import scala.concurrent.ExecutionContext class SecurityRulesRepositorySpec extends Specification with Mockito { "SecurityRulesRepository" should { "load rules from default file" in { val provider = mock[AuthProvider] val repository = new SecurityRulesRepository(Configuration(), provider) val expectedRule = ValidateTokenRule(provider, "GET", "/foo", Scope(Set("uid", "entity.read"))) repository.get(FakeRequest("GET", "/foo")) must beSome(expectedRule) } "load rules from custom file" in { val provider = mock[AuthProvider] val config = Configuration("authorisation.rules.file" -> "security_custom-security.conf") val repository = new SecurityRulesRepository(config, provider) val expectedRule = ValidateTokenRule(provider, "POST", "/bar.*", Scope(Set("uid"))) repository.get(FakeRequest("POST", "/bar.*")) must beSome(expectedRule) } "raise an error when custom file is not available" in { val authProvider = mock[AuthProvider] val config = Configuration("authorisation.rules.file" -> "this-file-does-not-exist.conf") new SecurityRulesRepository(config, authProvider) must throwA[RuntimeException]("configuration file this-file-does-not-exist.conf for security rules not found") } "allow comments in security rules configuration file" in { val provider = mock[AuthProvider] val config = Configuration("authorisation.rules.file" -> "security_commented.conf") val repository = new SecurityRulesRepository(config, provider) val expectedRule = ValidateTokenRule(provider, "OPTIONS", "/", Scope(Set("app.resource.read"))) repository.get(FakeRequest("OPTIONS", "/")) must beSome(expectedRule) } "raise an error when it cannot parse a configuration file" in { val authProvider = mock[AuthProvider] def config(fileName: String): Configuration = Configuration("authorisation.rules.file" -> fileName) new SecurityRulesRepository(config("security_unknown-http-method.conf"), authProvider) must throwA[RuntimeException] new SecurityRulesRepository(config("security_no-scopes.conf"), authProvider) must throwA[RuntimeException] } "return None if there is no configured rules for given request" in { val authProvider = mock[AuthProvider] val repository = new SecurityRulesRepository(Configuration(), authProvider) repository.get(FakeRequest("GET", "/unknown-uri")) must beNone } "allow explicitly to pass-through or deny a request for a specific URI" in { val authProvider = mock[AuthProvider] val configuration = Configuration("authorisation.rules.file" -> "security_pass-through.conf") val repository = new SecurityRulesRepository(configuration, authProvider) repository.get(FakeRequest("GET", "/foo")).get must beAnInstanceOf[ExplicitlyAllowedRule] repository.get(FakeRequest("GET", "/bar")).get must beAnInstanceOf[ExplicitlyDeniedRule] } } }
Example 77
Source File: SignInController.scala From play-silhouette-reactivemongo-seed with Apache License 2.0 | 5 votes |
package controllers import javax.inject.Inject import com.mohiva.play.silhouette.api.Authenticator.Implicits._ import com.mohiva.play.silhouette.api._ import com.mohiva.play.silhouette.api.exceptions.ProviderException import com.mohiva.play.silhouette.api.repositories.AuthInfoRepository import com.mohiva.play.silhouette.api.util.{ Clock, Credentials } import com.mohiva.play.silhouette.impl.exceptions.IdentityNotFoundException import com.mohiva.play.silhouette.impl.providers._ import forms.SignInForm import models.services.UserService import net.ceedubs.ficus.Ficus._ import play.api.Configuration import play.api.i18n.{ I18nSupport, Messages, MessagesApi } import play.api.libs.concurrent.Execution.Implicits._ import play.api.mvc.Controller import utils.auth.DefaultEnv import scala.concurrent.Future import scala.concurrent.duration._ import scala.language.postfixOps def submit = silhouette.UnsecuredAction.async { implicit request => SignInForm.form.bindFromRequest.fold( form => Future.successful(BadRequest(views.html.signIn(form, socialProviderRegistry))), data => { val credentials = Credentials(data.email, data.password) credentialsProvider.authenticate(credentials).flatMap { loginInfo => val result = Redirect(routes.ApplicationController.index()) userService.retrieve(loginInfo).flatMap { case Some(user) if !user.activated => Future.successful(Ok(views.html.activateAccount(data.email))) case Some(user) => val c = configuration.underlying silhouette.env.authenticatorService.create(loginInfo).map { case authenticator if data.rememberMe => authenticator.copy( expirationDateTime = clock.now + c.as[FiniteDuration]("silhouette.authenticator.rememberMe.authenticatorExpiry"), idleTimeout = c.getAs[FiniteDuration]("silhouette.authenticator.rememberMe.authenticatorIdleTimeout"), cookieMaxAge = c.getAs[FiniteDuration]("silhouette.authenticator.rememberMe.cookieMaxAge") ) case authenticator => authenticator }.flatMap { authenticator => silhouette.env.eventBus.publish(LoginEvent(user, request)) silhouette.env.authenticatorService.init(authenticator).flatMap { v => silhouette.env.authenticatorService.embed(v, result) } } case None => Future.failed(new IdentityNotFoundException("Couldn't find user")) } }.recover { case e: ProviderException => Redirect(routes.SignInController.view()).flashing("error" -> Messages("invalid.credentials")) } } ) } }
Example 78
Source File: ServiceRegistrationModule.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.internal.server import java.net.URI import java.util.function.{ Function => JFunction } import akka.actor.CoordinatedShutdown import akka.Done import akka.NotUsed import com.lightbend.lagom.internal.javadsl.registry.ServiceRegistry import com.lightbend.lagom.internal.javadsl.registry.ServiceRegistryService import com.lightbend.lagom.internal.javadsl.server.ResolvedServices import com.lightbend.lagom.devmode.internal.registry.serviceDnsRecords import com.typesafe.config.Config import javax.inject.Inject import javax.inject.Provider import javax.inject.Singleton import play.api.inject.Binding import play.api.inject.Module import play.api.Configuration import play.api.Environment import play.api.Logger import scala.compat.java8.FutureConverters.CompletionStageOps import scala.concurrent.ExecutionContext import scala.concurrent.Future import scala.collection.JavaConverters._ import scala.collection.immutable class ServiceRegistrationModule extends Module { override def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]] = Seq( bind[ServiceRegistrationModule.RegisterWithServiceRegistry].toSelf.eagerly(), bind[ServiceRegistrationModule.ServiceConfig].toProvider[ServiceRegistrationModule.ServiceConfigProvider] ) } object ServiceRegistrationModule { class ServiceConfigProvider @Inject() (config: Config) extends Provider[ServiceConfig] { override lazy val get = ServiceConfig(serviceDnsRecords(config)) } case class ServiceConfig(uris: immutable.Seq[URI]) @Singleton private class RegisterWithServiceRegistry @Inject() ( coordinatedShutdown: CoordinatedShutdown, resolvedServices: ResolvedServices, config: ServiceConfig, registry: ServiceRegistry )(implicit ec: ExecutionContext) { private lazy val logger: Logger = Logger(this.getClass()) private val locatableServices = resolvedServices.services.filter(_.descriptor.locatableService) coordinatedShutdown.addTask( CoordinatedShutdown.PhaseBeforeServiceUnbind, "unregister-services-from-service-locator-javadsl" ) { () => Future .sequence(locatableServices.map { service => registry.unregister(service.descriptor.name).invoke().toScala }) .map(_ => Done) } locatableServices.foreach { service => val c = ServiceRegistryService.of(config.uris.asJava, service.descriptor.acls) registry .register(service.descriptor.name) .invoke(c) .exceptionally(new JFunction[Throwable, NotUsed] { def apply(t: Throwable) = { logger .error(s"Service name=[${service.descriptor.name}] couldn't register itself to the service locator.", t) NotUsed.getInstance() } }) } } }
Example 79
Source File: LagomPlayModule.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.play import java.util.{ List => JList } import java.util.Optional import javax.inject.Inject import com.lightbend.lagom.internal.javadsl.registry.ServiceRegistry import com.lightbend.lagom.internal.javadsl.registry.ServiceRegistryService import com.lightbend.lagom.devmode.internal.registry.serviceDnsRecords import com.lightbend.lagom.javadsl.api.ServiceAcl import com.lightbend.lagom.javadsl.api.ServiceInfo import com.lightbend.lagom.javadsl.api.transport.Method import com.typesafe.config.Config import play.api.inject.ApplicationLifecycle import play.api.inject.Binding import play.api.inject.Module import play.api.Configuration import play.api.Environment import play.api.Logger import scala.collection.JavaConverters._ import scala.compat.java8.FutureConverters._ import scala.util.Success import scala.util.Try class LagomPlayModule extends Module { private val logger = Logger(this.getClass) override def bindings(environment: Environment, config: Configuration): Seq[Binding[_]] = { val maybeServiceInfoBinding: Option[Binding[ServiceInfo]] = prepareServiceInfoBinding(config.underlying) val playRegistry = bind[PlayRegisterWithServiceRegistry].toSelf.eagerly() Seq( playRegistry ) ++ maybeServiceInfoBinding.toList } private def prepareServiceInfoBinding(config: Config) = { val triedServiceName = Try(config.getString("lagom.play.service-name")) val triedAcls: Try[JList[_ <: Config]] = Try(config.getConfigList("lagom.play.acls")) val warning = "Service setup via 'application.conf' is deprecated. Remove 'lagom.play.service-name' and/or " + "'lagom.play.acls' and use 'bindServiceInfo' on your Guice's Module class." val maybeServiceInfoBinding = (triedServiceName, triedAcls) match { case (Success(serviceName), Success(aclList)) => { logger.warn(warning) // create a ServiceInfo in case user doesn't see the warning val acls = parseAclList(aclList) Some(bind[ServiceInfo].toInstance(ServiceInfo.of(serviceName, acls: _*))) } case (Success(serviceName), _) => { logger.warn(warning) // create a ServiceInfo in case user doesn't see the warning Some(bind[ServiceInfo].toInstance(ServiceInfo.of(serviceName))) } case (_, Success(_)) => { logger.warn(warning) // can't create a ServiceInfo because service-name is missing None } case _ => None } maybeServiceInfoBinding } private def parseAclList(aclList: JList[_ <: Config]): Seq[ServiceAcl] = { aclList.asScala.map { aclConfig => val method = if (aclConfig.hasPath("method")) { Optional.of(new Method(aclConfig.getString("method"))) } else Optional.empty[Method] val pathRegex = if (aclConfig.hasPath("path-regex")) { Optional.of(aclConfig.getString("path-regex")) } else Optional.empty[String] new ServiceAcl(method, pathRegex) }.toSeq } } class PlayRegisterWithServiceRegistry @Inject() ( config: Config, serviceInfo: ServiceInfo, serviceRegistry: ServiceRegistry, applicationLifecycle: ApplicationLifecycle ) { val uris = serviceDnsRecords(config) private val serviceAcls = serviceInfo.getAcls private val service = ServiceRegistryService.of(uris.asJava, serviceAcls) // TODO: fix -> this register operation is registering all ACLs under the microservice name, not under each locatable service name. Will lead to unlocatable. serviceRegistry.register(serviceInfo.serviceName()).invoke(service) applicationLifecycle.addStopHook(() => serviceRegistry.unregister(serviceInfo.serviceName()).invoke().toScala) }
Example 80
Source File: ProjectionRegistryModule.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.javadsl.projection import java.util.concurrent.CompletionStage import akka.actor.ActorSystem import akka.annotation.ApiMayChange import akka.annotation.InternalApi import com.lightbend.lagom.internal.projection.ProjectionRegistry import com.lightbend.lagom.internal.projection.ProjectionRegistryActor.WorkerCoordinates import com.lightbend.lagom.projection.State import javax.inject.Inject import javax.inject.Provider import javax.inject.Singleton import play.api.Configuration import play.api.Environment import play.api.inject.Binding import play.api.inject.Module import scala.compat.java8.FutureConverters import scala.concurrent.ExecutionContext private class ProjectionsImpl @Inject() (registry: ProjectionRegistry)( implicit executionContext: ExecutionContext ) extends Projections { import FutureConverters._ override def getStatus(): CompletionStage[State] = registry.getState().toJava override def stopAllWorkers(projectionName: String): Unit = registry.stopAllWorkers(projectionName) override def stopWorker(projectionName: String, tagName: String): Unit = registry.stopWorker(WorkerCoordinates(projectionName, tagName)) override def startAllWorkers(projectionName: String): Unit = registry.startAllWorkers(projectionName) override def startWorker(projectionName: String, tagName: String): Unit = registry.startWorker(WorkerCoordinates(projectionName, tagName)) }
Example 81
Source File: PersistenceComponents.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.scaladsl.persistence import akka.actor.ActorSystem import akka.stream.Materializer import com.lightbend.lagom.internal.persistence.ReadSideConfig import com.lightbend.lagom.internal.scaladsl.persistence.ReadSideImpl import com.lightbend.lagom.scaladsl.cluster.ClusterComponents import com.lightbend.lagom.scaladsl.projection.ProjectionComponents import play.api.Configuration import scala.concurrent.ExecutionContext trait ReadSidePersistenceComponents extends WriteSidePersistenceComponents with ProjectionComponents { def actorSystem: ActorSystem def executionContext: ExecutionContext def materializer: Materializer def configuration: Configuration lazy val readSideConfig: ReadSideConfig = ReadSideConfig( configuration.underlying.getConfig("lagom.persistence.read-side") ) lazy val readSide: ReadSide = new ReadSideImpl(actorSystem, readSideConfig, persistentEntityRegistry, projectionRegistry, None)( executionContext, materializer ) }
Example 82
Source File: ServiceSupport.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.it import java.util.Collections import java.util.function.{ Function => JFunction } import akka.stream.Materializer import akka.stream.scaladsl.Source import org.scalatest.Inside import play.api.Application import play.api.Configuration import play.api.Environment import play.inject.guice.GuiceApplicationBuilder import scala.concurrent.Await import scala.concurrent.duration._ import scala.reflect.ClassTag import akka.japi.function.Procedure import com.google.inject.Binder import com.google.inject.Module import com.google.inject.TypeLiteral import com.lightbend.lagom.javadsl.testkit.ServiceTest import com.lightbend.lagom.javadsl.testkit.ServiceTest.TestServer import play.api.routing.Router import java.util import com.lightbend.lagom.internal.testkit.EmptyAdditionalRoutersModule import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpecLike sealed trait HttpBackend { final val provider: String = s"play.core.server.${codeName}ServerProvider" val codeName: String } case object AkkaHttp extends HttpBackend { val codeName = "AkkaHttp" } case object Netty extends HttpBackend { val codeName = "Netty" } trait ServiceSupport extends AnyWordSpecLike with Matchers with Inside { def withServer( configureBuilder: GuiceApplicationBuilder => GuiceApplicationBuilder )(block: Application => Unit)(implicit httpBackend: HttpBackend): Unit = { val jConfigureBuilder = new JFunction[GuiceApplicationBuilder, GuiceApplicationBuilder] { override def apply(b: GuiceApplicationBuilder): GuiceApplicationBuilder = { configureBuilder(b) .overrides(EmptyAdditionalRoutersModule) .configure("play.server.provider", httpBackend.provider) } } val jBlock = new Procedure[TestServer] { override def apply(server: TestServer): Unit = { block(server.app.asScala()) } } val setup = ServiceTest.defaultSetup.configureBuilder(jConfigureBuilder).withCluster(false) ServiceTest.withServer(setup, jBlock) } def withClient[T: ClassTag]( configureBuilder: GuiceApplicationBuilder => GuiceApplicationBuilder )(block: Application => T => Unit)(implicit httpBackend: HttpBackend): Unit = { withServer(configureBuilder) { application => val client = application.injector.instanceOf[T] block(application)(client) } } implicit def materializer(implicit app: Application): Materializer = app.materializer def consume[T](source: Source[T, _])(implicit mat: Materializer): List[T] = { Await.result(source.runFold(List.empty[T])((list, t) => t :: list), 10.seconds).reverse } }
Example 83
Source File: CircuitBreakerModule.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.internal.javadsl.client import javax.inject.Inject import javax.inject.Provider import javax.inject.Singleton import akka.actor.ActorSystem import com.lightbend.lagom.internal.client.CircuitBreakerConfig import com.lightbend.lagom.internal.client.CircuitBreakerMetricsProviderImpl import com.lightbend.lagom.internal.client.CircuitBreakerMetricsProviderProvider import com.lightbend.lagom.internal.spi.CircuitBreakerMetricsProvider import com.lightbend.lagom.javadsl.client.CircuitBreakersPanel import play.api.inject.Binding import play.api.inject.Module import play.api.Configuration import play.api.Environment class CircuitBreakerModule extends Module { override def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]] = { Seq( bind[CircuitBreakersPanel].to[CircuitBreakersPanelImpl], bind[CircuitBreakerMetricsProvider].toProvider[CircuitBreakerMetricsProviderProvider], bind[CircuitBreakerConfig].toSelf, bind[CircuitBreakerMetricsProviderImpl].toSelf ) } }
Example 84
Source File: CassandraPersistenceModule.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.javadsl.persistence.cassandra import java.net.URI import scala.concurrent.Future import akka.actor.ActorSystem import com.lightbend.lagom.internal.javadsl.persistence.cassandra._ import com.lightbend.lagom.internal.persistence.cassandra.CassandraOffsetStore import com.lightbend.lagom.internal.persistence.cassandra.CassandraReadSideSettings import com.lightbend.lagom.internal.persistence.cassandra.ServiceLocatorAdapter import com.lightbend.lagom.internal.persistence.cassandra.ServiceLocatorHolder import com.lightbend.lagom.javadsl.api.ServiceLocator import com.lightbend.lagom.javadsl.persistence.PersistentEntityRegistry import com.lightbend.lagom.spi.persistence.OffsetStore import javax.annotation.PostConstruct import javax.inject.Inject import play.api.Configuration import play.api.Environment import play.api.inject._ import scala.util.Try class CassandraPersistenceModule extends Module { override def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]] = Seq( bind[CassandraPersistenceModule.InitServiceLocatorHolder].toSelf.eagerly(), bind[PersistentEntityRegistry].to[CassandraPersistentEntityRegistry], bind[CassandraSession].toSelf, bind[CassandraReadSide].to[CassandraReadSideImpl], bind[CassandraReadSideSettings].toSelf, bind[CassandraOffsetStore].to[JavadslCassandraOffsetStore], bind[OffsetStore].to(bind[CassandraOffsetStore]) ) } private[lagom] object CassandraPersistenceModule { class InitServiceLocatorHolder @Inject() (system: ActorSystem, injector: Injector) { // Guice doesn't support this, but other DI frameworks do. @PostConstruct def init(): Unit = { Try(injector.instanceOf[ServiceLocator]).foreach { locator => ServiceLocatorHolder(system).setServiceLocator(new ServiceLocatorAdapter { override def locateAll(name: String): Future[List[URI]] = { import system.dispatcher import scala.compat.java8.FutureConverters._ import scala.collection.JavaConverters._ locator.locateAll(name).toScala.map(_.asScala.toList) } }) } } } }
Example 85
Source File: JdbcPersistenceModule.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.javadsl.persistence.jdbc import javax.inject.Inject import javax.inject.Provider import javax.inject.Singleton import akka.actor.ActorSystem import akka.actor.CoordinatedShutdown import com.lightbend.lagom.internal.javadsl.persistence.jdbc._ import com.lightbend.lagom.internal.persistence.jdbc.SlickDbProvider import com.lightbend.lagom.internal.persistence.jdbc.SlickOffsetStore import com.lightbend.lagom.javadsl.persistence.PersistentEntityRegistry import com.lightbend.lagom.spi.persistence.OffsetStore import play.api.Configuration import play.api.Environment import play.api.db.DBApi import play.api.inject.Binding import play.api.inject.Module import scala.concurrent.ExecutionContext class JdbcPersistenceModule extends Module { override def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]] = Seq( bind[SlickProvider].toProvider[GuiceSlickProvider], bind[JdbcReadSide].to[JdbcReadSideImpl], bind[PersistentEntityRegistry].to[JdbcPersistentEntityRegistry], bind[JdbcSession].to[JdbcSessionImpl], bind[SlickOffsetStore].to[JavadslJdbcOffsetStore], bind[OffsetStore].to(bind[SlickOffsetStore]) ) } @Singleton class GuiceSlickProvider @Inject() ( dbApi: DBApi, actorSystem: ActorSystem, coordinatedShutdown: CoordinatedShutdown )( implicit ec: ExecutionContext ) extends Provider[SlickProvider] { lazy val get = { // Ensures JNDI bindings are made before we build the SlickProvider SlickDbProvider.buildAndBindSlickDatabases( dbApi, actorSystem.settings.config, coordinatedShutdown ) new SlickProvider(actorSystem, coordinatedShutdown) } }
Example 86
Source File: JdbcPersistenceSpec.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.javadsl.persistence.jdbc import akka.actor.ActorSystem import akka.cluster.Cluster import com.lightbend.lagom.internal.javadsl.persistence.jdbc._ import com.lightbend.lagom.internal.persistence.ReadSideConfig import com.lightbend.lagom.internal.persistence.jdbc.SlickDbTestProvider import com.lightbend.lagom.internal.persistence.testkit.AwaitPersistenceInit.awaitPersistenceInit import com.lightbend.lagom.persistence.ActorSystemSpec import com.lightbend.lagom.persistence.PersistenceSpec import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import play.api.Configuration import play.api.Environment import scala.concurrent.Await import scala.concurrent.duration._ abstract class JdbcPersistenceSpec private (actorSystemFactory: () => ActorSystem) extends ActorSystemSpec(actorSystemFactory) { def this(testName: String, config: Config) = { this(() => ActorSystem(testName, config.withFallback(Configuration.load(Environment.simple()).underlying))) } def this(config: Config) = this(PersistenceSpec.testNameFromCallStack(classOf[JdbcPersistenceSpec]), config) def this() = this(ConfigFactory.empty()) import system.dispatcher protected lazy val slick = new SlickProvider(system, coordinatedShutdown) protected lazy val offsetStore = new JavadslJdbcOffsetStore( slick, system, new OffsetTableConfiguration( system.settings.config, ReadSideConfig() ), ReadSideConfig() ) protected lazy val jdbcReadSide: JdbcReadSide = new JdbcReadSideImpl(slick, offsetStore) override def beforeAll(): Unit = { super.beforeAll() // Join ourselves - needed because we're using cluster singleton to create tables val cluster = Cluster(system) cluster.join(cluster.selfAddress) // Trigger database to be loaded and registered to JNDI SlickDbTestProvider.buildAndBindSlickDb(system.name, coordinatedShutdown) // Trigger tables to be created Await.ready(slick.ensureTablesCreated(), 20.seconds) awaitPersistenceInit(system) } }
Example 87
Source File: JdbcClusteredPersistentEntitySpec.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.scaladsl.persistence.jdbc import akka.actor.ActorSystem import akka.actor.CoordinatedShutdown import akka.stream.Materializer import akka.stream.SystemMaterializer import com.lightbend.lagom.scaladsl.persistence.TestEntity.Evt import com.lightbend.lagom.scaladsl.persistence.multinode.AbstractClusteredPersistentEntityConfig import com.lightbend.lagom.scaladsl.persistence.multinode.AbstractClusteredPersistentEntitySpec import com.lightbend.lagom.scaladsl.persistence.ReadSideProcessor import com.lightbend.lagom.scaladsl.persistence.TestEntitySerializerRegistry import com.lightbend.lagom.scaladsl.persistence.multinode.AbstractClusteredPersistentEntitySpec.Ports import com.lightbend.lagom.scaladsl.playjson.JsonSerializerRegistry import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import org.h2.tools.Server import play.api.Configuration import play.api.Environment import play.api.db.HikariCPComponents import play.api.inject.ApplicationLifecycle import play.api.inject.DefaultApplicationLifecycle import scala.concurrent.Await import scala.concurrent.ExecutionContext import scala.concurrent.Future object JdbcClusteredPersistentEntityConfig extends AbstractClusteredPersistentEntityConfig { override def specPorts: Ports.SpecPorts = Ports.jdbcSpecPorts override def additionalCommonConfig: Config = ConfigFactory.parseString( s""" db.default.driver=org.h2.Driver db.default.url="jdbc:h2:tcp://localhost:${specPorts.database}/mem:JdbcClusteredPersistentEntitySpec" """ ) } class JdbcClusteredPersistentEntitySpecMultiJvmNode1 extends JdbcClusteredPersistentEntitySpec class JdbcClusteredPersistentEntitySpecMultiJvmNode2 extends JdbcClusteredPersistentEntitySpec class JdbcClusteredPersistentEntitySpecMultiJvmNode3 extends JdbcClusteredPersistentEntitySpec class JdbcClusteredPersistentEntitySpec extends AbstractClusteredPersistentEntitySpec(JdbcClusteredPersistentEntityConfig) { import JdbcClusteredPersistentEntityConfig._ var h2: Server = _ protected override def atStartup(): Unit = { runOn(node1) { h2 = Server.createTcpServer("-tcpPort", specPorts.database.toString, "-ifNotExists").start() } enterBarrier("h2-started") super.atStartup() } protected override def afterTermination(): Unit = { super.afterTermination() Await.ready(defaultApplicationLifecycle.stop(), shutdownTimeout) Option(h2).foreach(_.stop()) } lazy val defaultApplicationLifecycle = new DefaultApplicationLifecycle override lazy val components: JdbcPersistenceComponents = new JdbcPersistenceComponents with HikariCPComponents { override def actorSystem: ActorSystem = JdbcClusteredPersistentEntitySpec.this.system override def executionContext: ExecutionContext = system.dispatcher override def coordinatedShutdown: CoordinatedShutdown = CoordinatedShutdown(actorSystem) override lazy val materializer: Materializer = SystemMaterializer(actorSystem).materializer override lazy val configuration: Configuration = Configuration(system.settings.config) override def environment: Environment = JdbcClusteredPersistentEntityConfig.environment override lazy val applicationLifecycle: ApplicationLifecycle = defaultApplicationLifecycle override def jsonSerializerRegistry: JsonSerializerRegistry = TestEntitySerializerRegistry } lazy val jdbcTestEntityReadSide: JdbcTestEntityReadSide = new JdbcTestEntityReadSide(components.jdbcSession) protected override def getAppendCount(id: String): Future[Long] = jdbcTestEntityReadSide.getAppendCount(id) protected override def readSideProcessor: () => ReadSideProcessor[Evt] = { () => new JdbcTestEntityReadSide.TestEntityReadSideProcessor(components.jdbcReadSide) } }
Example 88
Source File: SlickClusteredPersistentEntitySpec.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.scaladsl.persistence.slick import akka.actor.ActorSystem import akka.actor.CoordinatedShutdown import akka.stream.Materializer import akka.stream.SystemMaterializer import com.lightbend.lagom.scaladsl.persistence.TestEntity.Evt import com.lightbend.lagom.scaladsl.persistence.multinode.AbstractClusteredPersistentEntityConfig import com.lightbend.lagom.scaladsl.persistence.multinode.AbstractClusteredPersistentEntitySpec import com.lightbend.lagom.scaladsl.persistence.ReadSideProcessor import com.lightbend.lagom.scaladsl.persistence.TestEntitySerializerRegistry import com.lightbend.lagom.scaladsl.persistence.multinode.AbstractClusteredPersistentEntitySpec.Ports import com.lightbend.lagom.scaladsl.playjson.JsonSerializerRegistry import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import org.h2.tools.Server import play.api.Configuration import play.api.Environment import play.api.db.HikariCPComponents import play.api.inject.ApplicationLifecycle import play.api.inject.DefaultApplicationLifecycle import scala.concurrent.Await import scala.concurrent.ExecutionContext import scala.concurrent.Future object SlickClusteredPersistentEntityConfig extends AbstractClusteredPersistentEntityConfig { override def specPorts: Ports.SpecPorts = Ports.slickSpecPorts override def additionalCommonConfig: Config = ConfigFactory.parseString( s""" db.default.driver=org.h2.Driver db.default.url="jdbc:h2:tcp://localhost:${specPorts.database}/mem:JdbcClusteredPersistentEntitySpec" """ ) } class SlickClusteredPersistentEntitySpecMultiJvmNode1 extends SlickClusteredPersistentEntitySpec class SlickClusteredPersistentEntitySpecMultiJvmNode2 extends SlickClusteredPersistentEntitySpec class SlickClusteredPersistentEntitySpecMultiJvmNode3 extends SlickClusteredPersistentEntitySpec class SlickClusteredPersistentEntitySpec extends AbstractClusteredPersistentEntitySpec(SlickClusteredPersistentEntityConfig) { import SlickClusteredPersistentEntityConfig._ var h2: Server = _ protected override def atStartup(): Unit = { runOn(node1) { h2 = Server.createTcpServer("-tcpPort", specPorts.database.toString, "-ifNotExists").start() } enterBarrier("h2-started") super.atStartup() } protected override def afterTermination(): Unit = { super.afterTermination() Await.ready(defaultApplicationLifecycle.stop(), shutdownTimeout) Option(h2).foreach(_.stop()) } lazy val defaultApplicationLifecycle = new DefaultApplicationLifecycle override lazy val components: SlickPersistenceComponents = new SlickPersistenceComponents with HikariCPComponents { override def actorSystem: ActorSystem = SlickClusteredPersistentEntitySpec.this.system override def executionContext: ExecutionContext = system.dispatcher override def coordinatedShutdown: CoordinatedShutdown = CoordinatedShutdown(actorSystem) override lazy val materializer: Materializer = SystemMaterializer(actorSystem).materializer override lazy val configuration: Configuration = Configuration(system.settings.config) override def environment: Environment = SlickClusteredPersistentEntityConfig.environment override lazy val applicationLifecycle: ApplicationLifecycle = defaultApplicationLifecycle override def jsonSerializerRegistry: JsonSerializerRegistry = TestEntitySerializerRegistry } lazy val jdbcTestEntityReadSide: SlickTestEntityReadSide = new SlickTestEntityReadSide( components.db, components.profile )(components.executionContext) protected override def getAppendCount(id: String): Future[Long] = jdbcTestEntityReadSide.getAppendCount(id) protected override def readSideProcessor: () => ReadSideProcessor[Evt] = { () => new SlickTestEntityReadSide.TestEntityReadSideProcessor( components.slickReadSide, components.db, components.profile )(components.executionContext) } }
Example 89
Source File: SlickPersistenceSpec.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.scaladsl.persistence.slick import akka.actor.setup.ActorSystemSetup import akka.actor.ActorSystem import akka.actor.BootstrapSetup import akka.cluster.Cluster import com.lightbend.lagom.internal.persistence.ReadSideConfig import com.lightbend.lagom.internal.persistence.jdbc.SlickDbTestProvider import com.lightbend.lagom.internal.persistence.jdbc.SlickOffsetStore import com.lightbend.lagom.internal.persistence.jdbc.SlickProvider import com.lightbend.lagom.internal.persistence.testkit.AwaitPersistenceInit.awaitPersistenceInit import com.lightbend.lagom.internal.scaladsl.persistence.jdbc.OffsetTableConfiguration import com.lightbend.lagom.internal.scaladsl.persistence.slick.SlickReadSideImpl import com.lightbend.lagom.persistence.ActorSystemSpec import com.lightbend.lagom.persistence.PersistenceSpec import com.lightbend.lagom.scaladsl.playjson.JsonSerializerRegistry import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import play.api.Configuration import play.api.Environment import scala.concurrent.Await import scala.concurrent.duration._ abstract class SlickPersistenceSpec private (actorSystemFactory: () => ActorSystem) extends ActorSystemSpec(actorSystemFactory) { def this(testName: String, config: Config, registry: JsonSerializerRegistry) = this( () => ActorSystem( testName, ActorSystemSetup( BootstrapSetup( config.withFallback(Configuration.load(Environment.simple()).underlying) ), JsonSerializerRegistry.serializationSetupFor(registry) ) ) ) def this(config: Config, registry: JsonSerializerRegistry) = this(PersistenceSpec.testNameFromCallStack(classOf[SlickPersistenceSpec]), config, registry) def this(registry: JsonSerializerRegistry) = this(ConfigFactory.empty(), registry) import system.dispatcher protected lazy val slick = new SlickProvider(system, coordinatedShutdown) protected lazy val slickReadSide: SlickReadSide = { val offsetStore = new SlickOffsetStore( system, slick, new OffsetTableConfiguration(system.settings.config, ReadSideConfig()) ) new SlickReadSideImpl(slick, offsetStore) } override def beforeAll(): Unit = { super.beforeAll() // Join ourselves - needed because we're using cluster singleton to create tables val cluster = Cluster(system) cluster.join(cluster.selfAddress) // Trigger database to be loaded and registered to JNDI SlickDbTestProvider.buildAndBindSlickDb(system.name, coordinatedShutdown) // Trigger tables to be created Await.ready(slick.ensureTablesCreated(), 20.seconds) awaitPersistenceInit(system) } }
Example 90
Source File: JdbcPersistenceSpec.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.scaladsl.persistence.jdbc import akka.actor.setup.ActorSystemSetup import akka.actor.ActorSystem import akka.actor.BootstrapSetup import akka.cluster.Cluster import com.lightbend.lagom.internal.persistence.ReadSideConfig import com.lightbend.lagom.internal.persistence.jdbc.SlickDbTestProvider import com.lightbend.lagom.internal.persistence.jdbc.SlickOffsetStore import com.lightbend.lagom.internal.persistence.jdbc.SlickProvider import com.lightbend.lagom.internal.persistence.testkit.AwaitPersistenceInit.awaitPersistenceInit import com.lightbend.lagom.internal.scaladsl.persistence.jdbc.JdbcReadSideImpl import com.lightbend.lagom.internal.scaladsl.persistence.jdbc.OffsetTableConfiguration import com.lightbend.lagom.persistence.ActorSystemSpec import com.lightbend.lagom.persistence.PersistenceSpec import com.lightbend.lagom.scaladsl.playjson.JsonSerializerRegistry import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import play.api.Configuration import play.api.Environment import scala.concurrent.Await import scala.concurrent.duration._ abstract class JdbcPersistenceSpec private (actorSystemFactory: () => ActorSystem) extends ActorSystemSpec(actorSystemFactory) { def this(testName: String, config: Config, registry: JsonSerializerRegistry) = this( () => ActorSystem( testName, ActorSystemSetup( BootstrapSetup( config.withFallback(Configuration.load(Environment.simple()).underlying) ), JsonSerializerRegistry.serializationSetupFor(registry) ) ) ) def this(config: Config, registry: JsonSerializerRegistry) = this(PersistenceSpec.testNameFromCallStack(classOf[JdbcPersistenceSpec]), config, registry) def this(registry: JsonSerializerRegistry) = this(ConfigFactory.empty(), registry) import system.dispatcher protected lazy val slick = new SlickProvider(system, coordinatedShutdown) protected lazy val jdbcReadSide: JdbcReadSide = new JdbcReadSideImpl( slick, new SlickOffsetStore( system, slick, new OffsetTableConfiguration(system.settings.config, ReadSideConfig()) ) ) override def beforeAll(): Unit = { super.beforeAll() // Join ourselves - needed because we're using cluster singleton to create tables val cluster = Cluster(system) cluster.join(cluster.selfAddress) // Trigger database to be loaded and registered to JNDI SlickDbTestProvider.buildAndBindSlickDb(system.name, coordinatedShutdown) // Trigger tables to be created Await.ready(slick.ensureTablesCreated(), 20.seconds) awaitPersistenceInit(system) } }
Example 91
Source File: SlickOffsetStoreSpec.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.internal.persistence.jdbc import akka.cluster.Cluster import akka.pattern.AskTimeoutException import com.lightbend.lagom.persistence.ActorSystemSpec import play.api.Configuration import play.api.Environment import slick.jdbc.meta.MTable import scala.concurrent.Await import scala.concurrent.duration.FiniteDuration import scala.concurrent.duration._ class SlickOffsetStoreSpec extends ActorSystemSpec(Configuration.load(Environment.simple()).underlying) { import system.dispatcher private lazy val slick = new SlickProvider(system, coordinatedShutdown) private lazy val offsetStore = new SlickOffsetStore( system, slick, TestOffsetStoreConfiguration() ) protected override def beforeAll(): Unit = { super.beforeAll() // Trigger database to be loaded and registered to JNDI SlickDbTestProvider.buildAndBindSlickDb(system.name, coordinatedShutdown) } "SlickOffsetStoreSpec" when { "auto-creating tables is enabled" should { // Regression test for https://github.com/lagom/lagom/issues/1336 "allow prepare to be retried after a failure" in { val exception = Await.result(offsetStore.prepare("test_read_side", "TestTag").failed, 10.seconds) exception shouldBe a[AskTimeoutException] // Join ourselves - needed because we're using cluster singleton to create tables val cluster = Cluster(system) cluster.join(cluster.selfAddress) Await.result(offsetStore.prepare("test_read_side", "TestTag"), 20.seconds) val tables = Await.result(slick.db.run(MTable.getTables("test_read_side_offsets_tbl")), 5.seconds) (tables should have).length(1) } "creates the read-side offset table when preparing" in pending "allows prepare to be called multiple times" in pending "uses configured column names" in pending "returns an offset DAO with the last stored offset" in pending } "auto-creating tables is disabled" in pending } private case class TestOffsetStoreConfiguration( tableName: String = "test_read_side_offsets_tbl", schemaName: Option[String] = None, idColumnName: String = "test_read_side_id_col", tagColumnName: String = "test_tag_col", sequenceOffsetColumnName: String = "test_sequence_offset_col", timeUuidOffsetColumnName: String = "test_time_uuid_offset_col", minBackoff: FiniteDuration = 1.second, maxBackoff: FiniteDuration = 1.second, randomBackoffFactor: Double = 0, globalPrepareTimeout: FiniteDuration = 5.seconds, role: Option[String] = None ) extends SlickOffsetStoreConfiguration }
Example 92
Source File: ClusterShardingTypedModule.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.internal.javadsl.cluster.typed import akka.actor.ActorSystem import akka.cluster.sharding.typed.javadsl.ClusterSharding import javax.inject.Inject import javax.inject.Provider import play.api.Configuration import play.api.Environment import play.api.inject.Binding import play.api.inject.Module class ClusterShardingTypedModule extends Module { override def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]] = Seq( bind[ClusterSharding].toProvider[ClusterShardingTypedProvider] ) } private[lagom] class ClusterShardingTypedProvider @Inject() (system: ActorSystem) extends Provider[ClusterSharding] { private val instance: ClusterSharding = { import akka.actor.typed.scaladsl.adapter._ val actorSystemTyped = system.toTyped ClusterSharding.get(actorSystemTyped) } override def get(): ClusterSharding = instance }
Example 93
Source File: JoinCluster.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.internal.javadsl.cluster import akka.actor.ActorSystem import com.lightbend.lagom.internal.akka.management.AkkaManagementTrigger import com.lightbend.lagom.internal.cluster.JoinClusterImpl import javax.inject.Inject import play.api.Configuration import play.api.Environment import play.api.inject.Binding import play.api.inject.Module class JoinClusterModule extends Module { override def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]] = Seq( bind[JoinCluster].toSelf.eagerly() ) } private[lagom] class JoinCluster @Inject() ( system: ActorSystem, environment: Environment, akkaManagementTrigger: AkkaManagementTrigger ) { JoinClusterImpl.join(system, environment, akkaManagementTrigger) }
Example 94
Source File: JacksonModule.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.javadsl.jackson import akka.actor.ActorSystem import akka.serialization.jackson.JacksonMigration import play.api.Configuration import play.api.Environment import play.api.inject.Binding import play.api.inject.Module import javax.inject.Inject class JacksonModule extends Module { override def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]] = Seq( bind[JacksonMigrationCheck].toSelf.eagerly(), bind[JacksonSerializerFactory].toSelf, bind[JacksonExceptionSerializer].toSelf ) } private[lagom] class JacksonMigrationCheck @Inject() (system: ActorSystem) { if (system.settings.config.hasPath("lagom.serialization.json.migrations")) { throw new IllegalStateException( "JacksonJsonSerializer migrations defined in " + s"'lagom.serialization.json.migrations' must be rewritten as [${classOf[JacksonMigration].getName}] " + "and defined in config 'akka.serialization.jackson.migrations'." ) } }
Example 95
Source File: AkkaManagementModule.scala From lagom with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.internal.javadsl.server import akka.actor.ActorSystem import akka.actor.CoordinatedShutdown import com.lightbend.lagom.internal.akka.management.AkkaManagementTrigger import com.typesafe.config.Config import javax.inject.Inject import javax.inject.Provider import javax.inject.Singleton import play.api.inject.Binding import play.api.inject.Module import play.api.Configuration import play.api.Environment import play.api.Mode import scala.concurrent.ExecutionContext private[lagom] class AkkaManagementModule extends Module { override def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]] = { // The trigger must be eager because it's often not required by anyone as a dependency to // be injected and yet it must be started anyway Seq(bind[AkkaManagementTrigger].toProvider[AkkaManagementProvider].eagerly()) } } @Singleton private[lagom] class AkkaManagementProvider @Inject() ( config: Config, actorSystem: ActorSystem, coordinatedShutdown: CoordinatedShutdown, environment: Environment, executionContext: ExecutionContext ) extends Provider[AkkaManagementTrigger] { override def get(): AkkaManagementTrigger = { val instance = new AkkaManagementTrigger(config, actorSystem, coordinatedShutdown)(executionContext) if (environment.mode == Mode.Prod) { instance.start() } instance } }
Example 96
Source File: FeatureSwitch.scala From self-assessment-api with Apache License 2.0 | 5 votes |
package config import router.enums.SourceType.SourceType import play.api.Configuration case class FeatureSwitch(value: Option[Configuration]) { val DEFAULT_VALUE = true def isEnabled(sourceType: SourceType): Boolean = value match { case Some(config) => FeatureConfig(config).isSourceEnabled(sourceType.toString) case None => DEFAULT_VALUE } def isEnabled(sourceType: SourceType, summary: Option[String]): Boolean = value match { case Some(config) => summary match { case None | Some("") => FeatureConfig(config).isSourceEnabled(sourceType.toString) case Some(_summary) => FeatureConfig(config).isSummaryEnabled(sourceType.toString, _summary) } case None => DEFAULT_VALUE } def isWhiteListingEnabled: Boolean = { value match { case Some(config) => config.getOptional[Boolean]("white-list.enabled").getOrElse(false) case None => false } } def isAgentSimulationFilterEnabled: Boolean = value match { case Some(config) => config.getOptional[Boolean]("test-scenario-simulation.enabled").getOrElse(false) case None => false } def whiteListedApplicationIds: Seq[String] = { value match { case Some(config) => config .getOptional[Seq[String]]("white-list.applicationIds") .getOrElse(throw new RuntimeException(s"feature-switch.white-list.applicationIds is not configured")) case None => Seq() } } def isCharitableGivingV2Enabled: Boolean = value match { case Some(config) => config.getOptional[Boolean]("charitable-giving-version-2.enabled").getOrElse(false) case None => false } def isDividendsV2Enabled: Boolean = value match { case Some(config) => config.getOptional[Boolean]("dividends-income-version-2.enabled").getOrElse(false) case None => false } def isSavingsAccountsV2Enabled: Boolean = value match { case Some(config) => config.getOptional[Boolean]("savings-accounts-version-2.enabled").getOrElse(false) case None => false } def isCrystallisationV2Enabled: Boolean = value match { case Some(config) => config.getOptional[Boolean]("crystallisation-version-2.enabled").getOrElse(false) case None => false } } sealed case class FeatureConfig(config: Configuration) { def isSummaryEnabled(source: String, summary: String): Boolean = { val summaryEnabled = config.getOptional[Boolean](s"$source.$summary.enabled") match { case Some(flag) => flag case None => true } isSourceEnabled(source) && summaryEnabled } def isSourceEnabled(source: String): Boolean = { config.getOptional[Boolean](s"$source.enabled").getOrElse(true) } }
Example 97
Source File: AppConfig.scala From self-assessment-api with Apache License 2.0 | 5 votes |
package config import javax.inject.{Inject, Singleton} import play.api.{Configuration, Environment} import uk.gov.hmrc.play.bootstrap.config.ServicesConfig @Singleton class AppConfig @Inject()(val environment: Environment, val configuration: Configuration, config: ServicesConfig) { def appName: String = config.getString("appName") def appUrl: String = config.getString("appUrl") def registrationEnabled: Boolean = config.getBoolean("microservice.services.service-locator.enabled") def featureSwitch: Option[Configuration] = configuration.getOptional[Configuration](s"feature-switch") def apiStatus(version: String): String = config.getString(s"api.$version.status") def apiGatewayContext: String = config.getString("api.gateway.context") //Services def saApiUrl: String = config.baseUrl("self-assessment-api") def cgApiUrl: String = config.baseUrl("mtd-charitable-giving") def taxCalcUrl: String = config.baseUrl("mtd-tax-calculation") def propertyUrl: String = config.baseUrl("mtd-property-api") def selfEmploymentUrl: String = config.baseUrl("mtd-self-employment") def release2Enabled: Boolean = config.getBoolean("release-2.enabled") def dividendsApiUrl: String = config.baseUrl("mtd-dividends-income") def savingsAccountApiUrl: String = config.baseUrl("mtd-savings-accounts") def crystallisationApiUrl: String = config.baseUrl("mtd-crystallisation") }
Example 98
Source File: MockAppConfig.scala From self-assessment-api with Apache License 2.0 | 5 votes |
package mocks.config import config.AppConfig import mocks.Mock import org.mockito.stubbing.OngoingStubbing import org.scalatest.Suite import play.api.Configuration trait MockAppConfig extends Mock { _: Suite => val mockAppConfig = mock[AppConfig] object MockAppConfig { def appName: OngoingStubbing[String] = when(mockAppConfig.appName) def appUrl: OngoingStubbing[String] = when(mockAppConfig.appUrl) def apiStatus(version: String): OngoingStubbing[String] = when(mockAppConfig.apiStatus(any[String]())) def featureSwitch: OngoingStubbing[Option[Configuration]] = when(mockAppConfig.featureSwitch) def registrationEnabled: OngoingStubbing[Boolean] = when(mockAppConfig.registrationEnabled) def saApiUrl: OngoingStubbing[String] = when(mockAppConfig.saApiUrl) def cgApiUrl: OngoingStubbing[String] = when(mockAppConfig.cgApiUrl) def taxCalcUrl: OngoingStubbing[String] = when(mockAppConfig.taxCalcUrl) def propertyUrl: OngoingStubbing[String] = when(mockAppConfig.propertyUrl) def selfEmploymentUrl: OngoingStubbing[String] = when(mockAppConfig.selfEmploymentUrl) def dividendsApiUrl: OngoingStubbing[String] = when(mockAppConfig.dividendsApiUrl) def savingsAccountsApiUrl: OngoingStubbing[String] = when(mockAppConfig.savingsAccountApiUrl) def crystallisationApiUrl: OngoingStubbing[String] = when(mockAppConfig.crystallisationApiUrl) } override protected def beforeEach(): Unit = { super.beforeEach() reset(mockAppConfig) } }
Example 99
Source File: SelfAssessmentApiDefinitionSpec.scala From self-assessment-api with Apache License 2.0 | 5 votes |
package router.definition import mocks.config.MockAppConfig import play.api.Configuration import router.definition.APIStatus.APIStatus import support.UnitSpec import router.constants.Versions._ class SelfAssessmentApiDefinitionSpec extends UnitSpec with MockAppConfig { class Setup { val saApiDefinition = new SelfAssessmentApiDefinition(mockAppConfig) } "buildAPIStatus" should { Seq( "ALPHA" -> APIStatus.ALPHA, "BETA" -> APIStatus.BETA, "STABLE" -> APIStatus.STABLE, "DEPRECATED" -> APIStatus.DEPRECATED, "RETIRED" -> APIStatus.RETIRED, "any other string" -> APIStatus.ALPHA ).foreach { case (input, output) => s"return $output when provided with $input from config" in new Setup { MockAppConfig.apiStatus("1.0") .returns(input) val apiStatus: APIStatus = saApiDefinition.buildAPIStatus(VERSION_1) apiStatus shouldBe output } } } "buildWhiteListingAccess" should { val whitelistedIds = Seq("1", "2", "3") val whitelistDisabledConfig = Configuration("white-list.enabled" -> false) val whitelistEnabledConfig = Configuration( "white-list.enabled" -> true, "white-list.applicationIds" -> whitelistedIds) "return an Access model when whitelisting is enabled" in new Setup { MockAppConfig.featureSwitch returns Some(whitelistEnabledConfig) saApiDefinition.buildWhiteListingAccess() shouldBe Some(Access("PRIVATE", whitelistedIds)) } "return None when whitelisting is not enabled" in new Setup { MockAppConfig.featureSwitch returns Some(whitelistDisabledConfig) saApiDefinition.buildWhiteListingAccess() shouldBe None } } }
Example 100
Source File: UserRegistrationService.scala From scala-play-realworld-example-app with MIT License | 5 votes |
package users.services import authentication.api.SecurityUserCreator import commons.exceptions.ValidationException import commons.repositories.DateTimeProvider import commons.utils.DbioUtils import authentication.models.{NewSecurityUser, SecurityUserId} import users.models.{User, UserId, UserRegistration} import users.repositories.UserRepo import play.api.Configuration import slick.dbio.DBIO import scala.concurrent.ExecutionContext.Implicits.global private[users] class UserRegistrationService(userRegistrationValidator: UserRegistrationValidator, securityUserCreator: SecurityUserCreator, dateTimeProvider: DateTimeProvider, userRepo: UserRepo, config: Configuration) { private val defaultImage = Some(config.get[String]("app.defaultImage")) def register(userRegistration: UserRegistration): DBIO[User] = { for { _ <- validate(userRegistration) user <- doRegister(userRegistration) } yield user } private def validate(userRegistration: UserRegistration) = { userRegistrationValidator.validate(userRegistration) .flatMap(violations => DbioUtils.fail(violations.isEmpty, new ValidationException(violations))) } private def doRegister(userRegistration: UserRegistration) = { val newSecurityUser = NewSecurityUser(userRegistration.email, userRegistration.password) for { securityUser <- securityUserCreator.create(newSecurityUser) now = dateTimeProvider.now user = User(UserId(-1), securityUser.id, userRegistration.username, userRegistration.email, null, defaultImage, now, now) savedUser <- userRepo.insertAndGet(user) } yield savedUser } }
Example 101
Source File: RealWorldWithServerAndTestConfigBaseTest.scala From scala-play-realworld-example-app with MIT License | 5 votes |
package commons_test.test_helpers import java.util.concurrent.Executors import commons_test.test_helpers.RealWorldWithServerAndTestConfigBaseTest.RealWorldWithTestConfig import commons_test.test_helpers.WsScalaTestClientWithHost.TestWsClient import config.RealWorldComponents import org.scalatest._ import play.api.ApplicationLoader.Context import play.api.Configuration import play.api.http.Status import play.api.test.DefaultAwaitTimeout import scala.concurrent.ExecutionContext trait RealWorldWithServerBaseTest extends FlatSpec with MustMatchers with OptionValues with WsScalaTestClientWithHost with OneServerPerTestWithComponents_FixedForCompileTimeTestSetUp with Status with DefaultAwaitTimeout with WithAwaitUtilities with WithTestExecutionContext { override implicit val executionContext: ExecutionContext = ExecutionContext.fromExecutorService(Executors.newFixedThreadPool(1)) implicit val host: Host = Host("http://localhost:") override type TestComponents <: RealWorldWithTestConfig implicit def wsClientWithConnectionData: TestWsClient = { TestWsClient(host, portNumber, components.wsClient) } } object RealWorldWithServerAndTestConfigBaseTest { class RealWorldWithTestConfig(context: Context) extends RealWorldComponents(context) { override def configuration: Configuration = { val testConfig = Configuration.from(TestUtils.config) val config = super.configuration testConfig.withFallback(config) } } } class RealWorldWithServerAndTestConfigBaseTest extends RealWorldWithServerBaseTest { override type TestComponents = RealWorldWithTestConfig override def createComponents: TestComponents = { new RealWorldWithTestConfig(context) } }
Example 102
Source File: CouchbasePersistenceModule.scala From akka-persistence-couchbase with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.javadsl.persistence.couchbase import java.net.URI import akka.actor.ActorSystem import akka.event.Logging import akka.stream.alpakka.couchbase.javadsl.CouchbaseSession import akka.stream.alpakka.couchbase.CouchbaseSessionSettings import com.google.inject.Provider import com.lightbend.lagom.internal.javadsl.persistence.couchbase.{ CouchbasePersistentEntityRegistry, CouchbaseReadSideImpl, JavadslCouchbaseOffsetStore } import com.lightbend.lagom.internal.persistence.couchbase.{ CouchbaseConfigValidator, CouchbaseOffsetStore, ServiceLocatorAdapter, ServiceLocatorHolder } import com.lightbend.lagom.javadsl.api.ServiceLocator import com.lightbend.lagom.javadsl.persistence.PersistentEntityRegistry import com.lightbend.lagom.spi.persistence.OffsetStore import com.typesafe.config.Config import javax.inject.Inject import play.api.inject.{Binding, Injector, Module} import play.api.{Configuration, Environment} import scala.compat.java8.FutureConverters._ import scala.concurrent.duration._ import scala.concurrent.{Await, Future} import scala.util.Try class CouchbasePersistenceModule extends Module { override def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]] = Seq( bind[CouchbasePersistenceModule.InitServiceLocatorHolder].toSelf.eagerly(), bind[PersistentEntityRegistry].to[CouchbasePersistentEntityRegistry], bind[CouchbaseSession].toProvider[CouchbaseProvider], bind[CouchbaseReadSide].to[CouchbaseReadSideImpl], //TODO: add other modules similar to Cassandra // bind[CassandraReadSideSettings].toSelf, bind[CouchbaseOffsetStore].to(bind[JavadslCouchbaseOffsetStore]), bind[OffsetStore].to(bind[CouchbaseOffsetStore]) ) } private[lagom] class CouchbaseProvider @Inject() (system: ActorSystem, cfg: Config) extends Provider[CouchbaseSession] { private val log = Logging(system, classOf[CouchbaseProvider]) CouchbaseConfigValidator.validateBucket("lagom.persistence.read-side.couchbase", cfg, log) private val readSideCouchbaseConfig: Config = cfg.getConfig("lagom.persistence.read-side.couchbase") private val sessionSettings = CouchbaseSessionSettings( readSideCouchbaseConfig.getConfig("connection") ) private val bucket = readSideCouchbaseConfig.getString("bucket") // FIXME is there a way to have async component creation in lagom instead of letting every component know that the thing is async? // if not we should pass Future[CouchbaseSession] around and let the use sites mix in AsyncCouchbaseSession - but if we use // that from Lagom it needs to be made public API // FIXME this should be the Java API of CouchbaseSession, when there is one lazy val couchbase: CouchbaseSession = Await.result(CouchbaseSession.create(sessionSettings, bucket, system.dispatcher).toScala, 30.seconds) override def get(): CouchbaseSession = couchbase } private[lagom] object CouchbasePersistenceModule { class InitServiceLocatorHolder @Inject() (system: ActorSystem, injector: Injector) { def init(): Unit = Try(injector.instanceOf[ServiceLocator]).foreach { locator => ServiceLocatorHolder(system).setServiceLocator(new ServiceLocatorAdapter { override def locateAll(name: String): Future[List[URI]] = { import system.dispatcher import scala.collection.JavaConverters._ import scala.compat.java8.FutureConverters._ locator.locateAll(name).toScala.map(_.asScala.toList) } }) } } }
Example 103
Source File: CouchbaseClusteredPersistentEntitySpec.scala From akka-persistence-couchbase with Apache License 2.0 | 5 votes |
package com.lightbend.lagom.scaladsl.persistence.couchbase import java.io.File import akka.actor.{ActorSystem, CoordinatedShutdown} import akka.persistence.couchbase.CouchbaseClusterConnection import akka.stream.{ActorMaterializer, Materializer} import com.lightbend.lagom.internal.persistence.couchbase.TestConfig import com.lightbend.lagom.internal.persistence.testkit.AwaitPersistenceInit.awaitPersistenceInit import com.lightbend.lagom.scaladsl.api.ServiceLocator import com.lightbend.lagom.scaladsl.api.ServiceLocator.NoServiceLocator import com.lightbend.lagom.scaladsl.persistence.multinode.{ AbstractClusteredPersistentEntityConfig, AbstractClusteredPersistentEntitySpec } import com.lightbend.lagom.scaladsl.persistence.{ReadSideProcessor, TestEntity} import com.lightbend.lagom.scaladsl.playjson.JsonSerializerRegistry import com.typesafe.config.Config import play.api.{Configuration, Environment, Mode} import play.api.inject.DefaultApplicationLifecycle import scala.concurrent.{ExecutionContext, Future} object CouchbaseClusteredPersistentEntityConfig extends AbstractClusteredPersistentEntityConfig { override def additionalCommonConfig(databasePort: Int): Config = TestConfig.persistenceConfig } class CouchbaseClusteredPersistentEntitySpecMultiJvmNode1 extends CouchbaseClusteredPersistentEntitySpec class CouchbaseClusteredPersistentEntitySpecMultiJvmNode2 extends CouchbaseClusteredPersistentEntitySpec class CouchbaseClusteredPersistentEntitySpecMultiJvmNode3 extends CouchbaseClusteredPersistentEntitySpec class CouchbaseClusteredPersistentEntitySpec extends AbstractClusteredPersistentEntitySpec(CouchbaseClusteredPersistentEntityConfig) { import com.lightbend.lagom.scaladsl.persistence.couchbase.CouchbaseClusteredPersistentEntityConfig._ override protected def atStartup(): Unit = { runOn(node1) { CouchbaseClusterConnection.connect().cleanUp().close() awaitPersistenceInit(system) } enterBarrier("couchbase-started") super.atStartup() } lazy val defaultApplicationLifecycle = new DefaultApplicationLifecycle override lazy val components: CouchbasePersistenceComponents = new CouchbasePersistenceComponents { override def actorSystem: ActorSystem = system override def executionContext: ExecutionContext = system.dispatcher override def materializer: Materializer = ActorMaterializer()(system) override def configuration: Configuration = Configuration(system.settings.config) override def serviceLocator: ServiceLocator = NoServiceLocator override def environment: Environment = Environment(new File("."), getClass.getClassLoader, Mode.Test) override def jsonSerializerRegistry: JsonSerializerRegistry = ??? override def coordinatedShutdown: CoordinatedShutdown = CoordinatedShutdown(system) } def testEntityReadSide = new TestEntityReadSide(components.actorSystem, components.couchbase) override protected def readSideProcessor: () => ReadSideProcessor[TestEntity.Evt] = () => new TestEntityReadSide.TestEntityReadSideProcessor(system, components.couchbaseReadSide) override protected def getAppendCount(id: String): Future[Long] = testEntityReadSide.getAppendCount(id) }
Example 104
Source File: GTMConfig.scala From play-ui with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.play.config import javax.inject.Inject import play.api.Configuration class GTMConfig @Inject()(configuration: Configuration) { val url: Option[String] = readConfig(container => s"gtm.$container.url") val dataLayerUrl: Option[String] = readConfig(_ => "gtm.data.layer.url") def readConfig(configKey: String => String): Option[String] = configuration.getString("gtm.container").map { case container@("transitional" | "main") => configuration .getString(configKey(container)) .getOrElse(throw new RuntimeException(s"Missing configuration ${configKey(container)}")) case _ => throw new IllegalArgumentException("gtm.container should be one of: { transitional, main }") } }
Example 105
Source File: GTMConfig.scala From play-ui with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.play.config import javax.inject.Inject import play.api.Configuration class GTMConfig @Inject()(configuration: Configuration) { val url: Option[String] = readConfig(container => s"gtm.$container.url") val dataLayerUrl: Option[String] = readConfig(_ => "gtm.data.layer.url") def readConfig(configKey: String => String): Option[String] = configuration.getString("gtm.container").map { case container@("transitional" | "main") => configuration .getString(configKey(container)) .getOrElse(throw new RuntimeException(s"Missing configuration ${configKey(container)}")) case _ => throw new IllegalArgumentException("gtm.container should be one of: { transitional, main }") } }
Example 106
Source File: MessagesSupport.scala From play-ui with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.play import play.api.http.HttpConfiguration import play.api.{Configuration, Environment} import play.api.i18n._ import play.api.mvc.MessagesRequest import play.api.test.FakeRequest trait MessagesSupport { implicit lazy val messagesApi: MessagesApi = { val environment = Environment.simple() val configuration = Configuration.load(environment) val langs = new DefaultLangs() new DefaultMessagesApiProvider( environment = environment, config = configuration, langs = langs, httpConfiguration = new HttpConfiguration() ).get } implicit val messages: Messages = new MessagesRequest(FakeRequest(), messagesApi).messages }
Example 107
Source File: OptimizelySnippetSpecs.scala From play-ui with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.play.views.layouts import org.jsoup.Jsoup import org.scalatest.{Matchers, WordSpec} import play.api.Configuration import play.api.test.Helpers._ import uk.gov.hmrc.play.config.OptimizelyConfig import uk.gov.hmrc.play.views.html.layouts.OptimizelySnippet import scala.collection.JavaConverters._ class OptimizelySnippetSpecs extends WordSpec with Matchers { "optimizelySnippet" should { "include script tag if both project id and baseUrl are defined" in { val optimizelyBaseUrl = "http://optimizely.com/" val optimizelyProjectId = "1234567" val snippet = createSnippet(Some(optimizelyBaseUrl), Some(optimizelyProjectId)) scripts(snippet) should contain(s"$optimizelyBaseUrl$optimizelyProjectId.js") } "not include script tag if project id is not defined" in { val snippet = createSnippet(baseUrl = Some("base-url")) scripts(snippet) shouldBe empty } "not include script tag if baseUrl is not defined" in { val snippet = createSnippet(projectId = Some("id")) scripts(snippet) shouldBe empty } } private def createSnippet(baseUrl: Option[String] = None, projectId: Option[String] = None): OptimizelySnippet = new OptimizelySnippet( new OptimizelyConfig( Configuration( Seq( baseUrl.map("optimizely.url" -> _), projectId.map("optimizely.projectId" -> _) ).flatten: _*)) ) private def scripts(snippet: OptimizelySnippet): List[String] = { val content = contentAsString(snippet()) val document = Jsoup.parse(content) document.head().select("script").iterator().asScala.toList.map(_.attr("src")) } }
Example 108
Source File: GTMSnippetSpec.scala From play-ui with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.play.views.layouts import org.jsoup.Jsoup import org.scalatest.prop.PropertyChecks import org.scalatest.{Matchers, WordSpec} import play.api.Configuration import play.api.test.Helpers._ import play.twirl.api.Html import uk.gov.hmrc.play.config.GTMConfig import uk.gov.hmrc.play.views.html.layouts.GTMSnippet import scala.collection.JavaConverters._ class GTMSnippetSpec extends WordSpec with Matchers with PropertyChecks { "gtmSnippet" should { "include script tag with appropriate URL for container if gtm.container is defined" in { val transitionalUrl = "http://s3bucket/transitional/gtm.js" val mainUrl = "http://s3bucket/main/gtm.js" val dataLayerUrl = "http://s3bucket/include/gtm_dl.js" val containersAndUrls = Table( ("container", "url"), ("transitional", transitionalUrl), ("main", mainUrl) ) forAll(containersAndUrls) { (container: String, url: String) => val snippet = createSnippet( container = Some(container), mainUrl = Some(mainUrl), transitionalUrl = Some(transitionalUrl), dataLayerUrl = Some(dataLayerUrl)) script(snippet()) should contain(s"$url") script(snippet()) should contain(s"$dataLayerUrl") } } "not include script tag if gtm.container is not defined" in { val snippet = createSnippet(None, None, None, None) script(snippet()) shouldBe empty } } private def createSnippet( container: Option[String], mainUrl: Option[String], transitionalUrl: Option[String], dataLayerUrl: Option[String]): GTMSnippet = { val config = new GTMConfig( Configuration( Seq( container.map("gtm.container" -> _), mainUrl.map("gtm.main.url" -> _), transitionalUrl.map("gtm.transitional.url" -> _), dataLayerUrl.map("gtm.data.layer.url" -> _) ).flatten: _*)) new GTMSnippet(config) } private def script(html: Html): List[String] = { val content = contentAsString(html) val document = Jsoup.parse(content) document .head() .select("script") .iterator() .asScala .toList .map(_.attr("src")) } }
Example 109
Source File: TestConfigs.scala From play-ui with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.play.views.layouts.test import play.api.Configuration import uk.gov.hmrc.play.config.{AssetsConfig, GTMConfig, OptimizelyConfig} object TestConfigs { val testAssetsConfig = new AssetsConfig( Configuration( "assets.url" -> "doesnt-matter", "assets.version" -> "doesnt-matter" )) val testOptimizelyConfig = new OptimizelyConfig( Configuration( "optimizely.url" -> "doesnt-matter", "optimizely.projectId" -> "doesnt-matter" ) ) val testGTMConfig = new GTMConfig( Configuration( "gtm.container" -> "transitional", "gtm.transitional.url" -> "some transitional url", "gtm.main.url" -> "some main url", "gtm.data.layer.url" -> "some data layer url" ) ) }
Example 110
Source File: BaseModule.scala From silhouette-vuejs-app with Apache License 2.0 | 5 votes |
package modules import com.google.inject.{AbstractModule, Provides} import javax.inject.Named import models.daos.{LoginInfoDAO, LoginInfoDAOImpl} import models.services.captcha.{CaptchaService, ReCaptchaConfig, ReCaptchaService} import models.services.{AuthTokenService, AuthTokenServiceImpl, BruteForceDefenderActor, BruteForceDefenderConf} import net.codingwell.scalaguice.ScalaModule import play.api.Configuration import play.api.libs.concurrent.AkkaGuiceSupport import scala.concurrent.duration._ import scala.concurrent.duration.FiniteDuration override def configure(): Unit = { bind[AuthTokenService].to[AuthTokenServiceImpl] bind[LoginInfoDAO].to[LoginInfoDAOImpl] bind[CaptchaService].to[ReCaptchaService] bindActor[BruteForceDefenderActor]("brute-force-defender") } @Named("SendGridApiKey") @Provides def providesSendGridApiKey(conf: Configuration): String = { conf.get[String]("sendgrid.api.key") } @Provides def providesReCaptchaConfig(conf: Configuration): ReCaptchaConfig = { ReCaptchaConfig(conf.get[String]("recaptcha.secretKey")) } @Provides def providesBruteForceDefenderConf(conf: Configuration): BruteForceDefenderConf = { val attempts = conf.getOptional[Int]("signin.limit.attempts").getOrElse(5) val period = conf.getOptional[FiniteDuration]("signin.limit.period").getOrElse(30.minutes) BruteForceDefenderConf(attempts, period) } }
Example 111
Source File: AbstractAuthController.scala From silhouette-vuejs-app with Apache License 2.0 | 5 votes |
package controllers import com.mohiva.play.silhouette.api.Authenticator.Implicits._ import com.mohiva.play.silhouette.api._ import com.mohiva.play.silhouette.api.services.AuthenticatorResult import com.mohiva.play.silhouette.api.util.Clock import models.User import net.ceedubs.ficus.Ficus._ import play.api.Configuration import play.api.i18n.I18nSupport import play.api.libs.json.Json import play.api.mvc._ import utils.auth.DefaultEnv import scala.concurrent.duration._ import scala.concurrent.{ExecutionContext, Future} protected def authenticateUser(user: User, loginInfo: LoginInfo, rememberMe: Boolean)(implicit request: Request[_]): Future[AuthenticatorResult] = { val c = configuration.underlying silhouette.env.authenticatorService.create(loginInfo).map { case authenticator if rememberMe => authenticator.copy( expirationDateTime = clock.now + c.as[FiniteDuration]("silhouette.authenticator.rememberMe.authenticatorExpiry"), idleTimeout = c.getAs[FiniteDuration]("silhouette.authenticator.rememberMe.authenticatorIdleTimeout") ) case authenticator => authenticator }.flatMap { authenticator => silhouette.env.eventBus.publish(LoginEvent(user, request)) silhouette.env.authenticatorService.init(authenticator).flatMap { token => silhouette.env.authenticatorService.embed(token, Ok(Json.obj( "id" -> user.userID, "token" -> token, "firstName" -> user.firstName, "lastName" -> user.lastName, "role" -> user.role, "email" -> user.email ))) } } } }
Example 112
Source File: SignInController.scala From silhouette-vuejs-app with Apache License 2.0 | 5 votes |
package controllers import com.mohiva.play.silhouette.api._ import com.mohiva.play.silhouette.api.util.Clock import com.mohiva.play.silhouette.impl.providers.CredentialsProvider import forms.SignInForm import javax.inject.Inject import models.services._ import play.api.Configuration import play.api.i18n.I18nSupport import play.api.libs.json.Json import play.api.mvc.{AnyContent, Request} import utils.auth.DefaultEnv import scala.concurrent.{ExecutionContext, Future} def submit = silhouette.UnsecuredAction.async { implicit request: Request[AnyContent] => SignInForm.form.bindFromRequest.fold( _ => Future.successful(BadRequest), data => { authenticateService.credentials(data.email, data.password).flatMap { case Success(user) => val loginInfo = LoginInfo(CredentialsProvider.ID, user.email.get) authenticateUser(user, loginInfo, data.rememberMe) case InvalidPassword(attemptsAllowed) => Future.successful(Forbidden(Json.obj("errorCode" -> "InvalidPassword", "attemptsAllowed" -> attemptsAllowed))) case NonActivatedUserEmail => Future.successful(Forbidden(Json.obj("errorCode" -> "NonActivatedUserEmail"))) case UserNotFound => Future.successful(Forbidden(Json.obj("errorCode" -> "UserNotFound"))) case ToManyAuthenticateRequests(nextAllowedAttemptTime) => Future.successful(TooManyRequests(Json.obj("errorCode" -> "TooManyRequests", "nextAllowedAttemptTime" -> nextAllowedAttemptTime))) } .recover { case e => logger.error(s"Sign in error email = ${data.email}", e) InternalServerError(Json.obj("errorCode" -> "SystemError")) } } ) } }
Example 113
Source File: WSRequest.scala From http-verbs with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.play.http.ws import com.github.ghik.silencer.silent import play.api.libs.ws.{DefaultWSProxyServer, WSClient, WSProxyServer, WSRequest => PlayWSRequest } import play.api.{Configuration, Play} import uk.gov.hmrc.http.HeaderCarrier trait WSRequest extends WSRequestBuilder { import play.api.libs.ws.WS @silent("deprecated") def wsClient: WSClient = WS.client(play.api.Play.current) def buildRequest[A](url: String, headers: Seq[(String, String)] = Seq.empty)(implicit hc: HeaderCarrier): PlayWSRequest = wsClient.url(url) .withHeaders(applicableHeaders(url)(hc): _*) .withHeaders(headers: _*) } trait WSProxy extends WSRequest { def wsProxyServer: Option[WSProxyServer] override def buildRequest[A](url: String, headers: Seq[(String, String)])(implicit hc: HeaderCarrier): PlayWSRequest = wsProxyServer match { case Some(proxy) => super.buildRequest(url, headers).withProxyServer(proxy) case None => super.buildRequest(url, headers) } } object WSProxyConfiguration { def apply(configPrefix: String, configuration: Configuration): Option[WSProxyServer] = { val proxyRequired = configuration.getBoolean(s"$configPrefix.proxyRequiredForThisEnvironment").getOrElse(true) if (proxyRequired) Some(parseProxyConfiguration(configPrefix, configuration)) else None } @silent("deprecated") def apply(configPrefix: String): Option[WSProxyServer] = apply(configPrefix, play.api.Play.current.configuration) private def parseProxyConfiguration(configPrefix: String, configuration: Configuration) = DefaultWSProxyServer( protocol = configuration.getString(s"$configPrefix.protocol").orElse(throw ProxyConfigurationException("protocol")), host = configuration.getString(s"$configPrefix.host").getOrElse(throw ProxyConfigurationException("host")), port = configuration.getInt(s"$configPrefix.port").getOrElse(throw ProxyConfigurationException("port")), principal = configuration.getString(s"$configPrefix.username"), password = configuration.getString(s"$configPrefix.password") ) case class ProxyConfigurationException(key: String) extends RuntimeException(s"Missing proxy configuration - key '$key' not found") }
Example 114
Source File: WSRequest.scala From http-verbs with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.play.http.ws import play.api.Configuration import play.api.libs.ws.{DefaultWSProxyServer, WSClient, WSProxyServer, WSRequest => PlayWSRequest} import uk.gov.hmrc.http.HeaderCarrier trait WSRequest extends WSRequestBuilder { def wsClient: WSClient def buildRequest[A](url: String, headers: Seq[(String, String)] = Seq.empty)(implicit hc: HeaderCarrier): PlayWSRequest = wsClient.url(url) .withHttpHeaders(applicableHeaders(url)(hc): _*) .addHttpHeaders(headers: _*) } trait WSProxy extends WSRequest { def wsProxyServer: Option[WSProxyServer] override def buildRequest[A](url: String, headers: Seq[(String, String)])(implicit hc: HeaderCarrier): PlayWSRequest = wsProxyServer match { case Some(proxy) => super.buildRequest(url, headers).withProxyServer(proxy) case None => super.buildRequest(url, headers) } } object WSProxyConfiguration { def apply(configPrefix: String, configuration: Configuration): Option[WSProxyServer] = { val proxyRequired = configuration.getOptional[Boolean](s"$configPrefix.proxyRequiredForThisEnvironment").getOrElse(true) if (proxyRequired) Some(parseProxyConfiguration(configPrefix, configuration)) else None } private def parseProxyConfiguration(configPrefix: String, configuration: Configuration) = DefaultWSProxyServer( protocol = configuration .getOptional[String](s"$configPrefix.protocol") .orElse(throw ProxyConfigurationException("protocol")), host = configuration.getOptional[String](s"$configPrefix.host").getOrElse(throw ProxyConfigurationException("host")), port = configuration.getOptional[Int](s"$configPrefix.port").getOrElse(throw ProxyConfigurationException("port")), principal = configuration.getOptional[String](s"$configPrefix.username"), password = configuration.getOptional[String](s"$configPrefix.password") ) case class ProxyConfigurationException(key: String) extends RuntimeException(s"Missing proxy configuration - key '$key' not found") }
Example 115
Source File: HttpTimeoutSpec.scala From http-verbs with Apache License 2.0 | 5 votes |
package uk.gov.hmrc.play.http import java.net.{ServerSocket, URI} import java.util.concurrent.TimeoutException import org.scalatest.concurrent.ScalaFutures import org.scalatest.BeforeAndAfterAll import org.scalatest.wordspec.AnyWordSpecLike import org.scalatest.matchers.should.Matchers import org.webbitserver.handler.{DelayedHttpHandler, StringHttpHandler} import org.webbitserver.netty.NettyWebServer import play.api.inject.guice.GuiceApplicationBuilder import play.api.libs.ws.WSClient import play.api.test.WsTestClient import play.api.{Configuration, Play} import uk.gov.hmrc.http.HeaderCarrier import uk.gov.hmrc.play.http.ws.WSHttp import uk.gov.hmrc.play.test.TestHttpCore import scala.concurrent.{Await, ExecutionContext} import scala.concurrent.duration.DurationInt class HttpTimeoutSpec extends AnyWordSpecLike with Matchers with ScalaFutures with BeforeAndAfterAll { import ExecutionContext.Implicits.global lazy val fakeApplication = GuiceApplicationBuilder(configuration = Configuration("play.ws.timeout.request" -> "1000ms")).build() override def beforeAll() { super.beforeAll() Play.start(fakeApplication) } override def afterAll() { super.afterAll() Play.stop(fakeApplication) } WsTestClient.withClient{ client => "HttpCalls" should { "be gracefully timeout when no response is received within the 'timeout' frame" in { val http = new WSHttp with TestHttpCore { override val wsClient = fakeApplication.injector.instanceOf[WSClient] } // get an unused port val ss = new ServerSocket(0) ss.close() val executor = ExecutionContext.global // fromExecutorService(ExecutionContext.global) val publicUri = URI.create(s"http://localhost:${ss.getLocalPort}") val ws = new NettyWebServer(executor, ss.getLocalSocketAddress, publicUri) try { //starts web server ws.add( "/test", new DelayedHttpHandler(executor, 2000, new StringHttpHandler("application/json", "{name:'pong'}"))) ws.start().get() implicit val hc = HeaderCarrier() val start = System.currentTimeMillis() intercept[TimeoutException] { //make request to web server Await.result(http.doPost(s"$publicUri/test", "{name:'ping'}", Seq()), 5.seconds) } val diff = (System.currentTimeMillis() - start).toInt // there is test execution delay around 700ms diff should be >= 1000 diff should be < 2500 } finally { ws.stop() } } } } }
Example 116
Source File: Application.scala From scalajs-spa-tutorial with Apache License 2.0 | 5 votes |
package controllers import java.nio.ByteBuffer import boopickle.Default._ import com.google.inject.Inject import play.api.{Configuration, Environment} import play.api.mvc._ import services.ApiService import spatutorial.shared.Api import scala.concurrent.ExecutionContext.Implicits.global object Router extends autowire.Server[ByteBuffer, Pickler, Pickler] { override def read[R: Pickler](p: ByteBuffer) = Unpickle[R].fromBytes(p) override def write[R: Pickler](r: R) = Pickle.intoBytes(r) } class Application @Inject() (implicit val config: Configuration, env: Environment) extends Controller { val apiService = new ApiService() def index = Action { Ok(views.html.index("SPA tutorial")) } def autowireApi(path: String) = Action.async(parse.raw) { implicit request => println(s"Request path: $path") // get the request body as ByteString val b = request.body.asBytes(parse.UNLIMITED).get // call Autowire route Router.route[Api](apiService)( autowire.Core.Request(path.split("/"), Unpickle[Map[String, ByteBuffer]].fromBytes(b.asByteBuffer)) ).map(buffer => { val data = Array.ofDim[Byte](buffer.remaining()) buffer.get(data) Ok(data) }) } def logging = Action(parse.anyContent) { implicit request => request.body.asJson.foreach { msg => println(s"CLIENT - $msg") } Ok("") } }
Example 117
Source File: Application.scala From ProductWebUI with Apache License 2.0 | 5 votes |
package controllers import java.nio.ByteBuffer import boopickle.Default._ import com.google.inject.Inject import play.api.mvc._ import play.api.{Configuration, Environment} import play.api.Environment._ import services.ApiService import shared.Api import scala.concurrent.ExecutionContext.Implicits.global object Router extends autowire.Server[ByteBuffer, Pickler, Pickler] { override def read[R: Pickler](p: ByteBuffer) = Unpickle[R].fromBytes(p) override def write[R: Pickler](r: R) = Pickle.intoBytes(r) } class Application @Inject()(implicit val config: Configuration, env: Environment) extends Controller { val apiService = new ApiService() def index = Action { Ok(views.html.index("LivelyGig")) // Ok(views.html.index("Welcome to Synereo - the decentralized and distributed social network")) } def logging = Action(parse.anyContent) { implicit request => request.body.asJson.foreach { msg => println(s"Application - CLIENT - $msg") } Ok("") } def autowireApi(path: String) = Action.async(parse.raw) { implicit request => println(s"Request path: $path") // get the request body as ByteString val b = request.body.asBytes(parse.UNLIMITED).get // call Autowire route Router.route[Api](apiService)( autowire.Core.Request(path.split("/"), Unpickle[Map[String, ByteBuffer]].fromBytes(b.asByteBuffer)) ).map(buffer => { val data = Array.ofDim[Byte](buffer.remaining()) buffer.get(data) Ok(data) }) } }
Example 118
Source File: HoconMessagesApi.scala From play-i18n-hocon with Apache License 2.0 | 5 votes |
package com.marcospereira.play.i18n import java.net.URL import java.util.Properties import javax.inject.{ Inject, Singleton } import com.typesafe.config.ConfigFactory import play.api.http.HttpConfiguration import play.api.i18n._ import play.api.inject.Module import play.api.{ Configuration, Environment } import play.utils.Resources import scala.collection.JavaConverters._ @Singleton class HoconMessagesApiProvider @Inject() ( environment: Environment, config: Configuration, langs: Langs, httpConfiguration: HttpConfiguration ) extends DefaultMessagesApiProvider(environment, config, langs, httpConfiguration) { override lazy val get: MessagesApi = { new DefaultMessagesApi( loadAllMessages, langs, langCookieName = langCookieName, langCookieSecure = langCookieSecure, langCookieHttpOnly = langCookieHttpOnly, httpConfiguration = httpConfiguration ) } override protected def loadMessages(file: String): Map[String, String] = { getResources(file) .filterNot(url => Resources.isDirectory(environment.classLoader, url)).reverse .map(getMessages) .foldLeft(Map.empty[String, String]) { _ ++ _ } } override protected def loadAllMessages: Map[String, Map[String, String]] = { langs.availables.map(_.code).map { lang => (lang, loadMessages(s"messages.$lang.conf")) }.toMap ++ Map( "default" -> loadMessages("messages.conf"), "default.play" -> loadMessages("messages.default") ) } override protected def joinPaths(first: Option[String], second: String) = first match { case Some(parent) => new java.io.File(parent, second).getPath case None => second } private def getResources(file: String): List[URL] = { environment.classLoader.getResources(joinPaths(messagesPrefix, file)).asScala.toList } private def getMessages(url: URL): Map[String, String] = { // messages.default is bundled with play and it is a properties file val config = if (url.toString.endsWith("messages.default")) { ConfigFactory.parseProperties(getProperties(url)) } else { ConfigFactory.parseURL(url) } config.resolve().entrySet().asScala .map(e => e.getKey -> String.valueOf(e.getValue.unwrapped())) .toMap } private def getProperties(url: URL): Properties = { val properties = new Properties() val input = url.openStream() try { properties.load(input) } finally { input.close() } properties } } trait HoconI18nComponents extends I18nComponents { def environment: Environment def configuration: Configuration def httpConfiguration: HttpConfiguration def langs: Langs override lazy val messagesApi: MessagesApi = new HoconMessagesApiProvider(environment, configuration, langs, httpConfiguration).get }
Example 119
Source File: KubeServiceRegistration.scala From lagom-on-kube with Apache License 2.0 | 5 votes |
package me.alexray.lagom.kube.client import java.net.URI import akka.actor.ActorSystem import com.lightbend.lagom.internal.scaladsl.registry.{ServiceRegistry, ServiceRegistryService} import com.lightbend.lagom.scaladsl.api.ServiceInfo import play.api.inject.ApplicationLifecycle import play.api.{Configuration, Logger} import scala.concurrent.duration._ import scala.concurrent.{ExecutionContext, Future} import scala.language.postfixOps import scala.util.{Failure, Success} class KubeServiceRegistration(serviceInfo: ServiceInfo, lifecycle: ApplicationLifecycle, config: Configuration, registry: ServiceRegistry, actorSystem: ActorSystem)(implicit ec: ExecutionContext) { private val logger: Logger = Logger(this.getClass) private val uri = { val httpAddress = config.getString("service.http.address") .getOrElse(config.underlying.getString("play.server.http.address")) val httpPort = config.getString("play.server.http.port").get val uri = s"http://$httpAddress:$httpPort" logger.info(s"uri: $uri") URI.create(uri) } def completeServiceName(name: String): String = name + "-" + config.getString("service.instance.suffix").getOrElse("default").hashCode lifecycle.addStopHook { () => Future.sequence(serviceInfo.locatableServices.map { case (service, _) => registry.unregister(completeServiceName(service)).invoke() }).map(_ => ()) } private def heartBeat(): Unit = { actorSystem.scheduler.schedule(1 seconds, 1 minutes) { logger.debug("register service heartbeat ") register() } } private def register(): Unit = { serviceInfo.locatableServices.foreach { case (service, acls) => registry.register(completeServiceName(service)) .invoke(ServiceRegistryService(uri, acls)) .onComplete { case Success(_) => logger.info(s"Service name=[$service] successfully registered with service locator.") case Failure(e) => logger.error(s"Service name=[$service] couldn't register itself to the service locator.", e) logger.info("Service will try to register in 10 seconds with next heartbeat event") } } } heartBeat() }
Example 120
Source File: WolframServiceImpl.scala From lagom-on-kube with Apache License 2.0 | 5 votes |
package me.alexray.wolfram.impl import java.net.URLEncoder import akka.NotUsed import akka.actor.ActorSystem import akka.http.scaladsl.Http import akka.http.scaladsl.model.{HttpRequest, Uri} import akka.http.scaladsl.unmarshalling.Unmarshal import akka.stream.Materializer import akka.util.ByteString import com.lightbend.lagom.scaladsl.api.ServiceCall import me.alexray.wolfram.api.WolframService import play.api.Configuration import scala.concurrent.{ExecutionContext, Future} class WolframServiceImpl(config: Configuration) (implicit system: ActorSystem, mat: Materializer, ec: ExecutionContext) extends WolframService { val appID = config.underlying.getString("wolfram.appid") val apiUrl = s"http://api.wolframalpha.com/v2/" override def query(q: String): ServiceCall[NotUsed, String] = ServiceCall { _ => val url = apiUrl + s"query?appid=$appID&input=" + URLEncoder.encode(q, "UTF-8") for { response <- Http().singleRequest(HttpRequest(uri = Uri(url))) if response.status.isSuccess() data <- Unmarshal(response).to[String] } yield data } override def simple(q: String): ServiceCall[NotUsed, Array[Byte]] = ServiceCall { _ => println(s"quetions = '$q'") val url = apiUrl + s"simple?appid=$appID&input=" + URLEncoder.encode(q, "UTF-8").replace("+", "%20") println(s"url = '$url'") for { response <- Http().singleRequest(HttpRequest(uri = Uri(url))) if response.status.isSuccess() bytes <- Unmarshal(response).to[ByteString] } yield { println(s"received image ${bytes.size} bytes long") bytes.toArray } } }
Example 121
Source File: MillinerHatSignup.scala From HAT2.0 with GNU Affero General Public License v3.0 | 5 votes |
package org.hatdex.hat.resourceManagement import org.hatdex.hat.resourceManagement.models.HatSignup import play.api.cache.AsyncCacheApi import play.api.http.Status._ import play.api.libs.json.{ JsError, JsSuccess } import play.api.libs.ws.{ WSClient, WSRequest, WSResponse } import play.api.{ Configuration, Logger } import scala.concurrent.duration._ import scala.concurrent.{ ExecutionContext, Future } trait MillinerHatSignup { val logger: Logger val ws: WSClient val configuration: Configuration val schema: String = configuration.get[String]("resourceManagement.millinerAddress") match { case address if address.startsWith("https") => "https://" case address if address.startsWith("http") => "http://" case _ => "https://" } val millinerAddress: String = configuration.get[String]("resourceManagement.millinerAddress") .stripPrefix("http://") .stripPrefix("https://") val hatSharedSecret: String = configuration.get[String]("resourceManagement.hatSharedSecret") val cache: AsyncCacheApi def getHatSignup(hatAddress: String)(implicit ec: ExecutionContext): Future[HatSignup] = { // Cache the signup information for subsequent calls (For private/public key and database details) cache.getOrElseUpdate[HatSignup](s"configuration:$hatAddress") { val request: WSRequest = ws.url(s"$schema$millinerAddress/api/manage/configuration/$hatAddress") .withVirtualHost(millinerAddress) .withHttpHeaders("Accept" -> "application/json", "X-Auth-Token" -> hatSharedSecret) val futureResponse: Future[WSResponse] = request.get() futureResponse.map { response => response.status match { case OK => response.json.validate[HatSignup] match { case signup: JsSuccess[HatSignup] => logger.debug(s"Got back configuration: ${signup.value}") cache.set(s"configuration:$hatAddress", signup.value, 1.minute) signup.value case e: JsError => logger.error(s"Parsing HAT configuration failed: $e") throw new HatServerDiscoveryException("Fetching HAT configuration failed") } case _ => logger.error(s"Fetching HAT configuration failed: ${response.body}") throw new HatServerDiscoveryException("Fetching HAT configuration failed") } } } } }
Example 122
Source File: HatServerProviderActor.scala From HAT2.0 with GNU Affero General Public License v3.0 | 5 votes |
package org.hatdex.hat.resourceManagement.actors import javax.inject.Inject import akka.actor.{ Props, _ } import akka.util.Timeout import org.hatdex.hat.api.service.RemoteExecutionContext import org.hatdex.hat.utils.ActiveHatCounter import play.api.libs.concurrent.InjectedActorSupport import play.api.{ Configuration, Logger } import scala.collection.mutable import scala.concurrent.Future import scala.concurrent.duration._ import scala.util.{ Failure, Success } class HatServerProviderActor @Inject() ( hatServerActorFactory: HatServerActor.Factory, activeHatcounter: ActiveHatCounter, configuration: Configuration)( implicit val ec: RemoteExecutionContext) extends Actor with InjectedActorSupport { private val log = Logger(this.getClass) import HatServerProviderActor._ private val activeServers = mutable.HashMap[String, ActorRef]() private implicit val hatServerTimeout: Timeout = configuration.get[FiniteDuration]("resourceManagement.serverProvisioningTimeout") def receive: Receive = { case HatServerRetrieve(hat) => log.debug(s"Retrieve HAT server $hat for $sender") val retrievingSender = sender getHatServerActor(hat) map { hatServerActor => log.debug(s"Got HAT server provider actor, forwarding retrieval message with sender $sender $retrievingSender") hatServerActor tell (HatServerActor.HatRetrieve(), retrievingSender) } onComplete { case Success(_) ⇒ () case Failure(e) ⇒ log.warn(s"Error while getting HAT server provider actor: ${e.getMessage}") } case HatServerStarted(_) => activeHatcounter.increase() case HatServerStopped(_) => activeHatcounter.decrease() case message => log.debug(s"Received unexpected message $message") } private def getHatServerActor(hat: String): Future[ActorRef] = { doFindOrCreate(hat, hatServerTimeout.duration / 4) } private val maxAttempts = 3 private def doFindOrCreate(hat: String, timeout: FiniteDuration, depth: Int = 0): Future[ActorRef] = { if (depth >= maxAttempts) { log.error(s"HAT server actor for $hat not resolved") throw new RuntimeException(s"Can not create actor for $hat and reached max attempts of $maxAttempts") } val selection = s"/user/hatServerProviderActor/hat:$hat" context.actorSelection(selection).resolveOne(timeout) map { hatServerActor => log.debug(s"HAT server actor $selection resolved") hatServerActor } recoverWith { case ActorNotFound(_) => log.debug(s"HAT server actor ($selection) not found, injecting child") val hatServerActor = injectedChild(hatServerActorFactory(hat), s"hat:$hat", props = (props: Props) => props.withDispatcher("hat-server-provider-actor-dispatcher")) activeServers(hat) = hatServerActor log.debug(s"Injected actor $hatServerActor") doFindOrCreate(hat, timeout, depth + 1) } } } object HatServerProviderActor { case class HatServerRetrieve(hat: String) case class HatServerStarted(hat: String) case class HatServerStopped(hat: String) }
Example 123
Source File: HatDatabaseProvider.scala From HAT2.0 with GNU Affero General Public License v3.0 | 5 votes |
package org.hatdex.hat.resourceManagement import javax.inject.{ Inject, Singleton } import com.typesafe.config.{ Config, ConfigFactory } import org.hatdex.hat.dal.HatDbSchemaMigration import org.hatdex.hat.resourceManagement.models.HatSignup import org.hatdex.libs.dal.HATPostgresProfile.api.Database import play.api.cache.AsyncCacheApi import play.api.libs.ws.WSClient import play.api.{ Configuration, Logger } import scala.concurrent.{ ExecutionContext, Future } import scala.collection.JavaConverters._ import scala.concurrent.duration.Duration trait HatDatabaseProvider { protected val configuration: Configuration def database(hat: String)(implicit ec: ExecutionContext): Future[Database] def shutdown(db: Database): Future[Unit] = { // Execution context for the future is defined by specifying the executor during initialisation db.shutdown } def update(db: Database)(implicit ec: ExecutionContext): Future[Unit] = { new HatDbSchemaMigration(configuration, db, ec).run("hat.schemaMigrations") } } @Singleton class HatDatabaseProviderConfig @Inject() (val configuration: Configuration) extends HatDatabaseProvider { def database(hat: String)(implicit ec: ExecutionContext): Future[Database] = { Future { Database.forConfig(s"hat.${hat.replace(':', '.')}.database", configuration.underlying) } recoverWith { case e => Future.failed(new HatServerDiscoveryException(s"Database configuration for $hat incorrect or unavailable", e)) } } } @Singleton class HatDatabaseProviderMilliner @Inject() ( val configuration: Configuration, val cache: AsyncCacheApi, val ws: WSClient) extends HatDatabaseProvider with MillinerHatSignup { val logger = Logger(this.getClass) def database(hat: String)(implicit ec: ExecutionContext): Future[Database] = { getHatSignup(hat) map { signup => val config = signupDatabaseConfig(signup) // val databaseUrl = s"jdbc:postgresql://${signup.databaseServer.get.host}:${signup.databaseServer.get.port}/${signup.database.get.name}" // val executor = AsyncExecutor(hat, numThreads = 3, queueSize = 1000) // Database.forURL(databaseUrl, signup.database.get.name, signup.database.get.password, driver = "org.postgresql.Driver" ) Database.forConfig("", config) } } def signupDatabaseConfig(signup: HatSignup): Config = { val database = signup.database.get val config = Map( "dataSourceClass" -> "org.postgresql.ds.PGSimpleDataSource", "properties" -> Map[String, String]( "user" -> database.name, "password" -> database.password, "databaseName" -> database.name, "portNumber" -> signup.databaseServer.get.port.toString, "serverName" -> signup.databaseServer.get.host).asJava, "numThreads" -> configuration.get[Int]("resourceManagement.hatDBThreads").toString, "idleTimeout" -> configuration.get[Duration]("resourceManagement.hatDBIdleTimeout").toMillis.toString).asJava ConfigFactory.parseMap(config) } }
Example 124
Source File: HatServerProvider.scala From HAT2.0 with GNU Affero General Public License v3.0 | 5 votes |
package org.hatdex.hat.resourceManagement import java.io.StringWriter import java.security.interfaces.RSAPublicKey import javax.inject.{ Inject, Named, Singleton } import akka.actor.ActorRef import akka.pattern.ask import akka.util.Timeout import com.mohiva.play.silhouette.api.services.DynamicEnvironmentProviderService import org.bouncycastle.util.io.pem.{ PemObject, PemWriter } import org.hatdex.hat.api.service.RemoteExecutionContext import org.hatdex.hat.resourceManagement.actors.HatServerProviderActor import org.hatdex.hat.utils.LoggingProvider import play.api.cache.{ AsyncCacheApi, NamedCache } import play.api.Configuration import play.api.mvc.Request import scala.concurrent.Future import scala.concurrent.duration._ trait HatServerProvider extends DynamicEnvironmentProviderService[HatServer] { def retrieve[B](request: Request[B]): Future[Option[HatServer]] def retrieve(hatAddress: String): Future[Option[HatServer]] def toString(publicKey: RSAPublicKey): String = { val pemObject = new PemObject("PUBLIC KEY", publicKey.getEncoded) val stringPemWriter = new StringWriter() val pemWriter: PemWriter = new PemWriter(stringPemWriter) pemWriter.writeObject(pemObject) pemWriter.flush() val pemPublicKey = stringPemWriter.toString pemPublicKey } } @Singleton class HatServerProviderImpl @Inject() ( configuration: Configuration, @NamedCache("hatserver-cache") cache: AsyncCacheApi, loggingProvider: LoggingProvider, @Named("hatServerProviderActor") serverProviderActor: ActorRef)( implicit val ec: RemoteExecutionContext) extends HatServerProvider { private val logger = loggingProvider.logger(this.getClass) def retrieve[B](request: Request[B]): Future[Option[HatServer]] = { val hatAddress = request.host //.split(':').headOption.getOrElse(request.host) retrieve(hatAddress) } implicit val timeout: Timeout = configuration.get[FiniteDuration]("resourceManagement.serverProvisioningTimeout") implicit val serverInfoTimeout: Duration = configuration.get[FiniteDuration]("resourceManagement.serverIdleTimeout") def retrieve(hatAddress: String): Future[Option[HatServer]] = { cache.get[HatServer](s"server:$hatAddress") .flatMap { case Some(server) => Future.successful(Some(server)) case _ => (serverProviderActor ? HatServerProviderActor.HatServerRetrieve(hatAddress)) map { case server: HatServer => logger.debug(s"Got back server $server") cache.set(s"server:$hatAddress", server, serverInfoTimeout) Some(server) case error: HatServerDiscoveryException => logger.warn(s"Got back error $error") throw error case message => logger.warn(s"Unknown message $message from HAT Server provider actor") val error = new HatServerDiscoveryException("Unknown message") throw error } recoverWith { case e => logger.warn(s"Error while retrieving HAT $hatAddress info: ${e.getMessage}") val error = new HatServerDiscoveryException("HAT Server info retrieval failed", e) throw error } } } }
Example 125
Source File: HatTestServerProviderModule.scala From HAT2.0 with GNU Affero General Public License v3.0 | 5 votes |
package org.hatdex.hat.modules import akka.actor.ActorSystem import com.google.inject.{ AbstractModule, Provides } import net.codingwell.scalaguice.ScalaModule import org.hatdex.hat.api.service.RemoteExecutionContext import org.hatdex.hat.api.service.applications.{ TrustedApplicationProvider, TrustedApplicationProviderDex } import org.hatdex.hat.resourceManagement._ import org.hatdex.hat.resourceManagement.actors.{ HatServerActor, HatServerProviderActor } import play.api.cache.AsyncCacheApi import play.api.cache.ehcache.EhCacheComponents import play.api.inject.ApplicationLifecycle import play.api.libs.concurrent.AkkaGuiceSupport import play.api.{ Configuration, Environment } class HatTestServerProviderModule extends AbstractModule with ScalaModule with AkkaGuiceSupport { override def configure() = { bindActor[HatServerProviderActor]("hatServerProviderActor") bindActorFactory[HatServerActor, HatServerActor.Factory] bind[HatDatabaseProvider].to[HatDatabaseProviderConfig] bind[HatKeyProvider].to[HatKeyProviderConfig] bind[HatServerProvider].to[HatServerProviderImpl] bind[TrustedApplicationProvider].to[TrustedApplicationProviderDex] () } @Provides @play.cache.NamedCache("hatserver-cache") def provideHatServerCache(env: Environment, config: Configuration, lifecycle: ApplicationLifecycle, system: ActorSystem)(implicit ec: RemoteExecutionContext): AsyncCacheApi = { val cacheComponents = new EhCacheComponents { def environment: Environment = env def configuration: Configuration = config.get[Configuration]("hat.serverProvider") def applicationLifecycle: ApplicationLifecycle = lifecycle def actorSystem: ActorSystem = system implicit def executionContext = ec } cacheComponents.cacheApi("hatserver-cache", create = true) } }
Example 126
Source File: DevHatInitializationModule.scala From HAT2.0 with GNU Affero General Public License v3.0 | 5 votes |
package org.hatdex.hat.modules import java.util.UUID import com.typesafe.config.Config import javax.inject.Inject import net.codingwell.scalaguice.ScalaModule import org.hatdex.hat.api.models.{ Owner, Platform } import org.hatdex.hat.api.service.{ DalExecutionContext, UsersService } import org.hatdex.hat.authentication.models.HatUser import org.hatdex.hat.dal.HatDbSchemaMigration import org.hatdex.hat.resourceManagement.{ HatServer, HatServerProvider } import play.api.libs.concurrent.AkkaGuiceSupport import play.api.{ ConfigLoader, Configuration, Logger } import scala.concurrent.Future class DevHatInitializationModule extends ScalaModule with AkkaGuiceSupport { override protected def configure(): Unit = { bind[DevHatInitializer].asEagerSingleton() } } class DevHatInitializer @Inject() ( configuration: Configuration, serverProvider: HatServerProvider, usersService: UsersService)(implicit ec: DalExecutionContext) { val logger = Logger(this.getClass) import DevHatConfig.configLoader val devHats = configuration.get[Map[String, DevHatConfig]]("devhats") val devHatMigrations = configuration.get[Seq[String]]("devhatMigrations") logger.info(s"Initializing HATs: $devHats") devHats.values.map(initializeHat) def initializeHat(hat: DevHatConfig) = { val hatServer: Future[HatServer] = serverProvider.retrieve(hat.domain).map(_.get) val eventuallyMigrated = for { server ← hatServer _ ← new HatDbSchemaMigration(configuration, server.db, ec).run(devHatMigrations) _ ← setupCredentials(hat)(server) } yield () eventuallyMigrated map { _ => logger.info(s"Database successfully initialized for ${hat.owner}") } recover { case e => logger.error(s"Database initialisation failed for ${hat.owner}: ${e.getMessage}", e) } map { _ => logger.debug(s"Shutting down connection to database for ${hat.owner}") // hatServer.map(_.db.shutdown) } } def setupCredentials(hat: DevHatConfig)(implicit server: HatServer): Future[Unit] = { logger.debug(s"Setup credentials for ${hat.owner}") val ownerId = UUID.fromString("694dd8ed-56ae-4910-abf1-6ec4887b4c42") val platformId = UUID.fromString("6507ae16-13d7-479b-8ebc-65c28fec1634") for { savedOwner <- usersService.saveUser(HatUser(ownerId, hat.owner, Some(hat.ownerPasswordHash), hat.ownerName, Seq(Owner()), enabled = true)) savedPlatform <- usersService.saveUser(HatUser(platformId, hat.platform, Some(hat.platformPasswordHash), hat.platformName, Seq(Platform()), enabled = true)) } yield { logger.info(s"Saved owner: $savedOwner") logger.info(s"Saved platform: $savedPlatform") () } } } case class DevHatConfig( owner: String, domain: String, ownerName: String, ownerPasswordHash: String, platform: String, platformName: String, platformPasswordHash: String, database: Config) object DevHatConfig { implicit val configLoader: ConfigLoader[DevHatConfig] = new ConfigLoader[DevHatConfig] { def load(rootConfig: Config, path: String): DevHatConfig = { val config = ConfigLoader.configurationLoader.load(rootConfig, path) DevHatConfig( owner = config.get[String]("owner"), domain = config.get[String]("domain"), ownerName = config.get[String]("ownerName"), ownerPasswordHash = config.get[String]("ownerPasswordHash"), platform = config.get[String]("platform"), platformName = config.get[String]("platformName"), platformPasswordHash = config.get[String]("platformPasswordHash"), database = config.get[Config]("database")) } } }
Example 127
Source File: SHEModule.scala From HAT2.0 with GNU Affero General Public License v3.0 | 5 votes |
package org.hatdex.hat.modules import com.google.inject.{ AbstractModule, Provides } import com.typesafe.config.Config import net.codingwell.scalaguice.ScalaModule import org.hatdex.hat.api.models.applications.Version import org.hatdex.hat.she.models.LambdaFunctionLoader import org.hatdex.hat.she.service.{ FunctionExecutableRegistry, FunctionExecutionTriggerHandler } import org.hatdex.hat.utils.FutureTransformations import play.api.libs.concurrent.AkkaGuiceSupport import play.api.{ ConfigLoader, Configuration, Logger } import scala.collection.JavaConverters._ import scala.concurrent.duration._ import scala.concurrent.{ Await, ExecutionContext, Future } class SHEModule extends AbstractModule with ScalaModule with AkkaGuiceSupport { val logger = Logger(this.getClass) override def configure() = { bind[FunctionExecutionTriggerHandler].asEagerSingleton() () } implicit val seqFunctionConfigLoader: ConfigLoader[Seq[FunctionConfig]] = new ConfigLoader[Seq[FunctionConfig]] { def load(config: Config, path: String): Seq[FunctionConfig] = { val configs = config.getConfigList(path).asScala logger.info(s"Got SHE function configs: $configs") configs.map { config ⇒ FunctionConfig( config.getString("id"), Version(config.getString("version")), config.getString("baseUrl"), config.getString("namespace"), config.getString("endpoint"), config.getBoolean("experimental")) } } } @Provides def provideFunctionExecutableRegistry( config: Configuration, loader: LambdaFunctionLoader)(implicit ec: ExecutionContext): FunctionExecutableRegistry = { val includeExperimental: Boolean = config.getOptional[Boolean]("she.beta").getOrElse(false) val eventuallyFunctionsLoaded = Future.sequence( config.get[Seq[FunctionConfig]]("she.functions") .filter(c => !c.experimental || (includeExperimental && c.experimental)) .map(c ⇒ FutureTransformations.futureToFutureTry(loader.load(c.id, c.version, c.baseUrl, c.namespace, c.endpoint)))) val functionsLoaded = Await.result(eventuallyFunctionsLoaded, 30.seconds) // ignore any functions that failed to load without stopping the whole application new FunctionExecutableRegistry(functionsLoaded.filter(_.isSuccess).flatMap(_.toOption)) } case class FunctionConfig(id: String, version: Version, baseUrl: String, namespace: String, endpoint: String, experimental: Boolean) }
Example 128
Source File: HatServerProviderModule.scala From HAT2.0 with GNU Affero General Public License v3.0 | 5 votes |
package org.hatdex.hat.modules import akka.actor.ActorSystem import com.google.inject.{ AbstractModule, Provides } import net.codingwell.scalaguice.ScalaModule import org.hatdex.hat.api.service.RemoteExecutionContext import org.hatdex.hat.api.service.applications.{ TrustedApplicationProvider, TrustedApplicationProviderDex } import org.hatdex.hat.resourceManagement._ import org.hatdex.hat.resourceManagement.actors.{ HatServerActor, HatServerProviderActor } import play.api.cache.AsyncCacheApi import play.api.cache.ehcache._ import play.api.inject.ApplicationLifecycle import play.api.libs.concurrent.AkkaGuiceSupport import play.api.{ Configuration, Environment } class HatServerProviderModule extends AbstractModule with ScalaModule with AkkaGuiceSupport { override def configure() = { bindActor[HatServerProviderActor]("hatServerProviderActor") bindActorFactory[HatServerActor, HatServerActor.Factory] bind[HatDatabaseProvider].to[HatDatabaseProviderMilliner] bind[HatKeyProvider].to[HatKeyProviderMilliner] bind[HatServerProvider].to[HatServerProviderImpl] bind[TrustedApplicationProvider].to[TrustedApplicationProviderDex] () } @Provides @play.cache.NamedCache("hatserver-cache") def provideHatServerCache(env: Environment, config: Configuration, lifecycle: ApplicationLifecycle, system: ActorSystem)(implicit ec: RemoteExecutionContext): AsyncCacheApi = { val cacheComponents = new EhCacheComponents { def environment: Environment = env def configuration: Configuration = config.get[Configuration]("hat.serverProvider") def applicationLifecycle: ApplicationLifecycle = lifecycle def actorSystem: ActorSystem = system implicit def executionContext = ec } cacheComponents.cacheApi("hatserver-cache", create = true) } }
Example 129
Source File: FileManagerModule.scala From HAT2.0 with GNU Affero General Public License v3.0 | 5 votes |
package org.hatdex.hat.modules import com.amazonaws.auth.{ AWSStaticCredentialsProvider, BasicAWSCredentials } import com.amazonaws.services.s3.{ AmazonS3, AmazonS3ClientBuilder } import com.google.inject.name.Named import com.google.inject.{ AbstractModule, Provides } import net.codingwell.scalaguice.ScalaModule import org.hatdex.hat.api.service.{ AwsS3Configuration, FileManager, FileManagerS3 } import play.api.Configuration import play.api.libs.concurrent.AkkaGuiceSupport class FileManagerModule extends AbstractModule with ScalaModule with AkkaGuiceSupport { override def configure() = { bind[FileManager].to[FileManagerS3] () } @Provides def provideCookieAuthenticatorService(configuration: Configuration): AwsS3Configuration = { import AwsS3Configuration.configLoader configuration.get[AwsS3Configuration]("storage.s3Configuration") } @Provides @Named("s3client-file-manager") def provides3Client(configuration: AwsS3Configuration): AmazonS3 = { val awsCreds: BasicAWSCredentials = new BasicAWSCredentials(configuration.accessKeyId, configuration.secretKey) AmazonS3ClientBuilder.standard() .withRegion(configuration.region) .withCredentials(new AWSStaticCredentialsProvider(awsCreds)) .build() } }
Example 130
Source File: TrustedApplicationProvider.scala From HAT2.0 with GNU Affero General Public License v3.0 | 5 votes |
package org.hatdex.hat.api.service.applications import javax.inject.Inject import org.hatdex.dex.apiV2.services.DexClient import org.hatdex.hat.api.models.applications.Application import org.hatdex.hat.api.service.RemoteExecutionContext import play.api.Configuration import play.api.cache.AsyncCacheApi import play.api.libs.ws.WSClient import scala.concurrent.Future import scala.concurrent.duration.FiniteDuration import scala.concurrent.duration._ trait TrustedApplicationProvider { def applications: Future[Seq[Application]] def application(id: String): Future[Option[Application]] } class TrustedApplicationProviderDex @Inject() ( wsClient: WSClient, configuration: Configuration, cache: AsyncCacheApi)(implicit val rec: RemoteExecutionContext) extends TrustedApplicationProvider { private val dexClient = new DexClient( wsClient, configuration.underlying.getString("exchange.address"), configuration.underlying.getString("exchange.scheme"), "v1.1") private val includeUnpublished: Boolean = configuration.getOptional[Boolean]("exchange.beta").getOrElse(false) private val dexApplicationsCacheDuration: FiniteDuration = 30.minutes def applications: Future[Seq[Application]] = { cache.getOrElseUpdate("apps:dexApplications", dexApplicationsCacheDuration) { dexClient.applications(includeUnpublished = includeUnpublished) } } def application(id: String): Future[Option[Application]] = { applications.map(_.find(_.id == id)) } }
Example 131
Source File: Mailer.scala From HAT2.0 with GNU Affero General Public License v3.0 | 5 votes |
package org.hatdex.hat.utils import javax.inject.Inject import akka.Done import akka.actor.ActorSystem import org.hatdex.hat.api.service.RemoteExecutionContext import org.hatdex.hat.authentication.models.HatUser import org.hatdex.hat.phata.views import org.hatdex.hat.resourceManagement.HatServer import play.api.i18n.{ Lang, Messages, MessagesApi } import play.api.libs.mailer.{ Email, MailerClient } import play.api.mvc.RequestHeader import play.api.{ Configuration, UsefulException } import play.twirl.api.Html import scala.concurrent.{ ExecutionContext, Future } trait Mailer { protected val configuration: Configuration protected val system: ActorSystem protected val mailerClient: MailerClient import scala.language.implicitConversions implicit def html2String(html: Html): String = html.toString def serverErrorNotify(request: RequestHeader, exception: UsefulException)(implicit m: Messages): Done def serverExceptionNotify(request: RequestHeader, exception: Throwable)(implicit m: Messages): Done def sendEmail(recipients: String*)(from: String, subject: String, bodyHtml: String, bodyText: String)(implicit ec: ExecutionContext): Future[Done] = { Future(mailerClient.send(Email(subject, from, recipients, Some(bodyText), Some(bodyHtml)))) .map(_ => Done) } } trait HatMailer extends Mailer { def serverErrorNotify(request: RequestHeader, exception: UsefulException)(implicit m: Messages): Done def serverExceptionNotify(request: RequestHeader, exception: Throwable)(implicit m: Messages): Done def passwordReset(email: String, user: HatUser, resetLink: String)(implicit m: Messages, server: HatServer): Done def passwordChanged(email: String, user: HatUser)(implicit m: Messages, server: HatServer): Done def claimHat(email: String, claimLink: String, maybePartnerDetails: Option[(String, String)])(implicit m: MessagesApi, l: Lang, server: HatServer): Done } class HatMailerImpl @Inject() ( val configuration: Configuration, val system: ActorSystem, val mailerClient: MailerClient)(implicit ec: RemoteExecutionContext) extends HatMailer { private val emailFrom = configuration.get[String]("play.mailer.from") private val adminEmails = configuration.get[Seq[String]]("exchange.admin") def serverErrorNotify(request: RequestHeader, exception: UsefulException)(implicit m: Messages): Done = { sendEmail(adminEmails: _*)( from = emailFrom, subject = s"HAT server ${request.host} error #${exception.id}", bodyHtml = views.html.mails.emailServerError(request, exception), bodyText = views.html.mails.emailServerError(request, exception).toString()) Done } def serverExceptionNotify(request: RequestHeader, exception: Throwable)(implicit m: Messages): Done = { sendEmail(adminEmails: _*)( from = emailFrom, subject = s"HAT server ${request.host} error: ${exception.getMessage} for ${request.path + request.rawQueryString}", bodyHtml = views.html.mails.emailServerThrowable(request, exception), bodyText = views.html.mails.emailServerThrowable(request, exception).toString()) Done } def passwordReset(email: String, user: HatUser, resetLink: String)(implicit m: Messages, server: HatServer): Done = { sendEmail(email)( from = emailFrom, subject = s"HAT ${server.domain} - reset your password", bodyHtml = views.html.mails.emailPasswordReset(user, server.domain, resetLink), bodyText = views.txt.mails.emailPasswordReset(user, server.domain, resetLink).toString()) Done } def passwordChanged(email: String, user: HatUser)(implicit m: Messages, server: HatServer): Done = { sendEmail(email)( from = emailFrom, subject = s"HAT ${server.domain} - password changed", bodyHtml = views.html.mails.emailPasswordChanged(user, server.domain), bodyText = views.txt.mails.emailPasswordChanged(user, server.domain).toString()) Done } def claimHat(email: String, claimLink: String, maybePartnerDetails: Option[(String, String)])(implicit m: MessagesApi, l: Lang, server: HatServer): Done = { sendEmail(email)( from = "[email protected]", subject = m("email.hatclaim.subject", maybePartnerDetails.map(_._1).getOrElse("")), bodyHtml = views.html.mails.emailHatClaim(server.domain, claimLink, maybePartnerDetails), bodyText = views.txt.mails.emailHatClaim(server.domain, claimLink, maybePartnerDetails.map(_._1)).toString()) Done } }
Example 132
Source File: LoggingFilter.scala From HAT2.0 with GNU Affero General Public License v3.0 | 5 votes |
package org.hatdex.hat.utils import javax.inject.{ Inject, Singleton } import akka.stream.Materializer import com.nimbusds.jose.JWSObject import com.nimbusds.jwt.JWTClaimsSet import play.api.http.HttpErrorHandler import play.api.mvc.{ Filter, RequestHeader, Result } import play.api.{ Configuration, Logger } import scala.concurrent.{ ExecutionContext, Future } import scala.util.Try @Singleton class ActiveHatCounter() { // Careful! Mutable state private var count: Long = 0 def get(): Long = count def increase(): Unit = this.synchronized(count += 1) def decrease(): Unit = this.synchronized(count -= 1) } class LoggingFilter @Inject() ( errorHandler: HttpErrorHandler, configuration: Configuration, hatCounter: ActiveHatCounter)( implicit ec: ExecutionContext, val mat: Materializer) extends Filter { private val logger = Logger("api") def apply(nextFilter: RequestHeader => Future[Result])(requestHeader: RequestHeader): Future[Result] = { val startTime = System.currentTimeMillis nextFilter(requestHeader) .recoverWith({ case e ⇒ errorHandler.onServerError(requestHeader, e) }) .map { result => val active = hatCounter.get() val requestTime = System.currentTimeMillis - startTime logger.info(s"[${requestHeader.remoteAddress}] [${requestHeader.method}:${requestHeader.host}:${requestHeader.uri}] " + s"[${result.header.status}] [$requestTime:ms] [hats:$active] ${tokenInfo(requestHeader)}") result.withHeaders("Request-Time" -> requestTime.toString) } } private val authTokenFieldName: String = configuration.get[String]("silhouette.authenticator.fieldName") private def tokenInfo(requestHeader: RequestHeader): String = { requestHeader.queryString.get(authTokenFieldName).flatMap(_.headOption) .orElse(requestHeader.headers.get(authTokenFieldName)) .flatMap(t ⇒ if (t.isEmpty) { None } else { Some(t) }) .flatMap(t ⇒ Try(JWSObject.parse(t)).toOption) .map(o ⇒ JWTClaimsSet.parse(o.getPayload.toJSONObject)) .map { claimSet => s"[${Option(claimSet.getStringClaim("application")).getOrElse("api")}@" + s"${Option(claimSet.getStringClaim("applicationVersion")).getOrElse("_")}]" } .getOrElse("[unauthenticated@_]") } }
Example 133
Source File: Phata.scala From HAT2.0 with GNU Affero General Public License v3.0 | 5 votes |
package org.hatdex.hat.phata.controllers import com.mohiva.play.silhouette.api.Silhouette import controllers.{ Assets, AssetsFinder, AssetsFinderProvider } import javax.inject.Inject import org.hatdex.hat.api.json.{ HatJsonFormats, RichDataJsonFormats } import org.hatdex.hat.api.models.EndpointDataBundle import org.hatdex.hat.api.service.richData.{ RichBundleService, RichDataService } import org.hatdex.hat.authentication.{ HatApiAuthEnvironment, HatApiController } import org.hatdex.hat.phata.{ views => phataViews } import play.api.cache.{ Cached, CachedBuilder } import play.api.libs.json.Json import play.api.mvc._ import play.api.{ Configuration, Logger } import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future class Phata @Inject() ( components: ControllerComponents, assets: Assets, assetsFinder: AssetsFinderProvider, cached: Cached, configuration: Configuration, silhouette: Silhouette[HatApiAuthEnvironment], bundleService: RichBundleService, dataService: RichDataService) extends HatApiController(components, silhouette) with HatJsonFormats with RichDataJsonFormats { implicit val af: AssetsFinder = assetsFinder.get private val logger = Logger(this.getClass) val indefiniteSuccessCaching: CachedBuilder = cached .status(req => s"${req.host}${req.path}", 200) .includeStatus(404, 600) val csp: Map[String, String] = configuration.get[String]("play.filters.headers.contentSecurityPolicy") .split(';') .map(_.trim) .map({ p ⇒ val splits = p.split(' ') splits.head → splits.tail.mkString(" ") }) .toMap def rumpelIndex(): EssentialAction = indefiniteSuccessCaching { UserAwareAction.async { implicit request => val rumpelConfigScript = s"""var httpProtocol = "${if (request.secure) { "https" } else { "http" }}:";""" Future.successful(Ok(phataViews.html.rumpelIndex(rumpelConfigScript, af))) } } def altRumpelIndex(claimToken: String): EssentialAction = { logger.debug(s"Current claim token $claimToken") assets.at("index.html") } def profile: Action[AnyContent] = UserAwareAction.async { implicit request => val defaultBundleDefinition = Json.parse(configuration.get[String]("phata.defaultBundle")).as[EndpointDataBundle] for { bundle <- bundleService.bundle(defaultBundleDefinition.name).map(_.getOrElse(defaultBundleDefinition)) data <- dataService.bundleData(bundle, None, None, None) } yield { Ok(Json.toJson(data)) } } def hatLogin(name: String, redirectUrl: String) = indefiniteSuccessCaching { Action { implicit request => val scheme = if (request.secure) { "https://" } else { "http://" } val newRedirectUrl = s"$scheme${request.domain}/#/hatlogin?name=$name&redirect=${redirectUrl}" logger.debug(s"Redirect url from ${request.uri}: $newRedirectUrl") Redirect(newRedirectUrl) } } // def remoteAsset(file: String): String = { // val versionedUrl = assets.path(file) // val maybeAssetsUrl = Some("https://rumpel.hubat.net/assets") //configuration.getOptional[String]("assets.url") // maybeAssetsUrl.fold(versionedUrl)(_ + file) // } }
Example 134
Source File: SocialAuthProviders.scala From play-silhouette-postgres-async-seed with Apache License 2.0 | 5 votes |
package services.user import com.mohiva.play.silhouette.api.repositories.AuthInfoRepository import com.mohiva.play.silhouette.api.util.{ Clock, HTTPLayer, IDGenerator, PasswordHasher } import com.mohiva.play.silhouette.impl.providers._ import com.mohiva.play.silhouette.impl.providers.oauth1.TwitterProvider import com.mohiva.play.silhouette.impl.providers.oauth1.secrets.{ CookieSecretProvider, CookieSecretSettings } import com.mohiva.play.silhouette.impl.providers.oauth1.services.PlayOAuth1Service import com.mohiva.play.silhouette.impl.providers.oauth2.state.{ CookieStateProvider, CookieStateSettings } import com.mohiva.play.silhouette.impl.providers.oauth2.{ FacebookProvider, GoogleProvider } import play.api.Configuration import scala.concurrent.duration._ object SocialAuthProviders { val providers = Seq( "facebook" -> "Facebook", "google" -> "Google", "twitter" -> "Twitter" ) } class SocialAuthProviders( config: Configuration, httpLayer: HTTPLayer, hasher: PasswordHasher, authInfoService: AuthInfoRepository, credentials: CredentialsProvider, idGenerator: IDGenerator, clock: Clock ) { private[this] val oAuth1TokenSecretProvider = new CookieSecretProvider(CookieSecretSettings( cookieName = config.getString("silhouette.oauth1TokenSecretProvider.cookieName").getOrElse(throw new IllegalArgumentException()), cookiePath = config.getString("silhouette.oauth1TokenSecretProvider.cookiePath").getOrElse(throw new IllegalArgumentException()), cookieDomain = config.getString("silhouette.oauth1TokenSecretProvider.cookieDomain"), secureCookie = config.getBoolean("silhouette.oauth1TokenSecretProvider.secureCookie").getOrElse(throw new IllegalArgumentException()), httpOnlyCookie = config.getBoolean("silhouette.oauth1TokenSecretProvider.httpOnlyCookie").getOrElse(throw new IllegalArgumentException()), expirationTime = config.getInt("silhouette.oauth1TokenSecretProvider.expirationTime").map(_.seconds).getOrElse(throw new IllegalArgumentException()) ), clock) private[this] val oAuth2StateProvider = new CookieStateProvider(CookieStateSettings( cookieName = config.getString("silhouette.oauth2StateProvider.cookieName").getOrElse(throw new IllegalArgumentException()), cookiePath = config.getString("silhouette.oauth2StateProvider.cookiePath").getOrElse(throw new IllegalArgumentException()), cookieDomain = config.getString("silhouette.oauth2StateProvider.cookieDomain"), secureCookie = config.getBoolean("silhouette.oauth2StateProvider.secureCookie").getOrElse(throw new IllegalArgumentException()), httpOnlyCookie = config.getBoolean("silhouette.oauth2StateProvider.httpOnlyCookie").getOrElse(throw new IllegalArgumentException()), expirationTime = config.getInt("silhouette.oauth2StateProvider.expirationTime").map(_.seconds).getOrElse(throw new IllegalArgumentException()) ), idGenerator, clock) private[this] val facebookSettings = OAuth2Settings( authorizationURL = config.getString("silhouette.facebook.authorizationUrl"), accessTokenURL = config.getString("silhouette.facebook.accessTokenUrl").getOrElse(throw new IllegalArgumentException()), redirectURL = config.getString("silhouette.facebook.redirectURL").getOrElse(throw new IllegalArgumentException()), clientID = config.getString("silhouette.facebook.clientId").getOrElse(throw new IllegalArgumentException()), clientSecret = config.getString("silhouette.facebook.clientSecret").getOrElse(throw new IllegalArgumentException()), scope = config.getString("silhouette.facebook.scope") ) private[this] val facebook = new FacebookProvider(httpLayer, oAuth2StateProvider, facebookSettings) private[this] val googleSettings = OAuth2Settings( authorizationURL = config.getString("silhouette.google.authorizationUrl"), accessTokenURL = config.getString("silhouette.google.accessTokenUrl").getOrElse(throw new IllegalArgumentException()), redirectURL = config.getString("silhouette.google.redirectUrl").getOrElse(throw new IllegalArgumentException()), clientID = config.getString("silhouette.google.clientId").getOrElse(throw new IllegalArgumentException()), clientSecret = config.getString("silhouette.google.clientSecret").getOrElse(throw new IllegalArgumentException()), scope = config.getString("silhouette.google.scope") ) private[this] val google = new GoogleProvider(httpLayer, oAuth2StateProvider, googleSettings) private[this] val twitterSettings = OAuth1Settings( requestTokenURL = config.getString("silhouette.twitter.requestTokenUrl").getOrElse(throw new IllegalArgumentException()), accessTokenURL = config.getString("silhouette.twitter.accessTokenUrl").getOrElse(throw new IllegalArgumentException()), authorizationURL = config.getString("silhouette.twitter.authorizationUrl").getOrElse(throw new IllegalArgumentException()), callbackURL = config.getString("silhouette.twitter.callbackUrl").getOrElse(throw new IllegalArgumentException()), consumerKey = config.getString("silhouette.twitter.consumerKey").getOrElse(throw new IllegalArgumentException()), consumerSecret = config.getString("silhouette.twitter.consumerSecret").getOrElse(throw new IllegalArgumentException()) ) private[this] val twitter = new TwitterProvider(httpLayer, new PlayOAuth1Service(twitterSettings), oAuth1TokenSecretProvider, twitterSettings) val providers = Seq("credentials" -> credentials, "facebook" -> facebook, "google" -> google, "twitter" -> twitter) }
Example 135
Source File: Auth0Config.scala From auth0-scala-samples with MIT License | 5 votes |
package helpers import play.api.Configuration case class Auth0Config(secret: String, clientId: String, callbackURL: String, domain: String, audience: String) object Auth0Config { def get(configuration: Configuration): Auth0Config = { Auth0Config( configuration.getString("auth0.clientSecret").get, configuration.getString("auth0.clientId").get, configuration.getString("auth0.callbackURL").get, configuration.getString("auth0.domain").get, configuration.getString("auth0.audience").get ) } }
Example 136
Source File: Callback.scala From auth0-scala-samples with MIT License | 5 votes |
package controllers import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future import javax.inject.Inject import play.api.cache._ import play.api.http.HeaderNames import play.api.http.MimeTypes import play.api.libs.json.JsValue import play.api.libs.json.Json import play.api.libs.json.Json.toJsFieldJsValueWrapper import play.api.libs.ws._ import play.api.mvc.{Action, AnyContent, Controller} import helpers.Auth0Config import play.api.Configuration class Callback @Inject() (cache: CacheApi, ws: WSClient, configuration: Configuration) extends Controller { private val config = Auth0Config.get(configuration) def callback(codeOpt: Option[String] = None, stateOpt: Option[String] = None): Action[AnyContent] = Action.async { request => val sessionId = request.session.get("id").get if (stateOpt == cache.get(sessionId + "state")) { (for { code <- codeOpt } yield { getToken(code, sessionId).flatMap { case (idToken, accessToken) => getUser(accessToken).map { user => cache.set(request.session.get("id").get + "profile", user) Redirect(routes.User.index()) } }.recover { case ex: IllegalStateException => Unauthorized(ex.getMessage) } }).getOrElse(Future.successful(BadRequest("No parameters supplied"))) } else { Future.successful(BadRequest("Invalid state parameter")) } } def getToken(code: String, sessionId: String): Future[(String, String)] = { var audience = config.audience if (config.audience == ""){ audience = String.format("https://%s/userinfo",config.domain) } val tokenResponse = ws.url(String.format("https://%s/oauth/token", config.domain)). withHeaders(HeaderNames.ACCEPT -> MimeTypes.JSON). post( Json.obj( "client_id" -> config.clientId, "client_secret" -> config.secret, "redirect_uri" -> config.callbackURL, "code" -> code, "grant_type"-> "authorization_code", "audience" -> audience ) ) tokenResponse.flatMap { response => (for { idToken <- (response.json \ "id_token").asOpt[String] accessToken <- (response.json \ "access_token").asOpt[String] } yield { cache.set(sessionId + "id_token", idToken) cache.set(sessionId + "access_token", accessToken) Future.successful((idToken, accessToken)) }).getOrElse(Future.failed[(String, String)](new IllegalStateException("Tokens not sent"))) } } def getUser(accessToken: String): Future[JsValue] = { val userResponse = ws.url(String.format("https://%s/userinfo", config.domain)) .withQueryString("access_token" -> accessToken) .get() userResponse.flatMap(response => Future.successful(response.json)) } }
Example 137
Source File: Application.scala From auth0-scala-samples with MIT License | 5 votes |
package controllers import javax.inject.Inject import play.api.cache._ import play.api.mvc.{Action, AnyContent, Controller} import helpers.Auth0Config import java.security.SecureRandom import java.math.BigInteger import java.util.UUID.randomUUID import play.api.Configuration class Application @Inject() (cache: CacheApi, configuration: Configuration) extends Controller { private val config = Auth0Config.get(configuration) def index: Action[AnyContent] = Action { Ok(views.html.index()) } def login: Action[AnyContent] = Action { // Generate random state parameter object RandomUtil { private val random = new SecureRandom() def alphanumeric(nrChars: Int = 24): String = { new BigInteger(nrChars * 5, random).toString(32) } } val state = RandomUtil.alphanumeric() var audience = config.audience if (config.audience == ""){ audience = String.format("https://%s/userinfo", config.domain) } val id = randomUUID().toString cache.set(id + "state", state) val query = String.format( "authorize?client_id=%s&redirect_uri=%s&response_type=code&scope=openid profile&audience=%s&state=%s", config.clientId, config.callbackURL, audience, state ) Redirect(String.format("https://%s/%s", config.domain, query)).withSession("id" -> id) } def logout: Action[AnyContent] = Action { request => val host = request.host var scheme = "http" if (request.secure) { scheme = "https" } val returnTo = scheme + "://" + host Redirect(String.format( "https://%s/v2/logout?client_id=%s&returnTo=%s", config.domain, config.clientId, returnTo) ).withNewSession } }
Example 138
Source File: MetricController.scala From DataQuality with GNU Lesser General Public License v3.0 | 5 votes |
package controllers.metrics import javax.inject.Inject import com.codahale.jerkson.Json.generate import controllers.utils.MyDBSession import models.metrics.Metric.MetricType import models.metrics.{ColumnMetric, ComposedMetric, FileMetric, Metric} import org.squeryl.PrimitiveTypeMode._ import org.squeryl.Query import play.api.Configuration import play.api.mvc.{Action, Controller} import scala.util.Try class MetricController @Inject()(val configuration: Configuration,session: MyDBSession) extends Controller { private implicit val pageLength: Option[Int] = configuration.getInt("pagination.length") def getAllMetrics(source: Option[String], page: Option[Int], filter: Option[String]) = Action { val mtType = Try(MetricType.withName(filter.get.toUpperCase)).toOption val json: String = inTransaction { val query: Query[Metric] = source match { case Some(src) => Metric.getMetricsBySource(src, mtType) case None => Metric.getAll(mtType) } val stats = Metric.getStats(query) val res: Query[Metric] = (pageLength,page,query) match { case (Some(length), Some(pg), qr: Query[Metric]) => qr.page(pg * length, length) case (_,_,_) => query } generate(Map("metrics" -> res.map(Metric.toShortMap)) ++ stats) } Ok(json).as(JSON) } def deleteMetricById(id: String) = Action { inTransaction(try{ val delOpt: Option[Int] = Try { val src: String = Metric.getDetailed(id).mType src match { case "FILE" => FileMetric.deleteById(id) case "COLUMN" => ColumnMetric.deleteById(id) case "COMPOSED" => ComposedMetric.deleteById(id) case _ => 0 } }.toOption delOpt match { case Some(x) if x > 0 => Ok case _ => val json = generate(Map("error"->"Metric not found!")) BadRequest(json).as(JSON) } } catch { case e: Exception => InternalServerError(e.toString) }) } def getIdList(filter: Option[String]) = Action { val mtType = Try(MetricType.withName(filter.get.toUpperCase)).toOption val json = inTransaction { val list: Query[String] = Metric.getIdList(mtType) generate(Map("metrics" -> list.iterator)) } Ok(json).as(JSON) } }
Example 139
Source File: SearchController.scala From DataQuality with GNU Lesser General Public License v3.0 | 5 votes |
package controllers.search import javax.inject.Inject import com.codahale.jerkson.Json.generate import controllers.utils.MyDBSession import models.{BasicEntityType, EntityParentEnumeration} import org.squeryl.PrimitiveTypeMode._ import org.squeryl.Query import play.api.Configuration import play.api.mvc.{Action, AnyContent, Controller} import scala.util.Try class SearchController @Inject()(val configuration: Configuration,session: MyDBSession) extends Controller { private implicit val pageLength: Option[Int] = configuration.getInt("pagination.length") def searchById(tipo: String, query: String, filter: Option[String], parent: Option[String], parentId:Option[String], page: Option[Int]): Action[AnyContent] = Action { inTransaction { try { val eType: Option[BasicEntityType.Value] = Try(BasicEntityType.withName(tipo.toLowerCase)).toOption val result: Map[_ <: String, Any] = eType match { case Some(t) => val tipo: Option[Enumeration#Value] = Try(t.service.typeEnum.get.withName(filter.get.toUpperCase)).toOption val parentType: Option[EntityParentEnumeration#EntityParentVal] = Try(t.service.parentEnum.get.withName(parent.get.toLowerCase).asInstanceOf[EntityParentEnumeration#EntityParentVal]).toOption val q: Query[String] = t.service.searchIdList('%'+query+'%', tipo, parentType, parentId) val res: Query[String] = (pageLength,page) match { case (Some(length), Some(pg)) => q.page(pg * length, length) case (_,_) => q } Map("results" -> res.toList, "size" -> q.iterator.size, "last_page" -> Try((q.iterator.size - 1)/pageLength.get).toOption) case None => Map.empty } val json = generate(result) Ok(json).as(JSON) } catch { case e:Exception => InternalServerError(e.toString) }} } }
Example 140
Source File: SourceController.scala From DataQuality with GNU Lesser General Public License v3.0 | 5 votes |
package controllers.sources import javax.inject.Inject import com.codahale.jerkson.Json.generate import controllers.utils.MyDBSession import models.sources.Source.SourceType import models.sources._ import org.squeryl.PrimitiveTypeMode._ import org.squeryl.Query import play.api.Configuration import play.api.mvc.{Action, Controller} import scala.util.Try class SourceController @Inject()(val configuration: Configuration,session: MyDBSession) extends Controller { private implicit val pageLength: Option[Int] = configuration.getInt("pagination.length") def getAllSources(database: Option[String], page: Option[Int], filter: Option[String]) = Action { val scType = Try(SourceType.withName(filter.get.toUpperCase)).toOption val json: String = inTransaction { val query: Query[Source] = database match { case Some(db) => Source.getSourcesByDatabase(db) case None => Source.getAll(scType) } val stats = Source.getStats(query) val res = (pageLength,page) match { case (Some(length), Some(pg)) => query.page(pg * length, length) case (_,_) => query } generate(Map("sources" -> res.map(Source.toShortMap)) ++ stats) } Ok(json).as(JSON) } def getIdList(filter: Option[String]) = Action { val scType = Try(SourceType.withName(filter.get.toUpperCase)).toOption val json = inTransaction { val list = Source.getIdList(scType) generate(Map("sources" -> list.iterator)) } Ok(json).as(JSON) } def deleteSourceById(id: String) = Action { inTransaction(try{ val delOpt: Option[Int] = Try { val src: String = Source.getDetailed(id).scType src match { case "HDFS" => HdfsFile.deleteById(id) case "TABLE" => DBTable.deleteById(id) case "HIVE" => HiveTable.deleteById(id) case "VIRTUAL" => VirtualSource.deleteById(id) case _ => 0 } }.toOption delOpt match { case Some(x) if x > 0 => Ok case _ => val json = generate(Map("error"->"Source not found!")) BadRequest(json).as(JSON) } } catch { case e: Exception => InternalServerError(e.toString) }) } }
Example 141
Source File: PlayScalaModuleSpec.scala From play-grpc with Apache License 2.0 | 5 votes |
package play.grpc import java.io.File import example.myapp.helloworld.grpc.helloworld.GreeterServiceClient import example.myapp.helloworld.grpc.helloworld.GreeterServiceClientProvider import play.api.inject.ProviderConstructionTarget import play.api.Configuration import play.api.Environment import play.api.Mode import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec class PlayScalaModuleSpec extends AnyWordSpec with Matchers { "The generated module" should { "provide all clients" in { // module in longest common package for the two services val module = new example.myapp.helloworld.grpc.helloworld.AkkaGrpcClientModule() val bindings = module.bindings(Environment(new File("./"), getClass.getClassLoader, Mode.Prod), Configuration.empty) // both clients should be in there bindings should have size (1) bindings.map(_.key.clazz).toSet should ===(Set(classOf[GreeterServiceClient])) // not super useful assertions but let's keep for good measure bindings.map(_.target.get.asInstanceOf[ProviderConstructionTarget[_]].provider).toSet should ===( Set(classOf[GreeterServiceClientProvider]), ) } } }
Example 142
Source File: PlayJavaModuleSpec.scala From play-grpc with Apache License 2.0 | 5 votes |
package play.grpc import java.io.File import example.myapp.helloworld.grpc.GreeterServiceClient import example.myapp.helloworld.grpc.GreeterServiceClientProvider import play.api.inject.ProviderConstructionTarget import play.api.Configuration import play.api.Environment import play.api.Mode import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec class PlayJavaModuleSpec extends AnyWordSpec with Matchers { "The generated module" should { "provide all clients" in { // module in longest common package for the two services val module = new example.myapp.helloworld.grpc.AkkaGrpcClientModule() val bindings = module.bindings(Environment(new File("./"), getClass.getClassLoader, Mode.Prod), Configuration.empty) // both clients should be in there bindings should have size (1) bindings.map(_.key.clazz).toSet should ===(Set(classOf[GreeterServiceClient])) // not super useful assertions but let's keep for good measure bindings.map(_.target.get.asInstanceOf[ProviderConstructionTarget[_]].provider).toSet should ===( Set(classOf[GreeterServiceClientProvider]), ) } } }
Example 143
Source File: Meta.scala From vinyldns with Apache License 2.0 | 5 votes |
package models import play.api.Configuration case class Meta( version: String, sharedDisplayEnabled: Boolean, batchChangeLimit: Int, defaultTtl: Long, manualBatchChangeReviewEnabled: Boolean, scheduledBatchChangesEnabled: Boolean ) object Meta { def apply(config: Configuration): Meta = Meta( config.getOptional[String]("vinyldns.version").getOrElse("unknown"), config.getOptional[Boolean]("shared-display-enabled").getOrElse(false), config.getOptional[Int]("batch-change-limit").getOrElse(1000), config.getOptional[Long]("default-ttl").getOrElse(7200L), config.getOptional[Boolean]("manual-batch-review-enabled").getOrElse(false), config.getOptional[Boolean]("scheduled-changes-enabled").getOrElse(false) ) }
Example 144
Source File: CustomLinks.scala From vinyldns with Apache License 2.0 | 5 votes |
package models import com.typesafe.config.Config import play.api.{ConfigLoader, Configuration} import scala.collection.JavaConverters._ case class CustomLinks(private val config: Configuration) { val links: List[CustomLink] = config.getOptional[List[CustomLink]]("links").getOrElse(List[CustomLink]()) implicit def customLinksLoader: ConfigLoader[List[CustomLink]] = new ConfigLoader[List[CustomLink]] { def load(config: Config, path: String): List[CustomLink] = { val links = config.getConfigList(path).asScala.map { linkConfig => val displayOnSidebar = linkConfig.getBoolean("displayOnSidebar") val displayOnLoginScreen = linkConfig.getBoolean("displayOnLoginScreen") val title = linkConfig.getString("title") val href = linkConfig.getString("href") val icon = linkConfig.getString("icon") CustomLink(displayOnSidebar, displayOnLoginScreen, title, href, icon) } links.toList } } } case class CustomLink( displayOnSidebar: Boolean, displayOnLoginScreen: Boolean, title: String, href: String, icon: String )
Example 145
Source File: LegacySecuritySupport.scala From vinyldns with Apache License 2.0 | 5 votes |
package actions import controllers.{OidcAuthenticator, UserAccountAccessor, VinylDNS} import javax.inject.Inject import models.{CustomLinks, Meta} import org.slf4j.LoggerFactory import play.api.Configuration import play.api.mvc._ class LegacySecuritySupport @Inject() ( components: ControllerComponents, userAccountAccessor: UserAccountAccessor, configuration: Configuration, oidcAuthenticator: OidcAuthenticator ) extends AbstractController(components) with SecuritySupport { private val logger = LoggerFactory.getLogger(classOf[LegacySecuritySupport]) def frontendAction: FrontendActionBuilder = new LegacyFrontendAction( userAccountAccessor.get, oidcAuthenticator, components.parsers.anyContent ) def apiAction: ApiActionBuilder = new LegacyApiAction(userAccountAccessor.get, oidcAuthenticator, components.parsers.anyContent) def loginPage()(implicit links: CustomLinks, meta: Meta): Action[AnyContent] = Action { implicit request => if (oidcAuthenticator.oidcEnabled) { request.session.get(VinylDNS.ID_TOKEN) match { case Some(_) => Redirect("/index") case None => logger.info(s"No ${VinylDNS.ID_TOKEN} in session; Initializing oidc login") Redirect(oidcAuthenticator.getCodeCall.toString, 302) } } else { request.session.get("username") match { case Some(_) => Redirect("/index") case None => val flash = request.flash logger.error(s"$flash") VinylDNS.Alerts.fromFlash(flash) match { case Some(VinylDNS.Alert("danger", message)) => Ok(views.html.login(Some(message))) case _ => Ok(views.html.login()) } } } } private def getLoggedInUser(request: RequestHeader) = if (oidcAuthenticator.oidcEnabled) { request.session .get(VinylDNS.ID_TOKEN) .flatMap { oidcAuthenticator.getValidUsernameFromToken } } else { request.session.get("username") }.getOrElse("No user in session") def logout(): Action[AnyContent] = Action { implicit request => logger.info(s"Initializing logout for user [${getLoggedInUser(request)}]") if (oidcAuthenticator.oidcEnabled) { Redirect(oidcAuthenticator.oidcLogoutUrl).withNewSession } else { Redirect("/login").withNewSession } } def noAccess()(implicit links: CustomLinks, meta: Meta): Action[AnyContent] = Action { implicit request => logger.info(s"User account for '${getLoggedInUser(request)}' is locked.") Unauthorized( views.html.systemMessage( """ |Account locked. Please contact your VinylDNS administrators for more information. """.stripMargin ) ) } }
Example 146
Source File: Settings.scala From vinyldns with Apache License 2.0 | 5 votes |
package controllers import java.net.URI import cats.effect.{Blocker, ContextShift, IO} import cats.implicits._ import com.typesafe.config.{Config, ConfigFactory} import play.api.{ConfigLoader, Configuration} import pureconfig._ import pureconfig.generic.auto._ import pureconfig.module.catseffect.syntax._ import vinyldns.core.repository.DataStoreConfig import scala.collection.JavaConverters._ import scala.concurrent.duration._ // $COVERAGE-OFF$ class Settings(private val config: Configuration) { private implicit val cs: ContextShift[IO] = IO.contextShift(scala.concurrent.ExecutionContext.global) val ldapUser: String = config.get[String]("LDAP.user") val ldapPwd: String = config.get[String]("LDAP.password") val ldapDomain: String = config.get[String]("LDAP.domain") val ldapSearchBase: List[LdapSearchDomain] = config.get[List[LdapSearchDomain]]("LDAP.searchBase") val ldapCtxFactory: String = config.get[String]("LDAP.context.initialContextFactory") val ldapSecurityAuthentication: String = config.get[String]("LDAP.context.securityAuthentication") val ldapProviderUrl: URI = new URI(config.get[String]("LDAP.context.providerUrl")) val ldapUserNameAttribute: String = config.getOptional[String]("LDAP.userNameAttribute").getOrElse("sAMAccountName") val ldapSyncEnabled: Boolean = config.getOptional[Boolean]("LDAP.user-sync.enabled").getOrElse(false) val ldapSyncPollingInterval: FiniteDuration = config .getOptional[Int]("LDAP.user-sync.hours-polling-interval") .getOrElse(24) .hours val portalTestLogin: Boolean = config.getOptional[Boolean]("portal.test_login").getOrElse(false) val dataStoreConfigs: IO[List[DataStoreConfig]] = Blocker[IO].use { blocker => ConfigSource .fromConfig(config.underlying) .at("data-stores") .loadF[IO, List[String]](blocker) .flatMap { lst => lst .map( ConfigSource.fromConfig(config.underlying).at(_).loadF[IO, DataStoreConfig](blocker) ) .parSequence } } val cryptoConfig = IO(config.get[Config]("crypto")) implicit def ldapSearchDomainLoader: ConfigLoader[List[LdapSearchDomain]] = new ConfigLoader[List[LdapSearchDomain]] { def load(config: Config, path: String): List[LdapSearchDomain] = { val domains = config.getConfigList(path).asScala.map { domainConfig ⇒ val org = domainConfig.getString("organization") val domain = domainConfig.getString("domainName") LdapSearchDomain(org, domain) } domains.toList } } } // $COVERAGE-ON$ object Settings extends Settings(Configuration(ConfigFactory.load()))
Example 147
Source File: FrontendController.scala From vinyldns with Apache License 2.0 | 5 votes |
package controllers import actions.SecuritySupport import javax.inject.{Inject, Singleton} import models.{CustomLinks, DnsChangeNotices, Meta} import org.slf4j.LoggerFactory import play.api.Configuration import play.api.mvc._ import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future @Singleton class FrontendController @Inject() ( components: ControllerComponents, configuration: Configuration, securitySupport: SecuritySupport ) extends AbstractController(components) { implicit lazy val customLinks: CustomLinks = CustomLinks(configuration) implicit lazy val meta: Meta = Meta(configuration) private val logger = LoggerFactory.getLogger(classOf[FrontendController]) private val userAction = securitySupport.frontendAction def loginPage(): Action[AnyContent] = securitySupport.loginPage() def noAccess(): Action[AnyContent] = securitySupport.noAccess() def logout(): Action[AnyContent] = securitySupport.logout() def index(): Action[AnyContent] = userAction.async { implicit request => val canReview = request.user.isSuper || request.user.isSupport Future( Ok( views.html.dnsChanges .dnsChanges(request.user.userName, canReview) ) ) } def viewAllGroups(): Action[AnyContent] = userAction.async { implicit request => Future(Ok(views.html.groups.groups(request.user.userName))) } def viewGroup(groupId: String): Action[AnyContent] = userAction.async { implicit request => logger.info(s"View group for $groupId") Future(Ok(views.html.groups.groupDetail(request.user.userName))) } def viewAllZones(): Action[AnyContent] = userAction.async { implicit request => Future(Ok(views.html.zones.zones(request.user.userName))) } def viewZone(zoneId: String): Action[AnyContent] = userAction.async { implicit request => Future(Ok(views.html.zones.zoneDetail(request.user.userName, zoneId))) } def viewRecordSets(): Action[AnyContent] = userAction.async { implicit request => Future(Ok(views.html.recordsets.recordSets(request.user.userName))) } def viewAllBatchChanges(): Action[AnyContent] = userAction.async { implicit request => val canReview = request.user.isSuper || request.user.isSupport Future( Ok( views.html.dnsChanges .dnsChanges(request.user.userName, canReview) ) ) } def viewBatchChange(batchId: String): Action[AnyContent] = userAction.async { implicit request => logger.info(s"View Batch Change for $batchId") val canReview = request.user.isSuper || request.user.isSupport val dnsChangeNotices = configuration.get[DnsChangeNotices]("dns-change-notices") Future( Ok( views.html.dnsChanges .dnsChangeDetail(request.user.userName, canReview, dnsChangeNotices) ) ) } def viewNewBatchChange(): Action[AnyContent] = userAction.async { implicit request => Future(Ok(views.html.dnsChanges.dnsChangeNew(request.user.userName))) } }
Example 148
Source File: MetaSpec.scala From vinyldns with Apache License 2.0 | 5 votes |
package models import org.specs2.mock.Mockito import org.specs2.mutable.Specification import play.api.Configuration class MetaSpec extends Specification with Mockito { "Meta" should { "load from config" in { val config = Map("vinyldns.version" -> "foo-bar") Meta(Configuration.from(config)).version must beEqualTo("foo-bar") } "default to false if shared-display-enabled is not found" in { val config = Map("vinyldns.version" -> "foo-bar") Meta(Configuration.from(config)).sharedDisplayEnabled must beFalse } "set to true if shared-display-enabled is true in config" in { val config = Map("shared-display-enabled" -> true) Meta(Configuration.from(config)).sharedDisplayEnabled must beTrue } "get the batch-change-limit value in config" in { val config = Map("batch-change-limit" -> 21) Meta(Configuration.from(config)).batchChangeLimit must beEqualTo(21) } "default to 1000 if batch-change-limit is not found" in { val config = Map("vinyldns.version" -> "foo-bar") Meta(Configuration.from(config)).batchChangeLimit must beEqualTo(1000) } "get the default-ttl value in config" in { val config = Map("default-ttl" -> 7210) Meta(Configuration.from(config)).defaultTtl must beEqualTo(7210) } "default to 7200 if default-ttl is not found" in { val config = Map("vinyldns.version" -> "foo-bar") Meta(Configuration.from(config)).defaultTtl must beEqualTo(7200) } "default to false if manual-batch-review-enabled is not found" in { val config = Map("vinyldns.version" -> "foo-bar") Meta(Configuration.from(config)).manualBatchChangeReviewEnabled must beFalse } "set to true if manual-batch-review-enabled is true in config" in { val config = Map("manual-batch-review-enabled" -> true) Meta(Configuration.from(config)).manualBatchChangeReviewEnabled must beTrue } "default to false if scheduled-batch-change-enabled is not found" in { val config = Map("vinyldns.version" -> "foo-bar") Meta(Configuration.from(config)).scheduledBatchChangesEnabled must beFalse } "set to true if scheduled-batch-change-enabled is true in config" in { val config = Map("scheduled-changes-enabled" -> true) Meta(Configuration.from(config)).scheduledBatchChangesEnabled must beTrue } } }
Example 149
Source File: CustomLinksSpec.scala From vinyldns with Apache License 2.0 | 5 votes |
package models import org.specs2.mock.Mockito import org.specs2.mutable.Specification import play.api.Configuration class CustomLinksSpec extends Specification with Mockito { "CustomLinks" should { "load link from config" in { val linkOne = CustomLink(false, true, "title 1", "href 1", "icon 1") val config = Map( "links" -> List( Map( "displayOnSidebar" -> linkOne.displayOnSidebar, "displayOnLoginScreen" -> linkOne.displayOnLoginScreen, "title" -> linkOne.title, "href" -> linkOne.href, "icon" -> linkOne.icon ) ) ) val customLinks = CustomLinks(Configuration.from(config)) customLinks.links must beEqualTo(List[CustomLink](linkOne)) } "load multiple links from config" in { val linkOne = CustomLink(false, true, "title 1", "href 1", "icon 1") val linkTwo = CustomLink(true, false, "title 2", "href 2", "icon 2") val config = Map( "links" -> List( Map( "displayOnSidebar" -> linkOne.displayOnSidebar, "displayOnLoginScreen" -> linkOne.displayOnLoginScreen, "title" -> linkOne.title, "href" -> linkOne.href, "icon" -> linkOne.icon ), Map( "displayOnSidebar" -> linkTwo.displayOnSidebar, "displayOnLoginScreen" -> linkTwo.displayOnLoginScreen, "title" -> linkTwo.title, "href" -> linkTwo.href, "icon" -> linkTwo.icon ) ) ) val customLinks = CustomLinks(Configuration.from(config)) customLinks.links must beEqualTo(List[CustomLink](linkOne, linkTwo)) } "load empty list if no links in config" in { val customLinks = CustomLinks(Configuration.from(Map())) customLinks.links must beEqualTo(List[CustomLink]()) } } }
Example 150
Source File: Word2VecController.scala From pujangga with Apache License 2.0 | 5 votes |
package controllers import scala.collection.mutable.ListBuffer import scala.collection.JavaConverters._ import scala.util.{Failure, Success, Try} import java.io.File import javax.inject._ import play.api.libs.json.{JsValue, Json} import play.api.mvc._ import play.api.Configuration import org.deeplearning4j.models.embeddings.loader.WordVectorSerializer import org.deeplearning4j.models.word2vec.Word2Vec @Singleton class Word2VecController @Inject() (cc: ControllerComponents, configuration: Configuration) extends AbstractController(cc) { val word2VecIdFile = new File(configuration.underlying.getString("models.word2vec")) val word2VecIdModel: Word2Vec = WordVectorSerializer.readWord2VecModel(word2VecIdFile) def nearestWords: Action[JsValue] = Action(parse.json) { implicit request: Request[JsValue] => val string = (request.body \ "string").as[String] val n = (request.body \ "n").as[Int] Try { word2VecIdModel.wordsNearest(string, n) } match { case Success(word2vec) => val wordList = new ListBuffer[JsValue]() for(word <- word2vec.asScala) { wordList += Json.toJson(word) } Ok(Json.obj("status" -> "success", "data" -> wordList)) case Failure(failure) => InternalServerError(Json.obj("status" -> "error", "message" -> failure.toString)) } } def arithmetic: Action[JsValue] = Action(parse.json) { implicit request: Request[JsValue] => val string01 = (request.body \ "first_string").as[String] val string02 = (request.body \ "second_string").as[String] val string03 = (request.body \ "third_string").as[String] val n = (request.body \ "n").as[Int] Try { word2VecIdModel.wordsNearest(List(string01, string02).asJavaCollection,List(string03).asJavaCollection, n) } match { case Success(word2vec) => val wordList = new ListBuffer[JsValue]() for(word <- word2vec.asScala) { wordList += Json.toJson(word) } Ok(Json.obj("status" -> "success", "data" -> wordList)) case Failure(failure) => InternalServerError(Json.obj("status" -> "error", "message" -> failure.toString)) } } def similarityWords: Action[JsValue] = Action(parse.json) { implicit request: Request[JsValue] => val string01 = (request.body \ "first_string").as[String] val string02 = (request.body \ "second_string").as[String] Try { word2VecIdModel.similarity(string01, string02) } match { case Success(word2vec) => Ok(Json.obj("status" -> "success", "data" -> word2vec)) case Failure(failure) => InternalServerError(Json.obj("status" -> "error", "message" -> failure.toString)) } } }
Example 151
Source File: Module.scala From elastiknn with Apache License 2.0 | 5 votes |
import java.util.concurrent.{ExecutorService, Executors, ThreadFactory} import com.google.common.util.concurrent.ThreadFactoryBuilder import com.google.inject.{AbstractModule, TypeLiteral} import com.klibisz.elastiknn.client.{ElastiknnClient, ElastiknnFutureClient} import javax.inject.Provider import play.api.{Configuration, Environment} import scala.concurrent.ExecutionContext class Module(environment: Environment, configuration: Configuration) extends AbstractModule { val eknnProvider = new Provider[ElastiknnFutureClient] { override def get(): ElastiknnFutureClient = { val tfac: ThreadFactory = new ThreadFactoryBuilder().setDaemon(true).setNameFormat("elastiknn-%d").build() val exec: ExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime.availableProcessors(), tfac) implicit val ec: ExecutionContext = ExecutionContext.fromExecutor(exec) val host = configuration.underlying.getString("elastiknn.elasticsearch.host") val port = configuration.underlying.getInt("elastiknn.elasticsearch.port") ElastiknnClient.futureClient(host, port) } } override def configure(): Unit = { // Weird that you have to use this constructor, but it works. bind(new TypeLiteral[ElastiknnFutureClient]() {}).toProvider(eknnProvider) } }
Example 152
Source File: BasicSecurityModule.scala From asura with MIT License | 5 votes |
package asura.play.module import com.google.inject.AbstractModule import org.pac4j.play.LogoutController import org.pac4j.play.scala.{DefaultSecurityComponents, SecurityComponents} import org.pac4j.play.store.{PlayCacheSessionStore, PlaySessionStore} import play.api.{Configuration, Environment} class BasicSecurityModule(environment: Environment, configuration: Configuration) extends AbstractModule { override def configure(): Unit = { bind(classOf[PlaySessionStore]).to(classOf[PlayCacheSessionStore]) // logout val logoutController = new LogoutController() logoutController.setDestroySession(true) logoutController.setLocalLogout(true) logoutController.setDefaultUrl("/") bind(classOf[LogoutController]).toInstance(logoutController) // security components used in controllers bind(classOf[SecurityComponents]).to(classOf[DefaultSecurityComponents]) } }
Example 153
Source File: SecurityModule.scala From asura with MIT License | 5 votes |
package asura.app.modules import asura.app.api.auth._ import asura.play.actions.SecurityHttpActionAdapter import com.google.inject.{AbstractModule, Provides} import org.pac4j.core.client.Clients import org.pac4j.core.config.Config import org.pac4j.http.client.direct.{DirectBasicAuthClient, DirectFormClient, HeaderClient} import org.pac4j.jwt.config.signature.SecretSignatureConfiguration import org.pac4j.jwt.credentials.authenticator.JwtAuthenticator import org.pac4j.play.LogoutController import org.pac4j.play.scala.{DefaultSecurityComponents, SecurityComponents} import org.pac4j.play.store.{PlayCacheSessionStore, PlaySessionStore} import play.api.{Configuration, Environment} class SecurityModule(environment: Environment, configuration: Configuration) extends AbstractModule { override def configure(): Unit = { bind(classOf[PlaySessionStore]).to(classOf[PlayCacheSessionStore]) // logout val logoutController = new LogoutController() logoutController.setDestroySession(true) logoutController.setLocalLogout(true) logoutController.setDefaultUrl("/") bind(classOf[LogoutController]).toInstance(logoutController) // security components used in controllers bind(classOf[SecurityComponents]).to(classOf[DefaultSecurityComponents]) } @Provides def directFormClient: DirectFormClient = { val client = if (configuration.getOptional[Boolean]("asura.ldap.enabled").getOrElse(false)) { new DirectFormClient(LdapAuthenticator(configuration)) } else { new DirectFormClient(new SimpleTestUsernamePasswordAuthenticator(configuration)) } // client.addAuthorizationGenerator(new RoleAdminAuthGenerator(configuration.get[Seq[String]]("asura.admin"))) client } @Provides def directBasicAuthClient: DirectBasicAuthClient = { val client = if (configuration.getOptional[Boolean]("asura.ldap.enabled").getOrElse(false)) { new DirectBasicAuthClient(LdapAuthenticator(configuration)) } else { new DirectBasicAuthClient(new SimpleTestUsernamePasswordAuthenticator(configuration)) } // client.addAuthorizationGenerator(new RoleAdminAuthGenerator(configuration.get[Seq[String]]("asura.admin"))) client } @Provides def headerClient: HeaderClient = { val jwtAuthenticator = new JwtAuthenticator() jwtAuthenticator.addSignatureConfiguration(new SecretSignatureConfiguration(configuration.get[String]("asura.jwt.secret"))) val client = new HeaderClient("Authorization", "Bearer ", jwtAuthenticator) // client.addAuthorizationGenerator(new RoleAdminAuthGenerator(configuration.get[Seq[String]]("asura.admin"))) client } @Provides def provideConfig(directFormClient: DirectFormClient, headerClient: HeaderClient, directBasicAuthClient: DirectBasicAuthClient): Config = { val clients = new Clients(directFormClient, headerClient, directBasicAuthClient) val config = new Config(clients) config.setHttpActionAdapter(new SecurityHttpActionAdapter()) // config.addAuthorizer(Authorizer.ADMIN, new RequireAnyRoleAuthorizer(Role.ADMIN)) config } }
Example 154
Source File: LinkerdApi.scala From asura with MIT License | 5 votes |
package asura.app.api import asura.app.api.model.Dtabs import asura.app.api.model.Dtabs.DtabItem import asura.common.exceptions.ErrorMessages.ErrorMessage import asura.common.model.{ApiRes, ApiResError} import asura.core.http.HttpEngine import asura.core.{CoreConfig, ErrorMessages} import asura.namerd.DtabEntry import asura.namerd.api.v1.NamerdV1Api import asura.play.api.BaseApi.OkApiRes import javax.inject.{Inject, Singleton} import org.pac4j.play.scala.SecurityComponents import play.api.Configuration import scala.collection.mutable.ArrayBuffer import scala.concurrent.{ExecutionContext, Future} @Singleton class LinkerdApi @Inject()( implicit val exec: ExecutionContext, val controllerComponents: SecurityComponents, config: Configuration, ) extends BaseApi { val srcPrefix = "/svc/" val dstPrefix = "/$/inet/" def getProxyServers() = Action { implicit req => if (CoreConfig.linkerdConfig.enabled) { OkApiRes(ApiRes(data = CoreConfig.linkerdConfig.servers)) } else { OkApiRes(ApiResError(getI18nMessage(ErrorMessages.error_ProxyDisabled.name))) } } def getHttp(group: String, project: String, server: String) = Action.async { implicit req => if (CoreConfig.linkerdConfig.enabled) { val proxyServer = CoreConfig.linkerdConfig.servers.find(_.tag.equals(server)).get NamerdV1Api.getNamespaceDtabs(proxyServer.namerd, proxyServer.httpNs)(HttpEngine.http).map(dtabs => { val items = ArrayBuffer[DtabItem]() dtabs.foreach(entry => { val pStrs = entry.prefix.split("/") val dStrs = entry.dst.split("/") if (pStrs.length == 5 && dStrs.length == 5) { items += DtabItem( group = pStrs(2), project = pStrs(3), namespace = pStrs(4), host = dStrs(3), port = dStrs(4), owned = group == pStrs(2) && project == pStrs(3) ) } }) toActionResultFromAny(items) }) } else { Future.successful(OkApiRes(ApiResError(getI18nMessage(ErrorMessages.error_ProxyDisabled.name)))) } } def putHttp(group: String, project: String, server: String) = Action(parse.byteString).async { implicit req => if (CoreConfig.linkerdConfig.enabled) { val proxyServer = CoreConfig.linkerdConfig.servers.find(_.tag.equals(server)).get val dtabs = req.bodyAs(classOf[Dtabs]) if (null != dtabs && null != dtabs.dtabs && dtabs.dtabs.nonEmpty) { var error: ErrorMessage = null val entries = ArrayBuffer[DtabEntry]() for (i <- 0 until dtabs.dtabs.length if null == error) { val item = dtabs.dtabs(i) error = item.isValid() entries += DtabEntry( s"${srcPrefix}${item.group}/${item.project}/${item.namespace}", s"${dstPrefix}${item.host}/${item.port}" ) } if (null == error) { NamerdV1Api.updateNamespaceDtabs(proxyServer.namerd, proxyServer.httpNs, entries)(HttpEngine.http).toOkResult } else { error.toFutureFail } } else { Future.successful(OkApiRes(ApiRes())) } } else { Future.successful(OkApiRes(ApiResError(getI18nMessage(ErrorMessages.error_ProxyDisabled.name)))) } } }
Example 155
Source File: ClusterApi.scala From asura with MIT License | 5 votes |
package asura.app.api import akka.actor.ActorSystem import akka.pattern.ask import akka.util.Timeout import asura.app.AppErrorMessages import asura.cluster.ClusterManager import asura.cluster.actor.MemberListenerActor.GetAllMembers import asura.common.model.ApiResError import asura.core.CoreConfig import asura.play.api.BaseApi.OkApiRes import javax.inject.{Inject, Singleton} import org.pac4j.play.scala.SecurityComponents import play.api.Configuration import play.api.mvc.{RequestHeader, Result} import scala.concurrent.{ExecutionContext, Future} @Singleton class ClusterApi @Inject()( implicit val system: ActorSystem, val exec: ExecutionContext, val configuration: Configuration, val controllerComponents: SecurityComponents ) extends BaseApi { implicit val timeout: Timeout = CoreConfig.DEFAULT_ACTOR_ASK_TIMEOUT def getMembers() = Action(parse.byteString).async { implicit req => checkClusterEnabled { (ClusterManager.clusterManagerActor ? GetAllMembers).toOkResult } } private def checkClusterEnabled(func: => Future[Result])(implicit request: RequestHeader): Future[Result] = { if (ClusterManager.enabled) { func } else { Future.successful(OkApiRes(ApiResError(getI18nMessage(AppErrorMessages.error_ClusterNotEnabled)))) } } }
Example 156
Source File: UserApi.scala From asura with MIT License | 5 votes |
package asura.app.api import akka.actor.ActorSystem import asura.app.AppErrorMessages import asura.app.api.model.UserProfile import asura.common.model.{ApiRes, ApiResError} import asura.common.util.StringUtils import asura.core.es.actor.ActivitySaveActor import asura.core.es.model.{Activity, BaseIndex, UserProfile => EsUserProfile} import asura.core.es.service.UserProfileService import asura.play.api.BaseApi.OkApiRes import javax.inject.{Inject, Singleton} import org.pac4j.core.profile.{CommonProfile, ProfileManager} import org.pac4j.ldap.profile.LdapProfile import org.pac4j.play.PlayWebContext import org.pac4j.play.scala.SecurityComponents import org.pac4j.play.store.PlaySessionStore import play.api.Configuration import scala.concurrent.{ExecutionContext, Future} @Singleton class UserApi @Inject()( implicit val system: ActorSystem, val exec: ExecutionContext, val configuration: Configuration, val sessionStore: PlaySessionStore, val controllerComponents: SecurityComponents ) extends BaseApi { val administrators = configuration.getOptional[Seq[String]]("asura.admin").getOrElse(Nil).toSet val activityActor = system.actorOf(ActivitySaveActor.props()) def login() = Action.async { implicit request => val webContext = new PlayWebContext(request, sessionStore) val profileManager = new ProfileManager[CommonProfile](webContext) val profile = profileManager.get(true) if (!profile.isPresent) { Future.successful(OkApiRes(ApiResError(getI18nMessage(AppErrorMessages.error_EmptyProfile)))) } else { val commonProfile = profile.get() val token = commonProfile.getAttribute("token") val email = commonProfile.getAttribute("mail") if (null == token) { Future.successful(OkApiRes(ApiResError(getI18nMessage(AppErrorMessages.error_TokenGeneratedError)))) } else { val username = commonProfile.getId val emailStr = if (null != email) email.toString else StringUtils.EMPTY val apiUserProfile = UserProfile( token = token.toString, username = username, email = emailStr, isSysAdmin = administrators.contains(username) ) UserProfileService.getProfileById(username) .flatMap(profile => { if (null != profile) { // already registered apiUserProfile.nickname = profile.nickname apiUserProfile.avatar = profile.avatar apiUserProfile.summary = profile.summary apiUserProfile.description = profile.description apiUserProfile.email = profile.email activityActor ! Activity(StringUtils.EMPTY, StringUtils.EMPTY, username, Activity.TYPE_USER_LOGIN, username) Future.successful(OkApiRes(ApiRes(data = apiUserProfile))) } else { // new user val esUserProfile = EsUserProfile( username = username, email = emailStr ) if (commonProfile.isInstanceOf[LdapProfile]) { // first time login by ldap esUserProfile.fillCommonFields(BaseIndex.CREATOR_LDAP) } else { // not by ldap esUserProfile.fillCommonFields(BaseIndex.CREATOR_STANDARD) } UserProfileService.index(esUserProfile).map(indexResponse => { activityActor ! Activity(StringUtils.EMPTY, StringUtils.EMPTY, username, Activity.TYPE_NEW_USER, username) if (StringUtils.isNotEmpty(indexResponse.id)) { OkApiRes(ApiRes(data = apiUserProfile)) } else { OkApiRes(ApiResError(getI18nMessage(AppErrorMessages.error_FailToCreateUser))) } }) } }) } } } def get() = Action(parse.byteString).async { implicit req => UserProfileService.getProfileById(getProfileId()).toOkResult } def update() = Action(parse.byteString).async { implicit req => val userProfile = req.bodyAs(classOf[EsUserProfile]) UserProfileService.updateProfile(userProfile).toOkResult } }
Example 157
Source File: LdapAuthenticator.scala From asura with MIT License | 5 votes |
package asura.app.api.auth import java.time.{Duration, LocalDate, ZoneId} import java.util.Date import org.ldaptive._ import org.ldaptive.auth.{Authenticator, BindAuthenticationHandler, SearchDnResolver} import org.pac4j.core.context.WebContext import org.pac4j.core.credentials.UsernamePasswordCredentials import org.pac4j.core.profile.CommonProfile import org.pac4j.jwt.config.signature.SecretSignatureConfiguration import org.pac4j.jwt.profile.JwtGenerator import org.pac4j.ldap.profile.service.LdapProfileService import play.api.Configuration object LdapAuthenticator { def apply(configuration: Configuration): LdapProfileService = { val connConfig = new ConnectionConfig() connConfig.setConnectTimeout(Duration.ofMillis(configuration.get[Long]("asura.ldap.connectionTimeout"))) connConfig.setResponseTimeout(Duration.ofMillis(configuration.get[Long]("asura.ldap.responseTimeout"))) connConfig.setLdapUrl(configuration.get[String]("asura.ldap.url")) connConfig.setConnectionInitializer(new BindConnectionInitializer(configuration.get[String]("asura.ldap.bindDn"), new Credential(configuration.get[String]("asura.ldap.password")))) val connFactory = new DefaultConnectionFactory(connConfig) val handler = new BindAuthenticationHandler(connFactory) val dnResolver = new SearchDnResolver(connFactory) dnResolver.setBaseDn(configuration.get[String]("asura.ldap.searchbase")) dnResolver.setSubtreeSearch(true) dnResolver.setUserFilter(configuration.get[String]("asura.ldap.userFilter")) val authenticator = new Authenticator() authenticator.setDnResolver(dnResolver) authenticator.setAuthenticationHandler(handler) new CustomLdapProfileService(configuration, connFactory, authenticator, configuration.get[String]("asura.ldap.searchbase")) } class CustomLdapProfileService( configuration: Configuration, connectionFactory: ConnectionFactory, authenticator: Authenticator, usersDn: String) extends LdapProfileService(connectionFactory, authenticator, usersDn) { this.setIdAttribute(configuration.get[String]("asura.ldap.userIdAttr")) this.setAttributes(s"${configuration.get[String]("asura.ldap.userRealNameAttr")},${configuration.get[String]("asura.ldap.userEmailAttr")}") override def validate(credentials: UsernamePasswordCredentials, context: WebContext): Unit = { super.validate(credentials, context) val jwtGenerator = new JwtGenerator[CommonProfile](new SecretSignatureConfiguration(configuration.get[String]("asura.jwt.secret"))) val tomorrow = LocalDate.now().plusDays(1).atStartOfDay().plusHours(3) jwtGenerator.setExpirationTime(Date.from(tomorrow.atZone(ZoneId.systemDefault()).toInstant())) val profile = credentials.getUserProfile val token = jwtGenerator.generate(profile) profile.addAttribute("token", token) } } }
Example 158
Source File: SimpleTestUsernamePasswordAuthenticator.scala From asura with MIT License | 5 votes |
package asura.app.api.auth import java.time.{LocalDate, ZoneId} import java.util.Date import org.pac4j.core.context.WebContext import org.pac4j.core.credentials.UsernamePasswordCredentials import org.pac4j.core.credentials.authenticator.Authenticator import org.pac4j.core.exception.CredentialsException import org.pac4j.core.profile.CommonProfile import org.pac4j.core.util.{CommonHelper, Pac4jConstants} import org.pac4j.jwt.config.signature.SecretSignatureConfiguration import org.pac4j.jwt.profile.JwtGenerator import play.api.Configuration class SimpleTestUsernamePasswordAuthenticator(configuration: Configuration) extends Authenticator[UsernamePasswordCredentials] { override def validate(credentials: UsernamePasswordCredentials, context: WebContext): Unit = { if (credentials == null) throw new CredentialsException("No credential") val username = credentials.getUsername val password = credentials.getPassword if (CommonHelper.isBlank(username)) throw new CredentialsException("Username cannot be blank") if (CommonHelper.isBlank(password)) throw new CredentialsException("Password cannot be blank") if (CommonHelper.areNotEquals(username, password)) throw new CredentialsException("Username : '" + username + "' does not match password") val profile = new CommonProfile() profile.setId(username) profile.addAttribute(Pac4jConstants.USERNAME, username) val jwtGenerator = new JwtGenerator[CommonProfile](new SecretSignatureConfiguration(configuration.get[String]("asura.jwt.secret"))) val tomorrow = LocalDate.now().plusDays(1).atStartOfDay() jwtGenerator.setExpirationTime(Date.from(tomorrow.atZone(ZoneId.systemDefault()).toInstant())) val token = jwtGenerator.generate(profile) profile.addAttribute("token", token) credentials.setUserProfile(profile) } }
Example 159
Source File: GroupApi.scala From asura with MIT License | 5 votes |
package asura.app.api import akka.actor.ActorSystem import asura.app.AppErrorMessages import asura.app.api.auth.Reserved import asura.common.model.ApiResError import asura.common.util.StringUtils import asura.core.es.actor.ActivitySaveActor import asura.core.es.model.{Activity, Group} import asura.core.es.service.GroupService import asura.core.model.QueryGroup import asura.play.api.BaseApi.OkApiRes import javax.inject.{Inject, Singleton} import org.pac4j.play.scala.SecurityComponents import play.api.Configuration import play.api.mvc.{RequestHeader, Result} import scala.concurrent.{ExecutionContext, Future} @Singleton class GroupApi @Inject()( implicit val system: ActorSystem, val exec: ExecutionContext, val configuration: Configuration, val controllerComponents: SecurityComponents, ) extends BaseApi { val administrators = configuration.getOptional[Seq[String]]("asura.admin").getOrElse(Nil).toSet val activityActor = system.actorOf(ActivitySaveActor.props()) def getById(id: String) = Action.async { implicit req => GroupService.getById(id).toOkResultByEsOneDoc(id) } def delete(id: String) = Action.async { implicit req => checkPrivilege { user => activityActor ! Activity(id, StringUtils.EMPTY, user, Activity.TYPE_DELETE_GROUP, id) GroupService.deleteGroup(id).toOkResult } } def put() = Action(parse.byteString).async { implicit req => val group = req.bodyAs(classOf[Group]) val user = getProfileId() group.fillCommonFields(user) if (Reserved.isReservedGroup(group.id)) { Future.successful(OkApiRes(ApiResError(getI18nMessage(AppErrorMessages.error_CanNotUseReservedGroup)))) } else { GroupService.index(group).map(res => { activityActor ! Activity(group.id, StringUtils.EMPTY, user, Activity.TYPE_NEW_GROUP, group.id) toActionResultFromAny(res) }) } } def query() = Action(parse.byteString).async { implicit req => val queryGroup = req.bodyAs(classOf[QueryGroup]) GroupService.queryGroup(queryGroup).toOkResultByEsList(false) } def update() = Action(parse.byteString).async { implicit req => val group = req.bodyAs(classOf[Group]) GroupService.updateGroup(group).toOkResult } private def checkPrivilege(func: String => Future[Result])(implicit request: RequestHeader): Future[Result] = { val user = getProfileId() val isAllowed = if (administrators.nonEmpty) administrators.contains(user) else true if (isAllowed) { func(user) } else { Future.successful(OkApiRes(ApiResError(getI18nMessage(AppErrorMessages.error_NotAllowedContactAdministrator, administrators.mkString(","))))) } } }
Example 160
Source File: ExampleBootstrap.scala From asura with MIT License | 5 votes |
package com.example.asura import akka.actor.ActorSystem import asura.core.auth.AuthManager import asura.core.assertion.Assertions import asura.core.notify.JobNotifyManager import com.example.asura.assertion.ExampleAssertion import com.example.asura.auth.ExampleAuth import com.example.asura.notify.ExampleNotification import javax.inject.{Inject, Singleton} import play.api.Configuration import play.api.inject.ApplicationLifecycle @Singleton class ExampleBootstrap @Inject()( lifecycle: ApplicationLifecycle, system: ActorSystem, configuration: Configuration, // https://www.playframework.com/documentation/2.6.x/ConfigFile ) { AuthManager.register(new ExampleAuth(configuration)) JobNotifyManager.register(new ExampleNotification(configuration)) Assertions.register(ExampleAssertion) }
Example 161
Source File: ExampleAuth.scala From asura with MIT License | 5 votes |
package com.example.asura.auth import akka.http.scaladsl.model.HttpRequest import asura.core.auth.AuthorizeAndValidate import asura.core.es.model.Authorization import play.api.Configuration import scala.concurrent.Future class ExampleAuth(config: Configuration) extends AuthorizeAndValidate { override val `type`: String = "ExampleAuth" override val description: String = """# ExampleAuth do nothing |markdown syntax """.stripMargin override val template: String = """{ | "appKey" : "", | "appSecret" : "" |} """.stripMargin override def authorize(request: HttpRequest, auth: Authorization): Future[HttpRequest] = { Future.successful(request) } override def validate(auth: Authorization): (Boolean, String) = (true, null) }
Example 162
Source File: ExampleNotification.scala From asura with MIT License | 5 votes |
package com.example.asura.notify import asura.core.es.model.JobNotify import asura.core.job.JobExecDesc import asura.core.notify.{JobNotifyFunction, NotifyResponse} import play.api.Configuration import scala.concurrent.Future class ExampleNotification(config: Configuration) extends JobNotifyFunction { override val `type`: String = "SmsNotification" override val description: String = """# SmsNotification |markdown syntax """.stripMargin override def notify(execDesc: JobExecDesc, subscriber: JobNotify): Future[NotifyResponse] = { Future.successful(NotifyResponse(true, subscriber.subscriber)) } }
Example 163
Source File: MetronomeConfigTest.scala From metronome with Apache License 2.0 | 5 votes |
package dcos.metronome import com.typesafe.config.ConfigFactory import org.scalatest.{FunSuite, GivenWhenThen, Matchers} import play.api.Configuration class MetronomeConfigTest extends FunSuite with Matchers with GivenWhenThen { private def fromConfig(cfg: String): MetronomeConfig = new MetronomeConfig(new Configuration(ConfigFactory.parseString(cfg))) test("Http and Https ports with valid parseable strings") { Given("http Port is a valid port string") val httpPort = "9000" val httpsPort = "9010" When("Config parser tries to extract it") val cfg = fromConfig(s""" | play.server.http.port="$httpPort" | play.server.https.port="$httpsPort" """.stripMargin) Then("Should return an integer of that given port") cfg.httpPort shouldEqual Some(9000) cfg.httpsPort shouldEqual 9010 } test("Http overriden with `disabled`") { Given("http Port is `disabled`") val httpPort = "disabled" val httpsPort = "9010" When("Config parser tries to extract it") val cfg = fromConfig(s""" | play.server.http.port="$httpPort" | play.server.https.port="$httpsPort" """.stripMargin) Then("Http port should be None") cfg.httpPort shouldEqual None Then("Effective port should be https") cfg.effectivePort shouldEqual 9010 } test("feature gpu_resources is enabled when gpu_scheduling_behavior is set") { Given("A config with gpu_scheduling_behavior") val cfg = fromConfig(s""" | metronome.gpu_scheduling_behavior="restricted" """.stripMargin) When("enabled features are requested") val featues = Then("features should contain gpu_resources") cfg.scallopConf.features.toOption.get.contains("gpu_resources") shouldEqual true And("gpu_scheduling_behavior must be set") cfg.scallopConf.gpuSchedulingBehavior.toOption.contains("restricted") shouldEqual true } test("feature gpu_resources is disabled when gpu_scheduling_behavior is not set") { Given("A config with gpu_scheduling_behavior") val cfg = fromConfig("") When("enabled features are requested") val featues = Then("features should contain gpu_resources") cfg.scallopConf.features.toOption.get shouldEqual Set.empty And("gpu_scheduling_behavior must be set") cfg.scallopConf.gpuSchedulingBehavior.toOption shouldEqual Some("undefined") } }
Example 164
Source File: PrometheusModule.scala From play-prometheus-filters with MIT License | 5 votes |
package com.github.stijndehaes.playprometheusfilters import io.prometheus.client.CollectorRegistry import io.prometheus.client.hotspot._ import org.slf4j.LoggerFactory import play.api.inject.{Binding, Module} import play.api.{Configuration, Environment} object PrometheusModule { val defaultExportsKey = "play-prometheus-filters.register-default-hotspot-collectors" } class PrometheusModule extends Module { import PrometheusModule._ private val logger = LoggerFactory.getLogger(classOf[PrometheusModule]) override def bindings(environment: Environment, configuration: Configuration): Seq[Binding[_]] = { CollectorRegistry.defaultRegistry.clear() configuration.getOptional[Boolean](defaultExportsKey).foreach { enabled => if (enabled) { logger.info("Default exports are enabled") DefaultExports.initialize() logger.info("Default exports registered") } else { logger.info("Default exports are disabled") } } Seq( bind[CollectorRegistry].to(CollectorRegistry.defaultRegistry) ) } }
Example 165
Source File: MetricsFilter.scala From play-prometheus-filters with MIT License | 5 votes |
package com.github.stijndehaes.playprometheusfilters.filters import akka.stream.Materializer import com.github.stijndehaes.playprometheusfilters.metrics.RequestMetric import io.prometheus.client.Collector import play.api.Configuration import play.api.mvc.{Filter, RequestHeader, Result} import scala.concurrent.{ExecutionContext, Future} abstract class MetricsFilter(configuration: Configuration)(implicit val mat: Materializer, ec: ExecutionContext) extends Filter { val metrics: List[RequestMetric[_, RequestHeader, Result]] val excludePaths = { import collection.JavaConverters._ Option(configuration.underlying) .map(_.getStringList("play-prometheus-filters.exclude.paths")) .map(_.asScala.toSet) .map(_.map(_.r)) .getOrElse(Set.empty) } def apply(nextFilter: RequestHeader => Future[Result]) (requestHeader: RequestHeader): Future[Result] = { // check if current uri is excluded from metrics def urlIsExcluded = excludePaths.exists(_.findFirstMatchIn(requestHeader.uri).isDefined) val startTime = System.nanoTime nextFilter(requestHeader).map { implicit result => implicit val rh = requestHeader if (!urlIsExcluded) { val endTime = System.nanoTime val requestTime = (endTime - startTime) / Collector.NANOSECONDS_PER_SECOND metrics.foreach(_.mark(requestTime)) } result } } }
Example 166
Source File: RouteLatencyFilterSpec.scala From play-prometheus-filters with MIT License | 5 votes |
package com.github.stijndehaes.playprometheusfilters.filters import com.github.stijndehaes.playprometheusfilters.metrics.DefaultPlayUnmatchedDefaults import com.github.stijndehaes.playprometheusfilters.mocks.MockController import io.prometheus.client.CollectorRegistry import org.mockito.ArgumentMatchers.any import org.mockito.Mockito.verify import org.scalatest.mockito.MockitoSugar import org.scalatest.{MustMatchers, WordSpec} import org.scalatestplus.play.guice.GuiceOneAppPerSuite import play.api.Configuration import play.api.libs.typedmap.TypedMap import play.api.mvc._ import play.api.routing.{HandlerDef, Router} import play.api.test.Helpers.stubControllerComponents import play.api.test.{DefaultAwaitTimeout, FakeRequest, FutureAwaits} import scala.concurrent.ExecutionContext.Implicits.global class RouteLatencyFilterSpec extends WordSpec with MustMatchers with MockitoSugar with Results with DefaultAwaitTimeout with FutureAwaits with GuiceOneAppPerSuite { private implicit val mat = app.materializer private val configuration = mock[Configuration] "Filter constructor" should { "Add a histogram to the prometheus registry" in { val collectorRegistry = mock[CollectorRegistry] new RouteLatencyFilter(collectorRegistry, configuration) verify(collectorRegistry).register(any()) } } "Apply method" should { "Measure the latency" in { val filter = new RouteLatencyFilter(mock[CollectorRegistry], configuration) val rh = FakeRequest().withAttrs( TypedMap( Router.Attrs.HandlerDef -> HandlerDef(null, null, null, "test", null, null ,null ,null ,null) )) val action = new MockController(stubControllerComponents()).ok await(filter(action)(rh).run()) val metrics = filter.metrics(0).metric.collect() metrics must have size 1 val samples = metrics.get(0).samples //this is the count sample val countSample = samples.get(samples.size() - 2) countSample.value mustBe 1.0 countSample.labelValues must have size 1 countSample.labelValues.get(0) mustBe "test" } "Measure the latency for an unmatched route" in { val filter = new RouteLatencyFilter(mock[CollectorRegistry], configuration) val rh = FakeRequest() val action = new MockController(stubControllerComponents()).error await(filter(action)(rh).run()) val metrics = filter.metrics(0).metric.collect() metrics must have size 1 val samples = metrics.get(0).samples //this is the count sample val countSample = samples.get(samples.size() - 2) countSample.value mustBe 1.0 countSample.labelValues must have size 1 countSample.labelValues.get(0) mustBe DefaultPlayUnmatchedDefaults.UnmatchedRouteString } } }
Example 167
Source File: MetricFilterSpec.scala From play-prometheus-filters with MIT License | 5 votes |
package com.github.stijndehaes.playprometheusfilters.filters import com.github.stijndehaes.playprometheusfilters.metrics.CounterRequestMetrics.CounterRequestMetricBuilder import com.github.stijndehaes.playprometheusfilters.metrics.{DefaultPlayUnmatchedDefaults, RequestMetric} import com.github.stijndehaes.playprometheusfilters.mocks.MockController import com.typesafe.config.ConfigFactory import io.prometheus.client.CollectorRegistry import org.scalatest.mockito.MockitoSugar import org.scalatestplus.play.PlaySpec import org.scalatestplus.play.guice.GuiceOneAppPerSuite import play.api.Configuration import play.api.mvc._ import play.api.test.Helpers._ import play.api.test.{DefaultAwaitTimeout, FakeRequest, FutureAwaits} import scala.concurrent.ExecutionContext.Implicits.global class MetricFilterSpec extends PlaySpec with MockitoSugar with Results with DefaultAwaitTimeout with FutureAwaits with GuiceOneAppPerSuite { val configuration = Configuration(ConfigFactory.parseString( """play-prometheus-filters.exclude.paths = ["/test"]""" )) "Filter constructor" should { "Get exclude paths from configuration" in { implicit val mat = app.materializer val filter = new MetricsFilter(configuration) { override val metrics = List.empty[RequestMetric[_, RequestHeader, Result]] } filter.excludePaths must have size 1 // only check size since cannot compare Regex's } } "Apply method" should { "skip metrics for excluded paths" in { implicit val mat = app.materializer val collectorRegistry = mock[CollectorRegistry] val filter = new MetricsFilter(configuration) { override val metrics = List( CounterRequestMetricBuilder.build(collectorRegistry, DefaultPlayUnmatchedDefaults) ) } val rh = FakeRequest("GET", "/test") val action = new MockController(stubControllerComponents()).ok await(filter(action)(rh).run()) val metrics = filter.metrics(0).metric.collect() metrics must have size 1 val samples = metrics.get(0).samples samples.size() mustBe 0 // expect no metrics } } }
Example 168
Source File: StatusCounterFilterSpec.scala From play-prometheus-filters with MIT License | 5 votes |
package com.github.stijndehaes.playprometheusfilters.filters import com.github.stijndehaes.playprometheusfilters.mocks.MockController import io.prometheus.client.CollectorRegistry import org.mockito.ArgumentMatchers.any import org.mockito.Mockito.verify import org.scalatest.mockito.MockitoSugar import org.scalatest.{MustMatchers, WordSpec} import org.scalatestplus.play.guice.GuiceOneAppPerSuite import play.api.Configuration import play.api.mvc.Results import play.api.test.Helpers.stubControllerComponents import play.api.test.{DefaultAwaitTimeout, FakeRequest, FutureAwaits} import scala.concurrent.ExecutionContext.Implicits.global class StatusCounterFilterSpec extends WordSpec with MustMatchers with MockitoSugar with Results with DefaultAwaitTimeout with FutureAwaits with GuiceOneAppPerSuite { private implicit val mat = app.materializer private val configuration = mock[Configuration] "Filter constructor" should { "Add a counter to the prometheus registry" in { val collectorRegistry = mock[CollectorRegistry] new StatusCounterFilter(collectorRegistry, configuration) verify(collectorRegistry).register(any()) } } "Apply method" should { "Count the requests with status" in { val filter = new StatusCounterFilter(mock[CollectorRegistry], configuration) val rh = FakeRequest() val action = new MockController(stubControllerComponents()).ok await(filter(action)(rh).run()) val metrics = filter.metrics(0).metric.collect() metrics must have size 1 val samples = metrics.get(0).samples samples.get(0).value mustBe 1.0 samples.get(0).labelValues must have size 1 samples.get(0).labelValues.get(0) mustBe "200" } } }
Example 169
Source File: StatusAndRouteLatencyFilterSpec.scala From play-prometheus-filters with MIT License | 5 votes |
package com.github.stijndehaes.playprometheusfilters.filters import com.github.stijndehaes.playprometheusfilters.metrics.DefaultPlayUnmatchedDefaults import com.github.stijndehaes.playprometheusfilters.mocks.MockController import io.prometheus.client.CollectorRegistry import org.mockito.ArgumentMatchers.any import org.mockito.Mockito.verify import org.scalatest.mockito.MockitoSugar import org.scalatest.{MustMatchers, WordSpec} import org.scalatestplus.play.guice.GuiceOneAppPerSuite import play.api.Configuration import play.api.libs.typedmap.TypedMap import play.api.mvc.Results import play.api.routing.{HandlerDef, Router} import play.api.test.Helpers.stubControllerComponents import play.api.test.{DefaultAwaitTimeout, FakeRequest, FutureAwaits} import scala.concurrent.ExecutionContext.Implicits.global class StatusAndRouteLatencyFilterSpec extends WordSpec with MustMatchers with MockitoSugar with Results with DefaultAwaitTimeout with FutureAwaits with GuiceOneAppPerSuite { private implicit val mat = app.materializer private val configuration = mock[Configuration] "Filter constructor" should { "Add a histogram to the prometheus registry" in { val collectorRegistry = mock[CollectorRegistry] new StatusAndRouteLatencyFilter(collectorRegistry, configuration) verify(collectorRegistry).register(any()) } } "Apply method" should { "Measure the latency" in { val filter = new StatusAndRouteLatencyFilter(mock[CollectorRegistry], configuration) val rh = FakeRequest().withAttrs( TypedMap( Router.Attrs.HandlerDef -> HandlerDef(null, null, "testController", "test", null, "GET", "/path", null ,null) )) val action = new MockController(stubControllerComponents()).ok await(filter(action)(rh).run()) val metrics = filter.metrics(0).metric.collect() metrics must have size 1 val samples = metrics.get(0).samples //this is the count sample val countSample = samples.get(samples.size() - 2) countSample.value mustBe 1.0 countSample.labelValues must have size 5 countSample.labelValues.get(0) mustBe "test" countSample.labelValues.get(1) mustBe "200" countSample.labelValues.get(2) mustBe "testController" countSample.labelValues.get(3) mustBe "/path" countSample.labelValues.get(4) mustBe "GET" } "Measure the latency for an unmatched route" in { val filter = new StatusAndRouteLatencyFilter(mock[CollectorRegistry], configuration) val rh = FakeRequest() val action = new MockController(stubControllerComponents()).error await(filter(action)(rh).run()) val metrics = filter.metrics(0).metric.collect() metrics must have size 1 val samples = metrics.get(0).samples //this is the count sample val countSample = samples.get(samples.size() - 2) countSample.value mustBe 1.0 countSample.labelValues must have size 5 countSample.labelValues.get(0) mustBe DefaultPlayUnmatchedDefaults.UnmatchedRouteString countSample.labelValues.get(1) mustBe "404" countSample.labelValues.get(2) mustBe DefaultPlayUnmatchedDefaults.UnmatchedControllerString countSample.labelValues.get(3) mustBe DefaultPlayUnmatchedDefaults.UnmatchedPathString countSample.labelValues.get(4) mustBe DefaultPlayUnmatchedDefaults.UnmatchedVerbString } } }
Example 170
Source File: LatencyFilterSpec.scala From play-prometheus-filters with MIT License | 5 votes |
package com.github.stijndehaes.playprometheusfilters.filters import com.github.stijndehaes.playprometheusfilters.mocks.MockController import io.prometheus.client.CollectorRegistry import org.mockito.ArgumentMatchers._ import org.mockito.Mockito._ import org.scalatest.mockito.MockitoSugar import org.scalatestplus.play.PlaySpec import org.scalatestplus.play.guice.GuiceOneAppPerSuite import play.api.Configuration import play.api.mvc._ import play.api.test.Helpers._ import play.api.test.{DefaultAwaitTimeout, FakeRequest, FutureAwaits} import scala.concurrent.ExecutionContext.Implicits.global class LatencyFilterSpec extends PlaySpec with MockitoSugar with Results with DefaultAwaitTimeout with FutureAwaits with GuiceOneAppPerSuite { val configuration = mock[Configuration] "Filter constructor" should { "Add a histogram to the prometheus registry" in { implicit val mat = app.materializer val collectorRegistry = mock[CollectorRegistry] new LatencyFilter(collectorRegistry, configuration) verify(collectorRegistry).register(any()) } } "Apply method" should { "Measure the latency" in { implicit val mat = app.materializer val filter = new LatencyFilter(mock[CollectorRegistry], configuration) val rh = FakeRequest() val action = new MockController(stubControllerComponents()).ok await(filter(action)(rh).run()) val metrics = filter.metrics(0).metric.collect() metrics must have size 1 val samples = metrics.get(0).samples //this is the count sample val countSample = samples.get(samples.size() - 2) countSample.value mustBe 1.0 countSample.labelValues must have size 0 } } }
Example 171
Source File: StatusAndRouteCounterFilterSpec.scala From play-prometheus-filters with MIT License | 5 votes |
package com.github.stijndehaes.playprometheusfilters.filters import com.github.stijndehaes.playprometheusfilters.metrics.DefaultPlayUnmatchedDefaults import com.github.stijndehaes.playprometheusfilters.mocks.MockController import io.prometheus.client.CollectorRegistry import org.mockito.ArgumentMatchers.any import org.mockito.Mockito.verify import org.scalatest.mockito.MockitoSugar import org.scalatest.{MustMatchers, WordSpec} import org.scalatestplus.play.guice.GuiceOneAppPerSuite import play.api.Configuration import play.api.libs.typedmap.TypedMap import play.api.mvc.Results import play.api.routing.{HandlerDef, Router} import play.api.test.Helpers.stubControllerComponents import play.api.test.{DefaultAwaitTimeout, FakeRequest, FutureAwaits} import scala.concurrent.ExecutionContext.Implicits.global class StatusAndRouteCounterFilterSpec extends WordSpec with MustMatchers with MockitoSugar with Results with DefaultAwaitTimeout with FutureAwaits with GuiceOneAppPerSuite { private implicit val mat = app.materializer private val configuration = mock[Configuration] "Filter constructor" should { "Add a histogram to the prometheus registry" in { val collectorRegistry = mock[CollectorRegistry] new StatusAndRouteLatencyFilter(collectorRegistry, configuration) verify(collectorRegistry).register(any()) } } "Apply method" should { "Measure the count" in { val filter = new StatusAndRouteCounterFilter(mock[CollectorRegistry], configuration) val rh = FakeRequest().withAttrs( TypedMap( Router.Attrs.HandlerDef -> HandlerDef(null, null, "testController", "test", null, "GET", "/path", null ,null) )) val action = new MockController(stubControllerComponents()).ok await(filter(action)(rh).run()) val metrics = filter.metrics(0).metric.collect() metrics must have size 1 val samples = metrics.get(0).samples //this is the count sample val countSample = samples.get(0) countSample.value mustBe 1.0 countSample.labelValues must have size 5 countSample.labelValues.get(0) mustBe "test" countSample.labelValues.get(1) mustBe "200" countSample.labelValues.get(2) mustBe "testController" countSample.labelValues.get(3) mustBe "/path" countSample.labelValues.get(4) mustBe "GET" } "Measure the count for an unmatched route" in { val filter = new StatusAndRouteCounterFilter(mock[CollectorRegistry], configuration) val rh = FakeRequest() val action = new MockController(stubControllerComponents()).error await(filter(action)(rh).run()) val metrics = filter.metrics(0).metric.collect() metrics must have size 1 val samples = metrics.get(0).samples //this is the count sample val countSample = samples.get(0) countSample.value mustBe 1.0 countSample.labelValues must have size 5 countSample.labelValues.get(0) mustBe DefaultPlayUnmatchedDefaults.UnmatchedRouteString countSample.labelValues.get(1) mustBe "404" countSample.labelValues.get(2) mustBe DefaultPlayUnmatchedDefaults.UnmatchedControllerString countSample.labelValues.get(3) mustBe DefaultPlayUnmatchedDefaults.UnmatchedPathString countSample.labelValues.get(4) mustBe DefaultPlayUnmatchedDefaults.UnmatchedVerbString } } }
Example 172
Source File: ZipkinModule.scala From play-zipkin-tracing with Apache License 2.0 | 5 votes |
package brave.play.module import javax.inject.{Inject, Provider} import brave.Tracing import brave.play.{ZipkinTraceConfig, ZipkinTraceService, ZipkinTraceServiceLike} import brave.sampler.Sampler import play.api.Configuration import play.api.inject.{ApplicationLifecycle, SimpleModule, bind} import zipkin2.reporter.okhttp3.OkHttpSender import zipkin2.reporter.{AsyncReporter, Sender} import scala.concurrent.Future class ZipkinModule extends SimpleModule((env, conf) => Seq( bind[Sender].toProvider(classOf[SenderProvider]), bind[Tracing].toProvider(classOf[TracingProvider]), bind[ZipkinTraceServiceLike].to[ZipkinTraceService] ) ) class SenderProvider @Inject()(conf: Configuration, lifecycle: ApplicationLifecycle) extends Provider[Sender] { override def get(): Sender = { val baseUrl = conf.getOptional[String](ZipkinTraceConfig.ZipkinBaseUrl) getOrElse "http://localhost:9411" val result = OkHttpSender.create(baseUrl + "/api/v2/spans") lifecycle.addStopHook(() => Future.successful(result.close())) result } } class TracingProvider @Inject()(sender: Provider[Sender], conf: Configuration, lifecycle: ApplicationLifecycle) extends Provider[Tracing] { override def get(): Tracing = { // not injecting a span reporter, as you can't bind parameterized types like // Reporter[Span] here per https://github.com/playframework/playframework/issues/3422 val spanReporter = AsyncReporter.create(sender.get()) lifecycle.addStopHook(() => Future.successful(spanReporter.close())) val result = Tracing.newBuilder() .localServiceName(conf.getOptional[String](ZipkinTraceConfig.ServiceName) getOrElse "unknown") .spanReporter(spanReporter) .sampler(conf.getOptional[String](ZipkinTraceConfig.ZipkinSampleRate) .map(s => Sampler.create(s.toFloat)) getOrElse Sampler.ALWAYS_SAMPLE ) .build() lifecycle.addStopHook(() => Future.successful(result.close())) result } }
Example 173
Source File: NERService.scala From recogito2 with Apache License 2.0 | 5 votes |
package transform.ner import akka.actor.ActorSystem import akka.routing.RoundRobinPool import javax.inject.{Inject, Singleton} import org.pelagios.recogito.sdk.PluginEnvironment import org.pelagios.recogito.sdk.ner.Entity import play.api.{Configuration, Logger} import scala.collection.JavaConverters._ import services.annotation.AnnotationService import services.entity.builtin.EntityService import services.task.{TaskService, TaskType} import storage.uploads.Uploads import transform.WorkerService @Singleton class NERService @Inject() ( annotationService: AnnotationService, entityService: EntityService, taskService: TaskService, uploads: Uploads, config: Configuration, system: ActorSystem ) extends WorkerService( system, uploads, NERActor.props(taskService, annotationService, entityService, config), 3 ) object NERService extends HasTeiNER { val TASK_TYPE = TaskType("NER") private def getEnvironment(config: Configuration) = { // Not the nicest way to handle this - suggestions welcome! val userDir = if (System.getProperty("user.dir").contains("/target/universal/stage")) System.getProperty("user.dir").replace("/target/universal/stage", "") else System.getProperty("user.dir") val pluginsDir = s"${userDir}/plugins" val asMap = config.entrySet .filter(_._1.startsWith("plugins")) .toSeq .map { case(key, value) => (key -> value.unwrapped.toString) }.toMap.asJava new PluginEnvironment(pluginsDir, asMap) } private[ner] def parseText(text: String, engine: Option[String], config: Configuration): Seq[Entity] = { val ner = engine match { case Some(identifier) => NERPluginManager.getEngine(identifier).get case None => NERPluginManager.getDefaultEngine } Logger.info(s"Running NER with engine ${ner.getName}") val entities = ner.parse(text, getEnvironment(config)) entities.asScala } }
Example 174
Source File: ErrorHandler.scala From recogito2 with Apache License 2.0 | 5 votes |
import javax.inject.{ Inject, Provider } import play.api.{ Configuration, Environment, Logger, OptionalSourceMapper, UsefulException } import play.api.http.DefaultHttpErrorHandler import play.api.mvc.RequestHeader import play.api.mvc.Results._ import play.api.routing.Router import scala.concurrent.Future class ErrorHandler @Inject() ( env: Environment, config: Configuration, sourceMapper: OptionalSourceMapper, router: Provider[Router] ) extends DefaultHttpErrorHandler(env, config, sourceMapper, router) { override def onProdServerError(request: RequestHeader, exception: UsefulException) = Future.successful(InternalServerError(s"An error occurred: ${exception.getMessage}")) override def onClientError(request: RequestHeader, statusCode: Int, message: String) = { if (statusCode == 413) // Request entity too large Future.successful(EntityTooLarge("Could not upload the file - too large")) else if (statusCode == 404) // Not Found Future.successful(NotFound(views.html.error404())) else super.onClientError(request, statusCode, message) } }
Example 175
Source File: VisitService.scala From recogito2 with Apache License 2.0 | 5 votes |
package services.visit import com.sksamuel.elastic4s.{Hit, HitReader, Indexable} import com.sksamuel.elastic4s.searches.{RichSearchResponse, RichSearchHit} import com.sksamuel.elastic4s.ElasticDsl._ import java.nio.file.Path import javax.inject.{Inject, Singleton} import org.joda.time.DateTime import play.api.Configuration import play.api.libs.json.Json import play.api.libs.Files.{TemporaryFile, TemporaryFileCreator} import scala.concurrent.{Future, ExecutionContext} import scala.util.Try import services.{HasDate, HasTryToEither} import storage.es.{ES, HasScrollProcessing} @Singleton class VisitService @Inject() (implicit val es: ES, val ctx: ExecutionContext, val config: Configuration) extends HasScrollProcessing with HasDate { implicit object VisitIndexable extends Indexable[Visit] { override def json(v: Visit): String = Json.stringify(Json.toJson(v)) } implicit object VisitHitReader extends HitReader[Visit] with HasTryToEither { override def read(hit: Hit): Either[Throwable, Visit] = Try(Json.fromJson[Visit](Json.parse(hit.sourceAsString)).get) } def insertVisit(visit: Visit): Future[Unit] = es.client execute { indexInto(ES.RECOGITO / ES.VISIT).doc(visit) } map { _ => } recover { case t: Throwable => t.printStackTrace } def countTotal(): Future[Long] = es.client execute { search(ES.RECOGITO / ES.VISIT) limit 0 } map { _.totalHits } def countSince(date: DateTime): Future[Long] = es.client execute { search(ES.RECOGITO / ES.VISIT) query { rangeQuery("visited_at").gt(formatDate(date)) } limit 0 } map { _.totalHits } def scrollExport()(implicit creator: TemporaryFileCreator): Future[Path] = { val exporter = CsvExporter.createNew() def writeToFile(response: RichSearchResponse): Future[Boolean] = Future { val visits = response.to[Visit] exporter.writeBatch(visits) } map { _ => true } recover { case t: Throwable => t.printStackTrace() false } es.client execute { search(ES.RECOGITO / ES.VISIT) query matchAllQuery limit 200 scroll "5m" } flatMap { scroll(writeToFile, _) } map { success => exporter.close() if (success) exporter.path else throw new RuntimeException() } recover { case t: Throwable => Try(exporter.close()) throw t } } def deleteOlderThan(date: DateTime): Future[Boolean] = es.client execute { deleteIn(ES.RECOGITO / ES.VISIT) by { rangeQuery("visited_at").lt(formatDate(date)) } } map { _ => true } recover { case t: Throwable => t.printStackTrace() false } }
Example 176
Source File: ImageService.scala From recogito2 with Apache License 2.0 | 5 votes |
package services.image import java.io.File import java.nio.file.Paths import play.api.Configuration import play.api.libs.Files.TemporaryFileCreator import services.annotation.Annotation import services.document.ExtendedDocumentMetadata import services.generated.tables.records.DocumentFilepartRecord import scala.concurrent.{ExecutionContext, Future} import scala.language.postfixOps import storage.uploads.Uploads import sys.process._ import storage.TempDir object ImageService { def cutout( doc: ExtendedDocumentMetadata, part: DocumentFilepartRecord, annotation: Annotation )(implicit uploads: Uploads, ctx: ExecutionContext, tmpCreator: TemporaryFileCreator, config: Configuration) = Future { val tmpDir = TempDir.get() val dir = uploads.getDocumentDir(doc.ownerName, doc.id).get val sourceFile = new File(dir, part.getFile) val croppedTmp = tmpCreator.create(Paths.get(tmpDir, s"${annotation.annotationId}.jpg")) val croppedFile = croppedTmp.path.toAbsolutePath.toString val anchor = ImageAnchor.parse(annotation.anchor) val x = anchor.bounds.left val y = anchor.bounds.top val w = anchor.bounds.width val h = anchor.bounds.height s"vips crop $sourceFile $croppedFile $x $y $w $h" ! anchor match { case tbox: TiltedBoxAnchor => val rotatedTmp = tmpCreator.create(Paths.get(tmpDir, s"${annotation.annotationId}.rot.jpg")) val rotatedFile = rotatedTmp.path.toAbsolutePath.toString val angleDeg = 180 * tbox.a / Math.PI s"vips similarity $croppedFile $rotatedFile --angle $angleDeg" ! // TODO can rotate and crop happen in the same vips command? val clippedTmp = tmpCreator.create(Paths.get(tmpDir, s"${annotation.annotationId}.clip.jpg")) val clippedFile = clippedTmp.path.toAbsolutePath.toString val a = ImageAnchor.getQuadrant(tbox.a) match { case ImageAnchor.QUADRANT_1 | ImageAnchor.QUADRANT_3 => tbox.a case ImageAnchor.QUADRANT_2 => tbox.a - Math.PI / 2 case ImageAnchor.QUADRANT_4 => Math.PI / 2 - tbox.a } val k = Math.sin(a) * Math.cos(a) val x = Math.abs(tbox.h * k).toInt val y = Math.abs(tbox.l * k).toInt val w = tbox.l val h = Math.abs(tbox.h) s"vips crop $rotatedFile $clippedFile $x $y $w $h" ! clippedTmp.path.toFile case _ => croppedTmp.path.toFile } } def iiifSnippet(doc: ExtendedDocumentMetadata, part: DocumentFilepartRecord, annotation: Annotation): String = { val b = ImageAnchor.parse(annotation.anchor).bounds val baseUrl = if (part.getFile.endsWith("/info.json")) part.getFile.substring(0, part.getFile.size - 10) else part.getFile // TODO rotation - don't modify the image in Recogito, rely on the external IIIF server (which may or may not support rotation) s"${baseUrl}/${b.left},${b.top},${b.width},${b.height}/full/0/default.jpg" } }
Example 177
Source File: HelpController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.help import controllers.HasVisitLogging import javax.inject.{Inject, Singleton} import services.visit.VisitService import org.webjars.play.WebJarsUtil import play.api.{Configuration, Environment} import play.api.mvc.{Action, AbstractController, ControllerComponents, RequestHeader} import play.twirl.api.HtmlFormat import scala.concurrent.ExecutionContext import scala.io.Source import scala.util.Try import services.entity.{AuthorityFileService, EntityType} @Singleton class HelpController @Inject() ( val authorities: AuthorityFileService, val components: ControllerComponents, val config: Configuration, val env: Environment, implicit val ctx: ExecutionContext, implicit val visits: VisitService, implicit val webjars: WebJarsUtil ) extends AbstractController(components) with HasVisitLogging { private val adminEmail = config.get[String]("admin.email") private val imprint = Try(Source.fromFile(env.getFile("conf/imprint"))).toOption.map { _.getLines.mkString("\n") } private def result(template: HtmlFormat.Appendable)(implicit request: RequestHeader) = { logPageView() Ok(template) } def localizedTutorial(lang: String) = Action { implicit request => lang.toUpperCase match { case "DE" => result(views.html.help.tutorial.tutorial_de()) case "ES" => result(views.html.help.tutorial.tutorial_es()) case "FA" => result(views.html.help.tutorial.tutorial_fa()) case "FR" => result(views.html.help.tutorial.tutorial_fr()) case "IT" => result(views.html.help.tutorial.tutorial_it()) case "NL" => result(views.html.help.tutorial.tutorial_nl()) case "TR" => result(views.html.help.tutorial.tutorial_tr()) case _ => NotFound(views.html.error404()) } } def faq = Action.async { implicit request => authorities.listAll(Some(EntityType.PLACE)).map { gazetteers => result(views.html.help.faq(gazetteers)) } } def index = Action { implicit request => result(views.html.help.index()) } def about = Action { implicit request => result(views.html.help.general.about(imprint, adminEmail)) } def privacy = Action { implicit request => result(views.html.help.general.privacy(adminEmail)) } def relations = Action { implicit request => result(views.html.help.relations()) } def cloning = Action { implicit request => result(views.html.help.cloning()) } def sharingLinks = Action { implicit request => result(views.html.help.sharing_links()) } def terms = Action { implicit request => result(views.html.help.general.terms()) } def tutorial = Action { implicit request => result(views.html.help.tutorial.tutorial()) } def workspace = Action { implicit request => result(views.html.help.workspace()) } def swaggerUi = Action { Redirect(url = "/webjars/swagger-ui/2.2.0/index.html", queryString = Map("url" -> Seq("/swagger.json"))) } }
Example 178
Source File: BaseAuthController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers import services.RuntimeAccessLevel import services.document.{ExtendedDocumentMetadata, DocumentService} import services.generated.tables.records.{DocumentFilepartRecord, DocumentRecord} import services.user.{User, UserService} import play.api.Configuration import play.api.mvc.{ControllerComponents, Result} import scala.concurrent.ExecutionContext abstract class BaseAuthController( components: ControllerComponents, config: Configuration, documents: DocumentService, users: UserService ) extends BaseController(components, config, users) { protected def documentPartResponse( docId: String, partNo: Int, user: User, response: (ExtendedDocumentMetadata, DocumentFilepartRecord, RuntimeAccessLevel) => Result )(implicit ctx: ExecutionContext) = { documentResponse(docId, user, { case (doc, accesslevel) => doc.fileparts.find(_.getSequenceNo == partNo) match { case None => NotFoundPage case Some(part) => response(doc, part, accesslevel) } }) } }
Example 179
Source File: LoginLogoutController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.landing import com.mohiva.play.silhouette.api.{LoginInfo, Silhouette} import controllers.{HasConfig, HasUserService, Security} import java.util.UUID import javax.inject.{Inject, Singleton} import services.announcement.AnnouncementService import services.user.UserService import play.api.Configuration import play.api.data.Form import play.api.data.Forms._ import play.api.i18n.I18nSupport import play.api.mvc.{AbstractController, ControllerComponents} import scala.concurrent.{ ExecutionContext, Future } case class LoginData(usernameOrPassword: String, password: String) @Singleton class LoginLogoutController @Inject() ( val announcements: AnnouncementService, val components: ControllerComponents, val config: Configuration, val silhouette: Silhouette[Security.Env], val users: UserService, implicit val ctx: ExecutionContext ) extends AbstractController(components) with HasConfig with HasUserService with I18nSupport { private val MESSAGE = "message" private val INVALID_LOGIN = "Invalid Username or Password" private val auth = silhouette.env.authenticatorService val loginForm = Form( mapping( "username" -> nonEmptyText, "password" -> nonEmptyText )(LoginData.apply)(LoginData.unapply) ) def showLoginForm(destination: Option[String]) = Action { implicit request => destination match { case None => Ok(views.html.landing.login(loginForm)) case Some(dest) => Ok(views.html.landing.login(loginForm)).withSession("access_uri" -> dest) } } def processLogin = silhouette.UserAwareAction.async { implicit request => loginForm.bindFromRequest.fold( formWithErrors => Future(BadRequest(views.html.landing.login(formWithErrors))), loginData => users.validateUser(loginData.usernameOrPassword, loginData.password).flatMap { case Some(validUser) => val destination = request.session.get("access_uri").getOrElse(routes.LandingController.index.toString) users.updateLastLogin(validUser.getUsername) val fAuthentication = auth.create(LoginInfo(Security.PROVIDER_ID, validUser.getUsername)) .flatMap(auth.init(_)) fAuthentication.flatMap { authentication => auth.embed(authentication, Redirect(destination).withSession(request.session - "access_uri")) } case None => Future(Redirect(routes.LoginLogoutController.showLoginForm()).flashing(MESSAGE -> INVALID_LOGIN)) } ) } def confirmServiceAnnouncement(id: UUID, response: String, destination: Option[String]) = silhouette.SecuredAction.async { implicit request => announcements.confirm(id, request.identity.username, response).map { success => if (success) destination.map(Redirect(_)).getOrElse(Redirect(routes.LandingController.index)) else InternalServerError } } def logout = silhouette.SecuredAction.async { implicit request => auth.discard(request.authenticator, Redirect(routes.LandingController.index)) } }
Example 180
Source File: LandingController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.landing import com.mohiva.play.silhouette.api.Silhouette import controllers.{ HasConfig, HasUserService, HasVisitLogging, HasPrettyPrintJSON, Security } import java.io.FileInputStream import javax.inject.{ Inject, Singleton } import java.net.URI import org.webjars.play.WebJarsUtil import play.api.Configuration import play.api.i18n.I18nSupport import play.api.libs.json.{Json, JsObject} import play.api.mvc.{Action, AbstractController, ControllerComponents} import scala.concurrent.ExecutionContext import services.annotation.AnnotationService import services.contribution.ContributionService import services.document.DocumentService import services.user.UserService import services.visit.VisitService @Singleton class LandingController @Inject() ( val components: ControllerComponents, val config: Configuration, val annotations: AnnotationService, val contributions: ContributionService, val documents: DocumentService, val users: UserService, val silhouette: Silhouette[Security.Env], implicit val ctx: ExecutionContext, implicit val visits: VisitService, implicit val webjars: WebJarsUtil ) extends AbstractController(components) with HasConfig with HasUserService with HasVisitLogging with HasPrettyPrintJSON with I18nSupport { def index = silhouette.UserAwareAction { implicit request => // Temporary hack only request.queryString.get("lang").flatMap(_.headOption) match { case Some(lang) => Redirect(routes.LandingController.index).withLang(play.api.i18n.Lang(lang)) case None => request.identity match { case Some(user) => Redirect(controllers.my.routes.WorkspaceController.workspace(user.username)) case None => logPageView() Ok(views.html.landing.index()) } } } def getStats() = silhouette.UnsecuredAction.async { implicit request => val fAnnotations = annotations.countTotal() val fEdits = contributions.countLast24hrs() val fUsers = users.countUsers() val f = for { annotations <- fAnnotations edits <- fEdits users <- fUsers } yield (annotations, edits, users) f.map { case (annotations, edits, users) => jsonOk(Json.obj( "annotations" -> annotations, "edits" -> edits, "users" -> users )) } } def sitemap() = Action.async { implicit request => documents.listOwnersWithPublicDocuments().map { users => val baseURL = routes.LandingController.index().absoluteURL() val sitemap = users.map(user => s"${baseURL}${user}").mkString("\n") Ok(sitemap).as("text/plain") } } def robots() = Action { implicit request => val sitemapURL = routes.LandingController.sitemap().absoluteURL() Ok(s"SITEMAP: ${sitemapURL}").as("text/plain") } def swaggerConfig() = Action { implicit request => val json = Json.parse(new FileInputStream("conf/swagger.json")) val baseURL = new URI(routes.LandingController.index.absoluteURL) val host = if (baseURL.getPort == -1) baseURL.getHost else s"${baseURL.getHost}:${baseURL.getPort}" jsonOk(json.as[JsObject] ++ Json.obj("host" -> host)) } }
Example 181
Source File: MaintenanceController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.admin.maintenance import com.mohiva.play.silhouette.api.Silhouette import controllers.{BaseAuthController, Security, HasPrettyPrintJSON} import java.io.File import javax.inject.{Inject, Singleton} import org.joda.time.DateTime import org.webjars.play.WebJarsUtil import play.api.{Configuration, Environment} import play.api.mvc.ControllerComponents import play.api.libs.json._ import play.api.libs.functional.syntax._ import scala.concurrent.ExecutionContext import services.announcement.AnnouncementService import services.document.DocumentService import services.generated.tables.records.UploadRecord import services.upload.UploadService import services.user.UserService import services.user.Roles._ import services.HasDate import storage.es.ES import storage.uploads.Uploads @Singleton class MaintenanceController @Inject()( val announcements: AnnouncementService, val components: ControllerComponents, val config: Configuration, val documents: DocumentService, val env: Environment, val es: ES, val silhouette: Silhouette[Security.Env], val uploadService: UploadService, val uploadStorage: Uploads, val users: UserService, implicit val ctx: ExecutionContext, implicit val webJarsUtil: WebJarsUtil ) extends BaseAuthController(components, config, documents, users) with HasPrettyPrintJSON with HasDate { implicit val uploadRecordWrites: Writes[UploadRecord] = ( (JsPath \ "owner").write[String] and (JsPath \ "title").write[String] and (JsPath \ "created_at").write[DateTime] )(upload => ( upload.getOwner, upload.getTitle, new DateTime(upload.getCreatedAt) )) def index = silhouette.SecuredAction(Security.WithRole(Admin)).async { implicit request => uploadService.listPendingUploads().map { uploads => Ok(views.html.admin.maintenance()) } } def insertBroadcast = silhouette.SecuredAction(Security.WithRole(Admin)).async { implicit request => announcements.insertBroadcastAnnouncement( """# Like Recogito? Vote for us! We are excited that Recogito has been nominated for the [Digital Humanities Awards](http://dhawards.org/dhawards2018/voting/) this year. If you like Recogito, do consider voting for us. Many thanks & happy annotating! """).map(_ => Ok) } def deleteAllServiceAnnouncements = silhouette.SecuredAction(Security.WithRole(Admin)).async { implicit request => announcements.clearAll().map { success => if (success) Ok else InternalServerError } } }
Example 182
Source File: BackupAdminController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.admin.backup import akka.actor.ActorSystem import akka.stream.scaladsl.FileIO import com.mohiva.play.silhouette.api.Silhouette import controllers.{BaseAuthController, Security} import controllers.document.BackupReader import javax.inject.{Inject, Singleton} import services.ContentType import services.annotation.AnnotationService import services.document.DocumentService import services.generated.tables.records.DocumentFilepartRecord import services.user.UserService import services.user.Roles._ import services.visit.VisitService import org.joda.time.DateTime import org.joda.time.format.DateTimeFormat import org.webjars.play.WebJarsUtil import play.api.Configuration import play.api.mvc.{ControllerComponents, ResponseHeader, Result} import play.api.libs.Files.TemporaryFileCreator import play.api.http.HttpEntity import scala.concurrent.{ExecutionContext, Future} import storage.db.DB import storage.es.migration.AnnotationMigrationUtil import transform.tiling.TilingService @Singleton class BackupAdminController @Inject() ( val components: ControllerComponents, val config: Configuration, val migrationUtil: AnnotationMigrationUtil, val users: UserService, val visits: VisitService, val silhouette: Silhouette[Security.Env], implicit val db: DB, implicit val tilingService: TilingService, implicit val annotations: AnnotationService, implicit val documents: DocumentService, implicit val ctx: ExecutionContext, implicit val system: ActorSystem, implicit val tmpFileCreator: TemporaryFileCreator, implicit val webJarsUtil: WebJarsUtil ) extends BaseAuthController(components, config, documents, users) with BackupReader { def restore = silhouette.SecuredAction(Security.WithRole(Admin)).async { implicit request => request.body.asMultipartFormData.flatMap(_.file("backup")) match { case Some(formData) => restoreBackup(formData.ref.path.toFile, runAsAdmin = true, forcedOwner = None).map { case (doc, fileparts) => Ok }.recover { case t: Throwable => t.printStackTrace() InternalServerError } case None => Future.successful(BadRequest) } } def exportVisits = silhouette.SecuredAction(Security.WithRole(Admin)).async { implicit request => visits.scrollExport().map { path => val fmt = DateTimeFormat.forPattern("yyyy-MM-dd") val source = FileIO.fromPath(path) val filename = s"visits-exported-${fmt.print(DateTime.now)}.csv" Result( header = ResponseHeader(200, Map("Content-Disposition" -> s"""attachment; filename="${filename}"""")), body = HttpEntity.Streamed(source, None, Some("text/csv")) ) } } def deleteVisitsOlderThan(date: Option[String]) = silhouette.SecuredAction(Security.WithRole(Admin)).async { implicit request => date match { case Some(_) => Future.successful(BadRequest("User-provided dates not supported yet.")) case _ => val cutoffDate = DateTime.now minusMonths 6 visits.deleteOlderThan(cutoffDate).map { success => if (success) Ok("Done.") else InternalServerError("Something went wrong.") } } } }
Example 183
Source File: AdminController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.admin import com.mohiva.play.silhouette.api.Silhouette import controllers.{BaseAuthController, Security} import javax.inject.{Inject, Singleton} import services.annotation.AnnotationService import services.contribution.ContributionService import services.document.{DocumentService, DocumentToJSON} import services.user.UserService import services.user.Roles._ import services.visit.VisitService import org.webjars.play.WebJarsUtil import play.api.Configuration import play.api.libs.json.Json import play.api.mvc.ControllerComponents import scala.concurrent.ExecutionContextExecutor import controllers.HasPrettyPrintJSON @Singleton class AdminController @Inject() ( val components: ControllerComponents, val config: Configuration, val annotations: AnnotationService, val contributions: ContributionService, val documents: DocumentService, val users: UserService, val visits: VisitService, val silhouette: Silhouette[Security.Env], implicit val ctx: ExecutionContextExecutor, implicit val webJarsUtil: WebJarsUtil ) extends BaseAuthController(components, config, documents, users) with HasPrettyPrintJSON { def index = silhouette.SecuredAction(Security.WithRole(Admin)) { implicit request => Ok(views.html.admin.activity()) } def getStats() = silhouette.SecuredAction(Security.WithRole(Admin)).async { implicit request => // DocumentRecord JSON serialization import DocumentToJSON._ val fRecentContributions = contributions.getMostRecent(10) val fSystemStats = contributions.getSystemStats() val fTotalAnnotations = annotations.countTotal() val fTotalVisits = visits.countTotal() val fTotalUsers = users.countUsers() val f = for { recentContributions <- fRecentContributions recentAffectedDocuments <- documents.getDocumentRecordsById(recentContributions.map(_.affectsItem.documentId)) stats <- fSystemStats annotationCount <- fTotalAnnotations visitCount <- fTotalVisits userCount <- fTotalUsers } yield (recentContributions, recentAffectedDocuments, stats, annotationCount, visitCount, userCount) f.map { case (recentContributions, recentAffectedDocuments, stats, annotationCount, visitCount, userCount) => val response = Json.obj( "recent_contributions" -> recentContributions, "recent_documents" -> recentAffectedDocuments, "contribution_stats" -> stats, "total_annotations" -> annotationCount, "total_visits" -> visitCount, "total_users" -> userCount) jsonOk(response) } } def getSignupHistory = silhouette.SecuredAction(Security.WithRole(Admin)).async { implicit request => users.getSignupsOverTime().map { history => val json = history.map(t => Json.obj("timestamp" -> t._1, "count" -> t._2)) jsonOk(Json.toJson(json)) } } }
Example 184
Source File: AuthoritiesAPIController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.api.entity import controllers.{BaseOptAuthController, HasPrettyPrintJSON} import javax.inject.{Inject, Singleton} import play.api.Configuration import play.api.libs.json.{Json, JsObject} import play.api.mvc.ControllerComponents import scala.concurrent.ExecutionContext import services.document.DocumentService import services.entity.{AuthorityFileService, EntityType} import services.entity.builtin.EntityService import services.user.UserService @Singleton class AuthoritiesAPIController @Inject() ( val authorities: AuthorityFileService, val components: ControllerComponents, val config: Configuration, val documents: DocumentService, val entities: EntityService, val users: UserService, implicit val ctx: ExecutionContext ) extends BaseOptAuthController(components, config, documents, users) with HasPrettyPrintJSON { def listGazetteers = Action.async { implicit request => val fMetadata = authorities.listAll(Some(EntityType.PLACE)) val fRecordCounts = entities.countByAuthority(Some(EntityType.PLACE)) val f = for { metadata <- fMetadata counts <- fRecordCounts } yield (metadata, counts) f.map { case (listedGazetteers, counts) => import AuthorityFileService._ // Import implicit JSON serialization // In order to see possible inconsistencies between DB and index, // we separately handle: i) gazetteers described in the DB, ii) gazetteer // IDs recorded in the index, but without a metadata record in the DB. // Normally, the list below should be empty. val unlistedGazetteers = counts.filterNot { case (id, count) => listedGazetteers.map(_.getId).contains(id) } val json = listedGazetteers.map { m => val count = counts.find(_._1 == m.getId).map(_._2).getOrElse(0l) Json.toJson(m).as[JsObject] ++ Json.obj("count" -> count) } ++ unlistedGazetteers.map { case (id, count) => Json.obj( "identifier" -> id, "authority_type" -> "PLACE", "shortname" -> id, "count" -> count, "conflicted" -> true) } jsonOk(Json.toJson(json)) } } }
Example 185
Source File: PlaceAPIController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.api.entity import com.mohiva.play.silhouette.api.Silhouette import com.vividsolutions.jts.geom.Coordinate import controllers.{BaseOptAuthController, HasPrettyPrintJSON, Security} import javax.inject.{Inject, Singleton} import services.document.DocumentService import services.entity.builtin.EntityService import services.user.UserService import services.user.Roles._ import play.api.Configuration import play.api.libs.json.Json import play.api.mvc.{Action, ControllerComponents} import scala.concurrent.{Future, ExecutionContext } import scala.util.{Try, Success, Failure} import services.entity.EntityType @Singleton class PlaceAPIController @Inject() ( val components: ControllerComponents, val config: Configuration, val documents: DocumentService, val users: UserService, val entities: EntityService, val silhouette: Silhouette[Security.Env], implicit val ctx: ExecutionContext ) extends BaseOptAuthController(components, config, documents, users) with HasPrettyPrintJSON { def searchPlacesInDocument(query: String, docId: String, offset: Int, size: Int) = silhouette.UserAwareAction.async { implicit request => documentResponse(docId, request.identity, { case (metadata, accesslevel) => if (accesslevel.canReadData) entities.searchEntitiesInDocument(query, docId, Some(EntityType.PLACE), offset, size).map { results => jsonOk(Json.toJson(results.map(_.entity))) } else Future.successful(Forbidden) }) } }
Example 186
Source File: ContributionAPIController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.api.contribution import com.mohiva.play.silhouette.api.Silhouette import controllers.{BaseOptAuthController, Security, HasPrettyPrintJSON} import javax.inject.{Inject, Singleton} import play.api.Configuration import play.api.libs.json.Json import play.api.mvc.ControllerComponents import scala.concurrent.{ExecutionContext, Future} import services.HasDate import services.contribution.ContributionService import services.document.DocumentService import services.user.UserService @Singleton class ContributionAPIController @Inject() ( val components: ControllerComponents, val config: Configuration, val contributions: ContributionService, val documents: DocumentService, val users: UserService, val silhouette: Silhouette[Security.Env], implicit val ctx: ExecutionContext ) extends BaseOptAuthController(components, config, documents, users) with HasPrettyPrintJSON with HasDate { def getDocumentStats(id: String) = silhouette.UserAwareAction.async { implicit request => documentResponse(id, request.identity, { case (doc, accesslevel) => if (accesslevel.canReadData) { contributions.getDocumentStats(id).map { stats => jsonOk(Json.toJson(stats)) } } else { Future.successful(Forbidden) } }) } def countContributionsSince(docId: String, timestamp: String) = silhouette.UserAwareAction.async { implicit request => documentResponse(docId, request.identity, { case (doc, accesslevel) => if (accesslevel.canReadData) { parseDate(timestamp) match { case Some(date) => contributions.countContributionsSince(docId, date).map { count => jsonOk(Json.obj( "id" -> doc.id, "contributions" -> count, "since" -> formatDate(date))) } case None => Future.successful(BadRequest) } } else { Future.successful(Forbidden) } }) } }
Example 187
Source File: PluginAPIController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.api.plugin import controllers.{BaseOptAuthController, HasPrettyPrintJSON} import javax.inject.{Inject, Singleton} import org.pelagios.recogito.sdk.ner.NERPlugin import play.api.Configuration import play.api.libs.json._ import play.api.libs.functional.syntax._ import play.api.mvc.ControllerComponents import plugins.PluginRegistry import scala.collection.JavaConverters._ import scala.concurrent.ExecutionContext import services.document.DocumentService import services.user.UserService import transform.ner.NERPluginManager @Singleton class PluginAPIController @Inject() ( val components: ControllerComponents, val config: Configuration, val documents: DocumentService, val users: UserService, implicit val ctx: ExecutionContext ) extends BaseOptAuthController(components, config, documents, users) with HasPrettyPrintJSON { implicit val pluginWrites: Writes[NERPlugin] = ( (JsPath \ "identifier").write[String] and (JsPath \ "name").write[String] and (JsPath \ "languages").write[Seq[String]] and (JsPath \ "organization").write[String] and (JsPath \ "description").write[String] and (JsPath \ "version").write[String] )(p => ( p.getClass.getName, p.getName, p.getSupportedLanguages.asScala, p.getOrganization, p.getDescription, p.getVersion )) def listNERPlugins = Action { implicit request => val plugins = NERPluginManager.plugins jsonOk(Json.toJson(plugins)) } def loadPlugin(ext: String, id: String) = Action.async { implicit request => PluginRegistry.loadPlugin(ext, id).map { _ match { case Some(js) => Ok(js).as("application/javascript") case None => NotFound }} } def loadCSS(ext: String, id: String) = Action.async { implicit request => PluginRegistry.loadCSS(ext, id).map { _ match { case Some(css) => Ok(css).as("text/css") case None => NotFound }} } }
Example 188
Source File: SimilarityAPIController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.api.similarity import com.mohiva.play.silhouette.api.Silhouette import controllers.{BaseOptAuthController, Security, HasPrettyPrintJSON} import javax.inject.{Inject, Singleton} import play.api.Configuration import play.api.libs.json._ import play.api.libs.functional.syntax._ import play.api.mvc.ControllerComponents import scala.concurrent.{ExecutionContext, Future} import services.RuntimeAccessLevel import services.document.{DocumentService, ExtendedDocumentMetadata} import services.generated.tables.records.DocumentRecord import services.user.UserService import services.similarity.{Similarity, SimilarityService} @Singleton class SimilarityAPIController @Inject() ( val components: ControllerComponents, val config: Configuration, val documents: DocumentService, val similarities: SimilarityService, val users: UserService, val silhouette: Silhouette[Security.Env], implicit val ctx: ExecutionContext ) extends BaseOptAuthController(components, config, documents, users) with HasPrettyPrintJSON { implicit val similarDocumentWrites: Writes[(DocumentRecord, RuntimeAccessLevel, Similarity)] = ( (JsPath \ "document_id").write[String] and (JsPath \ "author").writeNullable[String] and (JsPath \ "title").write[String] and (JsPath \ "owner").write[String] and (JsPath \ "similarity").write[JsValue] )(t => ( t._1.getId, Option(t._1.getAuthor), t._1.getTitle, t._1.getOwner, Json.obj( "title" -> t._3.jaroWinkler, "entities" -> t._3.jaccard) )) implicit val similarityAPIResponseWrites: Writes[(ExtendedDocumentMetadata, Seq[(DocumentRecord, RuntimeAccessLevel, Similarity)])] = ( (JsPath \ "document_id").write[String] and (JsPath \ "author").writeNullable[String] and (JsPath \ "title").write[String] and (JsPath \ "owner").write[String] and (JsPath \ "similar").write[Seq[(DocumentRecord, RuntimeAccessLevel, Similarity)]] )(t => ( t._1.id, t._1.author, t._1.title, t._1.ownerName, t._2 )) def getSimilar(docId: String) = silhouette.UserAwareAction.async { implicit request => documentResponse(docId, request.identity, { case (doc, accesslevel) => if (accesslevel.canReadData) { similarities.findSimilar(docId, request.identity.map(_.username)).map { response => jsonOk(Json.toJson((doc, response))) } } else { Future.successful(Forbidden) } }) } }
Example 189
Source File: TaskAPIController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.api.task import akka.actor.ActorSystem import com.mohiva.play.silhouette.api.Silhouette import controllers.{BaseAuthController, HasPrettyPrintJSON, Security} import java.util.UUID import javax.inject.{Inject, Singleton} import play.api.Configuration import play.api.libs.json.Json import play.api.mvc.ControllerComponents import services.document.DocumentService import services.task.{TaskType, TaskService, TaskRecordAggregate} import services.user.UserService import services.user.Roles._ import scala.concurrent.{ExecutionContext, Future} import transform.JobDefinition import transform.georesolution.{GeoresolutionService, TableGeoresolutionJobDefinition} import transform.ner.{NERService, NERJobDefinition} @Singleton class TaskAPIController @Inject() ( val components: ControllerComponents, val config: Configuration, val documents: DocumentService, val users: UserService, val ner: NERService, val georesolution: GeoresolutionService, val silhouette: Silhouette[Security.Env], val tasks: TaskService, implicit val system: ActorSystem, implicit val ctx: ExecutionContext ) extends BaseAuthController(components, config, documents, users) with HasPrettyPrintJSON { def spawnJob = silhouette.SecuredAction.async { implicit request => request.body.asJson.map(json => Json.fromJson[JobDefinition](json)) match { case Some(result) if result.isSuccess => val taskDefinition = result.get documentResponse(taskDefinition.documents.head, request.identity, { case (docInfo, accesslevel) => if (accesslevel.canWrite) taskDefinition.taskType match { case TaskType("GEORESOLUTION") => val definition = Json.fromJson[TableGeoresolutionJobDefinition](request.body.asJson.get).get georesolution.spawnJob(docInfo.document, docInfo.fileparts, definition) Ok case TaskType("NER") => val definition = Json.fromJson[NERJobDefinition](request.body.asJson.get).get val jobId = ner.spawnJob(docInfo.document, docInfo.fileparts, definition) jsonOk(Json.obj("job_id" -> jobId)) case t => BadRequest(Json.parse("{ \"error\": \"unsupported task type: " + t + "\" }")) } else Forbidden(Json.parse("{ \"error\": \"insufficient access privileges\"}")) }) case Some(result) if result.isError => Future.successful(BadRequest(Json.parse("{ \"error\": \"JSON parse error\" }"))) case None => Future.successful(BadRequest(Json.parse("{ \"error\": \"missing task definition\" }"))) } } def getJobProgress(jobId: UUID) = silhouette.SecuredAction.async { implicit request => tasks.findByJobId(jobId).map { _ match { case Some(progress) => jsonOk(Json.toJson(progress)) case None => NotFound }} } def progressByDocument(id: String) = silhouette.SecuredAction.async { implicit request => documents.getExtendedMeta(id, Some(request.identity.username)).flatMap(_ match { case Some((doc, accesslevel)) => if (accesslevel.canReadAll) { tasks.findByDocument(id).map { case Some(taskRecord) => jsonOk(Json.toJson(taskRecord)) case None => NotFound } } else { Future.successful(Forbidden) } case None => Future.successful(NotFound) }) } }
Example 190
Source File: BaseOptAuthController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers import services.RuntimeAccessLevel import services.document.{ExtendedDocumentMetadata, DocumentService} import services.generated.tables.records.{DocumentFilepartRecord, DocumentRecord} import services.user.{User, UserService} import play.api.Configuration import play.api.mvc.{AnyContent, ControllerComponents, Request, Result} import scala.concurrent.{ExecutionContext, Future} abstract class BaseOptAuthController( components: ControllerComponents, config: Configuration, documents: DocumentService, users: UserService ) extends BaseController(components, config, users) { protected def documentPartResponse( documentId: String, partNo: Int, maybeUser: Option[User], response: (ExtendedDocumentMetadata, DocumentFilepartRecord, RuntimeAccessLevel) => Future[Result] )(implicit ctx: ExecutionContext, request: Request[AnyContent]) = { documentReadResponse(documentId, maybeUser, { case (doc, accesslevel) => doc.fileparts.find(_.getSequenceNo == partNo) match { case None => Future.successful(NotFoundPage) case Some(part) => response(doc, part, accesslevel) } }) } }
Example 191
Source File: DocumentActionsController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.my.directory.delete import com.mohiva.play.silhouette.api.Silhouette import controllers.{BaseController, HasPrettyPrintJSON, Security} import javax.inject.{Inject, Singleton} import play.api.Configuration import play.api.libs.json.{Json, JsValue} import play.api.mvc.ControllerComponents import scala.concurrent.{ExecutionContext, Future} import scala.util.Try import services.RuntimeAccessLevel import services.annotation.AnnotationService import services.contribution.ContributionService import services.document.DocumentService import services.folder.FolderService import services.generated.tables.records.DocumentRecord import services.user.UserService @Singleton class DocumentActionsController @Inject() ( val annotations: AnnotationService, val components: ControllerComponents, val contributions: ContributionService, val documents: DocumentService, val folders: FolderService, val silhouette: Silhouette[Security.Env], val users: UserService, val config: Configuration, implicit val ctx: ExecutionContext ) extends BaseController(components, config, users) with HasPrettyPrintJSON { def bulkUnshareDocuments() = silhouette.SecuredAction.async { implicit request => val docIds = getDocIdPayload(request.body.asJson) val user = request.identity.username Future.sequence { docIds.map(documents.removeDocumentCollaborator(_, user)) }.map { results => val success = !results.exists(!_) if (success) Ok else BadRequest } } }
Example 192
Source File: FolderActionsController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.my.directory.delete import com.mohiva.play.silhouette.api.Silhouette import controllers.{BaseController, HasPrettyPrintJSON, Security} import java.util.UUID import javax.inject.{Inject, Singleton} import play.api.Configuration import play.api.mvc.ControllerComponents import scala.concurrent.{ExecutionContext, Future} import services.SharingLevel import services.folder.FolderService import services.generated.tables.records.{FolderRecord, SharingPolicyRecord} import services.user.UserService @Singleton class FolderActionsController @Inject() ( val components: ControllerComponents, val folders: FolderService, val silhouette: Silhouette[Security.Env], val users: UserService, val config: Configuration, implicit val ctx: ExecutionContext ) extends BaseController(components, config, users) with HasPrettyPrintJSON { private def isAllowed(username: String, folder: FolderRecord, policy: Option[SharingPolicyRecord]) = { folder.getOwner == username || policy.map { p => p.getSharedWith == username && p.getAccessLevel == SharingLevel.ADMIN.toString }.getOrElse(false) } def deleteFolder(id: UUID) = silhouette.SecuredAction.async { implicit request => folders.getFolder(id, request.identity.username).flatMap { _ match { case Some((folder, policy)) => if (isAllowed(request.identity.username, folder, policy)) { folders.deleteFolder(folder.getId).map { success => if (success) Ok else InternalServerError } } else { Future.successful(Forbidden) } case None => Future.successful(NotFound) }} } def bulkDeleteFolders() = silhouette.SecuredAction.async { implicit request => ??? } def unshareFolder(id: UUID) = silhouette.SecuredAction.async { implicit request => ??? } def bulkUnshareFolders() = silhouette.SecuredAction.async { implicit request => ??? } def deleteReadme(folderId: UUID) = silhouette.SecuredAction.async { implicit request => val f = Option(folderId) match { case Some(id) => folders.deleteReadme(folderId) case None => users.deleteReadme(request.identity.username) } f.map { success => if (success) Ok else InternalServerError } } }
Example 193
Source File: WorkspaceController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.my import com.mohiva.play.silhouette.api.Silhouette import controllers.{BaseController, Security, HasPrettyPrintJSON} import javax.inject.{Inject, Singleton} import services.contribution.{Contribution, ContributionService} import services.user.{User, UserService} import org.webjars.play.WebJarsUtil import play.api.{Configuration, Environment} import play.api.i18n.I18nSupport import play.api.libs.json.Json import play.api.mvc.{ControllerComponents, RequestHeader} import services.document.DocumentService import scala.concurrent.{ExecutionContext, Future} @Singleton class WorkspaceController @Inject() ( val components: ControllerComponents, val contributions: ContributionService, val users: UserService, val config: Configuration, val silhouette: Silhouette[Security.Env], implicit val documents: DocumentService, implicit val ctx: ExecutionContext, implicit val env: Environment, implicit val webjars: WebJarsUtil ) extends BaseController(components, config, users) with I18nSupport with HasPrettyPrintJSON { def workspace(usernameInPath: String) = silhouette.UserAwareAction.async { implicit request => // If the user is logged in & the name in the path == username it's the profile owner val isProfileOwner = request.identity match { case Some(userWithRoles) => userWithRoles.username.equalsIgnoreCase(usernameInPath) case None => false } if (isProfileOwner) Future.successful(Ok(views.html.my.workspace())) else renderPublicProfile(usernameInPath, request.identity) } def activityFeed(usernameInPath: String) = silhouette.UserAwareAction.async { implicit request => val loggedInAs = request.identity.map(_.username) contributions.getUserActivityFeed(Seq(usernameInPath), loggedInAs).map { response => jsonOk(Json.toJson(response)) } } }
Example 194
Source File: AccountInfoController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.my.account import com.mohiva.play.silhouette.api.Silhouette import controllers.{BaseController, HasPrettyPrintJSON, Security} import javax.inject.{Inject, Singleton} import play.api.Configuration import play.api.libs.json.Json import play.api.mvc.ControllerComponents import scala.concurrent.{Future, ExecutionContext} import services.contribution.ContributionService import services.document.DocumentService import services.user.UserService import storage.uploads.Uploads @Singleton class AccountInfoController @Inject() ( val components: ControllerComponents, val contributions: ContributionService, val documents: DocumentService, val silhouette: Silhouette[Security.Env], val users: UserService, val uploads: Uploads, val config: Configuration, implicit val ctx: ExecutionContext ) extends BaseController(components, config, users) with HasPrettyPrintJSON { def getCollaborators(username: String) = Action.async { implicit request => contributions.getTopCollaborators(username).map { tuples => val json = tuples.map(t => Json.obj("username" -> t._1, "edits" -> t._2)) jsonOk(Json.toJson(json)) } } }
Example 195
Source File: RestoreController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.my.settings import akka.actor.ActorSystem import com.mohiva.play.silhouette.api.Silhouette import controllers.{HasUserService, HasConfig, Security } import controllers.document.{BackupReader, HasBackupValidation} import java.io.File import javax.inject.Inject import services.annotation.AnnotationService import services.document.DocumentService import services.user.Roles._ import services.user.UserService import play.api.{Configuration, Logger} import play.api.i18n.{I18nSupport, MessagesApi} import play.api.mvc.{AbstractController, ControllerComponents} import scala.concurrent.{ExecutionContext, Future} import storage.db.DB import transform.tiling.TilingService class RestoreController @Inject() ( val components: ControllerComponents, val config: Configuration, val users: UserService, val silhouette: Silhouette[Security.Env], implicit val annotations: AnnotationService, implicit val db: DB, implicit val documents: DocumentService, implicit val tiling: TilingService, implicit val ctx: ExecutionContext, implicit val system: ActorSystem ) extends AbstractController(components) with HasUserService with HasConfig with I18nSupport with BackupReader { def index() = silhouette.SecuredAction { implicit request => Ok(views.html.my.settings.restore(request.identity)) } def restore() = silhouette.SecuredAction.async { implicit request => request.body.asMultipartFormData.map { tempfile => tempfile.file("backup") match { case Some(filepart) => // Forces the owner of the backup to the currently logged in user restoreBackup( filepart.ref.path.toFile, runAsAdmin = false, forcedOwner = Some(request.identity.username) ).map { _ => Redirect(routes.RestoreController.index).flashing("success" -> "The document was restored successfully.") }.recover { case e: HasBackupValidation.InvalidSignatureException => Redirect(routes.RestoreController.index).flashing("error" -> "The authenticity of your backup could not be verified.") case t: Throwable => t.printStackTrace() Redirect(routes.RestoreController.index).flashing("error" -> "There was an error restoring your document.") } case None => Logger.warn("Personal document restore POST without file attached") Future.successful(BadRequest) } }.getOrElse { Logger.warn("Personal document restore POST without form data") Future.successful(BadRequest) } } }
Example 196
Source File: AccountSettingsController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.my.settings import com.mohiva.play.silhouette.api.{Silhouette, LoginInfo} import controllers.{HasUserService, HasConfig, Security} import javax.inject.Inject import services.announcement.AnnouncementService import services.annotation.AnnotationService import services.contribution.ContributionService import services.user.Roles._ import services.user.UserService import services.upload.UploadService import services.document.DocumentService import org.webjars.play.WebJarsUtil import play.api.Configuration import play.api.data.Form import play.api.data.Forms._ import play.api.i18n.I18nSupport import play.api.mvc.{AbstractController, ControllerComponents} import scala.concurrent.{Await, ExecutionContext, Future} import scala.concurrent.duration._ import controllers.HasAccountRemoval case class AccountSettingsData( email : String, name : Option[String], bio : Option[String], website: Option[String]) class AccountSettingsController @Inject() ( val components: ControllerComponents, val config: Configuration, val silhouette: Silhouette[Security.Env], implicit val announcements: AnnouncementService, implicit val annotations: AnnotationService, implicit val contributions: ContributionService, implicit val ctx: ExecutionContext, implicit val documents: DocumentService, implicit val uploads: UploadService, implicit val users: UserService, implicit val webjars: WebJarsUtil ) extends AbstractController(components) with HasUserService with HasConfig with HasAccountRemoval with I18nSupport { val accountSettingsForm = Form( mapping( "email" -> email, "name" -> optional(text(maxLength=80)), "bio" -> optional(text(maxLength=256)), "website" -> optional(text(maxLength=256)) )(AccountSettingsData.apply)(AccountSettingsData.unapply) ) def index() = silhouette.SecuredAction { implicit request => val u = request.identity val form = accountSettingsForm.fill(AccountSettingsData( users.decryptEmail(u.email), u.realName, u.bio, u.website)) Ok(views.html.my.settings.account(form, u)) } def updateAccountSettings() = silhouette.SecuredAction.async { implicit request => accountSettingsForm.bindFromRequest.fold( formWithErrors => Future.successful(BadRequest(views.html.my.settings.account(formWithErrors, request.identity))), f => users.updateUserSettings(request.identity.username, f.email, f.name, f.bio, f.website) .map { success => if (success) Redirect(routes.AccountSettingsController.index).flashing("success" -> "Your settings have been saved.") else Redirect(routes.AccountSettingsController.index).flashing("error" -> "There was an error while saving your settings.") }.recover { case t:Throwable => { t.printStackTrace() Redirect(routes.AccountSettingsController.index).flashing("error" -> "There was an error while saving your settings.") }} ) } def deleteAccount() = silhouette.SecuredAction.async { implicit request => deleteUserAccount(request.identity.username).flatMap { _ => silhouette.env.authenticatorService.discard( request.authenticator, Redirect(controllers.landing.routes.LandingController.index)) } } }
Example 197
Source File: PasswordSettingsController.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.my.settings import com.mohiva.play.silhouette.api.Silhouette import controllers.{ HasConfig, HasUserService, Security } import javax.inject.Inject import services.user.UserService import services.user.Roles._ import play.api.Configuration import play.api.data.Form import play.api.data.Forms._ import play.api.data.validation._ import play.api.i18n.{ I18nSupport, MessagesApi } import play.api.mvc.{AbstractController, ControllerComponents} import scala.concurrent.{ ExecutionContext, Future } case class PasswordSettingsData(currentPassword: String, newPassword: String, verifyPassword: String) class PasswordSettingsController @Inject() ( val components: ControllerComponents, val config: Configuration, val users: UserService, val silhouette: Silhouette[Security.Env], implicit val ctx: ExecutionContext ) extends AbstractController(components) with HasConfig with HasUserService with I18nSupport { private val matchingPasswords: Constraint[PasswordSettingsData] = Constraint("constraints.valid") { d => if (d.newPassword == d.verifyPassword) Valid else Invalid("Passwords must match") } val passwordSettingsForm = Form( mapping( "current" -> nonEmptyText, "new" -> nonEmptyText, "verify" -> nonEmptyText )(PasswordSettingsData.apply)(PasswordSettingsData.unapply).verifying(matchingPasswords) ) def index() = silhouette.SecuredAction { implicit request => Ok(views.html.my.settings.password(passwordSettingsForm, request.identity)) } def updatePassword() = silhouette.SecuredAction.async { implicit request => passwordSettingsForm.bindFromRequest.fold( formWithErrors => Future.successful(BadRequest(views.html.my.settings.password(formWithErrors, request.identity))), f => { users.updatePassword(request.identity.username, f.currentPassword, f.newPassword) .map { _ match { case Right(_) => Redirect(routes.PasswordSettingsController.index).flashing("success" -> "Your password has been updated.") case Left(errorMessage) => Redirect(routes.PasswordSettingsController.index).flashing("error" -> errorMessage) }}.recover { case t:Throwable => { t.printStackTrace() Redirect(routes.PasswordSettingsController.index).flashing("error" -> "There was an error while updating your password.") }} } ) } }
Example 198
Source File: TEIToSpacy.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.document.downloads.serializers.document.spacy import play.api.Configuration import play.api.libs.json._ import play.api.libs.Files.TemporaryFileCreator import scala.concurrent.{ExecutionContext, Future} import services.annotation.AnnotationService import services.document.ExtendedDocumentMetadata import storage.uploads.Uploads trait TEIToSpacy { def teiToSpacy( doc: ExtendedDocumentMetadata )(implicit annotationService: AnnotationService, conf: Configuration, ctx: ExecutionContext, tmpFile: TemporaryFileCreator, uploads: Uploads ): Future[JsValue] = ??? }
Example 199
Source File: RelationsToTriplesCSV.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.document.downloads.serializers.relations import controllers.document.downloads.serializers.BaseSerializer import java.nio.file.Paths import java.util.UUID import kantan.csv.CsvConfiguration import kantan.csv.CsvConfiguration.{Header, QuotePolicy} import kantan.csv.ops._ import play.api.Configuration import play.api.libs.Files.TemporaryFileCreator import scala.concurrent.ExecutionContext import services.annotation.AnnotationService import storage.TempDir import storage.es.ES trait RelationsToTriplesCSV extends BaseSerializer { def relationsToTriplesCSV( documentId: String )(implicit annotationService: AnnotationService, tmpFile: TemporaryFileCreator, conf: Configuration, ctx: ExecutionContext ) = { annotationService.findWithRelationByDocId(documentId, 0, ES.MAX_SIZE).map { annotations => val header = Seq( "source", "relation", "target", "source_tags", "target_tags") val tmp = tmpFile.create(Paths.get(TempDir.get(), s"${UUID.randomUUID}.csv")) val underlying = tmp.path.toFile val config = CsvConfiguration(',', '"', QuotePolicy.Always, Header.Explicit(header)) val writer = underlying.asCsvWriter[Seq[String]](config) annotations.foreach { annotation => val fromQuote = getFirstQuoteOrTranscription(annotation) val fromTags = getTagBodies(annotation).flatMap(_.value) annotation.relations.foreach { relation => val toAnnotation = annotations.find(_.annotationId == relation.relatesTo).get val toQuote = getFirstQuoteOrTranscription(toAnnotation) val toTags = getTagBodies(toAnnotation).flatMap(_.value) relation.bodies.foreach { relationBody => val row = Seq( fromQuote.get, relationBody.value, toQuote.get, fromTags.mkString("|"), toTags.mkString("|") ) writer.write(row) } } } writer.close() underlying } } }
Example 200
Source File: RelationsToGephi.scala From recogito2 with Apache License 2.0 | 5 votes |
package controllers.document.downloads.serializers.relations import controllers.document.downloads.serializers.BaseSerializer import java.nio.file.Paths import java.util.UUID import kantan.csv.CsvConfiguration import kantan.csv.CsvConfiguration.{Header, QuotePolicy} import kantan.csv.ops._ import play.api.Configuration import play.api.libs.Files.TemporaryFileCreator import scala.concurrent.ExecutionContext import services.annotation.AnnotationService import storage.TempDir import storage.es.ES trait RelationsToGephi extends BaseSerializer { def relationsToGephiNodes(documentId: String)( implicit annotationService: AnnotationService, tmpFile: TemporaryFileCreator, conf: Configuration, ctx: ExecutionContext ) = { annotationService.findWithRelationByDocId(documentId, 0, ES.MAX_SIZE).map { annotations => val header = Seq("Id", "Label", "Tags") val tmp = tmpFile.create(Paths.get(TempDir.get(), s"${UUID.randomUUID}.csv")) val underlying = tmp.path.toFile val config = CsvConfiguration(',', '"', QuotePolicy.Always, Header.Explicit(header)) val writer = underlying.asCsvWriter[Seq[String]](config) annotations.foreach { annotation => val tags = getTagBodies(annotation).flatMap(_.value) val row = Seq( annotation.annotationId.toString, getFirstQuote(annotation).getOrElse(""), tags.mkString("|")) writer.write(row) } writer.close() underlying } } def relationsToGephiEdges(documentId: String)( implicit annotationService: AnnotationService, tmpFile: TemporaryFileCreator, conf: Configuration, ctx: ExecutionContext ) = { annotationService.findWithRelationByDocId(documentId, 0, ES.MAX_SIZE).map { annotations => val header = Seq("Source", "Target", "Label") val tmp = tmpFile.create(Paths.get(TempDir.get(), s"${UUID.randomUUID}.csv")) val underlying = tmp.path.toFile val config = CsvConfiguration(',', '"', QuotePolicy.Always, Header.Explicit(header)) val writer = underlying.asCsvWriter[Seq[String]](config) annotations.foreach { annotation => annotation.relations.foreach { relation => val tags = relation.bodies.map(_.value) val row = Seq(annotation.annotationId.toString, relation.relatesTo.toString, tags.mkString) writer.write(row) } } writer.close() underlying } } }