From 7d358e0c00dca63f73c1917d865c43c20436cad4 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Mon, 5 Aug 2024 11:38:47 +0200 Subject: [PATCH] Implement general settings on credential page (#145) --- .../Main/Components/Email/RecentEmails.razor | 17 ++++-- .../Main/Pages/Credentials/AddEdit.razor | 47 ++++++++++------ .../Main/Pages/Settings/General.razor | 56 ++++++++++++------- .../Services/Database/DbService.cs | 12 ---- .../Services/SettingsService.cs | 6 +- .../wwwroot/css/tailwind.css | 6 ++ 6 files changed, 87 insertions(+), 57 deletions(-) diff --git a/src/AliasVault.Client/Main/Components/Email/RecentEmails.razor b/src/AliasVault.Client/Main/Components/Email/RecentEmails.razor index d99d26679..b28db3768 100644 --- a/src/AliasVault.Client/Main/Components/Email/RecentEmails.razor +++ b/src/AliasVault.Client/Main/Components/Email/RecentEmails.razor @@ -24,7 +24,10 @@

Email

-
+ @if (RefreshTimer is not null) + { +
+ } @@ -114,9 +117,13 @@ } IsSpamOk = IsSpamOkDomain(EmailAddress); - RefreshTimer = new Timer(2000); - RefreshTimer.Elapsed += async (sender, e) => await TimerRefresh(); - RefreshTimer.Start(); + // Only enable auto-refresh if the setting is enabled. + if (DbService.Settings.AutoEmailRefresh) + { + RefreshTimer = new Timer(2000); + RefreshTimer.Elapsed += async (sender, e) => await TimerRefresh(); + RefreshTimer.Start(); + } } /// @@ -284,7 +291,7 @@ Error = "The current chosen email address is already in use. Please change the email address by editing this credential."; break; case "CLAIM_DOES_NOT_EXIST": - Error = "An error occurred while trying to load the emails. Please try to edit and" + + Error = "An error occurred while trying to load the emails. Please try to edit and " + "save the credential entry to synchronize the database, then again."; break; default: diff --git a/src/AliasVault.Client/Main/Pages/Credentials/AddEdit.razor b/src/AliasVault.Client/Main/Pages/Credentials/AddEdit.razor index 8855a3026..52758ccbd 100644 --- a/src/AliasVault.Client/Main/Pages/Credentials/AddEdit.razor +++ b/src/AliasVault.Client/Main/Pages/Credentials/AddEdit.razor @@ -240,7 +240,7 @@ else // Create new Obj var alias = new Credential(); alias.Alias = new Alias(); - alias.Alias.Email = string.Empty; + alias.Alias.Email = "@" + GetDefaultEmailDomain(); alias.Service = new Service(); alias.Passwords = new List { new Password() }; @@ -282,23 +282,9 @@ else Obj.Alias.AddressCountry = identity.Address.Country; Obj.Alias.Hobbies = identity.Hobbies[0]; - var defaultDomain = Config.PrivateEmailDomains[0]; - if (defaultDomain == "DISABLED.TLD") - { - if (Config.PublicEmailDomains.Count == 0) - { - Obj.Alias.Email = identity.EmailPrefix + "@example.com"; - } - else - { - Obj.Alias.Email = identity.EmailPrefix + "@" + Config.PublicEmailDomains[0]; - } - } - else - { - Obj.Alias.Email = identity.EmailPrefix + "@" + defaultDomain; - } - + // Set the email + var emailDomain = GetDefaultEmailDomain(); + Obj.Alias.Email = $"{identity.EmailPrefix}@{emailDomain}"; Obj.Alias.PhoneMobile = identity.PhoneMobile; Obj.Alias.BankAccountIBAN = identity.BankAccountIBAN; @@ -414,4 +400,29 @@ else return credential; } + + /// + /// Gets the default email domain based on settings and available domains. + /// + private string GetDefaultEmailDomain() + { + var defaultDomain = DbService.Settings.DefaultEmailDomain; + + // Function to check if a domain is valid + bool IsValidDomain(string domain) => + !string.IsNullOrEmpty(domain) && + domain != "DISABLED.TLD" && + (Config.PublicEmailDomains.Contains(domain) || Config.PrivateEmailDomains.Contains(domain)); + + // Get the first valid domain from private or public domains + string GetFirstValidDomain() => + Config.PrivateEmailDomains.FirstOrDefault(IsValidDomain) ?? + Config.PublicEmailDomains.FirstOrDefault() ?? + "example.com"; + + // Use the default domain if it's valid, otherwise get the first valid domain + string domainToUse = IsValidDomain(defaultDomain) ? defaultDomain : GetFirstValidDomain(); + + return domainToUse; + } } diff --git a/src/AliasVault.Client/Main/Pages/Settings/General.razor b/src/AliasVault.Client/Main/Pages/Settings/General.razor index de65dc663..cd9419348 100644 --- a/src/AliasVault.Client/Main/Pages/Settings/General.razor +++ b/src/AliasVault.Client/Main/Pages/Settings/General.razor @@ -16,53 +16,67 @@
- @if (ShowPrivateDomains) { - - @foreach (var domain in PrivateDomains) - { - - } - + + @foreach (var domain in PrivateDomains) + { + + } + } @foreach (var domain in PublicDomains) { - + } + + Set the default email domain that will be used when creating new credentials. +
- +
- @code { private List PrivateDomains => Config.PrivateEmailDomains; private List PublicDomains => Config.PublicEmailDomains; private bool ShowPrivateDomains => PrivateDomains.Count > 0 && !(PrivateDomains.Count == 1 && PrivateDomains[0] == "DISABLED.TLD"); - private string DefaultEmailDomain - { - get => DbService.Settings.DefaultEmailDomain; - set => DbService.Settings.SetDefaultEmailDomain(value).Wait(); - } - - private bool AutoEmailRefresh - { - get => DbService.Settings.AutoEmailRefresh; - set => DbService.Settings.SetAutoEmailRefreshAsync(value).Wait(); - } + private string DefaultEmailDomain { get; set; } = string.Empty; + private bool AutoEmailRefresh { get; set; } /// protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); BreadcrumbItems.Add(new BreadcrumbItem { DisplayName = "Vault settings" }); + + DefaultEmailDomain = DbService.Settings.DefaultEmailDomain; + AutoEmailRefresh = DbService.Settings.AutoEmailRefresh; + } + + /// + /// Updates the default email domain. + /// + private async Task UpdateDefaultEmailDomain() + { + await DbService.Settings.SetDefaultEmailDomain(DefaultEmailDomain); + StateHasChanged(); + } + + /// + /// Updates the auto email refresh setting. + /// + private async Task UpdateAutoEmailRefresh() + { + await DbService.Settings.SetAutoEmailRefresh(AutoEmailRefresh); + StateHasChanged(); } } diff --git a/src/AliasVault.Client/Services/Database/DbService.cs b/src/AliasVault.Client/Services/Database/DbService.cs index b859d5d94..3c95ae5d2 100644 --- a/src/AliasVault.Client/Services/Database/DbService.cs +++ b/src/AliasVault.Client/Services/Database/DbService.cs @@ -467,23 +467,11 @@ public class DbService : IDisposable .Select(email => email!) .ToListAsync(); - Console.WriteLine("Before filtering email addresses:"); - foreach (var email in emailAddresses) - { - Console.WriteLine(email); - } - // Filter the list of email addresses to only include those that are in the allowed domains. emailAddresses = emailAddresses .Where(email => _config.PrivateEmailDomains.Exists(domain => email.EndsWith(domain))) .ToList(); - Console.WriteLine("After filtering email addresses:"); - foreach (var email in emailAddresses) - { - Console.WriteLine(email); - } - var databaseVersion = await GetCurrentDatabaseVersionAsync(); var vaultObject = new Vault(encryptedDatabase, databaseVersion, publicEncryptionKey, emailAddresses, DateTime.Now, DateTime.Now); diff --git a/src/AliasVault.Client/Services/SettingsService.cs b/src/AliasVault.Client/Services/SettingsService.cs index 514f62aab..504aad6b4 100644 --- a/src/AliasVault.Client/Services/SettingsService.cs +++ b/src/AliasVault.Client/Services/SettingsService.cs @@ -50,7 +50,7 @@ public class SettingsService /// /// The new value. /// Task. - public Task SetAutoEmailRefreshAsync(bool value) => SetSettingAsync("AutoEmailRefresh", value); + public Task SetAutoEmailRefresh(bool value) => SetSettingAsync("AutoEmailRefresh", value); /// /// Initializes the settings service asynchronously. @@ -157,6 +157,10 @@ public class SettingsService db.Settings.Update(setting); } + // Also update the setting in the local dictionary so the new value + // is returned by subsequent local reads. + _settings[key] = value; + await _dbService.SaveDatabaseAsync(); } diff --git a/src/AliasVault.Client/wwwroot/css/tailwind.css b/src/AliasVault.Client/wwwroot/css/tailwind.css index 1237e7713..7ebfd9c4c 100644 --- a/src/AliasVault.Client/wwwroot/css/tailwind.css +++ b/src/AliasVault.Client/wwwroot/css/tailwind.css @@ -1145,6 +1145,12 @@ video { overscroll-behavior-y: auto; } +.truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + .whitespace-nowrap { white-space: nowrap; }