]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.security.ui/src/org/argeo/security/ui/login/WorkbenchLogin.java
Make CMS login UI more extensible
[lgpl/argeo-commons.git] / org.argeo.security.ui / src / org / argeo / security / ui / login / WorkbenchLogin.java
index 6a4e879e247708710ff7debaea978338e0132e2c..2baedaf7731a24210d057814e381b85079cac889 100644 (file)
@@ -3,32 +3,48 @@ 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.util.UserMenu;
+import org.argeo.cms.auth.HttpRequestCallbackHandler;
+import org.argeo.cms.widgets.auth.CmsLoginShell;
+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;
-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 {
+                       // try pre-auth
+                       loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_USER,
+                                       subject, new HttpRequestCallbackHandler(getRequest()));
+                       loginContext.login();
+               } catch (CredentialNotFoundException e) {
+                       CmsLoginShell loginShell = createCmsLoginShell();
+                       loginShell.open();
+                       while (!loginShell.getShell().isDisposed()) {
+                               if (!display.readAndDispatch()) {
+                                       display.sleep();
+                               }
                        }
+               } catch (LoginException e) {
+                       throw new ArgeoException("Cannot log in", e);
                }
                //
                // RUN THE WORKBENCH
@@ -42,17 +58,25 @@ public abstract class WorkbenchLogin implements EntryPoint, CmsView {
                                        return new Integer(result);
                                }
                        });
+                       // explicit workbench closing
+                       logout();
                } finally {
                        display.dispose();
                }
                return returnCode;
-               // display.dispose();
-               // return 0;
        }
 
        protected abstract int createAndRunWorkbench(Display display,
                        String username);
 
+       protected HttpServletRequest getRequest() {
+               return UiContext.getHttpRequest();
+       }
+
+       protected CmsLoginShell createCmsLoginShell() {
+               return new CmsLoginShell(this);
+       }
+
        @Override
        public void navigateTo(String state) {
                // TODO Auto-generated method stub
@@ -60,7 +84,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
@@ -79,5 +115,4 @@ public abstract class WorkbenchLogin implements EntryPoint, CmsView {
                // TODO Auto-generated method stub
                return null;
        }
-
 }