tgstation-server  4.4.0
The /tg/station 13 server suite
IdentityCache.cs
Go to the documentation of this file.
1 using Microsoft.Extensions.Logging;
2 using System;
3 using System.Collections.Generic;
4 using System.Linq;
7 
8 namespace Tgstation.Server.Host.Security
9 {
12  {
17 
21  readonly ILogger<IdentityCache> logger;
22 
26  readonly Dictionary<long, IdentityCacheObject> cachedIdentities;
27 
33  public IdentityCache(IAsyncDelayer asyncDelayer, ILogger<IdentityCache> logger)
34  {
35  this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
36  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
37 
38  cachedIdentities = new Dictionary<long, IdentityCacheObject>();
39  }
40 
42  public void Dispose()
43  {
44  logger.LogTrace("Disposing...");
45  foreach (var I in cachedIdentities.Select(x => x.Value).ToList())
46  I.Dispose();
47  }
48 
50  public void CacheSystemIdentity(User user, ISystemIdentity systemIdentity, DateTimeOffset expiry)
51  {
52  if (user == null)
53  throw new ArgumentNullException(nameof(user));
54  if (systemIdentity == null)
55  throw new ArgumentNullException(nameof(systemIdentity));
56  lock (cachedIdentities)
57  {
58  var uid = systemIdentity.Uid;
59  logger.LogDebug("Caching system identity {0} of user {1}", uid, user.Id);
60 
61  if (cachedIdentities.TryGetValue(user.Id.Value, out var identCache))
62  {
63  logger.LogTrace("Expiring previously cached identity...");
64  identCache.Dispose(); // also clears it out
65  }
66 
67  identCache = new IdentityCacheObject(systemIdentity.Clone(), asyncDelayer, () =>
68  {
69  logger.LogDebug("Expiring system identity cache for user {1}", uid, user.Id);
70  lock (cachedIdentities)
71  cachedIdentities.Remove(user.Id.Value);
72  }, expiry);
73  cachedIdentities.Add(user.Id.Value, identCache);
74  }
75  }
76 
79  {
80  if (user == null)
81  throw new ArgumentNullException(nameof(user));
82  lock (cachedIdentities)
83  if (cachedIdentities.TryGetValue(user.Id.Value, out var identity))
84  return identity.SystemIdentity.Clone();
85  throw new InvalidOperationException("Cached system identity has expired!");
86  }
87  }
88 }
Represents a user on the current global::System.Runtime.InteropServices.OSPlatform ...
readonly Dictionary< long, IdentityCacheObject > cachedIdentities
The map of Api.Models.Internal.User.Ids to IdentityCacheObjects
IdentityCache(IAsyncDelayer asyncDelayer, ILogger< IdentityCache > logger)
Construct an IdentityCache
void CacheSystemIdentity(User user, ISystemIdentity systemIdentity, DateTimeOffset expiry)
Keep a user &#39;s systemIdentity alive until an expiry time
long Id
The ID of the User
Definition: User.cs:16
ISystemIdentity LoadCachedIdentity(User user)
Attempt to load a cached ISystemIdentity
ISystemIdentity Clone()
Clone the ISystemIdentity creating another copy that must have IDisposable.Dispose called on it ...
readonly ILogger< IdentityCache > logger
The ILogger for the IdentityCache
For keeping a specific ISystemIdentity alive for a period of time
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the IdentityCache
string Uid
A unique identifier for the user