Handle external logouts
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();
+ }
+ }
+}
|