Author: robbie
Date: Wed Nov 28 18:53:54 2012
New Revision: 1414862

URL: http://svn.apache.org/viewvc?rev=1414862&view=rev
Log:
QPID-4476: ensure that the Principal in the AuthenticationResult has the same 
format (the username) in both sasl and non-sasl cases, reworking handling of 
authentication success/failure/error to improve user experience slightly

merged from trunk r1414257

Modified:
    qpid/branches/0.20/qpid/java/broker/src/   (props changed)
    
qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_1_0.java
   (props changed)
    
qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0.java
   (props changed)
    
qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0_SASL.java
   (props changed)
    
qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/
   (props changed)
    
qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ 
  (props changed)
    
qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleLDAPAuthenticationManager.java
    
qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/
   (props changed)

Propchange: qpid/branches/0.20/qpid/java/broker/src/
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Wed Nov 28 18:53:54 2012
@@ -0,0 +1,6 @@
+/qpid/branches/0.5.x-dev/qpid/java/broker/src:886720-886722,887145,892761,930288
+/qpid/branches/java-broker-0-10/qpid/java/broker/src:795950-829653
+/qpid/branches/java-network-refactor/qpid/java/broker/src:805429-821809
+/qpid/branches/jmx_mc_gsoc09/qpid/java/broker/src:787599
+/qpid/branches/qpid-2935/qpid/java/broker/src:1061302-1072333
+/qpid/trunk/qpid/java/broker/src:742626,743015,743028-743029,743304,743306,743311,743357,744113,747363,747367,747369-747370,747376,747783,747868-747870,747875,748561,748591,748641,748680,748686,749149,749282,749285,749315,749340,749572,753219-753220,753253,754934,754958,755256,757258,757270,758730,759097,760919,761721,762365,762992,763959,764026,764109,764140,764790,1412359,1414257

Propchange: 
qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_1_0.java
------------------------------------------------------------------------------
  Merged 
/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/message/MessageMetaData_1_0.java:r1414257

Propchange: 
qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0.java
------------------------------------------------------------------------------
  Merged 
/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0.java:r1414257

Propchange: 
qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0_SASL.java
------------------------------------------------------------------------------
  Merged 
/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/ProtocolEngine_1_0_0_SASL.java:r1414257

Propchange: 
qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0/
------------------------------------------------------------------------------
  Merged 
/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/v1_0:r1414257

Propchange: 
qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/
------------------------------------------------------------------------------
  Merged 
/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/queue:r1414257

Modified: 
qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleLDAPAuthenticationManager.java
URL: 
http://svn.apache.org/viewvc/qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleLDAPAuthenticationManager.java?rev=1414862&r1=1414861&r2=1414862&view=diff
==============================================================================
--- 
qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleLDAPAuthenticationManager.java
 (original)
+++ 
qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleLDAPAuthenticationManager.java
 Wed Nov 28 18:53:54 2012
@@ -23,6 +23,8 @@ import java.io.IOException;
 import java.security.Principal;
 import java.util.HashMap;
 import java.util.Hashtable;
+
+import javax.naming.AuthenticationException;
 import javax.naming.Context;
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
@@ -40,6 +42,7 @@ import javax.security.sasl.SaslException
 import javax.security.sasl.SaslServer;
 import org.apache.log4j.Logger;
 import org.apache.qpid.server.security.auth.AuthenticationResult;
+import 
org.apache.qpid.server.security.auth.AuthenticationResult.AuthenticationStatus;
 import org.apache.qpid.server.security.auth.UsernamePrincipal;
 import org.apache.qpid.server.security.auth.sasl.plain.PlainPasswordCallback;
 
@@ -119,33 +122,74 @@ public class SimpleLDAPAuthenticationMan
     @Override
     public AuthenticationResult authenticate(String username, String password)
     {
-
         try
         {
-            return doLDAPNameAuthentication(getNameFromId(username), password);
+            AuthenticationResult result = 
doLDAPNameAuthentication(getNameFromId(username), password);
+            if(result.getStatus() == AuthenticationStatus.SUCCESS)
+            {
+                //Return a result based on the supplied username rather than 
the search name
+                return new AuthenticationResult(new 
UsernamePrincipal(username));
+            }
+            else
+            {
+                return result;
+            }
         }
         catch (NamingException e)
         {
-
             return new 
AuthenticationResult(AuthenticationResult.AuthenticationStatus.ERROR, e);
-
         }
     }
 
