Author: raminder
Date: Wed Oct  3 20:54:07 2012
New Revision: 1393757

URL: http://svn.apache.org/viewvc?rev=1393757&view=rev
Log:
To provide feature to create new openid users in Rave. RAVE-775

Added:
    
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/handler/
    
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandler.java
    
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/handler/
    
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandlerTest.java
Modified:
    rave/trunk/rave-components/rave-core/pom.xml
    
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/UserRepository.java
    
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/UserService.java
    
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultNewAccountService.java
    
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultUserService.java
    
rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultUserServiceTest.java
    
rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/model/JpaUser.java
    
rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/repository/impl/JpaUserRepository.java
    
rave/trunk/rave-components/rave-jpa/src/test/java/org/apache/rave/portal/repository/impl/JpaUserRepositoryTest.java
    rave/trunk/rave-components/rave-jpa/src/test/resources/test_data.sql
    
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/NewAccountController.java
    
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java
    
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/NewAccountControllerTest.java
    rave/trunk/rave-portal-resources/src/main/resources/messages.properties
    
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/applicationContext-security.xml
    rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/db/initial_data.sql
    
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/includes/new_user_form.jsp

Modified: rave/trunk/rave-components/rave-core/pom.xml
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-core/pom.xml?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- rave/trunk/rave-components/rave-core/pom.xml (original)
+++ rave/trunk/rave-components/rave-core/pom.xml Wed Oct  3 20:54:07 2012
@@ -82,6 +82,10 @@
             <groupId>org.springframework.security</groupId>
             <artifactId>spring-security-web</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.security</groupId>
+            <artifactId>spring-security-openid</artifactId>
+        </dependency>
 
         <!-- Jackson JSON Mapper -->
         <dependency>

Modified: 
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/UserRepository.java
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/UserRepository.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- 
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/UserRepository.java
 (original)
+++ 
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/repository/UserRepository.java
 Wed Oct  3 20:54:07 2012
@@ -40,6 +40,14 @@ public interface UserRepository extends 
      * @return {@link org.apache.rave.portal.model.User} if one exists, 
otherwise {@literal null}
      */
     User getByUserEmail(String userEmail);
+    
+    /**
+     * Gets a {@link org.apache.rave.portal.model.User} by openId
+     *
+     * @param openId the (unique) openIdURL of the user
+     * @return {@link org.apache.rave.portal.model.User} if one exists, 
otherwise {@literal null}
+     */
+       User getByOpenId(String openId);
 
     /**
      * List of {@link org.apache.rave.portal.model.User}'s with a limited 
resultset

Modified: 
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/UserService.java
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/UserService.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- 
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/UserService.java
 (original)
+++ 
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/UserService.java
 Wed Oct  3 20:54:07 2012
@@ -25,9 +25,11 @@ import java.util.List;
 import org.apache.rave.portal.model.Person;
 import org.apache.rave.portal.model.User;
 import org.apache.rave.portal.model.util.SearchResult;
+import 
org.springframework.security.core.userdetails.AuthenticationUserDetailsService;
 import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.openid.OpenIDAuthenticationToken;
 
-public interface UserService extends UserDetailsService {
+public interface UserService extends UserDetailsService, 
AuthenticationUserDetailsService<OpenIDAuthenticationToken> {
     /**
      * Get the currently authenticated user.
      *
@@ -195,4 +197,13 @@ public interface UserService extends Use
      */
        boolean acceptFriendRequest(String friendUsername, String username);
 
+
+    /**
+     * Return a user object by the openId.
+     *
+     * @param openId OpenId url of the user
+     * @return {@link org.apache.rave.portal.model.User} if one exists, 
otherwise {@literal null}
+     */
+       User getUserByOpenId(String openId);
+
 }
\ No newline at end of file

Modified: 
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultNewAccountService.java
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultNewAccountService.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- 
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultNewAccountService.java
 (original)
+++ 
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultNewAccountService.java
 Wed Oct  3 20:54:07 2012
@@ -62,6 +62,7 @@ public class DefaultNewAccountService im
         final String displayName = newUser.getDisplayName();
         final String status = newUser.getStatus();
         final String aboutMe = newUser.getAboutMe();
+        final String openId = newUser.getOpenId();
 
         throwExceptionIfUserExists(userName, email);
 
@@ -84,6 +85,7 @@ public class DefaultNewAccountService im
         user.setDisplayName(displayName);
         user.setStatus(status);
         user.setAboutMe(aboutMe);
