[asp.net] Implemented CustomErrorsRedirectMode
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel.Security.Tokens / SecurityContextSecurityTokenResolver.cs
1 //
2 // SecurityContextSecurityTokenResolver.cs
3 //
4 // Author:
5 //      Atsushi Enomoto <atsushi@ximian.com>
6 //
7 // Copyright (C) 2006 Novell, Inc.  http://www.novell.com
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28 using System;
29 using System.Collections.Generic;
30 using System.Collections.ObjectModel;
31 using System.IdentityModel.Selectors;
32 using System.IdentityModel.Tokens;
33 using System.Xml;
34
35 using Table = System.Collections.Generic.Dictionary<System.Xml.UniqueId,System.ServiceModel.Security.Tokens.SecurityContextSecurityToken>;
36
37 namespace System.ServiceModel.Security.Tokens
38 {
39         public class SecurityContextSecurityTokenResolver : SecurityTokenResolver, ISecurityContextSecurityTokenCache
40         {
41                 int capacity;
42                 bool allow_removal;
43
44                 Dictionary<UniqueId,Table> cache =
45                         new Dictionary<UniqueId,Table> ();
46
47                 public SecurityContextSecurityTokenResolver (
48                         int securityContextCacheCapacity,
49                         bool removeOldestTokensOnCacheFull)
50                 {
51                         capacity = securityContextCacheCapacity;
52                         allow_removal = removeOldestTokensOnCacheFull;
53                 }
54
55                 public bool RemoveOldestTokensOnCacheFull {
56                         get { return allow_removal; }
57                 }
58
59                 public int SecurityContextTokenCacheCapacity {
60                         get { return capacity; }
61                 }
62
63                 public void AddContext (SecurityContextSecurityToken token)
64                 {
65                         if (!TryAddContext (token))
66                                 throw new InvalidOperationException ("Argument token is already in the cache.");
67                 }
68
69                 public void ClearContexts ()
70                 {
71                         cache.Clear ();
72                 }
73
74                 public Collection<SecurityContextSecurityToken> GetAllContexts (UniqueId contextId)
75                 {
76                         Table table;
77                         if (!cache.TryGetValue (contextId, out table))
78                                 return new Collection<SecurityContextSecurityToken> ();
79                         SecurityContextSecurityToken [] arr =
80                                 new SecurityContextSecurityToken [table.Count];
81                         table.Values.CopyTo (arr, 0);
82                         return new Collection<SecurityContextSecurityToken> (arr);
83                 }
84
85                 public SecurityContextSecurityToken GetContext (UniqueId contextId, UniqueId generation)
86                 {
87                         Table table;
88                         if (!cache.TryGetValue (contextId, out table))
89                                 return null;
90                         SecurityContextSecurityToken ret;
91                         return table.TryGetValue (generation, out ret) ? ret : null;
92                 }
93
94                 public void RemoveAllContexts (UniqueId contextId)
95                 {
96                         cache.Remove (contextId);
97                 }
98
99                 public void RemoveContext (UniqueId contextId, UniqueId generation)
100                 {
101                         Table table;
102                         if (!cache.TryGetValue (contextId, out table))
103                                 return;
104                         table.Remove (generation);
105                 }
106
107                 public bool TryAddContext (SecurityContextSecurityToken token)
108                 {
109                         Table table;
110                         if (!cache.TryGetValue (token.ContextId, out table)) {
111                                 table = new Table ();
112                                 table [token.KeyGeneration] = token;
113                         } else {
114                                 if (table.ContainsKey (token.KeyGeneration))
115                                         return false;
116                                 table [token.KeyGeneration] = token;
117                         }
118                         return true;
119                 }
120
121                 [MonoTODO]
122                 public void UpdateContextCachingTime (SecurityContextSecurityToken context, DateTime expirationTime)
123                 {
124                         throw new NotImplementedException ();
125                 }
126
127                 // SecurityTokenResolver
128
129                 [MonoTODO]
130                 protected override bool TryResolveSecurityKeyCore (
131                         SecurityKeyIdentifierClause keyIdentifierClause,
132                         out SecurityKey key)
133                 {
134                         throw new NotImplementedException ();
135                 }
136
137                 [MonoTODO]
138                 protected override bool TryResolveTokenCore (
139                         SecurityKeyIdentifier keyIdentifier,
140                         out SecurityToken token)
141                 {
142                         throw new NotImplementedException ();
143                 }
144
145                 [MonoTODO]
146                 protected override bool TryResolveTokenCore (
147                         SecurityKeyIdentifierClause keyIdentifierClause,
148                         out SecurityToken token)
149                 {
150                         throw new NotImplementedException ();
151                 }
152         }
153 }