From 2b13afb8406502547a911cba84fb1b8f40282e46 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 19 Apr 2018 20:57:32 +0200 Subject: [PATCH] Implement log out --- .../cms/e4/rap/CmsE4EntryPointFactory.java | 242 +++++++++--------- .../argeo/cms/e4/rap/CmsLoginLifecycle.java | 16 +- .../argeo/cms/e4/handlers/CloseWorkbench.java | 11 + 3 files changed, 145 insertions(+), 124 deletions(-) create mode 100644 org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/CloseWorkbench.java diff --git a/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsE4EntryPointFactory.java b/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsE4EntryPointFactory.java index 05eb7c3d0..e3490002d 100644 --- a/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsE4EntryPointFactory.java +++ b/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsE4EntryPointFactory.java @@ -3,21 +3,12 @@ package org.argeo.cms.e4.rap; import java.security.PrivilegedAction; import javax.security.auth.Subject; -import javax.security.auth.login.LoginContext; -import javax.security.auth.login.LoginException; -import org.argeo.cms.CmsException; -import org.argeo.cms.auth.CurrentUser; -import org.argeo.cms.ui.CmsImageManager; -import org.argeo.cms.ui.CmsView; -import org.argeo.cms.ui.UxContext; -import org.argeo.cms.util.SimpleUxContext; -import org.argeo.cms.widgets.auth.CmsLoginShell; -import org.argeo.node.NodeConstants; import org.eclipse.rap.e4.E4ApplicationConfig; import org.eclipse.rap.e4.E4EntryPointFactory; +import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.rwt.application.EntryPoint; -import org.eclipse.swt.widgets.Display; +import org.eclipse.rap.rwt.client.service.JavaScriptExecutor; public class CmsE4EntryPointFactory extends E4EntryPointFactory { @@ -27,27 +18,39 @@ public class CmsE4EntryPointFactory extends E4EntryPointFactory { @Override public EntryPoint create() { - // Subject subject = new Subject(); EntryPoint ep = createEntryPoint(); EntryPoint authEp = new EntryPoint() { @Override public int createUI() { Subject subject = new Subject(); -// boolean success = login(subject); -// if (success) - return Subject.doAs(subject, new PrivilegedAction() { - - @Override - public Integer run() { -// RWT.setLocale(Locale.FRENCH); - System.out.println("createUI"); - return ep.createUI(); - } - - }); -// else -// return 1; + return Subject.doAs(subject, new PrivilegedAction() { + + @Override + public Integer run() { + // SPNEGO + // HttpServletRequest request = RWT.getRequest(); + // String authorization = request.getHeader(HEADER_AUTHORIZATION); + // if (authorization == null || !authorization.startsWith("Negotiate")) { + // HttpServletResponse response = RWT.getResponse(); + // response.setStatus(401); + // response.setHeader(HEADER_WWW_AUTHENTICATE, "Negotiate"); + // response.setDateHeader("Date", System.currentTimeMillis()); + // response.setDateHeader("Expires", System.currentTimeMillis() + (24 * 60 * 60 + // * 1000)); + // response.setHeader("Accept-Ranges", "bytes"); + // response.setHeader("Connection", "Keep-Alive"); + // response.setHeader("Keep-Alive", "timeout=5, max=97"); + // // response.setContentType("text/html; charset=UTF-8"); + // } + + JavaScriptExecutor jsExecutor = RWT.getClient().getService(JavaScriptExecutor.class); + Integer exitCode = ep.createUI(); + jsExecutor.execute("location.reload()"); + return exitCode; + } + + }); } }; return authEp; @@ -57,98 +60,97 @@ public class CmsE4EntryPointFactory extends E4EntryPointFactory { return super.create(); } - boolean login(Subject subject) { - // Subject subject = Subject.getSubject(AccessController.getContext()); - Display display = new Display(); - CmsView cmsView = new E4CmsView(subject); - CmsLoginShell loginShell = new CmsLoginShell(cmsView); - loginShell.setSubject(subject); - try { - // try pre-auth - LoginContext loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, subject, loginShell); - loginContext.login(); - } catch (LoginException e) { - loginShell.createUi(); - loginShell.open(); - - while (!loginShell.getShell().isDisposed()) { - if (!display.readAndDispatch()) - display.sleep(); - } - } finally { - display.dispose(); - } - if (CurrentUser.getUsername(subject) == null) - return false; - return true; - } - - class E4CmsView implements CmsView { - private LoginContext loginContext; - private UxContext uxContext; - private Subject subject; - - public E4CmsView(Subject subject) { - this.subject = subject; - uxContext = new SimpleUxContext(); - } - - @Override - public UxContext getUxContext() { - return uxContext; - } - - @Override - public void navigateTo(String state) { - // TODO Auto-generated method stub - - } - - @Override - public void authChange(LoginContext loginContext) { - if (loginContext == null) - throw new CmsException("Login context cannot be null"); - // logout previous login context - // if (this.loginContext != null) - // try { - // this.loginContext.logout(); - // } catch (LoginException e1) { - // System.err.println("Could not log out: " + e1); - // } - this.loginContext = loginContext; - } - - @Override - public void logout() { - if (loginContext == null) - throw new CmsException("Login context should not bet null"); - try { - CurrentUser.logoutCmsSession(loginContext.getSubject()); - loginContext.logout(); - } catch (LoginException e) { - throw new CmsException("Cannot log out", e); - } - } - - @Override - public void exception(Throwable e) { - // TODO Auto-generated method stub - - } - - @Override - public CmsImageManager getImageManager() { - // TODO Auto-generated method stub - return null; - } - - protected Subject getSubject() { - return subject; - } - - @Override - public boolean isAnonymous() { - return CurrentUser.isAnonymous(getSubject()); - } - } + // private boolean login(Subject subject) { + // Display display = new Display(); + // CmsView cmsView = new E4CmsView(subject); + // CmsLoginShell loginShell = new CmsLoginShell(cmsView); + // loginShell.setSubject(subject); + // try { + // // try pre-auth + // LoginContext loginContext = new + // LoginContext(NodeConstants.LOGIN_CONTEXT_USER, subject, loginShell); + // loginContext.login(); + // } catch (LoginException e) { + // loginShell.createUi(); + // loginShell.open(); + // + // while (!loginShell.getShell().isDisposed()) { + // if (!display.readAndDispatch()) + // display.sleep(); + // } + // } finally { + // display.dispose(); + // } + // if (CurrentUser.getUsername(subject) == null) + // return false; + // return true; + // } + // + // private class E4CmsView implements CmsView { + // private LoginContext loginContext; + // private UxContext uxContext; + // private Subject subject; + // + // public E4CmsView(Subject subject) { + // this.subject = subject; + // uxContext = new SimpleUxContext(); + // } + // + // @Override + // public UxContext getUxContext() { + // return uxContext; + // } + // + // @Override + // public void navigateTo(String state) { + // // TODO Auto-generated method stub + // + // } + // + // @Override + // public void authChange(LoginContext loginContext) { + // if (loginContext == null) + // throw new CmsException("Login context cannot be null"); + // // logout previous login context + // // if (this.loginContext != null) + // // try { + // // this.loginContext.logout(); + // // } catch (LoginException e1) { + // // System.err.println("Could not log out: " + e1); + // // } + // this.loginContext = loginContext; + // } + // + // @Override + // public void logout() { + // if (loginContext == null) + // throw new CmsException("Login context should not bet null"); + // try { + // CurrentUser.logoutCmsSession(loginContext.getSubject()); + // loginContext.logout(); + // } catch (LoginException e) { + // throw new CmsException("Cannot log out", e); + // } + // } + // + // @Override + // public void exception(Throwable e) { + // log.error("Unexpected exception in Eclipse 4 RAP", e); + // } + // + // @Override + // public CmsImageManager getImageManager() { + // // TODO Auto-generated method stub + // return null; + // } + // + // protected Subject getSubject() { + // return subject; + // } + // + // @Override + // public boolean isAnonymous() { + // return CurrentUser.isAnonymous(getSubject()); + // } + // } } diff --git a/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsLoginLifecycle.java b/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsLoginLifecycle.java index ed5c20985..040dd5086 100644 --- a/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsLoginLifecycle.java +++ b/org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsLoginLifecycle.java @@ -6,6 +6,8 @@ import javax.security.auth.Subject; import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.argeo.cms.CmsException; import org.argeo.cms.auth.CurrentUser; import org.argeo.cms.ui.CmsImageManager; @@ -15,10 +17,12 @@ import org.argeo.cms.util.SimpleUxContext; import org.argeo.cms.widgets.auth.CmsLoginShell; import org.argeo.node.NodeConstants; import org.eclipse.e4.ui.workbench.lifecycle.PostContextCreate; +import org.eclipse.e4.ui.workbench.lifecycle.PreSave; import org.eclipse.swt.widgets.Display; @SuppressWarnings("restriction") public class CmsLoginLifecycle implements CmsView { + private final static Log log = LogFactory.getLog(CmsLoginLifecycle.class); private UxContext uxContext; private LoginContext loginContext; @@ -44,11 +48,16 @@ public class CmsLoginLifecycle implements CmsView { if (CurrentUser.getUsername(getSubject()) == null) return false; uxContext = new SimpleUxContext(); - - //lcs.changeApplicationLocale(Locale.FRENCH); + + // lcs.changeApplicationLocale(Locale.FRENCH); return true; } + @PreSave + void destroy() { + logout(); + } + @Override public UxContext getUxContext() { return uxContext; @@ -88,8 +97,7 @@ public class CmsLoginLifecycle implements CmsView { @Override public void exception(Throwable e) { - // TODO Auto-generated method stub - + log.error("Unexpected exception in Eclipse 4 RAP", e); } @Override diff --git a/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/CloseWorkbench.java b/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/CloseWorkbench.java new file mode 100644 index 000000000..1444ec365 --- /dev/null +++ b/org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/CloseWorkbench.java @@ -0,0 +1,11 @@ +package org.argeo.cms.e4.handlers; + +import org.eclipse.e4.core.di.annotations.Execute; +import org.eclipse.e4.ui.workbench.IWorkbench; + +public class CloseWorkbench { + @Execute + public void execute(IWorkbench workbench) { + workbench.close(); + } +} -- 2.30.2