Package org.geoserver.security.validation

Source Code of org.geoserver.security.validation.SecurityConfigValidatorTest

/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.security.validation;

import static org.geoserver.security.validation.SecurityConfigException.ANONYMOUS_NOT_LAST_$1;
import static org.geoserver.security.validation.SecurityConfigException.AUTH_PROVIDER_ACTIVE_$1;
import static org.geoserver.security.validation.SecurityConfigException.AUTH_PROVIDER_ALREADY_EXISTS_$1;
import static org.geoserver.security.validation.SecurityConfigException.AUTH_PROVIDER_NOT_FOUND_$1;
import static org.geoserver.security.validation.SecurityConfigException.CLASSNAME_REQUIRED;
import static org.geoserver.security.validation.SecurityConfigException.CLASS_NOT_FOUND_$1;
import static org.geoserver.security.validation.SecurityConfigException.CLASS_WRONG_TYPE_$2;
import static org.geoserver.security.validation.SecurityConfigException.FILTER_CHAIN_EMPTY_$1;
import static org.geoserver.security.validation.SecurityConfigException.FILTER_CHAIN_NAME_MANDATORY;
import static org.geoserver.security.validation.SecurityConfigException.INVALID_CONFIG_PASSWORD_ENCODER_$1;
import static org.geoserver.security.validation.SecurityConfigException.INVALID_MAX_LENGTH;
import static org.geoserver.security.validation.SecurityConfigException.INVALID_MIN_LENGTH;
import static org.geoserver.security.validation.SecurityConfigException.INVALID_PASSWORD_ENCODER_$1;
import static org.geoserver.security.validation.SecurityConfigException.INVALID_STRONG_CONFIG_PASSWORD_ENCODER;
import static org.geoserver.security.validation.SecurityConfigException.INVALID_STRONG_PASSWORD_ENCODER;
import static org.geoserver.security.validation.SecurityConfigException.NAME_REQUIRED;
import static org.geoserver.security.validation.SecurityConfigException.NOT_AN_AUTHENTICATION_FILTER_$2;
import static org.geoserver.security.validation.SecurityConfigException.NOT_A_SERVICE_AUTHENTICATION_FILTER_$2;
import static org.geoserver.security.validation.SecurityConfigException.PASSWD_ENCODER_REQUIRED_$1;
import static org.geoserver.security.validation.SecurityConfigException.PASSWD_POLICY_ACTIVE_$2;
import static org.geoserver.security.validation.SecurityConfigException.PASSWD_POLICY_ALREADY_EXISTS_$1;
import static org.geoserver.security.validation.SecurityConfigException.PASSWD_POLICY_MASTER_DELETE;
import static org.geoserver.security.validation.SecurityConfigException.PASSWD_POLICY_NOT_FOUND_$1;
import static org.geoserver.security.validation.SecurityConfigException.PASSWD_POLICY_REQUIRED_$1;
import static org.geoserver.security.validation.SecurityConfigException.PASSWORD_ENCODER_REQUIRED;
import static org.geoserver.security.validation.SecurityConfigException.PATTERN_LIST_EMPTY_$1;
import static org.geoserver.security.validation.SecurityConfigException.RESERVED_ROLE_NAME;
import static org.geoserver.security.validation.SecurityConfigException.ROLE_SERVICE_ACTIVE_$1;
import static org.geoserver.security.validation.SecurityConfigException.ROLE_SERVICE_ALREADY_EXISTS_$1;
import static org.geoserver.security.validation.SecurityConfigException.ROLE_SERVICE_NOT_FOUND_$1;
import static org.geoserver.security.validation.SecurityConfigException.UNKNOWN_FILTER_$2;
import static org.geoserver.security.validation.SecurityConfigException.UNKNOWN_ROLE_FILTER_$2;
import static org.geoserver.security.validation.SecurityConfigException.USERGROUP_SERVICE_ACTIVE_$2;
import static org.geoserver.security.validation.SecurityConfigException.USERGROUP_SERVICE_ALREADY_EXISTS_$1;
import static org.geoserver.security.validation.SecurityConfigException.USERGROUP_SERVICE_NOT_FOUND_$1;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import java.io.IOException;

