mirror of
https://github.com/wismna/ModernKeePass.git
synced 2025-10-03 15:40:18 -04:00
Working protected fields (warning: check performance)
This commit is contained in:
@@ -35,6 +35,7 @@ using ModernKeePass.Domain.Dtos;
|
|||||||
using ModernKeePass.Domain.Exceptions;
|
using ModernKeePass.Domain.Exceptions;
|
||||||
using ModernKeePass.Extensions;
|
using ModernKeePass.Extensions;
|
||||||
using ModernKeePass.Models;
|
using ModernKeePass.Models;
|
||||||
|
using ModernKeePass.ViewModels.ListItems;
|
||||||
|
|
||||||
namespace ModernKeePass.ViewModels
|
namespace ModernKeePass.ViewModels
|
||||||
{
|
{
|
||||||
@@ -107,7 +108,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ObservableCollection<EntryVm> History { get; private set; }
|
public ObservableCollection<EntryVm> History { get; private set; }
|
||||||
public ObservableCollection<FieldVm> AdditionalFields { get; private set; }
|
public ObservableCollection<EntryFieldVm> AdditionalFields { get; private set; }
|
||||||
public ObservableCollection<Attachment> Attachments { get; private set; }
|
public ObservableCollection<Attachment> Attachments { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -123,7 +124,15 @@ namespace ModernKeePass.ViewModels
|
|||||||
Set(() => SelectedItem, ref _selectedItem, value, true);
|
Set(() => SelectedItem, ref _selectedItem, value, true);
|
||||||
if (value != null)
|
if (value != null)
|
||||||
{
|
{
|
||||||
AdditionalFields = new ObservableCollection<FieldVm>(SelectedItem.AdditionalFields);
|
//AdditionalFields = new ObservableCollection<FieldVm>(SelectedItem.AdditionalFields);
|
||||||
|
AdditionalFields =
|
||||||
|
new ObservableCollection<EntryFieldVm>(
|
||||||
|
SelectedItem.AdditionalFields.Select(f =>
|
||||||
|
{
|
||||||
|
var field = new EntryFieldVm(_cryptography);
|
||||||
|
field.Initialize(f.Name, f.Value, f.IsProtected);
|
||||||
|
return field;
|
||||||
|
}));
|
||||||
|
|
||||||
Attachments = new ObservableCollection<Attachment>(SelectedItem.Attachments.Select(f => new Attachment
|
Attachments = new ObservableCollection<Attachment>(SelectedItem.Attachments.Select(f => new Attachment
|
||||||
{
|
{
|
||||||
@@ -157,13 +166,13 @@ namespace ModernKeePass.ViewModels
|
|||||||
{
|
{
|
||||||
Set(() => AdditionalFieldSelectedIndex, ref _additionalFieldSelectedIndex, value);
|
Set(() => AdditionalFieldSelectedIndex, ref _additionalFieldSelectedIndex, value);
|
||||||
DeleteAdditionalField.RaiseCanExecuteChanged();
|
DeleteAdditionalField.RaiseCanExecuteChanged();
|
||||||
if (value != -1)
|
/*if (value != -1)
|
||||||
{
|
{
|
||||||
var additionalField = AdditionalFields[value];
|
var additionalField = AdditionalFields[value];
|
||||||
Set(nameof(AdditionalFieldName), ref _additionalFieldName, additionalField.Name);
|
Set(nameof(AdditionalFieldName), ref _additionalFieldName, additionalField.Name);
|
||||||
Set(nameof(AdditionalFieldValue), ref _additionalFieldValue, additionalField.IsProtected ? _cryptography.UnProtect(additionalField.Value).GetAwaiter().GetResult() : additionalField.Value);
|
Set(nameof(AdditionalFieldValue), ref _additionalFieldValue, additionalField.IsProtected ? _cryptography.UnProtect(additionalField.Value).GetAwaiter().GetResult() : additionalField.Value);
|
||||||
Set(nameof(AdditionalFieldIsProtected), ref _additionalFieldIsProtected, additionalField.IsProtected);
|
Set(nameof(AdditionalFieldIsProtected), ref _additionalFieldIsProtected, additionalField.IsProtected);
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,10 +202,10 @@ namespace ModernKeePass.ViewModels
|
|||||||
get { return _cryptography.UnProtect(SelectedItem.Password.Value).GetAwaiter().GetResult(); }
|
get { return _cryptography.UnProtect(SelectedItem.Password.Value).GetAwaiter().GetResult(); }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
// TODO: cleanup this
|
|
||||||
var protectedPassword = _cryptography.Protect(value).ConfigureAwait(false).GetAwaiter().GetResult();
|
var protectedPassword = _cryptography.Protect(value).ConfigureAwait(false).GetAwaiter().GetResult();
|
||||||
SelectedItem.Password.Value = protectedPassword;
|
SelectedItem.Password.Value = protectedPassword;
|
||||||
SetFieldValue(nameof(Password), value, true).ConfigureAwait(false).GetAwaiter();
|
SetFieldValue(nameof(Password), protectedPassword, true).ConfigureAwait(false).GetAwaiter();
|
||||||
|
|
||||||
RaisePropertyChanged(nameof(Password));
|
RaisePropertyChanged(nameof(Password));
|
||||||
RaisePropertyChanged(nameof(PasswordComplexityIndicator));
|
RaisePropertyChanged(nameof(PasswordComplexityIndicator));
|
||||||
}
|
}
|
||||||
@@ -300,7 +309,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
set { Set(() => IsRevealPassword, ref _isRevealPassword, value); }
|
set { Set(() => IsRevealPassword, ref _isRevealPassword, value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
private string _additionalFieldName;
|
/*private string _additionalFieldName;
|
||||||
private string _additionalFieldValue;
|
private string _additionalFieldValue;
|
||||||
private bool _additionalFieldIsProtected;
|
private bool _additionalFieldIsProtected;
|
||||||
|
|
||||||
@@ -333,7 +342,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
{
|
{
|
||||||
SetFieldValue(AdditionalFieldName, AdditionalFieldValue, value).ConfigureAwait(false).GetAwaiter();
|
SetFieldValue(AdditionalFieldName, AdditionalFieldValue, value).ConfigureAwait(false).GetAwaiter();
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
public RelayCommand SaveCommand { get; }
|
public RelayCommand SaveCommand { get; }
|
||||||
public RelayCommand GeneratePasswordCommand { get; }
|
public RelayCommand GeneratePasswordCommand { get; }
|
||||||
@@ -343,7 +352,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
public RelayCommand GoBackCommand { get; }
|
public RelayCommand GoBackCommand { get; }
|
||||||
public RelayCommand GoToParentCommand { get; set; }
|
public RelayCommand GoToParentCommand { get; set; }
|
||||||
public RelayCommand AddAdditionalField { get; set; }
|
public RelayCommand AddAdditionalField { get; set; }
|
||||||
public RelayCommand<FieldVm> DeleteAdditionalField { get; set; }
|
public RelayCommand<EntryFieldVm> DeleteAdditionalField { get; set; }
|
||||||
public RelayCommand<Attachment> OpenAttachmentCommand { get; set; }
|
public RelayCommand<Attachment> OpenAttachmentCommand { get; set; }
|
||||||
public RelayCommand AddAttachmentCommand { get; set; }
|
public RelayCommand AddAttachmentCommand { get; set; }
|
||||||
public RelayCommand<Attachment> DeleteAttachmentCommand { get; set; }
|
public RelayCommand<Attachment> DeleteAttachmentCommand { get; set; }
|
||||||
@@ -385,7 +394,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
GoBackCommand = new RelayCommand(() => _navigation.GoBack());
|
GoBackCommand = new RelayCommand(() => _navigation.GoBack());
|
||||||
GoToParentCommand = new RelayCommand(() => GoToGroup(_parent.Id));
|
GoToParentCommand = new RelayCommand(() => GoToGroup(_parent.Id));
|
||||||
AddAdditionalField = new RelayCommand(AddField, () => IsCurrentEntry);
|
AddAdditionalField = new RelayCommand(AddField, () => IsCurrentEntry);
|
||||||
DeleteAdditionalField = new RelayCommand<FieldVm>(async field => await DeleteField(field), field => field != null && IsCurrentEntry);
|
DeleteAdditionalField = new RelayCommand<EntryFieldVm>(async field => await DeleteField(field), field => field != null && IsCurrentEntry);
|
||||||
OpenAttachmentCommand = new RelayCommand<Attachment>(async attachment => await OpenAttachment(attachment));
|
OpenAttachmentCommand = new RelayCommand<Attachment>(async attachment => await OpenAttachment(attachment));
|
||||||
AddAttachmentCommand = new RelayCommand(async () => await AddAttachment(), () => IsCurrentEntry);
|
AddAttachmentCommand = new RelayCommand(async () => await AddAttachment(), () => IsCurrentEntry);
|
||||||
DeleteAttachmentCommand = new RelayCommand<Attachment>(async attachment => await DeleteAttachment(attachment), _ => IsCurrentEntry);
|
DeleteAttachmentCommand = new RelayCommand<Attachment>(async attachment => await DeleteAttachment(attachment), _ => IsCurrentEntry);
|
||||||
@@ -448,8 +457,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
|
|
||||||
private async Task SetFieldValue(string fieldName, object value, bool isProtected)
|
private async Task SetFieldValue(string fieldName, object value, bool isProtected)
|
||||||
{
|
{
|
||||||
var protectedValue = isProtected ? await _cryptography.Protect(value?.ToString()) : value;
|
await _mediator.Send(new UpsertFieldCommand { EntryId = Id, FieldName = fieldName, FieldValue = value, IsProtected = isProtected});
|
||||||
await _mediator.Send(new UpsertFieldCommand { EntryId = Id, FieldName = fieldName, FieldValue = protectedValue, IsProtected = isProtected});
|
|
||||||
UpdateDirtyStatus(true);
|
UpdateDirtyStatus(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -461,11 +469,11 @@ namespace ModernKeePass.ViewModels
|
|||||||
|
|
||||||
private void AddField()
|
private void AddField()
|
||||||
{
|
{
|
||||||
AdditionalFields.Add(new FieldVm());
|
AdditionalFields.Add(new EntryFieldVm(_cryptography));
|
||||||
AdditionalFieldSelectedIndex = AdditionalFields.Count - 1;
|
AdditionalFieldSelectedIndex = AdditionalFields.Count - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task DeleteField(FieldVm field)
|
private async Task DeleteField(EntryFieldVm field)
|
||||||
{
|
{
|
||||||
AdditionalFields.Remove(field);
|
AdditionalFields.Remove(field);
|
||||||
if (!string.IsNullOrEmpty(field.Name))
|
if (!string.IsNullOrEmpty(field.Name))
|
||||||
|
@@ -505,12 +505,12 @@
|
|||||||
<RowDefinition />
|
<RowDefinition />
|
||||||
<RowDefinition />
|
<RowDefinition />
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<TextBox Grid.Row="0" Text="{Binding Path=DataContext.AdditionalFieldName, ElementName=Page, Mode=TwoWay}" Width="350"
|
<TextBox Grid.Row="0" Text="{Binding Name, Mode=TwoWay}" Width="350"
|
||||||
IsEnabled="{Binding Path=DataContext.IsCurrentEntry, ElementName=Page}" />
|
IsEnabled="{Binding Path=DataContext.IsCurrentEntry, ElementName=Page}" />
|
||||||
<TextBox Grid.Row="1" AcceptsReturn="True" Height="100" TextWrapping="Wrap" Width="350" Margin="0,5,0,0"
|
<TextBox Grid.Row="1" AcceptsReturn="True" Height="100" TextWrapping="Wrap" Width="350" Margin="0,5,0,0"
|
||||||
Text="{Binding Path=DataContext.AdditionalFieldValue, ElementName=Page, Mode=TwoWay}"
|
Text="{Binding Value, Mode=TwoWay}"
|
||||||
IsEnabled="{Binding Path=DataContext.IsCurrentEntry, ElementName=Page}" />
|
IsEnabled="{Binding Path=DataContext.IsCurrentEntry, ElementName=Page}" />
|
||||||
<ToggleSwitch Grid.Row="2" x:Uid="EntryEnableFieldProtection" HorizontalAlignment="Left" IsOn="{Binding Path=DataContext.AdditionalFieldIsProtected, ElementName=Page, Mode=TwoWay}" />
|
<ToggleSwitch Grid.Row="2" x:Uid="EntryEnableFieldProtection" HorizontalAlignment="Left" IsOn="{Binding IsProtected, Mode=TwoWay}" />
|
||||||
<Button Grid.Row="2" x:Uid="EntryDeleteAdditionalField" HorizontalAlignment="Right" Margin="0,15,0,0" Command="{Binding Path=DataContext.DeleteAdditionalField, ElementName=Page}" CommandParameter="{Binding}" />
|
<Button Grid.Row="2" x:Uid="EntryDeleteAdditionalField" HorizontalAlignment="Right" Margin="0,15,0,0" Command="{Binding Path=DataContext.DeleteAdditionalField, ElementName=Page}" CommandParameter="{Binding}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
@@ -519,8 +519,7 @@
|
|||||||
<DataTemplate>
|
<DataTemplate>
|
||||||
<StackPanel Orientation="Vertical" Margin="5">
|
<StackPanel Orientation="Vertical" Margin="5">
|
||||||
<TextBlock Text="{Binding Name}" Style="{StaticResource EntryTextBlockStyle}" FontWeight="SemiBold" />
|
<TextBlock Text="{Binding Name}" Style="{StaticResource EntryTextBlockStyle}" FontWeight="SemiBold" />
|
||||||
<TextBlock HorizontalAlignment="Left" MaxLines="3" FontSize="12" Margin="2,0,2,5" Text="*****" Visibility="{Binding IsProtected, Converter={StaticResource BooleanToVisibilityConverter}}" Style="{StaticResource EntryTextBlockStyle}"/>
|
<TextBlock HorizontalAlignment="Left" MaxLines="3" FontSize="12" Margin="2,0,2,5" Text="{Binding DisplayValue}" Style="{StaticResource EntryTextBlockStyle}"/>
|
||||||
<TextBlock HorizontalAlignment="Left" MaxLines="3" FontSize="12" Margin="2,0,2,5" Text="{Binding Value}" Visibility="{Binding IsProtected, Converter={StaticResource InverseBooleanToVisibilityConverter}}" Style="{StaticResource EntryTextBlockStyle}"/>
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</local:SelectableTemplateListView.ItemTemplate>
|
</local:SelectableTemplateListView.ItemTemplate>
|
||||||
|
@@ -24,6 +24,8 @@ namespace ModernKeePass.ViewModels.ListItems
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string DisplayValue => IsProtected? "*****" : _value;
|
||||||
|
|
||||||
public string Value
|
public string Value
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -35,6 +37,7 @@ namespace ModernKeePass.ViewModels.ListItems
|
|||||||
var protectedValue = IsProtected ? _cryptography.Protect(value).GetAwaiter().GetResult() : value;
|
var protectedValue = IsProtected ? _cryptography.Protect(value).GetAwaiter().GetResult() : value;
|
||||||
MessengerInstance.Send(new EntryFieldValueChangedMessage { FieldName = Name, FieldValue = protectedValue, IsProtected = IsProtected });
|
MessengerInstance.Send(new EntryFieldValueChangedMessage { FieldName = Name, FieldValue = protectedValue, IsProtected = IsProtected });
|
||||||
Set(nameof(Value), ref _value, protectedValue);
|
Set(nameof(Value), ref _value, protectedValue);
|
||||||
|
RaisePropertyChanged(nameof(DisplayValue));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,9 +46,8 @@ namespace ModernKeePass.ViewModels.ListItems
|
|||||||
get { return _isProtected; }
|
get { return _isProtected; }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (!string.IsNullOrEmpty(Name))
|
|
||||||
MessengerInstance.Send(new EntryFieldValueChangedMessage { FieldName = Name, FieldValue = Value, IsProtected = value });
|
|
||||||
Set(nameof(IsProtected), ref _isProtected, value);
|
Set(nameof(IsProtected), ref _isProtected, value);
|
||||||
|
if (!string.IsNullOrEmpty(Name)) Value = value ? _value : _cryptography.UnProtect(_value).GetAwaiter().GetResult();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user