-    private AuthenticationResult doLDAPNameAuthentication(String username, 
String password) throws NamingException
+    private AuthenticationResult doLDAPNameAuthentication(String name, String 
password)
     {
+        if(name == null)
+        {
+            //The search didn't return anything, class as not-authenticated 
before it NPEs below
+            return new AuthenticationResult(AuthenticationStatus.CONTINUE);
+        }
+
         Hashtable<Object,Object> env = new Hashtable<Object,Object>();
         env.put(Context.INITIAL_CONTEXT_FACTORY, _ldapContextFactory);
         env.put(Context.PROVIDER_URL, _providerAuthURL);
 
         env.put(Context.SECURITY_AUTHENTICATION, "simple");
 
-        env.put(Context.SECURITY_PRINCIPAL, username);
+        env.put(Context.SECURITY_PRINCIPAL, name);
         env.put(Context.SECURITY_CREDENTIALS, password);
-        DirContext ctx = new InitialDirContext(env);
-        ctx.close();
 
-        return new AuthenticationResult(new UsernamePrincipal(username));
+        DirContext ctx = null;
+        try
+        {
+            ctx = new InitialDirContext(env);
+
+            //Authentication succeeded
+            return new AuthenticationResult(new UsernamePrincipal(name));
+        }
+        catch(AuthenticationException ae)
+        {
+            //Authentication failed
+            return new AuthenticationResult(AuthenticationStatus.CONTINUE);
+        }
+        catch (NamingException e)
+        {
+            //Some other failure
+            return new 
AuthenticationResult(AuthenticationResult.AuthenticationStatus.ERROR, e);
+        }
+        finally
+        {
+            if(ctx != null)
+            {
+                try
+                {
+                    ctx.close();
+                }
+                catch (Exception e)
+                {
+                    _logger.warn("Exception closing InitialDirContext", e);
+                }
+            }
+        }
     }
 
     @Override
@@ -190,19 +234,11 @@ public class SimpleLDAPAuthenticationMan
                     }
                     catch (NamingException e)
                     {
-                        _logger.info("SASL Authentication Error", e);
+                        _logger.warn("SASL Authentication Exception", e);
                     }
                     if(password != null)
                     {
-                        try
-                        {
-                            authenticated = doLDAPNameAuthentication(name, 
password);
-
-                        }
-                        catch (NamingException e)
-                        {
-                            authenticated = new 
AuthenticationResult(AuthenticationResult.AuthenticationStatus.ERROR, e);
-                        }
+                        authenticated = doLDAPNameAuthentication(name, 
password);
                     }
                 }
                 else if (callback instanceof PlainPasswordCallback)
@@ -210,17 +246,10 @@ public class SimpleLDAPAuthenticationMan
                     password = 
((PlainPasswordCallback)callback).getPlainPassword();
                     if(name != null)
                     {
-                        try
-                        {
-                            authenticated = doLDAPNameAuthentication(name, 
password);
-                            if(authenticated.getStatus()== 
AuthenticationResult.AuthenticationStatus.SUCCESS)
-                            {
-                                
((PlainPasswordCallback)callback).setAuthenticated(true);
-                            }
-                        }
-                        catch (NamingException e)
+                        authenticated = doLDAPNameAuthentication(name, 
password);
+                        if(authenticated.getStatus()== 
AuthenticationResult.AuthenticationStatus.SUCCESS)
                         {
-                            authenticated = new 
AuthenticationResult(AuthenticationResult.AuthenticationStatus.ERROR, e);
+                            
((PlainPasswordCallback)callback).setAuthenticated(true);
                         }
                     }
                 }
@@ -242,7 +271,6 @@ public class SimpleLDAPAuthenticationMan
         env.put(Context.INITIAL_CONTEXT_FACTORY, _ldapContextFactory);
         env.put(Context.PROVIDER_URL, _providerSearchURL);
 
-
         env.put(Context.SECURITY_AUTHENTICATION, "none");
         DirContext ctx = null;
 
@@ -267,7 +295,14 @@ public class SimpleLDAPAuthenticationMan
         }
         finally
         {
-            ctx.close();
+            try
+            {
+                ctx.close();
+            }
+            catch (Exception e)
+            {
+                _logger.warn("Exception closing InitialDirContext", e);
+            }
         }
 
     }

Propchange: 
qpid/branches/0.20/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/
------------------------------------------------------------------------------
  Merged 
/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost:r1414257



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to