import org.geoserver.security.GeoServerAuthenticationProvider;
import org.geoserver.security.GeoServerRoleService;
import org.geoserver.security.GeoServerSecurityFilterChain;
import org.geoserver.security.GeoServerUserGroupService;
import org.geoserver.security.ServiceLoginFilterChain;
import org.geoserver.security.auth.UsernamePasswordAuthenticationProvider;
import org.geoserver.security.config.BaseSecurityNamedServiceConfig;
import org.geoserver.security.config.PasswordPolicyConfig;
import org.geoserver.security.config.SecurityAuthProviderConfig;
import org.geoserver.security.config.SecurityManagerConfig;
import org.geoserver.security.config.SecurityNamedServiceConfig;
import org.geoserver.security.config.SecurityRoleServiceConfig;
import org.geoserver.security.config.SecurityUserGroupServiceConfig;
import org.geoserver.security.config.UsernamePasswordAuthenticationProviderConfig;
import org.geoserver.security.config.impl.MemoryRoleServiceConfigImpl;
import org.geoserver.security.config.impl.MemoryUserGroupServiceConfigImpl;
import org.geoserver.security.filter.GeoServerSecurityFilter;
import org.geoserver.security.impl.GeoServerRole;
import org.geoserver.security.impl.MemoryRoleService;
import org.geoserver.security.impl.MemoryUserGroupService;
import org.geoserver.security.password.PasswordValidator;
import org.geoserver.security.xml.XMLRoleService;
import org.geoserver.security.xml.XMLUserGroupService;
import org.geoserver.test.GeoServerMockTestSupport;
import org.geoserver.test.GeoServerSystemTestSupport;
import org.junit.Test;

