blob: 5a744a30d98c6a9d46c8dfa7d6e78dde7b64203f [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
using System;
using System.Collections;
using System.Configuration;
using System.Text;
using Apache.Qpid.Sasl.Configuration;
namespace Apache.Qpid.Sasl
{
/// <summary>
/// Static class used to access the SASL functionality.
/// The core SASL mechanism is described in RFC 2222.
/// </summary>
/// <remarks>
/// Only client side mechanisms are implemented.
/// <para>
/// New client side factories can be added programatically using the
/// RegisterClientFactory method, or through the application
/// configuration file, like this:
/// </para>
/// <example><![CDATA[
/// <configuration>
/// <configSections>
/// <section name="qpid.sasl" type="Apache.Qpid.Sasl.Configuration.SaslConfigurationSectionHandler, Apache.Qpid.Sasl"/>
/// </configSections>
///
/// <qpid.sasl>
/// <clientFactories>
/// <add type="Apache.Qpid.Sasl.Tests.TestClientFactory, Apache.Qpid.Sasl.Tests"/>
/// </clientFactories>
/// </qpid.sasl>
/// </configuration>
/// ]]></example>
/// </remarks>
public sealed class Sasl
{
private static IList _clientFactories;
static Sasl()
{
SaslConfiguration config = SaslConfiguration.GetConfiguration();
_clientFactories = config.ClientFactories;
}
private Sasl()
{
}
public static ISaslClient CreateClient(
string[] mechanisms, string authorizationId,
string protocol, string serverName,
IDictionary props, ISaslCallbackHandler handler
)
{
ISaslClientFactory factory = FindFactory(mechanisms, props);
if ( factory == null )
return null;
return factory.CreateClient (
mechanisms, authorizationId,
protocol, serverName, props, handler
);
}
public static void RegisterClientFactory(ISaslClientFactory factory)
{
lock ( _clientFactories )
{
_clientFactories.Add(factory);
}
}
private static ISaslClientFactory FindFactory(string[] mechanisms, IDictionary props)
{
lock ( _clientFactories )
{
foreach ( ISaslClientFactory factory in _clientFactories )
{
string[] mechs = factory.GetSupportedMechanisms(props);
foreach ( string m1 in mechs )
{
foreach (string m2 in mechanisms )
{
if ( m1 == m2 )
return factory;
}
}
}
return null;
}
}
} // class Sasl
} // namespace Apache.Qpid.Sasl.Mechanisms