aspnetcore/src/Microsoft.AspNetCore.DataPr.../KeyManagement/Internal/CacheableKeyRing.cs

52 lines
1.9 KiB
C#

// 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
{
/// <summary>
/// Wraps both a keyring and its expiration policy.
/// </summary>
public sealed class CacheableKeyRing
{
private readonly CancellationToken _expirationToken;
internal CacheableKeyRing(CancellationToken expirationToken, DateTimeOffset expirationTime, IKey defaultKey, IEnumerable<IKey> 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;
}
/// <summary>
/// Returns a new <see cref="CacheableKeyRing"/> which is identical to 'this' but with a
/// lifetime extended 2 minutes from <paramref name="now"/>. The inner cancellation token
/// is also disconnected.
/// </summary>
internal CacheableKeyRing WithTemporaryExtendedLifetime(DateTimeOffset now)
{
var extension = TimeSpan.FromMinutes(2);
return new CacheableKeyRing(CancellationToken.None, now + extension, KeyRing);
}
}
}