View Javadoc
1   package org.argeo.cms.e4.rap;
2   
3   import java.security.AccessController;
4   
5   import javax.security.auth.Subject;
6   import javax.security.auth.login.LoginContext;
7   import javax.security.auth.login.LoginException;
8   
9   import org.apache.commons.logging.Log;
10  import org.apache.commons.logging.LogFactory;
11  import org.argeo.api.NodeConstants;
12  import org.argeo.cms.CmsException;
13  import org.argeo.cms.auth.CurrentUser;
14  import org.argeo.cms.ui.CmsImageManager;
15  import org.argeo.cms.ui.CmsView;
16  import org.argeo.cms.ui.UxContext;
17  import org.argeo.cms.ui.dialogs.CmsFeedback;
18  import org.argeo.cms.ui.util.SimpleImageManager;
19  import org.argeo.cms.ui.util.SimpleUxContext;
20  import org.argeo.cms.ui.widgets.auth.CmsLoginShell;
21  import org.argeo.eclipse.ui.specific.UiContext;
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  
46  	@PostContextCreate
47  	boolean login(final IEventBroker eventBroker) {
48  		browserNavigation = RWT.getClient().getService(BrowserNavigation.class);
49  		if (browserNavigation != null)
50  			browserNavigation.addBrowserNavigationListener(new BrowserNavigationListener() {
51  				private static final long serialVersionUID = -3668136623771902865L;
52  
53  				@Override
54  				public void navigated(BrowserNavigationEvent event) {
55  					state = event.getState();
56  					if (uxContext != null)// is logged in
57  						stateChanged();
58  				}
59  			});
60  
61  		Subject subject = Subject.getSubject(AccessController.getContext());
62  		Display display = Display.getCurrent();
63  		UiContext.setData(CmsView.KEY, this);
64  		CmsLoginShell loginShell = new CmsLoginShell(this);
65  		loginShell.setSubject(subject);
66  		try {
67  			// try pre-auth
68  			loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, subject, loginShell);
69  			loginContext.login();
70  		} catch (LoginException e) {
71  			loginShell.createUi();
72  			loginShell.open();
73  
74  			while (!loginShell.getShell().isDisposed()) {
75  				if (!display.readAndDispatch())
76  					display.sleep();
77  			}
78  		}
79  		if (CurrentUser.getUsername(getSubject()) == null)
80  			return false;
81  		uxContext = new SimpleUxContext();
82  		imageManager = new SimpleImageManager();
83  
84  		eventBroker.subscribe(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE, new EventHandler() {
85  			@Override
86  			public void handleEvent(Event event) {
87  				startupComplete();
88  				eventBroker.unsubscribe(this);
89  			}
90  		});
91  
92  		// lcs.changeApplicationLocale(Locale.FRENCH);
93  		return true;
94  	}
95  
96  	@PreSave
97  	void destroy() {
98  		// logout();
99  	}
100 
101 	@Override
102 	public UxContext getUxContext() {
103 		return uxContext;
104 	}
105 
106 	@Override
107 	public void navigateTo(String state) {
108 		browserNavigation.pushState(state, state);
109 	}
110 
111 	@Override
112 	public void authChange(LoginContext loginContext) {
113 		if (loginContext == null)
114 			throw new CmsException("Login context cannot be null");
115 		// logout previous login context
116 		// if (this.loginContext != null)
117 		// try {
118 		// this.loginContext.logout();
119 		// } catch (LoginException e1) {
120 		// System.err.println("Could not log out: " + e1);
121 		// }
122 		this.loginContext = loginContext;
123 	}
124 
125 	@Override
126 	public void logout() {
127 		if (loginContext == null)
128 			throw new CmsException("Login context should not be null");
129 		try {
130 			CurrentUser.logoutCmsSession(loginContext.getSubject());
131 			loginContext.logout();
132 		} catch (LoginException e) {
133 			throw new CmsException("Cannot log out", e);
134 		}
135 	}
136 
137 	@Override
138 	public void exception(Throwable e) {
139 		String msg = "Unexpected exception in Eclipse 4 RAP";
140 		log.error(msg, e);
141 		CmsFeedback.show(msg, e);
142 	}
143 
144 	@Override
145 	public CmsImageManager getImageManager() {
146 		return imageManager;
147 	}
148 
149 	protected Subject getSubject() {
150 		return loginContext.getSubject();
151 	}
152 
153 	@Override
154 	public boolean isAnonymous() {
155 		return CurrentUser.isAnonymous(getSubject());
156 	}
157 
158 	// CALLBACKS
159 	protected void startupComplete() {
160 	}
161 
162 	protected void stateChanged() {
163 
164 	}
165 
166 	// GETTERS
167 	protected BrowserNavigation getBrowserNavigation() {
168 		return browserNavigation;
169 	}
170 
171 	protected String getState() {
172 		return state;
173 	}
174 
175 }