]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/WorkbenchLogin.java
a074ed956dc1f0ad033356a9a87bb4b7a8cc42ca
[lgpl/argeo-commons.git] / org.argeo.security.ui.rap / src / org / argeo / security / ui / rap / WorkbenchLogin.java
1 package org.argeo.security.ui.rap;
2
3 import java.security.PrivilegedAction;
4 import java.util.Locale;
5
6 import javax.security.auth.Subject;
7 import javax.security.auth.login.CredentialNotFoundException;
8 import javax.security.auth.login.LoginContext;
9 import javax.security.auth.login.LoginException;
10 import javax.servlet.http.HttpServletRequest;
11
12 import org.argeo.ArgeoException;
13 import org.argeo.cms.CmsException;
14 import org.argeo.cms.CmsImageManager;
15 import org.argeo.cms.CmsView;
16 import org.argeo.cms.auth.AuthConstants;
17 import org.argeo.cms.auth.CurrentUser;
18 import org.argeo.cms.auth.HttpRequestCallbackHandler;
19 import org.argeo.cms.widgets.auth.CmsLogin;
20 import org.argeo.cms.widgets.auth.CmsLoginShell;
21 import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
22 import org.argeo.eclipse.ui.specific.UiContext;
23 import org.eclipse.rap.rwt.RWT;
24 import org.eclipse.rap.rwt.application.EntryPoint;
25 import org.eclipse.swt.events.SelectionListener;
26 import org.eclipse.swt.widgets.Composite;
27 import org.eclipse.swt.widgets.Display;
28 import org.eclipse.ui.PlatformUI;
29
30 abstract class WorkbenchLogin implements EntryPoint, CmsView {
31 // private final static Log log = LogFactory.getLog(WorkbenchLogin.class);
32 private final Subject subject = new Subject();
33 private LoginContext loginContext;
34
35 @Override
36 public int createUI() {
37 final Display display = PlatformUI.createDisplay();
38 UiContext.setData(CmsView.KEY, this);
39 try {
40 // try pre-auth
41 loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_USER,
42 subject, new HttpRequestCallbackHandler(getRequest()));
43 loginContext.login();
44 } catch (CredentialNotFoundException e) {
45 CmsLoginShell loginShell = createCmsLoginShell();
46 loginShell.open();
47 while (!loginShell.getShell().isDisposed()) {
48 try {
49 if (!display.readAndDispatch())
50 display.sleep();
51 } catch (Exception e1) {
52 try {
53 Thread.sleep(3000);
54 } catch (InterruptedException e2) {
55 // silent
56 }
57 ErrorFeedback.show("Login failed", e1);
58 return -1;
59 }
60 }
61 } catch (LoginException e) {
62 throw new ArgeoException("Cannot log in", e);
63 }
64 //
65 // RUN THE WORKBENCH
66 //
67 Integer returnCode = null;
68 try {
69 returnCode = Subject.doAs(subject, new PrivilegedAction<Integer>() {
70 public Integer run() {
71 int result = createAndRunWorkbench(display,
72 CurrentUser.getUsername(subject));
73 return new Integer(result);
74 }
75 });
76 // explicit workbench closing
77 logout();
78 } finally {
79 display.dispose();
80 }
81 return returnCode;
82 }
83
84 protected abstract int createAndRunWorkbench(Display display,
85 String username);
86
87 protected HttpServletRequest getRequest() {
88 return RWT.getRequest();
89 }
90
91 protected CmsLoginShell createCmsLoginShell() {
92 return new CmsLoginShell(this) {
93
94 @Override
95 public void createContents(Composite parent) {
96 WorkbenchLogin.this.createLoginPage(parent, this);
97 }
98
99 @Override
100 protected void extendsCredentialsBlock(Composite credentialsBlock,
101 Locale selectedLocale,
102 SelectionListener loginSelectionListener) {
103 WorkbenchLogin.this.extendsCredentialsBlock(credentialsBlock,
104 selectedLocale, loginSelectionListener);
105 }
106
107 };
108 }
109
110 /**
111 * To be overridden. CmsLogin#createCredentialsBlock() should be called at
112 * some point in order to create the credentials composite. In order to use
113 * the default layout, call CmsLogin#defaultCreateContents() but <b>not</b>
114 * CmsLogin#createContent(), since it would lead to a stack overflow.
115 */
116 protected void createLoginPage(Composite parent, CmsLogin login) {
117 login.defaultCreateContents(parent);
118 }
119
120 protected void extendsCredentialsBlock(Composite credentialsBlock,
121 Locale selectedLocale, SelectionListener loginSelectionListener) {
122
123 }
124
125 @Override
126 public void navigateTo(String state) {
127 // TODO Auto-generated method stub
128
129 }
130
131 @Override
132 public void authChange(LoginContext loginContext) {
133 this.loginContext = loginContext;
134 }
135
136 @Override
137 public void logout() {
138 if (loginContext == null)
139 throw new CmsException("Login context should not bet null");
140 try {
141 loginContext.logout();
142 } catch (LoginException e) {
143 throw new CmsException("Cannot log out", e);
144 }
145 }
146
147 @Override
148 public final Subject getSubject() {
149 return subject;
150 }
151
152 @Override
153 public void exception(Throwable e) {
154 // TODO Auto-generated method stub
155
156 }
157
158 @Override
159 public CmsImageManager getImageManager() {
160 // TODO Auto-generated method stub
161 return null;
162 }
163 }