summaryrefslogtreecommitdiff
path: root/Server/Services/UserService.cs
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2026-05-22 00:52:16 +1000
committerJake Mannens <jake@asger.xyz>2026-05-23 22:22:55 +1000
commit12eaa5814ef20b0910e8d64a753378b6f6797989 (patch)
tree062cf477c29054e0f089cb80f0cd79a9f3b7ccd9 /Server/Services/UserService.cs
parent6de5d7f5364fe1d54703da6d6b7cb08ea26e939f (diff)
Initial commitwasm-initial
Diffstat (limited to 'Server/Services/UserService.cs')
-rw-r--r--Server/Services/UserService.cs76
1 files changed, 76 insertions, 0 deletions
diff --git a/Server/Services/UserService.cs b/Server/Services/UserService.cs
new file mode 100644
index 0000000..9e79dc6
--- /dev/null
+++ b/Server/Services/UserService.cs
@@ -0,0 +1,76 @@
+using Microsoft.AspNetCore.Cryptography.KeyDerivation;
+
+namespace HyperBooru.Services;
+
+public interface IUserService {
+ public UserSessionState UserSessionState { get; }
+}
+
+public class UserService : IUserService {
+ public UserSessionState UserSessionState =>
+ globalUserService.GetSessionState(httpContext.Session.Id);
+
+ private IHttpContextAccessor httpContextAccessor;
+ private IGlobalUserService globalUserService;
+
+ private HttpContext httpContext =>
+ httpContextAccessor.HttpContext!;
+
+ public UserService(
+ IHttpContextAccessor httpContextAccessor,
+ IGlobalUserService globalUserService) {
+
+ this.httpContextAccessor = httpContextAccessor;
+ this.globalUserService = globalUserService;
+
+ // HTTP context session states are discarded if no values
+ // are set. Set a dummy value so that the session state
+ // will not be discarded later when we actually need it.
+ httpContext.Session.SetInt32("Persist", 1);
+ }
+
+ public static string HashPassword(string password) =>
+ Convert.ToBase64String(
+ KeyDerivation.Pbkdf2(
+ password,
+ Array.Empty<byte>(),
+ KeyDerivationPrf.HMACSHA512,
+ 100_000,
+ 512 / 8));
+}
+
+public interface IGlobalUserService {
+ public UserSessionState GetSessionState(string id);
+}
+
+public class GlobalUserService : IGlobalUserService {
+ // TODO: prune this list periodically
+ private Dictionary<string, UserSessionState> sessionStates = new();
+
+ public UserSessionState GetSessionState(string id) {
+ sessionStates.TryGetValue(id, out var state);
+
+ if(state is null) {
+ state = new();
+ sessionStates[id] = state;
+ }
+
+ return state;
+ }
+}
+
+public record UserSessionState {
+ public event UserSessionStateChange OnStateChange;
+
+ public bool ShowNsfw {
+ get => showNsfw;
+ set {
+ showNsfw = value;
+ OnStateChange.Invoke(this);
+ }
+ }
+
+ private bool showNsfw = false;
+}
+
+public delegate void UserSessionStateChange(UserSessionState sessionState);