X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=security%2Fplugins%2Forg.argeo.security.ui.application%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fsecurity%2Fui%2Fapplication%2FAbstractSecureApplication.java;fp=security%2Fplugins%2Forg.argeo.security.ui.application%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fsecurity%2Fui%2Fapplication%2FAbstractSecureApplication.java;h=a0a2f922bbe31bc16384c087a80cf64c613582ff;hb=a7a5f4db586128a9bb2c171ee819eb3eb19f80aa;hp=0000000000000000000000000000000000000000;hpb=77eaf70d8b929dab68211d6a01f68eeb71a1dceb;p=lgpl%2Fargeo-commons.git diff --git a/security/plugins/org.argeo.security.ui.application/src/main/java/org/argeo/security/ui/application/AbstractSecureApplication.java b/security/plugins/org.argeo.security.ui.application/src/main/java/org/argeo/security/ui/application/AbstractSecureApplication.java new file mode 100644 index 000000000..a0a2f922b --- /dev/null +++ b/security/plugins/org.argeo.security.ui.application/src/main/java/org/argeo/security/ui/application/AbstractSecureApplication.java @@ -0,0 +1,117 @@ +package org.argeo.security.ui.application; + +import java.security.PrivilegedAction; + +import javax.security.auth.Subject; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +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; +import org.eclipse.ui.application.WorkbenchAdvisor; + +public abstract class AbstractSecureApplication implements IApplication { + private static final Log log = LogFactory + .getLog(AbstractSecureApplication.class); + + protected abstract WorkbenchAdvisor createWorkbenchAdvisor(); + + @SuppressWarnings("unchecked") + public Object start(IApplicationContext context) throws Exception { + + Integer returnCode = null; + Display display = PlatformUI.createDisplay(); + + // Force login + + try { + String username = null; + Exception loginException = null; + Subject subject = null; + try { + SecureApplicationActivator.getLoginContext().login(); + subject = SecureApplicationActivator.getLoginContext() + .getSubject(); + + // username = CurrentUser.getUsername(); + } catch (Exception e) { + loginException = e; + e.printStackTrace(); + } + if (subject == null) { + IStatus status = new Status(IStatus.ERROR, + "org.argeo.security.application", "Login is mandatory", + loginException); + ErrorDialog.openError(null, "Error", "Shutdown...", status); + return status.getSeverity(); + } + if (log.isDebugEnabled()) + log.debug("Logged in as " + username); + returnCode = (Integer) Subject.doAs(subject, getRunAction(display)); + SecureApplicationActivator.getLoginContext().logout(); + return processReturnCode(returnCode); + } catch (Exception e) { + // e.printStackTrace(); + IStatus status = new Status(IStatus.ERROR, + "org.argeo.security.rcp", "Login failed", e); + ErrorDialog.openError(null, "Error", "Shutdown...", status); + return returnCode; + } finally { + display.dispose(); + } + } + + protected Integer processReturnCode(Integer returnCode) { + return returnCode; + } + + @SuppressWarnings("rawtypes") + private PrivilegedAction getRunAction(final Display display) { + return new PrivilegedAction() { + + public Object run() { + int result = createAndRunWorkbench(display); + return new Integer(result); + } + }; + } + + protected Integer createAndRunWorkbench(Display display) { + return PlatformUI.createAndRunWorkbench(display, + createWorkbenchAdvisor()); + } + + 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"); + // String username = CurrentUser.getUsername(); + // if (log.isDebugEnabled()) + // log.debug("workbench stopped, logged in as " + username); + + } + +}