/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.itest.client; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.mock.web.MockHttpServletRequest; import com.enonic.cms.api.client.ClientException; import com.enonic.cms.api.plugin.ext.userstore.RemoteUser; import com.enonic.cms.api.plugin.ext.userstore.UserStoreConfig; import com.enonic.cms.core.client.InternalClient; import com.enonic.cms.core.config.ConfigProperties; import com.enonic.cms.core.security.group.GroupType; import com.enonic.cms.core.security.user.UserType; import com.enonic.cms.core.security.userstore.UserStoreEntity; import com.enonic.cms.core.security.userstore.connector.config.UserStoreConnectorConfigLoader; import com.enonic.cms.core.security.userstore.connector.synchronize.SynchronizeUserStoreJobFactory; import com.enonic.cms.core.security.userstore.connector.synchronize.SynchronizeUserStoreType; import com.enonic.cms.itest.AbstractSpringTest; import com.enonic.cms.itest.userstore.MemUserDatabase; import com.enonic.cms.itest.util.DomainFactory; import com.enonic.cms.itest.util.DomainFixture; import static org.junit.Assert.*; public class InternalClientImpl_remoteLoginTest extends AbstractSpringTest { @Autowired @Qualifier(value = "localClient") private InternalClient localClient; @Autowired private UserStoreConnectorConfigLoader userStoreConnectorConfigLoader; @Autowired private SynchronizeUserStoreJobFactory synchronizeUserStoreJobFactory; @Autowired private MemUserDatabase userDatabase; @Autowired private DomainFixture fixture; private final MockHttpServletRequest httpServletRequest = new MockHttpServletRequest(); @Before public void before() throws Exception { fixture.initSystemData(); fixture.createAndStoreUserAndUserGroup( "testuser", "password", "Test user", UserType.NORMAL, "testuserstore" ); fixture.createAndStoreUserAndUserGroup( "avatar", "password", "Avatar", UserType.NORMAL, "testuserstore" ); httpServletRequest.setRemoteAddr( "127.0.0.1" ); setupRemoteUserStore(); } @Test public void login_with_user_deleted_remotely_fails() throws Exception { addUser( "jvs" ); synchronizeUserStoreJobFactory.createSynchronizeUserStoreJob( fixture.findUserStoreByName( "myRemoteUserStore" ).getKey(), SynchronizeUserStoreType.USERS_ONLY, 10 ).start(); // setup: verify user jvs exists in db assertEquals( false, fixture.findUserByName( "jvs" ).isDeleted() ); // setup: delete user removeUser( "jvs" ); try { localClient.login( "myRemoteUserStore:jvs", "mypassword" ); } catch ( Exception e ) { assertTrue( e instanceof ClientException ); assertTrue( e.getMessage().contains( "Invalid username or password, username: 'jvs'" ) ); } } @Test public void login_with_user_not_existing_in_cms_but_remotely_passes() throws Exception { // setup addUser( "jvs" ); // verify user does not exists locally, it has be synchronized by login assertNull( fixture.findUserByName( "jvs" ) ); // exercise localClient.login( "myRemoteUserStore:jvs", "password" ); // verify assertEquals( "jvs", localClient.getUserName() ); assertEquals( "jvs", localClient.getRunAsUserName() ); } @Test public void login_with_no_userstore_specified_logs_in_user_in_default_userstore() throws Exception { // setup synchronizeUserStoreJobFactory.createSynchronizeUserStoreJob( fixture.findUserStoreByName( "myRemoteUserStore" ).getKey(), SynchronizeUserStoreType.USERS_ONLY, 10 ).start(); // exercise localClient.login( "testuser", "password" ); // verify assertEquals( "testuser", localClient.getUserName() ); assertEquals( "testuser", localClient.getRunAsUserName() ); } @Test public void removePortalImpersonation_removes_currently_active_impersonation() throws Exception { // setup addUser( "jvs" ); addUser( "arn" ); // setup: login as jvs localClient.login( "myRemoteUserStore:jvs", "password" ); // setup: impersonate arn localClient.impersonate( "myRemoteUserStore:arn" ); // setup: verify current impersonation assertEquals( "arn", localClient.getRunAsUserName() ); localClient.removeImpersonation(); // verify assertEquals( "jvs", localClient.getRunAsUserName() ); } private void setupRemoteUserStore() { this.userDatabase.clear(); final ConfigProperties properties = new ConfigProperties(); properties.setProperty( "cms.userstore.connector.myRemoteUserStore.userPolicy", "all" ); properties.setProperty( "cms.userstore.connector.myRemoteUserStore.groupPolicy", "all" ); properties.setProperty( "cms.userstore.connector.myRemoteUserStore.plugin", "mem" ); this.userStoreConnectorConfigLoader.setProperties( properties ); final DomainFactory factory = this.fixture.getFactory(); final UserStoreEntity userStore = factory.createUserStore( "myRemoteUserStore", "myRemoteUserStore", false ); final UserStoreConfig userStoreConfig = new UserStoreConfig(); userStore.setConfig( userStoreConfig ); this.fixture.save( userStore ); this.fixture.save( factory.createGroupInUserstore( GroupType.AUTHENTICATED_USERS.getName(), GroupType.AUTHENTICATED_USERS, "myRemoteUserStore" ) ); this.fixture.save( factory.createGroupInUserstore( GroupType.USERSTORE_ADMINS.getName(), GroupType.USERSTORE_ADMINS, "myRemoteUserStore" ) ); this.fixture.flushAndClearHibernateSession(); } private void addUser( final String id ) { final RemoteUser user = new RemoteUser( id ); user.setSync( id ); this.userDatabase.addUser( user ); this.userDatabase.setPassword( id, "password" ); } private void removeUser( final String id ) { this.userDatabase.removeUser( this.userDatabase.getUser( id ) ); } }