]> git.argeo.org Git - lgpl/argeo-commons.git/blob - e4/rap/CmsLoginLifecycle.java
Prepare next development cycle
[lgpl/argeo-commons.git] / e4 / rap / CmsLoginLifecycle.java
1 package org.argeo.cms.e4.rap;
2
3 import java.security.AccessController;
4 import java.util.UUID;
5 import java.util.concurrent.Callable;
6
7 import javax.inject.Inject;
8 import javax.security.auth.Subject;
9 import javax.security.auth.login.LoginContext;
10 import javax.security.auth.login.LoginException;
11
12 import org.argeo.api.cms.CmsAuth;
13 import org.argeo.api.cms.CmsContext;
14 import org.argeo.api.cms.CmsLog;
15 import org.argeo.api.cms.ux.CmsImageManager;
16 import org.argeo.api.cms.ux.CmsView;
17 import org.argeo.api.cms.ux.UxContext;
18 import org.argeo.cms.auth.CurrentUser;
19 import org.argeo.cms.swt.CmsSwtUtils;
20 import org.argeo.cms.swt.SimpleSwtUxContext;
21 import org.argeo.cms.swt.acr.AcrSwtImageManager;
22 import org.argeo.cms.swt.auth.CmsLoginShell;
23 import org.argeo.cms.swt.dialogs.CmsFeedback;
24 import org.eclipse.e4.core.services.events.IEventBroker;
25 import org.eclipse.e4.ui.workbench.UIEvents;
26 import org.eclipse.e4.ui.workbench.lifecycle.PostContextCreate;
27 import org.eclipse.e4.ui.workbench.lifecycle.PreSave;
28 import org.eclipse.rap.rwt.RWT;
29 import org.eclipse.rap.rwt.client.service.BrowserNavigation;
30 import org.eclipse.rap.rwt.client.service.BrowserNavigationEvent;
31 import org.eclipse.rap.rwt.client.service.BrowserNavigationListener;
32 import org.eclipse.swt.widgets.Display;
33 import org.osgi.service.event.Event;
34 import org.osgi.service.event.EventHandler;
35
36 @SuppressWarnings("restriction")
37 public class CmsLoginLifecycle implements CmsView {
38 private final static CmsLog log = CmsLog.getLog(CmsLoginLifecycle.class);
39
40 @Inject
41 private CmsContext cmsContext;
42
43 private UxContext uxContext;
44 private CmsImageManager imageManager;
45
46 private LoginContext loginContext;
47 private BrowserNavigation browserNavigation;
48
49 private String state = null;
50 private String uid;
51
52 @PostContextCreate
53 boolean login(final IEventBroker eventBroker) {
54 uid = UUID.randomUUID().toString();
55 browserNavigation = RWT.getClient().getService(BrowserNavigation.class);
56 if (browserNavigation != null)
57 browserNavigation.addBrowserNavigationListener(new BrowserNavigationListener() {
58 private static final long serialVersionUID = -3668136623771902865L;
59
60 @Override
61 public void navigated(BrowserNavigationEvent event) {
62 state = event.getState();
63 if (uxContext != null)// is logged in
64 stateChanged();
65 }
66 });
67
68 Subject subject = Subject.getSubject(AccessController.getContext());
69 Display display = Display.getCurrent();
70 // UiContext.setData(CmsView.KEY, this);
71 CmsLoginShell loginShell = new CmsLoginShell(this, cmsContext);
72 CmsSwtUtils.registerCmsView(loginShell.getShell(), this);
73 loginShell.setSubject(subject);
74 try {
75 // try pre-auth
76 loginContext = new LoginContext(CmsAuth.LOGIN_CONTEXT_USER, subject, loginShell);
77 loginContext.login();
78 } catch (LoginException e) {
79 loginShell.createUi();
80 loginShell.open();
81
82 while (!loginShell.getShell().isDisposed()) {
83 if (!display.readAndDispatch())
84 display.sleep();
85 }
86 }
87 if (CurrentUser.getUsername(getSubject()) == null)
88 return false;
89 uxContext = new SimpleSwtUxContext();
90 imageManager = (CmsImageManager) new AcrSwtImageManager();
91
92 eventBroker.subscribe(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE, new EventHandler() {
93 @Override
94 public void handleEvent(Event event) {
95 startupComplete();
96 eventBroker.unsubscribe(this);
97 }
98 });
99
100 // lcs.changeApplicationLocale(Locale.FRENCH);
101 return true;
102 }
103
104 @PreSave
105 void destroy() {
106 // logout();
107 }
108
109 @Override
110 public UxContext getUxContext() {
111 return uxContext;
112 }
113
114 @Override
115 public void navigateTo(String state) {
116 browserNavigation.pushState(state, state);
117 }
118
119 @Override
120 public void authChange(LoginContext loginContext) {
121 if (loginContext == null)
122 throw new IllegalArgumentException("Login context cannot be null");
123 // logout previous login context
124 // if (this.loginContext != null)
125 // try {
126 // this.loginContext.logout();
127 // } catch (LoginException e1) {
128 // System.err.println("Could not log out: " + e1);
129 // }
130 this.loginContext = loginContext;
131 }
132
133 @Override
134 public void logout() {
135 if (loginContext == null)
136 throw new IllegalStateException("Login context should not be null");
137 try {
138 CurrentUser.logoutCmsSession(loginContext.getSubject());
139 loginContext.logout();
140 } catch (LoginException e) {
141 throw new IllegalStateException("Cannot log out", e);
142 }
143 }
144
145 @Override
146 public void exception(Throwable e) {
147 String msg = "Unexpected exception in Eclipse 4 RAP";
148 log.error(msg, e);
149 CmsFeedback.error(msg, e);
150 }
151
152 @Override
153 public CmsImageManager getImageManager() {
154 return imageManager;
155 }
156
157 protected Subject getSubject() {
158 return loginContext.getSubject();
159 }
160
161 @Override
162 public boolean isAnonymous() {
163 return CurrentUser.isAnonymous(getSubject());
164 }
165
166 @Override
167 public String getUid() {
168 return uid;
169 }
170
171 // CALLBACKS
172 protected void startupComplete() {
173 }
174
175 protected void stateChanged() {
176
177 }
178
179 // GETTERS
180 protected BrowserNavigation getBrowserNavigation() {
181 return browserNavigation;
182 }
183
184 protected String getState() {
185 return state;
186 }
187
188 @Override
189 public <T> T doAs(Callable<T> action) {
190 throw new UnsupportedOperationException();
191 }
192
193 }