/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.vertical.adminweb; import java.io.UnsupportedEncodingException; import java.util.Locale; import java.util.Properties; import org.joda.time.DateMidnight; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockHttpSession; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import com.enonic.esl.util.DateUtil; import com.enonic.cms.api.client.model.user.Gender; import com.enonic.cms.api.plugin.ext.userstore.RemoteUser; import com.enonic.cms.api.plugin.ext.userstore.UserFieldType; import com.enonic.cms.api.plugin.ext.userstore.UserFields; import com.enonic.cms.api.plugin.ext.userstore.UserStoreConfig; import com.enonic.cms.api.plugin.ext.userstore.UserStoreConfigField; import com.enonic.cms.core.config.ConfigProperties; import com.enonic.cms.core.security.AdminSecurityHolder; import com.enonic.cms.core.security.SecurityService; import com.enonic.cms.core.security.user.StoreNewUserCommand; import com.enonic.cms.core.security.user.UserEntity; import com.enonic.cms.core.security.user.UserKey; import com.enonic.cms.core.security.user.UserType; import com.enonic.cms.core.security.userstore.MemberOfResolver; import com.enonic.cms.core.security.userstore.StoreNewUserStoreCommand; import com.enonic.cms.core.security.userstore.UserStoreKey; import com.enonic.cms.core.security.userstore.UserStoreService; import com.enonic.cms.core.security.userstore.connector.config.UserStoreConnectorConfigLoader; import com.enonic.cms.core.security.userstore.connector.synchronize.SynchronizeUserStoreJob; import com.enonic.cms.core.security.userstore.connector.synchronize.SynchronizeUserStoreJobFactory; import com.enonic.cms.core.security.userstore.connector.synchronize.SynchronizeUserStoreType; import com.enonic.cms.core.servlet.ServletRequestAccessor; import com.enonic.cms.itest.AbstractSpringTest; import com.enonic.cms.itest.userstore.MemUserDatabase; import com.enonic.cms.itest.util.DomainFixture; import com.enonic.cms.store.dao.UserStoreDao; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; public class UserHandlerServlet_remoteUserStoreTest extends AbstractSpringTest { @Autowired private UserStoreDao userStoreDao; @Autowired private SecurityService securityService; @Autowired private UserStoreService userStoreService; @Autowired private MemberOfResolver memberOfResolver; @Autowired private UserStoreConnectorConfigLoader userStoreConnectorConfigLoader; @Autowired private SynchronizeUserStoreJobFactory synchronizeUserStoreJobFactory; @Autowired private MemUserDatabase userDatabase; @Autowired private DomainFixture fixture; private ConfigProperties properties; private MockHttpServletRequest request = new MockHttpServletRequest(); private MockHttpServletResponse response = new MockHttpServletResponse(); private MockHttpSession session = new MockHttpSession(); private UserHandlerServlet userHandlerServlet; private final static String DEFAULT_USERSTORE_NAME = "myRemoteUserStore"; @Before public void setUp() throws Exception { request = createAndSetupMockHttpServletRequest(); fixture.initSystemData(); userHandlerServlet = new UserHandlerServlet(); userHandlerServlet.setUserStoreDao( userStoreDao ); userHandlerServlet.setSecurityService( securityService ); userHandlerServlet.setUserStoreService( userStoreService ); userHandlerServlet.setMemberOfResolver( memberOfResolver ); // setup vertical properties properties = new ConfigProperties(); setPropertiesForRemoteUserStoreConnector( DEFAULT_USERSTORE_NAME, properties ); userStoreConnectorConfigLoader.setProperties( properties ); this.userDatabase.clear(); } @Test public void update_given_fields_that_are_local_in_remote_userStore_with_some_value() throws Exception { // setup: userstore UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.FIRST_NAME, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.LAST_NAME, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.INITIALS, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.HOME_PAGE, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.ORGANIZATION, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.LOCALE, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.GENDER, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.HTML_EMAIL, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.BIRTHDAY, "" ) ); createRemoteUserStore( DEFAULT_USERSTORE_NAME, true, userStoreConfig ); fixture.flushAndClearHibernateSession(); // setup: create user UserFields userFields = new UserFields(); userFields.setFirstName( "First name" ); userFields.setLastName( "Last name" ); userFields.setInitials( "INI" ); userFields.setBirthday( DateUtil.parseDate( "12.12.2012" ) ); userFields.setOrganization( "Java Mafia" ); userFields.setHomePage( "http://www.homepage.com" ); userFields.setLocale( Locale.FRENCH ); userFields.setGender( Gender.FEMALE ); userFields.setHtmlEmail( true ); createNormalUser( "testuser", DEFAULT_USERSTORE_NAME, userFields ); // setup: verify user userFields = fixture.findUserByName( "testuser" ).getUserFields(); assertNotNull( userFields.getBirthday() ); assertEquals( "12.12.2012", DateUtil.formatDate( userFields.getBirthday() ) ); assertEquals( "INI", userFields.getInitials() ); assertEquals( new DateMidnight( 2012, 12, 12 ).toDate(), userFields.getBirthday() ); assertEquals( "http://www.homepage.com", userFields.getHomePage() ); assertEquals( "Java Mafia", userFields.getOrganization() ); assertEquals( Locale.FRENCH, userFields.getLocale() ); assertEquals( Gender.FEMALE, userFields.getGender() ); assertEquals( Boolean.TRUE, userFields.getHtmlEmail() ); loginAdminUser( "testuser" ); // exercise: update user applyParametersForUpdate( request ); applyParametersForUser( fixture.findUserByName( "testuser" ), request ); request.setParameter( "email", "testuser@example.com" ); request.setParameter( "first_name", "First name changed" ); request.setParameter( "last_name", "Last name changed" ); request.setParameter( "initials", "Initials changed" ); request.setParameter( "organization", "Organization" ); request.setParameter( "home_page", "http://www.otherpage.com" ); request.setParameter( "gender", "female" ); request.setParameter( "html_email", "on" ); // small trick: sending on instead of true, because true is converted to a Boolean request.setParameter( "locale", "es" ); request.setParameter( "birthday", "14.05.2012" ); userHandlerServlet.doGet( request, response ); // verify userFields = fixture.findUserByName( "testuser" ).getUserFields(); assertEquals( "Initials changed", userFields.getInitials() ); assertEquals( "Last name changed", userFields.getLastName() ); assertEquals( "First name changed", userFields.getFirstName() ); assertEquals( "http://www.otherpage.com", userFields.getHomePage() ); assertEquals( new DateMidnight( 2012, 5, 14 ).toDate(), userFields.getBirthday() ); assertEquals( "Organization", userFields.getOrganization() ); assertEquals( new Locale( "es" ), userFields.getLocale() ); assertEquals( Gender.FEMALE, userFields.getGender() ); assertEquals( Boolean.TRUE, userFields.getHtmlEmail() ); } @Test public void update_given_fields_with_some_value() throws Exception { // setup: userstore UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.FIRST_NAME, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.LAST_NAME, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.INITIALS, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.HOME_PAGE, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.ORGANIZATION, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.LOCALE, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.GENDER, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.HTML_EMAIL, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.BIRTHDAY, "" ) ); createRemoteUserStore( DEFAULT_USERSTORE_NAME, true, userStoreConfig ); fixture.flushAndClearHibernateSession(); // setup: create user UserFields userFields = new UserFields(); userFields.setFirstName( "First name" ); userFields.setLastName( "Last name" ); userFields.setInitials( "INI" ); userFields.setBirthday( DateUtil.parseDate( "12.12.2012" ) ); userFields.setOrganization( "Java Mafia" ); userFields.setHomePage( "http://www.homepage.com" ); userFields.setLocale( Locale.FRENCH ); userFields.setGender( Gender.FEMALE ); userFields.setHtmlEmail( true ); createNormalUser( "testuser", DEFAULT_USERSTORE_NAME, userFields ); // setup: verify user userFields = fixture.findUserByName( "testuser" ).getUserFields(); assertNotNull( userFields.getBirthday() ); assertEquals( "12.12.2012", DateUtil.formatDate( userFields.getBirthday() ) ); assertEquals( "INI", userFields.getInitials() ); assertEquals( new DateMidnight( 2012, 12, 12 ).toDate(), userFields.getBirthday() ); assertEquals( "http://www.homepage.com", userFields.getHomePage() ); assertEquals( "Java Mafia", userFields.getOrganization() ); assertEquals( Locale.FRENCH, userFields.getLocale() ); assertEquals( Gender.FEMALE, userFields.getGender() ); assertEquals( Boolean.TRUE, userFields.getHtmlEmail() ); loginAdminUser( "testuser" ); // exercise: update user applyParametersForUpdate( request ); applyParametersForUser( fixture.findUserByName( "testuser" ), request ); request.setParameter( "email", "testuser@example.com" ); request.setParameter( "first_name", "First name changed" ); request.setParameter( "last_name", "Last name changed" ); request.setParameter( "initials", "Initials changed" ); request.setParameter( "organization", "Organization" ); request.setParameter( "home_page", "http://www.otherpage.com" ); request.setParameter( "gender", "female" ); request.setParameter( "html_email", "on" ); // small trick: sending on instead of true, because true is converted to a Boolean request.setParameter( "locale", "es" ); request.setParameter( "birthday", "14.05.2012" ); userHandlerServlet.doGet( request, response ); // verify userFields = fixture.findUserByName( "testuser" ).getUserFields(); assertEquals( "Initials changed", userFields.getInitials() ); assertEquals( "Last name changed", userFields.getLastName() ); assertEquals( "First name changed", userFields.getFirstName() ); assertEquals( "http://www.otherpage.com", userFields.getHomePage() ); assertEquals( new DateMidnight( 2012, 5, 14 ).toDate(), userFields.getBirthday() ); assertEquals( "Organization", userFields.getOrganization() ); assertEquals( new Locale( "es" ), userFields.getLocale() ); assertEquals( Gender.FEMALE, userFields.getGender() ); assertEquals( Boolean.TRUE, userFields.getHtmlEmail() ); } @Test public void update_given_html_email_field_with_false_value() throws Exception { // setup: userstore UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.FIRST_NAME, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.LAST_NAME, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.HTML_EMAIL, "" ) ); createRemoteUserStore( DEFAULT_USERSTORE_NAME, true, userStoreConfig ); fixture.flushAndClearHibernateSession(); // setup: create user UserFields userFields = new UserFields(); userFields.setFirstName( "First name" ); userFields.setLastName( "Last name" ); userFields.setHtmlEmail( true ); createNormalUser( "testuser", DEFAULT_USERSTORE_NAME, userFields ); // setup: verify user userFields = fixture.findUserByName( "testuser" ).getUserFields(); assertEquals( Boolean.TRUE, userFields.getHtmlEmail() ); loginAdminUser( "testuser" ); // exercise: update user without sending html_email applyParametersForUpdate( request ); applyParametersForUser( fixture.findUserByName( "testuser" ), request ); request.setParameter( "email", "testuser@example.com" ); request.setParameter( "first_name", "First name changed" ); request.setParameter( "last_name", "Last name changed" ); userHandlerServlet.doGet( request, response ); // verify userFields = fixture.findUserByName( "testuser" ).getUserFields(); assertEquals( "Last name changed", userFields.getLastName() ); assertEquals( "First name changed", userFields.getFirstName() ); assertEquals( Boolean.FALSE, userFields.getHtmlEmail() ); } @Test public void update_given_user_field_with_empty_value() throws Exception { // setup: userstore UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.FIRST_NAME, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.LAST_NAME, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.INITIALS, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.HOME_PAGE, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.ORGANIZATION, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.LOCALE, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.GENDER, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.HTML_EMAIL, "" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.BIRTHDAY, "" ) ); createRemoteUserStore( DEFAULT_USERSTORE_NAME, true, userStoreConfig ); fixture.flushAndClearHibernateSession(); // setup: create user UserFields userFields = new UserFields(); userFields.setFirstName( "First name" ); userFields.setLastName( "Last name" ); userFields.setInitials( "INI" ); userFields.setBirthday( DateUtil.parseDate( "12.12.2012" ) ); userFields.setOrganization( "Java Mafia" ); userFields.setHomePage( "http://www.homepage.com" ); userFields.setLocale( Locale.FRENCH ); userFields.setGender( Gender.FEMALE ); userFields.setHtmlEmail( true ); createNormalUser( "testuser", DEFAULT_USERSTORE_NAME, userFields ); // setup: verify user userFields = fixture.findUserByName( "testuser" ).getUserFields(); assertNotNull( userFields.getBirthday() ); assertEquals( "12.12.2012", DateUtil.formatDate( userFields.getBirthday() ) ); assertEquals( "INI", userFields.getInitials() ); assertEquals( new DateMidnight( 2012, 12, 12 ).toDate(), userFields.getBirthday() ); assertEquals( "http://www.homepage.com", userFields.getHomePage() ); assertEquals( "Java Mafia", userFields.getOrganization() ); assertEquals( Locale.FRENCH, userFields.getLocale() ); assertEquals( Gender.FEMALE, userFields.getGender() ); assertEquals( Boolean.TRUE, userFields.getHtmlEmail() ); loginAdminUser( "testuser" ); // exercise: update user applyParametersForUpdate( request ); applyParametersForUser( fixture.findUserByName( "testuser" ), request ); request.setParameter( "email", "testuser@example.com" ); request.setParameter( "first_name", "First name changed" ); request.setParameter( "last_name", "Last name changed" ); request.setParameter( "initials", "" ); request.setParameter( "organization", "" ); request.setParameter( "home_page", "" ); request.setParameter( "gender", "" ); request.setParameter( "html_email", "" ); request.setParameter( "locale", "" ); request.setParameter( "birthday", "" ); userHandlerServlet.doGet( request, response ); // verify userFields = fixture.findUserByName( "testuser" ).getUserFields(); assertEquals( "Last name changed", userFields.getLastName() ); assertEquals( "First name changed", userFields.getFirstName() ); assertEquals( "", userFields.getInitials() ); assertEquals( "", userFields.getHomePage() ); assertEquals( "", userFields.getOrganization() ); assertEquals( null, userFields.getBirthday() ); assertEquals( null, userFields.getLocale() ); assertEquals( null, userFields.getGender() ); assertEquals( Boolean.FALSE, userFields.getHtmlEmail() ); } @Test public void update_given_changed_userField_which_is_local_and_remote_fields_have_same_value_when_userPolicy_is_not_update_policy_then_field_should_be_updated() throws Exception { // Creating test user in remote userstore final RemoteUser user = new RemoteUser( "testuser" ); user.setSync( "testuser" ); user.setEmail( "testuser@example.com" ); user.getUserFields().setFirstName( "First name" ); user.getUserFields().setLastName( "Last name" ); user.getUserFields().setDescription( null ); this.userDatabase.addUser( user ); properties.setProperty( "cms.userstore.connector." + DEFAULT_USERSTORE_NAME + "." + "userPolicy", "" ); properties.setProperty( "cms.userstore.connector." + DEFAULT_USERSTORE_NAME + "." + "groupPolicy", "read" ); // setup: userstore UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.FIRST_NAME, "remote" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.LAST_NAME, "remote" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.TITLE, "local" ) ); userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.DESCRIPTION, "remote" ) ); createRemoteUserStore( DEFAULT_USERSTORE_NAME, true, userStoreConfig ); fixture.flushAndClearHibernateSession(); // setup: synch synchronizeUserStore( DEFAULT_USERSTORE_NAME, SynchronizeUserStoreType.USERS_ONLY ); // setup: verify user UserFields userFields = fixture.findUserByName( "testuser" ).getUserFields(); assertEquals( "First name", userFields.getFirstName() ); assertEquals( "Last name", userFields.getLastName() ); assertEquals( null, userFields.getTitle() ); assertEquals( null, userFields.getDescription() ); loginAdminUser( "testuser" ); // exercise: update user having only title changing value applyParametersForUpdate( request ); applyParametersForUser( fixture.findUserByName( "testuser" ), request ); request.setParameter( "email", "testuser@example.com" ); request.setParameter( "first_name", "First name" ); request.setParameter( "last_name", "Last name" ); request.setParameter( "title", "Title changed" ); request.setParameter( "description", "" ); userHandlerServlet.doGet( request, response ); // verify: title was changed userFields = fixture.findUserByName( "testuser" ).getUserFields(); assertEquals( "Last name", userFields.getLastName() ); assertEquals( "First name", userFields.getFirstName() ); assertEquals( "Title changed", userFields.getTitle() ); assertEquals( null, userFields.getDescription() ); } private UserStoreConfigField createUserStoreUserFieldConfig( UserFieldType type, String properties ) { UserStoreConfigField fieldConfig = new UserStoreConfigField( type ); fieldConfig.setRemote( properties.contains( "remote" ) ); fieldConfig.setReadOnly( properties.contains( "read-only" ) ); fieldConfig.setRequired( properties.contains( "required" ) ); fieldConfig.setIso( properties.contains( "iso" ) ); return fieldConfig; } private void loginAdminUser( String userName ) { AdminSecurityHolder.setUser( fixture.findUserByName( userName ).getKey() ); } private MockHttpServletRequest createAndSetupMockHttpServletRequest() throws UnsupportedEncodingException { final MockHttpServletRequest request = new MockHttpServletRequest(); request.setMethod( "POST" ); request.setRemoteAddr( "127.0.0.1" ); ServletRequestAccessor.setRequest( request ); RequestContextHolder.setRequestAttributes( new ServletRequestAttributes( request ) ); request.setSession( session ); return request; } private UserStoreKey createRemoteUserStore( String name, boolean defaultStore, UserStoreConfig config ) { StoreNewUserStoreCommand command = new StoreNewUserStoreCommand(); command.setStorer( fixture.findUserByName( "admin" ).getKey() ); command.setName( name ); command.setDefaultStore( defaultStore ); command.setConfig( config ); command.setConnectorName( name ); return userStoreService.storeNewUserStore( command ); } private UserKey createNormalUser( String userName, String userStoreName, UserFields userFields ) { StoreNewUserCommand command = new StoreNewUserCommand(); command.setStorer( fixture.findUserByName( "admin" ).getKey() ); command.setUsername( userName ); command.setUserStoreKey( fixture.findUserStoreByName( userStoreName ).getKey() ); command.setAllowAnyUserAccess( true ); command.setEmail( userName + "@example.com" ); command.setPassword( "password" ); command.setType( UserType.NORMAL ); command.setDisplayName( userName ); command.setUserFields( userFields ); return userStoreService.storeNewUser( command ); } private void applyParametersForUpdate( MockHttpServletRequest request ) { request.setParameter( "op", "update" ); request.setParameter( "page", "700" ); } private void applyParametersForUser( UserEntity user, MockHttpServletRequest request ) { request.setParameter( "userstorekey", user.getUserStore().getKey().toString() ); request.setParameter( "uid_dummy", user.getName() ); } private void setPropertiesForRemoteUserStoreConnector( String connectorName, Properties properties ) { properties.setProperty( "cms.userstore.connector." + connectorName + ".userPolicy", "all" ); properties.setProperty( "cms.userstore.connector." + connectorName + ".groupPolicy", "all" ); properties.setProperty( "cms.userstore.connector." + connectorName + ".plugin", "mem" ); } private SynchronizeUserStoreJob synchronizeUserStore( String userStoreName, SynchronizeUserStoreType type ) { final SynchronizeUserStoreJob job = synchronizeUserStoreJobFactory.createSynchronizeUserStoreJob( fixture.findUserStoreByName( userStoreName ).getKey(), type, 100 ); job.start(); fixture.flushAndClearHibernateSession(); return job; } }