tgstation-server 5.12.7
The /tg/station 13 server suite
Loading...
Searching...
No Matches
IdentityCache.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.Linq;
4
5using Microsoft.Extensions.Logging;
6
9
11{
14 {
19
23 readonly ILogger<IdentityCache> logger;
24
28 readonly Dictionary<long, IdentityCacheObject> cachedIdentities;
29
35 public IdentityCache(IAsyncDelayer asyncDelayer, ILogger<IdentityCache> logger)
36 {
37 this.asyncDelayer = asyncDelayer ?? throw new ArgumentNullException(nameof(asyncDelayer));
38 this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
39
40 cachedIdentities = new Dictionary<long, IdentityCacheObject>();
41 }
42
44 public void Dispose()
45 {
46 logger.LogTrace("Disposing...");
47 foreach (var cachedIdentity in cachedIdentities.Select(x => x.Value).ToList())
48 cachedIdentity.Dispose();
49 }
50
52 public void CacheSystemIdentity(User user, ISystemIdentity systemIdentity, DateTimeOffset expiry)
53 {
54 ArgumentNullException.ThrowIfNull(user);
55 ArgumentNullException.ThrowIfNull(systemIdentity);
56
57 lock (cachedIdentities)
58 {
59 var uid = systemIdentity.Uid;
60 logger.LogDebug("Caching system identity {0} of user {1}", uid, user.Id);
61
62 if (cachedIdentities.TryGetValue(user.Id.Value, out var identCache))
63 {
64 logger.LogTrace("Expiring previously cached identity...");
65 identCache.Dispose(); // also clears it out
66 }
67
68 identCache = new IdentityCacheObject(
69 systemIdentity.Clone(),
71 () =>
72 {
73 logger.LogDebug("Expiring system identity cache for user {0}", user.Id);
74 lock (cachedIdentities)
75 cachedIdentities.Remove(user.Id.Value);
76 },
77 expiry);
78 cachedIdentities.Add(user.Id.Value, identCache);
79 }
80 }
81
84 {
85 ArgumentNullException.ThrowIfNull(user);
86 lock (cachedIdentities)
87 if (cachedIdentities.TryGetValue(user.Id.Value, out var identity))
88 return identity.SystemIdentity.Clone();
89 throw new InvalidOperationException("Cached system identity has expired!");
90 }
91 }
92}
virtual ? long Id
The ID of the entity.
Definition: EntityId.cs:13
ISystemIdentity LoadCachedIdentity(User user)
Attempt to load a cached ISystemIdentity. The cached ISystemIdentity or null if it doesn't exist or e...
readonly ILogger< IdentityCache > logger
The ILogger for the IdentityCache.
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the IdentityCache.
IdentityCache(IAsyncDelayer asyncDelayer, ILogger< IdentityCache > logger)
Initializes a new instance of the IdentityCache class.
readonly Dictionary< long, IdentityCacheObject > cachedIdentities
The map of Api.Models.EntityId.Ids to IdentityCacheObjects.
void CacheSystemIdentity(User user, ISystemIdentity systemIdentity, DateTimeOffset expiry)
Keep a user 's systemIdentity alive until an expiry time.
For keeping a specific ISystemIdentity alive for a period of time.
Represents a user on the current global::System.Runtime.InteropServices.OSPlatform.
ISystemIdentity Clone()
Clone the ISystemIdentity creating another copy that must have IDisposable.Dispose called on it.
string Uid
A unique identifier for the user.