--- /dev/null
+/*
+ * Copyright (C) 2007-2012 Argeo GmbH
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.argeo.security.ui.rcp;
+
+import java.security.PrivilegedAction;
+
+import javax.security.auth.Subject;
+import javax.security.auth.login.LoginException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.OperatingSystem;
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+import org.eclipse.equinox.security.auth.ILoginContext;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.application.WorkbenchAdvisor;
+
+/**
+ * RCP workbench initialization
+ */
+public abstract class AbstractSecureApplication implements IApplication {
+ final static String NODE_REPO_URI = "argeo.node.repo.uri";
+
+ private static final Log log = LogFactory
+ .getLog(AbstractSecureApplication.class);
+
+ protected WorkbenchAdvisor createWorkbenchAdvisor(String username) {
+ return new SecureWorkbenchAdvisor(username);
+ }
+
+ public Object start(IApplicationContext context) throws Exception {
+ // wait for the system to be initialized
+ // try {
+ // Thread.sleep(3000);
+ // } catch (Exception e2) {
+ // // silent
+ // }
+
+ boolean remote = System.getProperty(NODE_REPO_URI) != null;
+
+ // choose login context
+ final ILoginContext loginContext;
+ if (remote) {
+ loginContext = SecureApplicationActivator
+ .createLoginContext(SecureApplicationActivator.CONTEXT_REMOTE);
+ } else {
+ if (OperatingSystem.os == OperatingSystem.WINDOWS)
+ loginContext = SecureApplicationActivator
+ .createLoginContext(SecureApplicationActivator.CONTEXT_WINDOWS);
+ else
+ loginContext = SecureApplicationActivator
+ .createLoginContext(SecureApplicationActivator.CONTEXT_NIX);
+ }
+
+ final Display display = PlatformUI.createDisplay();
+
+ // login
+ Subject subject = null;
+ try {
+ loginContext.login();
+ subject = loginContext.getSubject();
+ } catch (LoginException e) {
+ log.error("Error when logging in.", e);
+ display.dispose();
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e1) {
+ // silent
+ }
+ return null;
+ }
+
+ // identify after successful login
+ if (log.isDebugEnabled())
+ log.debug("subject=" + subject);
+ final String username = subject.getPrincipals().iterator().next()
+ .getName();
+ if (log.isDebugEnabled())
+ log.debug(username + " logged in");
+// display.disposeExec(new Runnable() {
+// public void run() {
+// log.debug("Display disposed");
+// logout(loginContext, username);
+// }
+// });
+
+ try {
+ PrivilegedAction<?> privilegedAction = new PrivilegedAction<Object>() {
+ public Object run() {
+ int result = PlatformUI.createAndRunWorkbench(display,
+ createWorkbenchAdvisor(username));
+ return new Integer(result);
+ }
+ };
+
+ Integer returnCode = (Integer) Subject.doAs(subject,
+ privilegedAction);
+ logout(loginContext, username);
+ return processReturnCode(returnCode);
+ } catch (Exception e) {
+ if (subject != null)
+ logout(loginContext, username);
+ log.error("Unexpected error", e);
+ } finally {
+ display.dispose();
+ }
+ return null;
+ }
+
+ protected Integer processReturnCode(Integer returnCode) {
+ if (returnCode == PlatformUI.RETURN_RESTART)
+ return IApplication.EXIT_RESTART;
+ else
+ return IApplication.EXIT_OK;
+ }
+
+ static void logout(ILoginContext secureContext, String username) {
+ try {
+ secureContext.logout();
+ log.info("Logged out " + (username != null ? username : "")
+ + " (THREAD=" + Thread.currentThread().getId() + ")");
+ } catch (LoginException e) {
+ log.error("Erorr when logging out", e);
+ }
+ }
+
+ public void stop() {
+ final IWorkbench workbench;
+ try {
+ workbench = PlatformUI.getWorkbench();
+ } catch (Exception e) {
+ return;
+ }
+ if (workbench == null)
+ return;
+ final Display display = workbench.getDisplay();
+ if (display != null && !display.isDisposed())
+ display.syncExec(new Runnable() {
+
+ public void run() {
+ if (!display.isDisposed())
+ workbench.close();
+ }
+ });
+
+ if (log.isDebugEnabled())
+ log.debug("workbench stopped");
+ }
+
+}