From b7c43b57d6bd19c5065193babc6de82afdd8b1c7 Mon Sep 17 00:00:00 2001 From: Maxhy Date: Mon, 11 Mar 2024 14:06:29 +0100 Subject: [PATCH] Add Resolve Variables option on Publish --- .../Properties/Resources.Designer.cs | 9 ++++ .../Properties/Resources.fr.resx | 3 ++ .../Properties/Resources.resx | 3 ++ .../PublishKeyStoreDialog.xaml | 7 ++- KeyManager.Library/KeyStore/KeyStore.cs | 52 ++++++++++++------- KeyManager.Library/KeyStore/StoreOptions.cs | 8 +++ 6 files changed, 63 insertions(+), 19 deletions(-) diff --git a/KeyManager.Library.UI/Properties/Resources.Designer.cs b/KeyManager.Library.UI/Properties/Resources.Designer.cs index f712690..ff29720 100644 --- a/KeyManager.Library.UI/Properties/Resources.Designer.cs +++ b/KeyManager.Library.UI/Properties/Resources.Designer.cs @@ -1212,6 +1212,15 @@ public static string ResolveKeyLinks { } } + /// + /// Looks up a localized string similar to Resolve Variables. + /// + public static string ResolveVariables { + get { + return ResourceManager.GetString("ResolveVariables", resourceCulture); + } + } + /// /// Looks up a localized string similar to Salt. /// diff --git a/KeyManager.Library.UI/Properties/Resources.fr.resx b/KeyManager.Library.UI/Properties/Resources.fr.resx index 88f1c10..022f986 100644 --- a/KeyManager.Library.UI/Properties/Resources.fr.resx +++ b/KeyManager.Library.UI/Properties/Resources.fr.resx @@ -501,6 +501,9 @@ Résoudre la liaison des clés + + Résoudre les variables + Sel diff --git a/KeyManager.Library.UI/Properties/Resources.resx b/KeyManager.Library.UI/Properties/Resources.resx index 4e39855..c1e88e1 100644 --- a/KeyManager.Library.UI/Properties/Resources.resx +++ b/KeyManager.Library.UI/Properties/Resources.resx @@ -501,6 +501,9 @@ Resolve Key links + + Resolve Variables + Salt diff --git a/KeyManager.Library.UI/PublishKeyStoreDialog.xaml b/KeyManager.Library.UI/PublishKeyStoreDialog.xaml index 25fbd44..d7c5228 100644 --- a/KeyManager.Library.UI/PublishKeyStoreDialog.xaml +++ b/KeyManager.Library.UI/PublishKeyStoreDialog.xaml @@ -31,13 +31,18 @@ + + + + + materialDesign:HintAssist.Hint="{x:Static properties:Resources.PublishVariable}" + Visibility="{Binding Options.ResolveVariables, Converter={StaticResource BooleanToVisibilityConverter}}"/> diff --git a/KeyManager.Library/KeyStore/KeyStore.cs b/KeyManager.Library/KeyStore/KeyStore.cs index ec68092..cd50025 100644 --- a/KeyManager.Library/KeyStore/KeyStore.cs +++ b/KeyManager.Library/KeyStore/KeyStore.cs @@ -272,10 +272,12 @@ public virtual async Task Publish(KeyStore store, Func getFav var entry = await Get(id, keClass); if (entry != null) { - entry.Identifier = entry.Identifier.Clone(Attributes); + var resolveKeyLinks = (Options?.ResolveKeyLinks).GetValueOrDefault(true); + var resolveVariables = (Options?.ResolveVariables).GetValueOrDefault(true); + entry.Identifier = entry.Identifier.Clone(resolveVariables ? Attributes : null); if (entry.Link != null && entry.Link.KeyIdentifier.IsConfigured() && !string.IsNullOrEmpty(entry.Link.KeyStoreFavorite)) { - if ((Options?.ResolveKeyLinks).GetValueOrDefault(true)) + if (resolveKeyLinks) { var cryptogram = new KeyEntryCryptogram { @@ -294,7 +296,7 @@ public virtual async Task Publish(KeyStore store, Func getFav KeyStore = ks, KeyEntry = entry }; - cryptogram.Value = await ks.ResolveKeyEntryLink(entry.Link.KeyIdentifier.Clone(Attributes), keClass, ComputeDivInput(divContext, entry.Link.DivInput), entry.Link.WrappingKey); + cryptogram.Value = await ks.ResolveKeyEntryLink(entry.Link.KeyIdentifier.Clone(resolveVariables ? Attributes : null), keClass, ComputeDivInput(divContext, entry.Link.DivInput), entry.Link.WrappingKey); } finally { @@ -305,38 +307,52 @@ public virtual async Task Publish(KeyStore store, Func getFav } else { + if (resolveVariables) + { + entry.Link.KeyIdentifier = entry.Link.KeyIdentifier.Clone(Attributes); + } changes.Add(entry); } } else { - if ((Options?.ResolveKeyLinks).GetValueOrDefault(true) && entry.Variant != null) + if (entry.Variant != null) { foreach (var kv in entry.Variant.KeyContainers) { if (kv.Key.Link != null && kv.Key.Link.KeyIdentifier.IsConfigured() && !string.IsNullOrEmpty(kv.Key.Link.KeyStoreFavorite)) { - var ks = getFavoriteKeyStore(kv.Key.Link.KeyStoreFavorite); - if (ks != null) + if (resolveKeyLinks) { - await ks.Open(); - try + var ks = getFavoriteKeyStore(kv.Key.Link.KeyStoreFavorite); + if (ks != null) { - var divContext = new DivInput.DivInputContext + await ks.Open(); + try + { + var divContext = new DivInput.DivInputContext + { + KeyStore = ks, + KeyEntry = entry, + KeyContainer = kv + }; + kv.Key.SetAggregatedValueAsString(await ks.ResolveKeyLink(kv.Key.Link.KeyIdentifier.Clone(resolveVariables ? Attributes : null), keClass, kv.Key.Link.ContainerSelector, ComputeDivInput(divContext, kv.Key.Link.DivInput))); + } + finally { - KeyStore = ks, - KeyEntry = entry, - KeyContainer = kv - }; - kv.Key.SetAggregatedValueAsString(await ks.ResolveKeyLink(kv.Key.Link.KeyIdentifier.Clone(Attributes), keClass, kv.Key.Link.ContainerSelector, ComputeDivInput(divContext, kv.Key.Link.DivInput))); + await ks.Close(); + } } - finally + // We remove link information from the being pushed key entry + kv.Key.Link = new KeyLink(); + } + else + { + if (resolveVariables) { - await ks.Close(); + kv.Key.Link.KeyIdentifier = kv.Key.Link.KeyIdentifier.Clone(Attributes); } } - // We remove link information from the being pushed key entry - kv.Key.Link = new KeyLink(); } } } diff --git a/KeyManager.Library/KeyStore/StoreOptions.cs b/KeyManager.Library/KeyStore/StoreOptions.cs index 4b334f6..779775d 100644 --- a/KeyManager.Library/KeyStore/StoreOptions.cs +++ b/KeyManager.Library/KeyStore/StoreOptions.cs @@ -8,6 +8,7 @@ public StoreOptions() { _wrappingKey = new WrappingKey(); _resolveKeyLinks = true; + _resolveVariables = true; } private WrappingKey _wrappingKey; @@ -31,6 +32,13 @@ public bool ResolveKeyLinks set => SetProperty(ref _resolveKeyLinks, value); } + private bool _resolveVariables; + public bool ResolveVariables + { + get => _resolveVariables; + set => SetProperty(ref _resolveVariables, value); + } + private bool _dryRun; public bool DryRun {