public class SecurityConfigValidatorTest extends GeoServerSystemTestSupport {
   
   
    @Test
    public void testMasterConfigValidation() throws Exception{
        SecurityManagerConfig config = new SecurityManagerConfig();
        config.setRoleServiceName(XMLRoleService.DEFAULT_NAME);
        config.setConfigPasswordEncrypterName(getPBEPasswordEncoder().getName());
        config.getAuthProviderNames().add(GeoServerAuthenticationProvider.DEFAULT_NAME);

        SecurityConfigValidator validator = new SecurityConfigValidator(getSecurityManager());
        validator.validateManagerConfig(config,new SecurityManagerConfig());

        try {
            config.setConfigPasswordEncrypterName("abc");
            validator.validateManagerConfig(config,new SecurityManagerConfig());
            fail("invalid password encoder should fail");
        } catch (SecurityConfigException ex){
            assertEquals(INVALID_PASSWORD_ENCODER_$1,ex.getId());
        }

        try {
            config.setConfigPasswordEncrypterName(null);
            validator.validateManagerConfig(config,new SecurityManagerConfig());
            fail("no password encoder should fail");
        } catch (SecurityConfigException ex){
            assertEquals(PASSWORD_ENCODER_REQUIRED,ex.getId());
        }
       
        if (getSecurityManager().isStrongEncryptionAvailable()==false) {
            config.setConfigPasswordEncrypterName(getStrongPBEPasswordEncoder().getName());
            try {
                validator.validateManagerConfig(config,new SecurityManagerConfig());
                fail("invalid strong password encoder should fail");
            } catch (SecurityConfigException ex){
                assertEquals(INVALID_STRONG_CONFIG_PASSWORD_ENCODER,ex.getId());
            }
        }

        config.setConfigPasswordEncrypterName(getPBEPasswordEncoder().getName());
        config.setRoleServiceName("XX");

        try {
            validator.validateManagerConfig(config,new SecurityManagerConfig());
            fail("unknown role service should fail");
        } catch (SecurityConfigException ex){
            assertEquals(ROLE_SERVICE_NOT_FOUND_$1,ex.getId());
        }
       
        config.setRoleServiceName(null);
        try {
            validator.validateManagerConfig(config,new SecurityManagerConfig());
            fail("null role service should fail");
        } catch (SecurityConfigException ex){
            assertEquals(ROLE_SERVICE_NOT_FOUND_$1,ex.getId());
        }

        config.setRoleServiceName(XMLRoleService.DEFAULT_NAME);
        config.getAuthProviderNames().add("XX");

        try {
            validator.validateManagerConfig(config,new SecurityManagerConfig());
            fail("unknown auth provider should fail");
        } catch (SecurityConfigException ex){
            assertEquals(AUTH_PROVIDER_NOT_FOUND_$1,ex.getId());
        }
       
        config.getAuthProviderNames().remove("XX");
       
//        try {
//            validator.validateManagerConfig(config);
//            fail("empty filter chain  should fail");
//        } catch (SecurityConfigException ex){
//            assertEquals(FILTER_CHAIN_NULL_ERROR,ex.getId());
//            assertEquals(0,ex.getArgs().length);
//        }

        GeoServerSecurityFilterChain filterChain = new GeoServerSecurityFilterChain();
        config.setFilterChain(filterChain);
       
        ServiceLoginFilterChain chain = new ServiceLoginFilterChain();
        filterChain.getRequestChains().add(chain);
       
        try {
            validator.validateManagerConfig(config,new SecurityManagerConfig());
            fail("chain with no name should fail");
        } catch (SecurityConfigException ex){
            assertEquals(FILTER_CHAIN_NAME_MANDATORY,ex.getId());
            assertEquals(0,ex.getArgs().length);
        }
       
        String chainName="testChain";
        chain.setName(chainName);
       
        try {
            validator.validateManagerConfig(config,new SecurityManagerConfig());
            fail("chain with no patterns should fail");
        } catch (SecurityConfigException ex){
            assertEquals(PATTERN_LIST_EMPTY_$1,ex.getId());
            assertEquals(1,ex.getArgs().length);
            assertEquals(chainName,ex.getArgs()[0]);
        }
        chain.getPatterns().add("/**");       
        chain.setDisabled(true);
        validator.validateManagerConfig(config,new SecurityManagerConfig());
        chain.setDisabled(false);
       
        try {
            validator.validateManagerConfig(config,new SecurityManagerConfig());
            fail("enabled authentication chain with no filter should fail");
        } catch (SecurityConfigException ex){
            assertEquals(FILTER_CHAIN_EMPTY_$1,ex.getId());
            assertEquals(1,ex.getArgs().length);
            assertEquals(chainName,ex.getArgs()[0]);
        }
       
        String unknownFilter="unknown";
        chain.getFilterNames().add(unknownFilter);
        chain.setRoleFilterName("XX");
        try {
            validator.validateManagerConfig(config,new SecurityManagerConfig());
            fail("unknown role filter should fail");
        } catch (SecurityConfigException ex){
            assertEquals(UNKNOWN_ROLE_FILTER_$2,ex.getId());
            assertEquals(2,ex.getArgs().length);
            assertEquals(chainName,ex.getArgs()[0]);
            assertEquals("XX",ex.getArgs()[1]);
        }

        chain.setRoleFilterName(GeoServerSecurityFilterChain.ROLE_FILTER);
        chain.getFilterNames().add(0,GeoServerSecurityFilterChain.ANONYMOUS_FILTER);
        try {
            validator.validateManagerConfig(config,new SecurityManagerConfig());
            fail("anonymous not last should fail");
        } catch (SecurityConfigException ex){
            assertEquals(ANONYMOUS_NOT_LAST_$1,ex.getId());
            assertEquals(1,ex.getArgs().length);
            assertEquals(chainName,ex.getArgs()[0]);
        }

        chain.getFilterNames().remove(GeoServerSecurityFilterChain.ANONYMOUS_FILTER);
        chain.getFilterNames().add(GeoServerSecurityFilterChain.ANONYMOUS_FILTER);

        try {
            validator.validateManagerConfig(config,new SecurityManagerConfig());
            fail("unknown  filter should fail");
        } catch (SecurityConfigException ex){
            assertEquals(UNKNOWN_FILTER_$2,ex.getId());
            assertEquals(2,ex.getArgs().length);
            assertEquals(chainName,ex.getArgs()[0]);
            assertEquals(unknownFilter,ex.getArgs()[1]);
        }
       
        chain.getFilterNames().remove(unknownFilter);
        chain.getFilterNames().add(0,GeoServerSecurityFilterChain.ROLE_FILTER);

        try {
            validator.validateManagerConfig(config,new SecurityManagerConfig());
            fail("no authentication filter should fail");
        } catch (SecurityConfigException ex){
            assertEquals(NOT_AN_AUTHENTICATION_FILTER_$2,ex.getId());
            assertEquals(2,ex.getArgs().length);
            assertEquals(chainName,ex.getArgs()[0]);
            assertEquals(GeoServerSecurityFilterChain.ROLE_FILTER,ex.getArgs()[1]);
        }
               
        chain.getFilterNames().remove(GeoServerSecurityFilterChain.ROLE_FILTER);
        chain.getFilterNames().add(0,GeoServerSecurityFilterChain.FORM_LOGIN_FILTER);
       
        try {
            validator.validateManagerConfig(config,new SecurityManagerConfig());
            fail("form login filter should fail");
        } catch (SecurityConfigException ex){
            assertEquals(NOT_A_SERVICE_AUTHENTICATION_FILTER_$2,ex.getId());
            assertEquals(2,ex.getArgs().length);
            assertEquals(chainName,ex.getArgs()[0]);
            assertEquals(GeoServerSecurityFilterChain.FORM_LOGIN_FILTER,ex.getArgs()[1]);
        }

        chain.getFilterNames().remove(GeoServerSecurityFilterChain.FORM_LOGIN_FILTER);
        chain.getFilterNames().add(0,GeoServerSecurityFilterChain.BASIC_AUTH_FILTER);
        validator.validateManagerConfig(config,new SecurityManagerConfig());

    }

