File: NegotiationTokenAuthenticatorStateCache.cs

package info (click to toggle)
mono 4.6.2.7%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 778,148 kB
  • ctags: 914,052
  • sloc: cs: 5,779,509; xml: 2,773,713; ansic: 432,645; sh: 14,749; makefile: 12,361; perl: 2,488; python: 1,434; cpp: 849; asm: 531; sql: 95; sed: 16; php: 1
file content (70 lines) | stat: -rw-r--r-- 2,755 bytes parent folder | download | duplicates (9)
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
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------

namespace System.ServiceModel.Security
{
    using System;
    using System.Collections;
    using System.Runtime;
    using System.ServiceModel;
    using System.ServiceModel.Diagnostics.Application;

    sealed class NegotiationTokenAuthenticatorStateCache<T> : TimeBoundedCache
        where T : NegotiationTokenAuthenticatorState
    {
        static int lowWaterMark = 50;
        static TimeSpan purgingInterval = TimeSpan.FromMinutes(10);
        TimeSpan cachingSpan;

        public NegotiationTokenAuthenticatorStateCache(TimeSpan cachingSpan, int maximumCachedState)
            : base(lowWaterMark, maximumCachedState, null, PurgingMode.TimerBasedPurge, TimeSpan.FromTicks(cachingSpan.Ticks >> 2), true)
        {
            this.cachingSpan = cachingSpan;
        }

        public void AddState(string context, T state)
        {
            DateTime expirationTime = TimeoutHelper.Add(DateTime.UtcNow, this.cachingSpan);
            bool wasStateAdded = base.TryAddItem(context, state, expirationTime, false);
            if (!wasStateAdded)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperWarning(new SecurityNegotiationException(SR.GetString(SR.NegotiationStateAlreadyPresent, context)));
            }
            if (TD.NegotiateTokenAuthenticatorStateCacheRatioIsEnabled())
            {
                TD.NegotiateTokenAuthenticatorStateCacheRatio(base.Count, base.Capacity);
            }
        }

        public T GetState(string context)
        {
            return (this.GetItem(context) as T);
        }

        public void RemoveState(string context)
        {
            this.TryRemoveItem(context);
            if (TD.NegotiateTokenAuthenticatorStateCacheRatioIsEnabled())
            {
                TD.NegotiateTokenAuthenticatorStateCacheRatio(base.Count, base.Capacity);
            }
        }


        protected override ArrayList OnQuotaReached(Hashtable cacheTable)
        {
            if (TD.NegotiateTokenAuthenticatorStateCacheExceededIsEnabled())
            {
                TD.NegotiateTokenAuthenticatorStateCacheExceeded(SR.GetString(SR.CachedNegotiationStateQuotaReached, this.Capacity));
            }
            throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new QuotaExceededException(SR.GetString(SR.CachedNegotiationStateQuotaReached, this.Capacity)));
        }

        protected override void OnRemove(object item)
        {
            ((IDisposable)item).Dispose();
            base.OnRemove(item);
        }
    }
}