From 83dc7b38160651626d00f6048f20183e01ad323a Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 16 Jan 2011 21:17:49 +0000 Subject: [PATCH] Adapt Security to RCP git-svn-id: https://svn.argeo.org/commons/trunk@4035 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../org.argeo.eclipse.dep.common/pom.xml | 26 +- .../org.argeo.eclipse.dep.rcp/pom.xml | 28 ++ eclipse/features/pom.xml | 48 +- eclipse/plugins/org.argeo.eclipse.ui/pom.xml | 4 + .../spring/AbstractSpringUiPlugin.java | 41 -- .../spring/ApplicationContextTracker.java | 12 +- osgi/runtime/org.argeo.osgi.boot/pom.xml | 4 +- pom.xml | 14 +- .../org.argeo.security.equinox/.classpath | 7 + .../org.argeo.security.equinox/.project | 28 ++ .../.settings/org.eclipse.jdt.core.prefs | 8 + .../.settings/org.eclipse.pde.core.prefs | 4 + .../META-INF/spring/loginModules.xml | 11 + .../META-INF/spring/osgi.xml | 14 + .../build.properties | 5 + .../jaas/jaas_default.txt | 14 + .../org.argeo.security.equinox/plugin.xml | 30 ++ .../org.argeo.security.equinox/pom.xml | 76 ++++ .../argeo/security/equinox/CurrentUser.java | 64 +++ .../security/equinox/EquinoxSecurity.java | 38 ++ .../security/equinox/SpringLoginModule.java | 113 +++++ .../org.argeo.security.ui.rap-maven.target | 420 ++++++++++++++++++ .../plugins/org.argeo.security.ui.rap/pom.xml | 82 ++++ .../org.argeo.security.ui.rcp/.classpath | 7 + .../org.argeo.security.ui.rcp/.project | 28 ++ .../.settings/org.eclipse.jdt.core.prefs | 8 + .../SecureRCP.product | 122 +++++ .../argeo_security_rap.properties | 24 + .../build.properties | 7 + .../icons/alt_about.gif | Bin 0 -> 9340 bytes .../icons/alt_launcher.icns | Bin 0 -> 51159 bytes .../icons/alt_launcher.ico | Bin 0 -> 26694 bytes .../icons/alt_launcher.xpm | 307 +++++++++++++ .../icons/alt_window_16.gif | Bin 0 -> 637 bytes .../icons/alt_window_32.gif | Bin 0 -> 1192 bytes .../log4j.properties | 24 + .../org.argeo.security.ui.rcp/plugin.xml | 30 ++ .../plugins/org.argeo.security.ui.rcp/pom.xml | 159 +++++++ .../rcp/RapSecureWorkbenchWindowAdvisor.java | 31 ++ .../ui/rcp/SecureActionBarAdvisor.java | 63 +++ .../org/argeo/security/ui/rcp/SecureRap.java | 103 +++++ .../org/argeo/security/ui/rcp/SecureRcp.java | 70 +++ .../ui/rcp/SecureWorkbenchAdvisor.java | 18 + .../ui/rcp/SecureWorkbenchWindowAdvisor.java | 30 ++ .../plugins/org.argeo.security.ui/.classpath | 7 + .../plugins/org.argeo.security.ui/.project | 28 ++ .../.settings/org.eclipse.jdt.core.prefs | 8 + .../.settings/org.eclipse.pde.core.prefs | 3 + .../META-INF/MANIFEST.MF | 37 ++ .../META-INF/spring/osgi.xml | 12 + .../META-INF/spring/views.xml | 14 + .../org.argeo.security.ui/build.properties | 5 + .../plugins/org.argeo.security.ui/plugin.xml | 58 +++ .../plugins/org.argeo.security.ui/pom.xml | 101 +++++ .../security/ui/SecurityPerspective.java | 23 + .../argeo/security/ui/SecurityUiPlugin.java | 50 +++ .../ui/dialogs/AbstractLoginDialog.java | 118 +++++ .../ui/dialogs/DefaultLoginDialog.java | 110 +++++ .../security/ui/views/CurrentUserView.java | 129 ++++++ .../argeo/security/ui/views/UsersView.java | 129 ++++++ security/eclipse/plugins/pom.xml | 84 ++++ security/eclipse/pom.xml | 19 + security/pom.xml | 1 + .../org.argeo.server.ads.server/.project | 22 + .../.settings/org.eclipse.pde.core.prefs | 4 + .../META-INF/spring/ads.xml | 37 +- .../build.properties | 1 + server/runtime/org.argeo.server.core/pom.xml | 7 +- .../build.properties | 2 - 69 files changed, 3011 insertions(+), 120 deletions(-) delete mode 100644 eclipse/plugins/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/AbstractSpringUiPlugin.java create mode 100644 security/eclipse/plugins/org.argeo.security.equinox/.classpath create mode 100644 security/eclipse/plugins/org.argeo.security.equinox/.project create mode 100644 security/eclipse/plugins/org.argeo.security.equinox/.settings/org.eclipse.jdt.core.prefs create mode 100644 security/eclipse/plugins/org.argeo.security.equinox/.settings/org.eclipse.pde.core.prefs create mode 100644 security/eclipse/plugins/org.argeo.security.equinox/META-INF/spring/loginModules.xml create mode 100644 security/eclipse/plugins/org.argeo.security.equinox/META-INF/spring/osgi.xml create mode 100644 security/eclipse/plugins/org.argeo.security.equinox/build.properties create mode 100644 security/eclipse/plugins/org.argeo.security.equinox/jaas/jaas_default.txt create mode 100644 security/eclipse/plugins/org.argeo.security.equinox/plugin.xml create mode 100644 security/eclipse/plugins/org.argeo.security.equinox/pom.xml create mode 100644 security/eclipse/plugins/org.argeo.security.equinox/src/main/java/org/argeo/security/equinox/CurrentUser.java create mode 100644 security/eclipse/plugins/org.argeo.security.equinox/src/main/java/org/argeo/security/equinox/EquinoxSecurity.java create mode 100644 security/eclipse/plugins/org.argeo.security.equinox/src/main/java/org/argeo/security/equinox/SpringLoginModule.java create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rap/org.argeo.security.ui.rap-maven.target create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rap/pom.xml create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/.classpath create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/.project create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/.settings/org.eclipse.jdt.core.prefs create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/SecureRCP.product create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/argeo_security_rap.properties create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/build.properties create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/icons/alt_about.gif create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/icons/alt_launcher.icns create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/icons/alt_launcher.ico create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/icons/alt_launcher.xpm create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/icons/alt_window_16.gif create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/icons/alt_window_32.gif create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/log4j.properties create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/plugin.xml create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/pom.xml create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/RapSecureWorkbenchWindowAdvisor.java create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureActionBarAdvisor.java create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureRap.java create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureRcp.java create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureWorkbenchAdvisor.java create mode 100644 security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureWorkbenchWindowAdvisor.java create mode 100644 security/eclipse/plugins/org.argeo.security.ui/.classpath create mode 100644 security/eclipse/plugins/org.argeo.security.ui/.project create mode 100644 security/eclipse/plugins/org.argeo.security.ui/.settings/org.eclipse.jdt.core.prefs create mode 100644 security/eclipse/plugins/org.argeo.security.ui/.settings/org.eclipse.pde.core.prefs create mode 100644 security/eclipse/plugins/org.argeo.security.ui/META-INF/MANIFEST.MF create mode 100644 security/eclipse/plugins/org.argeo.security.ui/META-INF/spring/osgi.xml create mode 100644 security/eclipse/plugins/org.argeo.security.ui/META-INF/spring/views.xml create mode 100644 security/eclipse/plugins/org.argeo.security.ui/build.properties create mode 100644 security/eclipse/plugins/org.argeo.security.ui/plugin.xml create mode 100644 security/eclipse/plugins/org.argeo.security.ui/pom.xml create mode 100644 security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/SecurityPerspective.java create mode 100644 security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/SecurityUiPlugin.java create mode 100644 security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/dialogs/AbstractLoginDialog.java create mode 100644 security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/dialogs/DefaultLoginDialog.java create mode 100644 security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/CurrentUserView.java create mode 100644 security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/UsersView.java create mode 100644 security/eclipse/plugins/pom.xml create mode 100644 security/eclipse/pom.xml create mode 100644 server/modules/org.argeo.server.ads.server/.project create mode 100644 server/modules/org.argeo.server.ads.server/.settings/org.eclipse.pde.core.prefs create mode 100644 server/modules/org.argeo.server.ads.server/build.properties diff --git a/eclipse/features/org.argeo.eclipse.dep.common/pom.xml b/eclipse/features/org.argeo.eclipse.dep.common/pom.xml index 2ef694097..7c0a8455a 100644 --- a/eclipse/features/org.argeo.eclipse.dep.common/pom.xml +++ b/eclipse/features/org.argeo.eclipse.dep.common/pom.xml @@ -24,22 +24,6 @@ org.eclipse.core org.eclipse.core.runtime - - org.eclipse.swt - org.eclipse.swt - - - org.eclipse.swt - org.eclipse.swt.gtk.linux.x86_64 - - - org.eclipse.swt - org.eclipse.swt.gtk.linux.x86 - - - org.eclipse.swt - org.eclipse.swt.win32.win32.x86 - org.eclipse.core org.eclipse.core.commands @@ -57,17 +41,15 @@ org.eclipse.equinox org.eclipse.equinox.launcher + + org.eclipse.equinox - org.eclipse.equinox.launcher.gtk.linux.x86_64 - - - org.eclipse.equinox - org.eclipse.equinox.launcher.gtk.linux.x86 + org.eclipse.equinox.security org.eclipse.equinox - org.eclipse.equinox.launcher.win32.win32.x86 + org.eclipse.equinox.security.ui diff --git a/eclipse/features/org.argeo.eclipse.dep.rcp/pom.xml b/eclipse/features/org.argeo.eclipse.dep.rcp/pom.xml index 571745e19..a6ef2d5b8 100644 --- a/eclipse/features/org.argeo.eclipse.dep.rcp/pom.xml +++ b/eclipse/features/org.argeo.eclipse.dep.rcp/pom.xml @@ -30,5 +30,33 @@ org.eclipse.ui org.eclipse.ui + + + + org.eclipse.swt + org.eclipse.swt + + + org.eclipse.swt + org.eclipse.swt.gtk.linux.x86_64 + + + org.eclipse.swt + org.eclipse.swt.win32.win32.x86 + + + + + + + + + + + + + + + diff --git a/eclipse/features/pom.xml b/eclipse/features/pom.xml index c01f98b8d..1b72355fa 100644 --- a/eclipse/features/pom.xml +++ b/eclipse/features/pom.xml @@ -45,24 +45,7 @@ org.apache.felix maven-bundle-plugin ${version.maven-bundle-plugin} - - META-INF - - ${project.artifactId} - ${project.version}-r${buildNumber} - - - - - bundle-manifest - process-resources - - manifest - - - - @@ -70,6 +53,13 @@ org.argeo.maven.plugins maven-argeo-osgi-plugin + + resolve-pde-sources + + pde-sources + + generate-resources + generate-descriptors @@ -77,12 +67,30 @@ generate-resources - + + check-osgi + test + + equinox + + + true + + -clean + + + + + + org.argeo.commons.osgi + org.argeo.osgi.boot + 0.2.2-SNAPSHOT + test + + \ No newline at end of file diff --git a/eclipse/plugins/org.argeo.eclipse.ui/pom.xml b/eclipse/plugins/org.argeo.eclipse.ui/pom.xml index a40ed57c2..ee5398252 100644 --- a/eclipse/plugins/org.argeo.eclipse.ui/pom.xml +++ b/eclipse/plugins/org.argeo.eclipse.ui/pom.xml @@ -74,6 +74,10 @@ org.springframework org.springframework.context + + org.springframework.osgi + org.springframework.osgi.extender + diff --git a/eclipse/plugins/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/AbstractSpringUiPlugin.java b/eclipse/plugins/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/AbstractSpringUiPlugin.java deleted file mode 100644 index 5c31d6137..000000000 --- a/eclipse/plugins/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/AbstractSpringUiPlugin.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2010 Mathieu Baudier - * - * 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.eclipse.spring; - -import org.eclipse.ui.plugin.AbstractUIPlugin; -import org.osgi.framework.BundleContext; -import org.springframework.context.ApplicationContext; - -public abstract class AbstractSpringUiPlugin extends AbstractUIPlugin { - private BundleContext bundleContext; - - @Override - public void start(BundleContext context) throws Exception { - super.start(context); - this.bundleContext = context; - } - - @Override - public void stop(BundleContext context) throws Exception { - super.stop(context); - } - - public ApplicationContext getApplicationContext() { - return ApplicationContextTracker.getApplicationContext(bundleContext - .getBundle()); - } -} diff --git a/eclipse/plugins/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/ApplicationContextTracker.java b/eclipse/plugins/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/ApplicationContextTracker.java index e29d5a056..805d11d8a 100644 --- a/eclipse/plugins/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/ApplicationContextTracker.java +++ b/eclipse/plugins/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/spring/ApplicationContextTracker.java @@ -20,7 +20,6 @@ import static java.text.MessageFormat.format; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.argeo.eclipse.ui.ArgeoUiPlugin; import org.eclipse.core.runtime.Platform; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; @@ -54,8 +53,8 @@ class ApplicationContextTracker { */ public ApplicationContextTracker(final Bundle contributorBundle, final BundleContext factoryBundleContext) { - final String filter = format(FILTER, contributorBundle - .getSymbolicName()); + final String filter = format(FILTER, + contributorBundle.getSymbolicName()); try { applicationContextServiceTracker = new ServiceTracker( factoryBundleContext, FrameworkUtil.createFilter(filter), @@ -98,9 +97,7 @@ class ApplicationContextTracker { static ApplicationContext getApplicationContext(Bundle contributorBundle) { if (log.isTraceEnabled()) - log - .trace("Get application context for bundle " - + contributorBundle); + log.trace("Get application context for bundle " + contributorBundle); if (contributorBundle.getState() != Bundle.ACTIVE && contributorBundle.getState() != Bundle.STARTING) { @@ -114,8 +111,7 @@ class ApplicationContextTracker { } final ApplicationContextTracker applicationContextTracker = new ApplicationContextTracker( - contributorBundle, ArgeoUiPlugin.getDefault() - .getBundleContext()); + contributorBundle, contributorBundle.getBundleContext()); ApplicationContext applicationContext = null; try { applicationContext = applicationContextTracker diff --git a/osgi/runtime/org.argeo.osgi.boot/pom.xml b/osgi/runtime/org.argeo.osgi.boot/pom.xml index 9e9f30c62..e5d29a912 100644 --- a/osgi/runtime/org.argeo.osgi.boot/pom.xml +++ b/osgi/runtime/org.argeo.osgi.boot/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 org.argeo.commons.osgi @@ -38,6 +39,7 @@ org.argeo.osgi.boot.Activator + J2SE-1.4 diff --git a/pom.xml b/pom.xml index 5f6feca0c..7344fc97a 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 org.argeo @@ -82,6 +83,7 @@ limitations under the License. org.apache.maven.plugins maven-compiler-plugin + 2.3.2 1.5 1.5 @@ -90,6 +92,7 @@ limitations under the License. org.apache.maven.plugins maven-source-plugin + 2.1.2 attach-sources @@ -107,6 +110,7 @@ limitations under the License. maven-jar-plugin + 2.3.1 target/classes/META-INF/MANIFEST.MF @@ -123,6 +127,7 @@ limitations under the License. ${project.version}-r${buildNumber} ${pom.artifactId} + J2SE-1.5 <_removeheaders>Bnd-LastModified @@ -167,6 +172,7 @@ limitations under the License. org.apache.maven.plugins maven-resources-plugin + 2.4.3 UTF-8 @@ -249,6 +255,7 @@ limitations under the License. org.apache.maven.plugins maven-project-info-reports-plugin + 2.3.1 @@ -271,6 +278,7 @@ limitations under the License. org.apache.maven.plugins maven-javadoc-plugin + 2.7 false true @@ -280,6 +288,7 @@ limitations under the License. org.apache.maven.plugins maven-jxr-plugin + 2.2 true @@ -287,6 +296,7 @@ limitations under the License. org.apache.maven.plugins maven-surefire-report-plugin + 2.7.1 false true @@ -295,6 +305,7 @@ limitations under the License. org.codehaus.mojo taglist-maven-plugin + 2.4 true @@ -307,6 +318,7 @@ limitations under the License. org.apache.maven.plugins maven-changelog-plugin + 2.2 false diff --git a/security/eclipse/plugins/org.argeo.security.equinox/.classpath b/security/eclipse/plugins/org.argeo.security.equinox/.classpath new file mode 100644 index 000000000..92f19d2ff --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.equinox/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/security/eclipse/plugins/org.argeo.security.equinox/.project b/security/eclipse/plugins/org.argeo.security.equinox/.project new file mode 100644 index 000000000..e4dd594e8 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.equinox/.project @@ -0,0 +1,28 @@ + + + org.argeo.security.equinox + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/security/eclipse/plugins/org.argeo.security.equinox/.settings/org.eclipse.jdt.core.prefs b/security/eclipse/plugins/org.argeo.security.equinox/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..62fa6bd36 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.equinox/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +#Sun Jan 16 11:20:02 CET 2011 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/security/eclipse/plugins/org.argeo.security.equinox/.settings/org.eclipse.pde.core.prefs b/security/eclipse/plugins/org.argeo.security.equinox/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 000000000..87ab38102 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.equinox/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,4 @@ +#Sun Jan 16 11:19:07 CET 2011 +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/security/eclipse/plugins/org.argeo.security.equinox/META-INF/spring/loginModules.xml b/security/eclipse/plugins/org.argeo.security.equinox/META-INF/spring/loginModules.xml new file mode 100644 index 000000000..f454d7a3a --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.equinox/META-INF/spring/loginModules.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/security/eclipse/plugins/org.argeo.security.equinox/META-INF/spring/osgi.xml b/security/eclipse/plugins/org.argeo.security.equinox/META-INF/spring/osgi.xml new file mode 100644 index 000000000..8003fb277 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.equinox/META-INF/spring/osgi.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/security/eclipse/plugins/org.argeo.security.equinox/build.properties b/security/eclipse/plugins/org.argeo.security.equinox/build.properties new file mode 100644 index 000000000..87a7fc250 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.equinox/build.properties @@ -0,0 +1,5 @@ +bin.includes = META-INF/,\ + jaas/,\ + plugin.xml +source.. = src/main/java/ +output.. = target/classes/ diff --git a/security/eclipse/plugins/org.argeo.security.equinox/jaas/jaas_default.txt b/security/eclipse/plugins/org.argeo.security.equinox/jaas/jaas_default.txt new file mode 100644 index 000000000..b6cbaa655 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.equinox/jaas/jaas_default.txt @@ -0,0 +1,14 @@ +UNIX { + org.eclipse.equinox.security.auth.module.ExtensionLoginModule sufficient + extensionId="org.argeo.security.equinox.unixLoginModule"; +}; + +SPRING { + org.eclipse.equinox.security.auth.module.ExtensionLoginModule sufficient + extensionId="org.argeo.security.equinox.springLoginModule"; +}; + +SPRING_SECURITY_CONTEXT { + org.eclipse.equinox.security.auth.module.ExtensionLoginModule sufficient + extensionId="org.argeo.security.equinox.springSecurityContextLoginModule"; +}; \ No newline at end of file diff --git a/security/eclipse/plugins/org.argeo.security.equinox/plugin.xml b/security/eclipse/plugins/org.argeo.security.equinox/plugin.xml new file mode 100644 index 000000000..b407360ac --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.equinox/plugin.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + name="Spring Login Module" + + + + + diff --git a/security/eclipse/plugins/org.argeo.security.equinox/pom.xml b/security/eclipse/plugins/org.argeo.security.equinox/pom.xml new file mode 100644 index 000000000..1c0014844 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.equinox/pom.xml @@ -0,0 +1,76 @@ + + 4.0.0 + + org.argeo.commons.security + 0.2.2-SNAPSHOT + plugins + .. + + org.argeo.security.equinox + Commons Security Equinox + jar + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + org.apache.felix + maven-bundle-plugin + ${version.maven-bundle-plugin} + + + lazy + org.argeo.security.equinox.EquinoxSecurity + *, + org.springframework.core, + org.argeo.eclipse.spring + + + + + + + + + + + org.eclipse.osgi + org.eclipse.osgi + + + org.eclipse.equinox + org.eclipse.equinox.security + + + + + org.argeo.commons.basic + org.argeo.basic.nodeps + 0.2.2-SNAPSHOT + + + + + org.springframework.security + org.springframework.security.core + + + + + org.slf4j + com.springsource.slf4j.org.apache.commons.logging + + + + diff --git a/security/eclipse/plugins/org.argeo.security.equinox/src/main/java/org/argeo/security/equinox/CurrentUser.java b/security/eclipse/plugins/org.argeo.security.equinox/src/main/java/org/argeo/security/equinox/CurrentUser.java new file mode 100644 index 000000000..d89ddee5a --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.equinox/src/main/java/org/argeo/security/equinox/CurrentUser.java @@ -0,0 +1,64 @@ +package org.argeo.security.equinox; + +import java.security.Principal; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +import javax.security.auth.Subject; + +import org.eclipse.equinox.security.auth.ILoginContext; +import org.eclipse.equinox.security.auth.LoginContextFactory; +import org.springframework.security.Authentication; +import org.springframework.security.GrantedAuthority; + +public class CurrentUser { + public final static String getUsername() { + Subject subject = getSubject(); + if (subject == null) + return null; + Principal principal = subject.getPrincipals().iterator().next(); + return principal.getName(); + + } + + public final static Set roles() { + Principal principal = getSubject().getPrincipals().iterator().next(); + Authentication authentication = (Authentication) principal; + Set roles = Collections.synchronizedSet(new HashSet()); + for (GrantedAuthority ga : authentication.getAuthorities()) { + roles.add(ga.getAuthority()); + } + return Collections.unmodifiableSet(roles); + } + + private final static ILoginContext getLoginContext() { + return EquinoxSecurity.getLoginContext(); +// return LoginContextFactory +// .createContext(EquinoxSecurity.CONTEXT_SPRING); + } + + // private static void login() { + // try { + // getLoginContext().login(); + // } catch (LoginException e) { + // throw new RuntimeException("Cannot login", e); + // } + // } + + public final static Subject getSubject() { + + Subject subject = null; + // subject = Subject.getSubject(AccessController.getContext()); + try { + getLoginContext().login(); + subject = getLoginContext().getSubject(); + } catch (Exception e) { + throw new RuntimeException("Cannot retrieve subject", e); + } + + return subject; + + } + +} diff --git a/security/eclipse/plugins/org.argeo.security.equinox/src/main/java/org/argeo/security/equinox/EquinoxSecurity.java b/security/eclipse/plugins/org.argeo.security.equinox/src/main/java/org/argeo/security/equinox/EquinoxSecurity.java new file mode 100644 index 000000000..e1a72b14f --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.equinox/src/main/java/org/argeo/security/equinox/EquinoxSecurity.java @@ -0,0 +1,38 @@ +package org.argeo.security.equinox; + +import java.net.URL; + +import org.eclipse.equinox.security.auth.ILoginContext; +import org.eclipse.equinox.security.auth.LoginContextFactory; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +public class EquinoxSecurity implements BundleActivator { + public final static String CONTEXT_SPRING = "SPRING"; + private static final String JAAS_CONFIG_FILE = "jaas/jaas_default.txt"; + + private static BundleContext bundleContext; + + public void start(BundleContext context) throws Exception { + bundleContext = context; + // URL url = new URL( + // "file:////home/mbaudier/dev/src/commons/security/eclipse/plugins/org.argeo.security.ui.rcp/jaas_config.txt"); + // // URL url = new URL( + // // + // "file:////home/mbaudier/dev/src/commons/security/eclipse/plugins/org.argeo.security.ui.rcp/jaas_config.txt"); + // ILoginContext secureContext = LoginContextFactory.createContext( + // configName, url); + getLoginContext(); + } + + public void stop(BundleContext context) throws Exception { + bundleContext = null; + } + + static ILoginContext getLoginContext() { + String configName = CONTEXT_SPRING; + URL configUrl = bundleContext.getBundle().getEntry(JAAS_CONFIG_FILE); + return LoginContextFactory.createContext(configName, configUrl); + } + +} diff --git a/security/eclipse/plugins/org.argeo.security.equinox/src/main/java/org/argeo/security/equinox/SpringLoginModule.java b/security/eclipse/plugins/org.argeo.security.equinox/src/main/java/org/argeo/security/equinox/SpringLoginModule.java new file mode 100644 index 000000000..4f8641c26 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.equinox/src/main/java/org/argeo/security/equinox/SpringLoginModule.java @@ -0,0 +1,113 @@ +package org.argeo.security.equinox; + +import java.util.Map; + +import javax.security.auth.Subject; +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.NameCallback; +import javax.security.auth.callback.PasswordCallback; +import javax.security.auth.callback.TextOutputCallback; +import javax.security.auth.login.LoginException; + +import org.springframework.security.Authentication; +import org.springframework.security.AuthenticationException; +import org.springframework.security.AuthenticationManager; +import org.springframework.security.BadCredentialsException; +import org.springframework.security.context.SecurityContextHolder; +import org.springframework.security.providers.UsernamePasswordAuthenticationToken; +import org.springframework.security.providers.jaas.SecurityContextLoginModule; + +public class SpringLoginModule extends SecurityContextLoginModule { + private AuthenticationManager authenticationManager; + private Subject subject; + + private CallbackHandler callbackHandler; + + public SpringLoginModule() { + + } + + @SuppressWarnings("rawtypes") + public void initialize(Subject subject, CallbackHandler callbackHandler, + Map sharedState, Map options) { + super.initialize(subject, callbackHandler, sharedState, options); + this.subject = subject; + this.callbackHandler = callbackHandler; + } + + public boolean login() throws LoginException { + // thread already logged in + if (SecurityContextHolder.getContext().getAuthentication() != null) + return super.login(); + + if (subject.getPrincipals(Authentication.class).size() == 1) { + registerAuthentication(subject.getPrincipals(Authentication.class) + .iterator().next()); + return super.login(); + } else if (subject.getPrincipals(Authentication.class).size() > 1) { + throw new LoginException( + "Multiple Authentication principals not supported: " + + subject.getPrincipals(Authentication.class)); + } else { + // ask for username and password + Callback label = new TextOutputCallback( + TextOutputCallback.INFORMATION, "Required login"); + NameCallback nameCallback = new NameCallback("User"); + PasswordCallback passwordCallback = new PasswordCallback( + "Password", false); + + if (callbackHandler == null) { + // throw new LoginException("No call back handler available"); + return false; + } + try { + callbackHandler.handle(new Callback[] { label, nameCallback, + passwordCallback }); + } catch (Exception e) { + LoginException le = new LoginException( + "Callback handling failed"); + le.initCause(e); + throw le; + } + + // Set user name and password + String username = nameCallback.getName(); + String password = ""; + if (passwordCallback.getPassword() != null) { + password = String.valueOf(passwordCallback.getPassword()); + } + UsernamePasswordAuthenticationToken credentials = new UsernamePasswordAuthenticationToken( + username, password); + + try { + Authentication authentication = authenticationManager + .authenticate(credentials); + registerAuthentication(authentication); + return super.login(); + } catch (Exception e) { + LoginException loginException = new LoginException( + "Bad credentials"); + loginException.initCause(e); + throw loginException; + } + } + } + + /** + * Register an {@link Authentication} in the security context. + * + * @param authentication + * has to implement {@link Authentication}. + */ + protected void registerAuthentication(Object authentication) { + SecurityContextHolder.getContext().setAuthentication( + (Authentication) authentication); + } + + public void setAuthenticationManager( + AuthenticationManager authenticationManager) { + this.authenticationManager = authenticationManager; + } + +} diff --git a/security/eclipse/plugins/org.argeo.security.ui.rap/org.argeo.security.ui.rap-maven.target b/security/eclipse/plugins/org.argeo.security.ui.rap/org.argeo.security.ui.rap-maven.target new file mode 100644 index 000000000..9b9a29794 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rap/org.argeo.security.ui.rap-maven.target @@ -0,0 +1,420 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/security/eclipse/plugins/org.argeo.security.ui.rap/pom.xml b/security/eclipse/plugins/org.argeo.security.ui.rap/pom.xml new file mode 100644 index 000000000..1cbb1a457 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rap/pom.xml @@ -0,0 +1,82 @@ + + 4.0.0 + + org.argeo.commons.security + 0.2.2-SNAPSHOT + plugins + .. + + org.argeo.security.ui.rap + Commons Security UI RAP + jar + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + org.argeo.maven.plugins + maven-argeo-osgi-plugin + + + resolve-pde-sources + + pde-sources + + generate-resources + + + generate-descriptors + + descriptors + + generate-resources + + + check-osgi + test + + equinox + + + true + + -clean + + + + + + + + + + org.argeo.commons.security + org.argeo.security.ui.rcp + 0.2.2-SNAPSHOT + pom + + + org.argeo.commons.eclipse + org.argeo.eclipse.dep.rcp + + + + + + org.argeo.commons.eclipse + org.argeo.eclipse.dep.rap + 0.2.2-SNAPSHOT + + + diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/.classpath b/security/eclipse/plugins/org.argeo.security.ui.rcp/.classpath new file mode 100644 index 000000000..92f19d2ff --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rcp/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/.project b/security/eclipse/plugins/org.argeo.security.ui.rcp/.project new file mode 100644 index 000000000..feeafcf5b --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rcp/.project @@ -0,0 +1,28 @@ + + + org.argeo.security.ui.rcp + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/.settings/org.eclipse.jdt.core.prefs b/security/eclipse/plugins/org.argeo.security.ui.rcp/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..1f382cb9d --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rcp/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +#Sat Jan 15 17:51:30 CET 2011 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/SecureRCP.product b/security/eclipse/plugins/org.argeo.security.ui.rcp/SecureRCP.product new file mode 100644 index 000000000..f64b05182 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rcp/SecureRCP.product @@ -0,0 +1,122 @@ + + + + + + + + + + -console -clean + -Dlog4j.configuration=file:/home/mbaudier/dev/src/commons/security/eclipse/plugins/org.argeo.security.ui.rcp/log4j.properties + -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/argeo_security_rap.properties b/security/eclipse/plugins/org.argeo.security.ui.rcp/argeo_security_rap.properties new file mode 100644 index 000000000..355774942 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rcp/argeo_security_rap.properties @@ -0,0 +1,24 @@ +argeo.osgi.start=\ +com.springsource.javax.servlet,\ +org.eclipse.core.runtime,\ +org.eclipse.equinox.common,\ +org.eclipse.equinox.http.jetty,\ +org.eclipse.equinox.http.registry,\ +org.eclipse.equinox.launcher,\ +org.eclipse.rap.demo,\ +org.mortbay.jetty.server,\ +org.springframework.osgi.extender,\ +org.argeo.server.ads.server,\ +org.argeo.security.manager.ldap,\ +org.argeo.security.services,\ +org.argeo.security.equinox,\ +org.argeo.security.ui,\ +org.argeo.security.ui.rcp,\ + +eclipse.ignoreApp=true +osgi.noShutdown=true + +log4j.configuration=file:../../log4j.properties + +org.eclipse.equinox.http.jetty.log.stderr.threshold=debug +org.osgi.service.http.port=9090 diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/build.properties b/security/eclipse/plugins/org.argeo.security.ui.rcp/build.properties new file mode 100644 index 000000000..ac478ab24 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rcp/build.properties @@ -0,0 +1,7 @@ +source.. = src/main/java/ +output.. = target/classes/ +bin.includes = plugin.xml,\ + META-INF/,\ + .,\ + log4j.properties,\ + jaas_config.txt diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/icons/alt_about.gif b/security/eclipse/plugins/org.argeo.security.ui.rcp/icons/alt_about.gif new file mode 100644 index 0000000000000000000000000000000000000000..20d9ad2d98dbd6820da5adbd9a1728153d3ff0c2 GIT binary patch literal 9340 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 literal 0 HcmV?d00001 diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/icons/alt_launcher.icns b/security/eclipse/plugins/org.argeo.security.ui.rcp/icons/alt_launcher.icns new file mode 100644 index 0000000000000000000000000000000000000000..b77a6a63938e43ee977646573dbd9a45fd1983af GIT binary patch literal 51159 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