    @Test
    public void testNamedServices() {
        SecurityConfigValidator validator = new SecurityConfigValidator(getSecurityManager());
        Class<?>[] extensionPoints = new Class<?>[] {
                GeoServerUserGroupService.class,
                GeoServerRoleService.class,
                PasswordValidator.class,
                GeoServerAuthenticationProvider.class,
                GeoServerSecurityFilter.class
        };
       
        for (Class<?> ep : extensionPoints) {
           try {
               validator.checkExtensionPont(ep, "a.b.c");
               fail("unknown class should fail");
           } catch (SecurityConfigException ex) {
               assertEquals(ex.getId(), CLASS_NOT_FOUND_$1);
               assertEquals(ex.getArgs()[0],"a.b.c");
           }
          
           try {
               validator.checkExtensionPont(ep, "java.lang.String");
               fail("wrong class should fail");
           } catch (SecurityConfigException ex) {
               assertEquals(ex.getId(), CLASS_WRONG_TYPE_$2);
               assertEquals(ex.getArgs()[0],ep);
               assertEquals(ex.getArgs()[1],"java.lang.String");
           }

           String className = ep == GeoServerUserGroupService.class ? null : "";
           try {              
               validator.checkExtensionPont(ep, className);
               fail("no class should fail");
           } catch (SecurityConfigException ex) {
               assertEquals(ex.getId(), CLASSNAME_REQUIRED);
               assertEquals(0,ex.getArgs().length);
           }

           String name = ep == GeoServerUserGroupService.class ? null : "";
           try {              
               validator.checkServiceName(ep, name);
               fail("no name should fail");
           } catch (SecurityConfigException ex) {
               assertEquals(ex.getId(), NAME_REQUIRED);
               assertEquals(0,ex.getArgs().length);
              
           }
        }

        // test names
        try {
            validator.validateAddPasswordPolicy(
                createPolicyConfig(PasswordValidator.DEFAULT_NAME, PasswordValidatorImpl.class, 1,10));
            fail("passwd policy already exists should fail");
        } catch (SecurityConfigException ex) {
            assertEquals(PASSWD_POLICY_ALREADY_EXISTS_$1, ex.getId());
            assertEquals(ex.getArgs()[0],PasswordValidator.DEFAULT_NAME);
        }

        PasswordPolicyConfig pwConfig = createPolicyConfig("default2", PasswordValidatorImpl.class, 1,10);
       
        try {
            validator.validateModifiedPasswordPolicy(pwConfig,pwConfig);
            fail("unknown passwd policy should fail");
        } catch (SecurityConfigException ex) {
            assertEquals(PASSWD_POLICY_NOT_FOUND_$1, ex.getId());
            assertEquals(ex.getArgs()[0],"default2");
        }

        try {
            validator.validateAddUserGroupService(
                createUGConfig(XMLUserGroupService.DEFAULT_NAME, GeoServerUserGroupService.class,
                    getPlainTextPasswordEncoder().getName(),PasswordValidator.DEFAULT_NAME));
            fail("user group service already exists should fail");
        } catch (SecurityConfigException ex) {
            assertEquals(ex.getId(), USERGROUP_SERVICE_ALREADY_EXISTS_$1);
            assertEquals(ex.getArgs()[0],XMLUserGroupService.DEFAULT_NAME);
        }

        SecurityUserGroupServiceConfig ugConfig = 
                createUGConfig("default2", GeoServerUserGroupService.class,
                getPlainTextPasswordEncoder().getName(), PasswordValidator.DEFAULT_NAME);
        try {
            validator.validateModifiedUserGroupService(ugConfig,ugConfig);
            fail("unknown user group service should fail");
        } catch (SecurityConfigException ex) {
            assertEquals(ex.getId(), USERGROUP_SERVICE_NOT_FOUND_$1);
            assertEquals(ex.getArgs()[0],"default2");
        }

        try {
            validator.validateAddRoleService(
                createRoleConfig(XMLRoleService.DEFAULT_NAME, GeoServerRoleService.class,
                        GeoServerRole.ADMIN_ROLE.getAuthority()));
            fail("role service already exists should fail");
        } catch (SecurityConfigException ex) {
            assertEquals(ex.getId(), ROLE_SERVICE_ALREADY_EXISTS_$1);
            assertEquals(ex.getArgs()[0],XMLRoleService.DEFAULT_NAME);
        }

        SecurityRoleServiceConfig config = createRoleConfig("default2", GeoServerRoleService.class,
                GeoServerRole.ADMIN_ROLE.getAuthority());
        try {
            validator.validateModifiedRoleService(config,config);
            fail("unknown role service should fail");
        } catch (SecurityConfigException ex) {
            assertEquals(ex.getId(), ROLE_SERVICE_NOT_FOUND_$1);
            assertEquals(ex.getArgs()[0],"default2");
        }

        try {
            validator.validateAddAuthProvider(
                createAuthConfig(GeoServerAuthenticationProvider.DEFAULT_NAME, UsernamePasswordAuthenticationProvider.class,
                        XMLUserGroupService.DEFAULT_NAME));
            fail("auth provider already exists should fail");
        } catch (SecurityConfigException ex) {
            assertEquals(ex.getId(), AUTH_PROVIDER_ALREADY_EXISTS_$1);
            assertEquals(ex.getArgs()[0],GeoServerAuthenticationProvider.DEFAULT_NAME);
        }

        SecurityAuthProviderConfig aConfig = createAuthConfig("default2",
                UsernamePasswordAuthenticationProvider.class, XMLUserGroupService.DEFAULT_NAME)
        try {
            validator.validateModifiedAuthProvider(aConfig,aConfig);
            fail("unknown auth provider should fail");
        } catch (SecurityConfigException ex) {
            assertEquals(ex.getId(), AUTH_PROVIDER_NOT_FOUND_$1);
            assertEquals(ex.getArgs()[0],"default2");
        }

    }

