Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian W. Damus2013-11-06 22:29:16 +0000
committerEike Stepper2013-11-12 12:56:20 +0000
commit452e6c6a3919d55c3074eb02aba46ec24081c487 (patch)
tree4dafb737595ef27e6c122931ef1d48b3e00be2a0 /plugins/org.eclipse.emf.cdo.security.ui
parentf4f414bc196a8359700c6e174f3af97f5dc79ba2 (diff)
downloadcdo-452e6c6a3919d55c3074eb02aba46ec24081c487.tar.gz
cdo-452e6c6a3919d55c3074eb02aba46ec24081c487.tar.xz
cdo-452e6c6a3919d55c3074eb02aba46ec24081c487.zip
[418454] [Admin] Client API and UI for managing repositories in a server
https://bugs.eclipse.org/bugs/show_bug.cgi?id=418454 Prompt the user to confirm deletion of a repository if any users are currently connected to it. This uses a new reusable confirmation signal API, including confirmation providers, after the fashion of the authentication signal and credentials providers. Also added the "Manage Security" action to repositories in the CDO Administration view. This uses an alternative handler targeting an admin-repository, which opens a new session if an open session doesn't already exist that is logged in as the administrator. Change-Id: Ib8d7e7d0237f9426158f5a9af57782b8515531cc Also-by: Eike Stepper <stepper@esc-net.de>
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.security.ui')
-rw-r--r--plugins/org.eclipse.emf.cdo.security.ui/META-INF/MANIFEST.MF3
-rw-r--r--plugins/org.eclipse.emf.cdo.security.ui/plugin.xml30
-rw-r--r--plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/handlers/ManageSecurityHandler.java125
-rw-r--r--plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/util/OneToManyBlock.java4
4 files changed, 154 insertions, 8 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 a78bcf3203..5a8a56f44b 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
@@ -23,6 +23,7 @@ Require-Bundle: org.eclipse.emf.cdo.security;bundle-version="[4.3.0,5.0.0)",
org.eclipse.ui.forms;bundle-version="[3.6.100,4.0.0)",
org.eclipse.emf.databinding.edit;bundle-version="[1.3.0,2.0.0)",
org.eclipse.jface.databinding;bundle-version="[1.6.200,2.0.0)",
- org.eclipse.core.databinding.beans;bundle-version="[1.2.200,2.0.0)"
+ org.eclipse.core.databinding.beans;bundle-version="[1.2.200,2.0.0)",
+ org.eclipse.emf.cdo.admin;bundle-version="[4.1.200,5.0.0)"
Bundle-ActivationPolicy: lazy
Bundle-Activator: org.eclipse.emf.cdo.security.internal.ui.bundle.OM$Activator
diff --git a/plugins/org.eclipse.emf.cdo.security.ui/plugin.xml b/plugins/org.eclipse.emf.cdo.security.ui/plugin.xml
index a69db2a457..aa6a811670 100644
--- a/plugins/org.eclipse.emf.cdo.security.ui/plugin.xml
+++ b/plugins/org.eclipse.emf.cdo.security.ui/plugin.xml
@@ -63,10 +63,15 @@
value="1">
</count>
<iterate >
- <adapt
- type="org.eclipse.emf.cdo.session.CDOSession">
- <test property="org.eclipse.emf.cdo.session.userAuthenticated" />
- </adapt>
+ <or>
+ <adapt
+ type="org.eclipse.emf.cdo.session.CDOSession">
+ <test property="org.eclipse.emf.cdo.session.userAuthenticated" />
+ </adapt>
+ <adapt
+ type="org.eclipse.emf.cdo.admin.CDOAdminClientRepository">
+ </adapt>
+ </or>
</iterate>
</with>
</visibleWhen>
@@ -95,4 +100,21 @@
</command>
</extension>
+ <extension
+ point="org.eclipse.ui.handlers">
+ <handler
+ commandId="org.eclipse.emf.cdo.security.ui.openEditor"
+ class="org.eclipse.emf.cdo.security.internal.ui.handlers.ManageSecurityHandler$Sessionless">
+ <activeWhen>
+ <with
+ variable="activeMenuSelection">
+ <iterate >
+ <adapt
+ type="org.eclipse.emf.cdo.admin.CDOAdminClientRepository">
+ </adapt>
+ </iterate>
+ </with>
+ </activeWhen>
+ </handler>
+ </extension>
</plugin>
diff --git a/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/handlers/ManageSecurityHandler.java b/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/handlers/ManageSecurityHandler.java
index 6d9eb86ae9..232a8a1ad7 100644
--- a/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/handlers/ManageSecurityHandler.java
+++ b/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/handlers/ManageSecurityHandler.java
@@ -10,7 +10,12 @@
*/
package org.eclipse.emf.cdo.security.internal.ui.handlers;
+import org.eclipse.emf.cdo.admin.CDOAdminClientRepository;
+import org.eclipse.emf.cdo.common.model.CDOPackageRegistryPopulator;
import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.net4j.CDONet4jSession;
+import org.eclipse.emf.cdo.net4j.CDONet4jSessionConfiguration;
+import org.eclipse.emf.cdo.security.User;
import org.eclipse.emf.cdo.security.internal.ui.editor.CDOSecurityFormEditor;
import org.eclipse.emf.cdo.security.internal.ui.messages.Messages;
import org.eclipse.emf.cdo.security.ui.ISecurityManagementContext;
@@ -19,6 +24,15 @@ import org.eclipse.emf.cdo.ui.CDOEditorInput;
import org.eclipse.emf.cdo.ui.CDOEditorUtil;
import org.eclipse.emf.cdo.view.CDOView;
+import org.eclipse.emf.internal.cdo.session.CDOSessionFactory;
+
+import org.eclipse.net4j.util.ObjectUtil;
+import org.eclipse.net4j.util.StringUtil;
+import org.eclipse.net4j.util.container.IManagedContainer;
+import org.eclipse.net4j.util.container.IPluginContainer;
+import org.eclipse.net4j.util.security.CredentialsProviderFactory;
+import org.eclipse.net4j.util.security.IPasswordCredentialsProvider;
+import org.eclipse.net4j.util.security.NotAuthenticatedException;
import org.eclipse.net4j.util.ui.UIUtil;
import org.eclipse.net4j.util.ui.handlers.LongRunningHandler;
@@ -36,6 +50,7 @@ import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.statushandlers.StatusManager;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
/**
* "Manage Security" command handler, which opens the Security Manager editor
@@ -75,7 +90,7 @@ public class ManageSecurityHandler extends LongRunningHandler
return;
}
- session = getSession();
+ setSession(getSession());
if (session != null && !session.isClosed())
{
final IWorkbenchPage page = part.getSite().getPage();
@@ -95,6 +110,11 @@ public class ManageSecurityHandler extends LongRunningHandler
return UIUtil.adaptElement(getSelection(), CDOSession.class);
}
+ protected void setSession(CDOSession session)
+ {
+ this.session = session;
+ }
+
@Override
protected void doExecute(IProgressMonitor progressMonitor) throws Exception
{
@@ -256,4 +276,107 @@ public class ManageSecurityHandler extends LongRunningHandler
}
});
}
+
+ /**
+ * A specialized handler that gets or creates a session in the context of a repository in the
+ * CDO Administration view.
+ *
+ * @author Christian W. Damus (CEA LIST)
+ */
+ public static class Sessionless extends ManageSecurityHandler implements CDOAdminClientRepository.SessionConfigurator
+ {
+ private static final AtomicInteger NEXT_SESSION_NUMBER = new AtomicInteger();
+
+ public void prepare(CDONet4jSessionConfiguration configuration)
+ {
+ IPasswordCredentialsProvider credentialsProvider = getCredentialsProvider();
+ configuration.setCredentialsProvider(credentialsProvider);
+ }
+
+ @Override
+ protected CDOSession getSession()
+ {
+ return getExistingAdminSession(getRepository());
+ }
+
+ @Override
+ protected void doExecute(IProgressMonitor progressMonitor) throws Exception
+ {
+ CDOAdminClientRepository repository = getRepository();
+ CDOSession session = getExistingAdminSession(repository);
+ if (session == null)
+ {
+ session = openSession(getRepository());
+ setSession(session);
+ }
+
+ if (session != null)
+ {
+ super.doExecute(progressMonitor);
+ }
+ }
+
+ protected CDOAdminClientRepository getRepository()
+ {
+ return UIUtil.adaptElement(getSelection(), CDOAdminClientRepository.class);
+ }
+
+ protected CDOSession getExistingAdminSession(CDOAdminClientRepository repository)
+ {
+ for (Object element : IPluginContainer.INSTANCE.getElements(CDOSessionFactory.PRODUCT_GROUP))
+ {
+ CDONet4jSession session = ObjectUtil.tryCast(element, CDONet4jSession.class);
+
+ // If there's no user ID, then the repository doesn't require authentication,
+ // so we can use that session
+ if (session != null && !session.isClosed()
+ && (User.ADMINISTRATOR.equals(session.getUserID()) || StringUtil.isEmpty(session.getUserID()))
+ && ObjectUtil.equals(session.getRepositoryInfo().getUUID(), repository.getUUID()))
+ {
+ return session;
+ }
+ }
+
+ return null;
+ }
+
+ protected CDOSession openSession(CDOAdminClientRepository repository)
+ {
+ try
+ {
+ CDONet4jSession result = repository.openSession(this);
+ if (result != null)
+ {
+ CDOPackageRegistryPopulator.populate(result.getPackageRegistry());
+
+ // Add this session to the shared container so that it may appear in the CDO Sessions view
+ String description = "session" + NEXT_SESSION_NUMBER.incrementAndGet(); //$NON-NLS-1$
+ IPluginContainer.INSTANCE.putElement(CDOSessionFactory.PRODUCT_GROUP, "security", description, result); //$NON-NLS-1$
+ }
+
+ return result;
+ }
+ catch (NotAuthenticatedException e)
+ {
+ // User cancelled authentication
+ return null;
+ }
+ }
+
+ protected IPasswordCredentialsProvider getCredentialsProvider()
+ {
+ IManagedContainer container = IPluginContainer.INSTANCE;
+ String productGroup = CredentialsProviderFactory.PRODUCT_GROUP;
+ String factoryType = "interactive"; //$NON-NLS-1$
+ IPasswordCredentialsProvider credentialsProvider = (IPasswordCredentialsProvider)container.getElement(
+ productGroup, factoryType, null);
+
+ if (credentialsProvider == null)
+ {
+ credentialsProvider = UIUtil.createInteractiveCredentialsProvider();
+ }
+
+ return credentialsProvider;
+ }
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/util/OneToManyBlock.java b/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/util/OneToManyBlock.java
index 85d340e081..7e33068e66 100644
--- a/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/util/OneToManyBlock.java
+++ b/plugins/org.eclipse.emf.cdo.security.ui/src/org/eclipse/emf/cdo/security/internal/ui/util/OneToManyBlock.java
@@ -80,6 +80,7 @@ import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.widgets.FormToolkit;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
@@ -307,8 +308,7 @@ public class OneToManyBlock
if (directory != null)
{
// Get the available items not already in our input's reference list
- List<?> available = new java.util.ArrayList<Object>(EcoreUtil.getObjectsByType(directory.getItems(),
- itemType));
+ List<?> available = new ArrayList<Object>(EcoreUtil.getObjectsByType(directory.getItems(), itemType));
available.removeAll(value);
SecurityUIUtil.applySupportedElementFilter(available, itemType);

Back to the top