Skip to content

Commit

Permalink
Removed the use of play.api.Application and play.api.Cache singletons…
Browse files Browse the repository at this point in the history
… and Injecting CacheApi and Environment
  • Loading branch information
toshi committed Jul 7, 2016
1 parent a15dbaf commit 0acbb42
Show file tree
Hide file tree
Showing 21 changed files with 172 additions and 116 deletions.
6 changes: 4 additions & 2 deletions module/src/main/scala/jp/t2v/lab/play2/auth/AsyncAuth.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package jp.t2v.lab.play2.auth

import play.api.Mode
import play.api.mvc._
import scala.concurrent.{ExecutionContext, Future}

import scala.concurrent.{ ExecutionContext, Future }

trait AsyncAuth {
self: AuthConfig with Controller =>
Expand Down Expand Up @@ -36,7 +38,7 @@ trait AsyncAuth {
}

private[auth] def extractToken(request: RequestHeader): Option[AuthenticityToken] = {
if (play.api.Play.maybeApplication.forall(app => play.api.Play.isTest(app))) {
if (environment.mode == Mode.Test) {
request.headers.get("PLAY2_AUTH_TEST_TOKEN") orElse tokenAccessor.extract(request)
} else {
tokenAccessor.extract(request)
Expand Down
15 changes: 10 additions & 5 deletions module/src/main/scala/jp/t2v/lab/play2/auth/AuthConfig.scala
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package jp.t2v.lab.play2.auth

import play.api.{ Environment, Mode }
import play.api.cache.CacheApi
import play.api.mvc._
import scala.reflect.{ClassTag, classTag}
import scala.concurrent.{ExecutionContext, Future}

import scala.reflect.{ ClassTag, classTag }
import scala.concurrent.{ ExecutionContext, Future }

trait AuthConfig {

Expand All @@ -12,6 +15,10 @@ trait AuthConfig {

type Authority

val environment: Environment

val idContainer: AsyncIdContainer[Id]

implicit def idTag: ClassTag[Id]

def sessionTimeoutInSeconds: Int
Expand All @@ -28,8 +35,6 @@ trait AuthConfig {

def authorize(user: User, authority: Authority)(implicit context: ExecutionContext): Future[Boolean]

lazy val idContainer: AsyncIdContainer[Id] = AsyncIdContainer(new CacheIdContainer[Id])

@deprecated("it will be deleted since 0.14.x. use CookieTokenAccessor constructor", since = "0.13.1")
final lazy val cookieName: String = throw new AssertionError("use tokenAccessor setting instead.")

Expand All @@ -50,7 +55,7 @@ trait AuthConfig {

lazy val tokenAccessor: TokenAccessor = new CookieTokenAccessor(
cookieName = "PLAY2AUTH_SESS_ID",
cookieSecureOption = play.api.Play.maybeApplication.exists(app => play.api.Play.isProd(app)),
cookieSecureOption = environment.mode == Mode.Prod,
cookieHttpOnlyOption = true,
cookieDomainOption = None,
cookiePathOption = "/",
Expand Down
21 changes: 13 additions & 8 deletions module/src/main/scala/jp/t2v/lab/play2/auth/CacheIdContainer.scala
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package jp.t2v.lab.play2.auth

import play.api.cache.Cache
import play.api.cache.{ Cache, CacheApi }
import play.api.Play._

import scala.annotation.tailrec
import scala.util.Random
import java.security.SecureRandom
import java.util.concurrent.TimeUnit

import scala.concurrent.duration.Duration
import scala.reflect.ClassTag

class CacheIdContainer[Id: ClassTag] extends IdContainer[Id] {
class CacheIdContainer[Id: ClassTag] (cacheApi: CacheApi) extends IdContainer[Id] {

private[auth] val tokenSuffix = ":token"
private[auth] val userIdSuffix = ":userId"
Expand All @@ -28,7 +32,7 @@ class CacheIdContainer[Id: ClassTag] extends IdContainer[Id] {
}

private[auth] def removeByUserId(userId: Id) {
Cache.getAs[String](userId.toString + userIdSuffix) foreach unsetToken
cacheApi.get[String](userId.toString + userIdSuffix) foreach unsetToken
unsetUserId(userId)
}

Expand All @@ -38,17 +42,18 @@ class CacheIdContainer[Id: ClassTag] extends IdContainer[Id] {
}

private[auth] def unsetToken(token: AuthenticityToken) {
Cache.remove(token + tokenSuffix)
cacheApi.remove(token + tokenSuffix)
}
private[auth] def unsetUserId(userId: Id) {
Cache.remove(userId.toString + userIdSuffix)
cacheApi.remove(userId.toString + userIdSuffix)
}

def get(token: AuthenticityToken) = Cache.get(token + tokenSuffix).map(_.asInstanceOf[Id])
def get(token: AuthenticityToken) = cacheApi.get(token + tokenSuffix).map(_.asInstanceOf[Id])

private[auth] def store(token: AuthenticityToken, userId: Id, timeoutInSeconds: Int) {
Cache.set(token + tokenSuffix, userId, timeoutInSeconds)
Cache.set(userId.toString + userIdSuffix, token, timeoutInSeconds)
def intToDuration(seconds: Int): Duration = if (seconds == 0) Duration.Inf else Duration(seconds, TimeUnit.SECONDS)
cacheApi.set(token + tokenSuffix, userId, intToDuration(timeoutInSeconds))
cacheApi.set(userId.toString + userIdSuffix, token, intToDuration(timeoutInSeconds))
}

def prolongTimeout(token: AuthenticityToken, timeoutInSeconds: Int) {
Expand Down
1 change: 1 addition & 0 deletions project/Build.scala
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ object ApplicationBuild extends Build {
name := appName + "-social",
libraryDependencies += "com.typesafe.play" %% "play" % playVersion % "provided",
libraryDependencies += "com.typesafe.play" %% "play-ws" % playVersion % "provided",
libraryDependencies += "com.typesafe.play" %% "play-cache" % playVersion % "provided",
publishMavenStyle := appPublishMavenStyle,
publishArtifact in Test := appPublishArtifactInTest,
pomIncludeRepository := appPomIncludeRepository,
Expand Down
8 changes: 5 additions & 3 deletions sample/app/controllers/basic/Messages.scala
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package controllers.basic

import javax.inject.Inject

import controllers.stack.Pjax
import jp.t2v.lab.play2.auth.AuthElement
import play.api.mvc.Controller
import views.html
import jp.t2v.lab.play2.auth.sample.Role._
import play.api.Environment
import play.twirl.api.Html

trait Messages extends Controller with AuthElement with AuthConfigImpl {
class Messages @Inject() (val environment: Environment) extends Controller with AuthElement with AuthConfigImpl {

def main = StackAction(AuthorityKey -> NormalUser) { implicit request =>
val title = "message main"
Expand All @@ -31,5 +34,4 @@ trait Messages extends Controller with AuthElement with AuthConfigImpl {

protected implicit def template(implicit user: User): String => Html => Html = html.basic.fullTemplate(user)

}
object Messages extends Messages
}
8 changes: 5 additions & 3 deletions sample/app/controllers/builder/Messages.scala
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package controllers.builder

import javax.inject.Inject

import jp.t2v.lab.play2.auth.AuthActionBuilders
import jp.t2v.lab.play2.auth.sample.Account
import jp.t2v.lab.play2.auth.sample.Role._
import play.api.Environment
import play.api.mvc._
import play.twirl.api.Html
import scalikejdbc.{DB, DBSession}
import scalikejdbc.{ DB, DBSession }
import views.html

import scala.concurrent.Future
Expand All @@ -21,7 +24,7 @@ object TransactionalAction extends ActionBuilder[TransactionalRequest] {
}
}

trait Messages extends Controller with AuthActionBuilders with AuthConfigImpl {
class Messages @Inject() (val environment: Environment) extends Controller with AuthActionBuilders with AuthConfigImpl {

type AuthTxRequest[+A] = GenericAuthRequest[A, TransactionalRequest]
final def AuthorizationTxAction(authority: Authority): ActionBuilder[AuthTxRequest] = composeAuthorizationAction(TransactionalAction)(authority)
Expand Down Expand Up @@ -58,4 +61,3 @@ trait Messages extends Controller with AuthActionBuilders with AuthConfigImpl {
}

}
object Messages extends Messages
7 changes: 5 additions & 2 deletions sample/app/controllers/builder/Sessions.scala
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package controllers.builder

import javax.inject.Inject

import jp.t2v.lab.play2.auth.LoginLogout
import jp.t2v.lab.play2.auth.sample.Account
import play.api.Environment
import play.api.data.Form
import play.api.data.Forms._
import play.api.mvc.{Action, Controller}
import play.api.mvc.{ Action, Controller }
import views.html

import scala.concurrent.Future
import play.api.libs.concurrent.Execution.Implicits.defaultContext

object Sessions extends Controller with LoginLogout with AuthConfigImpl {
class Sessions @Inject() (val environment: Environment) extends Controller with LoginLogout with AuthConfigImpl {

val loginForm = Form {
mapping("email" -> email, "password" -> text)(Account.authenticate)(_.map(u => (u.email, "")))
Expand Down
6 changes: 4 additions & 2 deletions sample/app/controllers/csrf/PreventingCsrfSample.scala
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package controllers.csrf

import javax.inject.Inject

import controllers.stack.TokenValidateElement
import jp.t2v.lab.play2.auth.AuthElement
import jp.t2v.lab.play2.auth.sample.Role._
import play.api.Environment
import play.api.data.Form
import play.api.data.Forms._
import play.api.mvc.Controller

trait PreventingCsrfSample extends Controller with TokenValidateElement with AuthElement with AuthConfigImpl {
class PreventingCsrfSample @Inject() (val environment: Environment) extends Controller with TokenValidateElement with AuthElement with AuthConfigImpl {

def formWithToken = StackAction(AuthorityKey -> NormalUser, IgnoreTokenValidation -> true) { implicit req =>
Ok(views.html.csrf.formWithToken())
Expand All @@ -27,4 +30,3 @@ trait PreventingCsrfSample extends Controller with TokenValidateElement with Aut
}

}
object PreventingCsrfSample extends PreventingCsrfSample
7 changes: 5 additions & 2 deletions sample/app/controllers/csrf/Sessions.scala
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package controllers.csrf

import javax.inject.Inject

import jp.t2v.lab.play2.auth.LoginLogout
import jp.t2v.lab.play2.auth.sample.Account
import play.api.Environment
import play.api.data.Form
import play.api.data.Forms._
import play.api.mvc.{Action, Controller}
import play.api.mvc.{ Action, Controller }
import views.html

import scala.concurrent.Future
import play.api.libs.concurrent.Execution.Implicits.defaultContext

object Sessions extends Controller with LoginLogout with AuthConfigImpl {
class Sessions @Inject() (val environment: Environment) extends Controller with LoginLogout with AuthConfigImpl {

val loginForm = Form {
mapping("email" -> email, "password" -> text)(Account.authenticate)(_.map(u => (u.email, "")))
Expand Down
6 changes: 4 additions & 2 deletions sample/app/controllers/ephemeral/Messages.scala
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package controllers.ephemeral

import javax.inject.Inject

import controllers.stack.Pjax
import jp.t2v.lab.play2.auth.AuthElement
import play.api.mvc.Controller
import views.html
import jp.t2v.lab.play2.auth.sample.Role._
import play.api.Environment

trait Messages extends Controller with Pjax with AuthElement with AuthConfigImpl {
class Messages @Inject() (val environment: Environment) extends Controller with Pjax with AuthElement with AuthConfigImpl {

def main = StackAction(AuthorityKey -> NormalUser) { implicit request =>
val title = "message main"
Expand All @@ -31,4 +34,3 @@ trait Messages extends Controller with Pjax with AuthElement with AuthConfigImpl
protected val fullTemplate: User => Template = html.ephemeral.fullTemplate.apply

}
object Messages extends Messages
7 changes: 5 additions & 2 deletions sample/app/controllers/ephemeral/Sessions.scala
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package controllers.ephemeral

import javax.inject.Inject

import jp.t2v.lab.play2.auth.LoginLogout
import jp.t2v.lab.play2.auth.sample.Account
import play.api.Environment
import play.api.data.Form
import play.api.data.Forms._
import play.api.mvc.{Action, Controller}
import play.api.mvc.{ Action, Controller }
import views.html

import scala.concurrent.Future
import play.api.libs.concurrent.Execution.Implicits.defaultContext

object Sessions extends Controller with LoginLogout with AuthConfigImpl {
class Sessions @Inject() (val environment: Environment) extends Controller with LoginLogout with AuthConfigImpl {

val loginForm = Form {
mapping("email" -> email, "password" -> text)(Account.authenticate)(_.map(u => (u.email, "")))
Expand Down
6 changes: 4 additions & 2 deletions sample/app/controllers/rememberme/Messages.scala
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package controllers.rememberme

import javax.inject.Inject

import controllers.stack.Pjax
import jp.t2v.lab.play2.auth.AuthElement
import play.api.mvc.Controller
import views.html
import jp.t2v.lab.play2.auth.sample.Role._
import play.api.Environment

trait Messages extends Controller with Pjax with AuthElement with AuthConfigImpl {
class Messages @Inject() (val environment: Environment) extends Controller with Pjax with AuthElement with AuthConfigImpl {

def main = StackAction(AuthorityKey -> NormalUser) { implicit request =>
val title = "message main"
Expand All @@ -31,4 +34,3 @@ trait Messages extends Controller with Pjax with AuthElement with AuthConfigImpl
protected val fullTemplate: User => Template = html.rememberme.fullTemplate.apply

}
object Messages extends Messages
7 changes: 5 additions & 2 deletions sample/app/controllers/rememberme/Sessions.scala
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package controllers.rememberme

import javax.inject.Inject

import jp.t2v.lab.play2.auth.LoginLogout
import jp.t2v.lab.play2.auth.sample.Account
import play.api.Environment
import play.api.data.Form
import play.api.data.Forms._
import play.api.mvc.{Action, Controller}
import play.api.mvc.{ Action, Controller }
import views.html

import scala.concurrent.Future
import play.api.libs.concurrent.Execution.Implicits.defaultContext

object Sessions extends Controller with LoginLogout with AuthConfigImpl {
class Sessions @Inject() (val environment: Environment) extends Controller with LoginLogout with AuthConfigImpl {

val loginForm = Form {
mapping("email" -> email, "password" -> text)(Account.authenticate)(_.map(u => (u.email, "")))
Expand Down
6 changes: 4 additions & 2 deletions sample/app/controllers/standard/Messages.scala
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package controllers.standard

import javax.inject.Inject

import controllers.stack.Pjax
import jp.t2v.lab.play2.auth.AuthElement
import play.api.mvc.Controller
import views.html
import jp.t2v.lab.play2.auth.sample.Role._
import play.api.Environment

trait Messages extends Controller with Pjax with AuthElement with AuthConfigImpl {
class Messages @Inject() (val environment: Environment) extends Controller with Pjax with AuthElement with AuthConfigImpl {

def main = StackAction(AuthorityKey -> NormalUser) { implicit request =>
val title = "message main"
Expand All @@ -31,4 +34,3 @@ trait Messages extends Controller with Pjax with AuthElement with AuthConfigImpl
protected val fullTemplate: User => Template = html.standard.fullTemplate.apply

}
object Messages extends Messages
7 changes: 5 additions & 2 deletions sample/app/controllers/standard/Sessions.scala
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package controllers.standard

import javax.inject.Inject

import jp.t2v.lab.play2.auth.LoginLogout
import jp.t2v.lab.play2.auth.sample.Account
import play.api.Environment
import play.api.data.Form
import play.api.data.Forms._
import play.api.mvc.{Action, Controller}
import play.api.mvc.{ Action, Controller }
import views.html

import scala.concurrent.Future
import play.api.libs.concurrent.Execution.Implicits.defaultContext

object Sessions extends Controller with LoginLogout with AuthConfigImpl {
class Sessions @Inject() (val environment: Environment) extends Controller with LoginLogout with AuthConfigImpl {

val loginForm = Form {
mapping("email" -> email, "password" -> text)(Account.authenticate)(_.map(u => (u.email, "")))
Expand Down
Loading

0 comments on commit 0acbb42

Please sign in to comment.