/*
* 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 org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.enonic.cms.api.client.ClientException;
import com.enonic.cms.core.client.InternalClient;
import com.enonic.cms.core.security.user.UserType;
import com.enonic.cms.core.servlet.ServletRequestAccessor;
import com.enonic.cms.itest.AbstractSpringTest;
import com.enonic.cms.itest.util.AssertTool;
import com.enonic.cms.itest.util.DomainFactory;
import com.enonic.cms.itest.util.DomainFixture;
import static org.junit.Assert.*;
public class InternalClientImpl_loginTest
extends AbstractSpringTest
{
@Autowired
@Qualifier(value = "localClient")
private InternalClient localClient;
@Autowired
@Qualifier(value = "remoteClient")
private InternalClient remoteClient;
private DomainFactory factory;
@Autowired
private DomainFixture fixture;
private MockHttpServletRequest httpServletRequest = new MockHttpServletRequest();
@Before
public void before()
throws Exception
{
factory = fixture.getFactory();
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" );
}
@Test
public void userName_returns_anonymous_user_when_not_logged_in()
throws Exception
{
// setup
ServletRequestAccessor.setRequest( httpServletRequest );
RequestContextHolder.setRequestAttributes( new ServletRequestAttributes( httpServletRequest ) );
// exercise & verify
assertEquals( "anonymous", localClient.getUserName() );
assertEquals( "anonymous", localClient.getRunAsUserName() );
}
@Test
public void login_with_normal_user()
throws Exception
{
// setup
ServletRequestAccessor.setRequest( httpServletRequest );
RequestContextHolder.setRequestAttributes( new ServletRequestAttributes( httpServletRequest ) );
// exercise
localClient.login( "testuserstore\\testuser", "password" );
// verify
assertEquals( "testuser", localClient.getUserName() );
assertEquals( "testuser", localClient.getRunAsUserName() );
}
@Test
public void getUserName_returns_anonymous_after_logout_after_login()
throws Exception
{
// setup
ServletRequestAccessor.setRequest( httpServletRequest );
RequestContextHolder.setRequestAttributes( new ServletRequestAttributes( httpServletRequest ) );
localClient.login( "testuserstore\\testuser", "password" );
// verify setup
assertEquals( "testuser", localClient.getUserName() );
assertEquals( "testuser", localClient.getRunAsUserName() );
// exercise
localClient.logout();
// verify
assertEquals( "anonymous", localClient.getUserName() );
assertEquals( "anonymous", localClient.getRunAsUserName() );
}
@Test
public void login_with_admin_user()
throws Exception
{
// setup
ServletRequestAccessor.setRequest( httpServletRequest );
RequestContextHolder.setRequestAttributes( new ServletRequestAttributes( httpServletRequest ) );
// exercise
localClient.login( "admin", "password" );
// verify
assertEquals( "admin", localClient.getUserName() );
assertEquals( "admin", localClient.getRunAsUserName() );
}
@Test
public void login_with_unknown_userstore_fails()
throws Exception
{
try
{
localClient.login( "unknownUserstore:jvs", "mypassword" );
}
catch ( Exception e )
{
assertTrue( e instanceof ClientException );
assertTrue( e.getMessage().contains( "Invalid username or password, username: 'unknownUserstore\\jvs'" ) );
}
}
@Test
public void login_with_no_userstore_specified_logs_in_user_in_default_userstore()
throws Exception
{
// setup
fixture.save( factory.createUserStore( "otheruserstore" ) );
// exercise
localClient.login( "testuser", "password" );
// verify
assertEquals( "testuser", localClient.getUserName() );
assertEquals( "testuser", localClient.getRunAsUserName() );
}
@Test
public void impersonate_on_local_client_as_non_admin_user_is_allowed()
throws Exception
{
// setup
ServletRequestAccessor.setRequest( httpServletRequest );
RequestContextHolder.setRequestAttributes( new ServletRequestAttributes( httpServletRequest ) );
// exercise
localClient.login( "testuserstore\\testuser", "password" );
localClient.impersonate( "testuserstore\\avatar" );
// verify
assertEquals( "testuser", localClient.getUserName() );
assertEquals( "avatar", localClient.getRunAsUserName() );
}
@Test
public void impersonate_with_user_specified_as_key()
throws Exception
{
// setup
ServletRequestAccessor.setRequest( httpServletRequest );
RequestContextHolder.setRequestAttributes( new ServletRequestAttributes( httpServletRequest ) );
// exercise
localClient.login( "testuserstore:testuser", "password" );
localClient.impersonate( "#" + fixture.findUserByName( "avatar" ).getKey() );
assertEquals( "testuser", localClient.getUserName() );
assertEquals( "avatar", localClient.getRunAsUserName() );
}
@Test
public void impersonate_with_user_specified_as_usertore_name_colon_user_name()
throws Exception
{
// setup
ServletRequestAccessor.setRequest( httpServletRequest );
RequestContextHolder.setRequestAttributes( new ServletRequestAttributes( httpServletRequest ) );
// exercise
localClient.login( "testuserstore:testuser", "password" );
localClient.impersonate( "testuserstore:avatar" );
assertEquals( "testuser", localClient.getUserName() );
assertEquals( "avatar", localClient.getRunAsUserName() );
}
@Test
public void impersonate_with_user_specified_as_usertore_name_backslash_user_name()
throws Exception
{
// setup
ServletRequestAccessor.setRequest( httpServletRequest );
RequestContextHolder.setRequestAttributes( new ServletRequestAttributes( httpServletRequest ) );
// exercise
localClient.login( "testuserstore\\testuser", "password" );
localClient.impersonate( "testuserstore\\avatar" );
// verify
assertEquals( "testuser", localClient.getUserName() );
assertEquals( "avatar", localClient.getRunAsUserName() );
}
@Test
public void runAs_returns_same_as_user_when_not_impersonating()
throws Exception
{
// setup
ServletRequestAccessor.setRequest( httpServletRequest );
RequestContextHolder.setRequestAttributes( new ServletRequestAttributes( httpServletRequest ) );
// exercise
localClient.login( "testuserstore\\testuser", "password" );
// verify
assertEquals( "testuser", localClient.getUserName() );
assertEquals( "testuser", localClient.getUser() );
assertEquals( "testuser", localClient.getRunAsUserName() );
assertEquals( "testuser", localClient.getRunAsUser() );
}
@Test
public void runAs_returns_impersonated_user_when_using_local_client_and_impersonating()
throws Exception
{
// setup
ServletRequestAccessor.setRequest( httpServletRequest );
RequestContextHolder.setRequestAttributes( new ServletRequestAttributes( httpServletRequest ) );
// exercise
localClient.login( "testuserstore\\testuser", "password" );
localClient.impersonate( "testuserstore\\avatar" );
// verify
assertEquals( "testuser", localClient.getUserName() );
assertEquals( "testuser", localClient.getUser() );
assertEquals( "avatar", localClient.getRunAsUserName() );
assertEquals( "avatar", localClient.getRunAsUser() );
AssertTool.assertSingleXPathValueEquals( "/user/name", localClient.getUserContext(), "testuser" );
AssertTool.assertSingleXPathValueEquals( "/user/name", localClient.getRunAsUserContext(), "avatar" );
}
@Test
public void impersonate_on_remote_client_as_non_admin_user_throws_exception()
throws Exception
{
// setup
ServletRequestAccessor.setRequest( httpServletRequest );
RequestContextHolder.setRequestAttributes( new ServletRequestAttributes( httpServletRequest ) );
remoteClient.login( "testuserstore\\testuser", "password" );
// exercise
try
{
remoteClient.impersonate( "testuserstore\\avatar" );
}
catch ( Exception e )
{
assertTrue( e.getMessage().contains( "Impersonate not allowed" ) );
}
}
@Test
public void impersonate_on_remote_client_as_admin_user_is_allowed()
throws Exception
{
// setup
ServletRequestAccessor.setRequest( httpServletRequest );
RequestContextHolder.setRequestAttributes( new ServletRequestAttributes( httpServletRequest ) );
remoteClient.login( "admin", "password" );
// exercise
remoteClient.impersonate( "testuserstore\\avatar" );
// verify
assertEquals( "avatar", localClient.getRunAsUserName() );
}
}