+        user.setOpenId(openId);
 
         userService.registerNewUser(user);
     }

Modified: 
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultUserService.java
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultUserService.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- 
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultUserService.java
 (original)
+++ 
rave/trunk/rave-components/rave-core/src/main/java/org/apache/rave/portal/service/impl/DefaultUserService.java
 Wed Oct  3 20:54:07 2012
@@ -56,6 +56,7 @@ import org.springframework.security.core
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.security.crypto.codec.Base64;
 import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.openid.OpenIDAuthenticationToken;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -219,6 +220,11 @@ public class DefaultUserService implemen
     public User getUserByEmail(String userEmail) {
         return userRepository.getByUserEmail(userEmail);
     }
+    
+    @Override
+    public User getUserByOpenId(String openId) {
+        return userRepository.getByOpenId(openId);
+    }
 
     @Override
     @Transactional
@@ -396,4 +402,14 @@ public class DefaultUserService implemen
        return personRepository.acceptFriendRequest(friendUsername,username);
     }
 
+       @Override
+       public UserDetails loadUserDetails(OpenIDAuthenticationToken token) 
throws UsernameNotFoundException {
+               final String openId = token.getIdentityUrl();
+               User user = this.getUserByOpenId(openId);
+               if (user == null) {
+                       log.info("Open ID User with URL "+openId+" was not 
found!");
+                       throw new UsernameNotFoundException("Open ID User with 
URL "+openId+" was not found!");
+               }
+               return user;
+       }
 }

Modified: 
rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultUserServiceTest.java
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultUserServiceTest.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- 
rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultUserServiceTest.java
 (original)
+++ 
rave/trunk/rave-components/rave-core/src/test/java/org/apache/rave/portal/service/impl/DefaultUserServiceTest.java
 Wed Oct  3 20:54:07 2012
@@ -67,6 +67,9 @@ import org.springframework.security.core
 import org.springframework.security.core.context.SecurityContextImpl;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.openid.OpenIDAttribute;
+import org.springframework.security.openid.OpenIDAuthenticationStatus;
+import org.springframework.security.openid.OpenIDAuthenticationToken;
 
 public class DefaultUserServiceTest {
 
@@ -83,6 +86,8 @@ public class DefaultUserServiceTest {
 
     private static final String USER_NAME = "1234";
     private static final String USER_EMAIL = "[email protected]";
+    private static final String OPENID_INVALID = "http://user.myopenid.com/";;
+    private static final String OPENID_VALID = "http://rave2011.myopenid.com/";;
     private static final Long VALID_WIDGET_ID = 1L;
     private static final Long INVALID_USER_ID = -9999L;
 
@@ -215,8 +220,8 @@ public class DefaultUserServiceTest {
 
      @Test
      public void getUserByEmail_valid() {
-          final User authUser=new UserImpl(USER_ID,USER_NAME);
-          authUser.setEmail(USER_EMAIL);
+        final User authUser=new UserImpl(USER_ID,USER_NAME);
+        authUser.setEmail(USER_EMAIL);
         
expect(userRepository.getByUserEmail(USER_EMAIL)).andReturn(authUser).anyTimes();
         replay(userRepository);
 
@@ -224,6 +229,41 @@ public class DefaultUserServiceTest {
         assertThat((User)result, is(sameInstance(authUser)));
         verify(userRepository);
      }
+     
+     @Test
+     public void getUserByOpenId_valid() {
+       final User authUser=new UserImpl(USER_ID,USER_NAME);
+        authUser.setOpenId(OPENID_VALID);
+        
expect(userRepository.getByOpenId(OPENID_VALID)).andReturn(authUser).anyTimes();
+        replay(userRepository);
+
+        UserDetails result = service.getUserByOpenId(OPENID_VALID);
+        assertThat((User)result, is(sameInstance(authUser)));
+        verify(userRepository);
+     }
+     
+     @Test
+     public void loadUserDetails_valid() {
+       final User authUser=new UserImpl(USER_ID,USER_NAME);
+        authUser.setOpenId(OPENID_VALID);
+        
expect(userRepository.getByOpenId(OPENID_VALID)).andReturn(authUser).anyTimes();
+        replay(userRepository);
+         OpenIDAuthenticationToken postAuthToken = new 
OpenIDAuthenticationToken(OpenIDAuthenticationStatus.SUCCESS,OPENID_VALID, 
+                       "Some message", new ArrayList<OpenIDAttribute>());
+         UserDetails result = service.loadUserDetails(postAuthToken);
+         assertThat((User)result, is(sameInstance(authUser)));
+         verify(userRepository);
+     }
+     
+     @Test(expected = UsernameNotFoundException.class)
+     public void loadUserDetails_invalid_exception() {
+         expect(userRepository.getByOpenId(OPENID_INVALID)).andReturn(null);
+         replay(userRepository);
+         OpenIDAuthenticationToken postAuthToken = new 
OpenIDAuthenticationToken(OpenIDAuthenticationStatus.SUCCESS,OPENID_INVALID, 
+                       "Some message", new ArrayList<OpenIDAttribute>());
+         service.loadUserDetails(postAuthToken);
+         verify(userRepository);
+     }
 
 
     @Test

Modified: 
rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/model/JpaUser.java
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/model/JpaUser.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- 
rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/model/JpaUser.java
 (original)
+++ 
rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/model/JpaUser.java
 Wed Oct  3 20:54:07 2012
@@ -39,6 +39,7 @@ import java.util.*;
 @NamedQueries({
         @NamedQuery(name = JpaUser.USER_GET_BY_USERNAME, query = "select u 
from JpaUser u where u.username = :"+ JpaUser.PARAM_USERNAME),
         @NamedQuery(name = JpaUser.USER_GET_BY_USER_EMAIL, query = "select u 
from JpaUser u where u.email = :"+ JpaUser.PARAM_EMAIL),
+        @NamedQuery(name = JpaUser.USER_GET_BY_OPENID, query = "select u from 
JpaUser u where u.openId = :"+ JpaUser.PARAM_OPENID),
         @NamedQuery(name = JpaUser.USER_GET_ALL, query = "select u from 
JpaUser u order by u.username asc"),
         @NamedQuery(name = JpaUser.USER_GET_BY_FORGOT_PASSWORD_HASH, query = 
"select u from JpaUser u where u.forgotPasswordHash = :" + 
JpaUser.PARAM_FORGOT_PASSWORD_HASH),
         @NamedQuery(name = JpaUser.USER_COUNT_ALL, query = "select count(u) 
from JpaUser u"),
@@ -54,6 +55,7 @@ public class JpaUser extends JpaPerson i
 
     public static final String USER_GET_BY_USERNAME = "User.getByUsername";
     public static final String USER_GET_BY_USER_EMAIL = "User.getByUserEmail";
+    public static final String USER_GET_BY_OPENID = "User.getByOpenId";
     public static final String USER_GET_ALL = "User.getAll";
     public static final String USER_COUNT_ALL = "User.countAll";
     public static final String USER_FIND_BY_USERNAME_OR_EMAIL = 
"User.findByUsernameOrEmail";
@@ -65,6 +67,7 @@ public class JpaUser extends JpaPerson i
     public static final String PARAM_USERNAME = "username";
     public static final String PARAM_FORGOT_PASSWORD_HASH = 
"forgotPasswordHash";
     public static final String PARAM_EMAIL = "email";
+    public static final String PARAM_OPENID = "openId";
     public static final String PARAM_SEARCHTERM = "searchTerm";
     public static final String PARAM_WIDGET_ID = "widgetId";
 
@@ -85,7 +88,7 @@ public class JpaUser extends JpaPerson i
     @Column(name = "enabled")
     private boolean enabled;
 
-    @Basic
+       @Basic
     @Column(name = "openid")
     private String openId;
 

Modified: 
rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/repository/impl/JpaUserRepository.java
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/repository/impl/JpaUserRepository.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- 
rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/repository/impl/JpaUserRepository.java
 (original)
+++ 
rave/trunk/rave-components/rave-jpa/src/main/java/org/apache/rave/portal/repository/impl/JpaUserRepository.java
 Wed Oct  3 20:54:07 2012
@@ -61,6 +61,13 @@ public class JpaUserRepository implement
     }
 
     @Override
+    public User getByOpenId(String openId) {
+       TypedQuery<JpaUser> query = 
manager.createNamedQuery(JpaUser.USER_GET_BY_OPENID, JpaUser.class);
+        query.setParameter(JpaUser.PARAM_OPENID, openId);
+        return getSingleResult(query.getResultList());
+    }
+
+    @Override
     public List<User> getLimitedList(int offset, int pageSize) {
         TypedQuery<JpaUser> query = 
manager.createNamedQuery(JpaUser.USER_GET_ALL, JpaUser.class);
         return CollectionUtils.<User>toBaseTypedList(getPagedResultList(query, 
offset, pageSize));

Modified: 
rave/trunk/rave-components/rave-jpa/src/test/java/org/apache/rave/portal/repository/impl/JpaUserRepositoryTest.java
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-jpa/src/test/java/org/apache/rave/portal/repository/impl/JpaUserRepositoryTest.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- 
rave/trunk/rave-components/rave-jpa/src/test/java/org/apache/rave/portal/repository/impl/JpaUserRepositoryTest.java
 (original)
+++ 
rave/trunk/rave-components/rave-jpa/src/test/java/org/apache/rave/portal/repository/impl/JpaUserRepositoryTest.java
 Wed Oct  3 20:54:07 2012
@@ -50,10 +50,12 @@ public class JpaUserRepositoryTest {
     private EntityManager manager;
 
     private static final Long USER_ID = 1L;
+    private static final Long USER_ID_OPENID_USER = 13L;
     private static final String USER_NAME = "canonical";
 
     private static final Long INVALID_USER = -2L;
     private static final String USER_EMAIL = "[email protected]";
+    private static final String OPENID = "http://rave2011.myopenid.com/";;
     private static final Long VALID_WIDGET_ID = 1L;
 
     @Autowired
@@ -107,6 +109,15 @@ public class JpaUserRepositoryTest {
         assertThat(user.isAccountNonExpired(), is(true));
         assertThat(user.getEmail(), is(equalTo(USER_EMAIL)));
     }
+    
+    @Test
+    public void getByOpenId_valid() {
+        JpaUser user = (JpaUser)repository.getByOpenId(OPENID);
+        assertThat(user, notNullValue());
+        assertThat(user.getEntityId(), is(equalTo(USER_ID_OPENID_USER)));
+        assertThat(user.isAccountNonExpired(), is(true));
+        assertThat(user.getOpenId(), is(equalTo(OPENID)));
+    }
 
     @Test
     public void addOrDeleteUserDoesNotAffectAuthority() {

Modified: rave/trunk/rave-components/rave-jpa/src/test/resources/test_data.sql
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-jpa/src/test/resources/test_data.sql?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- rave/trunk/rave-components/rave-jpa/src/test/resources/test_data.sql 
(original)
+++ rave/trunk/rave-components/rave-jpa/src/test/resources/test_data.sql Wed 
Oct  3 20:54:07 2012
@@ -188,8 +188,8 @@ UPDATE RAVE_PORTAL_SEQUENCES SET seq_cou
 
 -- duplicate user id!!
 set @user_id_13 = (SELECT seq_count FROM RAVE_PORTAL_SEQUENCES WHERE seq_name 
= @user_seq);
-insert into person (entity_id, username, password, expired, locked, enabled, 
email, default_page_layout_id, dtype, family_name, given_name, status)
-values (@user_id_13, 'http://rave2011.myopenid.com/', 
'$2a$10$dML97.rnOn4.iSlEEdju8OCB2NckuKw0Ki5yMVzzMmWQsWMvym3qC', FALSE, FALSE, 
TRUE,'[email protected]', @three_col_id, 'User', 'Openid', 'Rave', 
'Single');
+insert into person (entity_id, username, password, expired, locked, enabled, 
email, default_page_layout_id, dtype, family_name, given_name, status, openid)
+values (@user_id_13, 'rave2011.myopenid.com', 
'$2a$10$dML97.rnOn4.iSlEEdju8OCB2NckuKw0Ki5yMVzzMmWQsWMvym3qC', FALSE, FALSE, 
TRUE,'[email protected]', @three_col_id, 'User', 'Openid', 'Rave', 
'Single', 'http://rave2011.myopenid.com/');
 UPDATE RAVE_PORTAL_SEQUENCES SET seq_count = (seq_count + 1) WHERE seq_name = 
@user_seq;
 
 --- end user data ---

Modified: 
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/NewAccountController.java
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/NewAccountController.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- 
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/NewAccountController.java
 (original)
+++ 
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/NewAccountController.java
 Wed Oct  3 20:54:07 2012
@@ -19,6 +19,9 @@
 
 package org.apache.rave.portal.web.controller;
 
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.rave.portal.model.User;
 import org.apache.rave.portal.model.impl.UserImpl;
 import org.apache.rave.portal.service.CaptchaService;
 import org.apache.rave.portal.service.NewAccountService;
@@ -40,8 +43,6 @@ import org.springframework.web.bind.anno
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
-import javax.servlet.http.HttpServletRequest;
-
 @Controller
 public class NewAccountController {
     private final Logger logger = LoggerFactory.getLogger(getClass());
@@ -53,7 +54,6 @@ public class NewAccountController {
     @Value("#{messages['page.newaccount.message.created']}")
     private String messageSuccess;
 
-
     @Autowired
     public NewAccountController(NewAccountService newAccountService, 
NewAccountValidator newAccountValidator, CaptchaService captchaService) {
         this.newAccountService = newAccountService;
@@ -68,7 +68,7 @@ public class NewAccountController {
         model.addAttribute(ModelKeys.NEW_USER, new UserImpl());
         return ViewNames.NEW_ACCOUNT;
     }
-
+    
     @RequestMapping(value = {"/newaccount", "/newaccount/*"}, method = 
RequestMethod.POST)
     public String create(@ModelAttribute(value = "newUser") UserForm newUser, 
BindingResult results, Model model, HttpServletRequest request,  
RedirectAttributes redirectAttributes) {
         logger.debug("Creating a new user account");
@@ -116,6 +116,15 @@ public class NewAccountController {
 
     }
 
+    @RequestMapping(value = "/openidregister", method = RequestMethod.GET)
+    public String setUpOpenIdForm(ModelMap model, HttpServletRequest request) {
+        logger.debug("Initializing account creation form");
+        User user = (User) 
request.getSession(false).getAttribute(ModelKeys.NEW_USER);
+        model.addAttribute(ModelKeys.CAPTCHA_HTML, 
captchaService.createHtml(request));
+        model.addAttribute(ModelKeys.NEW_USER, user);
+        return ViewNames.NEW_ACCOUNT;
+    }
+
     private void initializeCaptcha(Model model, HttpServletRequest request) {
         model.addAttribute(ModelKeys.CAPTCHA_HTML, 
captchaService.createHtml(request));
     }

Added: 
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandler.java
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandler.java?rev=1393757&view=auto
==============================================================================
--- 
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandler.java
 (added)
+++ 
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandler.java
 Wed Oct  3 20:54:07 2012
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.rave.portal.web.controller.handler;
+
+import java.io.IOException;
+import java.util.List;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.rave.portal.model.User;
+import org.apache.rave.portal.model.impl.UserImpl;
+import org.apache.rave.portal.web.util.ModelKeys;
+import org.apache.rave.portal.web.util.ViewNames;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.openid.OpenIDAttribute;
+import org.springframework.security.openid.OpenIDAuthenticationStatus;
+import org.springframework.security.openid.OpenIDAuthenticationToken;
+import org.springframework.security.web.DefaultRedirectStrategy;
+import 
org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
+import org.springframework.stereotype.Controller;
+
+/**
+ * Controller which processes openid authentication failure. If the user 
record for particular
+ * openid user is not found in the DB, it redirects to the account creation 
page. Otherwise
+ * it redirects to the default authentication failure page.
+ * 
+ */
+@Controller
+public class OpenIDAuthenticationFailureHandler extends        
SimpleUrlAuthenticationFailureHandler {
+
+       private static Logger log = 
LoggerFactory.getLogger(OpenIDAuthenticationFailureHandler.class);
+
+       @Override
+    public void onAuthenticationFailure(HttpServletRequest request, 
HttpServletResponse response, AuthenticationException exception) throws 
IOException, ServletException {
+               if(exception instanceof UsernameNotFoundException
+                       && exception.getAuthentication() instanceof 
OpenIDAuthenticationToken
+            && 
((OpenIDAuthenticationToken)exception.getAuthentication()).getStatus().equals(OpenIDAuthenticationStatus.SUCCESS))
 {
+                       
+                       OpenIDAuthenticationToken token = 
(OpenIDAuthenticationToken)exception.getAuthentication();
+                       String url = token.getIdentityUrl();
+                       User user = createTemporaryUser(token, url);
+                       
request.getSession(true).setAttribute(ModelKeys.NEW_USER, user);
+
+                       DefaultRedirectStrategy redirectStrategy = new 
DefaultRedirectStrategy();
+                       log.info("Redirecting to new user account creation 
page");
+                       super.setRedirectStrategy(redirectStrategy);
+                       redirectStrategy.sendRedirect(request, response, 
"/"+ViewNames.CREATE_ACCOUNT_PAGE);
+                       return;
+               } else {
+                       super.onAuthenticationFailure(request, response, 
exception);
+               }
+       }
+
+       private User createTemporaryUser(OpenIDAuthenticationToken token,
+                       final String openId) {
+               final List<OpenIDAttribute> attributes = token.getAttributes();
+               String email = null;
+               String firstName = null;
+               String lastName = null;
+               String displayName = null;
+               for (OpenIDAttribute attribute : attributes) {
+                       if ("email".equals(attribute.getName())
+                                       && !attribute.getValues().isEmpty()) {
+                               email = attribute.getValues().get(0);
+                       } else if ("firstname".equals(attribute.getName())
+                                       && !attribute.getValues().isEmpty()) {
+                               firstName = attribute.getValues().get(0);
+                       } else if ("lastname".equals(attribute.getName())
+                                       && !attribute.getValues().isEmpty()) {
+                               lastName = attribute.getValues().get(0);
+                       } else if ("fullname".equals(attribute.getName())
+                                       && !attribute.getValues().isEmpty()) {
+                               displayName = attribute.getValues().get(0);
+                       }
+               }
+               User user = new UserImpl();
+               String username = StringUtils.substringAfter(openId, 
"://").replace("/", "");
+               if (username.length() > 35) {
+                       username = username.substring(0, 35);
+               }
+               if (displayName == null && firstName != null && lastName != 
null) {
+                       displayName = firstName + " " + lastName;
+               }
+               user.setUsername(username);
+               user.setEmail(email);
+               user.setGivenName(firstName);
+               user.setFamilyName(lastName);
+               user.setDisplayName(displayName);
+               user.setOpenId(openId);
+
+               return user;
+       }
+}

Modified: 
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- 
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java
 (original)
+++ 
rave/trunk/rave-components/rave-web/src/main/java/org/apache/rave/portal/web/util/ViewNames.java
 Wed Oct  3 20:54:07 2012
@@ -62,6 +62,7 @@ public final class ViewNames {
     public static final String REDIRECT = "redirect:/";
 
     public static final String LOGIN_PAGE = "login";
+    public static final String CREATE_ACCOUNT_PAGE = "app/openidregister";
     public static final String REDIRECT_LOGIN = REDIRECT +LOGIN_PAGE;
 
     public static final String POSTS_TAG_PAGE = "postsTagPage";

Modified: 
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/NewAccountControllerTest.java
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/NewAccountControllerTest.java?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- 
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/NewAccountControllerTest.java
 (original)
+++ 
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/NewAccountControllerTest.java
 Wed Oct  3 20:54:07 2012
@@ -19,6 +19,14 @@
 
 package org.apache.rave.portal.web.controller;
 
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertThat;
+
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.rave.portal.model.User;
 import org.apache.rave.portal.model.impl.UserImpl;
 import org.apache.rave.portal.service.CaptchaService;
@@ -39,12 +47,6 @@ import org.springframework.validation.Bi
 import org.springframework.validation.ObjectError;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.easymock.EasyMock.*;
-import static org.junit.Assert.assertThat;
-
 
 /**
  * This is a test class for NewAccountController, which is used to make new 
user accounts through

Added: 
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandlerTest.java
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandlerTest.java?rev=1393757&view=auto
==============================================================================
--- 
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandlerTest.java
 (added)
+++ 
rave/trunk/rave-components/rave-web/src/test/java/org/apache/rave/portal/web/controller/handler/OpenIDAuthenticationFailureHandlerTest.java
 Wed Oct  3 20:54:07 2012
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.rave.portal.web.controller.handler;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import javax.servlet.ServletException;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.openid.OpenIDAttribute;
+import org.springframework.security.openid.OpenIDAuthenticationStatus;
+import org.springframework.security.openid.OpenIDAuthenticationToken;
+
+public class OpenIDAuthenticationFailureHandlerTest {
+    private MockHttpServletRequest request;
+    private MockHttpServletResponse response;
+    private OpenIDAuthenticationFailureHandler handler;
+    private OpenIDAuthenticationToken postAuthToken;
+    private AuthenticationException authException;
+
+    private final String MESSAGE = "Successfully authenticated";
+    private final String NON_REGISTERED_OPENID_USER = 
"http://someone.myopenid.com/";;
+    private final String REDIRECT_URL = "/app/openidregister";
+    
+    private final Logger logger = 
LoggerFactory.getLogger(OpenIDAuthenticationFailureHandlerTest.class);
+    
+
+    @Before
+    public void setup() {        
+        request = new MockHttpServletRequest();
+        response = new MockHttpServletResponse();
+        handler = new OpenIDAuthenticationFailureHandler();
+        postAuthToken = new 
OpenIDAuthenticationToken(OpenIDAuthenticationStatus.SUCCESS,NON_REGISTERED_OPENID_USER,
 
+                       MESSAGE, new ArrayList<OpenIDAttribute>());
+        authException = new UsernameNotFoundException("");
+}
+
+    
+    @SuppressWarnings("deprecation")
+       @Test
+    public void authenticationFailureRedirectTest() {        
+        try {
+               authException.setAuthentication(postAuthToken);
+                       handler.onAuthenticationFailure(request, response, 
authException);
+               } catch (IOException e) {
+                       logger.debug("IOException on Authentication Failure");
+               } catch (ServletException e) {
+                       logger.debug("ServletException on Authentication 
Failure");
+               }
+        assertTrue(authException.getAuthentication() instanceof 
OpenIDAuthenticationToken);
+        
assertTrue(((OpenIDAuthenticationToken)authException.getAuthentication()).getStatus().equals(OpenIDAuthenticationStatus.SUCCESS));
+        
assertEquals(((OpenIDAuthenticationToken)authException.getAuthentication()).getMessage(),
 MESSAGE);
+        assertEquals(response.getRedirectedUrl(),REDIRECT_URL);
+    }
+}
\ No newline at end of file

Modified: 
rave/trunk/rave-portal-resources/src/main/resources/messages.properties
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/resources/messages.properties?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- rave/trunk/rave-portal-resources/src/main/resources/messages.properties 
(original)
+++ rave/trunk/rave-portal-resources/src/main/resources/messages.properties Wed 
Oct  3 20:54:07 2012
@@ -55,6 +55,7 @@ page.general.confirmpassword=Confirm pas
 page.general.deletepage=Delete Page
 page.general.editpage=Edit Page
 page.general.email=Email address:
+page.general.openid=OpenID URL:
 page.general.empty=Add widgets to this page
 page.general.non.editing.empty=There are currently no widgets on this page.
 page.general.logout=Logout

Modified: 
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/applicationContext-security.xml
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/applicationContext-security.xml?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- 
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/applicationContext-security.xml
 (original)
+++ 
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/applicationContext-security.xml
 Wed Oct  3 20:54:07 2012
@@ -32,7 +32,8 @@
         <security:intercept-url pattern="/static/**" access="permitAll"/>
         <security:intercept-url pattern="/login" access="permitAll"/>
         <security:intercept-url pattern="/newaccount.jsp*" access="permitAll"/>
-        <security:intercept-url pattern="/app/newaccount*" access="permitAll"/>
+               <security:intercept-url pattern="/app/newaccount*" 
access="permitAll"/>
+               <security:intercept-url pattern="/app/openidregister*" 
access="permitAll"/>
         <security:intercept-url pattern="/app/newpassword/**" 
access="permitAll"/>
         <security:intercept-url pattern="/app/retrieveusername/**" 
access="permitAll"/>
         <security:intercept-url pattern="/app/changepassword/**" 
access="permitAll"/>
@@ -40,13 +41,25 @@
         <security:intercept-url pattern="/app/admin/**" 
access="hasRole('ROLE_ADMIN')"/>
         <!-- all urls must be authenticated -->
         <security:intercept-url pattern="/**" 
access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/>
-        <security:openid-login user-service-ref="userService" 
authentication-failure-url="/login?authfail=openid">
-            <security:attribute-exchange>
-                <!-- Supported by MyOpenID.com -->
-                <security:openid-attribute name="firstName" 
type="http://schema.openid.net/namePerson/first"/>
-                <security:openid-attribute name="lastName" 
type="http://schema.openid.net/namePerson/last"/>
-                <security:openid-attribute name="email" 
type="http://schema.openid.net/contact/email"; required="true"/>
+        <security:openid-login user-service-ref="userService" 
authentication-failure-handler-ref="openIdAuthFailureHandler">
+            <security:attribute-exchange 
identifier-match="https://www.google.com.*";>
+                <security:openid-attribute name="email" 
type="http://axschema.org/contact/email"; required="true" count="1"/>
+                <security:openid-attribute name="firstname" 
type="http://axschema.org/namePerson/first"; required="true"/>
+                <security:openid-attribute name="lastname" 
type="http://axschema.org/namePerson/last"; required="true"/>
             </security:attribute-exchange>
+            <security:attribute-exchange 
identifier-match=".*openid-provider.appspot.com.*">
+                <security:openid-attribute name="email" 
type="http://axschema.org/contact/email"; required="true" count="1"/>
+                <security:openid-attribute name="firstname" 
type="http://axschema.org/namePerson/first"; required="true"/>
+                <security:openid-attribute name="lastname" 
type="http://axschema.org/namePerson/last"; required="true"/>
+            </security:attribute-exchange>
+            <security:attribute-exchange identifier-match=".*yahoo.com.*">
+                <security:openid-attribute name="email" 
type="http://axschema.org/contact/email"; required="true"/>
+                <security:openid-attribute name="fullname" 
type="http://axschema.org/namePerson"; required="true"/>
+            </security:attribute-exchange>
+            <security:attribute-exchange identifier-match=".*myopenid.com.*">
+                <security:openid-attribute name="email" 
type="http://schema.openid.net/contact/email"; required="true" count="1"/>
+                <security:openid-attribute name="fullname" 
type="http://schema.openid.net/namePerson"; required="true"/>
+             </security:attribute-exchange>
         </security:openid-login>
         <security:form-login login-page="/login" default-target-url="/" 
authentication-failure-url="/login?authfail=form" />
         <security:logout/>
@@ -78,6 +91,11 @@
         <constructor-arg name="displayNameAttributeName" value="displayName"/>
         <constructor-arg name="pageLayoutCode" value="columns_3"/>
     </bean>
+    
+    <bean id="openIdAuthFailureHandler" 
class="org.apache.rave.portal.web.controller.handler.OpenIDAuthenticationFailureHandler">
+       <property name="defaultFailureUrl" value="/login?authfail=openid"/>
+    </bean>
+    
 
     <!-- enable the spring security annotations -->
     <security:global-method-security secured-annotations="enabled" 
pre-post-annotations="enabled">

Modified: 
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/db/initial_data.sql
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/db/initial_data.sql?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- 
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/db/initial_data.sql 
(original)
+++ 
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/db/initial_data.sql 
Wed Oct  3 20:54:07 2012
@@ -181,8 +181,8 @@ UPDATE RAVE_PORTAL_SEQUENCES SET seq_cou
 
 -- duplicate user id!!
 set @user_id_13 = (SELECT seq_count FROM RAVE_PORTAL_SEQUENCES WHERE seq_name 
= @user_seq);
-insert into person (entity_id, username, password, expired, locked, enabled, 
email, default_page_layout_id, dtype, family_name, given_name, status)
-values (@user_id_13, 'http://rave2011.myopenid.com/', 
'$2a$10$dML97.rnOn4.iSlEEdju8OCB2NckuKw0Ki5yMVzzMmWQsWMvym3qC', FALSE, FALSE, 
TRUE,'[email protected]', @three_col_id, 'User', 'OpenId', 'Rave', 
'Single');
+insert into person (entity_id, username, password, expired, locked, enabled, 
email, default_page_layout_id, dtype, family_name, given_name, status, openid)
+values (@user_id_13, 'rave2011.myopenid.com', 
'$2a$10$dML97.rnOn4.iSlEEdju8OCB2NckuKw0Ki5yMVzzMmWQsWMvym3qC', FALSE, FALSE, 
TRUE,'[email protected]', @three_col_id, 'User', 'OpenId', 'Rave', 
'Single', 'http://rave2011.myopenid.com/');
 UPDATE RAVE_PORTAL_SEQUENCES SET seq_count = (seq_count + 1) WHERE seq_name = 
@user_seq;
 
 -- end user data --

Modified: 
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/includes/new_user_form.jsp
URL: 
http://svn.apache.org/viewvc/rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/includes/new_user_form.jsp?rev=1393757&r1=1393756&r2=1393757&view=diff
==============================================================================
--- 
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/includes/new_user_form.jsp
 (original)
+++ 
rave/trunk/rave-portal-resources/src/main/webapp/WEB-INF/jsp/views/includes/new_user_form.jsp
 Wed Oct  3 20:54:07 2012
@@ -58,6 +58,14 @@
                 <form:errors path="email" cssClass="error"/>
             </div>
         </div>
+        
+        <div class="control-group">
+            <label class="control-label" for="openIdField"><fmt:message 
key="page.general.openid"/></label>
+            <div class="controls">
+                <form:input id="openIdField" path="openId"/>
+                <form:errors path="openId" cssClass="error"/>
+            </div>
+        </div>
 
         <div class="control-group">
             <label class="control-label" for="pageLayoutField"><fmt:message 
key="page.general.addpage.selectlayout"/></label>


Reply via email to