package org.argeo.security.ui.rap; import java.security.PrivilegedAction; import javax.security.auth.Subject; import javax.security.auth.login.LoginException; import org.argeo.eclipse.ui.dialogs.Error; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.rwt.lifecycle.IEntryPoint; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.application.IWorkbenchWindowConfigurer; import org.eclipse.ui.application.WorkbenchAdvisor; import org.eclipse.ui.application.WorkbenchWindowAdvisor; public class SecureEntryPoint implements IEntryPoint { @Override public int createUI() { Integer returnCode = null; Display display = PlatformUI.createDisplay(); try { Subject subject = null; Boolean retry = true; while (retry) { try { SecureRapActivator.getLoginContext().login(); subject = SecureRapActivator.getLoginContext() .getSubject(); retry = false; } catch (LoginException e) { Error.show("Cannot login", e); retry = true; } catch (Exception e) { Error.show("Unexpected exception while trying to login", e); retry = false; } } 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(); // TODO: log as anonymous } if (subject != null) { returnCode = (Integer) Subject.doAs(subject, getRunAction(display)); SecureRapActivator.getLoginContext().logout(); return processReturnCode(returnCode); } else { return -1; } } 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(); } } @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()); } protected Integer processReturnCode(Integer returnCode) { return returnCode; } protected WorkbenchAdvisor createWorkbenchAdvisor() { return new SecureWorkbenchAdvisor() { public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor( IWorkbenchWindowConfigurer configurer) { return new RapSecureWorkbenchWindowAdvisor(configurer); } }; } }