    protected SecurityAuthProviderConfig createAuthConfig(String name, Class<?> aClass,String userGroupServiceName) {
        SecurityAuthProviderConfig config = new UsernamePasswordAuthenticationProviderConfig();
        config.setName(name);
        config.setClassName(aClass.getName());
        config.setUserGroupServiceName(userGroupServiceName);
        /*SecurityAuthProviderConfig config = createNiceMock(SecurityAuthProviderConfig.class);
        expect(config.getName()).andReturn(name).anyTimes();
        expect(config.getClassName()).andReturn(aClass.getName()).anyTimes();
        expect(config.getUserGroupServiceName()).andReturn(userGroupServiceName).anyTimes();
        replay(config);*/
        return config;
    }
   
    protected SecurityUserGroupServiceConfig createUGConfig(String name, Class<?> aClass,
            String encoder, String policyName) {

        MemoryUserGroupServiceConfigImpl config = new MemoryUserGroupServiceConfigImpl();
        config.setName(name);
        config.setClassName(aClass.getName());
        config.setPasswordEncoderName(encoder);
        config.setPasswordPolicyName(policyName);
        /*SecurityUserGroupServiceConfig ugConfig = createNiceMock(SecurityUserGroupServiceConfig.class);
        expect(ugConfig.getName()).andReturn(name).anyTimes();
        expect(ugConfig.getClassName()).andReturn(aClass.getName()).anyTimes();
        expect(ugConfig.getPasswordEncoderName()).andReturn(encoder).anyTimes();
        expect(ugConfig.getPasswordPolicyName()).andReturn(policyName).anyTimes();
        replay(ugConfig);*/
        return config;
    }

    protected SecurityRoleServiceConfig createRoleConfig(String name, Class<?> aClass,String adminRole) {
        SecurityRoleServiceConfig config = new MemoryRoleServiceConfigImpl();
        config.setName(name);
        config.setClassName(aClass.getName());
        config.setAdminRoleName(adminRole);
        /*SecurityRoleServiceConfig config = createNiceMock(SecurityRoleServiceConfig.class);
        expect(config.getName()).andReturn(name).anyTimes();
        expect(config.getClassName()).andReturn(aClass.getName()).anyTimes();
        expect(config.getAdminRoleName()).andReturn(adminRole).anyTimes();
        replay(config);*/
        return config;
    }

