]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.ui/src/org/argeo/cms/ui/util/LoginEntryPoint.java
Expose servlet context helpers.
[lgpl/argeo-commons.git] / org.argeo.cms.ui / src / org / argeo / cms / ui / util / LoginEntryPoint.java
1 package org.argeo.cms.ui.util;
2
3 import java.util.Locale;
4 import java.util.UUID;
5
6 import javax.security.auth.Subject;
7 import javax.security.auth.login.LoginContext;
8 import javax.security.auth.login.LoginException;
9 import javax.servlet.http.HttpServletRequest;
10
11 import org.apache.commons.logging.Log;
12 import org.apache.commons.logging.LogFactory;
13 import org.argeo.api.NodeConstants;
14 import org.argeo.cms.CmsException;
15 import org.argeo.cms.auth.CurrentUser;
16 import org.argeo.cms.ui.CmsImageManager;
17 import org.argeo.cms.ui.CmsView;
18 import org.argeo.cms.ui.UxContext;
19 import org.argeo.cms.ui.widgets.auth.CmsLogin;
20 import org.argeo.cms.ui.widgets.auth.CmsLoginShell;
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 protected final static String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate";
30 protected final static String HEADER_AUTHORIZATION = "Authorization";
31 private final static Log log = LogFactory.getLog(LoginEntryPoint.class);
32 private LoginContext loginContext;
33 private UxContext uxContext = null;
34 private String uid;
35
36 @Override
37 public int createUI() {
38 uid = UUID.randomUUID().toString();
39 final Display display = createDisplay();
40 // UiContext.setData(CmsView.KEY, this);
41
42 CmsLoginShell loginShell = createCmsLoginShell();
43 CmsView.registerCmsView(loginShell.getShell(), this);
44 try {
45 // try pre-auth
46 loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, loginShell);
47 loginContext.login();
48 } catch (LoginException e) {
49 loginShell.createUi();
50 loginShell.open();
51
52 // HttpServletRequest request = RWT.getRequest();
53 // String authorization = request.getHeader(HEADER_AUTHORIZATION);
54 // if (authorization == null ||
55 // !authorization.startsWith("Negotiate")) {
56 // HttpServletResponse response = RWT.getResponse();
57 // response.setStatus(401);
58 // response.setHeader(HEADER_WWW_AUTHENTICATE, "Negotiate");
59 // response.setDateHeader("Date", System.currentTimeMillis());
60 // response.setDateHeader("Expires", System.currentTimeMillis() +
61 // (24 * 60 * 60 * 1000));
62 // response.setHeader("Accept-Ranges", "bytes");
63 // response.setHeader("Connection", "Keep-Alive");
64 // response.setHeader("Keep-Alive", "timeout=5, max=97");
65 // // response.setContentType("text/html; charset=UTF-8");
66 // }
67
68 while (!loginShell.getShell().isDisposed()) {
69 if (!display.readAndDispatch())
70 display.sleep();
71 }
72 }
73
74 if (CurrentUser.getUsername(getSubject()) == null)
75 return -1;
76 uxContext = new SimpleUxContext();
77 return postLogin();
78 }
79
80 protected Display createDisplay() {
81 return new Display();
82 }
83
84 protected int postLogin() {
85 return 0;
86 }
87
88 protected HttpServletRequest getRequest() {
89 return RWT.getRequest();
90 }
91
92 protected CmsLoginShell createCmsLoginShell() {
93 return new CmsLoginShell(this) {
94
95 @Override
96 public void createContents(Composite parent) {
97 LoginEntryPoint.this.createLoginPage(parent, this);
98 }
99
100 @Override
101 protected void extendsCredentialsBlock(Composite credentialsBlock, Locale selectedLocale,
102 SelectionListener loginSelectionListener) {
103 LoginEntryPoint.this.extendsCredentialsBlock(credentialsBlock, selectedLocale, loginSelectionListener);
104 }
105
106 };
107 }
108
109 /**
110 * To be overridden. CmsLogin#createCredentialsBlock() should be called at some
111 * point in order to create the credentials composite. In order to use the
112 * default layout, call CmsLogin#defaultCreateContents() but <b>not</b>
113 * CmsLogin#createContent(), since it would lead to a stack overflow.
114 */
115 protected void createLoginPage(Composite parent, CmsLogin login) {
116 login.defaultCreateContents(parent);
117 }
118
119 protected void extendsCredentialsBlock(Composite credentialsBlock, Locale selectedLocale,
120 SelectionListener loginSelectionListener) {
121
122 }
123
124 @Override
125 public String getUid() {
126 return uid;
127 }
128
129 @Override
130 public void navigateTo(String state) {
131 // TODO Auto-generated method stub
132
133 }
134
135 @Override
136 public void authChange(LoginContext loginContext) {
137 if (loginContext == null)
138 throw new CmsException("Login context cannot be null");
139 // logout previous login context
140 if (this.loginContext != null)
141 try {
142 this.loginContext.logout();
143 } catch (LoginException e1) {
144 log.warn("Could not log out: " + e1);
145 }
146 this.loginContext = loginContext;
147 }
148
149 @Override
150 public void logout() {
151 if (loginContext == null)
152 throw new CmsException("Login context should not bet null");
153 try {
154 CurrentUser.logoutCmsSession(loginContext.getSubject());
155 loginContext.logout();
156 } catch (LoginException e) {
157 throw new CmsException("Cannot log out", e);
158 }
159 }
160
161 @Override
162 public void exception(Throwable e) {
163 // TODO Auto-generated method stub
164
165 }
166
167 // @Override
168 // public LoginContext getLoginContext() {
169 // return loginContext;
170 // }
171
172 protected Subject getSubject() {
173 return loginContext.getSubject();
174 }
175
176 @Override
177 public boolean isAnonymous() {
178 return CurrentUser.isAnonymous(getSubject());
179 }
180
181 @Override
182 public CmsImageManager getImageManager() {
183 // TODO Auto-generated method stub
184 return null;
185 }
186
187 @Override
188 public UxContext getUxContext() {
189 return uxContext;
190 }
191 }