/* (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.impl; import static org.junit.Assert.*; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Properties; import java.util.Set; import junit.framework.TestCase; import org.geoserver.security.PropertyFileWatcher; import org.junit.Before; import org.junit.Test; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; public class GeoServerUserDaoTest { static class TestableUserDao extends GeoServerUserDao { public TestableUserDao(Properties p) throws IOException { userMap = loadUsersFromProperties(p); } @Override void checkUserMap() throws DataAccessResourceFailureException { // do nothing, for this test we don't write on the fs by default } void loadUserMap() { super.checkUserMap(); } } Properties props; TestableUserDao dao; @Before public void setUp() throws Exception { props = new Properties(); props.put("admin", "gs,ROLE_ADMINISTRATOR"); props.put("wfs", "webFeatureService,ROLE_WFS_READ,ROLE_WFS_WRITE"); props.put("disabledUser", "nah,ROLE_TEST,disabled"); dao = new TestableUserDao(props); } @Test public void testGetUsers() throws Exception { List<User> users = dao.getUsers(); assertEquals(3, users.size()); } @Test public void testLoadUser() throws Exception { UserDetails admin = dao.loadUserByUsername("admin"); assertEquals("admin", admin.getUsername()); assertEquals("gs", admin.getPassword()); assertEquals(1, admin.getAuthorities().size()); assertEquals("ROLE_ADMINISTRATOR", admin.getAuthorities().iterator().next().getAuthority()); } @Test public void testMissingUser() throws Exception { try { dao.loadUserByUsername("notThere"); fail("This user should not be there"); } catch(Exception e) { // ok } } @Test public void testSetUser() throws Exception { dao.setUser(new User("wfs", "pwd", true, true, true, true, Arrays.asList(new GrantedAuthority[] {new SimpleGrantedAuthority("ROLE_WFS_ALL"), new SimpleGrantedAuthority("ROLE_WMS_ALL")}))); UserDetails user = dao.loadUserByUsername("wfs"); assertEquals("wfs", user.getUsername()); assertEquals("pwd", user.getPassword()); assertEquals(2, user.getAuthorities().size()); Set<String> authorities = new HashSet<String>(); for (GrantedAuthority ga : user.getAuthorities()) { authorities.add(ga.getAuthority()); } // order independent assertTrue(authorities.contains("ROLE_WFS_ALL")); assertTrue(authorities.contains("ROLE_WMS_ALL")); } @Test public void testSetMissingUser() throws Exception { try { dao.setUser(new User("notther", "pwd", true, true, true, true, Arrays.asList(new GrantedAuthority[] {new SimpleGrantedAuthority("ROLE_WFS_ALL")}))); fail("The user is not there, setUser should fail"); } catch(IllegalArgumentException e) { // cool } } @Test public void testAddUser() throws Exception { dao.putUser(new User("newuser", "pwd", true, true, true, true, Arrays.asList(new GrantedAuthority[] {new SimpleGrantedAuthority("ROLE_WFS_ALL")}))); assertNotNull(dao.loadUserByUsername("newuser")); } public void addExistingUser() throws Exception { try { dao.putUser(new User("admin", "pwd", true, true, true, true, Arrays.asList(new GrantedAuthority[] {new SimpleGrantedAuthority("ROLE_WFS_ALL")}))); fail("The user is already there, addUser should fail"); } catch(IllegalArgumentException e) { // cool } } @Test public void testRemoveUser() throws Exception { assertFalse(dao.removeUser("notthere")); assertTrue(dao.removeUser("wfs")); try { dao.loadUserByUsername("wfs"); fail("The user is not there, loadUserByName should fail"); } catch(UsernameNotFoundException e) { // cool } } @Test public void testStoreReload() throws Exception { File temp = File.createTempFile("sectest", "", new File("target")); temp.delete(); temp.mkdir(); File propFile = new File(temp, "users.properties"); try { dao.userDefinitionsFile = new PropertyFileWatcher(propFile); dao.storeUsers(); dao.userMap.clear(); dao.loadUserMap(); } finally { temp.delete(); } assertEquals(3, dao.getUsers().size()); testLoadUser(); } }