Author: sletellier Date: 2012-09-05 18:01:25 +0200 (Wed, 05 Sep 2012) New Revision: 3686 Url: http://chorem.org/repositories/revision/pollen/3686 Log: Init facebook and twitter registration Added: branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/ branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/FacebookCallback.java branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/LoginWithFacebook.java branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/LoginWithTwitter.java branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/TwitterCallback.java Modified: branches/pollen-1.5-SOCIAL/pollen-persistence/src/main/java/org/chorem/pollen/PollenConfiguration.java branches/pollen-1.5-SOCIAL/pollen-persistence/src/main/java/org/chorem/pollen/PollenConfigurationOption.java branches/pollen-1.5-SOCIAL/pollen-persistence/src/main/xmi/pollen.zargo branches/pollen-1.5-SOCIAL/pollen-services/pom.xml branches/pollen-1.5-SOCIAL/pollen-services/src/main/java/org/chorem/pollen/services/impl/UserService.java branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/PollenSession.java branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/resources/config/struts-user.xml branches/pollen-1.5-SOCIAL/pom.xml Modified: branches/pollen-1.5-SOCIAL/pollen-persistence/src/main/java/org/chorem/pollen/PollenConfiguration.java =================================================================== --- branches/pollen-1.5-SOCIAL/pollen-persistence/src/main/java/org/chorem/pollen/PollenConfiguration.java 2012-09-05 16:00:45 UTC (rev 3685) +++ branches/pollen-1.5-SOCIAL/pollen-persistence/src/main/java/org/chorem/pollen/PollenConfiguration.java 2012-09-05 16:01:25 UTC (rev 3686) @@ -213,6 +213,34 @@ return result; } + public String getTwitterConsumerKey() { + return applicationConfig.getOption(PollenConfigurationOption.TWITTER_CONSUMER_KEY.key); + } + + public String getTwitterConsumerSecret() { + return applicationConfig.getOption(PollenConfigurationOption.TWITTER_CONSUMER_SECRET.key); + } + + public String getFacebookScope() { + return applicationConfig.getOption(PollenConfigurationOption.FACEBOOK_SCOPE.key); + } + + public String getFacebookSecret() { + return applicationConfig.getOption(PollenConfigurationOption.FACEBOOK_SECRET.key); + } + + public String getFacebookApplicationId() { + return applicationConfig.getOption(PollenConfigurationOption.FACEBOOK_APPLICATION_ID.key); + } + + public String getFacebookCallBackURL() { + return applicationConfig.getOption(PollenConfigurationOption.FACEBOOK_CALLBACK_URL.key); + } + + public String getTwitterCallBackURL() { + return applicationConfig.getOption(PollenConfigurationOption.TWITTER_CALLBACK_URL.key); + } + public String getCharset() { String result = applicationConfig.getOption( PollenConfigurationOption.CHARSET.key); Modified: branches/pollen-1.5-SOCIAL/pollen-persistence/src/main/java/org/chorem/pollen/PollenConfigurationOption.java =================================================================== --- branches/pollen-1.5-SOCIAL/pollen-persistence/src/main/java/org/chorem/pollen/PollenConfigurationOption.java 2012-09-05 16:00:45 UTC (rev 3685) +++ branches/pollen-1.5-SOCIAL/pollen-persistence/src/main/java/org/chorem/pollen/PollenConfigurationOption.java 2012-09-05 16:01:25 UTC (rev 3686) @@ -123,8 +123,20 @@ DB_LOGIN("hibernate.connection.username", n_("pollen.configuration.dbLogin"), "sa", String.class), /** passowrd to db. */ - DB_PASSWORD("hibernate.connection.password", n_("pollen.configuration.dbPassword"), "", String.class); + DB_PASSWORD("hibernate.connection.password", n_("pollen.configuration.dbPassword"), "", String.class), + + // Social networks: Twitter + TWITTER_CONSUMER_KEY("pollen.social.twitter.consumer.key", "consumer key for twitter", null, String.class), + TWITTER_CONSUMER_SECRET("pollen.social.twitter.consumer.secret", "Secret consumer key for twitter", null, String.class), + TWITTER_CALLBACK_URL("pollen.social.twitter.callback.url", "Call back url for twitter", null, String.class), + + // Social networks: Facebook + FACEBOOK_SCOPE("pollen.social.facebook.scope", "Scope for facebook", null, String.class), + FACEBOOK_SECRET("pollen.social.facebook.secret", "Secret for facebook", null, String.class), + FACEBOOK_APPLICATION_ID("pollen.social.facebook.application.id", "Application id for facebook", null, String.class), + FACEBOOK_CALLBACK_URL("pollen.social.facebook.callback.url", "Call back url for facebook", null, String.class); + /** Configuration key. */ protected final String key; Modified: branches/pollen-1.5-SOCIAL/pollen-persistence/src/main/xmi/pollen.zargo =================================================================== (Binary files differ) Modified: branches/pollen-1.5-SOCIAL/pollen-services/pom.xml =================================================================== --- branches/pollen-1.5-SOCIAL/pollen-services/pom.xml 2012-09-05 16:00:45 UTC (rev 3685) +++ branches/pollen-1.5-SOCIAL/pollen-services/pom.xml 2012-09-05 16:01:25 UTC (rev 3686) @@ -104,6 +104,23 @@ <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> + + <!-- Spring Social --> + <dependency> + <groupId>org.springframework.social</groupId> + <artifactId>spring-social-core</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.social</groupId> + <artifactId>spring-social-facebook</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.social</groupId> + <artifactId>spring-social-twitter</artifactId> + </dependency> + </dependencies> <!-- ************************************************************* --> Modified: branches/pollen-1.5-SOCIAL/pollen-services/src/main/java/org/chorem/pollen/services/impl/UserService.java =================================================================== --- branches/pollen-1.5-SOCIAL/pollen-services/src/main/java/org/chorem/pollen/services/impl/UserService.java 2012-09-05 16:00:45 UTC (rev 3685) +++ branches/pollen-1.5-SOCIAL/pollen-services/src/main/java/org/chorem/pollen/services/impl/UserService.java 2012-09-05 16:01:25 UTC (rev 3686) @@ -23,14 +23,21 @@ package org.chorem.pollen.services.impl; import com.google.common.base.Preconditions; +import java.util.List; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.chorem.pollen.PollenConfiguration; import org.chorem.pollen.PollenTechnicalException; +import org.chorem.pollen.business.persistence.TwitterCredentials; +import org.chorem.pollen.business.persistence.TwitterCredentialsDAO; import org.chorem.pollen.business.persistence.UserAccount; import org.chorem.pollen.business.persistence.UserAccountDAO; +import org.chorem.pollen.common.FacebookCredentials; +import org.chorem.pollen.common.FacebookCredentialsDAO; import org.chorem.pollen.entities.PollenBinderHelper; import org.chorem.pollen.services.PollenServiceSupport; import org.chorem.pollen.services.exceptions.InvalidEmailException; @@ -43,9 +50,21 @@ import org.nuiton.topia.persistence.util.TopiaEntityBinder; import org.nuiton.util.StringUtil; import org.nuiton.util.beans.Binder; +import org.springframework.social.connect.Connection; +import org.springframework.social.connect.UserProfile; +import org.springframework.social.facebook.api.Facebook; +import org.springframework.social.facebook.connect.FacebookConnectionFactory; +import org.springframework.social.oauth1.AuthorizedRequestToken; +import org.springframework.social.oauth1.OAuth1Operations; +import org.springframework.social.oauth1.OAuth1Parameters; +import org.springframework.social.oauth1.OAuthToken; +import org.springframework.social.oauth2.AccessGrant; +import org.springframework.social.oauth2.GrantType; +import org.springframework.social.oauth2.OAuth2Operations; +import org.springframework.social.oauth2.OAuth2Parameters; +import org.springframework.social.twitter.api.Twitter; +import org.springframework.social.twitter.connect.TwitterConnectionFactory; -import java.util.List; - import static org.nuiton.i18n.I18n._; public class UserService extends PollenServiceSupport { @@ -79,6 +98,168 @@ } } + public ImmutablePair<OAuthToken, String> connectWithTwitter() { + + PollenConfiguration config = getConfiguration(); + + TwitterConnectionFactory connectionFactory = + new TwitterConnectionFactory(config.getTwitterConsumerKey(), config.getTwitterConsumerSecret()); + + OAuth1Operations oauthOperations = connectionFactory.getOAuthOperations(); + OAuthToken requestToken = oauthOperations.fetchRequestToken(config.getTwitterCallBackURL(), null); + + String authorizeUrl = oauthOperations.buildAuthorizeUrl(requestToken.getValue(), OAuth1Parameters.NONE); + + return ImmutablePair.of(requestToken, authorizeUrl); + } + + public String connectWithFacebook() { + + PollenConfiguration config = getConfiguration(); + + FacebookConnectionFactory connectionFactory = + new FacebookConnectionFactory(config.getFacebookApplicationId(), config.getFacebookSecret()); + + OAuth2Operations oauthOperations = connectionFactory.getOAuthOperations(); + OAuth2Parameters params = new OAuth2Parameters(); + params.setRedirectUri(config.getFacebookCallBackURL()); + params.setScope(config.getFacebookScope()); + String authorizeUrl = oauthOperations.buildAuthorizeUrl(GrantType.AUTHORIZATION_CODE, params); + + return authorizeUrl; + } + + public UserAccount twitterCallBack(OAuthToken twitterRequestToken, String oauthVerifier) { + + PollenConfiguration config = getConfiguration(); + + TwitterConnectionFactory connectionFactory = + new TwitterConnectionFactory(config.getTwitterConsumerKey(), config.getTwitterConsumerSecret()); + + OAuth1Operations oauthOperations = connectionFactory.getOAuthOperations(); + + OAuthToken accessToken = oauthOperations.exchangeForAccessToken( + new AuthorizedRequestToken(twitterRequestToken, oauthVerifier), null); + + String twitterAccessTokenValue = accessToken.getValue(); + String twitterAccessTokenSecret = accessToken.getSecret(); + + // get twitter connection + Connection<Twitter> twitterConnection = getTwitterConnection(twitterAccessTokenValue, twitterAccessTokenSecret); + + // get user if exist + long twitterId = twitterConnection.getApi().userOperations().getUserProfile().getId(); + + UserAccountDAO userAccountDAO = getDAO(UserAccount.class); + TwitterCredentialsDAO twitterCredentialsDAO = getDAO(TwitterCredentials.class); + try { + + // account found +// UserAccount account = userAccountDAO.findByTwitterId(twitterId) + UserAccount account = null; + + if (account == null) { + account = userAccountDAO.create(); + } + + // convert profile to pollen account + account = updateAccountWithSocialProfile(account, twitterConnection.fetchUserProfile()); + + // create twitter credentials + TwitterCredentials twitterCredentials = twitterCredentialsDAO.create( + TwitterCredentials.PROPERTY_TWITTER_ID, twitterId, + TwitterCredentials.PROPERTY_TWITTER_ACCESS_TOKEN, twitterAccessTokenValue, + TwitterCredentials.PROPERTY_TWITTER_ACCESS_TOKEN_SECRET, twitterAccessTokenSecret); + + account.setTwitterCredentials(twitterCredentials); + + return account; + } catch (TopiaException eee) { + throw new PollenTechnicalException(eee); + } + } + + public UserAccount facebookCallBack(String facebookCode) { + + // get facebook connection + Connection<Facebook> facebookConnection = getFacebookConnection(facebookCode); + + String facebookId = facebookConnection.getApi().userOperations().getUserProfile().getId(); + + UserAccountDAO userAccountDAO = getDAO(UserAccount.class); + FacebookCredentialsDAO facebookCredentialsDAO = getDAO(FacebookCredentials.class); + try { + + // account found +// UserAccount account = userAccountDAO.findByFacebookId(twitterId) + UserAccount account = null; + + if (account == null) { + account = userAccountDAO.create(); + } + + // convert profile to pollen account + account = updateAccountWithSocialProfile(account, facebookConnection.fetchUserProfile()); + + // create facebook credentials + FacebookCredentials facebookCredentials = facebookCredentialsDAO.create( + FacebookCredentials.PROPERTY_FACEBOOK_ID, facebookId, + FacebookCredentials.PROPERTY_FACEBOOK_CODE, facebookCode); + + account.setFacebookCredentials(facebookCredentials); + + return account; + } catch (TopiaException eee) { + throw new PollenTechnicalException(eee); + } + } + + protected Connection<Twitter> getTwitterConnection(UserAccount account) { + TwitterCredentials twitterCredentials = account.getTwitterCredentials(); + return getTwitterConnection(twitterCredentials.getTwitterAccessToken(), twitterCredentials.getTwitterAccessTokenSecret()); + } + + protected Connection<Twitter> getTwitterConnection(String twitterAccessTokenValue, String twitterAccessTokenSecret) { + + PollenConfiguration config = getConfiguration(); + + TwitterConnectionFactory connectionFactory = + new TwitterConnectionFactory(config.getTwitterConsumerKey(), config.getTwitterConsumerSecret()); + + // retrieve access token + OAuthToken userAccessToken = new OAuthToken(twitterAccessTokenValue, twitterAccessTokenSecret); + Connection<Twitter> twitterConnection = connectionFactory.createConnection(userAccessToken); + + return twitterConnection; + } + + protected Connection<Facebook> getFacebookConnection(UserAccount account) { + return getFacebookConnection(account.getFacebookCredentials().getFacebookCode()); + } + + protected Connection<Facebook> getFacebookConnection(String facebookCode) { + + PollenConfiguration config = getConfiguration(); + + // get facebook connection + FacebookConnectionFactory connectionFactory = + new FacebookConnectionFactory(config.getFacebookApplicationId(), config.getFacebookSecret()); + + OAuth2Operations oauthOperations = connectionFactory.getOAuthOperations(); + AccessGrant accessGrant = oauthOperations.exchangeForAccess(facebookCode, config.getFacebookCallBackURL(), null); + Connection<Facebook> facebookConnection = connectionFactory.createConnection(accessGrant); + + return facebookConnection; + } + + protected UserAccount updateAccountWithSocialProfile(UserAccount account, UserProfile userProfile) { + account.setEmail(userProfile.getEmail()); + account.setFirstName(userProfile.getFirstName()); + account.setLastName(userProfile.getLastName()); + + return account; + } + public UserAccount createUser(UserAccount user, boolean byAdmin) throws UserLoginAlreadyUsedException, UserEmailAlreadyUsedException { @@ -343,5 +524,4 @@ destination.setEmail(StringUtils.lowerCase(source.getEmail())); } } - } Modified: branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/PollenSession.java =================================================================== --- branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/PollenSession.java 2012-09-05 16:00:45 UTC (rev 3685) +++ branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/PollenSession.java 2012-09-05 16:01:25 UTC (rev 3686) @@ -25,17 +25,17 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.opensymphony.xwork2.ActionContext; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.chorem.pollen.business.persistence.UserAccount; - -import javax.servlet.ServletRequest; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; import java.io.Serializable; import java.util.Iterator; import java.util.Map; import java.util.Set; +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.chorem.pollen.business.persistence.UserAccount; +import org.springframework.social.oauth1.OAuthToken; /** * User session to put in servlet session. @@ -92,6 +92,8 @@ /** User loggued account (if anonymous, then userAccount is null). */ private UserAccount userAccount; + private OAuthToken twitterRequestToken; + /** To push dynamic data which should be consumed in a page scope. */ private Map<String, Serializable> dynamicData; @@ -186,4 +188,12 @@ } } } + + public void setTwitterRequestToken(OAuthToken twitterRequestToken) { + this.twitterRequestToken = twitterRequestToken; + } + + public OAuthToken getTwitterRequestToken() { + return twitterRequestToken; + } } Added: branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/FacebookCallback.java =================================================================== --- branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/FacebookCallback.java (rev 0) +++ branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/FacebookCallback.java 2012-09-05 16:01:25 UTC (rev 3686) @@ -0,0 +1,55 @@ +package org.chorem.pollen.ui.actions.user.social; + +import org.chorem.pollen.business.persistence.UserAccount; +import org.chorem.pollen.ui.actions.PollenActionSupport; + +/** + * @author Sylvain Letellier <sylvain.letellier@wiztivi.com> + */ +public class FacebookCallback extends PollenActionSupport { + + private static final long serialVersionUID = 1L; + + public static final String HOME = "home"; + + protected String redirectUrl; + + protected String code; + + public String getRedirectUrl() { + return redirectUrl; + } + + public void setRedirectUrl(String redirectUrl) { + this.redirectUrl = redirectUrl; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + @Override + public String execute() throws Exception { + + UserAccount userAccount = getUserService().facebookCallBack(code); + getPollenSession().setUserAccount(userAccount); + addFlashMessage(_("pollen.information.your.are.loggued")); + + String result; + if (redirectUrl == null || redirectUrl.contains("/security")) { + + // After security problem, redirect to home + result = HOME; + + } else { + + // Stay on the same page identified by redirectUrl + result = SUCCESS; + } + return result; + } +} \ No newline at end of file Added: branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/LoginWithFacebook.java =================================================================== --- branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/LoginWithFacebook.java (rev 0) +++ branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/LoginWithFacebook.java 2012-09-05 16:01:25 UTC (rev 3686) @@ -0,0 +1,42 @@ +package org.chorem.pollen.ui.actions.user.social; + +import org.chorem.pollen.ui.actions.PollenActionSupport; + +/** + * @author Sylvain Letellier <sylvain.letellier@wiztivi.com> + */ +public class LoginWithFacebook extends PollenActionSupport { + + private static final long serialVersionUID = 1L; + + public static final String HOME = "home"; + + protected String redirectUrl; + + public String getRedirectUrl() { + return redirectUrl; + } + + public void setRedirectUrl(String redirectUrl) { + this.redirectUrl = redirectUrl; + } + + @Override + public String execute() throws Exception { + + redirectUrl = getUserService().connectWithFacebook(); + + String result; + if (redirectUrl == null || redirectUrl.contains("/security")) { + + // After security problem, redirect to home + result = HOME; + + } else { + + // Stay on the same page identified by redirectUrl + result = SUCCESS; + } + return result; + } +} \ No newline at end of file Added: branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/LoginWithTwitter.java =================================================================== --- branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/LoginWithTwitter.java (rev 0) +++ branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/LoginWithTwitter.java 2012-09-05 16:01:25 UTC (rev 3686) @@ -0,0 +1,50 @@ +package org.chorem.pollen.ui.actions.user.social; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.chorem.pollen.ui.actions.PollenActionSupport; +import org.springframework.social.oauth1.OAuthToken; + +/** + * @author Sylvain Letellier <sylvain.letellier@wiztivi.com> + */ +public class LoginWithTwitter extends PollenActionSupport { + + private static final long serialVersionUID = 1L; + + public static final String HOME = "home"; + + protected String redirectUrl; + + public String getRedirectUrl() { + return redirectUrl; + } + + public void setRedirectUrl(String redirectUrl) { + this.redirectUrl = redirectUrl; + } + + @Override + public String execute() throws Exception { + + ImmutablePair<OAuthToken, String> tokenAndRedirectUrl = getUserService().connectWithTwitter(); + + // keep twitter token in session + getPollenSession().setTwitterRequestToken(tokenAndRedirectUrl.getLeft()); + + // redirect to twitter login page + this.redirectUrl = tokenAndRedirectUrl.getRight(); + + String result; + if (redirectUrl == null || redirectUrl.contains("/security")) { + + // After security problem, redirect to home + result = HOME; + + } else { + + // Stay on the same page identified by redirectUrl + result = SUCCESS; + } + return result; + } +} \ No newline at end of file Added: branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/TwitterCallback.java =================================================================== --- branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/TwitterCallback.java (rev 0) +++ branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/java/org/chorem/pollen/ui/actions/user/social/TwitterCallback.java 2012-09-05 16:01:25 UTC (rev 3686) @@ -0,0 +1,64 @@ +package org.chorem.pollen.ui.actions.user.social; + +import org.chorem.pollen.business.persistence.UserAccount; +import org.chorem.pollen.ui.actions.PollenActionSupport; + +/** + * @author Sylvain Letellier <sylvain.letellier@wiztivi.com> + */ +public class TwitterCallback extends PollenActionSupport { + + private static final long serialVersionUID = 1L; + + public static final String HOME = "home"; + + protected String redirectUrl; + + protected String oauthToken; + protected String oauthVerifier; + + public String getRedirectUrl() { + return redirectUrl; + } + + public void setRedirectUrl(String redirectUrl) { + this.redirectUrl = redirectUrl; + } + + public String getOauthToken() { + return oauthToken; + } + + public void setOauthToken(String oauthToken) { + this.oauthToken = oauthToken; + } + + public String getOauthVerifier() { + return oauthVerifier; + } + + public void setOauthVerifier(String oauthVerifier) { + this.oauthVerifier = oauthVerifier; + } + + @Override + public String execute() throws Exception { + + UserAccount userAccount = getUserService().twitterCallBack(getPollenSession().getTwitterRequestToken(), oauthVerifier); + getPollenSession().setUserAccount(userAccount); + addFlashMessage(_("pollen.information.your.are.loggued")); + + String result; + if (redirectUrl == null || redirectUrl.contains("/security")) { + + // After security problem, redirect to home + result = HOME; + + } else { + + // Stay on the same page identified by redirectUrl + result = SUCCESS; + } + return result; + } +} \ No newline at end of file Modified: branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/resources/config/struts-user.xml =================================================================== --- branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/resources/config/struts-user.xml 2012-09-05 16:00:45 UTC (rev 3685) +++ branches/pollen-1.5-SOCIAL/pollen-ui-struts2/src/main/resources/config/struts-user.xml 2012-09-05 16:01:25 UTC (rev 3686) @@ -49,6 +49,30 @@ <result type="redirect2"/> </action> + <!-- login with facebook --> + <action name="loginWithFacebook" class="org.chorem.pollen.ui.actions.user.social.LoginWithFacebook"> + <result name="home" type="redirectToHome"/> + <result type="redirect2"/> + </action> + + <!-- facebook callBack --> + <action name="facebookCallback" class="org.chorem.pollen.ui.actions.user.social.FacebookCallback"> + <result name="home" type="redirectToHome"/> + <result type="redirect2"/> + </action> + + <!-- login with twitter --> + <action name="loginWithTwitter" class="org.chorem.pollen.ui.actions.user.social.LoginWithTwitter"> + <result name="home" type="redirectToHome"/> + <result type="redirect2"/> + </action> + + <!-- twitter callback --> + <action name="twitterCallback" class="org.chorem.pollen.ui.actions.user.social.TwitterCallback"> + <result name="home" type="redirectToHome"/> + <result type="redirect2"/> + </action> + <!-- register user --> <action name="register" class="org.chorem.pollen.ui.actions.user.Register"> <result name="input">/WEB-INF/jsp/user/register.jsp</result> Modified: branches/pollen-1.5-SOCIAL/pom.xml =================================================================== --- branches/pollen-1.5-SOCIAL/pom.xml 2012-09-05 16:00:45 UTC (rev 3685) +++ branches/pollen-1.5-SOCIAL/pom.xml 2012-09-05 16:01:25 UTC (rev 3686) @@ -169,6 +169,9 @@ <hibernateVersion>3.6.10.Final</hibernateVersion> <seleniumVersion>2.25.0</seleniumVersion> <mockitoVersion>1.9.0</mockitoVersion> + <springSocialCoreVersion>1.0.2.RELEASE</springSocialCoreVersion> + <springSocialFacebookVersion>1.0.1.RELEASE</springSocialFacebookVersion> + <springSocialTwitterVersion>1.0.2.RELEASE</springSocialTwitterVersion> <pollenI18nBundle>pollen-i18n</pollenI18nBundle> <!-- license to use --> @@ -346,6 +349,26 @@ </exclusions> </dependency> + <!-- Spring social --> + + <dependency> + <groupId>org.springframework.social</groupId> + <artifactId>spring-social-core</artifactId> + <version>${springSocialCoreVersion}</version> + </dependency> + + <dependency> + <groupId>org.springframework.social</groupId> + <artifactId>spring-social-facebook</artifactId> + <version>${springSocialFacebookVersion}</version> + </dependency> + + <dependency> + <groupId>org.springframework.social</groupId> + <artifactId>spring-social-twitter</artifactId> + <version>${springSocialTwitterVersion}</version> + </dependency> + <!-- Logging --> <dependency>