Skip to content

Commit

Permalink
Merge pull request #133 from t2v/feature/play2.4
Browse files Browse the repository at this point in the history
Bumped play version
  • Loading branch information
gakuzzzz committed Jul 5, 2015
2 parents 09a08e2 + 070550f commit 6b0f1e5
Show file tree
Hide file tree
Showing 15 changed files with 159 additions and 151 deletions.
5 changes: 2 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
language: scala

jdk:
- oraclejdk7
- oraclejdk8

scala:
- 2.10.4
- 2.11.1
- 2.10.5
- 2.11.6

42 changes: 6 additions & 36 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,6 @@
package jp.t2v.lab.play2.auth

import play.api.mvc._
import play.api.libs.iteratee.{Iteratee, Done}
import scala.concurrent.{ExecutionContext, Future}

trait AsyncAuth {
Expand All @@ -24,7 +23,7 @@ trait AsyncAuth {

private[auth] def restoreUser(implicit request: RequestHeader, context: ExecutionContext): Future[(Option[User], ResultUpdater)] = {
(for {
token <- tokenAccessor.extract(request)
token <- extractToken(request)
} yield for {
Some(userId) <- idContainer.get(token)
Some(user) <- resolveUser(userId)
Expand All @@ -36,41 +35,12 @@ trait AsyncAuth {
}
}

@deprecated(message = "AuthActionBuilder#AuthorizationAction should be preferred", since = "0.13.0")
object authorizedAction {
def async(authority: Authority)(f: User => Request[AnyContent] => Future[Result])(implicit context: ExecutionContext): Action[(AnyContent, User)] =
async(BodyParsers.parse.anyContent, authority)(f)

def async[A](p: BodyParser[A], authority: Authority)(f: User => Request[A] => Future[Result])(implicit context: ExecutionContext): Action[(A, User)] = {
val parser = BodyParser {
req => Iteratee.flatten(authorized(authority)(req, context).map {
case Right((user, _)) => p.map((_, user)).apply(req)
case Left(result) => Done[Array[Byte], Either[Result, (A, User)]](Left(result))
})
}
Action.async(parser) { req => f(req.body._2)(req.map(_._1)) }
private[auth] def extractToken(request: RequestHeader): Option[AuthenticityToken] = {
if (play.api.Play.isTest(play.api.Play.current)) {
request.headers.get("PLAY2_AUTH_TEST_TOKEN") orElse tokenAccessor.extract(request)
} else {
tokenAccessor.extract(request)
}

def apply(authority: Authority)(f: User => (Request[AnyContent] => Result))(implicit context: ExecutionContext): Action[(AnyContent, User)] =
async(authority)(f.andThen(_.andThen(Future.successful)))

def apply[A](p: BodyParser[A], authority: Authority)(f: User => Request[A] => Result)(implicit context: ExecutionContext): Action[(A, User)] =
async(p,authority)(f.andThen(_.andThen(Future.successful)))
}

@deprecated(message = "AuthActionBuilder#OptionalAuthAction should be preferred", since = "0.13.0")
object optionalUserAction {
def async(f: Option[User] => Request[AnyContent] => Future[Result])(implicit context: ExecutionContext): Action[AnyContent] =
async(BodyParsers.parse.anyContent)(f)

def async[A](p: BodyParser[A])(f: Option[User] => Request[A] => Future[Result])(implicit context: ExecutionContext): Action[A] =
Action.async(p)(req => restoreUser(req, context).flatMap { case (user, _) => f(user)(req)})

def apply(f: Option[User] => (Request[AnyContent] => Result))(implicit context: ExecutionContext): Action[AnyContent] =
async(f.andThen(_.andThen(Future.successful)))

def apply[A](p: BodyParser[A])(f: Option[User] => Request[A] => Result)(implicit context: ExecutionContext): Action[A] =
async(p)(f.andThen(_.andThen(Future.successful)))
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,10 @@ import scala.concurrent.Future

trait AuthActionBuilders extends AsyncAuth { self: AuthConfig with Controller =>

// TODO:
// we should make `R`'s type parameter covariant. however, WrappedRequest type parameter is invariant.
// So, if R is covariant, we cannot compose it with ActionBuilders that use WrappedRequest.
// WrappedRequest will be covariant on 2.4 or later.
// When we should change it to covariant.
final case class GenericOptionalAuthRequest[A, R[_] <: Request[_]](user: Option[User], underlying: R[A]) extends WrappedRequest[A](underlying.asInstanceOf[Request[A]])
final case class GenericAuthRequest[A, R[_] <: Request[_]](user: User, underlying: R[A]) extends WrappedRequest[A](underlying.asInstanceOf[Request[A]])
final case class GenericOptionalAuthRequest[+A, R[+_] <: Request[_]](user: Option[User], underlying: R[A]) extends WrappedRequest[A](underlying.asInstanceOf[Request[A]])
final case class GenericAuthRequest[+A, R[+_] <: Request[_]](user: User, underlying: R[A]) extends WrappedRequest[A](underlying.asInstanceOf[Request[A]])

final case class GenericOptionalAuthFunction[R[_] <: Request[_]]() extends ActionFunction[R, ({type L[A] = GenericOptionalAuthRequest[A, R]})#L] {
final case class GenericOptionalAuthFunction[R[+_] <: Request[_]]() extends ActionFunction[R, ({type L[+A] = GenericOptionalAuthRequest[A, R]})#L] {
def invokeBlock[A](request: R[A], block: GenericOptionalAuthRequest[A, R] => Future[Result]) = {
implicit val ctx = executionContext
restoreUser(request, executionContext) recover {
Expand All @@ -24,7 +19,7 @@ trait AuthActionBuilders extends AsyncAuth { self: AuthConfig with Controller =>
}
}

final case class GenericAuthenticationRefiner[R[_] <: Request[_]]() extends ActionRefiner[({type L[A] = GenericOptionalAuthRequest[A, R]})#L, ({type L[A] = GenericAuthRequest[A, R]})#L] {
final case class GenericAuthenticationRefiner[R[+_] <: Request[_]]() extends ActionRefiner[({type L[+A] = GenericOptionalAuthRequest[A, R]})#L, ({type L[+A] = GenericAuthRequest[A, R]})#L] {
override protected def refine[A](request: GenericOptionalAuthRequest[A, R]): Future[Either[Result, GenericAuthRequest[A, R]]] = {
request.user map { user =>
Future.successful(Right[Result, GenericAuthRequest[A, R]](GenericAuthRequest[A, R](user, request.underlying)))
Expand All @@ -35,7 +30,7 @@ trait AuthActionBuilders extends AsyncAuth { self: AuthConfig with Controller =>
}
}

final case class GenericAuthorizationFilter[R[_] <: Request[_]](authority: Authority) extends ActionFilter[({type L[B] = GenericAuthRequest[B, R]})#L] {
final case class GenericAuthorizationFilter[R[+_] <: Request[_]](authority: Authority) extends ActionFilter[({type L[+B] = GenericAuthRequest[B, R]})#L] {
override protected def filter[A](request: GenericAuthRequest[A, R]): Future[Option[Result]] = {
implicit val ctx = executionContext
authorize(request.user, authority) collect {
Expand All @@ -46,20 +41,20 @@ trait AuthActionBuilders extends AsyncAuth { self: AuthConfig with Controller =>
}
}

final def composeOptionalAuthAction[R[_] <: Request[_]](builder: ActionBuilder[R]): ActionBuilder[({type L[A] = GenericOptionalAuthRequest[A, R]})#L] = {
final def composeOptionalAuthAction[R[+_] <: Request[_]](builder: ActionBuilder[R]): ActionBuilder[({type L[+A] = GenericOptionalAuthRequest[A, R]})#L] = {
builder.andThen[({type L[A] = GenericOptionalAuthRequest[A, R]})#L](GenericOptionalAuthFunction[R]())
}

final def composeAuthenticationAction[R[_] <: Request[_]](builder: ActionBuilder[R]): ActionBuilder[({type L[A] = GenericAuthRequest[A, R]})#L] = {
composeOptionalAuthAction[R](builder).andThen[({type L[A] = GenericAuthRequest[A, R]})#L](GenericAuthenticationRefiner[R]())
final def composeAuthenticationAction[R[+_] <: Request[_]](builder: ActionBuilder[R]): ActionBuilder[({type L[+A] = GenericAuthRequest[A, R]})#L] = {
composeOptionalAuthAction[R](builder).andThen[({type L[+A] = GenericAuthRequest[A, R]})#L](GenericAuthenticationRefiner[R]())
}

final def composeAuthorizationAction[R[_] <: Request[_]](builder: ActionBuilder[R])(authority: Authority): ActionBuilder[({type L[A] = GenericAuthRequest[A, R]})#L] = {
composeAuthenticationAction(builder).andThen[({type L[A] = GenericAuthRequest[A, R]})#L](GenericAuthorizationFilter[R](authority))
final def composeAuthorizationAction[R[+_] <: Request[_]](builder: ActionBuilder[R])(authority: Authority): ActionBuilder[({type L[+A] = GenericAuthRequest[A, R]})#L] = {
composeAuthenticationAction(builder).andThen[({type L[+A] = GenericAuthRequest[A, R]})#L](GenericAuthorizationFilter[R](authority))
}

final type OptionalAuthRequest[A] = GenericOptionalAuthRequest[A, Request]
final type AuthRequest[A] = GenericAuthRequest[A, Request]
final type OptionalAuthRequest[+A] = GenericOptionalAuthRequest[A, Request]
final type AuthRequest[+A] = GenericAuthRequest[A, Request]
final val OptionalAuthFunction: ActionFunction[Request, OptionalAuthRequest] = GenericOptionalAuthFunction[Request]()
final val AuthenticationRefiner: ActionRefiner[OptionalAuthRequest, AuthRequest] = GenericAuthenticationRefiner[Request]()
final def AuthorizationFilter(authority: Authority): ActionFilter[AuthRequest] = GenericAuthorizationFilter[Request](authority)
Expand Down
31 changes: 13 additions & 18 deletions module/src/main/scala/jp/t2v/lab/play2/auth/AuthConfig.scala
Original file line number Diff line number Diff line change
Expand Up @@ -24,42 +24,37 @@ trait AuthConfig {

def authenticationFailed(request: RequestHeader)(implicit context: ExecutionContext): Future[Result]

@deprecated("it will be deleted since 0.14.x. use authorizationFailed(RequestHeader, User, Option[Authority])", since = "0.13.1")
def authorizationFailed(request: RequestHeader)(implicit context: ExecutionContext): Future[Result]

def authorizationFailed(request: RequestHeader, user: User, authority: Option[Authority])(implicit context: ExecutionContext): Future[Result] = {
authorizationFailed(request)
}
def authorizationFailed(request: RequestHeader, user: User, authority: Option[Authority])(implicit context: ExecutionContext): Future[Result]

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")
lazy val cookieName: String = "PLAY2AUTH_SESS_ID"
final lazy val cookieName: String = throw new AssertionError("use tokenAccessor setting instead.")

@deprecated("it will be deleted since 0.14.0. use CookieTokenAccessor constructor", since = "0.13.1")
lazy val cookieSecureOption: Boolean = false
final lazy val cookieSecureOption: Boolean = throw new AssertionError("use tokenAccessor setting instead.")

@deprecated("it will be deleted since 0.14.0. use CookieTokenAccessor constructor", since = "0.13.1")
lazy val cookieHttpOnlyOption: Boolean = true
final lazy val cookieHttpOnlyOption: Boolean = throw new AssertionError("use tokenAccessor setting instead.")

@deprecated("it will be deleted since 0.14.0. use CookieTokenAccessor constructor", since = "0.13.1")
lazy val cookieDomainOption: Option[String] = None
final lazy val cookieDomainOption: Option[String] = throw new AssertionError("use tokenAccessor setting instead.")

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

@deprecated("it will be deleted since 0.14.0. use CookieTokenAccessor constructor", since = "0.13.1")
lazy val isTransientCookie: Boolean = false
final lazy val isTransientCookie: Boolean = throw new AssertionError("use tokenAccessor setting instead.")

lazy val tokenAccessor: TokenAccessor = new CookieTokenAccessor(
cookieName = cookieName,
cookieSecureOption = cookieSecureOption,
cookieHttpOnlyOption = cookieHttpOnlyOption,
cookieDomainOption = cookieDomainOption,
cookiePathOption = cookiePathOption,
cookieMaxAge = if (isTransientCookie) None else Some(sessionTimeoutInSeconds)
cookieName = "PLAY2AUTH_SESS_ID",
cookieSecureOption = play.api.Play.isProd(play.api.Play.current),
cookieHttpOnlyOption = true,
cookieDomainOption = None,
cookiePathOption = "/",
cookieMaxAge = Some(sessionTimeoutInSeconds)
)

}
20 changes: 0 additions & 20 deletions module/src/main/scala/jp/t2v/lab/play2/auth/CookieSupport.scala

This file was deleted.

58 changes: 35 additions & 23 deletions project/Build.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,19 @@ object ApplicationBuild extends Build {
val playVersion = play.core.PlayVersion.current

lazy val baseSettings = Seq(
version := "0.13.2",
scalaVersion := "2.10.4",
crossScalaVersions := Seq("2.10.4", "2.11.1"),
version := "0.14.0-SNAPSHOT",
scalaVersion := "2.11.6",
crossScalaVersions := Seq("2.10.5", "2.11.6"),
organization := "jp.t2v",
resolvers += "Typesafe repository" at "http:https://repo.typesafe.com/typesafe/releases/",
resolvers += Resolver.typesafeRepo("releases"),
resolvers += Resolver.sonatypeRepo("releases"),
resolvers ++= {
if (isSnapshot.value) {
Seq("Sonatype Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots")
Seq(Resolver.sonatypeRepo("snapshots"))
} else {
Nil
}
},
resolvers += "Sonatype Releases" at "https://oss.sonatype.org/content/repositories/releases"
}
)

lazy val appPublishMavenStyle = true
Expand Down Expand Up @@ -58,11 +58,11 @@ object ApplicationBuild extends Build {


lazy val core = Project("core", base = file("module"))
.settings(baseSettings: _*)
.settings(baseSettings)
.settings(
libraryDependencies += "com.typesafe.play" %% "play" % playVersion % "provided",
libraryDependencies += play.PlayImport.cache,
libraryDependencies += "jp.t2v" %% "stackable-controller" % "0.4.1",
libraryDependencies += "com.typesafe.play" %% "play-cache" % playVersion % "provided",
libraryDependencies += "jp.t2v" %% "stackable-controller" % "0.5.0",
name := appName,
publishMavenStyle := appPublishMavenStyle,
publishArtifact in Test := appPublishArtifactInTest,
Expand All @@ -72,9 +72,9 @@ object ApplicationBuild extends Build {
)

lazy val test = Project("test", base = file("test"))
.settings(baseSettings: _*)
.settings(baseSettings)
.settings(
libraryDependencies += "com.typesafe.play" %% "play-test" % playVersion,
libraryDependencies += "com.typesafe.play" %% "play-test" % playVersion % "provided",
name := appName + "-test",
publishMavenStyle := appPublishMavenStyle,
publishArtifact in Test := appPublishArtifactInTest,
Expand All @@ -84,18 +84,30 @@ object ApplicationBuild extends Build {
).dependsOn(core)

lazy val sample = Project("sample", file("sample"))
.enablePlugins(play.PlayScala)
.settings(baseSettings: _*)
.enablePlugins(play.sbt.PlayScala)
.settings(baseSettings)
.settings(
libraryDependencies += play.Play.autoImport.jdbc,
resolvers += "scalaz-bintray" at "https://dl.bintray.com/scalaz/releases",
libraryDependencies += play.sbt.Play.autoImport.cache,
libraryDependencies += play.sbt.Play.autoImport.specs2 % Test,
libraryDependencies += play.sbt.Play.autoImport.jdbc,
libraryDependencies += "org.mindrot" % "jbcrypt" % "0.3m",
libraryDependencies += "org.scalikejdbc" %% "scalikejdbc" % "2.2.3",
libraryDependencies += "org.scalikejdbc" %% "scalikejdbc-config" % "2.2.3",
libraryDependencies += "org.scalikejdbc" %% "scalikejdbc-syntax-support-macro" % "2.2.3",
libraryDependencies += "org.scalikejdbc" %% "scalikejdbc-test" % "2.2.3" % "test",
libraryDependencies += "org.scalikejdbc" %% "scalikejdbc-play-plugin" % "2.3.5",
libraryDependencies += "com.github.tototoshi" %% "play-flyway" % "1.2.1",
TwirlKeys.templateImports in Compile += "jp.t2v.lab.play2.auth.sample._",
libraryDependencies += "org.scalikejdbc" %% "scalikejdbc" % "2.2.7",
libraryDependencies += "org.scalikejdbc" %% "scalikejdbc-config" % "2.2.7",
libraryDependencies += "org.scalikejdbc" %% "scalikejdbc-syntax-support-macro" % "2.2.7",
libraryDependencies += "org.scalikejdbc" %% "scalikejdbc-test" % "2.2.7" % "test",
libraryDependencies += "org.scalikejdbc" %% "scalikejdbc-play-initializer" % "2.4.0",
libraryDependencies += "org.scalikejdbc" %% "scalikejdbc-play-dbapi-adapter" % "2.4.0",
libraryDependencies += "org.scalikejdbc" %% "scalikejdbc-play-fixture" % "2.4.0",
libraryDependencies += "org.flywaydb" %% "flyway-play" % "2.0.0",
TwirlKeys.templateImports in Compile ++= Seq(
"jp.t2v.lab.play2.auth.sample._",
"play.api.data.Form",
"play.api.mvc.Flash",
"views._",
"views.html.helper",
"controllers._"
),
publish := { },
publishArtifact := false,
packagedArtifacts := Map.empty,
Expand All @@ -105,7 +117,7 @@ object ApplicationBuild extends Build {
.dependsOn(core, test % "test")

lazy val root = Project("root", base = file("."))
.settings(baseSettings: _*)
.settings(baseSettings)
.settings(
publish := { },
publishArtifact := false,
Expand Down
2 changes: 1 addition & 1 deletion project/build.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
sbt.version=0.13.5
sbt.version=0.13.8
5 changes: 3 additions & 2 deletions project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
// The Typesafe repository
resolvers ++= Seq(
"Typesafe repository" at "http:https://repo.typesafe.com/typesafe/releases/"
"Typesafe repository" at "http:https://repo.typesafe.com/typesafe/releases/",
"Typesafe Snapshots repository" at "http:https://repo.typesafe.com/typesafe/snapshots/"
)

// Use the Play sbt plugin for Play projects
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.0")
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.4.2")

scalacOptions ++= Seq("-deprecation", "-unchecked", "-language:_")

Loading

0 comments on commit 6b0f1e5

Please sign in to comment.