    protected PasswordPolicyConfig createPolicyConfig(String name, Class<?> aClass,int min, int max) {
        PasswordPolicyConfig config = new PasswordPolicyConfig();
        config.setName(name);
        config.setClassName(aClass.getName());
        config.setMinLength(min);
        config.setMaxLength(max);
        return config;
    }

    protected SecurityNamedServiceConfig createFilterConfig(String name, Class<?> aClass) {
        SecurityNamedServiceConfig config = new BaseSecurityNamedServiceConfig();
        config.setName(name);
        config.setClassName(aClass.getName());
        return config;
    }

    @Test
    public void testPasswordPolicy() throws IOException {

        SecurityConfigValidator validator = new SecurityConfigValidator(getSecurityManager());
        PasswordPolicyConfig config =
            createPolicyConfig(PasswordValidator.DEFAULT_NAME, PasswordValidatorImpl.class, -1,10);

        try {
            config.setName("default2");
            validator.validateAddPasswordPolicy(config);
            fail("invalid min length should fail");
            //getSecurityManager().savePasswordPolicy(config);
        } catch (SecurityConfigException ex) {
            assertEquals( INVALID_MIN_LENGTH,ex.getId());
            assertEquals(0,ex.getArgs().length);
        }

        try {
            validator.validateAddPasswordPolicy(config);
            fail("invalid min length should fail");
            //getSecurityManager().savePasswordPolicy(config);
        } catch (SecurityConfigException ex) {
            assertEquals( INVALID_MIN_LENGTH,ex.getId());
            assertEquals(0,ex.getArgs().length);
        }

        config.setMinLength(1);
        config.setMaxLength(0);

        try {
            validator.validateAddPasswordPolicy(config);
            fail("invalid max length should fail");
            getSecurityManager().savePasswordPolicy(config);
        } catch (SecurityConfigException ex) {
            assertEquals( INVALID_MAX_LENGTH,ex.getId());
            assertEquals(0,ex.getArgs().length);
        }

        try {
            validator.validateAddPasswordPolicy(config);
            fail("invalid max length should fail");
        } catch (SecurityConfigException ex) {
            assertEquals( INVALID_MAX_LENGTH,ex.getId());
            assertEquals(0,ex.getArgs().length);
        }

        config.setMaxLength(-1);

        try {
            config.setName("");
            validator.validateRemovePasswordPolicy(config);
            fail("no name should fail");
            //getSecurityManager().removePasswordValidator(config);                        
        } catch (SecurityConfigException ex) {
            assertEquals( NAME_REQUIRED,ex.getId());
            assertEquals(0,ex.getArgs().length);
        }

        try {
            config.setName(PasswordValidator.DEFAULT_NAME);
            validator.validateRemovePasswordPolicy(config);
            fail("remove active should fail");
            //getSecurityManager().removePasswordValidator(config);
        } catch (SecurityConfigException ex) {
            assertEquals( PASSWD_POLICY_ACTIVE_$2,ex.getId());
            assertEquals(PasswordValidator.DEFAULT_NAME,ex.getArgs()[0]);
            assertEquals(XMLUserGroupService.DEFAULT_NAME,ex.getArgs()[1]);
        }

        try {
            config.setName(PasswordValidator.MASTERPASSWORD_NAME);
            validator.validateRemovePasswordPolicy(config);
            fail("remove master should fail");
            //getSecurityManager().removePasswordValidator(config);
        } catch (SecurityConfigException ex) {
            assertEquals( PASSWD_POLICY_MASTER_DELETE,ex.getId());
            assertEquals(0,ex.getArgs().length);
        }
    }

