Implement log out
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 19 Apr 2018 18:57:32 +0000 (20:57 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 19 Apr 2018 18:57:32 +0000 (20:57 +0200)
org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsE4EntryPointFactory.java
org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsLoginLifecycle.java
org.argeo.cms.e4/src/org/argeo/cms/e4/handlers/CloseWorkbench.java [new file with mode: 0644]

index 05eb7c3d03fb64fddf4366ea186ee67ab42cf077..e3490002dd3976cabe1e4bc0e67075e9856630a1 100644 (file)
@@ -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<Integer>() {
-
-                                               @Override
-                                               public Integer run() {
-//                                                     RWT.setLocale(Locale.FRENCH);
-                                                       System.out.println("createUI");
-                                                       return ep.createUI();
-                                               }
-
-                                       });
-//                             else
-//                                     return 1;
+                               return Subject.doAs(subject, new PrivilegedAction<Integer>() {
+
+                                       @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());
+       // }
+       // }
 }
index ed5c20985683cae6897f6dbe098dfa9f9701e17f..040dd50862e0e50828bd0d7a18b0c9466b6ba269 100644 (file)
@@ -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 (file)
index 0000000..1444ec3
--- /dev/null
@@ -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();
+       }
+}