/* (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.jdbc;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;
import java.util.logging.Logger;
import org.geoserver.security.GeoServerRoleStore;
import org.geoserver.security.GeoServerSecurityManager;
import org.geoserver.security.GeoServerRoleService;
import org.geoserver.security.GeoServerUserGroupService;
import org.geoserver.security.GeoServerUserGroupStore;
import org.geoserver.security.config.SecurityRoleServiceConfig;
import org.geoserver.security.config.SecurityUserGroupServiceConfig;
import org.geoserver.security.impl.GeoServerRole;
import org.geoserver.security.impl.Util;
import org.geoserver.security.jdbc.config.JDBCRoleServiceConfig;
import org.geoserver.security.jdbc.config.JDBCUserGroupServiceConfig;
import org.geoserver.security.password.GeoServerDigestPasswordEncoder;
import org.geoserver.security.password.PasswordValidator;
public class JDBCTestSupport {
static Logger LOGGER = org.geotools.util.logging.Logging.getLogger("org.geoserver.security.jdbc");
public static void dropExistingTables(AbstractJDBCService service) throws IOException {
Connection con = null;
try {
con = service.getDataSource().getConnection();
dropExistingTables(service,con);
} catch (SQLException ex) {
throw new IOException(ex);
} finally {
try { if (con != null) con.close();} catch (SQLException ex) {};;
}
}
public static void dropExistingTables(AbstractJDBCService service,Connection con) throws IOException {
PreparedStatement ps = null;
try {
for (String stmt : service.getOrderedNamesForDrop()) {
try {
ps= service.getDDLStatement(stmt, con);
ps.execute();
ps.close();
} catch (SQLException ex) {
//ex.printStackTrace();
}
}
con.commit();
} catch (SQLException ex) {
throw new IOException(ex);
} finally {
try { if (ps!=null) ps.close(); } catch (SQLException ex) {};
}
}
public static boolean isFixtureDisabled(String fixtureId) {
final String property = System.getProperty("gs." + fixtureId);
return property != null && "false".equals(property.toLowerCase());
}
protected static JDBCUserGroupServiceConfig createConfigObjectH2(String serviceName,
GeoServerSecurityManager securityManager) {
JDBCUserGroupServiceConfig config = new JDBCUserGroupServiceConfig();
config.setName(serviceName);
config.setConnectURL("jdbc:h2:target/h2/security");
config.setDriverClassName("org.h2.Driver");
config.setUserName("sa");
config.setPassword("");
config.setClassName(JDBCUserGroupService.class.getName());
config.setPropertyFileNameDDL(JDBCUserGroupService.DEFAULT_DDL_FILE);
config.setPropertyFileNameDML(JDBCUserGroupService.DEFAULT_DML_FILE);
config.setCreatingTables(false);
config.setPasswordEncoderName(
securityManager.loadPasswordEncoder(GeoServerDigestPasswordEncoder.class).getName());
config.setPasswordPolicyName(PasswordValidator.DEFAULT_NAME);
return config;
}
protected static GeoServerUserGroupService createH2UserGroupService(String serviceName,
GeoServerSecurityManager securityManager) throws Exception {
if (securityManager.listUserGroupServices().contains(serviceName)) {
GeoServerUserGroupService service = securityManager.loadUserGroupService(serviceName);
if (service.canCreateStore()) {
GeoServerUserGroupStore store = service.createStore();
store.clear();
store.store();
}
SecurityUserGroupServiceConfig old =
securityManager.loadUserGroupServiceConfig(serviceName);
securityManager.removeUserGroupService(old);
}
securityManager.saveUserGroupService(createConfigObjectH2(serviceName, securityManager));
return securityManager.loadUserGroupService(serviceName);
}
protected static JDBCUserGroupServiceConfig createConfigObjectH2Jndi( String serviceName ,GeoServerSecurityManager securityManager) {
JDBCUserGroupServiceConfig config = new JDBCUserGroupServiceConfig();
config.setName(serviceName);
config.setJndi(true);
config.setJndiName("ds.h2");
config.setClassName(JDBCUserGroupService.class.getName());
config.setPropertyFileNameDDL(JDBCUserGroupService.DEFAULT_DDL_FILE);
config.setPropertyFileNameDML(JDBCUserGroupService.DEFAULT_DML_FILE);
config.setCreatingTables(false);
config.setPasswordEncoderName(
securityManager.loadPasswordEncoder(GeoServerDigestPasswordEncoder.class).getName());
config.setPasswordPolicyName(PasswordValidator.DEFAULT_NAME);
return config;
}
protected static GeoServerUserGroupService createH2UserGroupServiceFromJNDI(String serviceName,
GeoServerSecurityManager securityManager) throws Exception {
securityManager.saveUserGroupService(createConfigObjectH2Jndi(serviceName, securityManager));
return securityManager.loadUserGroupService(serviceName);
}
protected static GeoServerRoleService createH2RoleService(
String serviceName, GeoServerSecurityManager securityManager) throws Exception {
if (securityManager.listRoleServices().contains(serviceName)) {
if (securityManager.getActiveRoleService().getName().equals(serviceName)) {
GeoServerRoleService roleService = securityManager.loadRoleService("default");
securityManager.setActiveRoleService(roleService);
}
GeoServerRoleService service = securityManager.loadRoleService(serviceName);
if (service.canCreateStore()) {
GeoServerRoleStore store = service.createStore();
store.clear();
store.store();
}
SecurityRoleServiceConfig old = securityManager.loadRoleServiceConfig(serviceName);
securityManager.removeRoleService(old);
}
JDBCRoleServiceConfig config = new JDBCRoleServiceConfig();
config.setName(serviceName);
config.setConnectURL("jdbc:h2:target/h2/security");
config.setDriverClassName("org.h2.Driver");
config.setUserName("sa");
config.setPassword("");
config.setClassName(JDBCRoleService.class.getName());
config.setPropertyFileNameDDL(JDBCRoleService.DEFAULT_DDL_FILE);
config.setPropertyFileNameDML(JDBCRoleService.DEFAULT_DML_FILE);
config.setCreatingTables(false);
securityManager.saveRoleService(config);
return securityManager.loadRoleService(serviceName);
}
protected static GeoServerRoleService createH2RoleServiceFromJNDI(
String serviceName, GeoServerSecurityManager securityManager) throws Exception {
JDBCRoleServiceConfig config = new JDBCRoleServiceConfig();
config.setName(serviceName);
config.setJndi(true);
config.setJndiName("ds.h2");
config.setClassName(JDBCRoleService.class.getName());
config.setPropertyFileNameDDL(JDBCRoleService.DEFAULT_DDL_FILE);
config.setPropertyFileNameDML(JDBCRoleService.DEFAULT_DML_FILE);
config.setCreatingTables(false);
securityManager.saveRoleService(config);
return securityManager.loadRoleService(serviceName);
}
static protected GeoServerRoleService createRoleService(
String fixtureId, LiveDbmsDataSecurity data, GeoServerSecurityManager securityManager)
throws Exception {
JDBCRoleServiceConfig config = new
JDBCRoleServiceConfig();
Properties props=Util.loadUniversal(new FileInputStream(data.getFixture()));
config.setName(fixtureId);
config.setConnectURL(props.getProperty("url"));
config.setDriverClassName(props.getProperty("driver"));
config.setUserName(props.getProperty("user") == null ? props.getProperty("username") : props.getProperty("user"));
config.setPassword(props.getProperty("password"));
config.setClassName(JDBCRoleService.class.getName());
config.setCreatingTables(false);
if ("h2".equals(fixtureId)) {
config.setPropertyFileNameDDL("rolesddl.h2.xml");
} else if ("postgis".equals(fixtureId)) {
config.setPropertyFileNameDDL("rolesddl.postgis.xml");
} else if ("mysql".equals(fixtureId)) {
config.setPropertyFileNameDDL("rolesddl.mysql.xml");
} else {
config.setPropertyFileNameDDL(JDBCRoleService.DEFAULT_DDL_FILE);
}
config.setPropertyFileNameDML(JDBCRoleService.DEFAULT_DML_FILE);
securityManager.saveRoleService(config);
return securityManager.loadRoleService(fixtureId);
}
static protected JDBCUserGroupServiceConfig createConfigObject(String fixtureId,LiveDbmsDataSecurity data,GeoServerSecurityManager securityManager) throws Exception {
JDBCUserGroupServiceConfig config = new
JDBCUserGroupServiceConfig();
Properties props=Util.loadUniversal(new FileInputStream(data.getFixture()));
config.setName(fixtureId);
config.setConnectURL(props.getProperty("url"));
config.setDriverClassName(props.getProperty("driver"));
config.setUserName(props.getProperty("user")== null ? props.getProperty("username"): props.getProperty("user"));
config.setPassword(props.getProperty("password"));
config.setClassName(JDBCUserGroupService.class.getName());
config.setCreatingTables(false);
config.setPasswordEncoderName(
securityManager.loadPasswordEncoder(GeoServerDigestPasswordEncoder.class).getName());
config.setPasswordPolicyName(PasswordValidator.DEFAULT_NAME);
if ("mysql".equals(fixtureId)) {
config.setPropertyFileNameDDL("usersddl.mysql.xml");
} else {
config.setPropertyFileNameDDL(JDBCUserGroupService.DEFAULT_DDL_FILE);
}
config.setPropertyFileNameDML(JDBCUserGroupService.DEFAULT_DML_FILE);
return config;
}
static protected GeoServerUserGroupService createUserGroupService(String fixtureId,
LiveDbmsDataSecurity data, GeoServerSecurityManager securityManager) throws Exception {
securityManager.saveUserGroupService(createConfigObject(fixtureId, data, securityManager));
return securityManager.loadUserGroupService(fixtureId);
}
}