]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.security.ui.rap/src/org/argeo/security/ui/rap/SecureEntryPoint.java
Improve and simplify OSGi Boot
[lgpl/argeo-commons.git] / org.argeo.security.ui.rap / src / org / argeo / security / ui / rap / SecureEntryPoint.java
index c176ba62b59fc4d4e13372cfc50e870a140b2046..a681527f773e67663c0150576d67324a267a6c09 100644 (file)
@@ -20,7 +20,7 @@ import java.security.AccessController;
 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;
@@ -30,11 +30,11 @@ 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.CmsException;
 import org.argeo.cms.auth.AuthConstants;
+import org.argeo.cms.auth.ThreadDeathLoginException;
 import org.argeo.cms.widgets.auth.DefaultLoginDialog;
 import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
-import org.argeo.util.LocaleUtils;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.rap.rwt.application.EntryPoint;
@@ -46,6 +46,7 @@ import org.eclipse.ui.PlatformUI;
  * authenticated, the workbench is run as a privileged action by the related
  * subject.
  */
+@Deprecated
 public class SecureEntryPoint implements EntryPoint {
        final static String ACCESS_CONTROL_CONTEXT = "org.argeo.node.accessControlContext";
        private final static Log log = LogFactory.getLog(SecureEntryPoint.class);
@@ -87,26 +88,27 @@ public class SecureEntryPoint implements EntryPoint {
                        subject = new Subject();
 
                        final LoginContext loginContext;
+                       DefaultLoginDialog callbackHandler;
                        try {
-                               CallbackHandler callbackHandler = new DefaultLoginDialog(
+                               callbackHandler = new DefaultLoginDialog(
                                                display.getActiveShell());
                                loginContext = new LoginContext(
                                                AuthConstants.LOGIN_CONTEXT_USER, subject,
                                                callbackHandler);
                        } catch (LoginException e1) {
-                               throw new ArgeoException("Cannot initialize login context", e1);
+                               throw new CmsException("Cannot initialize login context", e1);
                        }
 
                        tryLogin: while (subject.getPrincipals(X500Principal.class).size() == 0) {
                                try {
                                        loginContext.login();
                                        if (subject.getPrincipals(X500Principal.class).size() == 0)
-                                               throw new ArgeoException("Login succeeded but no auth");// fatal
+                                               throw new CmsException("Login succeeded but no auth");// fatal
 
                                        // add thread locale to RWT session
-                                       if (log.isTraceEnabled())
-                                               log.trace("Locale " + LocaleUtils.threadLocale.get());
-                                       RWT.setLocale(LocaleUtils.threadLocale.get());
+                                       // if (log.isTraceEnabled())
+                                       // log.trace("Locale " + LocaleUtils.threadLocale.get());
+                                       // RWT.setLocale(LocaleUtils.threadLocale.get());
 
                                        // once the user is logged in, longer session timeout
                                        RWT.getRequest().getSession()
@@ -119,7 +121,13 @@ public class SecureEntryPoint implements EntryPoint {
                                                        "Bad Credentials", e.getMessage());
                                        // retry login
                                        continue tryLogin;
+                               } catch (CredentialNotFoundException e) {
+                                       MessageDialog.openInformation(display.getActiveShell(),
+                                                       "No Credentials", e.getMessage());
+                                       // retry login
+                                       continue tryLogin;
                                } catch (LoginException e) {
+                                       callbackHandler.getShell().dispose();
                                        return processLoginDeath(display, e);
                                }
                        }
@@ -167,7 +175,7 @@ public class SecureEntryPoint implements EntryPoint {
                return returnCode;
        }
 
-       private Integer processLoginDeath(Display display, LoginException e) {
+       private Integer processLoginDeath(Display display, Throwable e) {
                // check thread death
                ThreadDeath td = wasCausedByThreadDeath(e);
                if (td != null) {
@@ -181,7 +189,7 @@ public class SecureEntryPoint implements EntryPoint {
                        display.dispose();
                        return -1;
                } else {
-                       throw new ArgeoException(
+                       throw new CmsException(
                                        "Unexpected exception during authentication", e);
                }
 
@@ -194,7 +202,8 @@ public class SecureEntryPoint implements EntryPoint {
        protected ThreadDeath wasCausedByThreadDeath(Throwable t) {
                if (t instanceof ThreadDeath)
                        return (ThreadDeath) t;
-
+               if (t instanceof ThreadDeathLoginException)
+                       return ((ThreadDeathLoginException) t).getThreadDeath();
                if (t.getCause() != null)
                        return wasCausedByThreadDeath(t.getCause());
                else