/* * Copyright (C) 2007-2012 Argeo GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.argeo.cms.ui.workbench.internal.jcr.commands; import java.security.Principal; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.security.AccessControlEntry; import javax.jcr.security.AccessControlList; import javax.jcr.security.AccessControlManager; import javax.jcr.security.Privilege; import org.argeo.cms.ui.jcr.JcrImages; import org.argeo.cms.ui.jcr.model.SingleJcrNodeElem; import org.argeo.cms.ui.jcr.model.WorkspaceElem; import org.argeo.cms.ui.workbench.WorkbenchUiPlugin; import org.argeo.eclipse.ui.EclipseUiException; import org.argeo.eclipse.ui.EclipseUiUtils; import org.argeo.eclipse.ui.TreeParent; import org.argeo.eclipse.ui.dialogs.ErrorFeedback; import org.argeo.jcr.JcrUtils; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.handlers.HandlerUtil; /** Open a dialog to remove privileges from the selected node */ public class RemovePrivileges extends AbstractHandler { public final static String ID = WorkbenchUiPlugin.PLUGIN_ID + ".removePrivileges"; public Object execute(ExecutionEvent event) throws ExecutionException { ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event) .getActivePage().getSelection(); if (selection != null && !selection.isEmpty() && selection instanceof IStructuredSelection) { Object obj = ((IStructuredSelection) selection).getFirstElement(); TreeParent uiNode = null; Node jcrNode = null; if (obj instanceof SingleJcrNodeElem) { uiNode = (TreeParent) obj; jcrNode = ((SingleJcrNodeElem) uiNode).getNode(); } else if (obj instanceof WorkspaceElem) { uiNode = (TreeParent) obj; jcrNode = ((WorkspaceElem) uiNode).getRootNode(); } else return null; try { String targetPath = jcrNode.getPath(); Dialog dialog = new RemovePrivDialog( HandlerUtil.getActiveShell(event), jcrNode.getSession(), targetPath); dialog.open(); return null; } catch (RepositoryException re) { throw new EclipseUiException("Unable to retrieve " + "path or JCR session to add privilege on " + jcrNode, re); } } else { ErrorFeedback.show("Cannot add privileges"); } return null; } private class RemovePrivDialog extends TitleAreaDialog { private static final long serialVersionUID = 280139710002698692L; private Composite body; private final String path; private final Session session; public RemovePrivDialog(Shell parentShell, Session session, String path) { super(parentShell); this.session = session; this.path = path; } @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText("Remove privileges"); } protected Control createDialogArea(Composite parent) { Composite dialogarea = (Composite) super.createDialogArea(parent); dialogarea.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, true)); body = new Composite(dialogarea, SWT.NONE); body.setLayoutData(EclipseUiUtils.fillAll()); refreshContent(); parent.pack(); return body; } private void refreshContent() { EclipseUiUtils.clear(body); try { AccessControlManager acm = session.getAccessControlManager(); AccessControlList acl = JcrUtils .getAccessControlList(acm, path); if (acl == null || acl.getAccessControlEntries().length <= 0) setMessage("No privilege are defined on this node", IMessageProvider.INFORMATION); else { body.setLayout(new GridLayout(3, false)); for (AccessControlEntry ace : acl.getAccessControlEntries()) { addOnePrivRow(body, ace); } setMessage("Remove some of the defined privileges", IMessageProvider.INFORMATION); } } catch (RepositoryException e) { throw new EclipseUiException("Unable to list privileges on " + path, e); } body.layout(true, true); } private void addOnePrivRow(Composite parent, AccessControlEntry ace) { Principal currentPrincipal = ace.getPrincipal(); final String currPrincipalName = currentPrincipal.getName(); new Label(parent, SWT.WRAP).setText(currPrincipalName); new Label(parent, SWT.WRAP).setText(privAsString(ace .getPrivileges())); final Button rmBtn = new Button(parent, SWT.FLAT); rmBtn.setImage(JcrImages.REMOVE); rmBtn.addSelectionListener(new SelectionAdapter() { private static final long serialVersionUID = 7566938841363890730L; @Override public void widgetSelected(SelectionEvent e) { if (MessageDialog.openConfirm(rmBtn.getShell(), "Confirm deletion", "Are you sure you want to remove this privilege?")) { try { session.save(); JcrUtils.clearAccessControList(session, path, currPrincipalName); session.save(); refreshContent(); } catch (RepositoryException re) { throw new EclipseUiException("Unable to " + "remove privilege for " + currPrincipalName + " on " + path, re); } } super.widgetSelected(e); } }); } private String privAsString(Privilege[] currentPrivileges) { StringBuilder builder = new StringBuilder(); builder.append("[ "); for (Privilege priv : currentPrivileges) { builder.append(priv.getName()).append(", "); } if (builder.length() > 3) return builder.substring(0, builder.length() - 2) + " ]"; else return "[]"; } } }