--- /dev/null
+/*
+ * 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 "[]";
+
+ }
+ }
+}