Endpoints/NetworkStorageRuntimeSecuritySnapshot.cs
using System;
using System.Text.Json;
namespace Sandbox;
public static partial class NetworkStorage
{
private static string BuildSecurityConfigDiagnostics()
{
var runtime = _runtimeSecurityConfig;
if ( runtime is null )
return $"synced(authSessions={EnableAuthSessions}, encryptedRequests={EnableEncryptedRequests}) runtime=not-loaded";
return $"synced(authSessions={runtime.SyncedEnableAuthSessions}, encryptedRequests={runtime.SyncedEnableEncryptedRequests}) "
+ $"runtime(authSessions={runtime.EnableAuthSessions}, encryptedRequests={runtime.EnableEncryptedRequests}, analytics={runtime.EnablePlayerAnalytics}, source={runtime.Source}, "
+ $"version={runtime.ConfigVersion}, ageSeconds={runtime.AgeSeconds}, mismatch={runtime.LastMismatchCode}, mode={runtime.ModeText})";
}
private static string ReadString( JsonElement element, string name )
=> element.ValueKind == JsonValueKind.Object && element.TryGetProperty( name, out var value ) && value.ValueKind == JsonValueKind.String ? value.GetString() ?? "" : "";
private static int ReadInt( JsonElement element, string name, int fallback )
=> element.ValueKind == JsonValueKind.Object && element.TryGetProperty( name, out var value ) && value.ValueKind == JsonValueKind.Number && value.TryGetInt32( out var parsed ) ? parsed : fallback;
private static bool ReadBool( JsonElement element, string name, bool fallback )
=> element.ValueKind == JsonValueKind.Object && element.TryGetProperty( name, out var value )
? value.ValueKind == JsonValueKind.True || (value.ValueKind != JsonValueKind.False && fallback)
: fallback;
private static DateTimeOffset ReadDateTimeOffset( JsonElement element, string name )
=> DateTimeOffset.TryParse( ReadString( element, name ), out var parsed ) ? parsed : DateTimeOffset.UtcNow;
private sealed record RuntimeSecurityConfigSnapshot
{
public bool Loaded { get; init; }
public string Source { get; init; } = "synced";
public string ProjectId { get; init; }
public string ConfigVersion { get; init; } = "";
public DateTimeOffset GeneratedAt { get; init; } = DateTimeOffset.UtcNow;
public DateTimeOffset LoadedAt { get; init; } = DateTimeOffset.UtcNow;
public int TtlSeconds { get; init; } = 60;
public bool EnableAuthSessions { get; init; }
public bool EnableEncryptedRequests { get; init; }
public bool EnablePlayerAnalytics { get; init; } = true;
public bool SyncedEnableAuthSessions { get; init; }
public bool SyncedEnableEncryptedRequests { get; init; }
public bool SignaturePresent { get; init; }
public string LastRefreshReason { get; set; } = "";
public string LastMismatchCode { get; set; } = "";
public string LastRequestMode { get; set; } = "";
public int AgeSeconds => Math.Max( 0, (int)(DateTimeOffset.UtcNow - LoadedAt).TotalSeconds );
public bool IsFresh => Loaded && DateTimeOffset.UtcNow - LoadedAt < TimeSpan.FromSeconds( Math.Max( 1, TtlSeconds ) ) && DateTimeOffset.UtcNow - LoadedAt < RuntimeSecurityConfigMaxAge;
public string ModeText => $"{(EnableAuthSessions ? "session" : "legacy")}+{(EnableEncryptedRequests ? "encrypted" : "plaintext")}";
public static RuntimeSecurityConfigSnapshot FromSyncedSettings() => new()
{
Loaded = false,
Source = "synced",
ProjectId = NetworkStorage.ProjectId,
EnableAuthSessions = NetworkStorage.EnableAuthSessions,
EnableEncryptedRequests = NetworkStorage.EnableEncryptedRequests,
EnablePlayerAnalytics = NetworkStorage.EnablePlayerAnalytics,
SyncedEnableAuthSessions = NetworkStorage.EnableAuthSessions,
SyncedEnableEncryptedRequests = NetworkStorage.EnableEncryptedRequests,
};
}}