From 68528693130f271a8482d5c2a6eaa8cb29849900 Mon Sep 17 00:00:00 2001 From: SirConstance Date: Sat, 13 Sep 2025 20:08:52 +0200 Subject: [PATCH] Fix TTL --- .../Discovery/InMemoryPresenceStore.cs | 40 +++++++++++++------ .../Services/Discovery/RedisPresenceStore.cs | 26 ++++++++++++ 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/InMemoryPresenceStore.cs b/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/InMemoryPresenceStore.cs index 8280105..8c36233 100644 --- a/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/InMemoryPresenceStore.cs +++ b/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/InMemoryPresenceStore.cs @@ -57,22 +57,26 @@ public sealed class InMemoryPresenceStore : IDiscoveryPresenceStore } public (bool Found, string? Token, string TargetUid, string? DisplayName) TryMatchAndIssueToken(string requesterUid, string hash) +{ + if (_presence.TryGetValue(hash, out var entry)) { - if (_presence.TryGetValue(hash, out var entry)) - { - if (string.Equals(entry.Uid, requesterUid, StringComparison.Ordinal)) - return (false, null, string.Empty, null); + // Refresh TTL for this presence whenever it is matched (regardless of AllowRequests) + var refreshed = (entry.Uid, DateTimeOffset.UtcNow.Add(_presenceTtl), entry.DisplayName, entry.AllowRequests); + _presence[hash] = refreshed; - // Visible but requests disabled → no token - if (!entry.AllowRequests) - return (true, null, entry.Uid, entry.DisplayName); + if (string.Equals(entry.Uid, requesterUid, StringComparison.Ordinal)) + return (false, null, string.Empty, null); - var token = Guid.NewGuid().ToString("N"); - _tokens[token] = (entry.Uid, DateTimeOffset.UtcNow.Add(_tokenTtl)); - return (true, token, entry.Uid, entry.DisplayName); - } - return (false, null, string.Empty, null); + // Visible but requests disabled → no token + if (!entry.AllowRequests) + return (true, null, entry.Uid, entry.DisplayName); + + var token = Guid.NewGuid().ToString("N"); + _tokens[token] = (entry.Uid, DateTimeOffset.UtcNow.Add(_tokenTtl)); + return (true, token, entry.Uid, entry.DisplayName); } + return (false, null, string.Empty, null); +} public bool ValidateToken(string token, out string targetUid) { @@ -82,6 +86,18 @@ public (bool Found, string? Token, string TargetUid, string? DisplayName) TryMat if (info.ExpiresAt > DateTimeOffset.UtcNow) { targetUid = info.TargetUid; + + // Optional robustness: refresh TTL for all presence entries of this target + var newExp = DateTimeOffset.UtcNow.Add(_presenceTtl); + foreach (var kv in _presence.ToArray()) + { + if (string.Equals(kv.Value.Uid, targetUid, StringComparison.Ordinal)) + { + var v = kv.Value; + _presence[kv.Key] = (v.Uid, newExp, v.DisplayName, v.AllowRequests); + } + } + return true; } _tokens.TryRemove(token, out _); diff --git a/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/RedisPresenceStore.cs b/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/RedisPresenceStore.cs index d287982..658ca7f 100644 --- a/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/RedisPresenceStore.cs +++ b/MareSynchronosServer/MareSynchronosAuthService/Services/Discovery/RedisPresenceStore.cs @@ -100,6 +100,10 @@ public sealed class RedisPresenceStore : IDiscoveryPresenceStore if (p == null || string.IsNullOrEmpty(p.Uid)) return (false, null, string.Empty, null); if (string.Equals(p.Uid, requesterUid, StringComparison.Ordinal)) return (false, null, string.Empty, null); + // Refresh TTLs for this presence whenever it is matched + _db.KeyExpire(KeyForHash(hash), _presenceTtl); + _db.KeyExpire(KeyForUidSet(p.Uid), _presenceTtl); + // Visible but requests disabled → return without token if (!p.AllowRequests) { @@ -123,6 +127,28 @@ public sealed class RedisPresenceStore : IDiscoveryPresenceStore var val = _db.StringGet(key); if (!val.HasValue) return false; targetUid = val!; + try + { + var setKey = KeyForUidSet(targetUid); + var members = _db.SetMembers(setKey); + if (members is { Length: > 0 }) + { + var batch = _db.CreateBatch(); + foreach (var m in members) + { + var h = (string)m; + batch.KeyExpireAsync(KeyForHash(h), _presenceTtl); + } + batch.KeyExpireAsync(setKey, _presenceTtl); + batch.Execute(); + } + else + { + // Still try to extend the set TTL even if empty + _db.KeyExpire(setKey, _presenceTtl); + } + } + catch { /* ignore TTL refresh issues */ } return true; }