Skip to content

Commit 7a46683

Browse files
committed
- Master is now compatible with Play 2.3. Use branch master-play.2.2.x for Play 2.2.
1 parent 5fe8772 commit 7a46683

29 files changed

+117
-107
lines changed

ChangeLog

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
master -
2+
- Code is now compatible with Play 2.3
23
- Added SecureSocial.currentUser to support Websockets
34
- Fixed #429: null pointer exception in UserAware Java API (thanks @mangecoeur)
45
- Pull request #159: Weibo support (thanks @qiuzhanghua and @wuhaixing)

module-code/app/securesocial/controllers/LoginPage.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ trait BaseLoginPage[U] extends SecureSocial[U]
7777
} yield {
7878
import ExecutionContext.Implicits.global
7979
redirectTo.discardingAuthenticator(authenticator).map {
80-
_.withSession(Events.fire(new LogoutEvent(user)).getOrElse(session))
80+
_.withSession(Events.fire(new LogoutEvent(user)).getOrElse(request.session))
8181
}
8282
}
8383
result.getOrElse {

module-code/app/securesocial/controllers/PasswordChange.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ trait BasePasswordChange[U] extends SecureSocial[U] {
128128
info => {
129129
val newPasswordInfo = env.currentHasher.hash(info.newPassword)
130130
import ExecutionContext.Implicits.global
131-
implicit val userLang = lang(request)
131+
implicit val userLang = request2lang(request)
132132
env.userService.updatePasswordInfo(request.user, newPasswordInfo).map {
133133
case Some(u) =>
134134
env.mailer.sendPasswordChangedNotice(u)(request, userLang)

module-code/app/securesocial/controllers/PasswordReset.scala

+9-10
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,17 @@
1616
*/
1717
package securesocial.controllers
1818

19-
import securesocial.core._
20-
import play.api.mvc.Action
21-
import scala.concurrent.{Future, ExecutionContext}
22-
import securesocial.core.providers.UsernamePasswordProvider
23-
import play.api.i18n.Messages
2419
import play.api.data.Form
2520
import play.api.data.Forms._
21+
import play.api.i18n.Messages
22+
import play.api.mvc.Action
23+
import securesocial.core._
24+
import securesocial.core.providers.UsernamePasswordProvider
2625
import securesocial.core.providers.utils.PasswordValidator
27-
import securesocial.core.PasswordResetEvent
28-
import scala.Some
2926
import securesocial.core.services.SaveMode
3027

28+
import scala.concurrent.Future
29+
3130
/**
3231
* A default controller the uses the BasicProfile as the user type
3332
*
@@ -67,7 +66,7 @@ trait BasePasswordReset[U] extends MailTokenBasedOperations[U] {
6766
*/
6867
def handleStartResetPassword = Action.async {
6968
implicit request =>
70-
import ExecutionContext.Implicits.global
69+
import scala.concurrent.ExecutionContext.Implicits.global
7170
startForm.bindFromRequest.fold(
7271
errors => Future.successful(BadRequest(env.viewTemplates.getStartResetPasswordPage(errors))),
7372
email => env.userService.findByEmailAndProvider(email, UsernamePasswordProvider.UsernamePassword).map {
@@ -105,7 +104,7 @@ trait BasePasswordReset[U] extends MailTokenBasedOperations[U] {
105104
* @param token the token that identifies the user request
106105
*/
107106
def handleResetPassword(token: String) = Action.async { implicit request =>
108-
import ExecutionContext.Implicits.global
107+
import scala.concurrent.ExecutionContext.Implicits.global
109108
executeForToken(token, false, {
110109
t => changePasswordForm.bindFromRequest.fold(errors =>
111110
Future.successful(BadRequest(env.viewTemplates.getResetPasswordPage(errors, token))),
@@ -118,7 +117,7 @@ trait BasePasswordReset[U] extends MailTokenBasedOperations[U] {
118117
deleted <- env.userService.deleteToken(token)
119118
) yield {
120119
env.mailer.sendPasswordChangedNotice(profile)
121-
val eventSession = Events.fire(new PasswordResetEvent(updated)).getOrElse(session)
120+
val eventSession = Events.fire(new PasswordResetEvent(updated)).getOrElse(request.session)
122121
confirmationResult().withSession(eventSession).flashing(Success -> Messages(PasswordUpdated))
123122
}
124123
case _ =>

module-code/app/securesocial/controllers/ProviderController.scala

+11-11
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@
1616
*/
1717
package securesocial.controllers
1818

19-
import play.api.mvc._
19+
import play.api.Play
20+
import play.api.Play.current
2021
import play.api.i18n.Messages
22+
import play.api.mvc._
2123
import securesocial.core._
22-
import securesocial.core.utils._
23-
import play.api.Play
24-
import Play.current
25-
import scala.Some
26-
import scala.concurrent.{ExecutionContext, Future}
2724
import securesocial.core.authenticator.CookieAuthenticator
2825
import securesocial.core.services.SaveMode
26+
import securesocial.core.utils._
27+
28+
import scala.concurrent.Future
2929

3030

3131
/**
@@ -41,7 +41,7 @@ class ProviderController(override implicit val env: RuntimeEnvironment[BasicProf
4141
*/
4242
trait BaseProviderController[U] extends SecureSocial[U]
4343
{
44-
import ProviderControllerHelper.{logger, toUrl}
44+
import securesocial.controllers.ProviderControllerHelper.{logger, toUrl}
4545

4646
/**
4747
* The authentication entry point for GET requests
@@ -89,9 +89,9 @@ trait BaseProviderController[U] extends SecureSocial[U]
8989
* @param redirectTo the url the user needs to be redirected to after being authenticated
9090
*/
9191
private def handleAuth(provider: String, redirectTo: Option[String]) = UserAwareAction.async { implicit request =>
92-
import ExecutionContext.Implicits.global
92+
import scala.concurrent.ExecutionContext.Implicits.global
9393
val authenticationFlow = request.user.isEmpty
94-
val modifiedSession = overrideOriginalUrl(session, redirectTo)
94+
val modifiedSession = overrideOriginalUrl(request.session, redirectTo)
9595

9696
env.providers.get(provider).map { _.authenticate().flatMap {
9797
case denied: AuthenticationResult.AccessDenied =>
@@ -112,8 +112,8 @@ trait BaseProviderController[U] extends SecureSocial[U]
112112
env.userService.save(authenticated.profile, mode).flatMap { userForAction =>
113113
logger.debug(s"[securesocial] user completed authentication: provider = ${profile.providerId}, userId: ${profile.userId}, mode = $mode")
114114
val evt = if (mode == SaveMode.LoggedIn) new LoginEvent(userForAction) else new SignUpEvent(userForAction)
115-
val sessionAfterEvents = Events.fire(evt).getOrElse(session)
116-
import ExecutionContext.Implicits.global
115+
val sessionAfterEvents = Events.fire(evt).getOrElse(request.session)
116+
import scala.concurrent.ExecutionContext.Implicits.global
117117
builder().fromUser(userForAction).flatMap { authenticator =>
118118
Redirect(toUrl(sessionAfterEvents)).withSession(sessionAfterEvents -
119119
SecureSocial.OriginalUrlKey -

module-code/app/securesocial/controllers/Registration.scala

+12-12
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,18 @@
1616
*/
1717
package securesocial.controllers
1818

19-
import play.api.mvc.Action
20-
import play.api.data._
2119
import play.api.data.Forms._
22-
import securesocial.core.providers.UsernamePasswordProvider
23-
import securesocial.core._
24-
import securesocial.core.providers.utils._
20+
import play.api.data._
2521
import play.api.i18n.Messages
26-
import scala.Some
27-
import scala.concurrent.{ExecutionContext, Future, Await}
22+
import play.api.mvc.Action
23+
import securesocial.core._
2824
import securesocial.core.authenticator.CookieAuthenticator
25+
import securesocial.core.providers.UsernamePasswordProvider
26+
import securesocial.core.providers.utils._
2927
import securesocial.core.services.SaveMode
3028

29+
import scala.concurrent.{Await, ExecutionContext, Future}
30+
3131

3232
/**
3333
* A default Registration controller that uses the BasicProfile as the user type
@@ -43,7 +43,7 @@ class Registration(override implicit val env: RuntimeEnvironment[BasicProfile])
4343
*/
4444
trait BaseRegistration[U] extends MailTokenBasedOperations[U] {
4545

46-
import BaseRegistration._
46+
import securesocial.controllers.BaseRegistration._
4747

4848
private val logger = play.api.Logger("securesocial.controllers.Registration")
4949

@@ -116,15 +116,15 @@ trait BaseRegistration[U] extends MailTokenBasedOperations[U] {
116116
e => {
117117
val email = e.toLowerCase
118118
// check if there is already an account for this email address
119-
import ExecutionContext.Implicits.global
119+
import scala.concurrent.ExecutionContext.Implicits.global
120120
env.userService.findByEmailAndProvider(email, UsernamePasswordProvider.UsernamePassword).map {
121121
maybeUser =>
122122
maybeUser match {
123123
case Some(user) =>
124124
// user signed up already, send an email offering to login/recover password
125125
env.mailer.sendAlreadyRegisteredEmail(user)
126126
case None =>
127-
import ExecutionContext.Implicits.global
127+
import scala.concurrent.ExecutionContext.Implicits.global
128128
createToken(email, isSignUp = true).map { token =>
129129
env.mailer.sendSignUpEmail(email, token.uuid)
130130
}
@@ -153,7 +153,7 @@ trait BaseRegistration[U] extends MailTokenBasedOperations[U] {
153153
*/
154154
def handleSignUp(token: String) = Action.async {
155155
implicit request =>
156-
import ExecutionContext.Implicits.global
156+
import scala.concurrent.ExecutionContext.Implicits.global
157157
executeForToken(token, true, {
158158
t =>
159159
form.bindFromRequest.fold(
@@ -189,7 +189,7 @@ trait BaseRegistration[U] extends MailTokenBasedOperations[U] {
189189
) yield {
190190
if (UsernamePasswordProvider.sendWelcomeEmail)
191191
env.mailer.sendWelcomeEmail(newUser)
192-
val eventSession = Events.fire(new SignUpEvent(saved)).getOrElse(session)
192+
val eventSession = Events.fire(new SignUpEvent(saved)).getOrElse(request.session)
193193
if (UsernamePasswordProvider.signupSkipLogin) {
194194
env.authenticatorService.find(CookieAuthenticator.Id).map {
195195
_.fromUser(saved).flatMap { authenticator =>

module-code/app/securesocial/controllers/ViewsPlugin.scala

+13-13
Original file line numberDiff line numberDiff line change
@@ -138,31 +138,31 @@ object ViewTemplates {
138138

139139
override def getLoginPage(form: Form[(String, String)],
140140
msg: Option[String] = None)(implicit request: RequestHeader, lang: Lang): Html = {
141-
securesocial.views.html.login(form, msg)
141+
securesocial.views.html.login(form, msg)(request, lang, env)
142142
}
143143

144144
override def getSignUpPage(form: Form[RegistrationInfo], token: String)(implicit request: RequestHeader, lang: Lang): Html = {
145-
securesocial.views.html.Registration.signUp(form, token)
145+
securesocial.views.html.Registration.signUp(form, token)(request, lang, env)
146146
}
147147

148148
override def getStartSignUpPage(form: Form[String])(implicit request: RequestHeader, lang: Lang): Html = {
149-
securesocial.views.html.Registration.startSignUp(form)
149+
securesocial.views.html.Registration.startSignUp(form)(request, lang, env)
150150
}
151151

152152
override def getStartResetPasswordPage(form: Form[String])(implicit request: RequestHeader, lang: Lang): Html = {
153-
securesocial.views.html.Registration.startResetPassword(form)
153+
securesocial.views.html.Registration.startResetPassword(form)(request, lang, env)
154154
}
155155

156156
override def getResetPasswordPage(form: Form[(String, String)], token: String)(implicit request: RequestHeader, lang: Lang): Html = {
157-
securesocial.views.html.Registration.resetPasswordPage(form, token)
157+
securesocial.views.html.Registration.resetPasswordPage(form, token)(request, lang, env)
158158
}
159159

160160
override def getPasswordChangePage(form: Form[ChangeInfo])(implicit request: RequestHeader, lang: Lang): Html = {
161-
securesocial.views.html.passwordChange(form)
161+
securesocial.views.html.passwordChange(form)(request, lang, env)
162162
}
163163

164164
def getNotAuthorizedPage(implicit request: RequestHeader, lang: Lang): Html = {
165-
securesocial.views.html.notAuthorized()
165+
securesocial.views.html.notAuthorized()(request, lang, env)
166166
}
167167
}
168168
}
@@ -174,27 +174,27 @@ object MailTemplates {
174174
class Default(env: RuntimeEnvironment[_]) extends MailTemplates {
175175
implicit val implicitEnv = env
176176
def getSignUpEmail(token: String)(implicit request: RequestHeader, lang: Lang): (Option[Txt], Option[Html]) = {
177-
(None, Some(securesocial.views.html.mails.signUpEmail(token)))
177+
(None, Some(securesocial.views.html.mails.signUpEmail(token)(request, lang)))
178178
}
179179

180180
def getAlreadyRegisteredEmail(user: BasicProfile)(implicit request: RequestHeader, lang: Lang): (Option[Txt], Option[Html]) = {
181-
(None, Some(securesocial.views.html.mails.alreadyRegisteredEmail(user)))
181+
(None, Some(securesocial.views.html.mails.alreadyRegisteredEmail(user)(request, lang, env)))
182182
}
183183

184184
def getWelcomeEmail(user: BasicProfile)(implicit request: RequestHeader, lang: Lang): (Option[Txt], Option[Html]) = {
185-
(None, Some(securesocial.views.html.mails.welcomeEmail(user)))
185+
(None, Some(securesocial.views.html.mails.welcomeEmail(user)(request, lang, env)))
186186
}
187187

188188
def getUnknownEmailNotice()(implicit request: RequestHeader, lang: Lang): (Option[Txt], Option[Html]) = {
189-
(None, Some(securesocial.views.html.mails.unknownEmailNotice()))
189+
(None, Some(securesocial.views.html.mails.unknownEmailNotice()(request, lang)))
190190
}
191191

192192
def getSendPasswordResetEmail(user: BasicProfile, token: String)(implicit request: RequestHeader, lang: Lang): (Option[Txt], Option[Html]) = {
193-
(None, Some(securesocial.views.html.mails.passwordResetEmail(user, token)))
193+
(None, Some(securesocial.views.html.mails.passwordResetEmail(user, token)(request, lang, env)))
194194
}
195195

196196
def getPasswordChangedNoticeEmail(user: BasicProfile)(implicit request: RequestHeader, lang: Lang): (Option[Txt], Option[Html]) = {
197-
(None, Some(securesocial.views.html.mails.passwordChangedNotice(user)))
197+
(None, Some(securesocial.views.html.mails.passwordChangedNotice(user)(request, lang, env)))
198198
}
199199
}
200200
}

module-code/app/securesocial/core/SecureSocial.scala

+4-4
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@ trait SecureSocial[U] extends Controller {
4545
*/
4646
protected val notAuthenticatedJson = Unauthorized(Json.toJson(Map("error"->"Credentials required"))).as(JSON)
4747
protected val notAuthorizedJson = Forbidden(Json.toJson(Map("error" -> "Not authorized"))).as(JSON)
48-
protected def notAuthorizedPage(): Html = securesocial.views.html.notAuthorized()
48+
protected def notAuthorizedPage()(implicit request: RequestHeader): Html = securesocial.views.html.notAuthorized()
4949

5050
protected def notAuthenticatedResult[A](implicit request: Request[A]): Future[SimpleResult] = {
5151
Future.successful {
5252
render {
5353
case Accepts.Json() => notAuthenticatedJson
5454
case Accepts.Html() => Redirect(env.routes.loginPageUrl).
5555
flashing("error" -> Messages("securesocial.loginRequired"))
56-
.withSession(session + (SecureSocial.OriginalUrlKey -> request.uri))
56+
.withSession(request.session + (SecureSocial.OriginalUrlKey -> request.uri))
5757
case _ => Unauthorized("Credentials required")
5858
}
5959
}
@@ -132,7 +132,7 @@ trait SecureSocial[U] extends Controller {
132132
}
133133
}
134134

135-
override protected def invokeBlock[A](request: Request[A],
135+
override def invokeBlock[A](request: Request[A],
136136
block: (SecuredRequest[A]) => Future[SimpleResult]): Future[SimpleResult] =
137137
{
138138
invokeSecuredBlock(authorize, request, block)
@@ -152,7 +152,7 @@ trait SecureSocial[U] extends Controller {
152152
* The UserAwareAction builder
153153
*/
154154
class UserAwareActionBuilder extends ActionBuilder[({ type R[A] = RequestWithUser[A] })#R] {
155-
protected def invokeBlock[A](request: Request[A],
155+
override def invokeBlock[A](request: Request[A],
156156
block: (RequestWithUser[A]) => Future[SimpleResult]): Future[SimpleResult] =
157157
{
158158
import ExecutionContext.Implicits.global

module-code/app/securesocial/core/authenticator/StoreBackedAuthenticator.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package securesocial.core.authenticator
1818

1919
import org.joda.time.DateTime
20+
import scala.annotation.meta.getter
2021
import scala.concurrent.{ExecutionContext, Future}
2122
import play.api.mvc.SimpleResult
2223

@@ -30,7 +31,7 @@ trait StoreBackedAuthenticator[U, T <: Authenticator[U]] extends Authenticator[U
3031
@transient
3132
protected val logger = play.api.Logger(this.getClass.getName)
3233

33-
@transient
34+
@(transient @getter)
3435
val store: AuthenticatorStore[T]
3536

3637
/**

module-code/app/securesocial/core/java/BasePasswordValidator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,6 @@ public abstract class BasePasswordValidator implements PasswordValidator {
4141
* @return
4242
*/
4343
protected Tuple2<String, Seq<Object>> toScalaTuple(String message, List<Object> params) {
44-
return new Tuple2<String, Seq<Object>>(message, JavaConverters.asScalaIterableConverter(params).asScala().toSeq());
44+
return new Tuple2<String, Seq<Object>>(message, JavaConverters.collectionAsScalaIterableConverter(params).asScala().toSeq());
4545
}
4646
}

module-code/app/securesocial/core/java/DefaultSecuredActionResponses.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
package securesocial.core.java;
1818

1919
import com.fasterxml.jackson.databind.node.ObjectNode;
20-
import play.api.templates.Html;
2120
import play.libs.F;
2221
import play.libs.Json;
2322
import play.mvc.Controller;
2423
import play.mvc.Http;
25-
import play.mvc.SimpleResult;
24+
import play.mvc.Result;
25+
import play.twirl.api.Html;
2626

2727
/**
2828
* The default responses sent when the invoker is not authenticated or authorized to execute a protected
@@ -32,12 +32,12 @@
3232
*/
3333
public class DefaultSecuredActionResponses extends Controller implements SecuredActionResponses {
3434
public Html notAuthorizedPage(Http.Context ctx) {
35-
return securesocial.views.html.notAuthorized.render(ctx.lang(), SecureSocial.env());
35+
return securesocial.views.html.notAuthorized.render(ctx._requestHeader(), ctx.lang(), SecureSocial.env());
3636
}
3737

38-
public F.Promise<SimpleResult> notAuthenticatedResult(Http.Context ctx) {
38+
public F.Promise<Result> notAuthenticatedResult(Http.Context ctx) {
3939
Http.Request req = ctx.request();
40-
SimpleResult result;
40+
Result result;
4141

4242
if ( req.accepts("text/html")) {
4343
ctx.flash().put("error", play.i18n.Messages.get("securesocial.loginRequired"));
@@ -53,9 +53,9 @@ public F.Promise<SimpleResult> notAuthenticatedResult(Http.Context ctx) {
5353
return F.Promise.pure(result);
5454
}
5555

56-
public F.Promise<SimpleResult> notAuthorizedResult(Http.Context ctx) {
56+
public F.Promise<Result> notAuthorizedResult(Http.Context ctx) {
5757
Http.Request req = ctx.request();
58-
SimpleResult result;
58+
Result result;
5959

6060
if ( req.accepts("text/html")) {
6161
result = forbidden(notAuthorizedPage(ctx));

0 commit comments

Comments
 (0)