1 files changed, 100 insertions, 0 deletions
diff --git a/MatrixUtils.Web/Pages/InvalidSession.razor b/MatrixUtils.Web/Pages/InvalidSession.razor
new file mode 100644
index 0000000..e1a72ea
--- /dev/null
+++ b/MatrixUtils.Web/Pages/InvalidSession.razor
@@ -0,0 +1,100 @@
+@page "/InvalidSession"
+@using LibMatrix
+
+<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>
+ }
+}
+else {
+ <b>Something has gone wrong and the login was not passed along!</b>
+}
+
+@code
+{
+ [Parameter]
+ [SupplyParameterFromQuery(Name = "ctx")]
+ public string Context { get; set; }
+
+ private UserAuth? _login { get; set; }
+
+ private bool _showRefreshDialog { get; set; }
+
+ private string _password { get; set; } = "";
+
+ private MatrixException? _loginException { get; set; }
+
+ protected override async Task OnInitializedAsync() {
+ var tokens = await RMUStorage.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 RMUStorage.RemoveToken(_login!);
+ if ((await RMUStorage.GetCurrentToken())!.AccessToken == _login!.AccessToken)
+ await RMUStorage.SetCurrentToken((await RMUStorage.GetAllTokens())?.FirstOrDefault());
+ await OnInitializedAsync();
+ }
+
+ private async Task OpenRefreshDialog() {
+ _showRefreshDialog = true;
+ StateHasChanged();
+ await Task.CompletedTask;
+ }
+
+ private async Task SwitchSession(UserAuth auth) {
+ Console.WriteLine($"Switching to {auth.Homeserver} {auth.AccessToken} {auth.UserId}");
+ await RMUStorage.SetCurrentToken(auth);
+ await OnInitializedAsync();
+ }
+
+ private async Task TryLogin() {
+ if(_login is null) throw new NullReferenceException("Login is null!");
+ try {
+ var result = new UserAuth(await hsProvider.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 RMUStorage.AddToken(result);
+ if (result.UserId == (await RMUStorage.GetCurrentToken())?.UserId)
+ await RMUStorage.SetCurrentToken(result);
+ NavigationManager.NavigateTo("/");
+ }
+ catch (MatrixException e) {
+ Console.WriteLine($"Failed to login to {_login.Homeserver} as {_login.UserId}!");
+ Console.WriteLine(e);
+ _loginException = e;
+ StateHasChanged();
+ }
+ }
+}
|