Files
server/MareSynchronosServer/MareSynchronosServices/Discord/MareWizardModule.Recover.cs
2023-09-17 00:05:57 +02:00

77 lines
3.2 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Discord.Interactions;
using Discord;
using MareSynchronosShared.Data;
using MareSynchronosShared.Models;
using MareSynchronosShared.Utils;
using Microsoft.EntityFrameworkCore;
namespace MareSynchronosServices.Discord;
public partial class MareWizardModule
{
[ComponentInteraction("wizard-recover")]
public async Task ComponentRecover()
{
if (!(await ValidateInteraction().ConfigureAwait(false))) return;
using var mareDb = GetDbContext();
EmbedBuilder eb = new();
eb.WithColor(Color.Blue);
eb.WithTitle("Recover");
eb.WithDescription("In case you have lost your secret key you can recover it here." + Environment.NewLine + Environment.NewLine
+ "Use the selection below to select the user account you want to recover." + Environment.NewLine + Environment.NewLine
+ "- 1⃣ is your primary account/UID" + Environment.NewLine
+ "- 2⃣ are all your secondary accounts/UIDs" + Environment.NewLine
+ "If you are using Vanity UIDs the original UID is displayed in the second line of the account selection.");
ComponentBuilder cb = new();
await AddUserSelection(mareDb, cb, "wizard-recover-select").ConfigureAwait(false);
AddHome(cb);
await ModifyInteraction(eb, cb).ConfigureAwait(false);
}
[ComponentInteraction("wizard-recover-select")]
public async Task SelectionRecovery(string uid)
{
if (!(await ValidateInteraction().ConfigureAwait(false))) return;
using var mareDb = GetDbContext();
EmbedBuilder eb = new();
eb.WithColor(Color.Green);
await HandleRecovery(mareDb, eb, uid).ConfigureAwait(false);
ComponentBuilder cb = new();
AddHome(cb);
await ModifyInteraction(eb, cb).ConfigureAwait(false);
}
private async Task HandleRecovery(MareDbContext db, EmbedBuilder embed, string uid)
{
string computedHash = string.Empty;
Auth auth;
var previousAuth = await db.Auth.Include(u => u.User).FirstOrDefaultAsync(u => u.UserUID == uid).ConfigureAwait(false);
if (previousAuth != null)
{
db.Auth.Remove(previousAuth);
}
computedHash = StringUtils.Sha256String(StringUtils.GenerateRandomString(64) + DateTime.UtcNow.ToString());
auth = new Auth()
{
HashedKey = StringUtils.Sha256String(computedHash),
User = previousAuth.User,
PrimaryUserUID = previousAuth.PrimaryUserUID
};
await db.Auth.AddAsync(auth).ConfigureAwait(false);
embed.WithTitle($"Recovery for {uid} complete");
embed.WithDescription("This is your new private secret key. Do not share this private secret key with anyone. **If you lose it, it is irrevocably lost.**"
+ Environment.NewLine + Environment.NewLine
+ $"**{computedHash}**"
+ Environment.NewLine + Environment.NewLine
+ "Enter this key in the Mare Synchronos Service Settings and reconnect to the service.");
await db.Auth.AddAsync(auth).ConfigureAwait(false);
await db.SaveChangesAsync().ConfigureAwait(false);
}
}