diff --git a/.travis.yml b/.travis.yml index 055f8e06..83caffe2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,8 @@ language: scala sudo: true scala: -- 2.11.8 +- 2.11.11 +- 2.12.2 jdk: - oraclejdk8 install: true diff --git a/README.md b/README.md index bfed00dd..3c98c1c1 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ This plugin uses concepts from [securesocial2][] and [Play20StartApp][] and prov Play Authenticate is cross-tested in Java 1.6, Java 1.7 (Up to `0.6.x`) and Java 1.8 (from `0.7.0`) +Since Play 2.6 it's cross-compiled for both Scala 2.11 and 2.12. + Works fine with Play version * `2.0.2` to `2.0.x` (last: `0.2.3-SNAPSHOT` - [2.0.x branch](https://github.com/joscha/play-authenticate/tree/2.0.x)) @@ -14,7 +16,8 @@ Works fine with Play version * `2.2.0` to `2.2.x` (last: `0.5.4` - [2.2.x branch](https://github.com/joscha/play-authenticate/tree/2.2.x)) * `2.3.0` to `2.3.x` (last: `0.6.9` - [2.3.x branch](https://github.com/joscha/play-authenticate/tree/2.3.x)) * `2.4.0` to `2.4.x` (last: `0.7.x` - [2.4.x branch](https://github.com/joscha/play-authenticate/tree/2.4.x)) -* `2.5.0` to `2.5.x` (last: `0.8.x` - [master branch](https://github.com/joscha/play-authenticate/tree/master)) +* `2.5.0` to `2.5.x` (last: `0.8.x` - [2.5.x branch](https://github.com/joscha/play-authenticate/tree/2.5.x)) +* `2.6.0` to `2.6.x` (last: `0.9.x` - [master branch](https://github.com/joscha/play-authenticate/tree/master)) Releases are on [mvnrepository](http://mvnrepository.com/artifact/com.feth) and snapshots can be found on [sonatype](https://oss.sonatype.org/content/repositories/snapshots/com/feth/). @@ -31,15 +34,15 @@ Play-Authenticate is available in [Maven Central](http://search.maven.org/#brows ```xml com.feth - play-authenticate_2.11 - 0.8.3 + play-authenticate + 0.9.0 ``` or ```scala val appDependencies = Seq( - "com.feth" % "play-authenticate_2.11" % "0.8.3" + "com.feth" %% "play-authenticate" % "0.9.0" ) ``` @@ -92,9 +95,20 @@ There is also a [sample application using Play!Authenticate with MongoDB](https: * Portuguese (as of 2014-07-29) * Chinese (as of 2017-04-18) +----------------------------------- + +### Supported by Auth0 + +If you want to easily add secure authentication to your Java projects, feel free to check out Auth0's Java SDK and free plan at [auth0.com/overview](https://auth0.com/overview?utm_source=GHsponsor&utm_medium=GHsponsor&utm_campaign=play-authenticate&utm_content=auth) + +------------------------------------ + ## Versions * **TRUNK** [not released in the repository, yet] * Fancy contributing something? :-) +* **0.9.0** [tbd] + * Upgrade to Play 2.6 (thanks @KadekM) + * ATTENTION: This is for Play 2.6 - if you have Play 2.5, use a `0.8.x` version. * **0.8.3** [2017-04-18] * Chinese translation (thanks @frederick036) * Fix for facebook refresh token diff --git a/code/app/com/feth/play/module/pa/PlayAuthenticate.java b/code/app/com/feth/play/module/pa/PlayAuthenticate.java index 095dfdb8..b6f8034a 100644 --- a/code/app/com/feth/play/module/pa/PlayAuthenticate.java +++ b/code/app/com/feth/play/module/pa/PlayAuthenticate.java @@ -4,9 +4,11 @@ import com.feth.play.module.pa.providers.AuthProvider; import com.feth.play.module.pa.service.UserService; import com.feth.play.module.pa.user.AuthUser; -import play.Configuration; +import com.typesafe.config.Config; import play.Logger; -import play.i18n.Messages; +import play.cache.SyncCacheApi; +import play.i18n.Lang; +import play.i18n.MessagesApi; import play.mvc.Call; import play.mvc.Controller; import play.mvc.Http; @@ -16,7 +18,10 @@ import javax.inject.Inject; import javax.inject.Singleton; +import java.util.Arrays; import java.util.Date; +import java.util.List; +import java.util.Locale; @Singleton public class PlayAuthenticate { @@ -28,17 +33,24 @@ public class PlayAuthenticate { private static final String SETTING_KEY_ACCOUNT_AUTO_LINK = "accountAutoLink"; private static final String SETTING_KEY_ACCOUNT_AUTO_MERGE = "accountAutoMerge"; - - - private Configuration config; + private List preferredLangs; + private Config config; @Inject - public PlayAuthenticate(final Configuration config, final Resolver resolver) { + public PlayAuthenticate(final Config config, final Resolver resolver, final MessagesApi messagesApi, final SyncCacheApi cacheApi) { this.config = config; this.resolver = resolver; + this.messagesApi = messagesApi; + this.cacheApi = cacheApi; + + Locale englishLocale = new Locale("en"); + Lang englishLang = new Lang(englishLocale); + preferredLangs = Arrays.asList(englishLang); } private Resolver resolver; + private final MessagesApi messagesApi; + private final SyncCacheApi cacheApi; public Resolver getResolver() { return resolver; @@ -53,7 +65,7 @@ public void setUserService(final UserService service) { public UserService getUserService() { if (userService == null) { throw new RuntimeException( - Messages.get("playauthenticate.core.exception.no_user_service")); + messagesApi.preferred(preferredLangs).at("playauthenticate.core.exception.no_user_service")); } return userService; } @@ -64,7 +76,7 @@ public UserService getUserService() { private static final String EXPIRES_KEY = "pa.u.exp"; private static final String SESSION_ID_KEY = "pa.s.id"; - public Configuration getConfiguration() { + public Config getConfiguration() { return config .getConfig(SETTING_KEY_PLAY_AUTHENTICATE); } @@ -211,14 +223,14 @@ private void storeUserInCache(final Session session, public void storeInCache(final Session session, final String key, final Object o) { - play.cache.Cache.set(getCacheKey(session, key), o); + cacheApi.set(getCacheKey(session, key), o); } public T removeFromCache(final Session session, final String key) { final T o = getFromCache(session, key); final String k = getCacheKey(session, key); - play.cache.Cache.remove(k); + cacheApi.remove(k); return o; } @@ -229,7 +241,7 @@ private String getCacheKey(final Session session, final String key) { @SuppressWarnings("unchecked") public T getFromCache(final Session session, final String key) { - return (T) play.cache.Cache.get(getCacheKey(session, key)); + return (T) cacheApi.get(getCacheKey(session, key)); } private AuthUser getUserFromCache(final Session session, @@ -356,7 +368,7 @@ private AuthUser signupUser(final AuthUser u, final Session session, final AuthP final Object id = getUserService().save(u); if (id == null) { throw new AuthException( - Messages.get("playauthenticate.core.exception.signupuser_failed")); + messagesApi.preferred(preferredLangs).at("playauthenticate.core.exception.signupuser_failed")); } provider.afterSave(u, id, session); return u; @@ -368,7 +380,7 @@ public Result handleAuthentication(final String provider, if (ap == null) { // Provider wasn't found and/or user was fooling with our stuff - // tell him off: - return Controller.notFound(Messages.get( + return Controller.notFound(messagesApi.preferred(preferredLangs).at( "playauthenticate.core.exception.provider_not_found", provider)); } @@ -452,7 +464,7 @@ public Result handleAuthentication(final String provider, final Call c = getResolver().askMerge(); if (c == null) { throw new RuntimeException( - Messages.get( + messagesApi.preferred(preferredLangs).at( "playauthenticate.core.exception.merge.controller_undefined", SETTING_KEY_ACCOUNT_AUTO_MERGE)); } @@ -484,7 +496,7 @@ public Result handleAuthentication(final String provider, final Call c = getResolver().askLink(); if (c == null) { throw new RuntimeException( - Messages.get( + messagesApi.preferred(preferredLangs).at( "playauthenticate.core.exception.link.controller_undefined", SETTING_KEY_ACCOUNT_AUTO_LINK)); } @@ -496,8 +508,8 @@ public Result handleAuthentication(final String provider, return loginAndRedirect(context, loginUser); } else { - return Controller.internalServerError(Messages - .get("playauthenticate.core.exception.general")); + return Controller.internalServerError(messagesApi + .preferred(preferredLangs).at("playauthenticate.core.exception.general")); } } catch (final AuthException e) { final Call c = getResolver().onException(e); diff --git a/code/app/com/feth/play/module/pa/providers/AuthProvider.java b/code/app/com/feth/play/module/pa/providers/AuthProvider.java index 0209429d..b9db2271 100644 --- a/code/app/com/feth/play/module/pa/providers/AuthProvider.java +++ b/code/app/com/feth/play/module/pa/providers/AuthProvider.java @@ -4,7 +4,7 @@ import com.feth.play.module.pa.exceptions.AuthException; import com.feth.play.module.pa.user.AuthUser; import com.feth.play.module.pa.user.SessionAuthUser; -import play.Configuration; +import com.typesafe.config.Config; import play.Logger; import play.inject.ApplicationLifecycle; import play.mvc.Http.Context; @@ -67,7 +67,7 @@ protected void onStart() { final List neededSettings = neededSettingKeys(); if (neededSettings != null) { - final Configuration c = getConfiguration(); + final Config c = getConfiguration(); if (c == null) { throw new RuntimeException("No settings for provider '" + getKey() + "' available at all!"); @@ -100,7 +100,7 @@ protected String getAbsoluteUrl(final Request request) { public abstract String getKey(); - protected Configuration getConfiguration() { + protected Config getConfiguration() { return this.auth.getConfiguration().getConfig(getKey()); } diff --git a/code/app/com/feth/play/module/pa/providers/ext/ExternalAuthProvider.java b/code/app/com/feth/play/module/pa/providers/ext/ExternalAuthProvider.java index 8c977407..a030459b 100644 --- a/code/app/com/feth/play/module/pa/providers/ext/ExternalAuthProvider.java +++ b/code/app/com/feth/play/module/pa/providers/ext/ExternalAuthProvider.java @@ -37,7 +37,7 @@ protected List neededSettingKeys() { } protected long getTimeout() { - return getConfiguration().getLong(SettingKeys.TIMEOUT, PlayAuthenticate.TIMEOUT); + return getConfiguration().getLong(SettingKeys.TIMEOUT); } private boolean useSecureRedirectUri() { diff --git a/code/app/com/feth/play/module/pa/providers/oauth1/OAuth1AuthProvider.java b/code/app/com/feth/play/module/pa/providers/oauth1/OAuth1AuthProvider.java index 14e6cae2..dd80071e 100644 --- a/code/app/com/feth/play/module/pa/providers/oauth1/OAuth1AuthProvider.java +++ b/code/app/com/feth/play/module/pa/providers/oauth1/OAuth1AuthProvider.java @@ -7,7 +7,7 @@ import com.feth.play.module.pa.exceptions.AuthException; import com.feth.play.module.pa.providers.ext.ExternalAuthProvider; import com.feth.play.module.pa.user.AuthUserIdentity; -import play.Configuration; +import com.typesafe.config.Config; import play.Logger; import play.inject.ApplicationLifecycle; import play.libs.oauth.OAuth; @@ -75,6 +75,10 @@ public static abstract class Constants { public static class SerializableRequestToken extends RequestToken implements Serializable { private static final long serialVersionUID = 1L; + public SerializableRequestToken() { + super(null, null); + } + public SerializableRequestToken(RequestToken source) { super(source.token, source.secret); } @@ -103,7 +107,7 @@ public Object authenticate(final Context context, final Object payload) Logger.debug("Returned with URL: '" + uri + "'"); } - final Configuration c = getConfiguration(); + final Config c = getConfiguration(); final ConsumerKey key = new ConsumerKey( c.getString(SettingKeys.CONSUMER_KEY), @@ -170,7 +174,7 @@ protected JsonNode signedOauthGet(final String url, final OAuthCalculator calcul protected OAuthCalculator getOAuthCalculator(final OAuth1AuthInfo info) { final RequestToken token = new RequestToken(info.getAccessToken(), info.getAccessTokenSecret()); - final Configuration c = getConfiguration(); + final Config c = getConfiguration(); final ConsumerKey cK = new ConsumerKey( c.getString(SettingKeys.CONSUMER_KEY), c.getString(SettingKeys.CONSUMER_SECRET)); diff --git a/code/app/com/feth/play/module/pa/providers/oauth1/linkedin/LinkedinAuthUser.java b/code/app/com/feth/play/module/pa/providers/oauth1/linkedin/LinkedinAuthUser.java index 490d0909..07e2bf78 100644 --- a/code/app/com/feth/play/module/pa/providers/oauth1/linkedin/LinkedinAuthUser.java +++ b/code/app/com/feth/play/module/pa/providers/oauth1/linkedin/LinkedinAuthUser.java @@ -1,18 +1,14 @@ package com.feth.play.module.pa.providers.oauth1.linkedin; -import java.util.*; - -import org.apache.commons.lang3.StringUtils; import com.fasterxml.jackson.databind.JsonNode; - import com.feth.play.module.pa.providers.oauth1.BasicOAuth1AuthUser; import com.feth.play.module.pa.providers.oauth1.OAuth1AuthInfo; -import com.feth.play.module.pa.user.BasicIdentity; -import com.feth.play.module.pa.user.EducationsIdentity; -import com.feth.play.module.pa.user.EmploymentsIdentity; -import com.feth.play.module.pa.user.FirstLastNameIdentity; -import com.feth.play.module.pa.user.PicturedIdentity; -import com.feth.play.module.pa.user.ProfiledIdentity; +import com.feth.play.module.pa.user.*; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; public class LinkedinAuthUser extends BasicOAuth1AuthUser implements BasicIdentity, FirstLastNameIdentity, PicturedIdentity, @@ -104,7 +100,7 @@ public LinkedinAuthUser(final JsonNode nodeInfo, final String email, } } - private static EducationInfo makeEducation(final JsonNode node) { + private static EducationsIdentity.EducationInfo makeEducation(final JsonNode node) { String id = null, schoolName = null, degree = null; int startDateYear = 0, endDateYear = 0; if (node.has(Constants.Education.ID)) { @@ -129,7 +125,7 @@ private static EducationInfo makeEducation(final JsonNode node) { endDateYear); } - private static EmploymentInfo makeEmployment(final JsonNode node) { + private static EmploymentsIdentity.EmploymentInfo makeEmployment(final JsonNode node) { String id = null, title = null, summary = null, companyName = null; int startDateMonth = 0, startDateYear = 0, endDateMonth = 0, endDateYear = 0; boolean isCurrent = false; diff --git a/code/app/com/feth/play/module/pa/providers/oauth2/OAuth2AuthProvider.java b/code/app/com/feth/play/module/pa/providers/oauth2/OAuth2AuthProvider.java index 5db0a889..77cf5dd4 100644 --- a/code/app/com/feth/play/module/pa/providers/oauth2/OAuth2AuthProvider.java +++ b/code/app/com/feth/play/module/pa/providers/oauth2/OAuth2AuthProvider.java @@ -5,12 +5,12 @@ import com.feth.play.module.pa.providers.ext.ExternalAuthProvider; import com.feth.play.module.pa.user.AuthUser; import com.feth.play.module.pa.user.AuthUserIdentity; +import com.typesafe.config.Config; import org.apache.http.NameValuePair; import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.message.BasicNameValuePair; -import play.Configuration; import play.Logger; -import play.i18n.Messages; +import play.i18n.MessagesApi; import play.inject.ApplicationLifecycle; import play.libs.ws.WSClient; import play.libs.ws.WSRequest; @@ -42,10 +42,12 @@ public QueryParam(String param, String value) { protected static final String CONTENT_TYPE = "Content-Type"; protected final WSClient wsClient; + private final MessagesApi messagesApi; - public OAuth2AuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient) { + public OAuth2AuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient, final MessagesApi messagesApi) { super(auth, lifecycle); this.wsClient = wsClient; + this.messagesApi = messagesApi; } @Override @@ -94,7 +96,7 @@ protected WSResponse fetchAuthResponse(String url, QueryParam...params) throws A final List queryParams = Arrays.asList(params); final WSRequest request = wsClient.url(url); for(QueryParam param : queryParams) { - request.setQueryParameter(param.param, param.value); + request.addQueryParameter(param.param, param.value); } try { @@ -106,7 +108,7 @@ protected WSResponse fetchAuthResponse(String url, QueryParam...params) throws A } } - protected String getAccessTokenParams(final Configuration c, + protected String getAccessTokenParams(final Config c, final String code, Request request) throws ResolverMissingException { final List params = getParams(request, c); params.add(new BasicNameValuePair(Constants.CLIENT_SECRET, c @@ -124,13 +126,13 @@ protected Map getHeaders() { protected I getAccessToken(final String code, final Request request) throws AccessTokenException, ResolverMissingException { - final Configuration c = getConfiguration(); + final Config c = getConfiguration(); final String params = getAccessTokenParams(c, code, request); final String url = c.getString(SettingKeys.ACCESS_TOKEN_URL); final WSRequest wrh = wsClient.url(url); - wrh.setHeader(CONTENT_TYPE, "application/x-www-form-urlencoded"); + wrh.addHeader(CONTENT_TYPE, "application/x-www-form-urlencoded"); for(final Map.Entry header : getHeaders().entrySet()) { - wrh.setHeader(header.getKey(), header.getValue()); + wrh.addHeader(header.getKey(), header.getValue()); } try { @@ -146,12 +148,12 @@ protected abstract I buildInfo(final WSResponse r) protected String getAuthUrl(final Request request, final String state) throws AuthException { - final Configuration c = getConfiguration(); + final Config c = getConfiguration(); final List params = getAuthParams(c, request, state); return generateURI(c.getString(SettingKeys.AUTHORIZATION_URL), params); } - protected List getAuthParams(final Configuration c, + protected List getAuthParams(final Config c, final Request request, final String state) throws AuthException { final List params = getParams(request, c); if (c.getString(SettingKeys.SCOPE) != null) { @@ -179,7 +181,7 @@ protected List getAuthParams(final Configuration c, } protected List getParams(final Request request, - final Configuration c) throws ResolverMissingException { + final Config c) throws ResolverMissingException { final List params = new ArrayList(); params.add(new BasicNameValuePair(Constants.CLIENT_ID, c .getString(SettingKeys.CLIENT_ID))); @@ -226,7 +228,7 @@ public Object authenticate(final Context context, final Object payload) final String callbackState = request.getQueryString(Constants.STATE); if(!storedState.equals(UUID.fromString(callbackState))) { // the return callback may have been forged - throw new AuthException(Messages.get("playauthenticate.core.exception.oauth2.state_param_forged")); + throw new AuthException(messagesApi.preferred(request).at("playauthenticate.core.exception.oauth2.state_param_forged")); } final String code = request.getQueryString(Constants.CODE); final I info = getAccessToken(code, request); diff --git a/code/app/com/feth/play/module/pa/providers/oauth2/eventbrite/EventBriteAuthProvider.java b/code/app/com/feth/play/module/pa/providers/oauth2/eventbrite/EventBriteAuthProvider.java index 0a1efc29..5a431449 100644 --- a/code/app/com/feth/play/module/pa/providers/oauth2/eventbrite/EventBriteAuthProvider.java +++ b/code/app/com/feth/play/module/pa/providers/oauth2/eventbrite/EventBriteAuthProvider.java @@ -6,6 +6,7 @@ import com.feth.play.module.pa.exceptions.AuthException; import com.feth.play.module.pa.providers.oauth2.OAuth2AuthProvider; import play.Logger; +import play.i18n.MessagesApi; import play.inject.ApplicationLifecycle; import play.libs.ws.WSClient; import play.libs.ws.WSResponse; @@ -27,8 +28,8 @@ public class EventBriteAuthProvider extends private static final String TOKEN = "token"; @Inject - public EventBriteAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient) { - super(auth, lifecycle, wsClient); + public EventBriteAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient, final MessagesApi messagesApi) { + super(auth, lifecycle, wsClient, messagesApi); } diff --git a/code/app/com/feth/play/module/pa/providers/oauth2/facebook/FacebookAuthProvider.java b/code/app/com/feth/play/module/pa/providers/oauth2/facebook/FacebookAuthProvider.java index 3d0d80fc..1aff1b27 100644 --- a/code/app/com/feth/play/module/pa/providers/oauth2/facebook/FacebookAuthProvider.java +++ b/code/app/com/feth/play/module/pa/providers/oauth2/facebook/FacebookAuthProvider.java @@ -5,11 +5,11 @@ import com.feth.play.module.pa.exceptions.AccessTokenException; import com.feth.play.module.pa.exceptions.AuthException; import com.feth.play.module.pa.providers.oauth2.OAuth2AuthProvider; +import com.typesafe.config.Config; import org.apache.http.NameValuePair; -import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.message.BasicNameValuePair; -import play.Configuration; import play.Logger; +import play.i18n.MessagesApi; import play.inject.ApplicationLifecycle; import play.libs.ws.WSClient; import play.libs.ws.WSResponse; @@ -17,10 +17,7 @@ import javax.inject.Inject; import javax.inject.Singleton; -import java.net.URI; -import java.util.HashMap; import java.util.List; -import java.util.Map; @Singleton public class FacebookAuthProvider extends @@ -36,8 +33,8 @@ public class FacebookAuthProvider extends private static final String USER_INFO_FIELDS_SETTING_KEY = "userInfoFields"; @Inject - public FacebookAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient) { - super(auth, lifecycle, wsClient); + public FacebookAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient, final MessagesApi messagesApi) { + super(auth, lifecycle, wsClient, messagesApi); } @@ -46,7 +43,7 @@ public static abstract class SettingKeys extends public static final String DISPLAY = "display"; } - public static abstract class FacebookConstants extends Constants { + public static abstract class FacebookConstants extends OAuth2AuthProvider.Constants { public static final String DISPLAY = "display"; } @@ -96,7 +93,7 @@ protected FacebookAuthInfo buildInfo(final WSResponse r) throws AccessTokenExcep } @Override - protected List getAuthParams(final Configuration c, + protected List getAuthParams(final Config c, final Request request, final String state) throws AuthException { final List params = super.getAuthParams(c, request, state); diff --git a/code/app/com/feth/play/module/pa/providers/oauth2/foursquare/FoursquareAuthProvider.java b/code/app/com/feth/play/module/pa/providers/oauth2/foursquare/FoursquareAuthProvider.java index e882373f..9cf9bdef 100644 --- a/code/app/com/feth/play/module/pa/providers/oauth2/foursquare/FoursquareAuthProvider.java +++ b/code/app/com/feth/play/module/pa/providers/oauth2/foursquare/FoursquareAuthProvider.java @@ -7,6 +7,7 @@ import com.feth.play.module.pa.providers.oauth2.OAuth2AuthProvider; import com.feth.play.module.pa.user.AuthUserIdentity; import play.Logger; +import play.i18n.MessagesApi; import play.inject.ApplicationLifecycle; import play.libs.ws.WSClient; import play.libs.ws.WSResponse; @@ -25,8 +26,8 @@ public class FoursquareAuthProvider extends private static final String VERSION = "20120617"; @Inject - public FoursquareAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient) { - super(auth, lifecycle, wsClient); + public FoursquareAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient, final MessagesApi messagesApi) { + super(auth, lifecycle, wsClient, messagesApi); } @Override diff --git a/code/app/com/feth/play/module/pa/providers/oauth2/github/GithubAuthProvider.java b/code/app/com/feth/play/module/pa/providers/oauth2/github/GithubAuthProvider.java index 4fdadf51..1ca4a551 100644 --- a/code/app/com/feth/play/module/pa/providers/oauth2/github/GithubAuthProvider.java +++ b/code/app/com/feth/play/module/pa/providers/oauth2/github/GithubAuthProvider.java @@ -5,6 +5,7 @@ import com.feth.play.module.pa.exceptions.AccessTokenException; import com.feth.play.module.pa.exceptions.AuthException; import com.feth.play.module.pa.providers.oauth2.OAuth2AuthProvider; +import play.i18n.MessagesApi; import play.inject.ApplicationLifecycle; import play.libs.ws.WSClient; import play.libs.ws.WSResponse; @@ -23,8 +24,8 @@ public class GithubAuthProvider extends private static final String USER_INFO_URL_SETTING_KEY = "userInfoUrl"; @Inject - public GithubAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient) { - super(auth, lifecycle, wsClient); + public GithubAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient, final MessagesApi messagesApi) { + super(auth, lifecycle, wsClient, messagesApi); } @Override diff --git a/code/app/com/feth/play/module/pa/providers/oauth2/google/GoogleAuthProvider.java b/code/app/com/feth/play/module/pa/providers/oauth2/google/GoogleAuthProvider.java index 9958c783..7b273284 100644 --- a/code/app/com/feth/play/module/pa/providers/oauth2/google/GoogleAuthProvider.java +++ b/code/app/com/feth/play/module/pa/providers/oauth2/google/GoogleAuthProvider.java @@ -6,6 +6,7 @@ import com.feth.play.module.pa.exceptions.AuthException; import com.feth.play.module.pa.providers.oauth2.OAuth2AuthProvider; import play.Logger; +import play.i18n.MessagesApi; import play.inject.ApplicationLifecycle; import play.libs.ws.WSClient; import play.libs.ws.WSResponse; @@ -22,8 +23,8 @@ public class GoogleAuthProvider extends private static final String USER_INFO_URL_SETTING_KEY = "userInfoUrl"; @Inject - public GoogleAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient) { - super(auth, lifecycle, wsClient); + public GoogleAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient, final MessagesApi messagesApi) { + super(auth, lifecycle, wsClient, messagesApi); } @Override diff --git a/code/app/com/feth/play/module/pa/providers/oauth2/pocket/PocketAuthInfo.java b/code/app/com/feth/play/module/pa/providers/oauth2/pocket/PocketAuthInfo.java index e16f8f10..153ebbee 100644 --- a/code/app/com/feth/play/module/pa/providers/oauth2/pocket/PocketAuthInfo.java +++ b/code/app/com/feth/play/module/pa/providers/oauth2/pocket/PocketAuthInfo.java @@ -1,10 +1,10 @@ package com.feth.play.module.pa.providers.oauth2.pocket; -import java.util.Map; - import com.feth.play.module.pa.providers.oauth2.OAuth2AuthInfo; import com.feth.play.module.pa.providers.oauth2.OAuth2AuthProvider.Constants; +import java.util.Map; + public class PocketAuthInfo extends OAuth2AuthInfo { private static final long serialVersionUID = 1L; @@ -13,8 +13,7 @@ public class PocketAuthInfo extends OAuth2AuthInfo { public static final String USERNAME = "username"; public PocketAuthInfo(final Map map) { - super(map.containsKey(Constants.ACCESS_TOKEN) ? map - .get(Constants.ACCESS_TOKEN) : null); + super(map.getOrDefault(Constants.ACCESS_TOKEN, null)); this.userName = map.get(USERNAME); } diff --git a/code/app/com/feth/play/module/pa/providers/oauth2/pocket/PocketAuthProvider.java b/code/app/com/feth/play/module/pa/providers/oauth2/pocket/PocketAuthProvider.java index 9f52916b..5f9b24b0 100644 --- a/code/app/com/feth/play/module/pa/providers/oauth2/pocket/PocketAuthProvider.java +++ b/code/app/com/feth/play/module/pa/providers/oauth2/pocket/PocketAuthProvider.java @@ -8,10 +8,11 @@ import com.feth.play.module.pa.exceptions.ResolverMissingException; import com.feth.play.module.pa.providers.oauth2.OAuth2AuthProvider; import com.feth.play.module.pa.user.AuthUserIdentity; +import com.typesafe.config.Config; import org.apache.http.NameValuePair; import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.message.BasicNameValuePair; -import play.Configuration; +import play.i18n.MessagesApi; import play.inject.ApplicationLifecycle; import play.libs.ws.WSClient; import play.libs.ws.WSResponse; @@ -32,8 +33,8 @@ public class PocketAuthProvider extends public static final String PROVIDER_KEY = "pocket"; @Inject - public PocketAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient) { - super(auth, lifecycle, wsClient); + public PocketAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient, final MessagesApi messagesApi) { + super(auth, lifecycle, wsClient, messagesApi); } public static abstract class SettingKeys extends @@ -42,7 +43,7 @@ public static abstract class SettingKeys extends public static final String CONSUMER_KEY = "consumerKey"; } - public static abstract class PocketConstants extends Constants { + public static abstract class PocketConstants extends OAuth2AuthProvider.Constants { public static final String CONSUMER_KEY = "consumer_key"; public static final String REQUEST_TOKEN = "request_token"; } @@ -91,7 +92,7 @@ protected AuthUserIdentity transform(final PocketAuthInfo info, } @Override - protected String getAccessTokenParams(final Configuration c, + protected String getAccessTokenParams(final Config c, final String code, final Request request) { final List params = new ArrayList(); params.add(new BasicNameValuePair(PocketConstants.CONSUMER_KEY, c @@ -102,13 +103,13 @@ protected String getAccessTokenParams(final Configuration c, } private String getRequestToken(final Request request) throws AuthException { - final Configuration c = getConfiguration(); + final Config c = getConfiguration(); final List params = getRequestTokenParams(request, c); try { final WSResponse r = wsClient.url(c.getString(SettingKeys.REQUEST_TOKEN_URL)) - .setHeader("Content-Type", "application/json") - .setHeader("X-Accept", "application/json") + .addHeader("Content-Type", "application/json") + .addHeader("X-Accept", "application/json") .post(encodeParamsAsJson(params)).toCompletableFuture().get(getTimeout(), TimeUnit.MILLISECONDS); if (r.getStatus() >= 400) { @@ -122,7 +123,7 @@ private String getRequestToken(final Request request) throws AuthException { } private List getRequestTokenParams(final Request request, - final Configuration c) throws ResolverMissingException { + final Config c) throws ResolverMissingException { final List params = new ArrayList(); params.add(new BasicNameValuePair(PocketConstants.CONSUMER_KEY, c .getString(SettingKeys.CONSUMER_KEY))); @@ -132,7 +133,7 @@ private List getRequestTokenParams(final Request request, } @Override - protected List getAuthParams(final Configuration c, + protected List getAuthParams(final Config c, final Request request, final String state) throws AuthException { final List params = new ArrayList(); params.add(new BasicNameValuePair(PocketConstants.CONSUMER_KEY, c diff --git a/code/app/com/feth/play/module/pa/providers/oauth2/untappd/UntappdAuthProvider.java b/code/app/com/feth/play/module/pa/providers/oauth2/untappd/UntappdAuthProvider.java index 8711326a..fcf41d14 100755 --- a/code/app/com/feth/play/module/pa/providers/oauth2/untappd/UntappdAuthProvider.java +++ b/code/app/com/feth/play/module/pa/providers/oauth2/untappd/UntappdAuthProvider.java @@ -7,10 +7,11 @@ import com.feth.play.module.pa.exceptions.ResolverMissingException; import com.feth.play.module.pa.providers.oauth2.OAuth2AuthProvider; import com.google.inject.Inject; +import com.typesafe.config.Config; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; -import play.Configuration; import play.Logger; +import play.i18n.MessagesApi; import play.inject.ApplicationLifecycle; import play.libs.ws.WSClient; import play.libs.ws.WSResponse; @@ -49,8 +50,8 @@ public class UntappdAuthProvider extends // "http://localhost:9000/authenticate/untappd"; @Inject - public UntappdAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient) { - super(auth, lifecycle, wsClient); + public UntappdAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient, final MessagesApi messagesApi) { + super(auth, lifecycle, wsClient, messagesApi); } @Override @@ -92,20 +93,20 @@ protected String getRedirectUriKey() { protected UntappdAuthInfo getAccessToken(final String code, final Request request) throws AccessTokenException, ResolverMissingException { - final Configuration c = getConfiguration(); + final Config c = getConfiguration(); final String url = c.getString(SettingKeys.ACCESS_TOKEN_URL); try { final WSResponse r = wsClient .url(url) - .setQueryParameter(Constants.CLIENT_ID, + .addQueryParameter(Constants.CLIENT_ID, c.getString(SettingKeys.CLIENT_ID)) - .setQueryParameter(Constants.CLIENT_SECRET, + .addQueryParameter(Constants.CLIENT_SECRET, c.getString(SettingKeys.CLIENT_SECRET)) - .setQueryParameter(Constants.RESPONSE_TYPE, Constants.CODE) - .setQueryParameter(Constants.CODE, code) - .setQueryParameter(getRedirectUriKey(), getRedirectUrl(request)) + .addQueryParameter(Constants.RESPONSE_TYPE, Constants.CODE) + .addQueryParameter(Constants.CODE, code) + .addQueryParameter(getRedirectUriKey(), getRedirectUrl(request)) // we use GET here .get().toCompletableFuture().get(getTimeout(), TimeUnit.MILLISECONDS); @@ -117,7 +118,7 @@ protected UntappdAuthInfo getAccessToken(final String code, @Override protected List getParams(final Request request, - final Configuration c) throws ResolverMissingException { + final Config c) throws ResolverMissingException { final List params = super.getParams(request, c); params.add(new BasicNameValuePair(Constants.CLIENT_SECRET, c diff --git a/code/app/com/feth/play/module/pa/providers/oauth2/vk/VkAuthProvider.java b/code/app/com/feth/play/module/pa/providers/oauth2/vk/VkAuthProvider.java index 9a41995c..5b716a5e 100644 --- a/code/app/com/feth/play/module/pa/providers/oauth2/vk/VkAuthProvider.java +++ b/code/app/com/feth/play/module/pa/providers/oauth2/vk/VkAuthProvider.java @@ -6,6 +6,7 @@ import com.feth.play.module.pa.exceptions.AuthException; import com.feth.play.module.pa.providers.oauth2.OAuth2AuthProvider; import play.Logger; +import play.i18n.MessagesApi; import play.inject.ApplicationLifecycle; import play.libs.ws.WSClient; import play.libs.ws.WSResponse; @@ -30,8 +31,8 @@ public class VkAuthProvider extends OAuth2AuthProvider { private static final String BODY_RESPONSE_KEY = "response"; @Inject - public VkAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient) { - super(auth, lifecycle, wsClient); + public VkAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final WSClient wsClient, final MessagesApi messagesApi) { + super(auth, lifecycle, wsClient, messagesApi); } @Override diff --git a/code/app/com/feth/play/module/pa/providers/openid/OpenIdAuthProvider.java b/code/app/com/feth/play/module/pa/providers/openid/OpenIdAuthProvider.java index f1525bf9..73e697b2 100644 --- a/code/app/com/feth/play/module/pa/providers/openid/OpenIdAuthProvider.java +++ b/code/app/com/feth/play/module/pa/providers/openid/OpenIdAuthProvider.java @@ -5,7 +5,7 @@ import com.feth.play.module.pa.providers.ext.ExternalAuthProvider; import com.feth.play.module.pa.providers.openid.exceptions.NoOpenIdAuthException; import com.feth.play.module.pa.providers.openid.exceptions.OpenIdConnectException; -import play.Configuration; +import com.typesafe.config.Config; import play.Logger; import play.api.libs.openid.OpenIDError; import play.inject.ApplicationLifecycle; @@ -20,6 +20,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.Future; +import java.util.stream.Collectors; import static java.util.concurrent.TimeUnit.MILLISECONDS; @@ -101,10 +102,10 @@ public Object authenticate(final Context context, final Object payload) } private Map getAttributes(final String subKey) { - final Configuration attributes = getConfiguration().getConfig( + final Config attributes = getConfiguration().getConfig( SettingKeys.ATTRIBUTES + "." + subKey); if (attributes != null) { - final Set keys = attributes.keys(); + final Set keys = attributes.entrySet().stream().map(x -> x.getKey()).collect(Collectors.toSet()); final Map ret = new HashMap( keys.size()); for (final String key : keys) { diff --git a/code/app/com/feth/play/module/pa/providers/password/UsernamePasswordAuthProvider.java b/code/app/com/feth/play/module/pa/providers/password/UsernamePasswordAuthProvider.java index b374b43d..e02ee14f 100644 --- a/code/app/com/feth/play/module/pa/providers/password/UsernamePasswordAuthProvider.java +++ b/code/app/com/feth/play/module/pa/providers/password/UsernamePasswordAuthProvider.java @@ -13,7 +13,6 @@ import com.feth.play.module.pa.user.AuthUser; import com.feth.play.module.pa.user.NameIdentity; -import play.data.Form; import play.inject.ApplicationLifecycle; import play.mvc.Call; import play.mvc.Http; diff --git a/code/app/com/feth/play/module/pa/providers/wwwauth/WWWAuthenticateProvider.java b/code/app/com/feth/play/module/pa/providers/wwwauth/WWWAuthenticateProvider.java index a5e074d1..49cbc38b 100644 --- a/code/app/com/feth/play/module/pa/providers/wwwauth/WWWAuthenticateProvider.java +++ b/code/app/com/feth/play/module/pa/providers/wwwauth/WWWAuthenticateProvider.java @@ -99,7 +99,7 @@ private Result deny(Context context) { @Override public Object authenticate(Context context, Object payload) throws AuthException { - String auth = context.request().getHeader("Authorization"); + String auth = context.request().header("Authorization").get(); if (auth == null) { return deny(context); diff --git a/code/app/com/feth/play/module/pa/user/EducationsIdentity.java b/code/app/com/feth/play/module/pa/user/EducationsIdentity.java index f5bd0bc1..1a87e382 100644 --- a/code/app/com/feth/play/module/pa/user/EducationsIdentity.java +++ b/code/app/com/feth/play/module/pa/user/EducationsIdentity.java @@ -5,7 +5,7 @@ public interface EducationsIdentity { - public static class EducationInfo implements Serializable { + class EducationInfo implements Serializable { protected String id; protected String schoolName; protected String degree; diff --git a/code/build.sbt b/code/build.sbt index a5a224fb..a172fafa 100644 --- a/code/build.sbt +++ b/code/build.sbt @@ -4,15 +4,18 @@ name := "play-authenticate" javacOptions ++= Seq("-Werror") -scalaVersion := "2.11.8" +scalaVersion := "2.12.2" +crossScalaVersions := Seq("2.11.11", "2.12.2") libraryDependencies ++= Seq( "org.apache.httpcomponents" % "httpclient" % "4.5", - "com.feth" %% "play-easymail" % "0.8.1", + "com.feth" %% "play-easymail" % "0.9.3", "org.mindrot" % "jbcrypt" % "0.3m", "org.apache.commons" % "commons-lang3" % "3.4", - cache, - javaWs + cacheApi, + javaWs, + openId, + guice ) // add resolver for easymail snapshots diff --git a/code/project/plugins.sbt b/code/project/plugins.sbt index 78d459da..760f3e67 100644 --- a/code/project/plugins.sbt +++ b/code/project/plugins.sbt @@ -5,10 +5,10 @@ logLevel := Level.Warn resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/" // Use the Play sbt plugin for Play projects -addSbtPlugin("com.typesafe.play" % "sbt-plugin" % Option(System.getProperty("play.version")).getOrElse("2.5.14")) +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % Option(System.getProperty("play.version")).getOrElse("2.6.12")) -addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0") +addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.0") -addSbtPlugin("com.github.gseitz" % "sbt-release" % "1.0.0") +addSbtPlugin("com.github.gseitz" % "sbt-release" % "1.0.7") addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0") diff --git a/code/release.sh b/code/release.sh index 73de169f..235e8b37 100755 --- a/code/release.sh +++ b/code/release.sh @@ -1,2 +1,2 @@ #!/bin/sh -sbt --info release +sbt --info +release diff --git a/code/version.sbt b/code/version.sbt index b3a3fa9e..338b0ba2 100644 --- a/code/version.sbt +++ b/code/version.sbt @@ -1 +1 @@ -version in ThisBuild := "0.8.4-SNAPSHOT" \ No newline at end of file +version in ThisBuild := "0.9.0-SNAPSHOT" diff --git a/samples/java/Getting Started.md b/samples/java/Getting Started.md index dae3bd46..b434627b 100644 --- a/samples/java/Getting Started.md +++ b/samples/java/Getting Started.md @@ -1,7 +1,7 @@ -#Getting Started +# Getting Started -##Importing the Plugin +## Importing the Plugin --- Add Play-Authenticate to your app dependencies. This is done by modifying the `project/Build.scala` file. @@ -34,7 +34,7 @@ Add `"com.feth" %% "play-authenticate" % "0.8.0-SNAPSHOT"` (`0.8.0` might } -##Configuration File +## Configuration File --- Create a new file `play-authenticate/mine.conf` in your conf folder. Include this file in your `application.conf` by adding the following line to it: @@ -100,7 +100,7 @@ For a real application you can use the following template ([source](https://gith } -##Creating the necessary views +## Creating the necessary views --- You have to integrate Play-Authenticate into your views by yourself. Play-Authenticate provides some template helpers to do this. @@ -151,7 +151,7 @@ This second example displays some account information: } } -##Routes +## Routes --- Add the following routes to your `conf/routes` file: @@ -171,7 +171,7 @@ Below you can see an example implementation of this method (this.auth is instanc } -##Configure the Resolver +## Configure the Resolver --- Play-Authenticate needs some pages provided by your application. You configure these pages by providing @@ -249,7 +249,7 @@ TODO explain Resolver interface and its methods Of course you have to create the pages to which the resolver refers by yourself. -##User Service +## User Service --- We yet have to tell Play-Authenticate how to store users in a database. This is done by creating a sub class @@ -331,7 +331,7 @@ Here is an example implementation of the UserServicePlugin: } -##Adding Authentication Providers +## Adding Authentication Providers --- ### Google Authentication Provider @@ -378,7 +378,7 @@ own keys. The keys above are not valid. TODO short description for other providers. -##Adding Access Control +## Adding Access Control --- TODO diff --git a/samples/java/play-authenticate-simple-oauth/build.sbt b/samples/java/play-authenticate-simple-oauth/build.sbt index 01b91098..98cea280 100644 --- a/samples/java/play-authenticate-simple-oauth/build.sbt +++ b/samples/java/play-authenticate-simple-oauth/build.sbt @@ -2,14 +2,16 @@ organization := "com.feth" name := "play-authenticate-simple-oauth" -scalaVersion := "2.11.8" +scalaVersion := "2.12.2" version := "1.0-SNAPSHOT" val appDependencies = Seq( // Comment the next line for local development of the Play Authentication core: - "com.feth" %% "play-authenticate" % "0.8.3", - cache, + // Use the latest release version when copying this code, e.g. "0.9.0" + "com.feth" %% "play-authenticate" % "0.9.0-SNAPSHOT", + cacheApi, + ehcache, javaWs ) diff --git a/samples/java/play-authenticate-simple-oauth/conf/application.conf b/samples/java/play-authenticate-simple-oauth/conf/application.conf index 0013bb35..dbaf2fab 100644 --- a/samples/java/play-authenticate-simple-oauth/conf/application.conf +++ b/samples/java/play-authenticate-simple-oauth/conf/application.conf @@ -5,7 +5,8 @@ # ~~~~~ # The secret key is used to secure cryptographics functions. # If you deploy your application to several instances be sure to use the same key! -play.crypto.secret="y]Z5;`T0=F3mAda1lW[r5jFWCw9stMiBnShjPU;59l7cwA9LX1abrprOgTP/VCDQ" +play.http.secret.key="changeme" +play.http.secret.key=${?APPLICATION_SECRET} # The application languages # ~~~~~ diff --git a/samples/java/play-authenticate-simple-oauth/project/plugins.sbt b/samples/java/play-authenticate-simple-oauth/project/plugins.sbt index 1ecfe74e..e576d043 100644 --- a/samples/java/play-authenticate-simple-oauth/project/plugins.sbt +++ b/samples/java/play-authenticate-simple-oauth/project/plugins.sbt @@ -5,14 +5,14 @@ logLevel := Level.Warn resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/" // Use the Play sbt plugin for Play projects -addSbtPlugin("com.typesafe.play" % "sbt-plugin" % Option(System.getProperty("play.version")).getOrElse("2.5.14")) +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % Option(System.getProperty("play.version")).getOrElse("2.6.12")) addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.0.0") addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0") // Uncomment the next line for local development of the Play Authentication core: -//addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0") +//addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.0") // Uncomment the next line for local development of the Play Authentication core: -//addSbtPlugin("com.github.gseitz" % "sbt-release" % "0.8.5") +//addSbtPlugin("com.github.gseitz" % "sbt-release" % "1.0.7") diff --git a/samples/java/play-authenticate-usage/app/controllers/Account.java b/samples/java/play-authenticate-usage/app/controllers/Account.java index 56aacc43..c27119a5 100644 --- a/samples/java/play-authenticate-usage/app/controllers/Account.java +++ b/samples/java/play-authenticate-usage/app/controllers/Account.java @@ -11,7 +11,6 @@ import play.data.format.Formats.NonEmpty; import play.data.validation.Constraints.MinLength; import play.data.validation.Constraints.Required; -import play.i18n.Messages; import play.i18n.MessagesApi; import play.mvc.Controller; import play.mvc.Result; @@ -67,8 +66,7 @@ public void setRepeatPassword(String repeatPassword) { public String validate() { if (password == null || !password.equals(repeatPassword)) { - return Messages - .get("playauthenticate.change_password.error.passwords_not_same"); + return "playauthenticate.change_password.error.passwords_not_same"; } return null; } diff --git a/samples/java/play-authenticate-usage/app/models/AppModel.java b/samples/java/play-authenticate-usage/app/models/AppModel.java index 9120c695..4dc209c2 100644 --- a/samples/java/play-authenticate-usage/app/models/AppModel.java +++ b/samples/java/play-authenticate-usage/app/models/AppModel.java @@ -1,8 +1,8 @@ package models; -import javax.persistence.MappedSuperclass; +import io.ebean.Model; -import com.avaje.ebean.Model; +import javax.persistence.MappedSuperclass; @MappedSuperclass public class AppModel extends Model diff --git a/samples/java/play-authenticate-usage/app/models/LinkedAccount.java b/samples/java/play-authenticate-usage/app/models/LinkedAccount.java index a54fd7b2..84273903 100644 --- a/samples/java/play-authenticate-usage/app/models/LinkedAccount.java +++ b/samples/java/play-authenticate-usage/app/models/LinkedAccount.java @@ -1,11 +1,12 @@ package models; +import com.feth.play.module.pa.user.AuthUser; +import io.ebean.Finder; + import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToOne; -import com.feth.play.module.pa.user.AuthUser; - @Entity public class LinkedAccount extends AppModel { @@ -23,10 +24,10 @@ public class LinkedAccount extends AppModel { public String providerUserId; public String providerKey; - public static final Find find = new Find(){}; + public static final Finder find = new Finder<>(LinkedAccount.class); public static LinkedAccount findByProviderKey(final User user, String key) { - return find.where().eq("user", user).eq("providerKey", key) + return find.query().where().eq("user", user).eq("providerKey", key) .findUnique(); } diff --git a/samples/java/play-authenticate-usage/app/models/SecurityRole.java b/samples/java/play-authenticate-usage/app/models/SecurityRole.java index 87c08ee9..190000a7 100644 --- a/samples/java/play-authenticate-usage/app/models/SecurityRole.java +++ b/samples/java/play-authenticate-usage/app/models/SecurityRole.java @@ -15,12 +15,13 @@ */ package models; +import be.objectify.deadbolt.java.models.Role; +import io.ebean.Finder; +import io.ebean.Model; + import javax.persistence.Entity; import javax.persistence.Id; -import com.avaje.ebean.Model; -import be.objectify.deadbolt.java.models.Role; - /** * @author Steve Chaloner (steve@objectify.be) */ @@ -36,7 +37,7 @@ public class SecurityRole extends Model implements Role { public String roleName; - public static final Find find = new Find(){}; + public static final Finder find = new Finder<>(SecurityRole.class); @Override public String getName() { @@ -44,6 +45,6 @@ public String getName() { } public static SecurityRole findByRoleName(String roleName) { - return find.where().eq("roleName", roleName).findUnique(); + return find.query().where().eq("roleName", roleName).findUnique(); } } diff --git a/samples/java/play-authenticate-usage/app/models/TokenAction.java b/samples/java/play-authenticate-usage/app/models/TokenAction.java index 2a5e99f9..74599d23 100644 --- a/samples/java/play-authenticate-usage/app/models/TokenAction.java +++ b/samples/java/play-authenticate-usage/app/models/TokenAction.java @@ -1,18 +1,17 @@ package models; -import java.util.Date; +import io.ebean.Ebean; +import io.ebean.Finder; +import io.ebean.Model; +import io.ebean.QueryIterator; +import io.ebean.annotation.EnumValue; +import play.data.format.Formats; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToOne; - -import play.data.format.Formats; -import com.avaje.ebean.Model; - -import com.avaje.ebean.Ebean; -import com.avaje.ebean.QueryIterator; -import com.avaje.ebean.annotation.EnumValue; +import java.util.Date; @Entity public class TokenAction extends Model { @@ -54,14 +53,14 @@ public enum Type { @Formats.DateTime(pattern = "yyyy-MM-dd HH:mm:ss") public Date expires; - public static final Find find = new Find(){}; + public static final Finder find = new Finder<>(TokenAction.class); public static TokenAction findByToken(final String token, final Type type) { - return find.where().eq("token", token).eq("type", type).findUnique(); + return find.query().where().eq("token", token).eq("type", type).findUnique(); } public static void deleteByUser(final User u, final Type type) { - QueryIterator iterator = find.where() + QueryIterator iterator = find.query().where() .eq("targetUser.id", u.id).eq("type", type).findIterate(); while(iterator.hasNext()) { Ebean.delete(iterator.next()); diff --git a/samples/java/play-authenticate-usage/app/models/User.java b/samples/java/play-authenticate-usage/app/models/User.java index ddb7a9cf..47c9417a 100644 --- a/samples/java/play-authenticate-usage/app/models/User.java +++ b/samples/java/play-authenticate-usage/app/models/User.java @@ -3,14 +3,15 @@ import be.objectify.deadbolt.java.models.Permission; import be.objectify.deadbolt.java.models.Role; import be.objectify.deadbolt.java.models.Subject; -import com.avaje.ebean.Ebean; -import com.avaje.ebean.ExpressionList; +import io.ebean.Ebean; +import io.ebean.ExpressionList; import com.feth.play.module.pa.providers.password.UsernamePasswordAuthUser; import com.feth.play.module.pa.user.AuthUser; import com.feth.play.module.pa.user.AuthUserIdentity; import com.feth.play.module.pa.user.EmailIdentity; import com.feth.play.module.pa.user.NameIdentity; import com.feth.play.module.pa.user.FirstLastNameIdentity; +import io.ebean.Finder; import models.TokenAction.Type; import play.data.format.Formats; import play.data.validation.Constraints; @@ -61,7 +62,7 @@ public class User extends AppModel implements Subject { @ManyToMany public List permissions; - public static final AppModel.Find find = new AppModel.Find(){}; + public static final Finder find = new Finder<>(User.class); @Override public String getIdentifier() @@ -87,12 +88,12 @@ public static boolean existsByAuthUserIdentity( } else { exp = getAuthUserFind(identity); } - return exp.findRowCount() > 0; + return exp.query().findCount() > 0; } private static ExpressionList getAuthUserFind( final AuthUserIdentity identity) { - return find.where().eq("active", true) + return find.query().where().eq("active", true) .eq("linkedAccounts.providerUserId", identity.getId()) .eq("linkedAccounts.providerKey", identity.getProvider()); } @@ -208,7 +209,7 @@ public static User findByEmail(final String email) { } private static ExpressionList getEmailUserFind(final String email) { - return find.where().eq("active", true).eq("email", email); + return find.query().where().eq("active", true).eq("email", email); } public LinkedAccount getAccountByProvider(final String providerKey) { diff --git a/samples/java/play-authenticate-usage/app/models/UserPermission.java b/samples/java/play-authenticate-usage/app/models/UserPermission.java index 7a32cf05..f25849c0 100644 --- a/samples/java/play-authenticate-usage/app/models/UserPermission.java +++ b/samples/java/play-authenticate-usage/app/models/UserPermission.java @@ -1,10 +1,11 @@ package models; +import be.objectify.deadbolt.java.models.Permission; +import io.ebean.Finder; + import javax.persistence.Entity; import javax.persistence.Id; -import be.objectify.deadbolt.java.models.Permission; - /** * Initial version based on work by Steve Chaloner (steve@objectify.be) for * Deadbolt2 @@ -21,13 +22,13 @@ public class UserPermission extends AppModel implements Permission { public String value; - public static final AppModel.Find find = new AppModel.Find(){}; + public static final Finder find = new Finder<>(UserPermission.class); public String getValue() { return value; } public static UserPermission findByValue(String value) { - return find.where().eq("value", value).findUnique(); + return find.query().where().eq("value", value).findUnique(); } } diff --git a/samples/java/play-authenticate-usage/app/providers/MyUsernamePasswordAuthProvider.java b/samples/java/play-authenticate-usage/app/providers/MyUsernamePasswordAuthProvider.java index cd27e0eb..2fd5af78 100644 --- a/samples/java/play-authenticate-usage/app/providers/MyUsernamePasswordAuthProvider.java +++ b/samples/java/play-authenticate-usage/app/providers/MyUsernamePasswordAuthProvider.java @@ -5,12 +5,12 @@ import com.feth.play.module.pa.PlayAuthenticate; import com.feth.play.module.pa.providers.password.UsernamePasswordAuthProvider; import com.feth.play.module.pa.providers.password.UsernamePasswordAuthUser; - import controllers.routes; import models.LinkedAccount; import models.TokenAction; import models.TokenAction.Type; import models.User; +import play.Application; import play.Logger; import play.data.Form; import play.data.FormFactory; @@ -18,12 +18,12 @@ import play.data.validation.Constraints.MinLength; import play.data.validation.Constraints.Required; import play.i18n.Lang; -import play.i18n.Messages; import play.inject.ApplicationLifecycle; import play.mvc.Call; import play.mvc.Http.Context; import javax.inject.Inject; +import javax.inject.Provider; import javax.inject.Singleton; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -107,8 +107,7 @@ public static class MySignup extends MyLogin { public String validate() { if (password == null || !password.equals(repeatPassword)) { - return Messages - .get("playauthenticate.password.signup.error.passwords_not_same"); + return "playauthenticate.password.signup.error.passwords_not_same"; } return null; } @@ -130,13 +129,15 @@ public void setRepeatPassword(String repeatPassword) { } } + private final Provider appProvider; private final Form SIGNUP_FORM; private final Form LOGIN_FORM; @Inject - public MyUsernamePasswordAuthProvider(final PlayAuthenticate auth, final FormFactory formFactory, + public MyUsernamePasswordAuthProvider(final Provider appProvider, final PlayAuthenticate auth, final FormFactory formFactory, final ApplicationLifecycle lifecycle, MailerFactory mailerFactory) { super(auth, lifecycle, mailerFactory); + this.appProvider = appProvider; this.SIGNUP_FORM = formFactory.form(MySignup.class); this.LOGIN_FORM = formFactory.form(MyLogin.class); @@ -154,7 +155,7 @@ public Form getLoginForm() { protected MySignup getSignup(final Context ctx) { // TODO change to getSignupForm().bindFromRequest(request) after 2.1 Context.current.set(ctx); - final Form filledForm = SIGNUP_FORM.bindFromRequest(); + final Form filledForm = getSignupForm().bindFromRequest(); return filledForm.get(); } @@ -162,7 +163,7 @@ protected MySignup getSignup(final Context ctx) { protected MyLogin getLogin(final Context ctx) { // TODO change to getLoginForm().bindFromRequest(request) after 2.1 Context.current.set(ctx); - final Form filledForm = LOGIN_FORM.bindFromRequest(); + final Form filledForm = getLoginForm().bindFromRequest(); return filledForm.get(); } @@ -251,14 +252,14 @@ protected MyLoginUsernamePasswordAuthUser transformAuthUser(final MyUsernamePass @Override protected String getVerifyEmailMailingSubject( final MyUsernamePasswordAuthUser user, final Context ctx) { - return Messages.get("playauthenticate.password.verify_signup.subject"); + return "playauthenticate.password.verify_signup.subject"; } @Override protected String onLoginUserNotFound(final Context context) { context.flash() .put(controllers.Application.FLASH_ERROR_KEY, - Messages.get("playauthenticate.password.login.unknown_user_or_pw")); + "playauthenticate.password.login.unknown_user_or_pw"); return super.onLoginUserNotFound(context); } @@ -271,7 +272,7 @@ protected Body getVerifyEmailMailingBody(final String token, final String url = routes.Signup.verify(token).absoluteURL( ctx.request(), isSecure); - final Lang lang = Lang.preferred(ctx.request().acceptLanguages()); + final Lang lang = Lang.preferred(appProvider.get(), ctx.request().acceptLanguages()); final String langCode = lang.code(); final String html = getEmailTemplate( @@ -309,7 +310,7 @@ protected String generatePasswordResetRecord(final User u) { protected String getPasswordResetMailingSubject(final User user, final Context ctx) { - return Messages.get("playauthenticate.password.reset_email.subject"); + return "playauthenticate.password.reset_email.subject"; } protected Body getPasswordResetMailingBody(final String token, @@ -320,7 +321,7 @@ protected Body getPasswordResetMailingBody(final String token, final String url = routes.Signup.resetPassword(token).absoluteURL( ctx.request(), isSecure); - final Lang lang = Lang.preferred(ctx.request().acceptLanguages()); + final Lang lang = Lang.preferred(appProvider.get(), ctx.request().acceptLanguages()); final String langCode = lang.code(); final String html = getEmailTemplate( @@ -347,7 +348,7 @@ public boolean isLoginAfterPasswordReset() { protected String getVerifyEmailMailingSubjectAfterSignup(final User user, final Context ctx) { - return Messages.get("playauthenticate.password.verify_email.subject"); + return "playauthenticate.password.verify_email.subject"; } protected String getEmailTemplate(final String template, @@ -401,7 +402,7 @@ protected Body getVerifyEmailMailingBodyAfterSignup(final String token, final String url = routes.Signup.verify(token).absoluteURL( ctx.request(), isSecure); - final Lang lang = Lang.preferred(ctx.request().acceptLanguages()); + final Lang lang = Lang.preferred(appProvider.get(), ctx.request().acceptLanguages()); final String langCode = lang.code(); final String html = getEmailTemplate( diff --git a/samples/java/play-authenticate-usage/app/security/MyDeadboltHandler.java b/samples/java/play-authenticate-usage/app/security/MyDeadboltHandler.java index f43a1ad2..596d7311 100644 --- a/samples/java/play-authenticate-usage/app/security/MyDeadboltHandler.java +++ b/samples/java/play-authenticate-usage/app/security/MyDeadboltHandler.java @@ -24,7 +24,7 @@ public MyDeadboltHandler(final PlayAuthenticate auth, final ExecutionContextProv } @Override - public CompletionStage> beforeAuthCheck(final Http.Context context) { + public CompletionStage> beforeAuthCheck(final Http.Context context, final Optional content) { if (this.auth.isLoggedIn(context.session())) { // user is logged in return CompletableFuture.completedFuture(Optional.empty()); diff --git a/samples/java/play-authenticate-usage/app/service/DataInitializer.java b/samples/java/play-authenticate-usage/app/service/DataInitializer.java index b27949bc..fc3638b3 100644 --- a/samples/java/play-authenticate-usage/app/service/DataInitializer.java +++ b/samples/java/play-authenticate-usage/app/service/DataInitializer.java @@ -9,7 +9,7 @@ */ public class DataInitializer { public DataInitializer() { - if (SecurityRole.find.findCount() == 0) { + if (SecurityRole.find.query().findCount() == 0) { for (final String roleName : Arrays .asList(controllers.Application.USER_ROLE)) { final SecurityRole role = new SecurityRole(); diff --git a/samples/java/play-authenticate-usage/build.sbt b/samples/java/play-authenticate-usage/build.sbt index f1b9535c..7b4c5356 100644 --- a/samples/java/play-authenticate-usage/build.sbt +++ b/samples/java/play-authenticate-usage/build.sbt @@ -2,18 +2,21 @@ organization := "com.feth" name := "play-authenticate-usage" -scalaVersion := "2.11.8" +scalaVersion := "2.12.2" version := "1.0-SNAPSHOT" herokuAppName in Compile := "play-authenticate" val appDependencies = Seq( - "be.objectify" %% "deadbolt-java" % "2.5.0", + "be.objectify" %% "deadbolt-java" % "2.6.4", + "be.objectify" %% "deadbolt-java-gs" % "2.6.0", // Comment the next line for local development of the Play Authentication core: - "com.feth" %% "play-authenticate" % "0.8.3", + // Use the latest release version when copying this code, e.g. "0.9.0" + "com.feth" %% "play-authenticate" % "0.9.0-SNAPSHOT", "org.postgresql" % "postgresql" % "9.4-1206-jdbc42", - cache, + cacheApi, + ehcache, evolutions, javaWs, javaJdbc, diff --git a/samples/java/play-authenticate-usage/conf/application.conf b/samples/java/play-authenticate-usage/conf/application.conf index a375e99a..dd7d000f 100644 --- a/samples/java/play-authenticate-usage/conf/application.conf +++ b/samples/java/play-authenticate-usage/conf/application.conf @@ -15,7 +15,8 @@ play { # ~~~~~ # The secret key is used to secure cryptographics functions. # If you deploy your application to several instances be sure to use the same key! -play.crypto.secret="y]Z5;`T0=F3mAda1lW[r5jFWCw9stMiBnShjPU;59l7cwA9LX1abrprOgTP/VCDQ" +play.http.secret.key="changeme" +play.http.secret.key=${?APPLICATION_SECRET} # The application languages # ~~~~~ diff --git a/samples/java/play-authenticate-usage/conf/play-authenticate/mine.conf b/samples/java/play-authenticate-usage/conf/play-authenticate/mine.conf index 89d66e2c..3d23d4a6 100644 --- a/samples/java/play-authenticate-usage/conf/play-authenticate/mine.conf +++ b/samples/java/play-authenticate-usage/conf/play-authenticate/mine.conf @@ -10,6 +10,8 @@ play-authenticate { # if you are not using it, you can remove this portion of the config file password { mail { + includeXMailerHeader=true + verificationLink { # Whether the verification link will be HTTPS secure=false diff --git a/samples/java/play-authenticate-usage/project/plugins.sbt b/samples/java/play-authenticate-usage/project/plugins.sbt index feeede0c..fce5978d 100644 --- a/samples/java/play-authenticate-usage/project/plugins.sbt +++ b/samples/java/play-authenticate-usage/project/plugins.sbt @@ -5,18 +5,18 @@ logLevel := Level.Warn resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/" // Use the Play sbt plugin for Play projects -addSbtPlugin("com.typesafe.play" % "sbt-plugin" % Option(System.getProperty("play.version")).getOrElse("2.5.14")) +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % Option(System.getProperty("play.version")).getOrElse("2.6.12")) -addSbtPlugin("com.typesafe.sbt" %% "sbt-play-ebean" % "3.1.0") +addSbtPlugin("com.typesafe.sbt" %% "sbt-play-ebean" % "4.0.2") // TODO: find a way to automatically load sbt plugins of projects we depend on // if you see this and know how to do it, please open a pull request :) // Uncomment the next line for local development of the Play Authentication core: -//addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0") +//addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.0") // Uncomment the next line for local development of the Play Authentication core: -//addSbtPlugin("com.github.gseitz" % "sbt-release" % "1.0.0") +//addSbtPlugin("com.github.gseitz" % "sbt-release" % "1.0.7") addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0") diff --git a/test-app/app/controllers/ApplicationController.java b/test-app/app/controllers/ApplicationController.java index 6fc045f4..a7240e13 100644 --- a/test-app/app/controllers/ApplicationController.java +++ b/test-app/app/controllers/ApplicationController.java @@ -1,12 +1,11 @@ package controllers; -import static play.data.Form.form; - import com.feth.play.module.pa.PlayAuthenticate; import play.Logger; import play.Play; import play.data.Form; +import play.data.FormFactory; import play.mvc.Controller; import play.mvc.Result; import providers.TestUsernamePasswordAuthProvider; @@ -19,6 +18,8 @@ @Singleton public class ApplicationController extends Controller { + @Inject FormFactory formFactory; + public final String FLASH_ERROR_KEY = "error"; private TestUsernamePasswordAuthProvider testProvider; @@ -33,12 +34,12 @@ public Result index() { } public Result login() { - return ok(views.html.login.render(form(Login.class).bindFromRequest())); + return ok(views.html.login.render(formFactory.form(Login.class).bindFromRequest())); } public Result doLogin() { com.feth.play.module.pa.controllers.Authenticate.noCache(response()); - final Form filledForm = form(Login.class).bindFromRequest(); + final Form filledForm = formFactory.form(Login.class).bindFromRequest(); if (filledForm.hasErrors()) { // User did not fill everything properly return badRequest(views.html.login.render(filledForm)); @@ -50,12 +51,12 @@ public Result doLogin() { public Result signup() { return ok(views.html.signup - .render(form(Signup.class).bindFromRequest())); + .render(formFactory.form(Signup.class).bindFromRequest())); } public Result doSignup() { com.feth.play.module.pa.controllers.Authenticate.noCache(response()); - final Form filledForm = form(Signup.class).bindFromRequest(); + final Form filledForm = formFactory.form(Signup.class).bindFromRequest(); if (filledForm.hasErrors()) { // User did not fill everything properly return badRequest(views.html.signup.render(filledForm)); diff --git a/test-app/app/providers/TestUsernamePasswordAuthProvider.java b/test-app/app/providers/TestUsernamePasswordAuthProvider.java index 8f5c4bd5..595c864a 100644 --- a/test-app/app/providers/TestUsernamePasswordAuthProvider.java +++ b/test-app/app/providers/TestUsernamePasswordAuthProvider.java @@ -7,6 +7,7 @@ import com.feth.play.module.pa.providers.password.UsernamePasswordAuthUser; import play.Logger; import play.data.Form; +import play.data.FormFactory; import play.data.validation.Constraints.Email; import play.data.validation.Constraints.MinLength; import play.data.validation.Constraints.Required; @@ -21,8 +22,6 @@ import java.util.Map.Entry; import java.util.UUID; -import static play.data.Form.form; - @Singleton public class TestUsernamePasswordAuthProvider extends @@ -31,10 +30,12 @@ public class TestUsernamePasswordAuthProvider private final Map verifiedUsers = new HashMap<>(); private final Map unverifiedUsers = new HashMap<>(); private final Map verificationTokens = new HashMap<>(); + private final FormFactory formFactory; @Inject - public TestUsernamePasswordAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final MailerFactory mailerFactory) { + public TestUsernamePasswordAuthProvider(final PlayAuthenticate auth, final ApplicationLifecycle lifecycle, final MailerFactory mailerFactory, final FormFactory formFactory) { super(auth, lifecycle, mailerFactory); + this.formFactory = formFactory; } public static class Login implements @@ -180,16 +181,15 @@ protected com.feth.play.module.pa.providers.password.UsernamePasswordAuthProvide } protected Form getSignupForm() { - return form(Signup.class); + return formFactory.form(Signup.class); } protected Form getLoginForm() { - return form(Login.class); + return formFactory.form(Login.class); } @Override protected Signup getSignup(final Context ctx) { - // TODO change to getSignupForm().bindFromRequest(request) after 2.1 Context.current.set(ctx); final Form filledForm = getSignupForm().bindFromRequest(); return filledForm.get(); diff --git a/test-app/build.sbt b/test-app/build.sbt index f44c2542..a978cdec 100644 --- a/test-app/build.sbt +++ b/test-app/build.sbt @@ -2,25 +2,33 @@ organization := "com.feth" name := "play-authenticate-tests" -scalaVersion := "2.11.8" +scalaVersion := "2.12.2" version := "1.0-SNAPSHOT" val appDependencies = Seq( + javaForms, specs2 % "test", - "org.easytesting" % "fest-assert" % "1.4" % "test" + "org.easytesting" % "fest-assert" % "1.4" % "test", + cacheApi, + ehcache ) // Needed for specs2 resolvers += "scalaz-bintray" at "https://dl.bintray.com/scalaz/releases" -// add resolver for easymail snapshots +// add resolver for deadbolt and easymail snapshots resolvers += Resolver.sonatypeRepo("snapshots") +// display deprecated or poorly formed Java +javacOptions ++= Seq("-Xlint:unchecked") +javacOptions ++= Seq("-Xlint:deprecation") +javacOptions ++= Seq("-Xdiags:verbose") + lazy val playAuthenticate = (project in file("modules/play-authenticate")).enablePlugins(PlayJava) lazy val root = (project in file(".")) - .enablePlugins(PlayJava) + .enablePlugins(PlayJava, PlayEbean) .settings( libraryDependencies ++= appDependencies ) diff --git a/test-app/project/plugins.sbt b/test-app/project/plugins.sbt index 78d459da..1daa3b49 100644 --- a/test-app/project/plugins.sbt +++ b/test-app/project/plugins.sbt @@ -7,8 +7,10 @@ resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/release // Use the Play sbt plugin for Play projects addSbtPlugin("com.typesafe.play" % "sbt-plugin" % Option(System.getProperty("play.version")).getOrElse("2.5.14")) +addSbtPlugin("com.typesafe.sbt" %% "sbt-play-ebean" % "4.0.2") + addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0") -addSbtPlugin("com.github.gseitz" % "sbt-release" % "1.0.0") +addSbtPlugin("com.github.gseitz" % "sbt-release" % "1.0.7") addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0") diff --git a/test-app/test/ScalaControllerSpec.scala b/test-app/test/ScalaControllerSpec.scala deleted file mode 100644 index 9af37bd7..00000000 --- a/test-app/test/ScalaControllerSpec.scala +++ /dev/null @@ -1,87 +0,0 @@ -package test - -import controllers.ScalaController -import play.api.mvc.{AnyContentAsEmpty, Call, Session} -import play.api.test._ -import play.api.{Application, Logger} -import providers.TestUsernamePasswordAuthProvider - -/** - * Add your spec here. - * You can mock out a whole application including requests, plugins etc. - * For more information, consult the wiki. - */ -object ScalaControllerSpec extends PlaySpecification { - - "ScalaController" should { - - "send 303 for index page without login" in new WithApplication { - - val controller = app.injector.instanceOf(classOf[ScalaController]) - val result = controller.index()(FakeRequest()).run - status(result) must equalTo(SEE_OTHER) - redirectLocation(result) must beSome like { - case Some(s: String) => - s must_== controllers.routes.ApplicationController.login.url - } - } - - "send 200 for index page with login" in new WithApplication { - val someSession = signupAndLogin - val controller = app.injector.instanceOf(classOf[ScalaController]) - val result = controller.index()( - FakeRequest().withSession(someSession.get.data.toSeq: _*)).run - status(result) must equalTo(OK) - } - } - - def signupAndLogin(implicit app: Application): Option[Session] = { - val email = "user@example.com" - val password = "PaSSW0rd" - def fakeRequestCall(call: Call): FakeRequest[AnyContentAsEmpty.type] = { - FakeRequest(call.method, call.url) - } - def signup(email: String, password: String) = { - val someResult = route(fakeRequestCall( - controllers.routes.ApplicationController.doSignup()) - .withFormUrlEncodedBody("email" -> email, "password" -> password)) - someResult foreach { status(_) must_== SEE_OTHER } - upAuthProvider.getVerificationToken(email) - } - def validate(token: String) { - // Validate the token - token must not beNull; - Logger.debug(s"Verifying token: $token") - val someResult = route(fakeRequestCall( - controllers.routes.ApplicationController.verify(token))) - someResult foreach { result => - status(result) must_== SEE_OTHER - upAuthProvider.getVerificationToken(email) must beNull - // We should actually be logged in here, but let's ignore that - // as we want to test login too. - redirectLocation(result) must beSome("/") - } - } - def login(username: String, password: String) = { - // Log the user in - val someResult = route(fakeRequestCall( - controllers.routes.ApplicationController.doLogin()) - .withFormUrlEncodedBody("email" -> email, "password" -> password)) - someResult map { result => - status(result) must_== SEE_OTHER - redirectLocation(result) must beSome like { - case Some(s: String) => - s must_== "/" - } - session(result) - } - } - val token = signup(email, password) - validate(token) - login(email, password) - } - - def upAuthProvider(implicit app: Application): TestUsernamePasswordAuthProvider = { - app.injector.instanceOf(classOf[TestUsernamePasswordAuthProvider]) - } -}