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