diff options
Diffstat (limited to 'BugMine.Web/Classes/BugMineStorage.cs')
-rw-r--r-- | BugMine.Web/Classes/BugMineStorage.cs | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/BugMine.Web/Classes/BugMineStorage.cs b/BugMine.Web/Classes/BugMineStorage.cs new file mode 100644 index 0000000..b45e253 --- /dev/null +++ b/BugMine.Web/Classes/BugMineStorage.cs @@ -0,0 +1,100 @@ +using LibMatrix; +using LibMatrix.Homeservers; +using LibMatrix.Services; +using Microsoft.AspNetCore.Components; + +namespace BugMine.Web.Classes; + +public class BugMineStorage(ILogger<BugMineStorage> logger, TieredStorageService storageService, HomeserverProviderService homeserverProviderService, NavigationManager navigationManager) { + public async Task<List<UserAuth>?> GetAllTokens() { + logger.LogTrace("Getting all tokens."); + return await storageService.DataStorageProvider!.LoadObjectAsync<List<UserAuth>>("bugmine.tokens") ?? + new List<UserAuth>(); + } + + public async Task<UserAuth?> GetCurrentToken() { + logger.LogTrace("Getting current token."); + var currentToken = await storageService.DataStorageProvider!.LoadObjectAsync<UserAuth>("bugmine.token"); + var allTokens = await GetAllTokens(); + if (allTokens is null or { Count: 0 }) { + await SetCurrentToken(null); + return null; + } + + if (currentToken is null) { + await SetCurrentToken(currentToken = allTokens[0]); + } + + if (!allTokens.Any(x => x.AccessToken == currentToken.AccessToken)) { + await SetCurrentToken(currentToken = allTokens[0]); + } + + return currentToken; + } + + public async Task AddToken(UserAuth UserAuth) { + logger.LogTrace("Adding token."); + var tokens = await GetAllTokens() ?? new List<UserAuth>(); + + tokens.Add(UserAuth); + await storageService.DataStorageProvider!.SaveObjectAsync("bugmine.tokens", tokens); + } + + private async Task<AuthenticatedHomeserverGeneric?> GetCurrentSession() { + logger.LogTrace("Getting current session."); + var token = await GetCurrentToken(); + if (token == null) { + return null; + } + + return await homeserverProviderService.GetAuthenticatedWithToken(token.Homeserver, token.AccessToken, token.Proxy); + } + + public async Task<AuthenticatedHomeserverGeneric?> GetSession(UserAuth userAuth) { + logger.LogTrace("Getting session."); + return await homeserverProviderService.GetAuthenticatedWithToken(userAuth.Homeserver, userAuth.AccessToken, userAuth.Proxy); + } + + public async Task<AuthenticatedHomeserverGeneric?> GetCurrentSessionOrNavigate() { + logger.LogTrace("Getting current session or navigating."); + AuthenticatedHomeserverGeneric? session = null; + + try { + //catch if the token is invalid + session = await GetCurrentSession(); + } + catch (MatrixException e) { + if (e.ErrorCode == "M_UNKNOWN_TOKEN") { + var token = await GetCurrentToken(); + logger.LogWarning("Encountered invalid token for {user} on {homeserver}", token.UserId, token.Homeserver); + navigationManager.NavigateTo("/InvalidSession?ctx=" + token.AccessToken); + return null; + } + + throw; + } + + if (session is null) { + logger.LogInformation("No session found. Navigating to login."); + navigationManager.NavigateTo("/Login"); + } + + return session; + } + + public async Task RemoveToken(UserAuth auth) { + logger.LogTrace("Removing token."); + var tokens = await GetAllTokens(); + if (tokens == null) { + return; + } + + tokens.RemoveAll(x => x.AccessToken == auth.AccessToken); + await storageService.DataStorageProvider.SaveObjectAsync("bugmine.tokens", tokens); + } + + public async Task SetCurrentToken(UserAuth? auth) { + logger.LogTrace("Setting current token."); + await storageService.DataStorageProvider.SaveObjectAsync("bugmine.token", auth); + } +} |