Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian W. Damus2013-10-25 11:12:07 -0400
committerChristian W. Damus2013-10-25 11:14:59 -0400
commitda5fdd258b6f17bc53294b682c1512587d6c60ff (patch)
tree9fa2a4b893dafefaf630171297f8fb76fe65eb57
parentb02553222d4486117970c8105de3560141fe58d9 (diff)
downloadcdo-bugs/399306a.tar.gz
cdo-bugs/399306a.tar.xz
cdo-bugs/399306a.zip
[399306] [Security] Add password managementbugs/399306a
https://bugs.eclipse.org/bugs/show_bug.cgi?id=399306 Update the Reset Password... action to use the new menu contribution mechanism, supporting user-defined key bindings. Includes new reusable Handler analogues of the SafeActionDelegate and LongRunningActionDelegate in the Net4J UI Util.
-rw-r--r--plugins/org.eclipse.emf.cdo.security.ui/META-INF/MANIFEST.MF4
-rw-r--r--plugins/org.eclipse.emf.cdo.security.ui/plugin.properties5
-rw-r--r--plugins/org.eclipse.emf.cdo.security.ui/plugin.xml53
-rw-r--r--plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/actions/ResetPasswordActionDelegate.java48
-rw-r--r--plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/handlers/ResetPasswordHandler.java61
-rw-r--r--plugins/org.eclipse.net4j.util.ui/META-INF/MANIFEST.MF1
-rw-r--r--plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/handlers/LongRunningHandler.java107
-rw-r--r--plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/handlers/SafeHandler.java115
-rw-r--r--plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/handlers/package-info.java18
9 files changed, 346 insertions, 66 deletions
diff --git a/plugins/org.eclipse.emf.cdo.security.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.security.ui/META-INF/MANIFEST.MF
index 5183f356ab..3ca0b085d6 100644
--- a/plugins/org.eclipse.emf.cdo.security.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo.security.ui/META-INF/MANIFEST.MF
@@ -1,13 +1,13 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: org.eclipse.emf.cdo.security.ui;singleton:=true
-Bundle-Version: 1.0.0.qualifier
+Bundle-Version: 4.3.0.qualifier
Bundle-Localization: plugin
Bundle-Name: %pluginName
Bundle-Vendor: %providerName
Bundle-ClassPath: .
Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.emf.cdo.security.internal.ui.actions;version="1.0.0";x-internal:=true
+Export-Package: org.eclipse.emf.cdo.security.internal.ui.handlers;version="4.3.0";x-internal:=true
Require-Bundle: org.eclipse.emf.cdo.security.edit;bundle-version="[4.1.0,5.0.0)",
org.eclipse.net4j.util.ui;bundle-version="[3.4.0,4.0.0)",
org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)";resolution:=optional,
diff --git a/plugins/org.eclipse.emf.cdo.security.ui/plugin.properties b/plugins/org.eclipse.emf.cdo.security.ui/plugin.properties
index 1fa94d8aef..fe8fad889c 100644
--- a/plugins/org.eclipse.emf.cdo.security.ui/plugin.properties
+++ b/plugins/org.eclipse.emf.cdo.security.ui/plugin.properties
@@ -11,4 +11,7 @@ pluginName = CDO Model Repository Security UI
providerName = Eclipse Modeling Project
action.label = Reset Password...
-action.tooltip = Reset the user's password (must be an administrator) \ No newline at end of file
+action.tooltip = Reset the user's password (must be an administrator)
+category.name = CDO Security Management
+command.name = Reset Password
+command.description = Reset the selected user's password. Must be an administrator to reset passwords.
diff --git a/plugins/org.eclipse.emf.cdo.security.ui/plugin.xml b/plugins/org.eclipse.emf.cdo.security.ui/plugin.xml
index b790a81016..35d7e9b783 100644
--- a/plugins/org.eclipse.emf.cdo.security.ui/plugin.xml
+++ b/plugins/org.eclipse.emf.cdo.security.ui/plugin.xml
@@ -14,21 +14,44 @@
<plugin>
<extension
- point="org.eclipse.ui.popupMenus">
- <objectContribution
- adaptable="true"
- id="org.eclipse.emf.cdo.security.ui.UserActions"
- objectClass="org.eclipse.emf.cdo.security.User">
- <action
- class="org.eclipse.emf.cdo.security.internal.ui.actions.ResetPasswordActionDelegate"
- id="org.eclipse.emf.cdo.security.ui.ResetPassword"
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="popup:org.eclipse.ui.popup.any?after=additions">
+ <command
+ id="org.eclipse.emf.cdo.security.ui.ResetPasswordCommand"
+ commandId="org.eclipse.emf.cdo.security.ui.resetPassword"
label="%action.label"
- tooltip="%action.tooltip">
- </action>
- <enablement>
- <test property="org.eclipse.emf.cdo.object.writable" value="true"/>
- </enablement>
- </objectContribution>
+ tooltip="%action.tooltip"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <with
+ variable="activeMenuSelection">
+ <count
+ value="1">
+ </count>
+ <iterate >
+ <adapt
+ type="org.eclipse.emf.cdo.security.User">
+ </adapt>
+ </iterate>
+ </with>
+ </visibleWhen>
+ </command>
+ </menuContribution>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commands">
+ <category
+ id="org.eclipse.emf.cdo.security.ui.management"
+ name="%category.name">
+ </category>
+ <command
+ id="org.eclipse.emf.cdo.security.ui.resetPassword"
+ categoryId="org.eclipse.emf.cdo.security.ui.management"
+ name="%command.name"
+ description="%command.description"
+ defaultHandler="org.eclipse.emf.cdo.security.internal.ui.handlers.ResetPasswordHandler">
+ </command>
</extension>
-
</plugin>
diff --git a/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/actions/ResetPasswordActionDelegate.java b/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/actions/ResetPasswordActionDelegate.java
deleted file mode 100644
index fb86908e43..0000000000
--- a/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/actions/ResetPasswordActionDelegate.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2013 Eike Stepper (Berlin, Germany) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Christian W. Damus (CEA LIST) - initial API and implementation
- */
-package org.eclipse.emf.cdo.security.internal.ui.actions;
-
-import org.eclipse.emf.cdo.security.User;
-
-import org.eclipse.net4j.util.ui.actions.LongRunningActionDelegate;
-
-import org.eclipse.emf.spi.cdo.InternalCDOSession;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-/**
- * Administrative password reset action on users in the security model.
- * @author Christian W. Damus (CEA LIST)
- */
-public class ResetPasswordActionDelegate extends LongRunningActionDelegate
-{
- public ResetPasswordActionDelegate()
- {
- }
-
- @Override
- protected void doRun(IProgressMonitor progressMonitor) throws Exception
- {
- ISelection selection = getSelection();
- if (selection instanceof IStructuredSelection)
- {
- Object selected = ((IStructuredSelection)selection).getFirstElement();
- if (selected instanceof User)
- {
- User user = (User)selected;
- InternalCDOSession session = (InternalCDOSession)user.cdoView().getSession();
- session.resetCredentials(user.getId());
- }
- }
- }
-}
diff --git a/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/handlers/ResetPasswordHandler.java b/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/handlers/ResetPasswordHandler.java
new file mode 100644
index 0000000000..ef49f723ac
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/handlers/ResetPasswordHandler.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2013 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus (CEA LIST) - initial API and implementation
+ */
+package org.eclipse.emf.cdo.security.internal.ui.handlers;
+
+import org.eclipse.emf.cdo.CDOObject;
+import org.eclipse.emf.cdo.security.User;
+import org.eclipse.emf.cdo.view.CDOView;
+
+import org.eclipse.net4j.util.ui.UIUtil;
+import org.eclipse.net4j.util.ui.handlers.LongRunningHandler;
+
+import org.eclipse.emf.spi.cdo.InternalCDOSession;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.viewers.ISelection;
+
+/**
+ * Administrative password reset command handler on users in the security model.
+ *
+ * @author Christian W. Damus (CEA LIST)
+ */
+public class ResetPasswordHandler extends LongRunningHandler
+{
+ private User user;
+
+ public ResetPasswordHandler()
+ {
+ }
+
+ @Override
+ protected void doExecute(IProgressMonitor progressMonitor) throws Exception
+ {
+ if (user != null)
+ {
+ InternalCDOSession session = (InternalCDOSession)user.cdoView().getSession();
+ session.resetCredentials(user.getId());
+ }
+ }
+
+ @Override
+ protected boolean updateSelection(ISelection selection)
+ {
+ user = UIUtil.getElement(getSelection(), User.class);
+ return user != null && canWrite(user);
+ }
+
+ private boolean canWrite(CDOObject object)
+ {
+ CDOView view = object.cdoView();
+
+ return (view == null || !view.isReadOnly()) && object.cdoPermission().isWritable();
+ }
+}
diff --git a/plugins/org.eclipse.net4j.util.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.net4j.util.ui/META-INF/MANIFEST.MF
index d52c1d7a76..a1b438c344 100644
--- a/plugins/org.eclipse.net4j.util.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.net4j.util.ui/META-INF/MANIFEST.MF
@@ -24,6 +24,7 @@ Export-Package: org.eclipse.net4j.util.internal.ui;version="3.4.0";x-internal:=t
org.eclipse.net4j.util.ui.actions;version="3.4.0",
org.eclipse.net4j.util.ui.container;version="3.4.0",
org.eclipse.net4j.util.ui.dnd;version="3.4.0",
+ org.eclipse.net4j.util.ui.handlers;version="3.4.0",
org.eclipse.net4j.util.ui.prefs;version="3.4.0",
org.eclipse.net4j.util.ui.proposals;version="3.4.0",
org.eclipse.net4j.util.ui.security;version="3.4.0",
diff --git a/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/handlers/LongRunningHandler.java b/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/handlers/LongRunningHandler.java
new file mode 100644
index 0000000000..2348e2a24f
--- /dev/null
+++ b/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/handlers/LongRunningHandler.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2007-2009, 2011, 2012 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ * Christian W. Damus (CEA LIST) - bug 399306 - adapted from LongRunningActionDelegate
+ */
+package org.eclipse.net4j.util.ui.handlers;
+
+import org.eclipse.net4j.util.internal.ui.bundle.OM;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+/**
+ * @author Eike Stepper
+ * @author Christian W. Damus (CEA LIST)
+ *
+ * @since 3.4
+ */
+public abstract class LongRunningHandler extends SafeHandler
+{
+ private int totalWork;
+
+ public LongRunningHandler()
+ {
+ }
+
+ protected final int getTotalWork()
+ {
+ return totalWork;
+ }
+
+ protected final void setTotalWork(int totalWork)
+ {
+ this.totalWork = totalWork;
+ }
+
+ protected final void cancel()
+ {
+ totalWork = 0;
+ }
+
+ @Override
+ protected final Object safeExecute(ExecutionEvent event) throws Exception
+ {
+ totalWork = IProgressMonitor.UNKNOWN;
+ preRun();
+ if (totalWork != 0)
+ {
+ new Job(getText())
+ {
+ @Override
+ protected IStatus run(IProgressMonitor progressMonitor)
+ {
+ try
+ {
+ doExecute(progressMonitor);
+ return Status.OK_STATUS;
+ }
+ catch (Exception ex)
+ {
+ OM.LOG.error(ex);
+ return new Status(IStatus.ERROR, OM.BUNDLE_ID, ex.getMessage(), ex);
+ }
+ }
+ }.schedule();
+ }
+
+ // Cannot return anything more useful
+ return null;
+ }
+
+ protected void preRun() throws Exception
+ {
+ }
+
+ protected String getBundleID()
+ {
+ return OM.BUNDLE_ID;
+ }
+
+ /**
+ * Executes the long-running handler in a background job. Note that the original
+ * {@link ExecutionEvent} is not available because it is only valid during the
+ * execution of the handler call-back on the UI thread. Any details required from
+ * it must be {@linkplain SafeHandler#extractEventDetails(ExecutionEvent) extracted}
+ * before the job is scheduled.
+ */
+ protected abstract void doExecute(IProgressMonitor progressMonitor) throws Exception;
+
+ protected final void checkCancelation(IProgressMonitor monitor)
+ {
+ if (monitor.isCanceled())
+ {
+ throw new OperationCanceledException();
+ }
+ }
+}
diff --git a/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/handlers/SafeHandler.java b/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/handlers/SafeHandler.java
new file mode 100644
index 0000000000..5804bc5896
--- /dev/null
+++ b/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/handlers/SafeHandler.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2007, 2009, 2011, 2012 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ * Christian W. Damus (CEA LIST) - bug 399306 - adapted from SafeActionDelegate
+ */
+package org.eclipse.net4j.util.ui.handlers;
+
+import org.eclipse.net4j.util.internal.ui.bundle.OM;
+import org.eclipse.net4j.util.internal.ui.messages.Messages;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.common.NotDefinedException;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.ISources;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * @author Eike Stepper
+ * @author Christian W. Damus (CEA LIST)
+ *
+ * @since 3.4
+ */
+public abstract class SafeHandler extends AbstractHandler
+{
+
+ private Command command;
+
+ private ISelection selection;
+
+ public SafeHandler()
+ {
+ }
+
+ public Command getCommand()
+ {
+ return command;
+ }
+
+ public ISelection getSelection()
+ {
+ return selection;
+ }
+
+ public Object execute(ExecutionEvent event) throws ExecutionException
+ {
+ Object result = null;
+
+ try
+ {
+ extractEventDetails(event);
+
+ result = safeExecute(event);
+ }
+ catch (ExecutionException ex)
+ {
+ throw ex;
+ }
+ catch (Exception ex)
+ {
+ OM.LOG.error(ex);
+ MessageDialog.openError(null, getText(),
+ ex.getLocalizedMessage() + "\n" + Messages.getString("SafeActionDelegate_0")); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ return result;
+ }
+
+ @Override
+ public void setEnabled(Object evaluationContext)
+ {
+ Object variable = HandlerUtil.getVariable(evaluationContext, ISources.ACTIVE_CURRENT_SELECTION_NAME);
+ selection = variable instanceof ISelection ? (ISelection)variable : StructuredSelection.EMPTY;
+ setBaseEnabled(updateSelection(selection));
+ }
+
+ /**
+ * Extracts details from the {@code event} that we may need later,
+ * for example on a background thread when the original execution
+ * context is no longer valid.
+ */
+ protected void extractEventDetails(ExecutionEvent event)
+ {
+ command = event.getCommand();
+ }
+
+ protected abstract Object safeExecute(ExecutionEvent event) throws Exception;
+
+ protected String getText()
+ {
+ try
+ {
+ return command == null ? Messages.getString("SafeActionDelegate_1") : command.getName(); //$NON-NLS-1$
+ }
+ catch (NotDefinedException e)
+ {
+ return Messages.getString("SafeActionDelegate_1"); //$NON-NLS-1$
+ }
+ }
+
+ protected boolean updateSelection(ISelection selection)
+ {
+ return true;
+ }
+}
diff --git a/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/handlers/package-info.java b/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/handlers/package-info.java
new file mode 100644
index 0000000000..c98e4f837c
--- /dev/null
+++ b/plugins/org.eclipse.net4j.util.ui/src/org/eclipse/net4j/util/ui/handlers/package-info.java
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2013 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus (CEA LIST) - initial API and implementation
+ */
+
+/**
+ * Reusable command handlers.
+ *
+ * @since 3.4
+ */
+package org.eclipse.net4j.util.ui.handlers;
+

Back to the top