]> git.argeo.org Git - lgpl/argeo-commons.git/blob - security/plugins/org.argeo.security.ui.rap/src/main/java/org/argeo/security/ui/rap/SecureEntryPoint.java
Fix various issues with security
[lgpl/argeo-commons.git] / security / plugins / org.argeo.security.ui.rap / src / main / java / org / argeo / security / ui / rap / SecureEntryPoint.java
1 package org.argeo.security.ui.rap;
2
3 import java.security.PrivilegedAction;
4
5 import javax.security.auth.Subject;
6 import javax.security.auth.login.LoginException;
7
8 import org.apache.commons.logging.Log;
9 import org.apache.commons.logging.LogFactory;
10 import org.argeo.eclipse.ui.dialogs.Error;
11 import org.eclipse.core.runtime.IStatus;
12 import org.eclipse.core.runtime.Status;
13 import org.eclipse.jface.dialogs.ErrorDialog;
14 import org.eclipse.rwt.lifecycle.IEntryPoint;
15 import org.eclipse.rwt.service.SessionStoreEvent;
16 import org.eclipse.rwt.service.SessionStoreListener;
17 import org.eclipse.swt.widgets.Display;
18 import org.eclipse.ui.PlatformUI;
19 import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
20 import org.eclipse.ui.application.WorkbenchAdvisor;
21 import org.eclipse.ui.application.WorkbenchWindowAdvisor;
22
23 public class SecureEntryPoint implements IEntryPoint, SessionStoreListener {
24 private Log log = LogFactory.getLog(SecureEntryPoint.class);
25
26 @Override
27 public int createUI() {
28 // log.debug("THREAD=" + Thread.currentThread().getId()
29 // + ", RWT.getSessionStore().getId()="
30 // + RWT.getSessionStore().getId());
31
32 Integer returnCode = null;
33 Display display = PlatformUI.createDisplay();
34 try {
35 Subject subject = null;
36 Boolean retry = true;
37 while (retry) {
38 try {
39 // force login in order to give Spring Security a chance to
40 // load
41 SecureRapActivator.getLoginContext().login();
42 subject = SecureRapActivator.getLoginContext().getSubject();
43 retry = false;
44 } catch (LoginException e) {
45 Error.show("Cannot login", e);
46 retry = true;
47 } catch (Exception e) {
48 Error.show("Unexpected exception while trying to login", e);
49 retry = false;
50 }
51 }
52
53 if (subject == null) {
54 // IStatus status = new Status(IStatus.ERROR,
55 // "org.argeo.security.application", "Login is mandatory",
56 // loginException);
57 // ErrorDialog.openError(null, "Error", "Shutdown...", status);
58 // return status.getSeverity();
59
60 // TODO: log as anonymous
61 }
62
63 if (subject != null) {
64 returnCode = (Integer) Subject.doAs(subject,
65 getRunAction(display));
66 SecureRapActivator.getLoginContext().logout();
67 return processReturnCode(returnCode);
68 } else {
69 return -1;
70 }
71 } catch (Exception e) {
72 // e.printStackTrace();
73 IStatus status = new Status(IStatus.ERROR,
74 "org.argeo.security.rcp", "Login failed", e);
75 ErrorDialog.openError(null, "Error", "Shutdown...", status);
76 return returnCode;
77 } finally {
78 display.dispose();
79 }
80 }
81
82 @SuppressWarnings("rawtypes")
83 private PrivilegedAction getRunAction(final Display display) {
84 return new PrivilegedAction() {
85
86 public Object run() {
87 int result = createAndRunWorkbench(display);
88 return new Integer(result);
89 }
90 };
91 }
92
93 protected Integer createAndRunWorkbench(Display display) {
94 return PlatformUI.createAndRunWorkbench(display,
95 createWorkbenchAdvisor());
96 }
97
98 protected Integer processReturnCode(Integer returnCode) {
99 return returnCode;
100 }
101
102 protected WorkbenchAdvisor createWorkbenchAdvisor() {
103 return new SecureWorkbenchAdvisor() {
104 public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
105 IWorkbenchWindowConfigurer configurer) {
106 return new RapSecureWorkbenchWindowAdvisor(configurer);
107 }
108
109 };
110 }
111
112 @Override
113 public void beforeDestroy(SessionStoreEvent event) {
114 if (log.isDebugEnabled())
115 log.debug("RWT session " + event.getSessionStore().getId()
116 + " about to be destroyed. THREAD="
117 + Thread.currentThread().getId());
118
119 }
120
121 }