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