]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.security.ui/src/org/argeo/security/ui/login/WorkbenchLogin.java
Make CMS login UI more extensible
[lgpl/argeo-commons.git] / org.argeo.security.ui / src / org / argeo / security / ui / login / WorkbenchLogin.java
1 package org.argeo.security.ui.login;
2
3 import java.security.PrivilegedAction;
4
5 import javax.security.auth.Subject;
6 import javax.security.auth.login.CredentialNotFoundException;
7 import javax.security.auth.login.LoginContext;
8 import javax.security.auth.login.LoginException;
9 import javax.servlet.http.HttpServletRequest;
10
11 import org.argeo.ArgeoException;
12 import org.argeo.cms.CmsException;
13 import org.argeo.cms.CmsImageManager;
14 import org.argeo.cms.CmsView;
15 import org.argeo.cms.auth.AuthConstants;
16 import org.argeo.cms.auth.CurrentUser;
17 import org.argeo.cms.auth.HttpRequestCallbackHandler;
18 import org.argeo.cms.widgets.auth.CmsLoginShell;
19 import org.argeo.eclipse.ui.specific.UiContext;
20 import org.eclipse.rap.rwt.application.EntryPoint;
21 import org.eclipse.swt.widgets.Display;
22 import org.eclipse.ui.PlatformUI;
23
24 public abstract class WorkbenchLogin implements EntryPoint, CmsView {
25 // private final static Log log = LogFactory.getLog(WorkbenchLogin.class);
26 private final Subject subject = new Subject();
27 private LoginContext loginContext;
28
29 @Override
30 public int createUI() {
31 final Display display = PlatformUI.createDisplay();
32 UiContext.setData(CmsView.KEY, this);
33 try {
34 // try pre-auth
35 loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_USER,
36 subject, new HttpRequestCallbackHandler(getRequest()));
37 loginContext.login();
38 } catch (CredentialNotFoundException e) {
39 CmsLoginShell loginShell = createCmsLoginShell();
40 loginShell.open();
41 while (!loginShell.getShell().isDisposed()) {
42 if (!display.readAndDispatch()) {
43 display.sleep();
44 }
45 }
46 } catch (LoginException e) {
47 throw new ArgeoException("Cannot log in", e);
48 }
49 //
50 // RUN THE WORKBENCH
51 //
52 Integer returnCode = null;
53 try {
54 returnCode = Subject.doAs(subject, new PrivilegedAction<Integer>() {
55 public Integer run() {
56 int result = createAndRunWorkbench(display,
57 CurrentUser.getUsername(subject));
58 return new Integer(result);
59 }
60 });
61 // explicit workbench closing
62 logout();
63 } finally {
64 display.dispose();
65 }
66 return returnCode;
67 }
68
69 protected abstract int createAndRunWorkbench(Display display,
70 String username);
71
72 protected HttpServletRequest getRequest() {
73 return UiContext.getHttpRequest();
74 }
75
76 protected CmsLoginShell createCmsLoginShell() {
77 return new CmsLoginShell(this);
78 }
79
80 @Override
81 public void navigateTo(String state) {
82 // TODO Auto-generated method stub
83
84 }
85
86 @Override
87 public void authChange(LoginContext loginContext) {
88 this.loginContext = loginContext;
89 }
90
91 @Override
92 public void logout() {
93 if (loginContext == null)
94 throw new CmsException("Login context should not bet null");
95 try {
96 loginContext.logout();
97 } catch (LoginException e) {
98 throw new CmsException("Cannot log out", e);
99 }
100 }
101
102 @Override
103 public final Subject getSubject() {
104 return subject;
105 }
106
107 @Override
108 public void exception(Throwable e) {
109 // TODO Auto-generated method stub
110
111 }
112
113 @Override
114 public CmsImageManager getImageManager() {
115 // TODO Auto-generated method stub
116 return null;
117 }
118 }