diff --git a/I18N Commander/DataModel/Database/Common/DataContext.cs b/I18N Commander/DataModel/Database/Common/DataContext.cs index 4e9c8be..3cfa6dd 100644 --- a/I18N Commander/DataModel/Database/Common/DataContext.cs +++ b/I18N Commander/DataModel/Database/Common/DataContext.cs @@ -143,24 +143,48 @@ public sealed class DataContext : DbContext, IDataContext bool TranslateManual, JsonUniqueId TextElementUniqueId ); - + /// /// Exports this database to a JSON file. /// /// The path to the JSON file. - public async Task ExportAsync(string path) + /// When false, exclude sensitive data from export. + public async Task ExportAsync(string path, bool includeSensitiveData = false) { var jsonSettings = new JsonSerializerOptions { WriteIndented = true, Converters = { new JsonUniqueIdConverter() }, }; + + // Maintained list of sensitive data to be removed from the export: + var sensitiveSettingCodes = new HashSet + { + SettingNames.DEEPL_API_KEY, + }; + + // A local filter function to remove sensitive data from the export. + // Removing just the sensitive values instead of the entire setting. + IEnumerable FilterSensitiveSettings(IEnumerable settings) + { + foreach (var setting in settings) + { + if (sensitiveSettingCodes!.Contains(setting.Code)) + yield return new JsonSetting(setting.UniqueId, setting.Code, string.Empty, 0, false, Guid.Empty); + else + yield return setting; + } + } await using var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None); await JsonSerializer.SerializeAsync(fileStream, new JsonData { - Settings = this.Settings.OrderBy(n => n.UniqueId).Select(n => n.ToJsonSetting()).ToList(), + Settings = includeSensitiveData ? + // Include all settings, including sensitive data: + this.Settings.OrderBy(n => n.UniqueId).Select(n => n.ToJsonSetting()).ToList() : + // Exclude sensitive data: + FilterSensitiveSettings(this.Settings.OrderBy(n => n.UniqueId).Select(n => n.ToJsonSetting()).AsEnumerable()).ToList(), Sections = this.Sections.OrderBy(n => n.UniqueId).Select(n => n.ToJsonSection()).ToList(), TextElements = this.TextElements.OrderBy(n => n.UniqueId).Select(n => n.ToJsonTextElement()).ToList(), Translations = this.Translations.OrderBy(n => n.UniqueId).Select(n => n.ToJsonTranslation()).ToList(), diff --git a/I18N Commander/DataModel/Database/Common/IDataContext.cs b/I18N Commander/DataModel/Database/Common/IDataContext.cs index 7888beb..34dd1c1 100644 --- a/I18N Commander/DataModel/Database/Common/IDataContext.cs +++ b/I18N Commander/DataModel/Database/Common/IDataContext.cs @@ -12,5 +12,5 @@ public interface IDataContext public DbSet Translations { get; set; } - public Task ExportAsync(string path); + public Task ExportAsync(string path, bool includeSensitiveData = false); } \ No newline at end of file diff --git a/I18N Commander/Processor/ExportProcessor.cs b/I18N Commander/Processor/ExportProcessor.cs index bffd116..55f2106 100644 --- a/I18N Commander/Processor/ExportProcessor.cs +++ b/I18N Commander/Processor/ExportProcessor.cs @@ -26,7 +26,13 @@ public static class ExportProcessor { await EXPORT_SEMAPHORE_EXPORTING.WaitAsync(); await using var db = ProcessorMeta.ServiceProvider.GetRequiredService(); - await db.ExportAsync(Environment.ExpandEnvironmentVariables(Path.Join(await AppSettings.GetAutoExportDestinationPath(), await AppSettings.GetAutoExportFilename()))); + await db.ExportAsync( + path: Environment.ExpandEnvironmentVariables( + Path.Join(await AppSettings.GetAutoExportDestinationPath(), + await AppSettings.GetAutoExportFilename()) + ), + includeSensitiveData: await AppSettings.GetAutoExportSensitiveData() + ); } finally { diff --git a/I18N Commander/Processor/Version.cs b/I18N Commander/Processor/Version.cs index 62de691..592ab98 100644 --- a/I18N Commander/Processor/Version.cs +++ b/I18N Commander/Processor/Version.cs @@ -2,5 +2,5 @@ public static class Version { - public static string Text => $"v0.8.0 (2023-01-22), .NET {Environment.Version}"; + public static string Text => $"v0.8.1 (2023-01-24), .NET {Environment.Version}"; } \ No newline at end of file