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