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