]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/SecureEntryPoint.java
Work on authentication
[lgpl/argeo-commons.git] / org.argeo.security.ui.rap / src / org / argeo / security / ui / rap / SecureEntryPoint.java
index eec4d0bd0665e2ede831f23a0e23ac5b28046d04..6a582f83f75e948dc60b8fb9680e3aa9b49033a4 100644 (file)
@@ -15,7 +15,7 @@
  */
 package org.argeo.security.ui.rap;
 
-import static org.argeo.cms.KernelHeader.ACCESS_CONTROL_CONTEXT;
+import static org.argeo.cms.auth.AuthConstants.ACCESS_CONTROL_CONTEXT;
 
 import java.security.AccessControlContext;
 import java.security.AccessController;
@@ -23,7 +23,7 @@ import java.security.PrivilegedAction;
 
 import javax.security.auth.Subject;
 import javax.security.auth.callback.CallbackHandler;
-import javax.security.auth.login.CredentialNotFoundException;
+import javax.security.auth.login.FailedLoginException;
 import javax.security.auth.login.LoginContext;
 import javax.security.auth.login.LoginException;
 import javax.security.auth.x500.X500Principal;
@@ -33,8 +33,7 @@ import javax.servlet.http.HttpSession;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.ArgeoException;
-import org.argeo.cms.KernelHeader;
-import org.argeo.cms.auth.ArgeoLoginContext;
+import org.argeo.cms.auth.AuthConstants;
 import org.argeo.cms.widgets.auth.DefaultLoginDialog;
 import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
 import org.argeo.util.LocaleUtils;
@@ -43,7 +42,6 @@ import org.eclipse.rap.rwt.RWT;
 import org.eclipse.rap.rwt.application.EntryPoint;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.PlatformUI;
-import org.springframework.security.authentication.BadCredentialsException;
 
 /**
  * RAP entry point with login capabilities. Once the user has been
@@ -79,7 +77,7 @@ public class SecureEntryPoint implements EntryPoint {
                HttpServletRequest httpRequest = RWT.getRequest();
                final HttpSession httpSession = httpRequest.getSession();
                AccessControlContext acc = (AccessControlContext) httpSession
-                               .getAttribute(KernelHeader.ACCESS_CONTROL_CONTEXT);
+                               .getAttribute(AuthConstants.ACCESS_CONTROL_CONTEXT);
 
                final Subject subject;
                if (acc != null
@@ -93,8 +91,8 @@ public class SecureEntryPoint implements EntryPoint {
                        try {
                                CallbackHandler callbackHandler = new DefaultLoginDialog(
                                                display.getActiveShell());
-                               loginContext = new ArgeoLoginContext(
-                                               KernelHeader.LOGIN_CONTEXT_USER, subject,
+                               loginContext = new LoginContext(
+                                               AuthConstants.LOGIN_CONTEXT_USER, subject,
                                                callbackHandler);
                        } catch (LoginException e1) {
                                throw new ArgeoException("Cannot initialize login context", e1);
@@ -117,14 +115,12 @@ public class SecureEntryPoint implements EntryPoint {
 
                                        if (log.isDebugEnabled())
                                                log.debug("Authenticated " + subject);
+                               } catch (FailedLoginException e) {
+                                       MessageDialog.openInformation(display.getActiveShell(),
+                                                       "Bad Credentials", e.getMessage());
+                                       // retry login
+                                       continue tryLogin;
                                } catch (LoginException e) {
-                                       BadCredentialsException bce = wasCausedByBadCredentials(e);
-                                       if (bce != null) {
-                                               MessageDialog.openInformation(display.getActiveShell(),
-                                                               "Bad Credentials", bce.getMessage());
-                                               // retry login
-                                               continue tryLogin;
-                                       }
                                        return processLoginDeath(display, e);
                                }
                        }
@@ -137,8 +133,8 @@ public class SecureEntryPoint implements EntryPoint {
                                if (log.isTraceEnabled())
                                        log.trace("Display disposed");
                                try {
-                                       LoginContext loginContext = new ArgeoLoginContext(
-                                                       KernelHeader.LOGIN_CONTEXT_USER, subject);
+                                       LoginContext loginContext = new LoginContext(
+                                                       AuthConstants.LOGIN_CONTEXT_USER, subject);
                                        loginContext.logout();
                                } catch (LoginException e) {
                                        log.error("Error when logging out", e);
@@ -192,20 +188,6 @@ public class SecureEntryPoint implements EntryPoint {
 
        }
 
-       /** Recursively look for {@link BadCredentialsException} in the root causes. */
-       private BadCredentialsException wasCausedByBadCredentials(Throwable t) {
-               if (t instanceof BadCredentialsException)
-                       return (BadCredentialsException) t;
-
-               if (t instanceof CredentialNotFoundException)
-                       return new BadCredentialsException("Login canceled");
-
-               if (t.getCause() != null)
-                       return wasCausedByBadCredentials(t.getCause());
-               else
-                       return null;
-       }
-
        /**
         * If there is a {@link ThreadDeath} in the root causes, rethrow it
         * (important for RAP cleaning mechanism)
@@ -222,8 +204,8 @@ public class SecureEntryPoint implements EntryPoint {
 
        private void fullLogout(Subject subject, String username) {
                try {
-                       LoginContext loginContext = new ArgeoLoginContext(
-                                       KernelHeader.LOGIN_CONTEXT_USER, subject);
+                       LoginContext loginContext = new LoginContext(
+                                       AuthConstants.LOGIN_CONTEXT_USER, subject);
                        loginContext.logout();
                        HttpServletRequest httpRequest = RWT.getRequest();
                        HttpSession httpSession = httpRequest.getSession();