EditBlogUsersPlugin.java [plain text]
package org.blojsom.plugin.admin;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.blojsom.BlojsomException;
import org.blojsom.blog.Blog;
import org.blojsom.blog.BlogEntry;
import org.blojsom.blog.BlogUser;
import org.blojsom.blog.BlojsomConfiguration;
import org.blojsom.plugin.BlojsomPluginException;
import org.blojsom.util.BlojsomUtils;
import org.blojsom.util.BlojsomProperties;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;
public class EditBlogUsersPlugin extends BaseAdminPlugin {
private Log _logger = LogFactory.getLog(EditBlogUsersPlugin.class);
private static final String EDIT_BLOG_USERS_PAGE = "/org/blojsom/plugin/admin/templates/admin-edit-blog-users";
private static final String PLUGIN_ADMIN_EDIT_USERS_IP = "plugin-admin-edit-users";
private static final String BOOTSTRAP_DIRECTORY_IP = "bootstrap-directory";
private static final String DEFAULT_BOOTSTRAP_DIRECTORY = "/bootstrap";
private static final String BLOG_HOME_BASE_DIRECTORY_IP = "blog-home-base-directory";
private static final String BLOJSOM_PLUGIN_EDIT_BLOG_USERS_MAP = "BLOJSOM_PLUGIN_EDIT_BLOG_USERS_MAP";
private static final String DELETE_BLOG_USER_ACTION = "delete-blog-user";
private static final String ADD_BLOG_USER_ACTION = "add-blog-user";
private static final String BLOG_USER_ID = "blog-user-id";
private static final String BLOG_USER_PASSWORD = "blog-user-password";
private static final String BLOG_USER_PASSWORD_CHECK = "blog-user-password-check";
private String _bootstrapDirectory;
private String _blogHomeBaseDirectory;
private String _flavorConfiguration;
private String _pluginConfiguration;
private String _authorizationConfiguration;
private String _permissionsConfiguration;
private ServletConfig _servletConfig;
private Map _administrators;
public EditBlogUsersPlugin() {
}
public void init(ServletConfig servletConfig, BlojsomConfiguration blojsomConfiguration) throws BlojsomPluginException {
super.init(servletConfig, blojsomConfiguration);
_servletConfig = servletConfig;
_blojsomConfiguration = blojsomConfiguration;
_flavorConfiguration = servletConfig.getInitParameter(BLOJSOM_FLAVOR_CONFIGURATION_IP);
_pluginConfiguration = servletConfig.getInitParameter(BLOJSOM_PLUGIN_CONFIGURATION_IP);
_authorizationConfiguration = servletConfig.getInitParameter(BLOG_AUTHORIZATION_IP);
_permissionsConfiguration = servletConfig.getInitParameter(BLOG_PERMISSIONS_IP);
if (BlojsomUtils.checkNullOrBlank(_permissionsConfiguration)) {
_permissionsConfiguration = DEFAULT_PERMISSIONS_CONFIGURATION_FILE;
}
try {
Properties configurationProperties = BlojsomUtils.loadProperties(servletConfig, PLUGIN_ADMIN_EDIT_USERS_IP, true);
_bootstrapDirectory = configurationProperties.getProperty(BOOTSTRAP_DIRECTORY_IP);
if (BlojsomUtils.checkNullOrBlank(_bootstrapDirectory)) {
_bootstrapDirectory = DEFAULT_BOOTSTRAP_DIRECTORY;
}
_blogHomeBaseDirectory = configurationProperties.getProperty(BLOG_HOME_BASE_DIRECTORY_IP);
if (BlojsomUtils.checkNullOrBlank(_blogHomeBaseDirectory)) {
_blogHomeBaseDirectory = _blojsomConfiguration.getGlobalBlogHome();
if (BlojsomUtils.checkNullOrBlank(_blogHomeBaseDirectory)) {
throw new BlojsomPluginException("No blog base home directory specified.");
}
} else {
if (!_blogHomeBaseDirectory.endsWith("/")) {
_blogHomeBaseDirectory += "/";
}
}
String administratorProperty = configurationProperties.getProperty(ADMINISTRATORS_IP);
String[] administrators = BlojsomUtils.parseCommaList(administratorProperty);
_administrators = BlojsomUtils.arrayOfStringsToMap(administrators);
} catch (BlojsomException e) {
_logger.error(e);
throw new BlojsomPluginException(e);
}
}
public BlogEntry[] process(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlogUser user, Map context, BlogEntry[] entries) throws BlojsomPluginException {
if (!authenticateUser(httpServletRequest, httpServletResponse, context, user)) {
httpServletRequest.setAttribute(PAGE_PARAM, ADMIN_LOGIN_PAGE);
return entries;
}
if (!_administrators.containsKey(user.getId())) {
_logger.debug("User: " + user.getId() + " is not a valid administrator");
httpServletRequest.setAttribute(PAGE_PARAM, ADMIN_ADMINISTRATION_PAGE);
return entries;
}
context.put(BLOJSOM_PLUGIN_EDIT_BLOG_USERS_MAP, Collections.unmodifiableMap(BlojsomUtils.listToMap(BlojsomUtils.arrayToList(_blojsomConfiguration.getBlojsomUsers()))));
String action = BlojsomUtils.getRequestValue(ACTION_PARAM, httpServletRequest);
if (BlojsomUtils.checkNullOrBlank(action)) {
_logger.debug("User did not request edit action");
httpServletRequest.setAttribute(PAGE_PARAM, ADMIN_ADMINISTRATION_PAGE);
} else if (PAGE_ACTION.equals(action)) {
_logger.debug("User requested edit blog users page");
httpServletRequest.setAttribute(PAGE_PARAM, EDIT_BLOG_USERS_PAGE);
} else if (DELETE_BLOG_USER_ACTION.equals(action)) {
_logger.debug("User requested delete blog user action");
String blogUserID = BlojsomUtils.getRequestValue(BLOG_USER_ID, httpServletRequest);
if (BlojsomUtils.checkNullOrBlank(blogUserID)) {
httpServletRequest.setAttribute(PAGE_PARAM, EDIT_BLOG_USERS_PAGE);
return entries;
} else {
_logger.debug("Deleting user: " + blogUserID);
_blojsomConfiguration.removeBlogID(blogUserID);
File blogConfigurationDirectory = new File(_blojsomConfiguration.getInstallationDirectory() + _blojsomConfiguration.getBaseConfigurationDirectory() + blogUserID + "/");
if (!BlojsomUtils.deleteDirectory(blogConfigurationDirectory)) {
_logger.error("Unable to remove blog configuration directory: " + blogConfigurationDirectory.toString());
addOperationResultMessage(context, "Unable to remove blog configuration for user: " + blogUserID);
} else {
_logger.debug("Removed blog configuration directory: " + blogConfigurationDirectory.toString());
}
File blogDirectory = new File(_blogHomeBaseDirectory + blogUserID + "/");
if (!BlojsomUtils.deleteDirectory(blogDirectory)) {
_logger.error("Unable to remove blog directory for user: " + blogDirectory.toString());
addOperationResultMessage(context, "Unable to remove blog directory for user: " + blogUserID);
} else {
_logger.debug("Removed blog directory: " + blogDirectory.toString());
}
File blogResourcesDirectory = new File(_blojsomConfiguration.getInstallationDirectory() +
_blojsomConfiguration.getResourceDirectory() + blogUserID + "/");
if (!BlojsomUtils.deleteDirectory(blogResourcesDirectory)) {
_logger.error("Unable to remove blog resource directory: " + blogResourcesDirectory.toString());
addOperationResultMessage(context, "Unable to remove resources directory for user: " + blogUserID);
} else {
_logger.debug("Removed blog resource directory: " + blogResourcesDirectory.toString());
}
writeBlojsomConfiguration();
_logger.debug("Wrote new blojsom configuration after deleting user: " + blogUserID);
addOperationResultMessage(context, "Deleted user: " + blogUserID);
}
httpServletRequest.setAttribute(PAGE_PARAM, ADMIN_ADMINISTRATION_PAGE);
} else if (ADD_BLOG_USER_ACTION.equals(action)) {
_logger.debug("User requested add blog user action");
Map blogUsers = _blojsomConfiguration.getBlogIDs();
String blogUserID = BlojsomUtils.getRequestValue(BLOG_USER_ID, httpServletRequest);
if (BlojsomUtils.checkNullOrBlank(blogUserID)) { addOperationResultMessage(context, "No blog ID specified for adding a blog");
httpServletRequest.setAttribute(PAGE_PARAM, EDIT_BLOG_USERS_PAGE);
return entries;
} else if (blogUsers.containsKey(blogUserID)) { _logger.debug("User: " + blogUserID + " already exists");
addOperationResultMessage(context, "Blog ID: " + blogUserID + " already exists");
httpServletRequest.setAttribute(PAGE_PARAM, EDIT_BLOG_USERS_PAGE);
return entries;
} else { _logger.debug("Adding new user id: " + blogUserID);
BlogUser blogUser = new BlogUser();
blogUser.setId(blogUserID);
File blogUserDirectory = new File(_blojsomConfiguration.getInstallationDirectory() + _blojsomConfiguration.getBaseConfigurationDirectory() + blogUserID);
if (blogUserDirectory.exists()) { _logger.debug("User directory already exists for blog user: " + blogUserID);
addOperationResultMessage(context, "User directory already exists for blog ID: " + blogUserID);
httpServletRequest.setAttribute(PAGE_PARAM, EDIT_BLOG_USERS_PAGE);
return entries;
} else { String blogUserPassword = BlojsomUtils.getRequestValue(BLOG_USER_PASSWORD, httpServletRequest);
String blogUserPasswordCheck = BlojsomUtils.getRequestValue(BLOG_USER_PASSWORD_CHECK, httpServletRequest);
String blogBaseURL = BlojsomUtils.getRequestValue(BLOG_BASE_URL_IP, httpServletRequest);
String blogURL = BlojsomUtils.getRequestValue(BLOG_URL_IP, httpServletRequest);
if (BlojsomUtils.checkNullOrBlank(blogURL) || BlojsomUtils.checkNullOrBlank(blogBaseURL)) {
_logger.debug("No blog URL or base URL supplied");
addOperationResultMessage(context, "No blog URL or base URL supplied");
httpServletRequest.setAttribute(PAGE_PARAM, EDIT_BLOG_USERS_PAGE);
return entries;
} else {
if (!blogURL.endsWith("/")) {
blogURL += "/";
}
if (!blogBaseURL.endsWith("/")) {
blogBaseURL += "/";
}
}
if (!blogUserPassword.equals(blogUserPasswordCheck)) {
_logger.debug("User password does not equal password check");
addOperationResultMessage(context, "User password does not equal user password check");
httpServletRequest.setAttribute(PAGE_PARAM, EDIT_BLOG_USERS_PAGE);
return entries;
} else { String bootstrap = _blojsomConfiguration.getInstallationDirectory() + _blojsomConfiguration.getBaseConfigurationDirectory() + _bootstrapDirectory + "/";
_logger.debug("Bootstrap directory: " + bootstrap);
File bootstrapDirectory = new File(bootstrap);
String userDirectory = _blojsomConfiguration.getInstallationDirectory() + _blojsomConfiguration.getBaseConfigurationDirectory() + blogUserID + "/";
_logger.debug("User directory: " + userDirectory);
File newUserDirectory = new File(userDirectory);
_logger.debug("Copying bootstrap directory: " + bootstrapDirectory.toString() + " to target user directory: " + newUserDirectory.toString());
try {
BlojsomUtils.copyDirectory(bootstrapDirectory, newUserDirectory);
} catch (IOException e) {
addOperationResultMessage(context, "Unable to copy bootstrap directory. Check log files for error");
httpServletRequest.setAttribute(PAGE_PARAM, EDIT_BLOG_USERS_PAGE);
_logger.error(e);
return entries;
}
try {
Properties blogProperties = BlojsomUtils.loadProperties(_servletConfig, _blojsomConfiguration.getBaseConfigurationDirectory() + blogUserID + '/' + BLOG_DEFAULT_PROPERTIES);
blogProperties.put(BLOG_HOME_IP, _blogHomeBaseDirectory + blogUserID);
File blogHomeDirectory = new File(_blogHomeBaseDirectory + blogUserID);
if (!blogHomeDirectory.mkdirs()) {
_logger.error("Unable to create blog home directory: " + blogHomeDirectory.toString());
addOperationResultMessage(context, "Unable to create blog home directory for blog ID: " + blogUserID);
httpServletRequest.setAttribute(PAGE_PARAM, EDIT_BLOG_USERS_PAGE);
return entries;
}
blogProperties.put(BLOG_BASE_URL_IP, blogBaseURL);
blogProperties.put(BLOG_URL_IP, blogURL);
File blogConfigurationFile = new File(_blojsomConfiguration.getInstallationDirectory() + _blojsomConfiguration.getBaseConfigurationDirectory() + blogUserID + '/' + BLOG_DEFAULT_PROPERTIES);
FileOutputStream fos = new FileOutputStream(blogConfigurationFile);
blogProperties.store(fos, null);
fos.close();
_logger.debug("Wrote blog configuration information for new user: " + blogConfigurationFile.toString());
Blog blog = new Blog(blogProperties);
blogUser.setBlog(blog);
Map authorizationMap = new HashMap();
authorizationMap.put(blogUserID, blogUserPassword);
blogUser.getBlog().setAuthorization(authorizationMap);
_logger.debug("Set authorization information for new user: " + blogUserID);
File blogAuthorizationFile = new File(_blojsomConfiguration.getInstallationDirectory() + _blojsomConfiguration.getBaseConfigurationDirectory() + blogUserID + '/' + _authorizationConfiguration);
fos = new FileOutputStream(blogAuthorizationFile);
Properties authorizationProperties = BlojsomUtils.mapToProperties(blogUser.getBlog().getAuthorization());
authorizationProperties.store(fos, null);
fos.close();
_logger.debug("Wrote blog authorization information for new user: " + blogAuthorizationFile.toString());
File blogPermissionsFile = new File(_blojsomConfiguration.getInstallationDirectory() + _blojsomConfiguration.getBaseConfigurationDirectory() +
blogUserID + "/" + _permissionsConfiguration);
fos = new FileOutputStream(blogPermissionsFile);
Properties permissionsProperties = new BlojsomProperties(true);
permissionsProperties.setProperty(blogUserID, "*");
permissionsProperties.store(fos, null);
fos.close();
_logger.debug("Wrote blog permissions information for new user: " + blogPermissionsFile.toString());
Map flavors = new HashMap();
Map flavorToTemplateMap = new HashMap();
Map flavorToContentTypeMap = new HashMap();
Properties flavorProperties = BlojsomUtils.loadProperties(_servletConfig, _blojsomConfiguration.getBaseConfigurationDirectory() + blogUserID + '/' + _flavorConfiguration);
Iterator flavorIterator = flavorProperties.keySet().iterator();
while (flavorIterator.hasNext()) {
String flavor = (String) flavorIterator.next();
String[] flavorMapping = BlojsomUtils.parseCommaList(flavorProperties.getProperty(flavor));
flavors.put(flavor, flavor);
flavorToTemplateMap.put(flavor, flavorMapping[0]);
flavorToContentTypeMap.put(flavor, flavorMapping[1]);
}
blogUser.setFlavors(flavors);
blogUser.setFlavorToTemplate(flavorToTemplateMap);
blogUser.setFlavorToContentType(flavorToContentTypeMap);
_logger.debug("Loaded flavor information for new user: " + blogUserID);
Map pluginChainMap = new HashMap();
Properties pluginProperties = BlojsomUtils.loadProperties(_servletConfig, _blojsomConfiguration.getBaseConfigurationDirectory() + blogUserID + '/' + _pluginConfiguration);
Iterator pluginIterator = pluginProperties.keySet().iterator();
while (pluginIterator.hasNext()) {
String plugin = (String) pluginIterator.next();
if (plugin.indexOf(BLOJSOM_PLUGIN_CHAIN) != -1) {
pluginChainMap.put(plugin, BlojsomUtils.parseCommaList(pluginProperties.getProperty(plugin)));
_logger.debug("Added plugin chain: " + plugin + '=' + pluginProperties.getProperty(plugin) + " for user: " + blogUserID);
}
}
blogUser.setPluginChain(pluginChainMap);
_logger.debug("Loaded plugin chain map for new user: " + blogUserID);
} catch (BlojsomException e) {
_logger.error(e);
} catch (IOException e) {
_logger.error(e);
}
File blogResourcesDirectory = new File(_blojsomConfiguration.getInstallationDirectory() +
_blojsomConfiguration.getResourceDirectory() + blogUserID + "/");
File bootstrapResourcesDirectory = new File(bootstrapDirectory, _blojsomConfiguration.getResourceDirectory());
if (!blogResourcesDirectory.mkdirs()) {
_logger.error("Unable to create blog resource directory: " + blogResourcesDirectory.toString());
} else {
_logger.debug("Added blog resource directory: " + blogResourcesDirectory.toString());
}
try {
if (bootstrapResourcesDirectory.exists()) {
BlojsomUtils.copyDirectory(bootstrapResourcesDirectory, blogResourcesDirectory);
}
File resourcesDirectoryToDelete = new File(_blojsomConfiguration.getInstallationDirectory() +
_blojsomConfiguration.getBaseConfigurationDirectory() + blogUserID +
_blojsomConfiguration.getResourceDirectory());
if (resourcesDirectoryToDelete.exists()) {
BlojsomUtils.deleteDirectory(resourcesDirectoryToDelete);
}
} catch (IOException e) {
_logger.error(e);
}
_blojsomConfiguration.addBlogID(blogUserID);
writeBlojsomConfiguration();
_logger.debug("Wrote new blojsom configuration after adding new user: " + blogUserID);
addOperationResultMessage(context, "Added new blog: " + blogUserID);
}
}
}
}
return entries;
}
private void writeBlojsomConfiguration() {
File blojsomConfigurationFile = new File(_blojsomConfiguration.getInstallationDirectory() + _blojsomConfiguration.getBaseConfigurationDirectory() + "blojsom.properties");
Properties configurationProperties = new BlojsomProperties(true);
configurationProperties.put(BLOJSOM_USERS_IP, BlojsomUtils.arrayToList(_blojsomConfiguration.getBlojsomUsers()));
configurationProperties.put(BLOJSOM_FETCHER_IP, _blojsomConfiguration.getFetcherClass());
configurationProperties.put(BLOJSOM_DEFAULT_USER_IP, _blojsomConfiguration.getDefaultUser());
configurationProperties.put(BLOJSOM_INSTALLATION_DIRECTORY_IP, _blojsomConfiguration.getInstallationDirectory());
configurationProperties.put(BLOJSOM_CONFIGURATION_BASE_DIRECTORY_IP, _blojsomConfiguration.getBaseConfigurationDirectory());
configurationProperties.put(BLOJSOM_BLOG_HOME_IP, _blojsomConfiguration.getGlobalBlogHome());
configurationProperties.put(BLOJSOM_TEMPLATES_DIRECTORY_IP, _blojsomConfiguration.getTemplatesDirectory());
configurationProperties.put(BLOJSOM_RESOURCE_DIRECTORY_IP, _blojsomConfiguration.getResourceDirectory());
configurationProperties.put(BLOJSOM_RESOURCE_MANAGER_IP, _blojsomConfiguration.getResourceManager());
configurationProperties.put(BLOJSOM_RESOURCE_MANAGER_BUNDLES_IP, "org.blojsom.plugin.admin.resources.messages");
configurationProperties.put(BLOJSOM_BROADCASTER_IP, _blojsomConfiguration.getEventBroadcaster().getClass().getName());
try {
FileOutputStream fos = new FileOutputStream(blojsomConfigurationFile);
configurationProperties.store(fos, null);
fos.close();
} catch (IOException e) {
_logger.error(e);
}
}
}