Merge branch 'switchToJdkSax'
This commit is contained in:
commit
663a0b5995
|
@ -71,6 +71,13 @@ along with Privilege. If not, see <http://www.gnu.org/licenses/>.
|
||||||
<AllAllowed>true</AllAllowed>
|
<AllAllowed>true</AllAllowed>
|
||||||
</Privilege>
|
</Privilege>
|
||||||
</Role>
|
</Role>
|
||||||
|
|
||||||
|
<Role name="restrictedRole">
|
||||||
|
<Privilege name="ch.eitchnet.privilege.test.model.TestSystemUserAction" policy="DefaultPrivilege">
|
||||||
|
<Allow>hello</Allow>
|
||||||
|
<Deny>goodbye</Deny>
|
||||||
|
</Privilege>
|
||||||
|
</Role>
|
||||||
|
|
||||||
</Roles>
|
</Roles>
|
||||||
</UsersAndRoles>
|
</UsersAndRoles>
|
5
pom.xml
5
pom.xml
|
@ -81,11 +81,6 @@
|
||||||
<version>4.10</version>
|
<version>4.10</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>maven</groupId>
|
|
||||||
<artifactId>dom4j</artifactId>
|
|
||||||
<version>1.7-20060614</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>ch.eitchnet</groupId>
|
<groupId>ch.eitchnet</groupId>
|
||||||
<artifactId>ch.eitchnet.utils</artifactId>
|
<artifactId>ch.eitchnet.utils</artifactId>
|
||||||
|
|
|
@ -20,28 +20,22 @@
|
||||||
package ch.eitchnet.privilege.handler;
|
package ch.eitchnet.privilege.handler;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.dom4j.DocumentFactory;
|
|
||||||
import org.dom4j.Element;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import ch.eitchnet.privilege.base.PrivilegeException;
|
import ch.eitchnet.privilege.base.PrivilegeException;
|
||||||
import ch.eitchnet.privilege.helper.XmlConstants;
|
import ch.eitchnet.privilege.helper.XmlConstants;
|
||||||
import ch.eitchnet.privilege.helper.XmlHelper;
|
import ch.eitchnet.privilege.helper.XmlHelper;
|
||||||
import ch.eitchnet.privilege.model.UserState;
|
|
||||||
import ch.eitchnet.privilege.model.internal.Privilege;
|
|
||||||
import ch.eitchnet.privilege.model.internal.Role;
|
import ch.eitchnet.privilege.model.internal.Role;
|
||||||
import ch.eitchnet.privilege.model.internal.User;
|
import ch.eitchnet.privilege.model.internal.User;
|
||||||
|
import ch.eitchnet.privilege.xml.PrivilegeModelDomWriter;
|
||||||
|
import ch.eitchnet.privilege.xml.PrivilegeModelSaxReader;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link PersistenceHandler} implementation which reads the configuration from XML files. These configuration is passed
|
* {@link PersistenceHandler} implementation which reads the configuration from XML files. These configuration is passed
|
||||||
|
@ -138,120 +132,6 @@ public class XmlPersistenceHandler implements PersistenceHandler {
|
||||||
this.roleMapDirty = true;
|
this.roleMapDirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @see ch.eitchnet.privilege.handler.PersistenceHandler#persist()
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean persist() {
|
|
||||||
|
|
||||||
// get models file name
|
|
||||||
String modelFileName = this.parameterMap.get(XmlConstants.XML_PARAM_MODEL_FILE);
|
|
||||||
if (modelFileName == null || modelFileName.isEmpty()) {
|
|
||||||
throw new PrivilegeException("[" + PersistenceHandler.class.getName() + "] Defined parameter "
|
|
||||||
+ XmlConstants.XML_PARAM_MODEL_FILE + " is invalid");
|
|
||||||
}
|
|
||||||
|
|
||||||
// get model file
|
|
||||||
File modelFile = new File(this.modelPath);
|
|
||||||
boolean modelFileUnchanged = modelFile.exists() && modelFile.lastModified() == this.modelsFileDate;
|
|
||||||
if (modelFileUnchanged && !this.roleMapDirty && !this.userMapDirty) {
|
|
||||||
XmlPersistenceHandler.logger
|
|
||||||
.warn("Not persisting as current file is unchanged and model data is not dirty");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
DocumentFactory docFactory = DocumentFactory.getInstance();
|
|
||||||
|
|
||||||
// create root element
|
|
||||||
Element rootElement = docFactory.createElement(XmlConstants.XML_ROOT_PRIVILEGE_USERS_AND_ROLES);
|
|
||||||
|
|
||||||
// USERS
|
|
||||||
// build XML DOM of users
|
|
||||||
List<Element> users = XmlPersistenceHandler.toDomUsers(this.userMap);
|
|
||||||
Element usersElement = docFactory.createElement(XmlConstants.XML_USERS);
|
|
||||||
for (Element userElement : users) {
|
|
||||||
usersElement.add(userElement);
|
|
||||||
}
|
|
||||||
rootElement.add(usersElement);
|
|
||||||
|
|
||||||
// ROLES
|
|
||||||
// build XML DOM of roles
|
|
||||||
List<Element> roles = XmlPersistenceHandler.toDomRoles(this.roleMap);
|
|
||||||
Element rolesElement = docFactory.createElement(XmlConstants.XML_ROLES);
|
|
||||||
for (Element roleElement : roles) {
|
|
||||||
rolesElement.add(roleElement);
|
|
||||||
}
|
|
||||||
rootElement.add(rolesElement);
|
|
||||||
|
|
||||||
// now write the file
|
|
||||||
XmlHelper.writeElement(rootElement, modelFile);
|
|
||||||
|
|
||||||
// reset dirty states
|
|
||||||
this.userMapDirty = false;
|
|
||||||
this.roleMapDirty = false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see ch.eitchnet.privilege.handler.PersistenceHandler#reload()
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public boolean reload() {
|
|
||||||
|
|
||||||
// validate file exists
|
|
||||||
File modelsFile = new File(this.modelPath);
|
|
||||||
if (!modelsFile.exists()) {
|
|
||||||
throw new PrivilegeException("[" + PersistenceHandler.class.getName() + "] Defined parameter "
|
|
||||||
+ XmlConstants.XML_PARAM_MODEL_FILE + " is invalid as models file does not exist at path "
|
|
||||||
+ modelsFile.getAbsolutePath());
|
|
||||||
}
|
|
||||||
|
|
||||||
this.roleMap = Collections.synchronizedMap(new HashMap<String, Role>());
|
|
||||||
this.userMap = Collections.synchronizedMap(new HashMap<String, User>());
|
|
||||||
|
|
||||||
// parse models xml file to XML document
|
|
||||||
Element modelsRootElement = XmlHelper.parseDocument(modelsFile).getRootElement();
|
|
||||||
this.modelsFileDate = modelsFile.lastModified();
|
|
||||||
|
|
||||||
// ROLES
|
|
||||||
// get roles element
|
|
||||||
Element rolesElement = modelsRootElement.element(XmlConstants.XML_ROLES);
|
|
||||||
// read roles
|
|
||||||
Map<String, Role> roles = readRoles(rolesElement);
|
|
||||||
this.roleMap = roles;
|
|
||||||
|
|
||||||
// USERS
|
|
||||||
// get users element
|
|
||||||
Element usersElement = modelsRootElement.element(XmlConstants.XML_USERS);
|
|
||||||
// read users
|
|
||||||
Map<String, User> users = readUsers(usersElement);
|
|
||||||
this.userMap = users;
|
|
||||||
|
|
||||||
this.userMapDirty = false;
|
|
||||||
this.roleMapDirty = false;
|
|
||||||
|
|
||||||
XmlPersistenceHandler.logger.info("Read " + this.userMap.size() + " Users");
|
|
||||||
XmlPersistenceHandler.logger.info("Read " + this.roleMap.size() + " Roles");
|
|
||||||
|
|
||||||
// validate we have a user with PrivilegeAdmin access
|
|
||||||
boolean privilegeAdminExists = false;
|
|
||||||
for (String username : this.userMap.keySet()) {
|
|
||||||
User user = this.userMap.get(username);
|
|
||||||
if (user.hasRole(PrivilegeHandler.PRIVILEGE_ADMIN_ROLE)) {
|
|
||||||
privilegeAdminExists = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!privilegeAdminExists) {
|
|
||||||
XmlPersistenceHandler.logger.warn("No User with role '" + PrivilegeHandler.PRIVILEGE_ADMIN_ROLE
|
|
||||||
+ "' exists. Privilege modifications will not be possible!");
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see ch.eitchnet.privilege.handler.PersistenceHandler#initialize(java.util.Map)
|
* @see ch.eitchnet.privilege.handler.PersistenceHandler#initialize(java.util.Map)
|
||||||
*/
|
*/
|
||||||
|
@ -284,317 +164,94 @@ public class XmlPersistenceHandler implements PersistenceHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses {@link User} objects from their XML representations
|
* @see ch.eitchnet.privilege.handler.PersistenceHandler#reload()
|
||||||
*
|
|
||||||
* @param usersRootElement
|
|
||||||
* the element containing suer elements
|
|
||||||
*
|
|
||||||
* @return the map of converted {@link User} objects
|
|
||||||
*/
|
*/
|
||||||
protected Map<String, User> readUsers(Element usersRootElement) {
|
@Override
|
||||||
|
public boolean reload() {
|
||||||
|
|
||||||
Map<String, User> userMap = new HashMap<String, User>();
|
// validate file exists
|
||||||
|
File modelsFile = new File(this.modelPath);
|
||||||
@SuppressWarnings("unchecked")
|
if (!modelsFile.exists()) {
|
||||||
List<Element> userElements = usersRootElement.elements(XmlConstants.XML_USER);
|
throw new PrivilegeException("[" + PersistenceHandler.class.getName() + "] Defined parameter "
|
||||||
for (Element userElement : userElements) {
|
+ XmlConstants.XML_PARAM_MODEL_FILE + " is invalid as models file does not exist at path "
|
||||||
|
+ modelsFile.getAbsolutePath());
|
||||||
String userId = userElement.attributeValue(XmlConstants.XML_ATTR_USER_ID);
|
|
||||||
|
|
||||||
String username = userElement.attributeValue(XmlConstants.XML_ATTR_USERNAME);
|
|
||||||
String password = userElement.attributeValue(XmlConstants.XML_ATTR_PASSWORD);
|
|
||||||
|
|
||||||
String firstname = userElement.element(XmlConstants.XML_FIRSTNAME).getTextTrim();
|
|
||||||
String surname = userElement.element(XmlConstants.XML_SURNAME).getTextTrim();
|
|
||||||
|
|
||||||
UserState userState = UserState.valueOf(userElement.element(XmlConstants.XML_STATE).getTextTrim());
|
|
||||||
|
|
||||||
// TODO better parsing needed
|
|
||||||
String localeName = userElement.element(XmlConstants.XML_LOCALE).getTextTrim();
|
|
||||||
Locale locale = new Locale(localeName);
|
|
||||||
|
|
||||||
// read roles
|
|
||||||
Element rolesElement = userElement.element(XmlConstants.XML_ROLES);
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
List<Element> rolesElementList = rolesElement.elements(XmlConstants.XML_ROLE);
|
|
||||||
Set<String> roles = new HashSet<String>();
|
|
||||||
for (Element roleElement : rolesElementList) {
|
|
||||||
String roleName = roleElement.getTextTrim();
|
|
||||||
if (roleName.isEmpty()) {
|
|
||||||
XmlPersistenceHandler.logger.error("User " + username
|
|
||||||
+ " has a role defined with no name, Skipped.");
|
|
||||||
} else if (!this.roleMap.containsKey(roleName)) {
|
|
||||||
XmlPersistenceHandler.logger.error("User " + username + " has a inexistant role " + roleName
|
|
||||||
+ ", Skipped.");
|
|
||||||
} else {
|
|
||||||
roles.add(roleName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// read properties
|
|
||||||
Element propertiesElement = userElement.element(XmlConstants.XML_PROPERTIES);
|
|
||||||
Map<String, String> propertyMap = XmlPersistenceHandler.convertToPropertyMap(propertiesElement);
|
|
||||||
|
|
||||||
// create user
|
|
||||||
User user = new User(userId, username, password, firstname, surname, userState, roles, locale, propertyMap);
|
|
||||||
|
|
||||||
// put user in map
|
|
||||||
userMap.put(username, user);
|
|
||||||
XmlPersistenceHandler.logger.info("Loaded user " + user);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return userMap;
|
this.roleMap = Collections.synchronizedMap(new HashMap<String, Role>());
|
||||||
|
this.userMap = Collections.synchronizedMap(new HashMap<String, User>());
|
||||||
|
|
||||||
|
// parse models xml file to XML document
|
||||||
|
PrivilegeModelSaxReader xmlHandler = new PrivilegeModelSaxReader();
|
||||||
|
XmlHelper.parseDocument(modelsFile, xmlHandler);
|
||||||
|
|
||||||
|
this.modelsFileDate = modelsFile.lastModified();
|
||||||
|
|
||||||
|
// ROLES
|
||||||
|
List<Role> roles = xmlHandler.getRoles();
|
||||||
|
for (Role role : roles) {
|
||||||
|
this.roleMap.put(role.getName(), role);
|
||||||
|
}
|
||||||
|
|
||||||
|
// USERS
|
||||||
|
List<User> users = xmlHandler.getUsers();
|
||||||
|
for (User user : users) {
|
||||||
|
this.userMap.put(user.getUsername(), user);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.userMapDirty = false;
|
||||||
|
this.roleMapDirty = false;
|
||||||
|
|
||||||
|
XmlPersistenceHandler.logger.info("Read " + this.userMap.size() + " Users");
|
||||||
|
XmlPersistenceHandler.logger.info("Read " + this.roleMap.size() + " Roles");
|
||||||
|
|
||||||
|
// validate we have a user with PrivilegeAdmin access
|
||||||
|
boolean privilegeAdminExists = false;
|
||||||
|
for (String username : this.userMap.keySet()) {
|
||||||
|
User user = this.userMap.get(username);
|
||||||
|
if (user.hasRole(PrivilegeHandler.PRIVILEGE_ADMIN_ROLE)) {
|
||||||
|
privilegeAdminExists = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!privilegeAdminExists) {
|
||||||
|
XmlPersistenceHandler.logger.warn("No User with role '" + PrivilegeHandler.PRIVILEGE_ADMIN_ROLE
|
||||||
|
+ "' exists. Privilege modifications will not be possible!");
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses {@link Role} objects from their XML representations
|
* @see ch.eitchnet.privilege.handler.PersistenceHandler#persist()
|
||||||
*
|
|
||||||
* @param rolesRootElement
|
|
||||||
* the element containing role elements
|
|
||||||
*
|
|
||||||
* @return the map of converted {@link Role} objects
|
|
||||||
*/
|
*/
|
||||||
protected Map<String, Role> readRoles(Element rolesRootElement) {
|
@Override
|
||||||
|
public boolean persist() {
|
||||||
|
|
||||||
Map<String, Role> roleMap = new HashMap<String, Role>();
|
// get models file name
|
||||||
|
String modelFileName = this.parameterMap.get(XmlConstants.XML_PARAM_MODEL_FILE);
|
||||||
@SuppressWarnings("unchecked")
|
if (modelFileName == null || modelFileName.isEmpty()) {
|
||||||
List<Element> roleElements = rolesRootElement.elements(XmlConstants.XML_ROLE);
|
throw new PrivilegeException("[" + PersistenceHandler.class.getName() + "] Defined parameter "
|
||||||
for (Element roleElement : roleElements) {
|
+ XmlConstants.XML_PARAM_MODEL_FILE + " is invalid");
|
||||||
|
|
||||||
String roleName = roleElement.attributeValue(XmlConstants.XML_ATTR_NAME);
|
|
||||||
|
|
||||||
Map<String, Privilege> privilegeMap = readPrivileges(roleElement);
|
|
||||||
|
|
||||||
Role role = new Role(roleName, privilegeMap);
|
|
||||||
roleMap.put(roleName, role);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return roleMap;
|
// get model file
|
||||||
}
|
File modelFile = new File(this.modelPath);
|
||||||
|
boolean modelFileUnchanged = modelFile.exists() && modelFile.lastModified() == this.modelsFileDate;
|
||||||
/**
|
if (modelFileUnchanged && !this.roleMapDirty && !this.userMapDirty) {
|
||||||
* Parses {@link Privilege} objects from their XML representation to their objects
|
XmlPersistenceHandler.logger
|
||||||
*
|
.warn("Not persisting as current file is unchanged and model data is not dirty");
|
||||||
* @param roleParentElement
|
return false;
|
||||||
* the parent on which the Privilege XML elements are
|
|
||||||
*
|
|
||||||
* @return the map of {@link Privilege} objects
|
|
||||||
*/
|
|
||||||
protected Map<String, Privilege> readPrivileges(Element roleParentElement) {
|
|
||||||
|
|
||||||
Map<String, Privilege> privilegeMap = new HashMap<String, Privilege>();
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
List<Element> privilegeElements = roleParentElement.elements(XmlConstants.XML_PRIVILEGE);
|
|
||||||
for (Element privilegeElement : privilegeElements) {
|
|
||||||
|
|
||||||
String privilegeName = privilegeElement.attributeValue(XmlConstants.XML_ATTR_NAME);
|
|
||||||
String privilegePolicy = privilegeElement.attributeValue(XmlConstants.XML_ATTR_POLICY);
|
|
||||||
|
|
||||||
Element allAllowedE = privilegeElement.element(XmlConstants.XML_ALL_ALLOWED);
|
|
||||||
boolean allAllowed = false;
|
|
||||||
if (allAllowedE != null) {
|
|
||||||
allAllowed = Boolean.valueOf(allAllowedE.getTextTrim()).booleanValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
List<Element> denyElements = privilegeElement.elements(XmlConstants.XML_DENY);
|
|
||||||
Set<String> denyList = new HashSet<String>(denyElements.size());
|
|
||||||
for (Element denyElement : denyElements) {
|
|
||||||
String denyValue = denyElement.getTextTrim();
|
|
||||||
if (!denyValue.isEmpty())
|
|
||||||
denyList.add(denyValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
List<Element> allowElements = privilegeElement.elements(XmlConstants.XML_ALLOW);
|
|
||||||
Set<String> allowList = new HashSet<String>(allowElements.size());
|
|
||||||
for (Element allowElement : allowElements) {
|
|
||||||
String allowValue = allowElement.getTextTrim();
|
|
||||||
if (!allowValue.isEmpty())
|
|
||||||
allowList.add(allowValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
Privilege privilege = new Privilege(privilegeName, privilegePolicy, allAllowed, denyList, allowList);
|
|
||||||
privilegeMap.put(privilegeName, privilege);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return privilegeMap;
|
// delegate writing
|
||||||
}
|
PrivilegeModelDomWriter modelWriter = new PrivilegeModelDomWriter(getAllUsers(), getAllRoles(), modelFile);
|
||||||
|
modelWriter.write();
|
||||||
|
|
||||||
/**
|
// reset dirty states
|
||||||
* Converts {@link User} objects to their XML representations
|
this.userMapDirty = false;
|
||||||
*
|
this.roleMapDirty = false;
|
||||||
* @param userMap
|
|
||||||
* the map of users to convert
|
|
||||||
*
|
|
||||||
* @return the list of XML User elements
|
|
||||||
*/
|
|
||||||
protected static List<Element> toDomUsers(Map<String, User> userMap) {
|
|
||||||
|
|
||||||
List<Element> usersAsElements = new ArrayList<Element>(userMap.size());
|
return true;
|
||||||
|
|
||||||
DocumentFactory documentFactory = DocumentFactory.getInstance();
|
|
||||||
|
|
||||||
synchronized (userMap) {
|
|
||||||
for (String userName : userMap.keySet()) {
|
|
||||||
|
|
||||||
// get the user object
|
|
||||||
User user = userMap.get(userName);
|
|
||||||
|
|
||||||
// create the user element
|
|
||||||
Element userElement = documentFactory.createElement(XmlConstants.XML_USER);
|
|
||||||
userElement.addAttribute(XmlConstants.XML_ATTR_USER_ID, user.getUserId());
|
|
||||||
userElement.addAttribute(XmlConstants.XML_ATTR_USERNAME, user.getUsername());
|
|
||||||
userElement.addAttribute(XmlConstants.XML_ATTR_PASSWORD, user.getPassword());
|
|
||||||
|
|
||||||
// add first name element
|
|
||||||
Element firstnameElement = documentFactory.createElement(XmlConstants.XML_FIRSTNAME);
|
|
||||||
firstnameElement.setText(user.getFirstname());
|
|
||||||
userElement.add(firstnameElement);
|
|
||||||
|
|
||||||
// add surname element
|
|
||||||
Element surnameElement = documentFactory.createElement(XmlConstants.XML_SURNAME);
|
|
||||||
surnameElement.setText(user.getSurname());
|
|
||||||
userElement.add(surnameElement);
|
|
||||||
|
|
||||||
// add state element
|
|
||||||
Element stateElement = documentFactory.createElement(XmlConstants.XML_STATE);
|
|
||||||
stateElement.setText(user.getUserState().toString());
|
|
||||||
userElement.add(stateElement);
|
|
||||||
|
|
||||||
// add locale element
|
|
||||||
Element localeElement = documentFactory.createElement(XmlConstants.XML_LOCALE);
|
|
||||||
localeElement.setText(user.getLocale().toString());
|
|
||||||
userElement.add(localeElement);
|
|
||||||
|
|
||||||
// add all the role elements
|
|
||||||
Element rolesElement = documentFactory.createElement(XmlConstants.XML_ROLES);
|
|
||||||
userElement.add(rolesElement);
|
|
||||||
for (String roleName : user.getRoles()) {
|
|
||||||
Element roleElement = documentFactory.createElement(XmlConstants.XML_ROLE);
|
|
||||||
roleElement.setText(roleName);
|
|
||||||
rolesElement.add(roleElement);
|
|
||||||
}
|
|
||||||
|
|
||||||
// add element to return list
|
|
||||||
usersAsElements.add(userElement);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return usersAsElements;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts {@link Role} objects to their XML representations
|
|
||||||
*
|
|
||||||
* @param roleMap
|
|
||||||
* the roles to convert
|
|
||||||
*
|
|
||||||
* @return the list of XML Role elements
|
|
||||||
*/
|
|
||||||
protected static List<Element> toDomRoles(Map<String, Role> roleMap) {
|
|
||||||
|
|
||||||
List<Element> rolesAsElements = new ArrayList<Element>(roleMap.size());
|
|
||||||
|
|
||||||
DocumentFactory documentFactory = DocumentFactory.getInstance();
|
|
||||||
|
|
||||||
synchronized (roleMap) {
|
|
||||||
for (String roleName : roleMap.keySet()) {
|
|
||||||
|
|
||||||
// get the role object
|
|
||||||
Role role = roleMap.get(roleName);
|
|
||||||
|
|
||||||
// create the role element
|
|
||||||
Element roleElement = documentFactory.createElement(XmlConstants.XML_ROLE);
|
|
||||||
roleElement.addAttribute(XmlConstants.XML_ATTR_NAME, role.getName());
|
|
||||||
|
|
||||||
// add all the privileges
|
|
||||||
XmlPersistenceHandler.toDomPrivileges(roleElement, role.getPrivilegeMap());
|
|
||||||
|
|
||||||
// add element to return list
|
|
||||||
rolesAsElements.add(roleElement);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return rolesAsElements;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts {@link Privilege} objects to their XML representation
|
|
||||||
*
|
|
||||||
* @param roleParentElement
|
|
||||||
* the XML element of the parent {@link Role}
|
|
||||||
* @param privilegeMap
|
|
||||||
* the map of {@link Privilege}s to convert
|
|
||||||
*/
|
|
||||||
protected static void toDomPrivileges(Element roleParentElement, Map<String, Privilege> privilegeMap) {
|
|
||||||
|
|
||||||
DocumentFactory documentFactory = DocumentFactory.getInstance();
|
|
||||||
|
|
||||||
for (Privilege privilege : privilegeMap.values()) {
|
|
||||||
|
|
||||||
// create the privilege element
|
|
||||||
Element privilegeElement = documentFactory.createElement(XmlConstants.XML_PRIVILEGE);
|
|
||||||
privilegeElement.addAttribute(XmlConstants.XML_ATTR_NAME, privilege.getName());
|
|
||||||
privilegeElement.addAttribute(XmlConstants.XML_ATTR_POLICY, privilege.getPolicy());
|
|
||||||
|
|
||||||
// add the all allowed element
|
|
||||||
Element allAllowedElement = documentFactory.createElement(XmlConstants.XML_ALL_ALLOWED);
|
|
||||||
allAllowedElement.setText(Boolean.toString(privilege.isAllAllowed()));
|
|
||||||
privilegeElement.add(allAllowedElement);
|
|
||||||
|
|
||||||
// add all the deny values
|
|
||||||
for (String denyValue : privilege.getDenyList()) {
|
|
||||||
Element denyValueElement = documentFactory.createElement(XmlConstants.XML_DENY);
|
|
||||||
denyValueElement.setText(denyValue);
|
|
||||||
privilegeElement.add(denyValueElement);
|
|
||||||
}
|
|
||||||
|
|
||||||
// add all the allow values
|
|
||||||
for (String allowValue : privilege.getAllowList()) {
|
|
||||||
Element allowValueElement = documentFactory.createElement(XmlConstants.XML_ALLOW);
|
|
||||||
allowValueElement.setText(allowValue);
|
|
||||||
privilegeElement.add(allowValueElement);
|
|
||||||
}
|
|
||||||
|
|
||||||
// add element to parent
|
|
||||||
roleParentElement.add(privilegeElement);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts an {@link XmlConstants#XML_PROPERTIES} element containing {@link XmlConstants#XML_PROPERTY} elements to
|
|
||||||
* a {@link Map} of String key/value pairs
|
|
||||||
*
|
|
||||||
* @param element
|
|
||||||
* the XML {@link Element} with name {@link XmlConstants#XML_PROPERTIES} containing
|
|
||||||
* {@link XmlConstants#XML_PROPERTY} elements
|
|
||||||
*
|
|
||||||
* @return the {@link Map} of the property name/value combinations from the given {@link Element}
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
protected static Map<String, String> convertToPropertyMap(Element element) {
|
|
||||||
|
|
||||||
// if element is null then there are no properties, so return empty map
|
|
||||||
if (element == null)
|
|
||||||
return Collections.emptyMap();
|
|
||||||
|
|
||||||
List<Element> elements = element.elements(XmlConstants.XML_PROPERTY);
|
|
||||||
|
|
||||||
// if elements is null or empty then there are no properties, so return empty map
|
|
||||||
if (elements == null || elements.isEmpty())
|
|
||||||
return Collections.emptyMap();
|
|
||||||
|
|
||||||
Map<String, String> propertyMap = new HashMap<String, String>();
|
|
||||||
|
|
||||||
for (Element property : elements) {
|
|
||||||
String name = property.attributeValue(XmlConstants.XML_ATTR_NAME);
|
|
||||||
String value = property.attributeValue(XmlConstants.XML_ATTR_VALUE);
|
|
||||||
propertyMap.put(name, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return propertyMap;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,12 +20,12 @@
|
||||||
package ch.eitchnet.privilege.helper;
|
package ch.eitchnet.privilege.helper;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.HashMap;
|
||||||
import org.dom4j.Document;
|
import java.util.Map;
|
||||||
import org.dom4j.DocumentFactory;
|
|
||||||
import org.dom4j.Element;
|
|
||||||
|
|
||||||
import ch.eitchnet.privilege.handler.PrivilegeHandler;
|
import ch.eitchnet.privilege.handler.PrivilegeHandler;
|
||||||
|
import ch.eitchnet.privilege.model.internal.PrivilegeContainerModel;
|
||||||
|
import ch.eitchnet.privilege.xml.PrivilegeConfigDomWriter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -46,7 +46,7 @@ import ch.eitchnet.privilege.handler.PrivilegeHandler;
|
||||||
*/
|
*/
|
||||||
public class BootstrapConfigurationHelper {
|
public class BootstrapConfigurationHelper {
|
||||||
|
|
||||||
// private static final Logger logger = LoggerFactory.getLogger(BootstrapConfigurationHelper.class);
|
// private static final Logger logger = Loggerdoc.getLogger(BootstrapConfigurationHelper.class);
|
||||||
|
|
||||||
private static String path;
|
private static String path;
|
||||||
|
|
||||||
|
@ -81,81 +81,29 @@ public class BootstrapConfigurationHelper {
|
||||||
throw new RuntimeException("Could not create path " + pathF.getAbsolutePath());
|
throw new RuntimeException("Could not create path " + pathF.getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Map<String, String> parameterMap = new HashMap<String, String>();
|
||||||
|
Map<String, String> encryptionHandlerParameterMap = new HashMap<String, String>();
|
||||||
|
Map<String, String> persistenceHandlerParameterMap = new HashMap<String, String>();
|
||||||
|
|
||||||
// TODO ask other questions...
|
// TODO ask other questions...
|
||||||
|
parameterMap.put("autoPersistOnPasswordChange", "true");
|
||||||
|
encryptionHandlerParameterMap.put("hashAlgorithm", "SHA-256");
|
||||||
|
persistenceHandlerParameterMap.put("basePath", "./target/test");
|
||||||
|
persistenceHandlerParameterMap.put("modelXmlFile", "PrivilegeModel.xml");
|
||||||
|
|
||||||
|
PrivilegeContainerModel containerModel = new PrivilegeContainerModel();
|
||||||
|
containerModel.setParameterMap(parameterMap);
|
||||||
|
containerModel.setEncryptionHandlerClassName(defaultEncryptionHandler);
|
||||||
|
containerModel.setEncryptionHandlerParameterMap(encryptionHandlerParameterMap);
|
||||||
|
containerModel.setPersistenceHandlerClassName(defaultPersistenceHandler);
|
||||||
|
containerModel.setPersistenceHandlerParameterMap(persistenceHandlerParameterMap);
|
||||||
|
|
||||||
|
containerModel.addPolicy("DefaultPrivilege", "ch.eitchnet.privilege.policy.DefaultPrivilege");
|
||||||
|
|
||||||
// now perform work:
|
// now perform work:
|
||||||
BootstrapConfigurationHelper.createXmlPrivilegeContainer();
|
File configFile = new File(BootstrapConfigurationHelper.path + "/"
|
||||||
BootstrapConfigurationHelper.createPolicyConfiguration();
|
|
||||||
BootstrapConfigurationHelper.createModel();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static void createModel() {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static void createPolicyConfiguration() {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
private static void createXmlPrivilegeContainer() {
|
|
||||||
|
|
||||||
// create document root
|
|
||||||
DocumentFactory factory = DocumentFactory.getInstance();
|
|
||||||
Document doc = factory.createDocument(XmlHelper.DEFAULT_ENCODING);
|
|
||||||
doc.setName(XmlConstants.XML_ROOT_PRIVILEGE);
|
|
||||||
Element rootElement = factory.createElement(XmlConstants.XML_ROOT_PRIVILEGE);
|
|
||||||
doc.setRootElement(rootElement);
|
|
||||||
|
|
||||||
Element containerElement = factory.createElement(XmlConstants.XML_CONTAINER);
|
|
||||||
|
|
||||||
Element parameterElement;
|
|
||||||
Element parametersElement;
|
|
||||||
|
|
||||||
// create PersistenceHandler
|
|
||||||
Element persistenceHandlerElem = factory.createElement(XmlConstants.XML_HANDLER_PERSISTENCE);
|
|
||||||
containerElement.add(persistenceHandlerElem);
|
|
||||||
persistenceHandlerElem.addAttribute(XmlConstants.XML_ATTR_CLASS,
|
|
||||||
BootstrapConfigurationHelper.defaultPersistenceHandler);
|
|
||||||
parametersElement = factory.createElement(XmlConstants.XML_PARAMETERS);
|
|
||||||
persistenceHandlerElem.add(parametersElement);
|
|
||||||
// Parameter basePath
|
|
||||||
parameterElement = factory.createElement(XmlConstants.XML_PARAMETER);
|
|
||||||
parameterElement.addAttribute(XmlConstants.XML_ATTR_NAME, XmlConstants.XML_PARAM_BASE_PATH);
|
|
||||||
parameterElement.addAttribute(XmlConstants.XML_ATTR_VALUE, BootstrapConfigurationHelper.basePath);
|
|
||||||
parametersElement.add(parameterElement);
|
|
||||||
// Parameter modelXmlFile
|
|
||||||
parameterElement = factory.createElement(XmlConstants.XML_PARAMETER);
|
|
||||||
parameterElement.addAttribute(XmlConstants.XML_ATTR_NAME, XmlConstants.XML_PARAM_MODEL_FILE);
|
|
||||||
parameterElement.addAttribute(XmlConstants.XML_ATTR_VALUE, BootstrapConfigurationHelper.modelFileName);
|
|
||||||
parametersElement.add(parameterElement);
|
|
||||||
|
|
||||||
// create EncryptionHandler
|
|
||||||
Element encryptionHandlerElem = factory.createElement(XmlConstants.XML_HANDLER_ENCRYPTION);
|
|
||||||
containerElement.add(encryptionHandlerElem);
|
|
||||||
encryptionHandlerElem.addAttribute(XmlConstants.XML_ATTR_CLASS,
|
|
||||||
BootstrapConfigurationHelper.defaultEncryptionHandler);
|
|
||||||
parametersElement = factory.createElement(XmlConstants.XML_PARAMETERS);
|
|
||||||
encryptionHandlerElem.add(parametersElement);
|
|
||||||
// Parameter hashAlgorithm
|
|
||||||
parameterElement = factory.createElement(XmlConstants.XML_PARAMETER);
|
|
||||||
parameterElement.addAttribute(XmlConstants.XML_ATTR_NAME, XmlConstants.XML_PARAM_HASH_ALGORITHM);
|
|
||||||
parameterElement.addAttribute(XmlConstants.XML_ATTR_VALUE, BootstrapConfigurationHelper.hashAlgorithm);
|
|
||||||
parametersElement.add(parameterElement);
|
|
||||||
|
|
||||||
// write the container file to disk
|
|
||||||
File privilegeContainerFile = new File(BootstrapConfigurationHelper.path + "/"
|
|
||||||
+ BootstrapConfigurationHelper.defaultPrivilegeContainerXmlFile);
|
+ BootstrapConfigurationHelper.defaultPrivilegeContainerXmlFile);
|
||||||
XmlHelper.writeDocument(doc, privilegeContainerFile);
|
PrivilegeConfigDomWriter configSaxWriter = new PrivilegeConfigDomWriter(containerModel, configFile);
|
||||||
|
configSaxWriter.write();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,204 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2010 - 2012
|
|
||||||
*
|
|
||||||
* This file is part of Privilege.
|
|
||||||
*
|
|
||||||
* Privilege is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Privilege is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Privilege. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package ch.eitchnet.privilege.helper;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.dom4j.Element;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import ch.eitchnet.privilege.base.PrivilegeException;
|
|
||||||
import ch.eitchnet.privilege.handler.DefaultPrivilegeHandler;
|
|
||||||
import ch.eitchnet.privilege.handler.EncryptionHandler;
|
|
||||||
import ch.eitchnet.privilege.handler.PersistenceHandler;
|
|
||||||
import ch.eitchnet.privilege.handler.PrivilegeHandler;
|
|
||||||
import ch.eitchnet.privilege.policy.PrivilegePolicy;
|
|
||||||
import ch.eitchnet.utils.helper.StringHelper;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class implements the initializing of the {@link PrivilegeHandler} by loading an XML file containing the
|
|
||||||
* configuration
|
|
||||||
*
|
|
||||||
* @author Robert von Burg <eitch@eitchnet.ch>
|
|
||||||
*/
|
|
||||||
public class InitializationHelper {
|
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(InitializationHelper.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes the {@link DefaultPrivilegeHandler} from the configuration file
|
|
||||||
*
|
|
||||||
* @param privilegeXmlFile
|
|
||||||
* a {@link File} reference to the XML file containing the configuration for Privilege
|
|
||||||
*
|
|
||||||
* @return the {@link PrivilegeHandler} instance loaded from the configuration file
|
|
||||||
*/
|
|
||||||
public static PrivilegeHandler initializeFromXml(File privilegeXmlFile) {
|
|
||||||
|
|
||||||
// make sure file exists
|
|
||||||
if (!privilegeXmlFile.exists()) {
|
|
||||||
throw new PrivilegeException("Privilege file does not exist at path " + privilegeXmlFile.getAbsolutePath());
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse container xml file to XML document
|
|
||||||
Element rootElement = XmlHelper.parseDocument(privilegeXmlFile).getRootElement();
|
|
||||||
Element containerElement = rootElement.element(XmlConstants.XML_CONTAINER);
|
|
||||||
|
|
||||||
// instantiate encryption handler
|
|
||||||
Element encryptionHandlerElement = containerElement.element(XmlConstants.XML_HANDLER_ENCRYPTION);
|
|
||||||
String encryptionHandlerClassName = encryptionHandlerElement.attributeValue(XmlConstants.XML_ATTR_CLASS);
|
|
||||||
EncryptionHandler encryptionHandler = ClassHelper.instantiateClass(encryptionHandlerClassName);
|
|
||||||
|
|
||||||
// instantiate persistence handler
|
|
||||||
Element persistenceHandlerElement = containerElement.element(XmlConstants.XML_HANDLER_PERSISTENCE);
|
|
||||||
String persistenceHandlerClassName = persistenceHandlerElement.attributeValue(XmlConstants.XML_ATTR_CLASS);
|
|
||||||
PersistenceHandler persistenceHandler = ClassHelper.instantiateClass(persistenceHandlerClassName);
|
|
||||||
|
|
||||||
// instantiate privilege handler
|
|
||||||
DefaultPrivilegeHandler privilegeHandler = new DefaultPrivilegeHandler();
|
|
||||||
|
|
||||||
// get policies
|
|
||||||
Element policiesElement = rootElement.element(XmlConstants.XML_POLICIES);
|
|
||||||
Map<String, Class<PrivilegePolicy>> policyMap = InitializationHelper.convertToPolicyMap(policiesElement);
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
// get parameters
|
|
||||||
Element parameterElement = encryptionHandlerElement.element(XmlConstants.XML_PARAMETERS);
|
|
||||||
Map<String, String> parameterMap = InitializationHelper.convertToParameterMap(parameterElement);
|
|
||||||
|
|
||||||
// initialize encryption handler
|
|
||||||
encryptionHandler.initialize(parameterMap);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
InitializationHelper.logger.error(e.getMessage(), e);
|
|
||||||
throw new PrivilegeException("EncryptionHandler " + encryptionHandlerClassName
|
|
||||||
+ " could not be initialized");
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
// get parameters
|
|
||||||
Element parameterElement = persistenceHandlerElement.element(XmlConstants.XML_PARAMETERS);
|
|
||||||
Map<String, String> parameterMap = InitializationHelper.convertToParameterMap(parameterElement);
|
|
||||||
|
|
||||||
// initialize persistence handler
|
|
||||||
persistenceHandler.initialize(parameterMap);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
InitializationHelper.logger.error(e.getMessage(), e);
|
|
||||||
throw new PrivilegeException("PersistenceHandler " + persistenceHandlerElement
|
|
||||||
+ " could not be initialized");
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
// get parameters
|
|
||||||
Element parameterElement = containerElement.element(XmlConstants.XML_PARAMETERS);
|
|
||||||
Map<String, String> parameterMap = InitializationHelper.convertToParameterMap(parameterElement);
|
|
||||||
|
|
||||||
// initialize privilege handler
|
|
||||||
privilegeHandler.initialize(parameterMap, encryptionHandler, persistenceHandler, policyMap);
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
|
||||||
InitializationHelper.logger.error(e.getMessage(), e);
|
|
||||||
throw new PrivilegeException("PrivilegeHandler " + privilegeHandler.getClass().getName()
|
|
||||||
+ " could not be initialized");
|
|
||||||
}
|
|
||||||
|
|
||||||
return privilegeHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts an {@link XmlConstants#XML_PARAMETERS} element containing {@link XmlConstants#XML_PARAMETER} elements to
|
|
||||||
* a {@link Map} of String key/value pairs
|
|
||||||
*
|
|
||||||
* @param element
|
|
||||||
* the XML {@link Element} with name {@link XmlConstants#XML_PARAMETERS} containing
|
|
||||||
* {@link XmlConstants#XML_PARAMETER} elements
|
|
||||||
*
|
|
||||||
* @return the {@link Map} of the parameter name/value combinations from the given {@link Element}
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public static Map<String, String> convertToParameterMap(Element element) {
|
|
||||||
|
|
||||||
// if element is null then there are no parameters, so return empty map
|
|
||||||
if (element == null)
|
|
||||||
return Collections.emptyMap();
|
|
||||||
|
|
||||||
List<Element> elements = element.elements(XmlConstants.XML_PARAMETER);
|
|
||||||
|
|
||||||
// if elements is null or empty then there are no parameters, so return empty map
|
|
||||||
if (elements == null || elements.isEmpty())
|
|
||||||
return Collections.emptyMap();
|
|
||||||
|
|
||||||
Map<String, String> parameterMap = new HashMap<String, String>();
|
|
||||||
|
|
||||||
for (Element parameter : elements) {
|
|
||||||
String name = parameter.attributeValue(XmlConstants.XML_ATTR_NAME);
|
|
||||||
String value = parameter.attributeValue(XmlConstants.XML_ATTR_VALUE);
|
|
||||||
|
|
||||||
// replace any defined system properties
|
|
||||||
value = StringHelper.replaceSystemPropertiesIn(value);
|
|
||||||
|
|
||||||
parameterMap.put(name, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return parameterMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts an {@link XmlConstants#XML_POLICIES} element containing {@link XmlConstants#XML_POLICY} elements to a
|
|
||||||
* {@link Map} of String/Class pairs
|
|
||||||
*
|
|
||||||
* @param element
|
|
||||||
* the XML {@link Element} with name {@link XmlConstants#XML_POLICIES} containing
|
|
||||||
* {@link XmlConstants#XML_POLICY} elements
|
|
||||||
*
|
|
||||||
* @return the {@link Map} of the policy name/class combinations from the given {@link Element}
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public static Map<String, Class<PrivilegePolicy>> convertToPolicyMap(Element element) {
|
|
||||||
|
|
||||||
Map<String, Class<PrivilegePolicy>> policyMap = new HashMap<String, Class<PrivilegePolicy>>();
|
|
||||||
|
|
||||||
List<Element> policyElements = element.elements(XmlConstants.XML_POLICY);
|
|
||||||
for (Element policyElement : policyElements) {
|
|
||||||
String policyName = policyElement.attributeValue(XmlConstants.XML_ATTR_NAME);
|
|
||||||
String policyClass = policyElement.attributeValue(XmlConstants.XML_ATTR_CLASS);
|
|
||||||
|
|
||||||
Class<PrivilegePolicy> clazz;
|
|
||||||
try {
|
|
||||||
clazz = ClassHelper.loadClass(policyClass);
|
|
||||||
} catch (PrivilegeException e) {
|
|
||||||
throw new PrivilegeException("The Policy with name " + policyName + " does not exist", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
policyMap.put(policyName, clazz);
|
|
||||||
}
|
|
||||||
|
|
||||||
return policyMap;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -20,24 +20,30 @@
|
||||||
package ch.eitchnet.privilege.helper;
|
package ch.eitchnet.privilege.helper;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
|
|
||||||
import org.dom4j.Document;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import org.dom4j.DocumentException;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
import org.dom4j.DocumentFactory;
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
import org.dom4j.Element;
|
import javax.xml.parsers.SAXParser;
|
||||||
import org.dom4j.io.OutputFormat;
|
import javax.xml.parsers.SAXParserFactory;
|
||||||
import org.dom4j.io.SAXReader;
|
import javax.xml.transform.OutputKeys;
|
||||||
import org.dom4j.io.XMLWriter;
|
import javax.xml.transform.Source;
|
||||||
|
import javax.xml.transform.Transformer;
|
||||||
|
import javax.xml.transform.TransformerFactory;
|
||||||
|
import javax.xml.transform.dom.DOMSource;
|
||||||
|
import javax.xml.transform.stream.StreamResult;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.w3c.dom.DOMException;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
import org.xml.sax.helpers.DefaultHandler;
|
||||||
|
|
||||||
import ch.eitchnet.privilege.base.PrivilegeException;
|
import ch.eitchnet.privilege.base.PrivilegeException;
|
||||||
|
import ch.eitchnet.utils.exceptions.XmlException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper class for performing XML based tasks using Dom4J
|
* Helper class for performing XML based tasks using Dom4J
|
||||||
|
@ -61,22 +67,22 @@ public class XmlHelper {
|
||||||
*
|
*
|
||||||
* @return a {@link Document} object containing the dom4j {@link Element}s of the XML file
|
* @return a {@link Document} object containing the dom4j {@link Element}s of the XML file
|
||||||
*/
|
*/
|
||||||
public static Document parseDocument(File xmlFile) {
|
public static void parseDocument(File xmlFile, DefaultHandler xmlHandler) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
InputStream inStream = new FileInputStream(xmlFile);
|
SAXParserFactory spf = SAXParserFactory.newInstance();
|
||||||
|
|
||||||
SAXReader reader = new SAXReader();
|
SAXParser sp = spf.newSAXParser();
|
||||||
Document document = reader.read(inStream);
|
XmlHelper.logger.info("Parsing XML document " + xmlFile.getAbsolutePath());
|
||||||
|
sp.parse(xmlFile, xmlHandler);
|
||||||
|
|
||||||
XmlHelper.logger.info("Read XML document " + document.getRootElement().getName());
|
} catch (ParserConfigurationException e) {
|
||||||
return document;
|
throw new PrivilegeException("Failed to initialize a SAX Parser: " + e.getLocalizedMessage(), e);
|
||||||
|
} catch (SAXException e) {
|
||||||
} catch (FileNotFoundException e) {
|
throw new PrivilegeException("The XML file " + xmlFile.getAbsolutePath() + " is not parseable:", e);
|
||||||
throw new PrivilegeException("The XML file does not exist or is not readable: " + xmlFile.getAbsolutePath());
|
} catch (IOException e) {
|
||||||
} catch (DocumentException e) {
|
throw new PrivilegeException("The XML could not be read: " + xmlFile.getAbsolutePath());
|
||||||
throw new PrivilegeException("the XML file " + xmlFile.getAbsolutePath() + " is not parseable:", e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,40 +93,40 @@ public class XmlHelper {
|
||||||
* the {@link Document} to write to the file system
|
* the {@link Document} to write to the file system
|
||||||
* @param file
|
* @param file
|
||||||
* the {@link File} describing the path on the file system where the XML file should be written to
|
* the {@link File} describing the path on the file system where the XML file should be written to
|
||||||
|
*
|
||||||
|
* @throws RuntimeException
|
||||||
|
* if something went wrong while creating the XML configuration, or writing the element
|
||||||
*/
|
*/
|
||||||
public static void writeDocument(Document document, File file) {
|
public static void writeDocument(Document document, File file) throws RuntimeException {
|
||||||
|
|
||||||
XmlHelper.logger.info("Exporting document element " + document.getName() + " to " + file.getAbsolutePath());
|
XmlHelper.logger.info("Exporting document element " + document.getNodeName() + " to " + file.getAbsolutePath());
|
||||||
|
|
||||||
OutputStream fileOutputStream = null;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
fileOutputStream = new FileOutputStream(file);
|
String encoding = document.getInputEncoding();
|
||||||
|
if (encoding == null || encoding.isEmpty()) {
|
||||||
String aEncodingScheme = document.getXMLEncoding();
|
encoding = XmlHelper.DEFAULT_ENCODING;
|
||||||
if (aEncodingScheme == null || aEncodingScheme.isEmpty()) {
|
|
||||||
aEncodingScheme = XmlHelper.DEFAULT_ENCODING;
|
|
||||||
}
|
}
|
||||||
OutputFormat outformat = OutputFormat.createPrettyPrint();
|
|
||||||
outformat.setEncoding(aEncodingScheme);
|
// Set up a transformer
|
||||||
XMLWriter writer = new XMLWriter(fileOutputStream, outformat);
|
TransformerFactory transfac = TransformerFactory.newInstance();
|
||||||
writer.write(document);
|
Transformer transformer = transfac.newTransformer();
|
||||||
writer.flush();
|
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
|
||||||
|
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
||||||
|
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
|
||||||
|
transformer.setOutputProperty(OutputKeys.ENCODING, encoding);
|
||||||
|
transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2");
|
||||||
|
//transformer.setOutputProperty("{http://xml.apache.org/xalan}line-separator", "\t");
|
||||||
|
|
||||||
|
// Transform to file
|
||||||
|
StreamResult result = new StreamResult(file);
|
||||||
|
Source xmlSource = new DOMSource(document);
|
||||||
|
transformer.transform(xmlSource, result);
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
||||||
throw new PrivilegeException("Exception while exporting to file: " + e, e);
|
throw new PrivilegeException("Exception while exporting to file: " + e, e);
|
||||||
|
|
||||||
} finally {
|
|
||||||
|
|
||||||
if (fileOutputStream != null) {
|
|
||||||
try {
|
|
||||||
fileOutputStream.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
XmlHelper.logger.error("Could not close file output stream: " + e, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,13 +137,40 @@ public class XmlHelper {
|
||||||
* the {@link Element} to write to the file system
|
* the {@link Element} to write to the file system
|
||||||
* @param file
|
* @param file
|
||||||
* the {@link File} describing the path on the file system where the XML file should be written to
|
* the {@link File} describing the path on the file system where the XML file should be written to
|
||||||
|
* @param encoding
|
||||||
|
* encoding to use to write the file
|
||||||
|
*
|
||||||
|
* @throws RuntimeException
|
||||||
|
* if something went wrong while creating the XML configuration, or writing the element
|
||||||
*/
|
*/
|
||||||
public static void writeElement(Element rootElement, File file) {
|
public static void writeElement(Element rootElement, File file, String encoding) throws RuntimeException {
|
||||||
|
|
||||||
Document document = DocumentFactory.getInstance().createDocument(XmlHelper.DEFAULT_ENCODING);
|
|
||||||
document.setRootElement(rootElement);
|
|
||||||
document.setName(rootElement.getName());
|
|
||||||
|
|
||||||
|
Document document = createDocument();
|
||||||
|
document.appendChild(rootElement);
|
||||||
XmlHelper.writeDocument(document, file);
|
XmlHelper.writeDocument(document, file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new document instance
|
||||||
|
*
|
||||||
|
* @return a new document instance
|
||||||
|
*
|
||||||
|
* @throws RuntimeException
|
||||||
|
* if something went wrong while creating the XML configuration
|
||||||
|
*/
|
||||||
|
public static Document createDocument() throws RuntimeException {
|
||||||
|
try {
|
||||||
|
|
||||||
|
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
|
||||||
|
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
|
||||||
|
Document document = docBuilder.newDocument();
|
||||||
|
|
||||||
|
return document;
|
||||||
|
|
||||||
|
} catch (DOMException e) {
|
||||||
|
throw new XmlException("Failed to create Document: " + e.getLocalizedMessage(), e);
|
||||||
|
} catch (ParserConfigurationException e) {
|
||||||
|
throw new XmlException("Failed to create Document: " + e.getLocalizedMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,167 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2012, Robert von Burg
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of the XXX.
|
||||||
|
*
|
||||||
|
* XXX is free software: you can redistribute
|
||||||
|
* it and/or modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the License,
|
||||||
|
* or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* XXX is distributed in the hope that it will
|
||||||
|
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with XXX. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ch.eitchnet.privilege.model.internal;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import ch.eitchnet.privilege.base.PrivilegeException;
|
||||||
|
import ch.eitchnet.privilege.policy.PrivilegePolicy;
|
||||||
|
|
||||||
|
public class PrivilegeContainerModel {
|
||||||
|
|
||||||
|
String encryptionHandlerClassName;
|
||||||
|
Map<String, String> encryptionHandlerParameterMap;
|
||||||
|
String persistenceHandlerClassName;
|
||||||
|
Map<String, String> persistenceHandlerParameterMap;
|
||||||
|
Map<String, String> parameterMap;
|
||||||
|
|
||||||
|
private Map<String, Class<PrivilegePolicy>> policies = new HashMap<String, Class<PrivilegePolicy>>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the parameterMap
|
||||||
|
*/
|
||||||
|
public Map<String, String> getParameterMap() {
|
||||||
|
return this.parameterMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param parameterMap
|
||||||
|
* the parameterMap to set
|
||||||
|
*/
|
||||||
|
public void setParameterMap(Map<String, String> parameterMap) {
|
||||||
|
this.parameterMap = parameterMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the encryptionHandlerClassName
|
||||||
|
*/
|
||||||
|
public String getEncryptionHandlerClassName() {
|
||||||
|
return this.encryptionHandlerClassName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param encryptionHandlerClassName
|
||||||
|
* the encryptionHandlerClassName to set
|
||||||
|
*/
|
||||||
|
public void setEncryptionHandlerClassName(String encryptionHandlerClassName) {
|
||||||
|
this.encryptionHandlerClassName = encryptionHandlerClassName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the encryptionHandlerParameterMap
|
||||||
|
*/
|
||||||
|
public Map<String, String> getEncryptionHandlerParameterMap() {
|
||||||
|
return this.encryptionHandlerParameterMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param encryptionHandlerParameterMap
|
||||||
|
* the encryptionHandlerParameterMap to set
|
||||||
|
*/
|
||||||
|
public void setEncryptionHandlerParameterMap(Map<String, String> encryptionHandlerParameterMap) {
|
||||||
|
this.encryptionHandlerParameterMap = encryptionHandlerParameterMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the persistenceHandlerClassName
|
||||||
|
*/
|
||||||
|
public String getPersistenceHandlerClassName() {
|
||||||
|
return this.persistenceHandlerClassName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param persistenceHandlerClassName
|
||||||
|
* the persistenceHandlerClassName to set
|
||||||
|
*/
|
||||||
|
public void setPersistenceHandlerClassName(String persistenceHandlerClassName) {
|
||||||
|
this.persistenceHandlerClassName = persistenceHandlerClassName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the persistenceHandlerParameterMap
|
||||||
|
*/
|
||||||
|
public Map<String, String> getPersistenceHandlerParameterMap() {
|
||||||
|
return this.persistenceHandlerParameterMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param persistenceHandlerParameterMap
|
||||||
|
* the persistenceHandlerParameterMap to set
|
||||||
|
*/
|
||||||
|
public void setPersistenceHandlerParameterMap(Map<String, String> persistenceHandlerParameterMap) {
|
||||||
|
this.persistenceHandlerParameterMap = persistenceHandlerParameterMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param name
|
||||||
|
* @param policyClass
|
||||||
|
*/
|
||||||
|
public void addPolicy(String privilegeName, String policyClassName) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
// load class and try to create a new instance
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Class<PrivilegePolicy> clazz = (Class<PrivilegePolicy>) Class.forName(policyClassName);
|
||||||
|
clazz.newInstance();
|
||||||
|
|
||||||
|
this.policies.put(privilegeName, clazz);
|
||||||
|
|
||||||
|
} catch (InstantiationException e) {
|
||||||
|
throw new PrivilegeException("Configured Privilege Policy " + privilegeName + " with class "
|
||||||
|
+ policyClassName + " could not be instantiated.", e);
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
throw new PrivilegeException("Configured Privilege Policy " + privilegeName + " with class "
|
||||||
|
+ policyClassName + " can not be accessed.", e);
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
throw new PrivilegeException("Configured Privilege Policy " + privilegeName + " with class "
|
||||||
|
+ policyClassName + " does not exist.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the policies
|
||||||
|
*/
|
||||||
|
public Map<String, Class<PrivilegePolicy>> getPolicies() {
|
||||||
|
return this.policies;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
builder.append("PrivilegeContainerModel [encryptionHandlerClassName=");
|
||||||
|
builder.append(this.encryptionHandlerClassName);
|
||||||
|
builder.append(", encryptionHandlerParameterMap=");
|
||||||
|
builder.append(this.encryptionHandlerParameterMap.size());
|
||||||
|
builder.append(", persistenceHandlerClassName=");
|
||||||
|
builder.append(this.persistenceHandlerClassName);
|
||||||
|
builder.append(", persistenceHandlerParameterMap=");
|
||||||
|
builder.append(this.persistenceHandlerParameterMap.size());
|
||||||
|
builder.append(", parameterMap=");
|
||||||
|
builder.append(this.parameterMap.size());
|
||||||
|
builder.append(", policies=");
|
||||||
|
builder.append(this.policies.size());
|
||||||
|
builder.append("]");
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2012, Robert von Burg
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of the XXX.
|
||||||
|
*
|
||||||
|
* XXX is free software: you can redistribute
|
||||||
|
* it and/or modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the License,
|
||||||
|
* or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* XXX is distributed in the hope that it will
|
||||||
|
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with XXX. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ch.eitchnet.privilege.xml;
|
||||||
|
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
public interface ElementParser {
|
||||||
|
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException;
|
||||||
|
|
||||||
|
public void characters(char[] ch, int start, int length) throws SAXException;
|
||||||
|
|
||||||
|
public void endElement(String uri, String localName, String qName) throws SAXException;
|
||||||
|
|
||||||
|
public void notifyChild(ElementParser child);
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2012, Robert von Burg
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of the XXX.
|
||||||
|
*
|
||||||
|
* XXX is free software: you can redistribute
|
||||||
|
* it and/or modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the License,
|
||||||
|
* or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* XXX is distributed in the hope that it will
|
||||||
|
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with XXX. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ch.eitchnet.privilege.xml;
|
||||||
|
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
public abstract class ElementParserAdapter implements ElementParser {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
|
||||||
|
// empty implementation
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void characters(char[] ch, int start, int length) throws SAXException {
|
||||||
|
// empty implementation
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String localName, String qName) throws SAXException {
|
||||||
|
// empty implementation
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void notifyChild(ElementParser child) {
|
||||||
|
// empty implementation
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,106 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010 - 2012
|
||||||
|
*
|
||||||
|
* This file is part of Privilege.
|
||||||
|
*
|
||||||
|
* Privilege is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Privilege is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with Privilege. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package ch.eitchnet.privilege.xml;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import ch.eitchnet.privilege.base.PrivilegeException;
|
||||||
|
import ch.eitchnet.privilege.handler.DefaultPrivilegeHandler;
|
||||||
|
import ch.eitchnet.privilege.handler.EncryptionHandler;
|
||||||
|
import ch.eitchnet.privilege.handler.PersistenceHandler;
|
||||||
|
import ch.eitchnet.privilege.handler.PrivilegeHandler;
|
||||||
|
import ch.eitchnet.privilege.helper.ClassHelper;
|
||||||
|
import ch.eitchnet.privilege.helper.XmlHelper;
|
||||||
|
import ch.eitchnet.privilege.model.internal.PrivilegeContainerModel;
|
||||||
|
import ch.eitchnet.privilege.policy.PrivilegePolicy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class implements the initializing of the {@link PrivilegeHandler} by loading an XML file containing the
|
||||||
|
* configuration
|
||||||
|
*
|
||||||
|
* @author Robert von Burg <eitch@eitchnet.ch>
|
||||||
|
*/
|
||||||
|
public class InitializationHelper {
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(InitializationHelper.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the {@link DefaultPrivilegeHandler} from the configuration file
|
||||||
|
*
|
||||||
|
* @param privilegeXmlFile
|
||||||
|
* a {@link File} reference to the XML file containing the configuration for Privilege
|
||||||
|
*
|
||||||
|
* @return the {@link PrivilegeHandler} instance loaded from the configuration file
|
||||||
|
*/
|
||||||
|
public static PrivilegeHandler initializeFromXml(File privilegeXmlFile) {
|
||||||
|
|
||||||
|
// make sure file exists
|
||||||
|
if (!privilegeXmlFile.exists()) {
|
||||||
|
throw new PrivilegeException("Privilege file does not exist at path " + privilegeXmlFile.getAbsolutePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse configuration file
|
||||||
|
PrivilegeContainerModel containerModel = new PrivilegeContainerModel();
|
||||||
|
PrivilegeConfigSaxReader xmlHandler = new PrivilegeConfigSaxReader(containerModel);
|
||||||
|
XmlHelper.parseDocument(privilegeXmlFile, xmlHandler);
|
||||||
|
|
||||||
|
// initialize encryption handler
|
||||||
|
String encryptionHandlerClassName = containerModel.getEncryptionHandlerClassName();
|
||||||
|
EncryptionHandler encryptionHandler = ClassHelper.instantiateClass(encryptionHandlerClassName);
|
||||||
|
Map<String, String> parameterMap = containerModel.getEncryptionHandlerParameterMap();
|
||||||
|
try {
|
||||||
|
encryptionHandler.initialize(parameterMap);
|
||||||
|
} catch (Exception e) {
|
||||||
|
InitializationHelper.logger.error(e.getMessage(), e);
|
||||||
|
throw new PrivilegeException("EncryptionHandler " + encryptionHandlerClassName
|
||||||
|
+ " could not be initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialize persistence handler
|
||||||
|
String persistenceHandlerClassName = containerModel.getPersistenceHandlerClassName();
|
||||||
|
PersistenceHandler persistenceHandler = ClassHelper.instantiateClass(persistenceHandlerClassName);
|
||||||
|
parameterMap = containerModel.getPersistenceHandlerParameterMap();
|
||||||
|
try {
|
||||||
|
persistenceHandler.initialize(parameterMap);
|
||||||
|
} catch (Exception e) {
|
||||||
|
InitializationHelper.logger.error(e.getMessage(), e);
|
||||||
|
throw new PrivilegeException("PersistenceHandler " + persistenceHandlerClassName
|
||||||
|
+ " could not be initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialize privilege handler
|
||||||
|
DefaultPrivilegeHandler privilegeHandler = new DefaultPrivilegeHandler();
|
||||||
|
parameterMap = containerModel.getParameterMap();
|
||||||
|
Map<String, Class<PrivilegePolicy>> policyMap = containerModel.getPolicies();
|
||||||
|
try {
|
||||||
|
privilegeHandler.initialize(parameterMap, encryptionHandler, persistenceHandler, policyMap);
|
||||||
|
} catch (Exception e) {
|
||||||
|
InitializationHelper.logger.error(e.getMessage(), e);
|
||||||
|
throw new PrivilegeException("PrivilegeHandler " + privilegeHandler.getClass().getName()
|
||||||
|
+ " could not be initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
return privilegeHandler;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,121 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2012, Robert von Burg
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of the XXX.
|
||||||
|
*
|
||||||
|
* XXX is free software: you can redistribute
|
||||||
|
* it and/or modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the License,
|
||||||
|
* or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* XXX is distributed in the hope that it will
|
||||||
|
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with XXX. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ch.eitchnet.privilege.xml;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
|
import ch.eitchnet.privilege.helper.XmlConstants;
|
||||||
|
import ch.eitchnet.privilege.helper.XmlHelper;
|
||||||
|
import ch.eitchnet.privilege.model.internal.PrivilegeContainerModel;
|
||||||
|
import ch.eitchnet.privilege.policy.PrivilegePolicy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Robert von Burg <eitch@eitchnet.ch>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class PrivilegeConfigDomWriter {
|
||||||
|
|
||||||
|
private final PrivilegeContainerModel containerModel;
|
||||||
|
private final File configFile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public PrivilegeConfigDomWriter(PrivilegeContainerModel containerModel, File configFile) {
|
||||||
|
this.containerModel = containerModel;
|
||||||
|
this.configFile = configFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void write() {
|
||||||
|
|
||||||
|
// create document root
|
||||||
|
Document doc = XmlHelper.createDocument();
|
||||||
|
Element rootElement = doc.createElement(XmlConstants.XML_ROOT_PRIVILEGE);
|
||||||
|
doc.appendChild(rootElement);
|
||||||
|
|
||||||
|
Element containerElement = doc.createElement(XmlConstants.XML_CONTAINER);
|
||||||
|
rootElement.appendChild(containerElement);
|
||||||
|
|
||||||
|
Element parameterElement;
|
||||||
|
Element parametersElement;
|
||||||
|
|
||||||
|
// Parameters
|
||||||
|
parametersElement = doc.createElement(XmlConstants.XML_PARAMETERS);
|
||||||
|
containerElement.appendChild(parametersElement);
|
||||||
|
for (Entry<String, String> entry : this.containerModel.getParameterMap().entrySet()) {
|
||||||
|
parameterElement = doc.createElement(XmlConstants.XML_PARAMETER);
|
||||||
|
parameterElement.setAttribute(XmlConstants.XML_ATTR_NAME, entry.getKey());
|
||||||
|
parameterElement.setAttribute(XmlConstants.XML_ATTR_VALUE, entry.getValue());
|
||||||
|
parametersElement.appendChild(parameterElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
// create EncryptionHandler
|
||||||
|
Element encryptionHandlerElem = doc.createElement(XmlConstants.XML_HANDLER_ENCRYPTION);
|
||||||
|
containerElement.appendChild(encryptionHandlerElem);
|
||||||
|
encryptionHandlerElem.setAttribute(XmlConstants.XML_ATTR_CLASS,
|
||||||
|
this.containerModel.getEncryptionHandlerClassName());
|
||||||
|
// Parameters
|
||||||
|
parametersElement = doc.createElement(XmlConstants.XML_PARAMETERS);
|
||||||
|
encryptionHandlerElem.appendChild(parametersElement);
|
||||||
|
for (Entry<String, String> entry : this.containerModel.getEncryptionHandlerParameterMap().entrySet()) {
|
||||||
|
parameterElement = doc.createElement(XmlConstants.XML_PARAMETER);
|
||||||
|
parameterElement.setAttribute(XmlConstants.XML_ATTR_NAME, entry.getKey());
|
||||||
|
parameterElement.setAttribute(XmlConstants.XML_ATTR_VALUE, entry.getValue());
|
||||||
|
parametersElement.appendChild(parameterElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
// create PersistenceHandler
|
||||||
|
Element persistenceHandlerElem = doc.createElement(XmlConstants.XML_HANDLER_PERSISTENCE);
|
||||||
|
containerElement.appendChild(persistenceHandlerElem);
|
||||||
|
persistenceHandlerElem.setAttribute(XmlConstants.XML_ATTR_CLASS,
|
||||||
|
this.containerModel.getPersistenceHandlerClassName());
|
||||||
|
// Parameters
|
||||||
|
parametersElement = doc.createElement(XmlConstants.XML_PARAMETERS);
|
||||||
|
persistenceHandlerElem.appendChild(parametersElement);
|
||||||
|
for (Entry<String, String> entry : this.containerModel.getPersistenceHandlerParameterMap().entrySet()) {
|
||||||
|
parameterElement = doc.createElement(XmlConstants.XML_PARAMETER);
|
||||||
|
parameterElement.setAttribute(XmlConstants.XML_ATTR_NAME, entry.getKey());
|
||||||
|
parameterElement.setAttribute(XmlConstants.XML_ATTR_VALUE, entry.getValue());
|
||||||
|
parametersElement.appendChild(parameterElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Policies
|
||||||
|
Element policiesElem = doc.createElement(XmlConstants.XML_POLICIES);
|
||||||
|
rootElement.appendChild(policiesElem);
|
||||||
|
for (Entry<String, Class<PrivilegePolicy>> entry : this.containerModel.getPolicies().entrySet()) {
|
||||||
|
Element policyElem = doc.createElement(XmlConstants.XML_POLICY);
|
||||||
|
policyElem.setAttribute(XmlConstants.XML_ATTR_NAME, entry.getKey());
|
||||||
|
policyElem.setAttribute(XmlConstants.XML_ATTR_CLASS, entry.getValue().getName());
|
||||||
|
policiesElem.appendChild(policyElem);
|
||||||
|
}
|
||||||
|
|
||||||
|
// write the container file to disk
|
||||||
|
XmlHelper.writeDocument(doc, this.configFile);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,183 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2012, Robert von Burg
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of the XXX.
|
||||||
|
*
|
||||||
|
* XXX is free software: you can redistribute
|
||||||
|
* it and/or modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the License,
|
||||||
|
* or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* XXX is distributed in the hope that it will
|
||||||
|
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with XXX. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ch.eitchnet.privilege.xml;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
import org.xml.sax.helpers.DefaultHandler;
|
||||||
|
|
||||||
|
import ch.eitchnet.privilege.model.internal.PrivilegeContainerModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Robert von Burg <eitch@eitchnet.ch>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class PrivilegeConfigSaxReader extends DefaultHandler {
|
||||||
|
|
||||||
|
// private static final Logger logger = LoggerFactory.getLogger(PrivilegeConfigSaxReader.class);
|
||||||
|
|
||||||
|
private Stack<ElementParser> buildersStack = new Stack<ElementParser>();
|
||||||
|
|
||||||
|
private PrivilegeContainerModel containerModel;
|
||||||
|
|
||||||
|
public PrivilegeConfigSaxReader(PrivilegeContainerModel containerModel) {
|
||||||
|
this.containerModel = containerModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
|
||||||
|
|
||||||
|
if (qName.equals("Container")) {
|
||||||
|
this.buildersStack.add(new ContainerParser());
|
||||||
|
} else if (qName.equals("Parameters")) {
|
||||||
|
this.buildersStack.add(new ParametersParser());
|
||||||
|
} else if (qName.equals("Policies")) {
|
||||||
|
this.buildersStack.add(new PoliciesParser());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.buildersStack.isEmpty())
|
||||||
|
this.buildersStack.peek().startElement(uri, localName, qName, attributes);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void characters(char[] ch, int start, int length) throws SAXException {
|
||||||
|
if (!this.buildersStack.isEmpty())
|
||||||
|
this.buildersStack.peek().characters(ch, start, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String localName, String qName) throws SAXException {
|
||||||
|
|
||||||
|
if (!this.buildersStack.isEmpty())
|
||||||
|
this.buildersStack.peek().endElement(uri, localName, qName);
|
||||||
|
|
||||||
|
ElementParser elementParser = null;
|
||||||
|
if (qName.equals("Container")) {
|
||||||
|
elementParser = this.buildersStack.pop();
|
||||||
|
} else if (qName.equals("Parameters")) {
|
||||||
|
elementParser = this.buildersStack.pop();
|
||||||
|
} else if (qName.equals("Policies")) {
|
||||||
|
elementParser = this.buildersStack.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.buildersStack.isEmpty() && elementParser != null)
|
||||||
|
this.buildersStack.peek().notifyChild(elementParser);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ContainerParser extends ElementParserAdapter {
|
||||||
|
|
||||||
|
// <Container>
|
||||||
|
// <Parameters>
|
||||||
|
// <!-- parameters for the container itself -->
|
||||||
|
// <Parameter name="autoPersistOnPasswordChange" value="true" />
|
||||||
|
// </Parameters>
|
||||||
|
// <EncryptionHandler class="ch.eitchnet.privilege.handler.DefaultEncryptionHandler">
|
||||||
|
// <Parameters>
|
||||||
|
// <Parameter name="hashAlgorithm" value="SHA-256" />
|
||||||
|
// </Parameters>
|
||||||
|
// </EncryptionHandler>
|
||||||
|
// <PersistenceHandler class="ch.eitchnet.privilege.handler.XmlPersistenceHandler">
|
||||||
|
// <Parameters>
|
||||||
|
// <Parameter name="basePath" value="./target/test" />
|
||||||
|
// <Parameter name="modelXmlFile" value="PrivilegeModel.xml" />
|
||||||
|
// </Parameters>
|
||||||
|
// </PersistenceHandler>
|
||||||
|
// </Container>
|
||||||
|
|
||||||
|
private String currentElement;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
|
||||||
|
if (qName.equals("Container")) {
|
||||||
|
this.currentElement = qName;
|
||||||
|
} else if (qName.equals("EncryptionHandler")) {
|
||||||
|
this.currentElement = qName;
|
||||||
|
PrivilegeConfigSaxReader.this.containerModel
|
||||||
|
.setEncryptionHandlerClassName(attributes.getValue("class"));
|
||||||
|
} else if (qName.equals("PersistenceHandler")) {
|
||||||
|
this.currentElement = qName;
|
||||||
|
PrivilegeConfigSaxReader.this.containerModel.setPersistenceHandlerClassName(attributes
|
||||||
|
.getValue("class"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void notifyChild(ElementParser child) {
|
||||||
|
if (!(child instanceof ParametersParser))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ParametersParser parametersChild = (ParametersParser) child;
|
||||||
|
|
||||||
|
if (this.currentElement.equals("Container")) {
|
||||||
|
PrivilegeConfigSaxReader.this.containerModel.setParameterMap(parametersChild.getParameterMap());
|
||||||
|
} else if (this.currentElement.equals("EncryptionHandler")) {
|
||||||
|
PrivilegeConfigSaxReader.this.containerModel.setEncryptionHandlerParameterMap(parametersChild
|
||||||
|
.getParameterMap());
|
||||||
|
} else if (this.currentElement.equals("PersistenceHandler")) {
|
||||||
|
PrivilegeConfigSaxReader.this.containerModel.setPersistenceHandlerParameterMap(parametersChild
|
||||||
|
.getParameterMap());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ParametersParser extends ElementParserAdapter {
|
||||||
|
|
||||||
|
// <Parameter name="autoPersistOnPasswordChange" value="true" />
|
||||||
|
|
||||||
|
private Map<String, String> parameterMap = new HashMap<String, String>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
|
||||||
|
if (qName.equals("Parameter")) {
|
||||||
|
String key = attributes.getValue("name");
|
||||||
|
String value = attributes.getValue("value");
|
||||||
|
this.parameterMap.put(key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the parameterMap
|
||||||
|
*/
|
||||||
|
public Map<String, String> getParameterMap() {
|
||||||
|
return this.parameterMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class PoliciesParser extends ElementParserAdapter {
|
||||||
|
|
||||||
|
// <Policy name="DefaultPrivilege" class="ch.eitchnet.privilege.policy.DefaultPrivilege" />
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
|
||||||
|
if (qName.equals("Policy")) {
|
||||||
|
String policyName = attributes.getValue("name");
|
||||||
|
String policyClassName = attributes.getValue("class");
|
||||||
|
|
||||||
|
PrivilegeConfigSaxReader.this.containerModel.addPolicy(policyName, policyClassName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,160 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2012, Robert von Burg
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of the XXX.
|
||||||
|
*
|
||||||
|
* XXX is free software: you can redistribute
|
||||||
|
* it and/or modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the License,
|
||||||
|
* or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* XXX is distributed in the hope that it will
|
||||||
|
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with XXX. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ch.eitchnet.privilege.xml;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
|
||||||
|
import ch.eitchnet.privilege.helper.XmlConstants;
|
||||||
|
import ch.eitchnet.privilege.helper.XmlHelper;
|
||||||
|
import ch.eitchnet.privilege.model.internal.Privilege;
|
||||||
|
import ch.eitchnet.privilege.model.internal.Role;
|
||||||
|
import ch.eitchnet.privilege.model.internal.User;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Robert von Burg <eitch@eitchnet.ch>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class PrivilegeModelDomWriter {
|
||||||
|
|
||||||
|
private List<User> users;
|
||||||
|
private List<Role> roles;
|
||||||
|
private File modelFile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public PrivilegeModelDomWriter(List<User> users, List<Role> roles, File modelFile) {
|
||||||
|
this.users = users;
|
||||||
|
this.roles = roles;
|
||||||
|
this.modelFile = modelFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void write() {
|
||||||
|
|
||||||
|
// create document root
|
||||||
|
Document doc = XmlHelper.createDocument();
|
||||||
|
Element rootElement = doc.createElement(XmlConstants.XML_ROOT_PRIVILEGE_USERS_AND_ROLES);
|
||||||
|
doc.appendChild(rootElement);
|
||||||
|
|
||||||
|
Element usersElement = doc.createElement(XmlConstants.XML_USERS);
|
||||||
|
rootElement.appendChild(usersElement);
|
||||||
|
|
||||||
|
for (User user : this.users) {
|
||||||
|
|
||||||
|
// create the user element
|
||||||
|
Element userElement = doc.createElement(XmlConstants.XML_USER);
|
||||||
|
usersElement.appendChild(userElement);
|
||||||
|
|
||||||
|
userElement.setAttribute(XmlConstants.XML_ATTR_USER_ID, user.getUserId());
|
||||||
|
userElement.setAttribute(XmlConstants.XML_ATTR_USERNAME, user.getUsername());
|
||||||
|
userElement.setAttribute(XmlConstants.XML_ATTR_PASSWORD, user.getPassword());
|
||||||
|
|
||||||
|
// add first name element
|
||||||
|
Element firstnameElement = doc.createElement(XmlConstants.XML_FIRSTNAME);
|
||||||
|
firstnameElement.setTextContent(user.getFirstname());
|
||||||
|
userElement.appendChild(firstnameElement);
|
||||||
|
|
||||||
|
// add surname element
|
||||||
|
Element surnameElement = doc.createElement(XmlConstants.XML_SURNAME);
|
||||||
|
surnameElement.setTextContent(user.getSurname());
|
||||||
|
userElement.appendChild(surnameElement);
|
||||||
|
|
||||||
|
// add state element
|
||||||
|
Element stateElement = doc.createElement(XmlConstants.XML_STATE);
|
||||||
|
stateElement.setTextContent(user.getUserState().toString());
|
||||||
|
userElement.appendChild(stateElement);
|
||||||
|
|
||||||
|
// add locale element
|
||||||
|
Element localeElement = doc.createElement(XmlConstants.XML_LOCALE);
|
||||||
|
localeElement.setTextContent(user.getLocale().toString());
|
||||||
|
userElement.appendChild(localeElement);
|
||||||
|
|
||||||
|
// add all the role elements
|
||||||
|
Element rolesElement = doc.createElement(XmlConstants.XML_ROLES);
|
||||||
|
userElement.appendChild(rolesElement);
|
||||||
|
for (String roleName : user.getRoles()) {
|
||||||
|
Element roleElement = doc.createElement(XmlConstants.XML_ROLE);
|
||||||
|
roleElement.setTextContent(roleName);
|
||||||
|
rolesElement.appendChild(roleElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add the parameters
|
||||||
|
Element parametersElement = doc.createElement(XmlConstants.XML_PARAMETERS);
|
||||||
|
userElement.appendChild(parametersElement);
|
||||||
|
for (Entry<String, String> entry : user.getProperties().entrySet()) {
|
||||||
|
Element paramElement = doc.createElement(XmlConstants.XML_PARAMETER);
|
||||||
|
paramElement.setAttribute(XmlConstants.XML_ATTR_NAME, entry.getKey());
|
||||||
|
paramElement.setAttribute(XmlConstants.XML_ATTR_VALUE, entry.getValue());
|
||||||
|
parametersElement.appendChild(paramElement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Element rolesElement = doc.createElement(XmlConstants.XML_ROLES);
|
||||||
|
rootElement.appendChild(rolesElement);
|
||||||
|
|
||||||
|
for (Role role : this.roles) {
|
||||||
|
|
||||||
|
// create the role element
|
||||||
|
Element roleElement = doc.createElement(XmlConstants.XML_ROLE);
|
||||||
|
rolesElement.appendChild(roleElement);
|
||||||
|
|
||||||
|
roleElement.setAttribute(XmlConstants.XML_ATTR_NAME, role.getName());
|
||||||
|
|
||||||
|
for (Privilege privilege : role.getPrivilegeMap().values()) {
|
||||||
|
|
||||||
|
// create the privilege element
|
||||||
|
Element privilegeElement = doc.createElement(XmlConstants.XML_PRIVILEGE);
|
||||||
|
roleElement.appendChild(privilegeElement);
|
||||||
|
|
||||||
|
privilegeElement.setAttribute(XmlConstants.XML_ATTR_NAME, privilege.getName());
|
||||||
|
privilegeElement.setAttribute(XmlConstants.XML_ATTR_POLICY, privilege.getPolicy());
|
||||||
|
|
||||||
|
// add the all allowed element
|
||||||
|
Element allAllowedElement = doc.createElement(XmlConstants.XML_ALL_ALLOWED);
|
||||||
|
allAllowedElement.setTextContent(Boolean.toString(privilege.isAllAllowed()));
|
||||||
|
privilegeElement.appendChild(allAllowedElement);
|
||||||
|
|
||||||
|
// add all the deny values
|
||||||
|
for (String denyValue : privilege.getDenyList()) {
|
||||||
|
Element denyValueElement = doc.createElement(XmlConstants.XML_DENY);
|
||||||
|
denyValueElement.setTextContent(denyValue);
|
||||||
|
privilegeElement.appendChild(denyValueElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add all the allow values
|
||||||
|
for (String allowValue : privilege.getAllowList()) {
|
||||||
|
Element allowValueElement = doc.createElement(XmlConstants.XML_ALLOW);
|
||||||
|
allowValueElement.setTextContent(allowValue);
|
||||||
|
privilegeElement.appendChild(allowValueElement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// write the container file to disk
|
||||||
|
XmlHelper.writeDocument(doc, this.modelFile);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,347 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2012, Robert von Burg
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of the XXX.
|
||||||
|
*
|
||||||
|
* XXX is free software: you can redistribute
|
||||||
|
* it and/or modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the License,
|
||||||
|
* or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* XXX is distributed in the hope that it will
|
||||||
|
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with XXX. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ch.eitchnet.privilege.xml;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
import org.xml.sax.helpers.DefaultHandler;
|
||||||
|
|
||||||
|
import ch.eitchnet.privilege.model.UserState;
|
||||||
|
import ch.eitchnet.privilege.model.internal.Privilege;
|
||||||
|
import ch.eitchnet.privilege.model.internal.Role;
|
||||||
|
import ch.eitchnet.privilege.model.internal.User;
|
||||||
|
import ch.eitchnet.utils.helper.StringHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Robert von Burg <eitch@eitchnet.ch>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class PrivilegeModelSaxReader extends DefaultHandler {
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(PrivilegeModelSaxReader.class);
|
||||||
|
|
||||||
|
private Stack<ElementParser> buildersStack = new Stack<ElementParser>();
|
||||||
|
|
||||||
|
private List<User> users;
|
||||||
|
private List<Role> roles;
|
||||||
|
|
||||||
|
private boolean insideUser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public PrivilegeModelSaxReader() {
|
||||||
|
this.users = new ArrayList<User>();
|
||||||
|
this.roles = new ArrayList<Role>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the users
|
||||||
|
*/
|
||||||
|
public List<User> getUsers() {
|
||||||
|
return this.users;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the roles
|
||||||
|
*/
|
||||||
|
public List<Role> getRoles() {
|
||||||
|
return this.roles;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
|
||||||
|
|
||||||
|
if (qName.equals("Users")) {
|
||||||
|
this.buildersStack.add(new UserParser());
|
||||||
|
this.insideUser = true;
|
||||||
|
} else if (qName.equals("Properties")) {
|
||||||
|
this.buildersStack.add(new PropertyParser());
|
||||||
|
} else if (qName.equals("Roles") && !this.insideUser) {
|
||||||
|
this.buildersStack.add(new RoleParser());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.buildersStack.isEmpty())
|
||||||
|
this.buildersStack.peek().startElement(uri, localName, qName, attributes);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void characters(char[] ch, int start, int length) throws SAXException {
|
||||||
|
if (!this.buildersStack.isEmpty())
|
||||||
|
this.buildersStack.peek().characters(ch, start, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String localName, String qName) throws SAXException {
|
||||||
|
|
||||||
|
if (!this.buildersStack.isEmpty())
|
||||||
|
this.buildersStack.peek().endElement(uri, localName, qName);
|
||||||
|
|
||||||
|
ElementParser elementParser = null;
|
||||||
|
if (qName.equals("Users")) {
|
||||||
|
elementParser = this.buildersStack.pop();
|
||||||
|
this.insideUser = false;
|
||||||
|
PrivilegeModelSaxReader.logger.info("Popping for Users");
|
||||||
|
} else if (qName.equals("Properties")) {
|
||||||
|
elementParser = this.buildersStack.pop();
|
||||||
|
PrivilegeModelSaxReader.logger.info("Popping for Properties");
|
||||||
|
} else if (qName.equals("Roles") && !this.insideUser) {
|
||||||
|
elementParser = this.buildersStack.pop();
|
||||||
|
PrivilegeModelSaxReader.logger.info("Popping for Roles");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.buildersStack.isEmpty() && elementParser != null)
|
||||||
|
this.buildersStack.peek().notifyChild(elementParser);
|
||||||
|
}
|
||||||
|
|
||||||
|
// <Role name="AppUser">
|
||||||
|
// <Privilege name="ch.eitchnet.privilege.test.model.TestRestrictable">
|
||||||
|
// <AllAllowed>true</AllAllowed>
|
||||||
|
// </Privilege>
|
||||||
|
// </Role>
|
||||||
|
// <Role name="system_admin_privileges">
|
||||||
|
// <Privilege name="ch.eitchnet.privilege.test.model.TestSystemUserAction">
|
||||||
|
// <AllAllowed>true</AllAllowed>
|
||||||
|
// </Privilege>
|
||||||
|
// <Privilege name="ch.eitchnet.privilege.test.model.TestSystemRestrictable">
|
||||||
|
// <AllAllowed>true</AllAllowed>
|
||||||
|
// </Privilege>
|
||||||
|
// </Role>
|
||||||
|
|
||||||
|
public class RoleParser extends ElementParserAdapter {
|
||||||
|
|
||||||
|
private StringBuilder text;
|
||||||
|
|
||||||
|
private String roleName;
|
||||||
|
private String privilegeName;
|
||||||
|
private String privilegePolicy;
|
||||||
|
private boolean allAllowed;
|
||||||
|
private Set<String> denyList;
|
||||||
|
private Set<String> allowList;
|
||||||
|
|
||||||
|
private Map<String, Privilege> privileges;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public RoleParser() {
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private void init() {
|
||||||
|
this.privileges = new HashMap<String, Privilege>();
|
||||||
|
|
||||||
|
this.text = null;
|
||||||
|
|
||||||
|
this.roleName = null;
|
||||||
|
this.privilegeName = null;
|
||||||
|
this.privilegePolicy = null;
|
||||||
|
this.allAllowed = false;
|
||||||
|
this.denyList = new HashSet<String>();
|
||||||
|
this.allowList = new HashSet<String>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
|
||||||
|
|
||||||
|
this.text = new StringBuilder();
|
||||||
|
|
||||||
|
if (qName.equals("Role")) {
|
||||||
|
this.roleName = attributes.getValue("name");
|
||||||
|
} else if (qName.equals("Privilege")) {
|
||||||
|
this.privilegeName = attributes.getValue("name");
|
||||||
|
this.privilegePolicy = attributes.getValue("policy");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void characters(char[] ch, int start, int length) throws SAXException {
|
||||||
|
if (this.text != null)
|
||||||
|
this.text.append(ch, start, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String localName, String qName) throws SAXException {
|
||||||
|
|
||||||
|
if (qName.equals("AllAllowed")) {
|
||||||
|
this.allAllowed = StringHelper.parseBoolean(this.text.toString().trim());
|
||||||
|
} else if (qName.equals("Allow")) {
|
||||||
|
this.allowList.add(this.text.toString().trim());
|
||||||
|
} else if (qName.equals("Deny")) {
|
||||||
|
this.denyList.add(this.text.toString().trim());
|
||||||
|
} else if (qName.equals("Privilege")) {
|
||||||
|
|
||||||
|
Privilege privilege = new Privilege(this.privilegeName, this.privilegePolicy, this.allAllowed,
|
||||||
|
this.denyList, this.allowList);
|
||||||
|
this.privileges.put(this.privilegeName, privilege);
|
||||||
|
|
||||||
|
} else if (qName.equals("Role")) {
|
||||||
|
|
||||||
|
Role role = new Role(this.roleName, this.privileges);
|
||||||
|
|
||||||
|
PrivilegeModelSaxReader.this.roles.add(role);
|
||||||
|
PrivilegeModelSaxReader.logger.info("New Role: " + role);
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// <User userId="1" username="admin" password="8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918">
|
||||||
|
// <Firstname>Application</Firstname>
|
||||||
|
// <Surname>Administrator</Surname>
|
||||||
|
// <State>ENABLED</State>
|
||||||
|
// <Locale>en_GB</Locale>
|
||||||
|
// <Roles>
|
||||||
|
// <Role>PrivilegeAdmin</Role>
|
||||||
|
// <Role>AppUser</Role>
|
||||||
|
// </Roles>
|
||||||
|
// <Properties>
|
||||||
|
// <Property name="organization" value="eitchnet.ch" />
|
||||||
|
// <Property name="organizationalUnit" value="Development" />
|
||||||
|
// </Properties>
|
||||||
|
// </User>
|
||||||
|
|
||||||
|
public class UserParser extends ElementParserAdapter {
|
||||||
|
|
||||||
|
StringBuilder text;
|
||||||
|
|
||||||
|
String userId;
|
||||||
|
String username;
|
||||||
|
String password;
|
||||||
|
String firstName;
|
||||||
|
String surname;
|
||||||
|
UserState userState;
|
||||||
|
Locale locale;
|
||||||
|
Set<String> userRoles;
|
||||||
|
Map<String, String> parameters;
|
||||||
|
|
||||||
|
public UserParser() {
|
||||||
|
this.userRoles = new HashSet<String>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
|
||||||
|
|
||||||
|
this.text = new StringBuilder();
|
||||||
|
|
||||||
|
if (qName.equals("User")) {
|
||||||
|
this.userId = attributes.getValue("userId");
|
||||||
|
this.username = attributes.getValue("username");
|
||||||
|
this.password = attributes.getValue("password");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void characters(char[] ch, int start, int length) throws SAXException {
|
||||||
|
this.text.append(ch, start, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String localName, String qName) throws SAXException {
|
||||||
|
|
||||||
|
if (qName.equals("Firstname")) {
|
||||||
|
this.firstName = this.text.toString().trim();
|
||||||
|
} else if (qName.equals("Surname")) {
|
||||||
|
this.surname = this.text.toString().trim();
|
||||||
|
} else if (qName.equals("State")) {
|
||||||
|
this.userState = UserState.valueOf(this.text.toString().trim());
|
||||||
|
} else if (qName.equals("Locale")) {
|
||||||
|
this.locale = Locale.forLanguageTag(this.text.toString().trim());
|
||||||
|
} else if (qName.equals("Role")) {
|
||||||
|
this.userRoles.add(this.text.toString().trim());
|
||||||
|
} else if (qName.equals("User")) {
|
||||||
|
|
||||||
|
User user = new User(this.userId, this.username, this.password, this.firstName, this.surname,
|
||||||
|
this.userState, this.userRoles, this.locale, this.parameters);
|
||||||
|
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
builder.append("UserParser [userId=");
|
||||||
|
builder.append(this.userId);
|
||||||
|
builder.append(", username=");
|
||||||
|
builder.append(this.username);
|
||||||
|
builder.append(", password=");
|
||||||
|
builder.append(this.password);
|
||||||
|
builder.append(", firstName=");
|
||||||
|
builder.append(this.firstName);
|
||||||
|
builder.append(", surname=");
|
||||||
|
builder.append(this.surname);
|
||||||
|
builder.append(", userState=");
|
||||||
|
builder.append(this.userState);
|
||||||
|
builder.append(", locale=");
|
||||||
|
builder.append(this.locale);
|
||||||
|
builder.append(", userRoles=");
|
||||||
|
builder.append(this.userRoles.size());
|
||||||
|
builder.append(", parameters=");
|
||||||
|
builder.append(this.parameters.size());
|
||||||
|
builder.append("]");
|
||||||
|
PrivilegeModelSaxReader.logger.info(builder.toString());
|
||||||
|
|
||||||
|
PrivilegeModelSaxReader.this.users.add(user);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void notifyChild(ElementParser child) {
|
||||||
|
if (child instanceof PropertyParser) {
|
||||||
|
this.parameters = ((PropertyParser) child).parameterMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class PropertyParser extends ElementParserAdapter {
|
||||||
|
|
||||||
|
// <Property name="organizationalUnit" value="Development" />
|
||||||
|
|
||||||
|
private Map<String, String> parameterMap = new HashMap<String, String>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
|
||||||
|
if (qName.equals("Property")) {
|
||||||
|
String key = attributes.getValue("name");
|
||||||
|
String value = attributes.getValue("value");
|
||||||
|
this.parameterMap.put(key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the parameterMap
|
||||||
|
*/
|
||||||
|
public Map<String, String> getParameterMap() {
|
||||||
|
return this.parameterMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -37,7 +37,6 @@ import ch.eitchnet.privilege.base.AccessDeniedException;
|
||||||
import ch.eitchnet.privilege.base.PrivilegeException;
|
import ch.eitchnet.privilege.base.PrivilegeException;
|
||||||
import ch.eitchnet.privilege.handler.PrivilegeHandler;
|
import ch.eitchnet.privilege.handler.PrivilegeHandler;
|
||||||
import ch.eitchnet.privilege.helper.CertificateThreadLocal;
|
import ch.eitchnet.privilege.helper.CertificateThreadLocal;
|
||||||
import ch.eitchnet.privilege.helper.InitializationHelper;
|
|
||||||
import ch.eitchnet.privilege.model.Certificate;
|
import ch.eitchnet.privilege.model.Certificate;
|
||||||
import ch.eitchnet.privilege.model.PrivilegeRep;
|
import ch.eitchnet.privilege.model.PrivilegeRep;
|
||||||
import ch.eitchnet.privilege.model.Restrictable;
|
import ch.eitchnet.privilege.model.Restrictable;
|
||||||
|
@ -47,6 +46,7 @@ import ch.eitchnet.privilege.model.UserState;
|
||||||
import ch.eitchnet.privilege.test.model.TestRestrictable;
|
import ch.eitchnet.privilege.test.model.TestRestrictable;
|
||||||
import ch.eitchnet.privilege.test.model.TestSystemUserAction;
|
import ch.eitchnet.privilege.test.model.TestSystemUserAction;
|
||||||
import ch.eitchnet.privilege.test.model.TestSystemUserActionDeny;
|
import ch.eitchnet.privilege.test.model.TestSystemUserActionDeny;
|
||||||
|
import ch.eitchnet.privilege.xml.InitializationHelper;
|
||||||
import ch.eitchnet.utils.helper.FileHelper;
|
import ch.eitchnet.utils.helper.FileHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,219 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2012, Robert von Burg
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is part of the XXX.
|
||||||
|
*
|
||||||
|
* XXX is free software: you can redistribute
|
||||||
|
* it and/or modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the License,
|
||||||
|
* or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* XXX is distributed in the hope that it will
|
||||||
|
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with XXX. If not, see
|
||||||
|
* <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package ch.eitchnet.privilege.test;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import junit.framework.Assert;
|
||||||
|
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import ch.eitchnet.privilege.handler.DefaultEncryptionHandler;
|
||||||
|
import ch.eitchnet.privilege.handler.XmlPersistenceHandler;
|
||||||
|
import ch.eitchnet.privilege.helper.XmlHelper;
|
||||||
|
import ch.eitchnet.privilege.model.UserState;
|
||||||
|
import ch.eitchnet.privilege.model.internal.Privilege;
|
||||||
|
import ch.eitchnet.privilege.model.internal.PrivilegeContainerModel;
|
||||||
|
import ch.eitchnet.privilege.model.internal.Role;
|
||||||
|
import ch.eitchnet.privilege.model.internal.User;
|
||||||
|
import ch.eitchnet.privilege.xml.PrivilegeConfigDomWriter;
|
||||||
|
import ch.eitchnet.privilege.xml.PrivilegeConfigSaxReader;
|
||||||
|
import ch.eitchnet.privilege.xml.PrivilegeModelDomWriter;
|
||||||
|
import ch.eitchnet.privilege.xml.PrivilegeModelSaxReader;
|
||||||
|
import ch.eitchnet.utils.helper.FileHelper;
|
||||||
|
import ch.eitchnet.utils.helper.StringHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Robert von Burg <eitch@eitchnet.ch>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class XmlTest {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final String TARGET_TEST = "./target/test";
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(XmlTest.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws Exception
|
||||||
|
* if something goes wrong
|
||||||
|
*/
|
||||||
|
@BeforeClass
|
||||||
|
public static void init() throws Exception {
|
||||||
|
|
||||||
|
File tmpDir = new File("target/test");
|
||||||
|
if (tmpDir.exists())
|
||||||
|
FileHelper.deleteFile(tmpDir, false);
|
||||||
|
tmpDir.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void destroy() throws Exception {
|
||||||
|
|
||||||
|
File tmpDir = new File("target/test");
|
||||||
|
if (!tmpDir.exists())
|
||||||
|
return;
|
||||||
|
|
||||||
|
File tmpFile = new File("target/test/PrivilegeTest.xml");
|
||||||
|
if (tmpFile.exists() && !tmpFile.delete()) {
|
||||||
|
throw new RuntimeException("Tmp still exists and can not be deleted at " + tmpFile.getAbsolutePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpFile = new File("target/test/PrivilegeModelTest.xml");
|
||||||
|
if (tmpFile.exists() && !tmpFile.delete()) {
|
||||||
|
throw new RuntimeException("Tmp still exists and can not be deleted at " + tmpFile.getAbsolutePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
// and temporary parent
|
||||||
|
if (!tmpDir.delete()) {
|
||||||
|
throw new RuntimeException("Could not remove temporary parent for tmp " + tmpFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void canReadConfig() {
|
||||||
|
|
||||||
|
PrivilegeContainerModel containerModel = new PrivilegeContainerModel();
|
||||||
|
PrivilegeConfigSaxReader saxReader = new PrivilegeConfigSaxReader(containerModel);
|
||||||
|
File xmlFile = new File("config/Privilege.xml");
|
||||||
|
XmlHelper.parseDocument(xmlFile, saxReader);
|
||||||
|
logger.info(containerModel.toString());
|
||||||
|
|
||||||
|
// assert all objects read
|
||||||
|
Assert.assertNotNull(containerModel.getParameterMap());
|
||||||
|
Assert.assertNotNull(containerModel.getPolicies());
|
||||||
|
Assert.assertNotNull(containerModel.getEncryptionHandlerClassName());
|
||||||
|
Assert.assertNotNull(containerModel.getEncryptionHandlerParameterMap());
|
||||||
|
Assert.assertNotNull(containerModel.getPersistenceHandlerClassName());
|
||||||
|
Assert.assertNotNull(containerModel.getPersistenceHandlerParameterMap());
|
||||||
|
|
||||||
|
Assert.assertEquals(1, containerModel.getParameterMap().size());
|
||||||
|
Assert.assertEquals(1, containerModel.getPolicies().size());
|
||||||
|
Assert.assertEquals(1, containerModel.getEncryptionHandlerParameterMap().size());
|
||||||
|
Assert.assertEquals(2, containerModel.getPersistenceHandlerParameterMap().size());
|
||||||
|
|
||||||
|
// TODO extend assertions to actual model
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void canWriteConfig() {
|
||||||
|
|
||||||
|
Map<String, String> parameterMap = new HashMap<String, String>();
|
||||||
|
Map<String, String> encryptionHandlerParameterMap = new HashMap<String, String>();
|
||||||
|
Map<String, String> persistenceHandlerParameterMap = new HashMap<String, String>();
|
||||||
|
|
||||||
|
// TODO ask other questions...
|
||||||
|
parameterMap.put("autoPersistOnPasswordChange", "true");
|
||||||
|
encryptionHandlerParameterMap.put("hashAlgorithm", "SHA-256");
|
||||||
|
persistenceHandlerParameterMap.put("basePath", TARGET_TEST);
|
||||||
|
persistenceHandlerParameterMap.put("modelXmlFile", "PrivilegeModel.xml");
|
||||||
|
|
||||||
|
PrivilegeContainerModel containerModel = new PrivilegeContainerModel();
|
||||||
|
containerModel.setParameterMap(parameterMap);
|
||||||
|
containerModel.setEncryptionHandlerClassName(DefaultEncryptionHandler.class.getName());
|
||||||
|
containerModel.setEncryptionHandlerParameterMap(encryptionHandlerParameterMap);
|
||||||
|
containerModel.setPersistenceHandlerClassName(XmlPersistenceHandler.class.getName());
|
||||||
|
containerModel.setPersistenceHandlerParameterMap(persistenceHandlerParameterMap);
|
||||||
|
|
||||||
|
containerModel.addPolicy("DefaultPrivilege", "ch.eitchnet.privilege.policy.DefaultPrivilege");
|
||||||
|
|
||||||
|
File configFile = new File("./target/test/PrivilegeTest.xml");
|
||||||
|
PrivilegeConfigDomWriter configSaxWriter = new PrivilegeConfigDomWriter(containerModel, configFile);
|
||||||
|
configSaxWriter.write();
|
||||||
|
|
||||||
|
String fileHash = StringHelper.getHexString(FileHelper.hashFileSha256(configFile));
|
||||||
|
Assert.assertEquals("22d4ba39605d49c758184d9bd63beae5ccf8786f3dabbab45cd9f59c2afbcbd0", fileHash);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void canReadModel() {
|
||||||
|
|
||||||
|
PrivilegeModelSaxReader xmlHandler = new PrivilegeModelSaxReader();
|
||||||
|
File xmlFile = new File("config/PrivilegeModel.xml");
|
||||||
|
XmlHelper.parseDocument(xmlFile, xmlHandler);
|
||||||
|
|
||||||
|
List<User> users = xmlHandler.getUsers();
|
||||||
|
Assert.assertNotNull(users);
|
||||||
|
List<Role> roles = xmlHandler.getRoles();
|
||||||
|
Assert.assertNotNull(roles);
|
||||||
|
|
||||||
|
Assert.assertEquals(2, users.size());
|
||||||
|
Assert.assertEquals(4, roles.size());
|
||||||
|
|
||||||
|
// TODO extend assertions to actual model
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void canWriteModel() {
|
||||||
|
|
||||||
|
Map<String, String> propertyMap;
|
||||||
|
Set<String> userRoles;
|
||||||
|
Map<String, Privilege> privilegeMap;
|
||||||
|
|
||||||
|
List<User> users = new ArrayList<User>();
|
||||||
|
propertyMap = new HashMap<String, String>();
|
||||||
|
propertyMap.put("prop1", "value1");
|
||||||
|
userRoles = new HashSet<String>();
|
||||||
|
userRoles.add("role1");
|
||||||
|
users.add(new User("1", "user1", "blabla", "Bob", "White", UserState.DISABLED, userRoles, Locale.ENGLISH,
|
||||||
|
propertyMap));
|
||||||
|
|
||||||
|
propertyMap = new HashMap<String, String>();
|
||||||
|
propertyMap.put("prop2", "value2");
|
||||||
|
userRoles = new HashSet<String>();
|
||||||
|
userRoles.add("role2");
|
||||||
|
users.add(new User("2", "user2", "haha", "Leonard", "Sheldon", UserState.ENABLED, userRoles, Locale.ENGLISH,
|
||||||
|
propertyMap));
|
||||||
|
|
||||||
|
List<Role> roles = new ArrayList<Role>();
|
||||||
|
privilegeMap = new HashMap<String, Privilege>();
|
||||||
|
privilegeMap.put("priv1", new Privilege("priv1", "DefaultPrivilege", true, null, null));
|
||||||
|
roles.add(new Role("role1", privilegeMap));
|
||||||
|
|
||||||
|
privilegeMap = new HashMap<String, Privilege>();
|
||||||
|
Set<String> denyList = new HashSet<String>();
|
||||||
|
denyList.add("myself");
|
||||||
|
Set<String> allowList = new HashSet<String>();
|
||||||
|
allowList.add("other");
|
||||||
|
privilegeMap.put("priv2", new Privilege("priv2", "DefaultPrivilege", false, denyList, allowList));
|
||||||
|
roles.add(new Role("role2", privilegeMap));
|
||||||
|
|
||||||
|
File modelFile = new File("./target/test/PrivilegeModelTest.xml");
|
||||||
|
PrivilegeModelDomWriter configSaxWriter = new PrivilegeModelDomWriter(users, roles, modelFile);
|
||||||
|
configSaxWriter.write();
|
||||||
|
|
||||||
|
String fileHash = StringHelper.getHexString(FileHelper.hashFileSha256(modelFile));
|
||||||
|
Assert.assertEquals("8e1e82278162f21b1654c2e059570bbcb3cb63b053c1dd784bc8e225e8cfd04f", fileHash);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue