Simplify authentication
[lgpl/argeo-commons.git] / org.argeo.security.ui / src / org / argeo / security / ui / login / WorkbenchLogin.java
index 6a4e879e247708710ff7debaea978338e0132e2c..0eee6745cbd4cf11380e55cb1061d2d1c521fec3 100644 (file)
@@ -3,11 +3,20 @@ package org.argeo.security.ui.login;
 import java.security.PrivilegedAction;
 
 import javax.security.auth.Subject;
+import javax.security.auth.login.CredentialNotFoundException;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+import javax.servlet.http.HttpServletRequest;
 
+import org.argeo.ArgeoException;
+import org.argeo.cms.CmsException;
 import org.argeo.cms.CmsImageManager;
 import org.argeo.cms.CmsView;
+import org.argeo.cms.auth.AuthConstants;
 import org.argeo.cms.auth.CurrentUser;
+import org.argeo.cms.auth.HttpRequestCallbackHandler;
 import org.argeo.cms.util.UserMenu;
+import org.argeo.eclipse.ui.specific.UiContext;
 import org.eclipse.rap.rwt.application.EntryPoint;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Display;
@@ -15,20 +24,31 @@ import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.PlatformUI;
 
 public abstract class WorkbenchLogin implements EntryPoint, CmsView {
+       // private final static Log log = LogFactory.getLog(WorkbenchLogin.class);
        private final Subject subject = new Subject();
+       private LoginContext loginContext;
 
        @Override
        public int createUI() {
                final Display display = PlatformUI.createDisplay();
-               display.setData(CmsView.KEY, this);
-               Shell shell = new Shell(display, SWT.NO_TRIM);
-               shell.setMaximized(true);
-               UserMenu userMenu = new UserMenu(shell, false);
-               shell.open();
-               while (!userMenu.getShell().isDisposed()) {
-                       if (!display.readAndDispatch()) {
-                               display.sleep();
+               UiContext.setData(CmsView.KEY, this);
+               try {
+                       loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_USER,
+                                       subject, new HttpRequestCallbackHandler(getRequest()));
+                       loginContext.login();
+               } catch (CredentialNotFoundException e) {
+                       Shell shell = new Shell(display, SWT.NO_TRIM);
+                       shell.setMaximized(true);
+                       //shell.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
+                       UserMenu userMenu = new UserMenu(shell, false);
+                       shell.open();
+                       while (!userMenu.getShell().isDisposed()) {
+                               if (!display.readAndDispatch()) {
+                                       display.sleep();
+                               }
                        }
+               } catch (LoginException e) {
+                       throw new ArgeoException("Cannot log in", e);
                }
                //
                // RUN THE WORKBENCH
@@ -45,14 +65,36 @@ public abstract class WorkbenchLogin implements EntryPoint, CmsView {
                } finally {
                        display.dispose();
                }
+               // explicit workbench closing
+               logout();
                return returnCode;
-               // display.dispose();
-               // return 0;
        }
 
        protected abstract int createAndRunWorkbench(Display display,
                        String username);
 
+       // private void fullLogout() {
+       // String username = CurrentUser.getUsername(subject);
+       // try {
+       // LoginContext loginContext = new LoginContext(
+       // AuthConstants.LOGIN_CONTEXT_USER, subject);
+       // loginContext.logout();
+       // HttpServletRequest httpRequest = getRequest();
+       // httpRequest.setAttribute(HttpContext.AUTHORIZATION, null);
+       // HttpSession httpSession = httpRequest.getSession();
+       // httpSession.setAttribute(HttpContext.AUTHORIZATION, null);
+       // httpSession.setMaxInactiveInterval(1);
+       // log.info("Logged out " + (username != null ? username : "")
+       // + " (THREAD=" + Thread.currentThread().getId() + ")");
+       // } catch (LoginException e) {
+       // log.error("Error when logging out", e);
+       // }
+       // }
+
+       protected HttpServletRequest getRequest() {
+               return UiContext.getHttpRequest();
+       }
+
        @Override
        public void navigateTo(String state) {
                // TODO Auto-generated method stub
@@ -60,7 +102,19 @@ public abstract class WorkbenchLogin implements EntryPoint, CmsView {
        }
 
        @Override
-       public void authChange() {
+       public void authChange(LoginContext loginContext) {
+               this.loginContext = loginContext;
+       }
+
+       @Override
+       public void logout() {
+               if (loginContext == null)
+                       throw new CmsException("Login context should not bet null");
+               try {
+                       loginContext.logout();
+               } catch (LoginException e) {
+                       throw new CmsException("Cannot log out", e);
+               }
        }
 
        @Override