N=U55wS;a{OH*SV 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 Mpnv}UzqP>s0IH1_y#N3J literal 0 HcmV?d00001 diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/icons/alt_launcher.xpm b/security/eclipse/plugins/org.argeo.security.ui.rcp/icons/alt_launcher.xpm new file mode 100644 index 000000000..b0c139e06 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rcp/icons/alt_launcher.xpm @@ -0,0 +1,307 @@ +/* XPM */ +static char * icon48_xpm[] = { +"48 48 256 2", +" c #4B4B3B3B9090", +". c #0D0D0E0E5454", +"X c #11110E0E5B5B", +"o c #17170F0F6363", +"O c #1D1D13136969", +"+ c #212114146C6C", +"@ c #252514147171", +"# c #282811116C6C", +"$ c #26260D0D6363", +"% c #22220B0B5E5E", +"& c #1C1C0B0B5A5A", +"* c #1C1C0B0B5252", +"= c #1B1B05055353", +"- c #161606064D4D", +"; c #161605054949", +": c #111104044848", +"> c #131304044545", +", c #131305054242", +"< c #141410105E5E", +"1 c #2C2C15157373", +"2 c #2B2B1B1B7575", +"3 c #343416167272", +"4 c #313113136E6E", +"5 c #222209095757", +"6 c #1B1B06064D4D", +"7 c #15150B0B4242", +"8 c #13130C0C5555", +"9 c #2E2E1B1B7878", +"0 c #33331F1F7C7C", +"q c #343418187878", +"w c #3B3B1C1C7575", +"e c #2E2E10106767", +"r c #1B1B07074747", +"t c #18180B0B4646", +"y c #151513136262", +"u c #1A1A15156464", +"i c #34341F1F7777", +"p c #40401E1E8080", +"a c #42421B1B7A7A", +"s c #3B3B15157474", +"d c #2B2B0B0B5B5B", +"f c #222207075252", +"g c #373727277A7A", +"h c #474724248484", +"j c #393915156E6E", +"k c #373711116A6A", +"l c #343413136363", +"z c #232319196E6E", +"x c #292919197070", +"c c #3C3C2C2C8282", +"v c #444431318585", +"b c #494934348A8A", +"n c #505026268A8A", +"m c #3D3D1B1B6E6E", +"M c #31310E0E5C5C", +"N c #2B2B0D0D5353", +"B c #222207074A4A", +"V c #52523C3C9292", +"C c #58583C3C9494", +"Z c #5D5D44449797", +"A c #5C5C2E2E9292", +"S c #676733339595", +"D c #424228287575", +"F c #29290A0A4F4F", +"G c #6C6C4A4A9E9E", +"H c #72725454A7A7", +"J c #8C8C6D6DB2B2", +"K c #343424246E6E", +"L c #3A3A23236A6A", +"P c #3A3A1C1C6767", +"I c #24240A0A4B4B", +"U c #151518186161", +"Y c #76766F6FA5A5", +"T c #ADAD9191CCCC", +"R c #98988989D3D3", +"E c #45453B3B8686", +"W c #3C3C35357979", +"Q c #363631317575", +"! c #32322D2D6B6B", +"~ c #323229296363", +"^ c #30301F1F6262", +"/ c #323218185E5E", +"( c #272707074B4B", +") c #202028286C6C", +"_ c #1E1E1D1D6868", +"` c #9A9A8282BBBB", +"' c #C8C8B3B3D3D3", +"] c #B3B3AFAFE7E7", +"[ c #84847272C6C6", +"{ c #58585757A3A3", +"} c #3F3F3C3C8A8A", +"| c #3B3B3A3A8484", +" . c #414139397D7D", +".. c #3D3D39397A7A", +"X. c #37372E2E6E6E", +"o. c #2C2C21215A5A", +"O. c #2E2E1B1B5B5B", +"+. c #F5F5EFEFF5F5", +"@. c #656566669A9A", +"#. c #47474B4B8E8E", +"$. c #3C3C44447B7B", +"%. c #444442428080", +"&. c #45453E3E8181", +"*. c #40403C3C8181", +"=. c #3D3D33337474", +"-. c #3B3B30306E6E", +";. c #38382D2D6969", +":. c #303026265D5D", +">. c #2C2C15155A5A", +",. c #1F1F1C1C7070", +"<. c #25251E1E7171", +"1. c #59595C5C9191", +"2. c #4D4D53538989", +"3. c #4C4C49498484", +"4. c #484845458585", +"5. c #494941418585", +"6. c #494940408181", +"7. c #2F2F1C1C5353", +"8. c #2B2B28287676", +"9. c #323231317F7F", +"0. c #545452528B8B", +"q. c #51514E4E8989", +"w. c #4E4E4B4B8C8C", +"e. c #4C4C47478686", +"r. c #46463D3D7E7E", +"t. c #434336367A7A", +"y. c #2B2B13135555", +"u. c #47473D3D8D8D", +"i. c #575757578E8E", +"p. c #48483E3E7F7F", +"a. c #46463A3A7D7D", +"s. c #424235357575", +"d. c #404034347171", +"f. c #BFBFCBCBFAFA", +"g. c #B8B8A8A8DDDD", +"h. c #5E5E60609292", +"j. c #565655558C8C", +"k. c #4B4B44448282", +"l. c #454539397B7B", +"z. c #434338387878", +"x. c #3F3F32326D6D", +"c. c #3D3D30306969", +"v. c #3A3A2E2E6363", +"b. c #36362A2A5C5C", +"n. c #343424245555", +"m. c #30301E1E4D4D", +"M. c #49493C3C8282", +"N. c #5E5E4F4F8C8C", +"B. c #56563B3B8B8B", +"V. c #545407078585", +"C. c #424234347272", +"Z. c #9797A4A4F7F7", +"A. c #444436367676", +"S. c #7D7D7979D5D5", +"D. c #464640408A8A", +"F. c #44444B4B8282", +"G. c #414107077777", +"H. c #71716161C1C1", +"J. c #303039397979", +"K. c #8E8E8E8EE6E6", +"L. c #404033338B8B", +"P. c #4A4A45458C8C", +"I. c #46463A3A8080", +"U. c #363629295454", +"Y. c #303022224848", +"T. c #424237377575", +"R. c #2E2E1D1D6363", +"E. c #79798383EAEA", +"W. c #74747B7BE4E4", +"Q. c #6D6D7676D6D6", +"!. c #6A6A7171CECE", +"~. c #66666969C6C6", +"^. c #62626565BCBC", +"/. c #5F5F6060B5B5", +"(. c #5B5B5B5BACAC", +"). c #535353539898", +"_. c #4F4F4F4FA4A4", +"`. c #54544D4DA4A4", +"'. c #323204046B6B", +"]. c #303035357979", +"[. c #313122224343", +"{. c #5A5A5B5BB7B7", +"}. c #484846468080", +"|. c #454541417575", +" X c #4B4B31318282", +".X c #47473C3C8484", +"XX c #3E3E35356E6E", +"oX c #2F2F26264040", +"OX c #2B2B23233A3A", +"+X c #262619195C5C", +"@X c #252515155A5A", +"#X c #55555151B3B3", +"$X c #3C3C2D2D5D5D", +"%X c #39392F2F5656", +"&X c #37372D2D5050", +"*X c #25251F1F3030", +"=X c #24241D1D4343", +"-X c #202013135656", +";X c #41413B3B6C6C", +":X c #444442429696", +">X c #212100005E5E", +",X c #444436367272", +" > , , , ", +" . . X X < < o o O O + @ 1 2 2 1 1 1 1 1 1 1 1 3 4 # # $ $ $ % % % 5 = = 6 6 - ; ; > > , , 7 ", +" . 8 < < < o O O + @ @ 2 9 9 0 0 q q q q q q q w 3 4 4 e e $ $ $ $ % 5 = = 6 6 6 ; ; > > r t ", +" . X < y u O O + @ 1 2 i 0 0 p p p p p p p a a p a s 3 4 4 e e e e d 5 5 f f 6 6 6 ; ; r r t ", +" X < y u O + + @ 2 9 0 g p p h h h h h h h p h h a a s s j k k j l d d 5 5 f f 6 6 r r r r r ", +" X < y O z x x 9 0 g c v b n n n n n n n n n n n h a a s s j j m l M d d N f f B B B B r r r ", +" < y u + z 2 0 c c b V C Z C C A A A A A S S S n h D w w m m m m k l M d d N f F F F B r r r ", +" < y O z z 9 c b V Z G H H H G S G G J J H V v c g g K K K K L P l l l M M N N N N I B B r r ", +" U u + z x i v C H Y J J J J H J T R H V E W W Q Q Q Q ! ! ! ~ ^ ^ / / M M M M M N ( B B r r ", +" ) _ z x 9 g b Z Y ` ' ' ' T T ] [ { } | .........W W Q Q X.! ~ ~ o.O./ / / / N F ( B B B r ", +" ) ) z x i c V G J ' +.+.+.+.] [ @.#.$.%.%.%.&.*. . .....W =.-.X.;.~ :.o.O.^ >.N F ( B B B B ", +" ) ,.<.2 g v C H J ' +.+.+.+.T Y 1.2.3.4.4.4.5.6.&.&. . ...W =.=.-.;.~ :.o.7.>.N F F ( B I I ", +" ) ,.<.8.9.b C H J T +.+.+.' J @.1.0.q.q.w.e.4.5.6.&.r. . .t.W =.=.-.;.~ :.o.7.y.N F ( ( I I ", +" 8.8.8.9.| u.C G J T +.+.' ` Y @.1.i.0.q.q.e.e.5.6.p.r.a. .t.t.s.d.d.-.;.~ :.7.7.y.F F ( I I ", +" 9.c c c v b A S H ' f.g.` Y @.h.1.i.j.0.q.q.e.k.6.p.r.a.l.t.z.s.s.d.x.c.v.b.n.m.7.N F F F I ", +" <.g M.N.B.B.n V.J f.R J @.h.h.1.i.i.j.j.0.q.3.k.6.p.r.a.l.l.z.s.C.d.x.x.c.v.b.n.m.y.N F F F ", +" + x i v B.Z Z G g.Z.[ @.2.i.i.j.j.j.j.j.0.q.3.k.6.p.p.a.l.l.A.s.C.C.d.x.c.v.b.n.m.7.y.N N y. ", +" O # 3 w p n Z ` f.S.H D.F.q.0.0.0.0.j.0.q.q.3.k.6.p.r.a.a.l.A.s.s.C.d.x.x.c.v.b.n.m.y.y.y.y. ", +" O # 4 s a G.V.T Z.H.V J.%.e.w.q.0.0.0.0.q.q.e.k.6.p.r.a.a.l.z.A.s.C.d.d.x.c.v.b.n.m.7.>.y.y. ", +" O # 4 s w G.A f.K.H L...4.P.w.w.w.q.q.q.q.e.e.5.6.M.I.I.a.a.l.z.A.s.d.d.x.c.v.v.U.Y.7.O.>.y. ", +" $ # 4 3 s G.G f.S.Z 9.*.D.P.P.w.w.w.w.w.e.e.5.5.M.M.I.I.a.a.l.z.T.s.d.d.x.x.c.v.U.Y.m.R.>.>. ", +" E.E.W.W.W.W.E.Z.E.W.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.!.!.!.!.!.~.~.~.~.~.~.^.^.^.^.^./././.(.{ { )._.`._. ", +" + # 3 w s '.` f.H.V ].*.D.P.P.P.P.P.P.P.5.5.5.M.M.M.I.I.a.l.z.z.T.T.s.d.d.x.c.v.U.Y.[.^ O.>. ", +" ~.~.~.~.~.~.K.Z.S.~.{.^.^.^.^.^.^.^.^././././././.(.(.(.(.(.(.{ { { { { ).).).w.w.}.|.P.u.} ", +" .I.6. X X XT f.H.b ].*.E D.D.D.D.5.5..X.XM.M.I.I.a.a.l.l.z.z.T.T.T.d.XXx.c.v.b.U.oXOXR.+X@X ", +" E.E.E.W.W.W.K.Z.E.W.Q.Q.Q.Q.Q.Q.Q.Q.!.!.!.!.!.!.~.~.~.~.~.~.^.^.^.^.^./././.(.{ { ).).#X_._. ", +" & % $ e '.= H f.H.b 8.W *.E E E .X.X.XI.I.I.I.a.a.l.l.z.z.T.T.T.C.XXXXc.v.$X%X&XY.*X=X2 @X-X ", +" {.{.{.{.{.#X~.Z.W.~.{.{./././././././././.(.(.(.(.(.(.(.{ { { { { { ).).).w.w.3.}.;X%.:X} } ", +" & & % $ e >XV.f.S.C K X.W t. . .l.l.t.t.t.t.A.A.A.,X,X,X,X,XX7X` Z.Z D ! =.=.s.t.t.t.A.A.s.A.,X,X,X,X > > t t t cX ", +" nXbXbXzXzXlXaXXXY +Xf = f = 7XtXR R mXn.Y.[.[.[.[.OX*X*X8X5X*X=X,.u vXvX; > > MXMX, 7 t t ", +" nXnXnXbXzXvX-.Y +XcX6 6 = = = d L B.G H `.X.:.7.m.=X=X=X=X=X6X,.u cXvXNX: BX> MXVXCXVX7 7 7 ", +" ZXZXnXbXAXgX@.+XvX; - - - - * @XR.>.sX>.R.i 0 x eXeXeXeXO hXaXcXvXNX: BXMXMXMXVXCXCXCXVX7 7 ", +" SXZXZXAXgXN.aXNX: : NXNXNX- * +X+X* 6 6 6 * * * * * * * vXvX- NX: DXBXMXMXFXCXCXCXCXGXVXVX7 ", +" SXSXHXgX0.JXKXLXKXKXDX: : NX* @X-X- - - - - - - - - - - NX: DXDXDXMXMXFXFXCXCXCXCXGXGXGXVXVX ", +" SXHXPX3.JXnXnXnXnXbXLXKXKXNXaX-XvX: : NX: : : : : : : BXDXDXLXMXMXFXFXCXCXCXCXGXGXGXGXGXGXGX ", +" IXUX$.AXZXZXZXZXnXnXnXLXLXNXJXvXBXDXBXBXBXBXDXDXDXDXLXDXLXLXFXFXFXFXCXCXCXCXGXGXGXGXGXGXGXGX ", +" "}; diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/icons/alt_window_16.gif b/security/eclipse/plugins/org.argeo.security.ui.rcp/icons/alt_window_16.gif new file mode 100644 index 0000000000000000000000000000000000000000..05626b17d8133fb8d4644b1d6fef71b5464a83ec GIT binary patch literal 637 zcmV-@0)qWVNk%w1VGsZi0OkMyi-8)}*O-2lP0Hw}F;@yymoek*x!Lop&FGr*^SR~k zs^;O9;p?WSqgKtvhMApMhF*N^?6&X&9pLg?DBG(C(ez;g!PXhs))Rw8MzH&4Z(_ zXvf!@hj|a@|9{HUwg3O)o~~}>@~^JReYVZIH1tGelN zk%v8>nmw<;lBk_yvbu)E--D*OeB8x>j*3>k(uk0bLzTd1hNNNJ=CYr@WM^3dMPxF! zzph4nBvxlHz`%CY-G9r{sL|c0ptWPh!<4SPZ@9Bvy2FG2|H;$mn~9BNUw$#w=Y!bc zgtn}6%i@6G^tH9ZgW}z-$IYnz|B<@Hh`+RXy1~Awt!2U5leENdA^8LV00000EC2ui z01yBW000NtfPaF6goT0uIU{mqadcHX2yRVIXMzhO7(q`I6h}HJI0pwxmKbPYVl@J4 zDm{J(2S|cfc{Cdv4KaNy8g_n31A=5;1shmX4-f6x{Jf>7ZWJ08yT*#Oz=YiBkILwmjfEnosaBAPDf9ls zyvdZd!-~Sos+W>G-s`Nk{FBSui~9V#l#Mgv?ySDMe7VAbsjYFcx_8&zi?qIfzR97t z#FCqrMWLNf&E=%y`n1>coVmr8xaEKH{mbL}t&D;gy~&Qj%#~z(LzA{)#N~zP^|R~m zp}otUtJHMC;*HGdj_LHdqq%0d+j+ajo586>NW&Zue=J&Va z_qWdQp*=VauEA}uv~jPtc+cjr?)$_4|H+n~Sk~>BfR;|v}n2Rhi`F=4Oay#WC( zz<`mgpCCAqiV)E;p<@9xCQK|?u;RoC1{4_NfH;66xr-`97}&wFV-*P~5+pD)vg8R0 zI93LL@noC>K`K;O`4g|B4lhV>>g2hiWCx%^T^{{orJ4a655`o18dWM!k`*dk<&Yyl zfG5fS1RaQShe(_;Sx`vWyEms9sw>oDh4>bLpfy5xfE`1`gkHXW0jpj6!!3+1hlRY6 zQy_~06J=0{7QHhC$-sg+aIlQ|&yCj@I%Akk8-s@1w@K(G@u9a17cX99$UG;+7%U7@ zlv%#~uj#6&*RB>2ppBs0bz)=quzPp!?;n2u4lX=Hp5cE)h!8^KID-=@;>$l>HEo9u zEsU@TAYhAi*RXY_!ECq{*d1@a0TQou6B7<7n0fl1KSm)2x0%)o*NS_pu^79a?c zi406UP(TnUnRKCj_u;1@haNhyM2LS(vBn8V+%d);0pLIZ1uX`dp?)5CAb^J;(kQ|I zO&6rWMFAHKfP;@MwvgcrL>d{R5+KlMf)rB#V8eqMJTZW399TI6mRTN&00K)uQ9=oV zj6lE?NdPc{4UC;JKn`ef@B<4QcIY7jTsF`EoqsUV$rLsKus{?aoe{tQKV-V0mT$rd z#SlFxTBoA~G~mSmU&O#h6&*O?mRoMV=|mHsf-*z{b&fDX4^<2hfeki9pa&ONoDhH$ z$Rgl`5=xXX1OyR83&9Y%G9keL8+1ZI5?#aq01O8-A+8@KG|&UI(QdE-8ln901s{1V z@dXp4mH#SB%I7#TXkB G2mm{gq(mG5 literal 0 HcmV?d00001 diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/log4j.properties b/security/eclipse/plugins/org.argeo.security.ui.rcp/log4j.properties new file mode 100644 index 000000000..8a89a4aa3 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rcp/log4j.properties @@ -0,0 +1,24 @@ +log4j.rootLogger=WARN, console + +## Levels +log4j.logger.org.argeo=DEBUG +log4j.logger.org.springframework.security=DEBUG + +log4j.logger.org.apache.catalina=INFO +log4j.logger.org.apache.coyote=INFO +log4j.logger.org.apache.tomcat=INFO + +log4j.logger.org.apache.directory.server=INFO +log4j.logger.org.apache.directory.server.core.partition=ERROR +log4j.logger.org.apache.directory.server.core.schema.bootstrap.BootstrapAttributeTypeRegistry=ERROR + +log4j.logger.org.apache.jackrabbit=WARN +log4j.logger.org.apache.jackrabbit.core.query.lucene=ERROR + +## Appenders +# console is set to be a ConsoleAppender. +log4j.appender.console=org.apache.log4j.ConsoleAppender + +# console uses PatternLayout. +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c - [%t]%n diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/plugin.xml b/security/eclipse/plugins/org.argeo.security.ui.rcp/plugin.xml new file mode 100644 index 000000000..b1829e6f0 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rcp/plugin.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/pom.xml b/security/eclipse/plugins/org.argeo.security.ui.rcp/pom.xml new file mode 100644 index 000000000..f711c69ab --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rcp/pom.xml @@ -0,0 +1,159 @@ + + 4.0.0 + + org.argeo.commons.security + 0.2.2-SNAPSHOT + plugins + .. + + org.argeo.security.ui.rcp + Commons Security UI RCP + jar + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + org.apache.felix + maven-bundle-plugin + ${version.maven-bundle-plugin} + + + lazy + org.eclipse.ui;resolution:=optional,org.eclipse.rap.ui;resolution:=optional,org.eclipse.core.runtime + * + + + + + org.argeo.maven.plugins + maven-argeo-osgi-plugin + + + resolve-pde-sources + + pde-sources + + generate-resources + + + generate-descriptors + + descriptors + + generate-resources + + + check-osgi + test + + equinox + + + true + + -clean + + + + + + + + + + + org.argeo.commons.security + org.argeo.security.equinox + 0.2.2-SNAPSHOT + + + org.argeo.commons.security + org.argeo.security.ui + 0.2.2-SNAPSHOT + + + org.argeo.commons.server + org.argeo.server.dep.ads + 0.2.2-SNAPSHOT + pom + + + org.argeo.commons.server + org.argeo.server.ads.server + 0.2.2-SNAPSHOT + + + org.argeo.commons.security + org.argeo.security.services + 0.2.2-SNAPSHOT + + + org.argeo.commons.security + org.argeo.security.manager.ldap + 0.2.2-SNAPSHOT + + + org.argeo.commons.server + org.argeo.server.ads + 0.2.2-SNAPSHOT + + + org.argeo.dep.osgi + org.argeo.dep.osgi.springframework.ldap + + + + + org.argeo.commons.eclipse + org.argeo.eclipse.dep.rcp + 0.2.2-SNAPSHOT + + + + + org.argeo.commons.server + org.argeo.server.json + 0.2.2-SNAPSHOT + + + + + org.eclipse.ui + org.eclipse.ui + provided + + + + + org.argeo.commons.basic + org.argeo.basic.nodeps + 0.2.2-SNAPSHOT + + + + + + org.slf4j + com.springsource.slf4j.org.apache.commons.logging + + + + org.argeo.commons.basic + org.argeo.basic.dep.log4j + 0.2.2-SNAPSHOT + pom + + + diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/RapSecureWorkbenchWindowAdvisor.java b/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/RapSecureWorkbenchWindowAdvisor.java new file mode 100644 index 000000000..616858a02 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/RapSecureWorkbenchWindowAdvisor.java @@ -0,0 +1,31 @@ +package org.argeo.security.ui.rcp; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.application.IWorkbenchWindowConfigurer; + +public class RapSecureWorkbenchWindowAdvisor extends + SecureWorkbenchWindowAdvisor { + + public RapSecureWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { + super(configurer); + } + + public void preWindowOpen() { + IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); +// configurer.setInitialSize(new Point(800, 600)); + configurer.setShowCoolBar(false); + configurer.setShowMenuBar(true); + configurer.setShowStatusLine(true); + configurer.setShowPerspectiveBar(true); + configurer.setTitle("Argeo Secure UI"); //$NON-NLS-1$ + // Full screen, see + // http://dev.eclipse.org/newslists/news.eclipse.technology.rap/msg02697.html +// configurer.setShellStyle(SWT.NONE); +// Rectangle bounds = Display.getDefault().getBounds(); +// configurer.setInitialSize(new Point(bounds.width, bounds.height)); + } + +} diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureActionBarAdvisor.java b/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureActionBarAdvisor.java new file mode 100644 index 000000000..d5978888f --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureActionBarAdvisor.java @@ -0,0 +1,63 @@ +package org.argeo.security.ui.rcp; + +import org.eclipse.jface.action.GroupMarker; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.ui.IWorkbenchActionConstants; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.actions.ActionFactory; +import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction; +import org.eclipse.ui.application.ActionBarAdvisor; +import org.eclipse.ui.application.IActionBarConfigurer; + +public class SecureActionBarAdvisor extends ActionBarAdvisor { + private IWorkbenchAction exitAction; + // private IWorkbenchAction aboutAction; + private IWorkbenchAction newWindowAction; + private IWorkbenchAction preferences = null; + + public SecureActionBarAdvisor(IActionBarConfigurer configurer) { + super(configurer); + } + + protected void makeActions(IWorkbenchWindow window) { + preferences = ActionFactory.PREFERENCES.create(window); + register(preferences); + exitAction = ActionFactory.QUIT.create(window); + register(exitAction); + + // aboutAction = ActionFactory.ABOUT.create(window); + // register(aboutAction); + + newWindowAction = ActionFactory.OPEN_NEW_WINDOW.create(window); + register(newWindowAction); + } + + protected void fillMenuBar(IMenuManager menuBar) { + MenuManager fileMenu = new MenuManager("&File", + IWorkbenchActionConstants.M_FILE); + MenuManager editMenu = new MenuManager("&Edit", + IWorkbenchActionConstants.M_EDIT); + MenuManager helpMenu = new MenuManager("&Help", + IWorkbenchActionConstants.M_HELP); + + menuBar.add(fileMenu); + menuBar.add(editMenu); + // Add a group marker indicating where action set menus will appear. + menuBar.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS)); + menuBar.add(helpMenu); + + // File + fileMenu.add(newWindowAction); + fileMenu.add(new Separator()); + fileMenu.add(exitAction); + + // Edit + editMenu.add(preferences); + + // Help + // helpMenu.add(aboutAction); + } + +} diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureRap.java b/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureRap.java new file mode 100644 index 000000000..cc494485e --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureRap.java @@ -0,0 +1,103 @@ +package org.argeo.security.ui.rcp; + +import java.security.PrivilegedAction; + +import javax.security.auth.Subject; + +import org.argeo.security.equinox.CurrentUser; +import org.eclipse.equinox.app.IApplication; +import org.eclipse.equinox.app.IApplicationContext; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.application.ActionBarAdvisor; +import org.eclipse.ui.application.IActionBarConfigurer; +import org.eclipse.ui.application.IWorkbenchWindowConfigurer; +import org.eclipse.ui.application.WorkbenchAdvisor; +import org.eclipse.ui.application.WorkbenchWindowAdvisor; + +public class SecureRap implements IApplication { + public Object start(IApplicationContext context) throws Exception { + String username = CurrentUser.getUsername(); + Integer result = null; + Display display = PlatformUI.createDisplay(); + try { + result = (Integer) Subject.doAs(CurrentUser.getSubject(), + getRunAction(display)); + } catch (Exception e) { + e.printStackTrace(); + } finally { + display.dispose(); + } + return result; + } + + @SuppressWarnings("rawtypes") + private PrivilegedAction getRunAction(final Display display) { + return new PrivilegedAction() { + + public Object run() { + int result = PlatformUI.createAndRunWorkbench(display, + new ApplicationWorkbenchAdvisor()); + return new Integer(result); + } + }; + } + + public void stop() { + final IWorkbench workbench; + try { + workbench = PlatformUI.getWorkbench(); + } catch (Exception e) { + return; + } + if (workbench == null) + return; + final Display display = workbench.getDisplay(); + display.syncExec(new Runnable() { + + public void run() { + if (!display.isDisposed()) + workbench.close(); + } + }); + } + + class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor { + + private static final String PERSPECTIVE_ID = "org.argeo.security.ui.securityPerspective"; + + public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor( + IWorkbenchWindowConfigurer configurer) { + return new ApplicationWorkbenchWindowAdvisor(configurer); + } + + public String getInitialWindowPerspectiveId() { + return PERSPECTIVE_ID; + } + } + + class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { + + public ApplicationWorkbenchWindowAdvisor( + IWorkbenchWindowConfigurer configurer) { + super(configurer); + } + + public ActionBarAdvisor createActionBarAdvisor( + IActionBarConfigurer configurer) { + return new ActionBarAdvisor(configurer); + } + + public void preWindowOpen() { + IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); + configurer.setInitialSize(new Point(500, 300)); + configurer.setShowCoolBar(false); + configurer.setShowMenuBar(false); + configurer.setShowStatusLine(false); + configurer.setTitle("Equinox Security on RAP"); + } + } + +} diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureRcp.java b/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureRcp.java new file mode 100644 index 000000000..47a535984 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureRcp.java @@ -0,0 +1,70 @@ +package org.argeo.security.ui.rcp; + +import java.security.PrivilegedAction; + +import javax.security.auth.Subject; + +import org.argeo.security.equinox.CurrentUser; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.equinox.app.IApplication; +import org.eclipse.equinox.app.IApplicationContext; +import org.eclipse.jface.dialogs.ErrorDialog; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.PlatformUI; + +public class SecureRcp implements IApplication { + public Object start(IApplicationContext context) throws Exception { + String username = CurrentUser.getUsername(); + Integer returnCode = null; + Display display = PlatformUI.createDisplay(); + try { + returnCode = (Integer) Subject.doAs(CurrentUser.getSubject(), + getRunAction(display)); + if (returnCode == PlatformUI.RETURN_RESTART) + return IApplication.EXIT_RESTART; + else + return IApplication.EXIT_OK; + } catch (Exception e) { + // e.printStackTrace(); + IStatus status = new Status(IStatus.ERROR, + "org.eclipse.rap.security.demo", "Login failed", e); + ErrorDialog.openError(null, "Error", "Login failed", status); + } finally { + display.dispose(); + } + return returnCode; + } + + private PrivilegedAction getRunAction(final Display display) { + return new PrivilegedAction() { + + public Object run() { + int result = PlatformUI.createAndRunWorkbench(display, + new SecureWorkbenchAdvisor()); + return new Integer(result); + } + }; + } + + public void stop() { + final IWorkbench workbench; + try { + workbench = PlatformUI.getWorkbench(); + } catch (Exception e) { + return; + } + if (workbench == null) + return; + final Display display = workbench.getDisplay(); + display.syncExec(new Runnable() { + + public void run() { + if (!display.isDisposed()) + workbench.close(); + } + }); + } + +} diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureWorkbenchAdvisor.java b/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureWorkbenchAdvisor.java new file mode 100644 index 000000000..d39bf84d6 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureWorkbenchAdvisor.java @@ -0,0 +1,18 @@ +package org.argeo.security.ui.rcp; + +import org.eclipse.ui.application.IWorkbenchWindowConfigurer; +import org.eclipse.ui.application.WorkbenchAdvisor; +import org.eclipse.ui.application.WorkbenchWindowAdvisor; + +public class SecureWorkbenchAdvisor extends WorkbenchAdvisor { + + static final String PERSPECTIVE_ID = "org.argeo.security.ui.securityPerspective"; //$NON-NLS-1$ + + public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { + return new SecureWorkbenchWindowAdvisor(configurer); + } + + public String getInitialWindowPerspectiveId() { + return PERSPECTIVE_ID; + } +} diff --git a/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureWorkbenchWindowAdvisor.java b/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureWorkbenchWindowAdvisor.java new file mode 100644 index 000000000..146ac8f10 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui.rcp/src/main/java/org/argeo/security/ui/rcp/SecureWorkbenchWindowAdvisor.java @@ -0,0 +1,30 @@ +package org.argeo.security.ui.rcp; + +import org.eclipse.swt.graphics.Point; +import org.eclipse.ui.application.ActionBarAdvisor; +import org.eclipse.ui.application.IActionBarConfigurer; +import org.eclipse.ui.application.IWorkbenchWindowConfigurer; +import org.eclipse.ui.application.WorkbenchWindowAdvisor; + +public class SecureWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor { + + public SecureWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { + super(configurer); + } + + public ActionBarAdvisor createActionBarAdvisor( + IActionBarConfigurer configurer) { + return new SecureActionBarAdvisor(configurer); + } + + public void preWindowOpen() { + IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); + configurer.setInitialSize(new Point(800, 600)); + configurer.setShowCoolBar(false); + configurer.setShowMenuBar(true); + configurer.setShowStatusLine(true); + configurer.setShowPerspectiveBar(true); + configurer.setTitle("Argeo Secure UI"); //$NON-NLS-1$ + } + +} diff --git a/security/eclipse/plugins/org.argeo.security.ui/.classpath b/security/eclipse/plugins/org.argeo.security.ui/.classpath new file mode 100644 index 000000000..92f19d2ff --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/security/eclipse/plugins/org.argeo.security.ui/.project b/security/eclipse/plugins/org.argeo.security.ui/.project new file mode 100644 index 000000000..a052e9a57 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui/.project @@ -0,0 +1,28 @@ + + + org.argeo.security.ui + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/security/eclipse/plugins/org.argeo.security.ui/.settings/org.eclipse.jdt.core.prefs b/security/eclipse/plugins/org.argeo.security.ui/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..aef0f5291 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +#Sat Jan 15 13:25:02 CET 2011 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/security/eclipse/plugins/org.argeo.security.ui/.settings/org.eclipse.pde.core.prefs b/security/eclipse/plugins/org.argeo.security.ui/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 000000000..dfa507d81 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,3 @@ +#Sat Jan 15 18:15:48 CET 2011 +eclipse.preferences.version=1 +resolve.requirebundle=false diff --git a/security/eclipse/plugins/org.argeo.security.ui/META-INF/MANIFEST.MF b/security/eclipse/plugins/org.argeo.security.ui/META-INF/MANIFEST.MF new file mode 100644 index 000000000..30b48d92d --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui/META-INF/MANIFEST.MF @@ -0,0 +1,37 @@ +Manifest-Version: 1.0 +Export-Package: org.argeo.security.ui;uses:="org.eclipse.ui,org.eclips + e.ui.plugin,org.osgi.framework";version="0.2.2.SNAPSHOT-r20110116_215 + 742",org.argeo.security.ui.dialogs;uses:="org.eclipse.swt.events,java + x.security.auth.callback,org.eclipse.swt.widgets,org.eclipse.jface.op + eration,org.eclipse.core.runtime,org.eclipse.jface.dialogs,org.eclips + e.swt.graphics,org.eclipse.swt.layout";version="0.2.2.SNAPSHOT-r20110 + 116_215742",org.argeo.security.ui.views;uses:="org.argeo.security.equ + inox,org.eclipse.jface.viewers,org.eclipse.swt.graphics,org.eclipse.u + i,org.eclipse.ui.part,org.eclipse.swt.widgets,org.argeo.security,org. + argeo";version="0.2.2.SNAPSHOT-r20110116_215742" +Private-Package: .;version="0.2.2-SNAPSHOT-r20110116_215742" +Bundle-ActivationPolicy: lazy +Tool: Bnd-0.0.357 +Bundle-Name: Commons Security UI +Created-By: 1.6.0_0 (Sun Microsystems Inc.) +Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Require-Bundle: org.eclipse.ui;resolution:=optional,org.eclipse.rap.ui + ;resolution:=optional,org.eclipse.core.runtime +Bundle-Vendor: Argeo +Bundle-Version: 0.2.2.SNAPSHOT-r20110116_215742 +Bundle-Activator: org.argeo.security.ui.SecurityUiPlugin +Bundle-ManifestVersion: 2 +Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt +Import-Package: javax.security.auth.callback,org.argeo;version="0.2",o + rg.argeo.eclipse.spring;version="0.2",org.argeo.security;version="0.2 + ",org.argeo.security.equinox;version="0.2",org.argeo.security.ui;vers + ion="0.2",org.argeo.security.ui.dialogs;version="0.2",org.argeo.secur + ity.ui.views;version="0.2",org.eclipse.core.runtime;registry=split;ve + rsion="3.4",org.eclipse.jface.dialogs,org.eclipse.jface.operation,org + .eclipse.jface.viewers,org.eclipse.swt.events,org.eclipse.swt.graphic + s,org.eclipse.swt.layout,org.eclipse.swt.widgets,org.eclipse.ui;ui.wo + rkbench=split,org.eclipse.ui.part;ui.workbench=split,org.eclipse.ui.p + lugin,org.osgi.framework;version="1.5" +Bundle-SymbolicName: org.argeo.security.ui;singleton:=true +Bundle-DocURL: http://www.argeo.org + diff --git a/security/eclipse/plugins/org.argeo.security.ui/META-INF/spring/osgi.xml b/security/eclipse/plugins/org.argeo.security.ui/META-INF/spring/osgi.xml new file mode 100644 index 000000000..6574cf125 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui/META-INF/spring/osgi.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/security/eclipse/plugins/org.argeo.security.ui/META-INF/spring/views.xml b/security/eclipse/plugins/org.argeo.security.ui/META-INF/spring/views.xml new file mode 100644 index 000000000..2cd8d033f --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui/META-INF/spring/views.xml @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/security/eclipse/plugins/org.argeo.security.ui/build.properties b/security/eclipse/plugins/org.argeo.security.ui/build.properties new file mode 100644 index 000000000..7b6db787b --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui/build.properties @@ -0,0 +1,5 @@ +source.. = src/main/java/ +output.. = target/classes/ +bin.includes = META-INF/,\ + .,\ + plugin.xml diff --git a/security/eclipse/plugins/org.argeo.security.ui/plugin.xml b/security/eclipse/plugins/org.argeo.security.ui/plugin.xml new file mode 100644 index 000000000..b99ba652f --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui/plugin.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/security/eclipse/plugins/org.argeo.security.ui/pom.xml b/security/eclipse/plugins/org.argeo.security.ui/pom.xml new file mode 100644 index 000000000..a2f77c79d --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui/pom.xml @@ -0,0 +1,101 @@ + + 4.0.0 + + org.argeo.commons.security + 0.2.2-SNAPSHOT + plugins + .. + + org.argeo.security.ui + Commons Security UI + jar + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + org.apache.felix + maven-bundle-plugin + ${version.maven-bundle-plugin} + + + lazy + org.argeo.security.ui.SecurityUiPlugin + org.eclipse.ui;resolution:=optional,org.eclipse.rap.ui;resolution:=optional,org.eclipse.core.runtime + *,org.argeo.eclipse.spring + + + + + + + + + org.argeo.commons.security + org.argeo.security.core + 0.2.2-SNAPSHOT + + + org.argeo.commons.security + org.argeo.security.equinox + 0.2.2-SNAPSHOT + + + + + org.argeo.commons.eclipse + org.argeo.eclipse.ui + 0.2.2-SNAPSHOT + + + + + org.argeo.commons.eclipse + org.argeo.eclipse.dep.common + 0.2.2-SNAPSHOT + + + + + org.argeo.commons.eclipse + org.argeo.eclipse.dep.rcp + 0.2.2-SNAPSHOT + + + org.eclipse.ui + org.eclipse.ui + provided + + + + + org.argeo.commons.basic + org.argeo.basic.nodeps + 0.2.2-SNAPSHOT + + + + + org.springframework.security + org.springframework.security.core + + + + + org.slf4j + com.springsource.slf4j.org.apache.commons.logging + + + + diff --git a/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/SecurityPerspective.java b/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/SecurityPerspective.java new file mode 100644 index 000000000..1a630dd17 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/SecurityPerspective.java @@ -0,0 +1,23 @@ +package org.argeo.security.ui; + +import org.eclipse.ui.IFolderLayout; +import org.eclipse.ui.IPageLayout; +import org.eclipse.ui.IPerspectiveFactory; + +public class SecurityPerspective implements IPerspectiveFactory { + + public void createInitialLayout(IPageLayout layout) { + String editorArea = layout.getEditorArea(); + layout.setEditorAreaVisible(false); + layout.setFixed(false); + + IFolderLayout main = layout.createFolder("main", IPageLayout.RIGHT, + 0.3f, editorArea); + IFolderLayout left = layout.createFolder("left", IPageLayout.LEFT, + 0.3f, editorArea); + + left.addView("org.argeo.security.ui.usersView"); + main.addView("org.argeo.security.ui.currentUserView"); + } + +} diff --git a/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/SecurityUiPlugin.java b/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/SecurityUiPlugin.java new file mode 100644 index 000000000..5e165ad4f --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/SecurityUiPlugin.java @@ -0,0 +1,50 @@ +package org.argeo.security.ui; + +import org.eclipse.ui.plugin.AbstractUIPlugin; +import org.osgi.framework.BundleContext; + +/** + * The activator class controls the plug-in life cycle + */ +public class SecurityUiPlugin extends AbstractUIPlugin { + + // The plug-in ID + public static final String PLUGIN_ID = "org.argeo.security.ui"; //$NON-NLS-1$ + + // The shared instance + private static SecurityUiPlugin plugin; + + /** + * The constructor + */ + public SecurityUiPlugin() { + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) + */ + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) + */ + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static SecurityUiPlugin getDefault() { + return plugin; + } + +} diff --git a/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/dialogs/AbstractLoginDialog.java b/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/dialogs/AbstractLoginDialog.java new file mode 100644 index 000000000..d13414e13 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/dialogs/AbstractLoginDialog.java @@ -0,0 +1,118 @@ +package org.argeo.security.ui.dialogs; + +import java.io.IOException; + +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.TitleAreaDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.operation.ModalContext; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; + +public abstract class AbstractLoginDialog extends TitleAreaDialog implements + CallbackHandler { + + boolean processCallbacks = false; + boolean isCancelled = false; + Callback[] callbackArray; + + protected final Callback[] getCallbacks() { + return this.callbackArray; + } + + public abstract void internalHandle(); + + public boolean isCancelled() { + return isCancelled; + } + + protected AbstractLoginDialog(Shell parentShell) { + super(parentShell); + } + + /* + * (non-Javadoc) + * + * @see + * javax.security.auth.callback.CallbackHandler#handle(javax.security.auth + * .callback.Callback[]) + */ + public void handle(final Callback[] callbacks) throws IOException { + this.callbackArray = callbacks; + final Display display = Display.getDefault(); + display.syncExec(new Runnable() { + + public void run() { + isCancelled = false; + setBlockOnOpen(false); + open(); + final Button okButton = getButton(IDialogConstants.OK_ID); + okButton.setText("Login"); + okButton.addSelectionListener(new SelectionListener() { + + public void widgetSelected(final SelectionEvent event) { + processCallbacks = true; + } + + public void widgetDefaultSelected(final SelectionEvent event) { + // nothing to do + } + }); + final Button cancel = getButton(IDialogConstants.CANCEL_ID); + cancel.addSelectionListener(new SelectionListener() { + + public void widgetSelected(final SelectionEvent event) { + isCancelled = true; + processCallbacks = true; + } + + public void widgetDefaultSelected(final SelectionEvent event) { + // nothing to do + } + }); + } + }); + try { + ModalContext.setAllowReadAndDispatch(true); // Works for now. + ModalContext.run(new IRunnableWithProgress() { + + public void run(final IProgressMonitor monitor) { + // Wait here until OK or cancel is pressed, then let it rip. + // The event + // listener + // is responsible for closing the dialog (in the + // loginSucceeded + // event). + while (!processCallbacks) { + try { + Thread.sleep(100); + } catch (final Exception e) { + // do nothing + } + } + processCallbacks = false; + // Call the adapter to handle the callbacks + if (!isCancelled()) + internalHandle(); + } + }, true, new NullProgressMonitor(), Display.getDefault()); + } catch (final Exception e) { + final IOException ioe = new IOException(); + ioe.initCause(e); + throw ioe; + } + } + + protected void configureShell(Shell shell) { + super.configureShell(shell); + shell.setText("Login"); + } +} diff --git a/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/dialogs/DefaultLoginDialog.java b/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/dialogs/DefaultLoginDialog.java new file mode 100644 index 000000000..b0a7e0507 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/dialogs/DefaultLoginDialog.java @@ -0,0 +1,110 @@ +package org.argeo.security.ui.dialogs; + +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.NameCallback; +import javax.security.auth.callback.PasswordCallback; +import javax.security.auth.callback.TextOutputCallback; + +import org.eclipse.jface.dialogs.IMessageProvider; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +public class DefaultLoginDialog extends AbstractLoginDialog { + + public DefaultLoginDialog() { + this(Display.getDefault().getActiveShell()); + } + + protected DefaultLoginDialog(Shell parentShell) { + super(parentShell); + } + + protected Point getInitialSize() { + return new Point(300, 280); + } + + protected Control createDialogArea(Composite parent) { + Composite dialogarea = (Composite) super.createDialogArea(parent); + dialogarea.setLayoutData(new GridData(GridData.FILL_BOTH)); + Composite composite = new Composite(dialogarea, SWT.NONE); + composite.setLayout(new GridLayout(2, false)); + createCallbackHandlers(composite); + return composite; + } + + private void createCallbackHandlers(Composite composite) { + Callback[] callbacks = getCallbacks(); + for (int i = 0; i < callbacks.length; i++) { + Callback callback = callbacks[i]; + if (callback instanceof TextOutputCallback) { + createTextoutputHandler(composite, + (TextOutputCallback) callback); + } else if (callback instanceof NameCallback) { + createNameHandler(composite, (NameCallback) callback); + } else if (callback instanceof PasswordCallback) { + createPasswordHandler(composite, (PasswordCallback) callback); + } + } + } + + private void createPasswordHandler(Composite composite, + final PasswordCallback callback) { + Label label = new Label(composite, SWT.NONE); + label.setText(callback.getPrompt()); + final Text passwordText = new Text(composite, SWT.SINGLE | SWT.LEAD + | SWT.PASSWORD | SWT.BORDER); + //passwordText.setLayoutData(new GridData(GridData.FILL_BOTH)); + passwordText.addModifyListener(new ModifyListener() { + + public void modifyText(ModifyEvent event) { + callback.setPassword(passwordText.getText().toCharArray()); + } + }); + } + + private void createNameHandler(Composite composite, + final NameCallback callback) { + Label label = new Label(composite, SWT.NONE); + label.setText(callback.getPrompt()); + final Text text = new Text(composite, SWT.SINGLE | SWT.LEAD + | SWT.BORDER); + //text.setLayoutData(new GridData(GridData.FILL_BOTH)); + text.addModifyListener(new ModifyListener() { + + public void modifyText(ModifyEvent event) { + callback.setName(text.getText()); + } + }); + } + + private void createTextoutputHandler(Composite composite, + TextOutputCallback callback) { + int messageType = callback.getMessageType(); + int dialogMessageType = IMessageProvider.NONE; + switch (messageType) { + case TextOutputCallback.INFORMATION: + dialogMessageType = IMessageProvider.INFORMATION; + break; + case TextOutputCallback.WARNING: + dialogMessageType = IMessageProvider.WARNING; + break; + case TextOutputCallback.ERROR: + dialogMessageType = IMessageProvider.ERROR; + break; + } + setMessage(callback.getMessage(), dialogMessageType); + } + + public void internalHandle() { + } +} diff --git a/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/CurrentUserView.java b/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/CurrentUserView.java new file mode 100644 index 000000000..263a722e7 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/CurrentUserView.java @@ -0,0 +1,129 @@ +package org.argeo.security.ui.views; + +import org.argeo.security.equinox.CurrentUser; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.ui.part.ViewPart; + +public class CurrentUserView extends ViewPart { + private TableViewer viewer; + + @Override + public void createPartControl(Composite parent) { + + // viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL + // | SWT.V_SCROLL); + viewer = new TableViewer(createTable(parent)); + viewer.setContentProvider(new UsersContentProvider()); + viewer.setLabelProvider(new UsersLabelProvider()); + viewer.setInput(getViewSite()); + // viewer.setInput(SecurityContextHolder.getContext()); + } + + protected Table createTable(Composite parent) { + int style = SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL; + + Table table = new Table(parent, style); + + // GridData gridData = new GridData(GridData.FILL_BOTH); + // gridData.grabExcessVerticalSpace = true; + // gridData.grabExcessHorizontalSpace = true; + // gridData.horizontalSpan = 3; + // table.setLayoutData(gridData); + + table.setLinesVisible(true); + table.setHeaderVisible(true); + + TableColumn column = new TableColumn(table, SWT.LEFT, 0); + column.setText("ID"); + column.setWidth(100); + +// column = new TableColumn(table, SWT.LEFT, 1); +// column.setText("Password"); +// column.setWidth(200); + + // column = new TableColumn(table, SWT.LEFT, 2); + // column.setText("Roles"); + // column.setWidth(300); + + return table; + } + + @Override + public void setFocus() { + viewer.getTable().setFocus(); + } + + private class UsersContentProvider implements IStructuredContentProvider { + + public Object[] getElements(Object inputElement) { + return getChildren(inputElement); + } + + public Object[] getChildren(Object parentElement) { +// ILoginContext secureContext = LoginContextFactory +// .createContext("SPRING"); +// try { +// secureContext.login(); +// } catch (LoginException e) { +// // login failed +// } +// +// Subject subject = null; +// // subject = Subject.getSubject(AccessController.getContext()); +// try { +// subject = secureContext.getSubject(); +// } catch (Exception e) { +// e.printStackTrace(); +// throw new ArgeoException("Cannot retrieve subject", e); +// } +// +// if (subject == null) +// throw new ArgeoException("No subject found"); +// return subject.getPrincipals().toArray(); + return CurrentUser.roles().toArray(); + } + + public void dispose() { + // TODO Auto-generated method stub + + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + // TODO Auto-generated method stub + + } + + } + + private class UsersLabelProvider extends LabelProvider implements + ITableLabelProvider { + public String getColumnText(Object element, int columnIndex) { +// Principal argeoUser = (Principal) element; +// switch (columnIndex) { +// case 0: +// return argeoUser.getName(); +// case 1: +// return argeoUser.toString(); +// default: +// throw new ArgeoException("Unmanaged column " + columnIndex); +// } + return element.toString(); + } + + public Image getColumnImage(Object element, int columnIndex) { + // TODO Auto-generated method stub + return null; + } + + } + +} diff --git a/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/UsersView.java b/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/UsersView.java new file mode 100644 index 000000000..d54c1a6e7 --- /dev/null +++ b/security/eclipse/plugins/org.argeo.security.ui/src/main/java/org/argeo/security/ui/views/UsersView.java @@ -0,0 +1,129 @@ +package org.argeo.security.ui.views; + +import org.argeo.ArgeoException; +import org.argeo.security.ArgeoSecurityService; +import org.argeo.security.ArgeoUser; +import org.argeo.security.equinox.CurrentUser; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.ui.part.ViewPart; + +public class UsersView extends ViewPart { + private TableViewer viewer; + private ArgeoSecurityService securityService; + + @Override + public void createPartControl(Composite parent) { + + // viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL + // | SWT.V_SCROLL); + viewer = new TableViewer(createTable(parent)); + viewer.setContentProvider(new UsersContentProvider()); + viewer.setLabelProvider(new UsersLabelProvider()); + viewer.setInput(getViewSite()); + // viewer.setInput(SecurityContextHolder.getContext()); + } + + protected Table createTable(Composite parent) { + int style = SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL; + + Table table = new Table(parent, style); + + // GridData gridData = new GridData(GridData.FILL_BOTH); + // gridData.grabExcessVerticalSpace = true; + // gridData.grabExcessHorizontalSpace = true; + // gridData.horizontalSpan = 3; + // table.setLayoutData(gridData); + + table.setLinesVisible(true); + table.setHeaderVisible(true); + + TableColumn column = new TableColumn(table, SWT.LEFT, 0); + column.setText("ID"); + column.setWidth(100); + + column = new TableColumn(table, SWT.LEFT, 1); + column.setText("Password"); + column.setWidth(200); + + // column = new TableColumn(table, SWT.LEFT, 2); + // column.setText("Roles"); + // column.setWidth(300); + + return table; + } + + @Override + public void setFocus() { + viewer.getTable().setFocus(); + } + + private class UsersContentProvider implements IStructuredContentProvider { + + public Object[] getElements(Object inputElement) { + return getChildren(inputElement); + } + + public Object[] getChildren(Object parentElement) { +// try { +// Thread.sleep(3000); +// } catch (InterruptedException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } + + return securityService.getSecurityDao().listUsers().toArray(); + } + + public void dispose() { + // TODO Auto-generated method stub + + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + // TODO Auto-generated method stub + + } + + } + + private class UsersLabelProvider extends LabelProvider implements + ITableLabelProvider { + public String getColumnText(Object element, int columnIndex) { + String currentUsername = CurrentUser.getUsername(); + ArgeoUser argeoUser = (ArgeoUser) element; + switch (columnIndex) { + case 0: + String userName = argeoUser.getUsername(); + if (userName.equals(currentUsername)) + userName = userName + "*"; + return userName; + case 1: + return argeoUser.getPassword(); + case 2: + return argeoUser.getRoles().toString(); + default: + throw new ArgeoException("Unmanaged column " + columnIndex); + } + } + + public Image getColumnImage(Object element, int columnIndex) { + // TODO Auto-generated method stub + return null; + } + + } + + public void setSecurityService(ArgeoSecurityService securityService) { + this.securityService = securityService; + } + +} diff --git a/security/eclipse/plugins/pom.xml b/security/eclipse/plugins/pom.xml new file mode 100644 index 000000000..f8d71708e --- /dev/null +++ b/security/eclipse/plugins/pom.xml @@ -0,0 +1,84 @@ + + 4.0.0 + + org.argeo.commons.security + 0.2.2-SNAPSHOT + eclipse + .. + + plugins + Commons Security Eclipse plugins + pom + + org.argeo.security.equinox + org.argeo.security.ui + org.argeo.security.ui.rcp + org.argeo.security.ui.rap + + + + + src/main/resources + + + . + + plugin.xml + META-INF/** + jaas/** + + + + + + maven-clean-plugin + + + + META-INF + + MANIFEST.MF + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + META-INF/MANIFEST.MF + + + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + + org.apache.felix + maven-bundle-plugin + + META-INF + + ${pom.artifactId};singleton:=true + + + + + + + + org.argeo.commons.osgi + org.argeo.osgi.boot + 0.2.2-SNAPSHOT + test + + + diff --git a/security/eclipse/pom.xml b/security/eclipse/pom.xml new file mode 100644 index 000000000..86a460103 --- /dev/null +++ b/security/eclipse/pom.xml @@ -0,0 +1,19 @@ + + + 4.0.0 + + org.argeo.commons + 0.2.2-SNAPSHOT + argeo-commons + .. + + org.argeo.commons.security + eclipse + Commons Security Eclipse + pom + + + plugins + + \ No newline at end of file diff --git a/security/pom.xml b/security/pom.xml index b54b87386..aadcc35d6 100644 --- a/security/pom.xml +++ b/security/pom.xml @@ -13,6 +13,7 @@ runtime modules + eclipse dep demo diff --git a/server/modules/org.argeo.server.ads.server/.project b/server/modules/org.argeo.server.ads.server/.project new file mode 100644 index 000000000..a191480d8 --- /dev/null +++ b/server/modules/org.argeo.server.ads.server/.project @@ -0,0 +1,22 @@ + + + org.argeo.server.ads.server + + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + + diff --git a/server/modules/org.argeo.server.ads.server/.settings/org.eclipse.pde.core.prefs b/server/modules/org.argeo.server.ads.server/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 000000000..5733b3123 --- /dev/null +++ b/server/modules/org.argeo.server.ads.server/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,4 @@ +#Sun Jan 16 09:58:38 CET 2011 +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/server/modules/org.argeo.server.ads.server/META-INF/spring/ads.xml b/server/modules/org.argeo.server.ads.server/META-INF/spring/ads.xml index b579ee5f8..6762fd33f 100644 --- a/server/modules/org.argeo.server.ads.server/META-INF/spring/ads.xml +++ b/server/modules/org.argeo.server.ads.server/META-INF/spring/ads.xml @@ -5,15 +5,13 @@ - - osgibundle:ads.properties - + osgibundle:ads.properties - + @@ -31,26 +29,17 @@ simple ${argeo.ldap.manager.userdn} ${argeo.ldap.manager.password} - - - - - - + + + + + + diff --git a/server/modules/org.argeo.server.ads.server/build.properties b/server/modules/org.argeo.server.ads.server/build.properties new file mode 100644 index 000000000..5f22cdd44 --- /dev/null +++ b/server/modules/org.argeo.server.ads.server/build.properties @@ -0,0 +1 @@ +bin.includes = META-INF/ diff --git a/server/runtime/org.argeo.server.core/pom.xml b/server/runtime/org.argeo.server.core/pom.xml index 9cde2f459..01dec5f22 100644 --- a/server/runtime/org.argeo.server.core/pom.xml +++ b/server/runtime/org.argeo.server.core/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 org.argeo.commons.server @@ -65,6 +66,10 @@ javax.servlet com.springsource.javax.servlet + + javax.xml.stream + com.springsource.javax.xml.stream + diff --git a/server/runtime/org.argeo.server.jackrabbit/build.properties b/server/runtime/org.argeo.server.jackrabbit/build.properties index fdf424dbc..cd05956ed 100644 --- a/server/runtime/org.argeo.server.jackrabbit/build.properties +++ b/server/runtime/org.argeo.server.jackrabbit/build.properties @@ -7,6 +7,4 @@ additional.bundles = com.springsource.slf4j.api,\ com.springsource.org.apache.lucene,\ org.springframework.context source.. = src/main/java/,\ - src/test/java/,\ - src/test/resources/,\ src/main/resources/ -- 2.30.2