PropertiesPanelUIComponent.java
| Index Score | ||
|---|---|---|
![]() |
![]() |
org.pentaho.ui.component |
![]() |
![]() |
Pentaho |
View: Reasons, Metrics, Source Code
These are the metrics that contribute to the Enerjy Score for this file, ranked by impact. So the metrics listed at the top influence the score to a greater extent that the metrics listed at the bottom.
/*
* Copyright 2005 Pentaho Corporation. All rights reserved.
* This software was developed by Pentaho Corporation and is provided under the terms
* of the Mozilla Public License, Version 1.1, or any later version. You may not use
* this file except in compliance with the license. If you need a copy of the license,
* please go to http://www.mozilla.org/MPL/MPL-1.1.txt. The Original Code is the Pentaho
* BI Platform. The Initial Developer is Pentaho Corporation.
*
* Software distributed under the Mozilla Public License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. Please refer to
* the license for the specific language governing your rights and limitations.
*
* Created Mar 14, 2006
* @author wseyler
*/
package org.pentaho.ui.component;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeMap;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.pentaho.core.repository.ISolutionRepository;
import org.pentaho.core.session.IPentahoSession;
import org.pentaho.core.solution.HttpRequestParameterProvider;
import org.pentaho.core.solution.ISolutionFile;
import org.pentaho.core.system.PentahoSystem;
import org.pentaho.core.ui.IPentahoUrlFactory;
import org.pentaho.messages.Messages;
import org.pentaho.repository.HibernateUtil;
import org.pentaho.ui.XmlComponent;
import com.pentaho.security.AcegiPermissionMgr;
import com.pentaho.security.IPermissionMask;
import com.pentaho.security.IPermissionMgr;
import com.pentaho.security.IPermissionRecipient;
import com.pentaho.security.PentahoAccessControlException;
import com.pentaho.security.SimplePermissionMask;
import com.pentaho.security.SimpleRole;
import com.pentaho.security.SimpleUser;
import com.pentaho.security.UserDetailsRoleListService;
import com.pentaho.security.acls.IAclHolder;
import com.pentaho.security.acls.IAclSolutionFile;
import com.pentaho.security.acls.PentahoAclEntry;
/**
* TODO mlowery Need to remove direct references to PentahoAclEntry permission constants. Instead, reference
* ISolutionRepository permission constants.
*/
public class PropertiesPanelUIComponent extends XmlComponent {
private static final long serialVersionUID = 1L;
private static final Log logger = LogFactory.getLog(PropertiesPanelUIComponent.class);
private static final String TYPE_PARAM = "type"; //$NON-NLS-1$
private static final String ACTION_PARAM = "action"; //$NON-NLS-1$
private static final String ADD_NAME_PARAM = "add_name"; //$NON-NLS-1$
private static final String PATH_PARAM = "path"; //$NON-NLS-1$
private static final String LIST_ACTION = "list"; //$NON-NLS-1$
private static final String ADD_BTN_PARAM = "addBtn"; //$NON-NLS-1$
private static final String UPDATE_BTN_PARAM = "updateBtn"; //$NON-NLS-1$
private static final String PERMISSION_PREFIX = "perm_"; //$NON-NLS-1$
private static final String ROLE_TYPE = "role"; //$NON-NLS-1$
private static final String ROLE_PREFIX = ROLE_TYPE + "_"; //$NON-NLS-1$
private static final String USER_TYPE = "user"; //$NON-NLS-1$
private static final String USER_PREFIX = USER_TYPE + "_"; //$NON-NLS-1$
private static final String PERMISSION_SEPERATOR = "#"; //$NON-NLS-1$
private static final String DELETE_PREFIX = "delete_"; //$NON-NLS-1$
private static final String NO_FILE_PATH_NODE_NAME = "no-file-path"; //$NON-NLS-1
private static final String SET_PERMISSIONS_DENIED_NAME = "set-permissions-denied"; //$NON-NLS-1
private static final String NO_ACLS_NODE_NAME = "no-acls"; //$NON-NLS-1$
private static final String INPUT_PAGE_NODE_NAME = "input-page"; //$NON-NLS-1$
private static final String FILE_PATH_NODE_NAME = "file-path"; //$NON-NLS-1$
private static final String IS_DIR_NODE_NAME = "is-directory"; //$NON-NLS-1$
private static final String RECIPIENTS_NODE_NAME = "recipients"; //$NON-NLS-1$
private static final String ROLE_NODE_NAME = "role"; //$NON-NLS-1$
private static final String USER_NODE_NAME = "user"; //$NON-NLS-1$
private static final String PERMISSION_NAMES_NODE_NAME = "permission-names"; //$NON-NLS-1$
private static final String NAME_NODE_NAME = "name"; //$NON-NLS-1$
private static final String ACCESS_CONTROL_LIST_NODE_NAME = "ac-list"; //$NON-NLS-1$
private static final String ACCESS_CONTROL_NODE_NAME = "access-control"; //$NON-NLS-1$
private static final String RECIPIENT_NODE_NAME = "recipient"; //$NON-NLS-1$
private static final String PERMISSION_NODE_NAME = "permission"; //$NON-NLS-1$
private static final String PERMITTED_NODE_NAME = "permitted"; //$NON-NLS-1$
private static final String EMPTY_STRING = ""; //$NON-NLS-1$
private static final String TRUE = "true"; //$NON-NLS-1$
private static final String FALSE = "false"; //$NON-NLS-1$
private static final String ON = "on"; //$NON-NLS-1$
private static final String DISPLAY_PATH_NODE_NAME = "display-path"; //$NON-NLS-1$
protected IPentahoSession session = null;
protected String baseUrl = null;
boolean includeUsers = PentahoSystem.getSystemSetting("access-ui/include-users", "true").equals("true"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
boolean includeRoles = PentahoSystem.getSystemSetting("access-ui/include-roles", "true").equals("true"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
protected ISolutionRepository repository;
private List allUsersList;
private List allRolesList;
protected UserDetailsRoleListService userDetailsRoleListService;
public PropertiesPanelUIComponent(IPentahoUrlFactory urlFactory, List messages, IPentahoSession session) {
super(urlFactory, messages, null);
this.session = session;
setXsl("text/html", "PropertiesPanel.xsl"); //$NON-NLS-1$ //$NON-NLS-2$
setXslProperty("baseUrl", urlFactory.getDisplayUrlBuilder().getUrl()); //$NON-NLS-1$
repository = PentahoSystem.getSolutionRepository(session);
if (!repository.supportsAccessControls()) {
error(Messages.getString("PropertiesPanelUIComponent.ERROR_0001_BAD_CONFIGURATION")); //$NON-NLS-1$
}
userDetailsRoleListService = PentahoSystem.getUserDetailsRoleListService();
}
public Document getXmlContent() {
if (!repository.supportsAccessControls()) {
return noACLSPage();
}
String actionStr = this.getParameter(ACTION_PARAM, EMPTY_STRING); // No
// nulls
String pathStr = this.getParameter(PATH_PARAM, null);
ISolutionFile file = null;
try {
HibernateUtil.beginTransaction();
file = repository.getFileByPath(pathStr);
} catch (Exception e) {
// do nothing since we want file to be null if it wasn't found
// TODO sbarkdull, arg, let's at least log it
}
// default action if none is passed is to list (showInputPage) the acls
if (actionStr == null || actionStr.equalsIgnoreCase(LIST_ACTION) || actionStr.equalsIgnoreCase(EMPTY_STRING)) {
HibernateUtil.commitTransaction();
if (file != null) {
return showInputPage(file);
}
return noPathPage();
} else {
HttpServletRequest request = ((HttpRequestParameterProvider) getParameterProviders().get(
HttpRequestParameterProvider.SCOPE_REQUEST)).getRequest();
if (request.getParameter(ADD_BTN_PARAM) != null && !request.getParameter(ADD_BTN_PARAM).equals("")) { //$NON-NLS-1$
doAddToAcls(file);
}
try {
if (request.getParameter(UPDATE_BTN_PARAM) != null && !request.getParameter(UPDATE_BTN_PARAM).equals("")) { //$NON-NLS-1$
doUpdateAcls(file);
}
} catch (PentahoAccessControlException e) {
HibernateUtil.rollbackTransaction();
return setPermissionsFailedPage( e.getLocalizedMessage());
}
HibernateUtil.commitTransaction();
repository.resetRepository();
if (file != null) {
return showInputPage(file);
}
return noPathPage();
}
}
private void doUpdateAcls(ISolutionFile file) throws PentahoAccessControlException {
HttpServletRequest request = ((HttpRequestParameterProvider) getParameterProviders().get(
HttpRequestParameterProvider.SCOPE_REQUEST)).getRequest();
Map permMap = new LinkedHashMap<IPermissionRecipient, IPermissionMask>();
Enumeration enum1 = request.getParameterNames();
while (enum1.hasMoreElements()) {
String name = (String) enum1.nextElement();
if (name.startsWith(USER_PREFIX) || name.startsWith(ROLE_PREFIX)) {
boolean isRole = name.startsWith(ROLE_PREFIX);
name = name.replaceFirst(isRole ? ROLE_PREFIX : USER_PREFIX, EMPTY_STRING);
String lineNumber = name.substring(name.lastIndexOf('_') + 1);
name = name.substring(0, name.lastIndexOf('_'));
if (!isFlaggedForDelete(name)) { // If this is one being deleted we don't do anything with it
PentahoAclEntry entry = new PentahoAclEntry();
IPermissionRecipient permissionRecipient = isRole ? new SimpleRole(name) : new SimpleUser(name);
SimplePermissionMask permissionMask = new SimplePermissionMask();
Enumeration enum2 = request.getParameterNames();
while (enum2.hasMoreElements()) {
String perm = (String) enum2.nextElement();
if (perm.startsWith(PERMISSION_PREFIX)) {
perm = perm.replaceFirst(PERMISSION_PREFIX, EMPTY_STRING);
String permNumber = perm.substring(perm.lastIndexOf('_') + 1);
if (permNumber.equals(lineNumber)) { // Congratulation... we have a winner!
perm = perm.substring(0, perm.lastIndexOf('_'));
permissionMask.addPermission(((Integer) PentahoAclEntry.getValidPermissionsNameMap().get(perm)).intValue());
}
}
}
permMap.put(permissionRecipient, permissionMask);
}
}
}
if (file instanceof IAclSolutionFile) {
repository.setPermissions(file, permMap);
}
}
private boolean isFlaggedForDelete(String name) {
HttpServletRequest request = ((HttpRequestParameterProvider) getParameterProviders().get(
HttpRequestParameterProvider.SCOPE_REQUEST)).getRequest();
return ON.equalsIgnoreCase(request.getParameter(DELETE_PREFIX + name));
}
private void doAddToAcls(ISolutionFile file) {
HttpServletRequest request = ((HttpRequestParameterProvider) getParameterProviders().get(
HttpRequestParameterProvider.SCOPE_REQUEST)).getRequest();
String[] names = request.getParameterValues(ADD_NAME_PARAM);
for (int i = 0; i < names.length; i++) {
String name = names[i];
IPermissionRecipient permissionRecipient = null;
if (name.startsWith(ROLE_PREFIX)) {
permissionRecipient = new SimpleRole(name.replaceFirst(ROLE_PREFIX, EMPTY_STRING));
} else {
permissionRecipient = new SimpleUser(name.replaceFirst(USER_PREFIX, EMPTY_STRING));
}
SimplePermissionMask permissionMask = new SimplePermissionMask();
Enumeration enumeration = request.getParameterNames();
while (enumeration.hasMoreElements()) {
String paramName = enumeration.nextElement().toString();
if (paramName.startsWith(PERMISSION_PREFIX)) {
String permKey = paramName.replaceFirst(PERMISSION_PREFIX, EMPTY_STRING);
StringTokenizer tokenizer = new StringTokenizer(permKey, PERMISSION_SEPERATOR);
String permName = tokenizer.nextToken();
String perm = tokenizer.nextToken();
if (permName.equals("Untitled-0")) { //$NON-NLS-1$
permissionMask.addPermission(((Integer) PentahoAclEntry.getValidPermissionsNameMap().get(perm)).intValue());
}
}
}
if (file instanceof IAclSolutionFile) {
repository.addPermission(file, permissionRecipient, permissionMask);
}
}
}
private Document noPathPage() {
Document document = DocumentHelper.createDocument();
document.addElement(NO_FILE_PATH_NODE_NAME).addText(
Messages.getString("PropertiesPanelUIComponent.USER_NO_FILE_SELECTED")); //$NON-NLS-1$
return document;
}
private Document setPermissionsFailedPage( String msg ) {
Document document = DocumentHelper.createDocument();
document.addElement(SET_PERMISSIONS_DENIED_NAME).addText( msg );
return document;
}
private Document noACLSPage() {
Document document = DocumentHelper.createDocument();
document.addElement(NO_ACLS_NODE_NAME).addText(
Messages.getString("PropertiesPanelUIComponent.ERROR_0001_BAD_CONFIGURATION")); //$NON-NLS-1$
return document;
}
protected Document showInputPage(ISolutionFile file) {
Document document = DocumentHelper.createDocument();
Element root = document.addElement(INPUT_PAGE_NODE_NAME).addText(file.getFullPath());
// Add the info for the file we're working on
root.addElement(FILE_PATH_NODE_NAME).addText(file.getFullPath());
root.addElement(DISPLAY_PATH_NODE_NAME).addText(
file.getFullPath().replaceFirst(repository.getRepositoryName(), EMPTY_STRING).replaceFirst("//", "/")); //$NON-NLS-1$//$NON-NLS-2$
root.addElement(IS_DIR_NODE_NAME).addText(file.isDirectory() ? TRUE : FALSE);
Element recipients = root.addElement(RECIPIENTS_NODE_NAME);
Iterator iter = null;
if (includeRoles) {
// Add all the possible roles
List rList = getAllRolesList();
if (rList != null) {
iter = rList.iterator();
while (iter.hasNext()) {
recipients.addElement(ROLE_NODE_NAME).addText(iter.next().toString());
}
}
}
if (includeUsers) {
// Add all the possible users
List uList = getAllUsersList();
if (uList != null) {
iter = uList.iterator();
while (iter.hasNext()) {
recipients.addElement(USER_NODE_NAME).addText(iter.next().toString());
}
}
}
// Add the names of all the permissions
Map permissionsMap = PentahoAclEntry.getValidPermissionsNameMap();
// permissionsMap.remove(Messages.getString("PentahoAclEntry.USER_SUBSCRIBE")); //$NON-NLS-1$
Iterator keyIter = permissionsMap.keySet().iterator();
Element permNames = root.addElement(PERMISSION_NAMES_NODE_NAME);
while (keyIter.hasNext()) {
permNames.addElement(NAME_NODE_NAME).addText(keyIter.next().toString());
}
Element acListNode = root.addElement(ACCESS_CONTROL_LIST_NODE_NAME);
TreeMap<IPermissionRecipient, IPermissionMask> sortedMap = new TreeMap<IPermissionRecipient, IPermissionMask>(new Comparator<IPermissionRecipient>() {
public int compare(IPermissionRecipient arg0, IPermissionRecipient arg1) {
return arg0.getName().compareTo(arg1.getName());
}
});
sortedMap.putAll(repository.getPermissions(file));
for (Map.Entry<IPermissionRecipient, IPermissionMask> mapEntry :sortedMap.entrySet()) {
IPermissionRecipient permissionRecipient = mapEntry.getKey();
Element acNode = acListNode.addElement(ACCESS_CONTROL_NODE_NAME);
Element recipientNode = acNode.addElement(RECIPIENT_NODE_NAME);
recipientNode.setText(permissionRecipient.getName());
recipientNode.addAttribute(TYPE_PARAM, (permissionRecipient instanceof SimpleRole) ? ROLE_TYPE : USER_TYPE);
// Add individual permissions for this group
for (Iterator keyIterator = permissionsMap.keySet().iterator(); keyIterator.hasNext();) {
Element aPermission = acNode.addElement(PERMISSION_NODE_NAME);
String permName = keyIterator.next().toString();
aPermission.addElement(NAME_NODE_NAME).setText(permName);
int permMask = ((Integer) permissionsMap.get(permName)).intValue();
boolean isPermitted = repository.hasAccess(permissionRecipient, file, permMask);
aPermission.addElement(PERMITTED_NODE_NAME).addText(isPermitted ? TRUE : FALSE);
}
}
return document;
}
public List getAllUsersList() {
if (allUsersList == null) {
allUsersList = userDetailsRoleListService.getAllUsers();
}
return allUsersList;
}
public List getAllRolesList() {
if (allRolesList == null) {
allRolesList = userDetailsRoleListService.getAllRoles();
}
return allRolesList;
}
public Log getLogger() {
return logger;
}
public boolean validate() {
return true;
}
}
The table below shows all metrics for PropertiesPanelUIComponent.java.