    @Test
    public void testRoleConfig() throws IOException {

        SecurityRoleServiceConfig config = createRoleConfig(XMLRoleService.DEFAULT_NAME,
            MemoryRoleService.class, GeoServerRole.ADMIN_ROLE.getAuthority());

        SecurityConfigValidator validator = new SecurityConfigValidator(getSecurityManager());
        try {
            config.setName(null);
            validator.validateRemoveRoleService(config);
            fail("no name should fail");
            //getSecurityManager().removeRoleService(config) ;
        } catch (SecurityConfigException ex) {
            assertEquals( NAME_REQUIRED,ex.getId());
            assertEquals(0,ex.getArgs().length);           
        }
       
        config.setName("abcd");
        for (GeoServerRole role : GeoServerRole.SystemRoles) {
            config.setAdminRoleName(role.getAuthority());
            try {
                validator.validateAddRoleService(config);
                fail("reserved role name should fail");
                //getSecurityManager().saveRoleService(config);
            } catch (SecurityConfigException ex) {
                assertEquals( RESERVED_ROLE_NAME,ex.getId());
                assertEquals(role.getAuthority(),ex.getArgs()[0]);
            }
        }
       
        for (GeoServerRole role : GeoServerRole.SystemRoles) {
            config.setGroupAdminRoleName(role.getAuthority());
            try {
                validator.validateAddRoleService(config);
                fail("resoerved role name should fail");
                //getSecurityManager().saveRoleService(config);                       
            } catch (SecurityConfigException ex) {
                assertEquals( RESERVED_ROLE_NAME,ex.getId());
                assertEquals(role.getAuthority(),ex.getArgs()[0]);           
            }
        }

        try {
            config.setName(XMLRoleService.DEFAULT_NAME);
            validator.validateRemoveRoleService(config);
            fail("role service active should fail");
            //getSecurityManager().removeRoleService(config) ;                        
        } catch (SecurityConfigException ex) {
            assertEquals( ROLE_SERVICE_ACTIVE_$1,ex.getId());
            assertEquals(XMLRoleService.DEFAULT_NAME,ex.getArgs()[0]);
        }
    }

    @Test
    public void testAuthenticationProvider() throws IOException {
       
        SecurityAuthProviderConfig config = createAuthConfig(GeoServerAuthenticationProvider.DEFAULT_NAME,
                UsernamePasswordAuthenticationProvider.class, "default2");

        SecurityConfigValidator validator = new SecurityConfigValidator(getSecurityManager());
        try {
            config.setName("default2");
            validator.validateAddAuthProvider(config);
            fail("user group service not found should fail");
            //getSecurityManager().saveAuthenticationProvider(config);
        } catch (SecurityConfigException ex) {
            assertEquals( USERGROUP_SERVICE_NOT_FOUND_$1,ex.getId());
            assertEquals("default2",ex.getArgs()[0]);
        }

        try {
            config.setName("other");
            validator.validateAddAuthProvider(config);
            fail("user group service not found should fail");
            //getSecurityManager().saveAuthenticationProvider(config);
        } catch (SecurityConfigException ex) {
            assertEquals( USERGROUP_SERVICE_NOT_FOUND_$1,ex.getId());
            assertEquals("default2",ex.getArgs()[0]);
        }

        try {
            config.setName("");
            validator.validateRemoveAuthProvider(config);
            fail("no name should fail");
            //getSecurityManager().removeAuthenticationProvider(config);
        } catch (SecurityConfigException ex) {
            assertEquals( NAME_REQUIRED,ex.getId());
            assertEquals(0,ex.getArgs().length);
        }

        try {
            config.setName(GeoServerAuthenticationProvider.DEFAULT_NAME);
            validator.validateRemoveAuthProvider(config);
            fail("active auth provieder should fail");
            //getSecurityManager().removeAuthenticationProvider(config);
        } catch (SecurityConfigException ex) {
            assertEquals( AUTH_PROVIDER_ACTIVE_$1,ex.getId());
            assertEquals(GeoServerAuthenticationProvider.DEFAULT_NAME,ex.getArgs()[0]);
        }
    }

