From 85c0354d2aa21a5124b1c4d0f192732ec1bc43e2 Mon Sep 17 00:00:00 2001 From: grim Date: Sun, 2 Nov 2025 15:52:04 +0100 Subject: [PATCH] improvements --- BuildOutput/bin/Debug/net9.0/certmgr.dll | Bin 126464 -> 145920 bytes BuildOutput/bin/Debug/net9.0/certmgr.exe | Bin 156160 -> 156160 bytes BuildOutput/bin/Debug/net9.0/certmgr.pdb | Bin 66936 -> 74104 bytes .../Impl/CertStoreStorageContextConverter.cs | 125 ++++++++++++++++++ .../Impl/FileStorageContextConverter.cs | 99 ++++++++++++++ .../Impl/StorageContextConverter.cs | 8 ++ .../Core/Converters/Impl/StorageConverter.cs | 78 ++++++++++- .../Converters/Impl/StorageKindConverter.cs | 47 +++++++ .../Core/Converters/Impl/TimeSpanConverter.cs | 2 +- certmgr/Core/Jobs/JobBase.cs | 3 + certmgr/Core/PropertyDescriptor.cs | 30 ++++- certmgr/Core/SettingsBuilder.cs | 77 ++++++++--- certmgr/Core/Storage/CertStoreLocation.cs | 9 ++ certmgr/Core/Storage/CertStoreName.cs | 9 ++ certmgr/Core/Storage/CertStoreStorage.cs | 100 ++++++++++++++ .../Core/Storage/CertStoreStorageContext.cs | 42 ++++++ certmgr/Core/Storage/CertificateFilter.cs | 27 ++++ certmgr/Core/Storage/EmptyStorage.cs | 10 +- certmgr/Core/Storage/FileStorage.cs | 32 +---- certmgr/Core/Storage/FileStorageContext.cs | 16 +++ certmgr/Core/Storage/Filter.cs | 38 ++++++ certmgr/Core/Storage/IFilter.cs | 6 + certmgr/Core/Storage/IStorage.cs | 8 +- certmgr/Core/Storage/Storage.cs | 56 +++----- certmgr/Core/Storage/StorageContext.cs | 5 + certmgr/Core/Utils/TypeInfo.cs | 4 + certmgr/Jobs/CertificateSettings.cs | 114 ++++++++++++++-- certmgr/Jobs/CreateCertificateJob.cs | 11 +- certmgr/Program.cs | 32 +++-- certmgr/certmgr.csproj | 4 + certmgrTest/CertStoreStorageTest.cs | 20 +++ certmgrTest/PropertyDescriptorTest.cs | 82 ++++++++++++ certmgrTest/SubjectValidatorTest.cs | 2 +- 33 files changed, 977 insertions(+), 119 deletions(-) create mode 100644 certmgr/Core/Converters/Impl/CertStoreStorageContextConverter.cs create mode 100644 certmgr/Core/Converters/Impl/FileStorageContextConverter.cs create mode 100644 certmgr/Core/Converters/Impl/StorageContextConverter.cs create mode 100644 certmgr/Core/Converters/Impl/StorageKindConverter.cs create mode 100644 certmgr/Core/Storage/CertStoreLocation.cs create mode 100644 certmgr/Core/Storage/CertStoreName.cs create mode 100644 certmgr/Core/Storage/CertStoreStorage.cs create mode 100644 certmgr/Core/Storage/CertStoreStorageContext.cs create mode 100644 certmgr/Core/Storage/CertificateFilter.cs create mode 100644 certmgr/Core/Storage/FileStorageContext.cs create mode 100644 certmgr/Core/Storage/Filter.cs create mode 100644 certmgr/Core/Storage/IFilter.cs create mode 100644 certmgr/Core/Storage/StorageContext.cs create mode 100644 certmgrTest/CertStoreStorageTest.cs create mode 100644 certmgrTest/PropertyDescriptorTest.cs diff --git a/BuildOutput/bin/Debug/net9.0/certmgr.dll b/BuildOutput/bin/Debug/net9.0/certmgr.dll index 0503a3e9fb02f8fa263849a100a3be91895ea10c..a5fcb2189f872e8e1fbef1bacabe3534fb65620b 100644 GIT binary patch literal 145920 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 literal 126464 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 B-?ab$ diff --git a/BuildOutput/bin/Debug/net9.0/certmgr.exe b/BuildOutput/bin/Debug/net9.0/certmgr.exe index 327056e211085a49ee4dd44d1eab97dae9b1fc46..9a5164c6350710d191c9e724afaaa23e2a82cbce 100644 GIT binary patch delta 99 zcmZoT!r1^sEsR^3zQp+_F_!5j#afNUe6h$RpwGZ-^i0OgZ_ iBBnr|DUfdh6iEWI6M-r$fV#~X41qXhyK_9#UM2uPN)tT* delta 99 zcmZoT!r1^sEsR^3zQp;PGNdphG8i)$F<1bx0gy~)uw*c0FbC49Ky1R01Z0~5RU|PO h0%cNxa!EjSi9nt?kTwMJ4S?7btj2V^b3D^tCIA-A5;_0? diff --git a/BuildOutput/bin/Debug/net9.0/certmgr.pdb b/BuildOutput/bin/Debug/net9.0/certmgr.pdb index 18bafc10ed469a6d410ad17ac67db9383b8958c6..fdd65cb763d41e7fdbf6050af595eac0b8bac761 100644 GIT binary patch delta 33992 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 diff --git a/certmgr/Core/Converters/Impl/CertStoreStorageContextConverter.cs b/certmgr/Core/Converters/Impl/CertStoreStorageContextConverter.cs new file mode 100644 index 0000000..ab75750 --- /dev/null +++ b/certmgr/Core/Converters/Impl/CertStoreStorageContextConverter.cs @@ -0,0 +1,125 @@ +using System.Diagnostics.CodeAnalysis; +using System.Security.Cryptography.X509Certificates; + +using CertMgr.Core.Log; +using CertMgr.Core.Storage; +using CertMgr.Core.Utils; + +namespace CertMgr.Core.Converters.Impl; + +internal sealed class CertStoreStorageContextConverter : StorageContextConverter +{ + protected override Task DoConvertAsync(string rawValue, Type targetType, CancellationToken cancellationToken) + { + ReadOnlySpan storageDefinition = rawValue.AsSpan(); + + TryGetCertStore(storageDefinition, out CertStoreStorageContext? context); + + return Task.FromResult(context); + } + + private bool TryGetCertStore(ReadOnlySpan storageDefinition, [NotNullWhen(true)] out CertStoreStorageContext? context) + { + // expecting 'storageDefinition' is something like: + // || + // where can be: + // - 'user' + // - 'machine' + // where ' can be: + // - 'my' + // - 'root' + // where can be: + // - 'default' + // - 'exportable' + + int firstSplitIndex = storageDefinition.IndexOf(Separator); + if (firstSplitIndex != -1) + { + // there is a splitter. On the left side of it there must be . On the right there is a + + ReadOnlySpan locationSpan = storageDefinition.Slice(0, firstSplitIndex); + int secondSplitIndex = storageDefinition.Slice(firstSplitIndex + 1).IndexOf(Separator) + locationSpan.Length + 1; + ReadOnlySpan nameSpan = storageDefinition.Slice(firstSplitIndex + 1, secondSplitIndex - firstSplitIndex - 1); + ReadOnlySpan flagsSpan = storageDefinition.Slice(secondSplitIndex + 1); + + CertStoreLocation? storeLocation = null; + CertStoreName? storeName = null; + X509KeyStorageFlags? flags = null; + if (locationSpan.Equals("user", StringComparison.OrdinalIgnoreCase)) + { + storeLocation = CertStoreLocation.User; + } + else if (locationSpan.Equals("machine", StringComparison.OrdinalIgnoreCase)) + { + storeLocation = CertStoreLocation.Machine; + } + else + { + CLog.Error("{0}: Unsupported store-location '{1}' for storage '{2}'", GetType().ToString(false), locationSpan.ToString(), typeof(CertStoreStorage).ToString(false)); + } + + if (nameSpan.Equals("my", StringComparison.OrdinalIgnoreCase)) + { + storeName = CertStoreName.My; + } + else if (nameSpan.Equals("root", StringComparison.OrdinalIgnoreCase)) + { + storeName = CertStoreName.Root; + } + else + { + CLog.Error("{0}: Unsupported store-name '{1}' for storage '{2}'", GetType().ToString(false), nameSpan.ToString(), typeof(CertStoreStorage).ToString(false)); + } + + if (flagsSpan.Length > 0) + { + MemoryExtensions.SpanSplitEnumerator enu = flagsSpan.Split(','); + while (enu.MoveNext()) + { + ReadOnlySpan currentExt = flagsSpan[enu.Current].Trim(); + if (currentExt.Equals("default", StringComparison.OrdinalIgnoreCase)) + { + if (flags.HasValue) + { + flags |= X509KeyStorageFlags.DefaultKeySet; + } + else + { + flags = X509KeyStorageFlags.DefaultKeySet; + } + } + else if (currentExt.Equals("exportable", StringComparison.OrdinalIgnoreCase)) + { + if (flags.HasValue) + { + flags |= X509KeyStorageFlags.Exportable; + } + else + { + flags = X509KeyStorageFlags.Exportable; + } + } + } + } + else + { + CLog.Error("{0}: cert storage-flags not defined", GetType().ToString(false)); + } + + if (storeLocation.HasValue && storeName.HasValue) + { + context = new CertStoreStorageContext(storeLocation.Value, storeName.Value, flags.Value); + } + else + { + context = null; + } + } + else + { + context = null; + } + + return context != null; + } +} diff --git a/certmgr/Core/Converters/Impl/FileStorageContextConverter.cs b/certmgr/Core/Converters/Impl/FileStorageContextConverter.cs new file mode 100644 index 0000000..e3ec12f --- /dev/null +++ b/certmgr/Core/Converters/Impl/FileStorageContextConverter.cs @@ -0,0 +1,99 @@ +using System.Diagnostics.CodeAnalysis; + +using CertMgr.Core.Log; +using CertMgr.Core.Storage; +using CertMgr.Core.Utils; + +namespace CertMgr.Core.Converters.Impl; + +internal class FileStorageContextConverter : StorageContextConverter +{ + protected override Task DoConvertAsync(string rawValue, Type targetType, CancellationToken cancellationToken) + { + ReadOnlySpan storageDefinition = rawValue.AsSpan(); + + TryGetFileStore(storageDefinition, out FileStorageContext? context); + + return Task.FromResult(context); + } + + private bool TryGetFileStore(ReadOnlySpan storageDefinition, [NotNullWhen(true)] out FileStorageContext? context) + { + // expecting that 'storageDefinition' is something like: + // | + // or + // | + // or + // + // + // where can be: + // 'o' or 'overwrite' or 'overwriteornew' + // or + // 'a' or 'append' or 'appendornew' + // or + // 'c' or 'create' or 'createnew' + // + // where can be: + // 'c:\path\myfile.txt' + // or + // '/path/myfile.txt' + // or + // './path/myfile.txt' + // in addition - can be either quoted or double-quoted + + context = null; + + FileStoreMode defaultStoreMode = FileStoreMode.OverwriteOrNew; + FileStoreMode storeMode; + ReadOnlySpan filename; + + int firstSplitIndex = storageDefinition.IndexOf(Separator); + if (firstSplitIndex != -1) + { + // there is a splitter. On the left side of it there must be . On the right there is a + + ReadOnlySpan firstPart = storageDefinition.Slice(0, firstSplitIndex); + filename = storageDefinition.Slice(firstSplitIndex + 1); + + if (firstPart.Length == 0) + { + storeMode = defaultStoreMode; + } + else if (Enum.TryParse(firstPart, true, out FileStoreMode tmpMode)) + { + storeMode = tmpMode; + } + else if (firstPart.Equals("w", StringComparison.OrdinalIgnoreCase) || firstPart.Equals("overwrite", StringComparison.OrdinalIgnoreCase)) + { + storeMode = FileStoreMode.OverwriteOrNew; + } + else if (firstPart.Equals("c", StringComparison.OrdinalIgnoreCase) || firstPart.Equals("createnew", StringComparison.OrdinalIgnoreCase)) + { + storeMode = FileStoreMode.Create; + } + else if (firstPart.Equals("a", StringComparison.OrdinalIgnoreCase) || firstPart.Equals("append", StringComparison.OrdinalIgnoreCase)) + { + storeMode = FileStoreMode.AppendOrNew; + } + else if (firstPart.Equals("o", StringComparison.OrdinalIgnoreCase) || firstPart.Equals("open", StringComparison.OrdinalIgnoreCase)) + { + storeMode = FileStoreMode.Open; + } + else + { + // it is not store-mode or there is a typo or unsupported value + CLog.Error(string.Format("{0}: Unsupported store-mode '{1}' for storage '{2}'", GetType().ToString(false), firstPart.ToString()), typeof(FileStorage).ToString(false)); + storeMode = defaultStoreMode; + } + } + else + { + // no split-char => just filename + storeMode = defaultStoreMode; + filename = storageDefinition; + } + + context = new FileStorageContext(filename.ToString(), storeMode); + return true; + } +} diff --git a/certmgr/Core/Converters/Impl/StorageContextConverter.cs b/certmgr/Core/Converters/Impl/StorageContextConverter.cs new file mode 100644 index 0000000..2e338f2 --- /dev/null +++ b/certmgr/Core/Converters/Impl/StorageContextConverter.cs @@ -0,0 +1,8 @@ +using CertMgr.Core.Storage; + +namespace CertMgr.Core.Converters.Impl; + +public abstract class StorageContextConverter : ValueConverter where T : StorageContext +{ + protected const char Separator = '|'; +} diff --git a/certmgr/Core/Converters/Impl/StorageConverter.cs b/certmgr/Core/Converters/Impl/StorageConverter.cs index bc334d8..9fd2d58 100644 --- a/certmgr/Core/Converters/Impl/StorageConverter.cs +++ b/certmgr/Core/Converters/Impl/StorageConverter.cs @@ -1,7 +1,9 @@ -using System.Diagnostics.CodeAnalysis; +/*using System.Diagnostics.CodeAnalysis; +using System.Security.Cryptography.X509Certificates; using CertMgr.Core.Log; using CertMgr.Core.Storage; +using CertMgr.Core.Utils; namespace CertMgr.Core.Converters.Impl; @@ -31,6 +33,13 @@ internal sealed class StorageConverter : ValueConverter storage = EmptyStorage.Empty; } break; + case "certstore": + case "cert-store": + if (!TryGetCertStore(storageDefinition, out storage)) + { + storage = EmptyStorage.Empty; + } + break; default: storage = EmptyStorage.Empty; break; @@ -104,7 +113,7 @@ internal sealed class StorageConverter : ValueConverter else { // it is not store-mode or there is a typo or unsupported value - CLog.Error(string.Concat("Unsupported store-mode '", firstPart, "'")); + CLog.Error(string.Format("{0}: Unsupported store-mode '{1}' for storage '{2}'", GetType().ToString(false), firstPart.ToString()), typeof(FileStorage).ToString(false)); storeMode = defaultStoreMode; } } @@ -118,4 +127,69 @@ internal sealed class StorageConverter : ValueConverter storage = new FileStorage(filename.ToString(), storeMode); return true; } + + private bool TryGetCertStore(ReadOnlySpan storageDefinition, [NotNullWhen(true)] out IStorage? storage) + { + // expecting 'storageDefinition' is something like: + // | + // where can be: + // - 'user' + // - 'machine' + // where ' can be: + // - 'my' + // - 'root' + + int firstSplitIndex = storageDefinition.IndexOf(Separator); + if (firstSplitIndex != -1) + { + // there is a splitter. On the left side of it there must be . On the right there is a + + ReadOnlySpan locationSpan = storageDefinition.Slice(0, firstSplitIndex); + ReadOnlySpan nameSpan = storageDefinition.Slice(firstSplitIndex + 1); + + StoreLocation? storeLocation = null; + StoreName? storeName = null; + if (locationSpan.Equals("user", StringComparison.OrdinalIgnoreCase)) + { + storeLocation = StoreLocation.CurrentUser; + } + else if (locationSpan.Equals("machine", StringComparison.OrdinalIgnoreCase)) + { + storeLocation = StoreLocation.LocalMachine; + } + else + { + CLog.Error(string.Format("{0}: Unsupported store-location '{1}' for storage '{2}'", GetType().ToString(false), locationSpan.ToString()), typeof(CertStoreStorage).ToString(false)); + } + + if (nameSpan.Equals("my", StringComparison.OrdinalIgnoreCase)) + { + storeName = StoreName.My; + } + else if (nameSpan.Equals("root", StringComparison.OrdinalIgnoreCase)) + { + storeName = StoreName.Root; + } + else + { + CLog.Error(string.Format("{0}: Unsupported store-name '{1}' for storage '{2}'", GetType().ToString(false), nameSpan.ToString()), typeof(CertStoreStorage).ToString(false)); + } + + if (storeLocation.HasValue && storeName.HasValue) + { + storage = new CertStoreStorage(storeLocation.Value, storeName.Value); + } + else + { + storage = null; + } + } + else + { + storage = null; + } + + return storage != null; + } } +*/ \ No newline at end of file diff --git a/certmgr/Core/Converters/Impl/StorageKindConverter.cs b/certmgr/Core/Converters/Impl/StorageKindConverter.cs new file mode 100644 index 0000000..16b16ce --- /dev/null +++ b/certmgr/Core/Converters/Impl/StorageKindConverter.cs @@ -0,0 +1,47 @@ +using CertMgr.Core.Storage; + +namespace CertMgr.Core.Converters.Impl; + +internal class StorageKindConverter : ValueConverter +{ + // private const char Separator = '|'; + + protected override Task DoConvertAsync(string rawValue, Type targetType, CancellationToken cancellationToken) + { + ReadOnlySpan storageTypeSpan = rawValue.AsSpan(); + + // int storageTypeSplitIndex = rawSpan.IndexOf(Separator); + // if (storageTypeSplitIndex == -1) + // { + // return Task.FromResult((IStorage?)EmptyStorage.Empty); + // } + + IStorage? storage; + + // ReadOnlySpan storageTypeSpan = rawSpan.Slice(0, storageTypeSplitIndex); + // ReadOnlySpan storageDefinition = rawSpan.Slice(storageTypeSplitIndex + 1); + switch (storageTypeSpan) + { + case "file": + storage = new FileStorage(); + // if (!TryGetFileStore(storageDefinition, out storage)) + // { + // storage = EmptyStorage.Empty; + // } + break; + case "certstore": + case "cert-store": + storage = new CertStoreStorage(); + //if (!TryGetCertStore(storageDefinition, out storage)) + //{ + // storage = EmptyStorage.Empty; + //} + break; + default: + storage = EmptyStorage.Empty; + break; + } + + return Task.FromResult((IStorage?)storage); + } +} \ No newline at end of file diff --git a/certmgr/Core/Converters/Impl/TimeSpanConverter.cs b/certmgr/Core/Converters/Impl/TimeSpanConverter.cs index d814d86..af09a14 100644 --- a/certmgr/Core/Converters/Impl/TimeSpanConverter.cs +++ b/certmgr/Core/Converters/Impl/TimeSpanConverter.cs @@ -36,7 +36,7 @@ public sealed class TimeSpanConverter : ValueConverter result = TimeSpan.FromDays(value); break; case 'y': - result = TimeSpan.FromDays(value * 365); + result = TimeSpan.FromDays(value * 365 + (value / 4)); break; default: result = null; diff --git a/certmgr/Core/Jobs/JobBase.cs b/certmgr/Core/Jobs/JobBase.cs index 420f191..666bcdb 100644 --- a/certmgr/Core/Jobs/JobBase.cs +++ b/certmgr/Core/Jobs/JobBase.cs @@ -4,8 +4,11 @@ namespace CertMgr.Core.Jobs; public abstract class JobBase where TSettings : JobSettings, new() { +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable. protected JobBase() +#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable. { + // 'Settings' is set via reflection Name = JobUtils.GetJobName(GetType()); } diff --git a/certmgr/Core/PropertyDescriptor.cs b/certmgr/Core/PropertyDescriptor.cs index 4cdf0a0..7a9f42a 100644 --- a/certmgr/Core/PropertyDescriptor.cs +++ b/certmgr/Core/PropertyDescriptor.cs @@ -105,16 +105,44 @@ internal sealed class PropertyDescriptor _propertyInfo.SetValue(settings, _settingAttribute.Default); succeeded = true; } + else if (typeInfo.IsElementTypeNullable) + { + _propertyInfo.SetValue(settings, _settingAttribute.Default); + succeeded = true; + } else { CLog.Error("Default value for argument '{0}' is specified, but its type is '{1}' instead of expected '{2}'", SettingName, _settingAttribute.Default?.GetType().ToString(false) ?? "", typeInfo.ElementType.ToString(false)); } - } return succeeded; } + public AsyncResult GetDefaultValue(JobSettings settings) + { + bool success = false; + + if (_settingAttribute.Default != null) + { + Utils.TypeInfo typeInfo = TypeUtils.UnwrapCollection(_propertyInfo.PropertyType); + if (_settingAttribute.Default.GetType() == typeInfo.ElementType) + { + success = true; + } + else if (typeInfo.IsElementTypeNullable) + { + success = true; + } + else + { + CLog.Error("Default value for argument '{0}' is specified, but its type is '{1}' instead of expected '{2}'", SettingName, _settingAttribute.Default?.GetType().ToString(false) ?? "", typeInfo.ElementType.ToString(false)); + } + } + + return new AsyncResult(success, _settingAttribute.Default); + } + public override string ToString() { return string.Format("property '{0}', type = {1}, is-mandatory = {2}, validator = {3}, converter = {4}", PropertyName, PropertyTypeInfo.SourceType.ToString(false), IsMandatory ? "yes" : "no", CustomValidator?.GetType().ToString(false) ?? "", CustomConverter?.GetType().ToString(false) ?? ""); diff --git a/certmgr/Core/SettingsBuilder.cs b/certmgr/Core/SettingsBuilder.cs index 7a002e0..40f7974 100644 --- a/certmgr/Core/SettingsBuilder.cs +++ b/certmgr/Core/SettingsBuilder.cs @@ -31,24 +31,20 @@ internal sealed class SettingsBuilder foreach (PropertyDescriptor descriptor in GetPropertiesWithSettingAttribute()) { - AsyncResult setPropertyResult = await SetPropertyValueAsync(settings, descriptor, cancellationToken).ConfigureAwait(false); - if (setPropertyResult.IsSuccess) + AsyncResult result = await GetValueAsync(descriptor, settings, cancellationToken); + + if (result.IsSuccess) { - try - { - IValueValidator? validator = descriptor.CustomValidator; - if (validator != null) - { - IValidationResult valres = await validator.ValidateAsync(setPropertyResult.Value, cancellationToken).ConfigureAwait(false); - settings.ValidationResults.Add(valres); - } - } - catch (Exception e) - { - CLog.Error(e, "Failed to validate property '{0}' (of type '{1}') in settings of type '{2}'", descriptor.PropertyName, descriptor.PropertyTypeInfo.SourceType.ToString(false), _settingsType.ToString(false)); - throw new ConsoleToolsException(e, "Failed to process property '{0}' (of type '{1}') in settings of type '{2}'", descriptor.PropertyName, descriptor.PropertyTypeInfo.SourceType.ToString(false), _settingsType.ToString(false)); - } + await ValidatePropertyAsync(result.Value, descriptor, settings, cancellationToken); + + descriptor.SetValue(settings, result.Value); } + + // AsyncResult setPropertyResult = await SetPropertyValueAsync(settings, descriptor, cancellationToken).ConfigureAwait(false); + // if (setPropertyResult.IsSuccess) + // { + // await ValidatePropertyAsync(setPropertyResult.Value, descriptor, settings, cancellationToken); + // } } return settings; @@ -91,6 +87,37 @@ internal sealed class SettingsBuilder return new AsyncResult(valueSet, convertedValue); } + private async Task> GetValueAsync(PropertyDescriptor descriptor, JobSettings settings, CancellationToken cancellationToken) + { + AsyncResult result; + + if (TryGetRawArgument(descriptor, out RawArgument? rawArg)) + { + try + { + result = await ConvertRawValueAsync(descriptor, rawArg, cancellationToken).ConfigureAwait(false); + } + catch (Exception e) + { + CLog.Error(e, "Failed to process property '{0}' (of type '{1}') in settings of type '{2}'", descriptor.PropertyName, descriptor.PropertyTypeInfo.SourceType.ToString(false), _settingsType.ToString(false)); + throw new ConsoleToolsException(e, "Failed to process property '{0}' (of type '{1}') in settings of type '{2}'", descriptor.PropertyName, descriptor.PropertyTypeInfo.SourceType.ToString(false), _settingsType.ToString(false)); + } + } + else if (descriptor.IsMandatory) + { + ValidationResult valres = new ValidationResult(descriptor.SettingName, false, "Mandatory argument is missing"); + settings.ValidationResults.Add(valres); + CLog.Error("mandatory argument '{0}' is missing", descriptor.SettingName); + result = new AsyncResult(false, null); + } + else + { + result = descriptor.GetDefaultValue(settings); + } + + return result; + } + private bool TryGetRawArgument(PropertyDescriptor descriptor, [NotNullWhen(true)] out RawArgument? rawArg) { rawArg = null; @@ -243,4 +270,22 @@ internal sealed class SettingsBuilder return convertedValue != null; } + + private async Task ValidatePropertyAsync(object? value, PropertyDescriptor descriptor, JobSettings settings, CancellationToken cancellationToken) + { + try + { + IValueValidator? validator = descriptor.CustomValidator; + if (validator != null) + { + IValidationResult valres = await validator.ValidateAsync(value, cancellationToken).ConfigureAwait(false); + settings.ValidationResults.Add(valres); + } + } + catch (Exception e) + { + CLog.Error(e, "Failed to validate property '{0}' (of type '{1}') in settings of type '{2}'", descriptor.PropertyName, descriptor.PropertyTypeInfo.SourceType.ToString(false), _settingsType.ToString(false)); + throw new ConsoleToolsException(e, "Failed to process property '{0}' (of type '{1}') in settings of type '{2}'", descriptor.PropertyName, descriptor.PropertyTypeInfo.SourceType.ToString(false), _settingsType.ToString(false)); + } + } } diff --git a/certmgr/Core/Storage/CertStoreLocation.cs b/certmgr/Core/Storage/CertStoreLocation.cs new file mode 100644 index 0000000..cd831e3 --- /dev/null +++ b/certmgr/Core/Storage/CertStoreLocation.cs @@ -0,0 +1,9 @@ +using System.Security.Cryptography.X509Certificates; + +namespace CertMgr.Core.Storage; + +public enum CertStoreLocation +{ + User = StoreLocation.CurrentUser, + Machine = StoreLocation.LocalMachine +} diff --git a/certmgr/Core/Storage/CertStoreName.cs b/certmgr/Core/Storage/CertStoreName.cs new file mode 100644 index 0000000..d018cd9 --- /dev/null +++ b/certmgr/Core/Storage/CertStoreName.cs @@ -0,0 +1,9 @@ +using System.Security.Cryptography.X509Certificates; + +namespace CertMgr.Core.Storage; + +public enum CertStoreName +{ + My = StoreName.My, + Root = StoreName.Root, +} diff --git a/certmgr/Core/Storage/CertStoreStorage.cs b/certmgr/Core/Storage/CertStoreStorage.cs new file mode 100644 index 0000000..9f9cc33 --- /dev/null +++ b/certmgr/Core/Storage/CertStoreStorage.cs @@ -0,0 +1,100 @@ +using System.Security.Cryptography.X509Certificates; + +using CertMgr.Core.Utils; + +namespace CertMgr.Core.Storage; + +public sealed class CertStoreStorage : Storage +{ + private static StoreResult NotFoundResult = new StoreResult(null, false); + + protected override async Task DoReadAsync(Stream target, CertStoreStorageContext context, CancellationToken cancellationToken) + { + StoreResult result = NotFoundResult; + + using (X509Store store = OpenCertStore(context, OpenFlags.ReadWrite)) + { + foreach (X509Certificate2 cert in store.Certificates) + { + if (await context.Filter.IsMatchAsync(cert, cancellationToken)) + { + result = new StoreResult(cert, true); + break; + } + } + } + + return result; + } + + protected override async Task DoWriteAsync(Stream source, CertStoreStorageContext context, CancellationToken cancellationToken) + { + X509KeyStorageFlags flags = X509KeyStorageFlags.EphemeralKeySet; + + await using (MemoryStream ms = await CopyAsync(source, cancellationToken)) + { + using (X509Certificate2 cert = LoadCertificate(ms.GetBuffer(), context.Password, flags)) + { + using (X509Store store = OpenCertStore(context, OpenFlags.ReadWrite)) + { + AddToCertStore(store, cert); + } + } + } + + return new StoreResult(true); + } + + private async Task CopyAsync(Stream source, CancellationToken cancellationToken) + { + try + { + MemoryStream ms = new MemoryStream(); + await source.CopyToAsync(ms).ConfigureAwait(false); + return ms; + } + catch (Exception e) + { + throw new StorageException(e, "{0}: Failure while reading from stream (source stream type = '{1}')", GetType().ToString(false), source.GetType().ToString(false)); + } + } + + private X509Certificate2 LoadCertificate(byte[] data, string password, X509KeyStorageFlags flags) + { + try + { + X509Certificate2 cert = X509CertificateLoader.LoadPkcs12(data, password, flags); + return cert; + } + catch (Exception e) + { + throw new StorageException(e, "{0}: Failure while loading certificate from specified source", GetType().ToString(false)); + } + } + + private X509Store OpenCertStore(CertStoreStorageContext context, OpenFlags flags) + { + try + { + X509Store store = new X509Store((StoreName)context.Name, (StoreLocation)context.Location); + store.Open(flags); + return store; + } + catch (Exception e) + { + throw new StorageException(e, "{0}: Failure while opening cert-store (name = '{0}', location = '{1}', open-mode = '{2}'", context.Name, context.Location, flags); + } + } + + private void AddToCertStore(X509Store store, X509Certificate2 cert) + { + try + { + store.Add(cert); + } + catch (Exception e) + { + throw new StorageException(e, "{0}: Failure while adding cert to cert-store (name = '{0}', location = '{1}', cert-subj = '{2}', cert-thumbprint = '{3}'", store.Name, store.Location, cert.Subject, cert.Thumbprint); + } + } +} diff --git a/certmgr/Core/Storage/CertStoreStorageContext.cs b/certmgr/Core/Storage/CertStoreStorageContext.cs new file mode 100644 index 0000000..eb017e7 --- /dev/null +++ b/certmgr/Core/Storage/CertStoreStorageContext.cs @@ -0,0 +1,42 @@ +using System.Diagnostics; +using System.Security.Cryptography.X509Certificates; + +using CertMgr.Core.Utils; + +namespace CertMgr.Core.Storage; + +public sealed class CertStoreStorageContext : StorageContext +{ + public CertStoreStorageContext(CertStoreLocation storeLocation, CertStoreName storeName, X509KeyStorageFlags flags) + { + Location = storeLocation; + Name = storeName; + Flags = flags; + Filter = Filter.NotMatch; + Password = string.Empty; + } + + public CertStoreStorageContext(CertStoreLocation storeLocation, CertStoreName storeName, X509KeyStorageFlags flags, IFilter filter) + { + Location = storeLocation; + Name = storeName; + Flags = flags; + Filter = filter; + Password = string.Empty; + } + + public CertStoreLocation Location { [DebuggerStepThrough] get; } + + public CertStoreName Name { [DebuggerStepThrough] get; } + + public X509KeyStorageFlags Flags { [DebuggerStepThrough] get; } + + public IFilter Filter { [DebuggerStepThrough] get; } + + public string Password { [DebuggerStepThrough] get; [DebuggerStepThrough] set; } + + public override string ToString() + { + return string.Format("{0}/{1}, flags = {2}, filter-type = {3}", Location, Name, Flags, Filter?.GetType().ToString(false) ?? ""); + } +} diff --git a/certmgr/Core/Storage/CertificateFilter.cs b/certmgr/Core/Storage/CertificateFilter.cs new file mode 100644 index 0000000..4d57c2f --- /dev/null +++ b/certmgr/Core/Storage/CertificateFilter.cs @@ -0,0 +1,27 @@ +using System.Diagnostics; +using System.Security.Cryptography.X509Certificates; + +namespace CertMgr.Core.Storage; + +public static class CertificateFilter +{ + private abstract class CertFilter : Filter + { + } + + private sealed class ByThumbprintFilter : CertFilter + { + public ByThumbprintFilter(string thumbprint) + { + Thumbprint = thumbprint; + } + + public string Thumbprint { [DebuggerStepThrough] get; } + + protected override Task DoIsMatchAsync(X509Certificate2 value, CancellationToken cancellationToken) + { + bool result = string.Equals(value.Thumbprint, Thumbprint, StringComparison.OrdinalIgnoreCase); + return Task.FromResult(result); + } + } +} diff --git a/certmgr/Core/Storage/EmptyStorage.cs b/certmgr/Core/Storage/EmptyStorage.cs index f0bf940..d39f89e 100644 --- a/certmgr/Core/Storage/EmptyStorage.cs +++ b/certmgr/Core/Storage/EmptyStorage.cs @@ -1,6 +1,6 @@ namespace CertMgr.Core.Storage; -public sealed class EmptyStorage : Storage +public sealed class EmptyStorage : Storage { public static readonly IStorage Empty = new EmptyStorage(); @@ -8,16 +8,12 @@ public sealed class EmptyStorage : Storage { } - public override bool CanWrite => true; - - public override bool CanRead => true; - - protected override Task DoWriteAsync(Stream source, CancellationToken cancellationToken) + protected override Task DoWriteAsync(Stream source, StorageContext context, CancellationToken cancellationToken) { return Task.FromResult(StoreResult.CreateSuccess()); } - protected override Task DoReadAsync(Stream target, CancellationToken cancellationToken) + protected override Task DoReadAsync(Stream target, StorageContext context, CancellationToken cancellationToken) { return Task.FromResult(StoreResult.CreateSuccess()); } diff --git a/certmgr/Core/Storage/FileStorage.cs b/certmgr/Core/Storage/FileStorage.cs index ad3a9b7..154ae8f 100644 --- a/certmgr/Core/Storage/FileStorage.cs +++ b/certmgr/Core/Storage/FileStorage.cs @@ -1,25 +1,10 @@ -using CertMgr.Core.Utils; +namespace CertMgr.Core.Storage; -namespace CertMgr.Core.Storage; - -public sealed class FileStorage : Storage +public sealed class FileStorage : Storage { - private readonly string _fileFullPath; - private readonly FileStoreMode _mode; - - public FileStorage(string fileFullPath, FileStoreMode mode) + protected override async Task DoWriteAsync(Stream source, FileStorageContext context, CancellationToken cancellationToken) { - _fileFullPath = fileFullPath; - _mode = mode; - } - - public override bool CanWrite => _mode.IsAnyOf(FileStoreMode.AppendOrNew, FileStoreMode.Create, FileStoreMode.OverwriteOrNew); - - public override bool CanRead => _mode == FileStoreMode.Open; - - protected override async Task DoWriteAsync(Stream source, CancellationToken cancellationToken) - { - using (FileStream fs = new FileStream(_fileFullPath, (FileMode)_mode, FileAccess.Write, FileShare.None)) + using (FileStream fs = new FileStream(context.Path, (FileMode)context.Mode, FileAccess.Write, FileShare.None)) { await source.CopyToAsync(fs, cancellationToken).ConfigureAwait(false); } @@ -27,18 +12,13 @@ public sealed class FileStorage : Storage return StoreResult.CreateSuccess(); } - protected override async Task DoReadAsync(Stream target, CancellationToken cancellationToken) + protected override async Task DoReadAsync(Stream target, FileStorageContext context, CancellationToken cancellationToken) { - using (FileStream fs = new FileStream(_fileFullPath, (FileMode)_mode, FileAccess.Read, FileShare.Read)) + using (FileStream fs = new FileStream(context.Path, (FileMode)context.Mode, FileAccess.Read, FileShare.Read)) { await fs.CopyToAsync(target, cancellationToken).ConfigureAwait(false); } return StoreResult.CreateSuccess(); } - - public override string ToString() - { - return string.Format("{0}: mode = '{1}', path = '{2}'", GetType().Name, _mode, _fileFullPath); - } } diff --git a/certmgr/Core/Storage/FileStorageContext.cs b/certmgr/Core/Storage/FileStorageContext.cs new file mode 100644 index 0000000..f7daa1a --- /dev/null +++ b/certmgr/Core/Storage/FileStorageContext.cs @@ -0,0 +1,16 @@ +using System.Diagnostics; + +namespace CertMgr.Core.Storage; + +public sealed class FileStorageContext : StorageContext +{ + public FileStorageContext(string fileFullPath, FileStoreMode mode) + { + Path = fileFullPath; + Mode = mode; + } + + public string Path { [DebuggerStepThrough] get; } + + public FileStoreMode Mode { [DebuggerStepThrough] get; } +} diff --git a/certmgr/Core/Storage/Filter.cs b/certmgr/Core/Storage/Filter.cs new file mode 100644 index 0000000..d9156cd --- /dev/null +++ b/certmgr/Core/Storage/Filter.cs @@ -0,0 +1,38 @@ +using System.Diagnostics; + +using CertMgr.Core.Utils; + +namespace CertMgr.Core.Storage; + +public abstract class Filter : IFilter +{ + public static readonly IFilter IsMatch = new EmptyFilter(true); + public static readonly IFilter NotMatch = new EmptyFilter(false); + + public Task IsMatchAsync(T value, CancellationToken cancellationToken) + { + return DoIsMatchAsync(value, cancellationToken); + } + + protected abstract Task DoIsMatchAsync(T value, CancellationToken cancellationToken); + + private sealed class EmptyFilter : Filter + { + internal EmptyFilter(bool result) + { + Result = result; + } + + private bool Result { [DebuggerStepThrough] get; } + + protected override Task DoIsMatchAsync(T value, CancellationToken cancellationToken) + { + return Task.FromResult(Result); + } + + public override string ToString() + { + return string.Format("{0}: is-match = {1}", GetType().ToString(false), Result ? "yes" : "no"); + } + } +} diff --git a/certmgr/Core/Storage/IFilter.cs b/certmgr/Core/Storage/IFilter.cs new file mode 100644 index 0000000..d756dae --- /dev/null +++ b/certmgr/Core/Storage/IFilter.cs @@ -0,0 +1,6 @@ +namespace CertMgr.Core.Storage; + +public interface IFilter +{ + Task IsMatchAsync(T value, CancellationToken cancellationToken); +} diff --git a/certmgr/Core/Storage/IStorage.cs b/certmgr/Core/Storage/IStorage.cs index 2869b77..30e3dd8 100644 --- a/certmgr/Core/Storage/IStorage.cs +++ b/certmgr/Core/Storage/IStorage.cs @@ -2,11 +2,7 @@ public interface IStorage { - Task WriteAsync(Stream source, CancellationToken cancellationToken); + Task WriteAsync(Stream source, StorageContext context, CancellationToken cancellationToken); - // Task WriteFromAsync(StorageAdapter adapter, CancellationToken cancellationToken); - - Task ReadAsync(Stream target, CancellationToken cancellationToken); - - // Task> ReadToAsync(StorageAdapter adapter, CancellationToken cancellationToken); + Task ReadAsync(Stream target, StorageContext context, CancellationToken cancellationToken); } diff --git a/certmgr/Core/Storage/Storage.cs b/certmgr/Core/Storage/Storage.cs index a82756a..a5c33dc 100644 --- a/certmgr/Core/Storage/Storage.cs +++ b/certmgr/Core/Storage/Storage.cs @@ -2,23 +2,15 @@ namespace CertMgr.Core.Storage; -public abstract class Storage : IStorage +public abstract class Storage : IStorage where T : StorageContext { - - public virtual bool CanRead => false; - - public virtual bool CanWrite => false; - - public async Task WriteAsync(Stream source, CancellationToken cancellationToken) + public async Task WriteAsync(Stream source, StorageContext context, CancellationToken cancellationToken) { - if (!CanWrite) - { - throw new StorageException("Cannot write. Storage not writable"); - } + T typedContext = GetTypedContext(context); try { - return await DoWriteAsync(source, cancellationToken); + return await DoWriteAsync(source, typedContext, cancellationToken); } catch (Exception e) { @@ -27,18 +19,15 @@ public abstract class Storage : IStorage } } - protected abstract Task DoWriteAsync(Stream source, CancellationToken cancellationToken); + protected abstract Task DoWriteAsync(Stream source, T context, CancellationToken cancellationToken); - public async Task ReadAsync(Stream target, CancellationToken cancellationToken) + public async Task ReadAsync(Stream target, StorageContext context, CancellationToken cancellationToken) { - if (!CanRead) - { - throw new StorageException("Cannot read. Storage not readable"); - } + T typedContext = GetTypedContext(context); try { - return await DoReadAsync(target, cancellationToken); + return await DoReadAsync(target, typedContext, cancellationToken); } catch (Exception e) { @@ -47,37 +36,26 @@ public abstract class Storage : IStorage } } - protected abstract Task DoReadAsync(Stream target, CancellationToken cancellationToken); + protected abstract Task DoReadAsync(Stream target, T context, CancellationToken cancellationToken); - /*public async Task WriteFromAsync(StorageAdapter adapter, CancellationToken cancellationToken) + private T GetTypedContext(StorageContext context) { + T typedContext; + try { - return await adapter.WriteAsync(this, cancellationToken).ConfigureAwait(false); + typedContext = (T)context; } catch (Exception e) { - StorageException ex = new StorageException(e, "Failed to write to storage of type '{0}' adapter of type '{1}'", GetType().ToString(false), adapter.GetType().ToString(false)); - return StoreResult.CreateFailure(ex); + throw new StorageException(e, "Faile to convert type {0} to {1} in storage of type {2}", context.GetType().ToString(false), typeof(T).ToString(false), GetType().ToString(false)); } - }*/ - /*public async Task> ReadToAsync(StorageAdapter adapter, CancellationToken cancellationToken) - { - try - { - TResult result = await adapter.ReadAsync(this, cancellationToken).ConfigureAwait(false); - return new StoreResult(result, true); - } - catch (Exception e) - { - StorageException ex = new StorageException(e, "Failed to read as type '{0}' from storage of type '{1}' using adapter of type '{1}'", typeof(TResult).ToString(false), GetType().ToString(false), adapter.GetType().ToString(false)); - return new StoreResult(default, false, ex); - } - }*/ + return typedContext; + } public override string ToString() { - return string.Format("{0}: can-read = {1}, can-write = {2}", GetType().Name, CanRead ? "yes" : "no", CanWrite ? "yes" : "no"); + return string.Format("{0}", GetType().ToString(false)); } } diff --git a/certmgr/Core/Storage/StorageContext.cs b/certmgr/Core/Storage/StorageContext.cs new file mode 100644 index 0000000..cd0b595 --- /dev/null +++ b/certmgr/Core/Storage/StorageContext.cs @@ -0,0 +1,5 @@ +namespace CertMgr.Core.Storage; + +public class StorageContext +{ +} diff --git a/certmgr/Core/Utils/TypeInfo.cs b/certmgr/Core/Utils/TypeInfo.cs index 3f145ab..f1be2d7 100644 --- a/certmgr/Core/Utils/TypeInfo.cs +++ b/certmgr/Core/Utils/TypeInfo.cs @@ -9,6 +9,8 @@ public sealed class TypeInfo SourceType = sourceType; IsCollection = isCollection; ElementType = elementType; + + IsElementTypeNullable = Nullable.GetUnderlyingType(ElementType) != null; } public Type SourceType { [DebuggerStepThrough] get; } @@ -17,6 +19,8 @@ public sealed class TypeInfo public Type ElementType { [DebuggerStepThrough] get; } + public bool IsElementTypeNullable { [DebuggerStepThrough] get; } + public override string ToString() { return string.Format("is-collection = {0}, source-type = '{1}', element-type = '{2}'", IsCollection ? "yes" : "no", SourceType.ToString(false), ElementType.ToString(false)); diff --git a/certmgr/Jobs/CertificateSettings.cs b/certmgr/Jobs/CertificateSettings.cs index 115604e..b54e217 100644 --- a/certmgr/Jobs/CertificateSettings.cs +++ b/certmgr/Jobs/CertificateSettings.cs @@ -6,6 +6,7 @@ using CertMgr.Core.Attributes; using CertMgr.Core.Converters.Impl; using CertMgr.Core.Jobs; using CertMgr.Core.Storage; +using CertMgr.Core.Utils; using CertMgr.Core.Validation; namespace CertMgr.Jobs; @@ -52,20 +53,102 @@ public sealed class CertificateSettings : JobSettings [Setting("is-certificate-authority", Default = false, AlternateNames = ["isca"])] public bool IsCertificateAuthority { [DebuggerStepThrough] get; [DebuggerStepThrough] set; } - [Setting("issuer-certificate", Converter = typeof(StorageConverter))] + [Setting("issuer-kind", Converter = typeof(StorageKindConverter))] public IStorage? Issuer { [DebuggerStepThrough] get; [DebuggerStepThrough] set; } + [Setting("issuer-file", Converter = typeof(FileStorageContextConverter))] + public FileStorageContext? IssuerFileContext { [DebuggerStepThrough] get; [DebuggerStepThrough] set; } + + [Setting("issuer-certstore", Converter = typeof(CertStoreStorageContextConverter))] + public CertStoreStorageContext? IssuerCertStoreContext { [DebuggerStepThrough] get; [DebuggerStepThrough] set; } + + // [Setting("issuer-certificate", Converter = typeof(StorageConverter))] + // public IStorage? Issuer { [DebuggerStepThrough] get; [DebuggerStepThrough] set; } + [Setting("issuer-password", IsSecret = true)] public string? IssuerPassword { [DebuggerStepThrough] get; [DebuggerStepThrough] set; } - [Setting("storage", IsMandatory = true, Converter = typeof(StorageConverter))] - public IStorage? Storage { [DebuggerStepThrough] get; [DebuggerStepThrough] set; } + [Setting("validity-period", Default = "1y", Converter = typeof(TimeSpanConverter))] + public TimeSpan? ValidityPeriod { [DebuggerStepThrough] get; [DebuggerStepThrough] set; } - [Setting("password", IsSecret = true)] + // [Setting("certificate-target", IsMandatory = true, Converter = typeof(StorageConverter))] + // public IStorage? Storage { [DebuggerStepThrough] get; [DebuggerStepThrough] set; } + + [Setting("target-password", IsSecret = true)] public string? Password { [DebuggerStepThrough] get; [DebuggerStepThrough] set; } - [Setting("validity-period", Default = "365d", Converter = typeof(TimeSpanConverter))] - public TimeSpan? ValidityPeriod { [DebuggerStepThrough] get; [DebuggerStepThrough] set; } + [Setting("target-kind", Converter = typeof(StorageKindConverter))] + public IStorage? Target { [DebuggerStepThrough] get; [DebuggerStepThrough] set; } + + [Setting("target-file", Converter = typeof(FileStorageContextConverter))] + public FileStorageContext? TargetFileContext { [DebuggerStepThrough] get; [DebuggerStepThrough] set; } + + [Setting("target-certstore", Converter = typeof(CertStoreStorageContextConverter))] + public CertStoreStorageContext? TargetCertStoreContext { [DebuggerStepThrough] get; [DebuggerStepThrough] set; } + + public StorageContext GetTargetContext() + { + if (Target == null) + { + throw new JobException("Target storage is not properly configured"); + } + + StorageContext? ctx; + + switch (Target) + { + case FileStorage: + ctx = TargetFileContext; + break; + case CertStoreStorage: + if (TargetCertStoreContext != null && Password != null) + { + TargetCertStoreContext.Password = Password; + } + ctx = TargetCertStoreContext; + break; + default: + ctx = null; + break; + } + + if (ctx == null) + { + throw new JobException("context for target storage of type '{0}' is not properly set", Target.GetType().ToString(false)); + } + + return ctx; + } + + public StorageContext GetIssuerContext() + { + if (Issuer == null) + { + throw new JobException("Issuer storage is not properly configured"); + } + + StorageContext? ctx; + + switch (Issuer) + { + case FileStorage: + ctx = IssuerFileContext; + break; + case CertStoreStorage: + ctx = IssuerCertStoreContext; + break; + default: + ctx = null; + break; + } + + if (ctx == null) + { + throw new JobException("context for issuer storage of type '{0}' is not properly set", Issuer.GetType().ToString(false)); + } + + return ctx; + } protected override Task DoValidateAsync(ValidationResults results, CancellationToken cancellationToken) { @@ -92,9 +175,24 @@ public sealed class CertificateSettings : JobSettings results.AddInvalid(nameof(HashAlgorithm), "value value must be specified: '{0}'", HashAlgorithm?.ToString() ?? ""); } - if (Storage == null) + if (Target == null) { - results.AddInvalid(nameof(Storage), "must be specified"); + results.AddInvalid(nameof(Target), "must be specified"); + } + + if (Target is FileStorage) + { + if (TargetFileContext is null) + { + results.AddInvalid(nameof(TargetFileContext), "value must be specified when target is '{0}'", Target.GetType().ToString(false)); + } + } + else if (Target is CertStoreStorage) + { + if (TargetCertStoreContext is null) + { + results.AddInvalid(nameof(TargetCertStoreContext), "value must be specified when target is '{0}'", Target.GetType().ToString(false)); + } } return Task.CompletedTask; diff --git a/certmgr/Jobs/CreateCertificateJob.cs b/certmgr/Jobs/CreateCertificateJob.cs index a7b6eff..967eeee 100644 --- a/certmgr/Jobs/CreateCertificateJob.cs +++ b/certmgr/Jobs/CreateCertificateJob.cs @@ -24,18 +24,20 @@ public sealed class CreateCertificateJob : Job CertificateManager cm = new CertificateManager(); using (X509Certificate2 cert = await cm.CreateAsync(cgcs, gs, cancellationToken).ConfigureAwait(false)) { - if (Settings.Storage != null) + if (Settings.Target != null) { + StorageContext ctx = Settings.GetTargetContext(); + byte[] data = cert.Export(X509ContentType.Pfx, Settings.Password); using (MemoryStream ms = new MemoryStream()) { await ms.WriteAsync(data, cancellationToken); ms.Position = 0; - StoreResult writeResult = await Settings.Storage.WriteAsync(ms, cancellationToken).ConfigureAwait(false); + StoreResult writeResult = await Settings.Target.WriteAsync(ms, ctx, cancellationToken).ConfigureAwait(false); if (!writeResult.IsSuccess) { - throw new JobException(writeResult.Exception, "Failed to write create certificate to target storage (type = '{0}', storage = '{1}')", Settings.Storage.GetType().ToString(false), Settings.Storage.ToString()); + throw new JobException(writeResult.Exception, "Failed to write create certificate to target storage (type = '{0}', context = '{1}')", Settings.Target.GetType().ToString(false), ctx.ToString()); } } } @@ -80,9 +82,10 @@ public sealed class CreateCertificateJob : Job { using (MemoryStream ms = new MemoryStream()) { + StorageContext ctx = Settings.GetIssuerContext(); // X509KeyStorageFlags flags = X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet; X509KeyStorageFlags flags = X509KeyStorageFlags.DefaultKeySet; - await Settings.Issuer.ReadAsync(ms, cancellationToken).ConfigureAwait(false); + await Settings.Issuer.ReadAsync(ms, ctx, cancellationToken).ConfigureAwait(false); cgcs.Issuer = X509CertificateLoader.LoadPkcs12(ms.GetBuffer(), Settings.IssuerPassword, flags); } } diff --git a/certmgr/Program.cs b/certmgr/Program.cs index 19a8a48..483f59a 100644 --- a/certmgr/Program.cs +++ b/certmgr/Program.cs @@ -8,16 +8,30 @@ internal static class Program { args = [ "--job=create-certificate", - "--issuer-certificate=file|o|c:\\friend2.pfx", + "--issuer-kind=file", + "--issuer-file=o|c:\\friend2.pfx", "--issuer-password=aaa", "--subject=CN=hello", "--san=world", "--san=DNS:zdrastvujte", "--san=IP:192.168.131.1", - "--algorithm=ecdsa", - "--ecdsa-curve=p384", - "--storage=file|w|c:\\mycert-ecdsa.pfx", - "--validity-period=2d" ]; + "--algorithm=ecdsa", + "--ecdsa-curve=p384", + "--validity-period=2d", + + // "--certificate-target=file|w|c:\\mycert-ecdsa.pfx", + // "--certificate-password=aaa", + + // "--target-kind=file", + // "--target-file=w|c:\\mycert-ecdsa.pfx", + // "--target-password=aaa", + + "--target-kind=certstore", + "--target-certstore=machine|my|exportable", + "--target-password=aaa" + ]; + + // --certificate-target=certstore|machine|my // args = [ // "--job=create-certificate", @@ -29,10 +43,12 @@ internal static class Program // "--san=IP:192.168.131.1", // "--algorithm=rsa", // "--rsa-key-size=2048", - // "--storage=file|w|c:\\friend-rsa.pfx", - // "--validity-period=2d" ]; + // "--validity-period=2d", + // "--certificate-target=file|w|c:\\friend-rsa.pfx", + // "--certificate-password=aaa" + // ]; - using CancellationTokenSource cts = new CancellationTokenSource(TimeSpan.FromMinutes(3)); + using CancellationTokenSource cts = new CancellationTokenSource(TimeSpan.FromMinutes(5)); JobExecutor executor = new JobExecutor(); int errorLevel = await executor.ExecuteAsync(args, cts.Token).ConfigureAwait(false); diff --git a/certmgr/certmgr.csproj b/certmgr/certmgr.csproj index dff6c33..59199ad 100644 --- a/certmgr/certmgr.csproj +++ b/certmgr/certmgr.csproj @@ -9,4 +9,8 @@ CertMgr + + + + diff --git a/certmgrTest/CertStoreStorageTest.cs b/certmgrTest/CertStoreStorageTest.cs new file mode 100644 index 0000000..ecd8673 --- /dev/null +++ b/certmgrTest/CertStoreStorageTest.cs @@ -0,0 +1,20 @@ +using CertMgr.Core.Storage; + +using NUnit.Framework; + +namespace certmgrTest; + +public class CertStoreStorageTest +{ + [Test] + public async Task First() + { + using (MemoryStream target = new MemoryStream()) + { + CertStoreStorage storage = new CertStoreStorage(); + CertStoreStorageContext context = new CertStoreStorageContext(CertStoreLocation.User, CertStoreName.My, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags.DefaultKeySet); + context.Password = "aaa"; + await storage.ReadAsync(target, context, CancellationToken.None); + } + } +} diff --git a/certmgrTest/PropertyDescriptorTest.cs b/certmgrTest/PropertyDescriptorTest.cs new file mode 100644 index 0000000..9a991d4 --- /dev/null +++ b/certmgrTest/PropertyDescriptorTest.cs @@ -0,0 +1,82 @@ + +using System.Diagnostics; +using System.Reflection; + +using CertMgr.Core; +using CertMgr.Core.Attributes; +using CertMgr.Core.Jobs; +using CertMgr.Core.Validation; + +using NUnit.Framework; + +namespace certmgrTest; + +public class PropertyDescriptorTest +{ + [Test] + public void First() + { + PropertyDescriptor? descriptor = GetProperty(typeof(TestSettings), nameof(TestSettings.StringItems)); + + if (descriptor == null) + { + throw new Exception(string.Format("property not found")); + } + + IValueValidator? validator = descriptor.CustomValidator; + } + + private static PropertyDescriptor? GetProperty(Type settingsType, string name) + { + PropertyDescriptor? result = null; + + foreach (PropertyInfo propertyInfo in settingsType.GetProperties(BindingFlags.Public | BindingFlags.Instance)) + { + if (propertyInfo.Name != name) + { + continue; + } + SettingAttribute? settingAttribute = propertyInfo.GetCustomAttribute(); + if (settingAttribute is null) + { + continue; + } + + result = new PropertyDescriptor(propertyInfo, settingAttribute, settingsType); + break; + } + + return result; + } + + private sealed class TestSettings : JobSettings + { + [Setting("string-names", Validator = typeof(StringItemValidator))] + public IReadOnlyCollection? StringItems { get; set; } + } + + private sealed class StringItemValidator : IValueValidator, IValueValidator> + { + public StringItemValidator(string settingName) + { + ValueName = settingName; + } + + public string ValueName { [DebuggerStepThrough] get; } + + Task IValueValidator.ValidateAsync(string? settingValue, CancellationToken cancellationToken) + { + return Task.FromResult((IValidationResult)new ValidationResult(ValueName, true, "OK")); + } + + Task IValueValidator.ValidateAsync(object? value, CancellationToken cancellationToken) + { + return Task.FromResult((IValidationResult)new ValidationResult(ValueName, true, "OK")); + } + + Task IValueValidator>.ValidateAsync(IEnumerable? settingValue, CancellationToken cancellationToken) + { + throw new NotImplementedException(); + } + } +} diff --git a/certmgrTest/SubjectValidatorTest.cs b/certmgrTest/SubjectValidatorTest.cs index bfd3012..5e08ed2 100644 --- a/certmgrTest/SubjectValidatorTest.cs +++ b/certmgrTest/SubjectValidatorTest.cs @@ -15,7 +15,7 @@ public class SubjectValidatorTest public async Task First(string subj, bool expectedSuccess) { SubjectValidator validator = new SubjectValidator("TestSetting"); - ValidationResult result = await validator.ValidateAsync(subj, CancellationToken.None); + IValidationResult result = await validator.ValidateAsync(subj, CancellationToken.None); Assert.That(result.IsValid, Is.EqualTo(expectedSuccess), result.Justification); } }