// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Threading; namespace Microsoft.AspNetCore.DataProtection.KeyManagement.Internal { /// /// Wraps both a keyring and its expiration policy. /// public sealed class CacheableKeyRing { private readonly CancellationToken _expirationToken; internal CacheableKeyRing(CancellationToken expirationToken, DateTimeOffset expirationTime, IKey defaultKey, IEnumerable allKeys) : this(expirationToken, expirationTime, keyRing: new KeyRing(defaultKey, allKeys)) { } internal CacheableKeyRing(CancellationToken expirationToken, DateTimeOffset expirationTime, IKeyRing keyRing) { _expirationToken = expirationToken; ExpirationTimeUtc = expirationTime.UtcDateTime; KeyRing = keyRing; } internal DateTime ExpirationTimeUtc { get; } internal IKeyRing KeyRing { get; } internal static bool IsValid(CacheableKeyRing keyRing, DateTime utcNow) { return keyRing != null && !keyRing._expirationToken.IsCancellationRequested && keyRing.ExpirationTimeUtc > utcNow; } /// /// Returns a new which is identical to 'this' but with a /// lifetime extended 2 minutes from . The inner cancellation token /// is also disconnected. /// internal CacheableKeyRing WithTemporaryExtendedLifetime(DateTimeOffset now) { var extension = TimeSpan.FromMinutes(2); return new CacheableKeyRing(CancellationToken.None, now + extension, KeyRing); } } }