diff options
author | TheArcaneBrony <myrainbowdash949@gmail.com> | 2023-07-17 00:21:24 +0200 |
---|---|---|
committer | TheArcaneBrony <myrainbowdash949@gmail.com> | 2023-07-17 00:21:24 +0200 |
commit | 1beca653b772cf10586c417b2c25df03a67df8a2 (patch) | |
tree | d539b5f329cb62f253e1bc8142c3a313719657b0 /MatrixRoomUtils.Web/Pages/InvalidSession.razor | |
parent | Changes (diff) | |
download | MatrixUtils-1beca653b772cf10586c417b2c25df03a67df8a2.tar.xz |
Handle external logouts
Diffstat (limited to 'MatrixRoomUtils.Web/Pages/InvalidSession.razor')
-rw-r--r-- | MatrixRoomUtils.Web/Pages/InvalidSession.razor | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/MatrixRoomUtils.Web/Pages/InvalidSession.razor b/MatrixRoomUtils.Web/Pages/InvalidSession.razor new file mode 100644 index 0000000..3bcd797 --- /dev/null +++ b/MatrixRoomUtils.Web/Pages/InvalidSession.razor @@ -0,0 +1,97 @@ +@page "/InvalidSession" +@using MatrixRoomUtils.Core.Helpers +@using MatrixRoomUtils.Core.Responses +@using MatrixRoomUtils.Web.Shared.SimpleComponents + +<PageTitle>Invalid session</PageTitle> + +<h3>Rory&::MatrixUtils - Invalid session encountered</h3> +<p>A session was encountered that is no longer valid. This can happen if you have logged out of the account on another device, or if the access token has expired.</p> + +@if (_login is not null) { + <p>It appears that the affected user is @_login.UserId (@_login.DeviceId) on @_login.Homeserver!</p> + <LinkButton OnClick="@(OpenRefreshDialog)">Refresh token</LinkButton> + <LinkButton OnClick="@(RemoveUser)">Remove</LinkButton> + + @if (_showRefreshDialog) { + <ModalWindow MinWidth="300" X="275" Y="300" Title="@($"Password for {_login.UserId}")"> + <FancyTextBox IsPassword="true" @bind-Value="@_password"></FancyTextBox><br/> + <LinkButton OnClick="TryLogin">Log in</LinkButton> + @if (_loginException is not null) { + <pre style="color: red;">@_loginException.RawContent</pre> + } + </ModalWindow> + } +} + +@code +{ + [Parameter] + [SupplyParameterFromQuery(Name = "ctx")] + public string Context { get; set; } + + private LoginResponse _login { get; set; } + + private bool _showRefreshDialog { get; set; } = false; + + private string _password { get; set; } = ""; + + private MatrixException _loginException { get; set; } + + protected override async Task OnInitializedAsync() { + var tokens = await MRUStorage.GetAllTokens(); + if (tokens is null || tokens.Count == 0) { + NavigationManager.NavigateTo("/Login"); + return; + } + + _login = tokens.FirstOrDefault(x => x.AccessToken == Context); + + if (_login is null) { + Console.WriteLine($"Could not find {_login} in stored tokens!"); + } + + await base.OnInitializedAsync(); + } + + private async Task RemoveUser() { + await MRUStorage.RemoveToken(_login); + if ((await MRUStorage.GetCurrentToken()).AccessToken == _login.AccessToken) + MRUStorage.SetCurrentToken((await MRUStorage.GetAllTokens()).FirstOrDefault()); + await OnInitializedAsync(); + } + + private async Task OpenRefreshDialog() { + _showRefreshDialog = true; + StateHasChanged(); + } + + private async Task SwitchSession(LoginResponse auth) { + Console.WriteLine($"Switching to {auth.Homeserver} {auth.AccessToken} {auth.UserId}"); + await MRUStorage.SetCurrentToken(auth); + await OnInitializedAsync(); + } + + private async Task TryLogin() { + try { + var result = await HomeserverProvider.Login(_login.Homeserver, _login.UserId, _password); + if (result is null) { + Console.WriteLine($"Failed to login to {_login.Homeserver} as {_login.UserId}!"); + return; + } + Console.WriteLine($"Obtained access token for {result.UserId}!"); + + await RemoveUser(); + await MRUStorage.AddToken(result); + if (result.UserId == (await MRUStorage.GetCurrentToken())?.UserId) + await MRUStorage.SetCurrentToken(result); + NavigationManager.NavigateTo("/"); + } + catch (MatrixException e) { + Console.WriteLine($"Failed to login to {_login.Homeserver} as {_login.UserId}!"); + Console.WriteLine(e); + _loginException = e; + StateHasChanged(); + } + } +} |