summaryrefslogtreecommitdiff
path: root/dotnet/Qpid.Sasl/DefaultClientFactory.cs
blob: 43f0470a213c30331bb578812aed5712517d3ef8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
 *
 * 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.Text;

using Qpid.Sasl.Mechanisms;

namespace Qpid.Sasl
{
   public class DefaultClientFactory : ISaslClientFactory
   {
      private static readonly string[] SUPPORTED = new string[] { 
               DigestSaslClient.Mechanism,
               CramMD5SaslClient.Mechanism,
               PlainSaslClient.Mechanism, 
               AnonymousSaslClient.Mechanism,
            };

      public string[] GetSupportedMechanisms(IDictionary props)
      {
         if ( props == null )
            throw new ArgumentNullException("props");

         ArrayList vetoed = new ArrayList();

         if ( props.Contains(SaslProperties.PolicyNoPlainText) ||
             props.Contains(SaslProperties.PolicyNoDictionary) ||
             props.Contains(SaslProperties.PolicyNoActive) ||
             props.Contains(SaslProperties.PolicyForwardSecrecy) ||
             props.Contains(SaslProperties.PolicyPassCredentials) )
         {
            vetoed.Add(CramMD5SaslClient.Mechanism);
            vetoed.Add(PlainSaslClient.Mechanism);
            vetoed.Add(AnonymousSaslClient.Mechanism);
         } 
         if ( props.Contains(SaslProperties.PolicyNoAnonymous) )
         {
            vetoed.Add(AnonymousSaslClient.Mechanism);
         }

         ArrayList available = new ArrayList();
         foreach ( string mech in SUPPORTED )
         {
            if ( !vetoed.Contains(mech) )
               available.Add(mech);
         }
         return (string[])available.ToArray(typeof(string));
      }

      public ISaslClient CreateClient(
         string[] mechanisms, string authorizationId,
         string protocol, string serverName, 
         IDictionary props, ISaslCallbackHandler handler
         )
      {
         foreach ( string mech in mechanisms )
         {
            switch ( mech )
            {
            case PlainSaslClient.Mechanism:
               return new PlainSaslClient(authorizationId, props, handler);
            case CramMD5SaslClient.Mechanism:
               return new CramMD5SaslClient(authorizationId, props, handler);
            case AnonymousSaslClient.Mechanism:
               return new AnonymousSaslClient(authorizationId, props, handler);
            case DigestSaslClient.Mechanism:
               return new DigestSaslClient(authorizationId, serverName, protocol, props, handler);
            }
         }
         // unknown mechanism
         return null;
      }
   } // class DefaultClientFactory

} // namespace Qpid.Sasl