1e21e33ade
Move SecureStoreManager project and tests to Deprecated folder and remove from solution. SecureStore functionality is now integrated into ConfigManager.
355 lines
9.7 KiB
C#
355 lines
9.7 KiB
C#
using System.Windows.Input;
|
|
using JdeScoping.SecureStoreManager.Constants;
|
|
|
|
namespace JdeScoping.SecureStoreManager.ViewModels;
|
|
|
|
/// <summary>
|
|
/// View model for creating a new store.
|
|
/// </summary>
|
|
public class NewStoreDialogViewModel : ViewModelBase
|
|
{
|
|
private string _storePath = string.Empty;
|
|
private string _keyFilePath = string.Empty;
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="NewStoreDialogViewModel"/> class.
|
|
/// </summary>
|
|
public NewStoreDialogViewModel()
|
|
{
|
|
BrowseStorePathCommand = new RelayCommand(BrowseStorePath);
|
|
BrowseKeyFilePathCommand = new RelayCommand(BrowseKeyFilePath);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the path to the store file to create.
|
|
/// </summary>
|
|
public string StorePath
|
|
{
|
|
get => _storePath;
|
|
set
|
|
{
|
|
if (SetProperty(ref _storePath, value))
|
|
NotifyValidationChanged();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the path to the key file for encryption.
|
|
/// </summary>
|
|
public string KeyFilePath
|
|
{
|
|
get => _keyFilePath;
|
|
set
|
|
{
|
|
if (SetProperty(ref _keyFilePath, value))
|
|
NotifyValidationChanged();
|
|
}
|
|
}
|
|
|
|
private void NotifyValidationChanged()
|
|
{
|
|
OnPropertyChanged(nameof(IsValid));
|
|
OnPropertyChanged(nameof(ValidationError));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the command to browse for store path location.
|
|
/// </summary>
|
|
public ICommand BrowseStorePathCommand { get; }
|
|
|
|
/// <summary>
|
|
/// Gets the command to browse for key file path location.
|
|
/// </summary>
|
|
public ICommand BrowseKeyFilePathCommand { get; }
|
|
|
|
/// <summary>
|
|
/// Gets a value indicating whether the dialog input is valid.
|
|
/// </summary>
|
|
public bool IsValid => !string.IsNullOrWhiteSpace(StorePath) && !string.IsNullOrWhiteSpace(KeyFilePath);
|
|
|
|
/// <summary>
|
|
/// Gets the validation error message, or null if valid.
|
|
/// </summary>
|
|
public string? ValidationError
|
|
{
|
|
get
|
|
{
|
|
if (string.IsNullOrWhiteSpace(StorePath))
|
|
return DialogStrings.StorePathRequired;
|
|
|
|
if (string.IsNullOrWhiteSpace(KeyFilePath))
|
|
return DialogStrings.KeyFilePathRequired;
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Event raised to request save file dialog for store path.
|
|
/// Parameters: title, fileTypeName, pattern, defaultExtension
|
|
/// Returns: selected file path or null
|
|
/// </summary>
|
|
public event Func<string, string, string, string, Task<string?>>? OnShowSaveFileDialog;
|
|
|
|
private async void BrowseStorePath()
|
|
{
|
|
if (OnShowSaveFileDialog == null)
|
|
return;
|
|
|
|
var path = await OnShowSaveFileDialog(
|
|
DialogStrings.ChooseStoreLocation,
|
|
FileExtensions.StoreTypeName,
|
|
FileExtensions.StorePattern,
|
|
FileExtensions.StoreExtension);
|
|
if (!string.IsNullOrEmpty(path))
|
|
{
|
|
StorePath = path;
|
|
}
|
|
}
|
|
|
|
private async void BrowseKeyFilePath()
|
|
{
|
|
if (OnShowSaveFileDialog == null)
|
|
return;
|
|
|
|
var path = await OnShowSaveFileDialog(
|
|
DialogStrings.ChooseKeyFileLocation,
|
|
FileExtensions.KeyTypeName,
|
|
FileExtensions.KeyPattern,
|
|
FileExtensions.KeyExtension);
|
|
if (!string.IsNullOrEmpty(path))
|
|
{
|
|
KeyFilePath = path;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// View model for opening an existing store.
|
|
/// </summary>
|
|
public class OpenStoreDialogViewModel : ViewModelBase
|
|
{
|
|
private string _storePath = string.Empty;
|
|
private string _keyFilePath = string.Empty;
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="OpenStoreDialogViewModel"/> class.
|
|
/// </summary>
|
|
public OpenStoreDialogViewModel()
|
|
{
|
|
BrowseStorePathCommand = new RelayCommand(BrowseStorePath);
|
|
BrowseKeyFilePathCommand = new RelayCommand(BrowseKeyFilePath);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the path to the store file to open.
|
|
/// </summary>
|
|
public string StorePath
|
|
{
|
|
get => _storePath;
|
|
set
|
|
{
|
|
if (SetProperty(ref _storePath, value))
|
|
NotifyValidationChanged();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the path to the key file for decryption.
|
|
/// </summary>
|
|
public string KeyFilePath
|
|
{
|
|
get => _keyFilePath;
|
|
set
|
|
{
|
|
if (SetProperty(ref _keyFilePath, value))
|
|
NotifyValidationChanged();
|
|
}
|
|
}
|
|
|
|
private void NotifyValidationChanged()
|
|
{
|
|
OnPropertyChanged(nameof(IsValid));
|
|
OnPropertyChanged(nameof(ValidationError));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the command to browse for store path location.
|
|
/// </summary>
|
|
public ICommand BrowseStorePathCommand { get; }
|
|
|
|
/// <summary>
|
|
/// Gets the command to browse for key file path location.
|
|
/// </summary>
|
|
public ICommand BrowseKeyFilePathCommand { get; }
|
|
|
|
/// <summary>
|
|
/// Gets a value indicating whether the dialog input is valid.
|
|
/// </summary>
|
|
public bool IsValid
|
|
{
|
|
get
|
|
{
|
|
if (string.IsNullOrWhiteSpace(StorePath))
|
|
return false;
|
|
|
|
return !string.IsNullOrWhiteSpace(KeyFilePath);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the validation error message, or null if valid.
|
|
/// </summary>
|
|
public string? ValidationError
|
|
{
|
|
get
|
|
{
|
|
if (string.IsNullOrWhiteSpace(StorePath))
|
|
return DialogStrings.StorePathRequired;
|
|
|
|
if (!System.IO.File.Exists(StorePath))
|
|
return DialogStrings.StoreFileNotFound;
|
|
|
|
if (string.IsNullOrWhiteSpace(KeyFilePath))
|
|
return DialogStrings.KeyFilePathRequired;
|
|
|
|
if (!System.IO.File.Exists(KeyFilePath))
|
|
return DialogStrings.KeyFileNotFound;
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Event raised to request open file dialog for store path.
|
|
/// Parameters: title, fileTypeName, pattern
|
|
/// Returns: selected file path or null
|
|
/// </summary>
|
|
public event Func<string, string, string, Task<string?>>? OnShowOpenFileDialog;
|
|
|
|
private async void BrowseStorePath()
|
|
{
|
|
if (OnShowOpenFileDialog == null)
|
|
return;
|
|
|
|
var path = await OnShowOpenFileDialog(
|
|
DialogStrings.SelectStoreFile,
|
|
FileExtensions.StoreTypeName,
|
|
FileExtensions.StorePattern);
|
|
if (!string.IsNullOrEmpty(path))
|
|
{
|
|
StorePath = path;
|
|
}
|
|
}
|
|
|
|
private async void BrowseKeyFilePath()
|
|
{
|
|
if (OnShowOpenFileDialog == null)
|
|
return;
|
|
|
|
var path = await OnShowOpenFileDialog(
|
|
DialogStrings.SelectKeyFile,
|
|
FileExtensions.KeyTypeName,
|
|
FileExtensions.KeyPattern);
|
|
if (!string.IsNullOrEmpty(path))
|
|
{
|
|
KeyFilePath = path;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// View model for adding or editing a secret.
|
|
/// </summary>
|
|
public class SecretEditDialogViewModel : ViewModelBase
|
|
{
|
|
private string _key = string.Empty;
|
|
private string _value = string.Empty;
|
|
private bool _isNewSecret = true;
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="SecretEditDialogViewModel"/> class.
|
|
/// </summary>
|
|
public SecretEditDialogViewModel()
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="SecretEditDialogViewModel"/> class with a key and value for editing.
|
|
/// </summary>
|
|
/// <param name="key">The secret key.</param>
|
|
/// <param name="value">The secret value.</param>
|
|
public SecretEditDialogViewModel(string key, string value)
|
|
{
|
|
_key = key;
|
|
_value = value;
|
|
_isNewSecret = false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the secret key.
|
|
/// </summary>
|
|
public string Key
|
|
{
|
|
get => _key;
|
|
set
|
|
{
|
|
if (SetProperty(ref _key, value))
|
|
NotifyValidationChanged();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the secret value.
|
|
/// </summary>
|
|
public string Value
|
|
{
|
|
get => _value;
|
|
set => SetProperty(ref _value, value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether this is a new secret being added.
|
|
/// </summary>
|
|
public bool IsNewSecret
|
|
{
|
|
get => _isNewSecret;
|
|
set => SetProperty(ref _isNewSecret, value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets a value indicating whether the key field is editable.
|
|
/// </summary>
|
|
public bool IsKeyEditable => _isNewSecret;
|
|
|
|
/// <summary>
|
|
/// Gets the dialog title based on whether this is a new secret or edit.
|
|
/// </summary>
|
|
public string DialogTitle => _isNewSecret ? "Add Secret" : "Edit Secret";
|
|
|
|
/// <summary>
|
|
/// Gets a value indicating whether the dialog input is valid.
|
|
/// </summary>
|
|
public bool IsValid => !string.IsNullOrWhiteSpace(Key);
|
|
|
|
/// <summary>
|
|
/// Gets the validation error message, or null if valid.
|
|
/// </summary>
|
|
public string? ValidationError
|
|
{
|
|
get
|
|
{
|
|
if (string.IsNullOrWhiteSpace(Key))
|
|
return DialogStrings.KeyRequired;
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private void NotifyValidationChanged()
|
|
{
|
|
OnPropertyChanged(nameof(IsValid));
|
|
OnPropertyChanged(nameof(ValidationError));
|
|
}
|
|
}
|