    @Test
    public void testUserGroupConfig() throws IOException {
       
        SecurityUserGroupServiceConfig config = createUGConfig(XMLUserGroupService.DEFAULT_NAME,
            MemoryUserGroupService.class, getPlainTextPasswordEncoder().getName(),PasswordValidator.DEFAULT_NAME);

        SecurityConfigValidator validator = new SecurityConfigValidator(getSecurityManager());

        try {
            config.setName("default2");
            config.setPasswordEncoderName("xxx");
            validator.validateAddUserGroupService(config);
            fail("invalid config password encoder should fail");
            //getSecurityManager().saveUserGroupService(config);                        
        } catch (SecurityConfigException ex) {
            assertEquals( INVALID_CONFIG_PASSWORD_ENCODER_$1,ex.getId());
            assertEquals("xxx",ex.getArgs()[0]);
        }

        if (!getSecurityManager().isStrongEncryptionAvailable()) {
            config.setPasswordEncoderName(getStrongPBEPasswordEncoder().getName());
           
            try {
                validator.validateAddUserGroupService(config);
                fail("invalid strong password encoder should fail");
                //getSecurityManager().saveUserGroupService(config);
            } catch (SecurityConfigException ex){
                assertEquals(INVALID_STRONG_PASSWORD_ENCODER,ex.getId());
            }
        }

        try {
            config.setName("other");
            config.setPasswordEncoderName("xxx");
            validator.validateAddUserGroupService(config);
            fail("invalid config password encoder should fail");
            //getSecurityManager().saveUserGroupService(config);                        
        } catch (SecurityConfigException ex) {
            assertEquals( INVALID_CONFIG_PASSWORD_ENCODER_$1,ex.getId());
            assertEquals("xxx",ex.getArgs()[0]);
        }

        try {
            config.setName("default2");
            config.setPasswordEncoderName("");
            validator.validateAddUserGroupService(config);
            fail("no password encoder should fail");
            //getSecurityManager().saveUserGroupService(config);                        
        } catch (SecurityConfigException ex) {
            assertEquals( PASSWD_ENCODER_REQUIRED_$1,ex.getId());
            assertEquals("default2",ex.getArgs()[0]);
        }

        try {
            config.setName("default3");
            config.setPasswordEncoderName(null);
            //getSecurityManager().saveUserGroupService(config);
            validator.validateAddUserGroupService(config);
            fail("no password encoder should fail");
        } catch (SecurityConfigException ex) {
            assertEquals( PASSWD_ENCODER_REQUIRED_$1,ex.getId());
            assertEquals("default3", ex.getArgs()[0]);
        }

        config.setPasswordEncoderName(getPlainTextPasswordEncoder().getName());

        try {
            config.setName("default2");
            config.setPasswordPolicyName("default2");
            validator.validateAddUserGroupService(config);
            fail("unknown password policy should fail");
            //getSecurityManager().saveUserGroupService(config);                        
        } catch (SecurityConfigException ex) {
            assertEquals( PASSWD_POLICY_NOT_FOUND_$1,ex.getId());
            assertEquals("default2",ex.getArgs()[0]);
        }

        try {
            config.setName("default3");
            config.setPasswordPolicyName("default2");
            validator.validateAddUserGroupService(config);
            fail("unkonwn password policy encoder should fail");
            //getSecurityManager().saveUserGroupService(config);                        
        } catch (SecurityConfigException ex) {
            assertEquals( PASSWD_POLICY_NOT_FOUND_$1,ex.getId());
            assertEquals("default2",ex.getArgs()[0]);
        }
       
        try {
            config.setName("default2");
            config.setPasswordPolicyName("");
            //getSecurityManager().saveUserGroupService(config);
            validator.validateAddUserGroupService(config);
            fail("no password policy should fail");
        } catch (SecurityConfigException ex) {
            assertEquals( PASSWD_POLICY_REQUIRED_$1,ex.getId());
            assertEquals("default2",ex.getArgs()[0]);
        }

        try {
            config.setName("default3");
            config.setPasswordPolicyName(null);
            validator.validateAddUserGroupService(config);
            fail("invalidate password policy should fail");
            //getSecurityManager().saveUserGroupService(config);                        
        } catch (SecurityConfigException ex) {
            assertEquals( PASSWD_POLICY_REQUIRED_$1,ex.getId());
            assertEquals("default3",ex.getArgs()[0]);
        }

        try {
            config.setName(null);
            validator.validateRemoveUserGroupService(config);
            fail("no name should fail");
            getSecurityManager().removeUserGroupService(config);                        
        } catch (SecurityConfigException ex) {
            assertEquals( NAME_REQUIRED,ex.getId());
            assertEquals(0,ex.getArgs().length);
        }

        try {
            config.setName(XMLUserGroupService.DEFAULT_NAME);
            validator.validateRemoveUserGroupService(config);
            fail("active user group service should fail");
            //getSecurityManager().removeUserGroupService(config);                        
        } catch (SecurityConfigException ex) {
            assertEquals( USERGROUP_SERVICE_ACTIVE_$2,ex.getId());
            assertEquals(XMLUserGroupService.DEFAULT_NAME,ex.getArgs()[0]);
            assertEquals(GeoServerAuthenticationProvider.DEFAULT_NAME,ex.getArgs()[1]);
        }

    }

}
TOP

Related Classes of org.geoserver.security.validation.SecurityConfigValidatorTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.