From 177d96876fb8d25d9aad3a7c5f9ad0d800b7d260 Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Sun, 13 May 2007 23:03:30 +0000 Subject: * QPID-486 Choose strongest SASL Mechanism first * Remove unnecessary wrapping of AMQExceptions on connection failure git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/branches/M2@537673 13f79535-47bb-0310-9956-ffa450edef68 --- dotnet/Qpid.Client/Client/AMQConnection.cs | 5 ++++- .../AuthenticationConfigurationSectionHandler.cs | 24 ++++++++++++++++++++-- .../Client/Handler/ConnectionStartMethodHandler.cs | 9 +------- .../Client/Security/CallbackHandlerRegistry.cs | 21 ++++++++++++++----- 4 files changed, 43 insertions(+), 16 deletions(-) (limited to 'dotnet/Qpid.Client') diff --git a/dotnet/Qpid.Client/Client/AMQConnection.cs b/dotnet/Qpid.Client/Client/AMQConnection.cs index da8498f938..4498ba3a32 100644 --- a/dotnet/Qpid.Client/Client/AMQConnection.cs +++ b/dotnet/Qpid.Client/Client/AMQConnection.cs @@ -157,7 +157,10 @@ namespace Qpid.Client if (!_failoverPolicy.FailoverAllowed()) { - throw new AMQConnectionException("Unable to connect", lastException); + if ( lastException is AMQException ) + throw lastException; + else + throw new AMQConnectionException("Unable to connect", lastException); } // TODO: this needs to be redone so that we are not spinning. diff --git a/dotnet/Qpid.Client/Client/Configuration/AuthenticationConfigurationSectionHandler.cs b/dotnet/Qpid.Client/Client/Configuration/AuthenticationConfigurationSectionHandler.cs index 54ee2c6660..0d1fb73c31 100644 --- a/dotnet/Qpid.Client/Client/Configuration/AuthenticationConfigurationSectionHandler.cs +++ b/dotnet/Qpid.Client/Client/Configuration/AuthenticationConfigurationSectionHandler.cs @@ -37,7 +37,7 @@ namespace Qpid.Client.Configuration public object Create(object parent, object configContext, System.Xml.XmlNode section) { NameValueSectionHandler handler = new NameValueSectionHandler(); - IDictionary schemes = new Hashtable(); + OrderedHashTable schemes = new OrderedHashTable(); NameValueCollection options = (NameValueCollection) handler.Create(parent, configContext, section); @@ -52,7 +52,7 @@ namespace Qpid.Client.Configuration if ( !typeof(IAMQCallbackHandler).IsAssignableFrom(type) ) throw new ConfigurationException(string.Format("Type '{0}' does not implement IAMQCallbackHandler", key)); - schemes[key] = type; + schemes.Add(key, type); } } @@ -61,4 +61,24 @@ namespace Qpid.Client.Configuration } // class AuthenticationConfigurationSectionHandler + public class OrderedHashTable : Hashtable + { + private ArrayList _keys = new ArrayList(); + + public IList OrderedKeys + { + get { return _keys; } + } + + public override void Add(object key, object value) + { + base.Add(key, value); + _keys.Add(key); + } + public override void Remove(object key) + { + base.Remove(key); + _keys.Remove(key); + } + } } // namespace Qpid.Client.Configuration diff --git a/dotnet/Qpid.Client/Client/Handler/ConnectionStartMethodHandler.cs b/dotnet/Qpid.Client/Client/Handler/ConnectionStartMethodHandler.cs index 1815bea152..99ee7e2587 100644 --- a/dotnet/Qpid.Client/Client/Handler/ConnectionStartMethodHandler.cs +++ b/dotnet/Qpid.Client/Client/Handler/ConnectionStartMethodHandler.cs @@ -103,14 +103,7 @@ namespace Qpid.Client.Handler private string ChooseMechanism(string mechanisms) { - foreach ( string mech in mechanisms.Split(' ') ) - { - if ( CallbackHandlerRegistry.Instance.IsSupportedMechanism(mech) ) - { - return mech; - } - } - return null; + return CallbackHandlerRegistry.Instance.ChooseMechanism(mechanisms); } private byte[] DoAuthentication(string selectedMechanism, AMQProtocolSession ps) diff --git a/dotnet/Qpid.Client/Client/Security/CallbackHandlerRegistry.cs b/dotnet/Qpid.Client/Client/Security/CallbackHandlerRegistry.cs index 944d21ad92..546bcec35a 100644 --- a/dotnet/Qpid.Client/Client/Security/CallbackHandlerRegistry.cs +++ b/dotnet/Qpid.Client/Client/Security/CallbackHandlerRegistry.cs @@ -70,7 +70,7 @@ namespace Qpid.Client.Security { private static CallbackHandlerRegistry _instance = new CallbackHandlerRegistry(); - private IDictionary _mechanism2HandlerMap; + private OrderedHashTable _mechanism2HandlerMap; private string[] _mechanisms; public static CallbackHandlerRegistry Instance @@ -85,12 +85,12 @@ namespace Qpid.Client.Security private CallbackHandlerRegistry() { - _mechanism2HandlerMap = (IDictionary) + _mechanism2HandlerMap = (OrderedHashTable) ConfigurationSettings.GetConfig("qpid.client/authentication"); // configure default options if not available if ( _mechanism2HandlerMap == null ) - _mechanism2HandlerMap = new Hashtable(); + _mechanism2HandlerMap = new OrderedHashTable(); if ( !_mechanism2HandlerMap.Contains(ExternalSaslClient.Mechanism) ) _mechanism2HandlerMap.Add(ExternalSaslClient.Mechanism, typeof(UsernamePasswordCallbackHandler)); @@ -99,8 +99,8 @@ namespace Qpid.Client.Security if ( !_mechanism2HandlerMap.Contains(PlainSaslClient.Mechanism) ) _mechanism2HandlerMap.Add(PlainSaslClient.Mechanism, typeof(UsernamePasswordCallbackHandler)); - _mechanisms = new string[_mechanism2HandlerMap.Keys.Count]; - _mechanism2HandlerMap.Keys.CopyTo(_mechanisms, 0); + _mechanisms = new string[_mechanism2HandlerMap.Count]; + _mechanism2HandlerMap.OrderedKeys.CopyTo(_mechanisms, 0); } public bool IsSupportedMechanism(string mechanism) @@ -108,6 +108,17 @@ namespace Qpid.Client.Security return _mechanism2HandlerMap.Contains(mechanism); } + public string ChooseMechanism(string mechanisms) + { + IList mechs = mechanisms.Split(' '); + foreach ( string supportedMech in _mechanisms ) + { + if ( mechs.Contains(supportedMech) ) + return supportedMech; + } + return null; + } + public Type GetCallbackHandler(string mechanism) { return (Type)_mechanism2HandlerMap[mechanism]; -- cgit v1.2.1