refactored the credential repository to project all loaded items to a locally managed list

This commit is contained in:
David Sparer
2017-02-11 14:39:08 -07:00
parent 2ffde30340
commit 00ba661456
5 changed files with 38 additions and 14 deletions

View File

@@ -1,6 +1,5 @@
using System.Collections.Generic;
using System.ComponentModel;
using System.Security;
using mRemoteNG.Credential.Repositories;
@@ -9,6 +8,8 @@ namespace mRemoteNG.Credential
public interface ICredentialRepository : INotifyPropertyChanged
{
ICredentialRepositoryConfig Config { get; }
IEnumerable<ICredentialRecord> LoadCredentials(SecureString key);
IList<ICredentialRecord> CredentialRecords { get; }
void LoadCredentials();
void SaveCredentials();
}
}

View File

@@ -1,7 +1,7 @@
using System;
using System.Xml.Linq;
using mRemoteNG.Config.DataProviders;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Security;
namespace mRemoteNG.Credential.Repositories
{
@@ -26,8 +26,9 @@ namespace mRemoteNG.Credential.Repositories
TypeName = repositoryXElement.Attribute("TypeName")?.Value,
Source = repositoryXElement.Attribute("Source")?.Value
};
var dataProvider = new FileDataProvider("");
return new XmlCredentialRepository(config, dataProvider, new XmlCredentialDeserializer());
var dataProvider = new FileDataProvider(config.Source);
var cryptoProvider = CryptographyProviderFactory.BuildCryptographyProviderFromSettings();
return new XmlCredentialRepository(config, dataProvider, cryptoProvider);
}
}
}

View File

@@ -1,9 +1,11 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Security;
using System.Linq;
using mRemoteNG.Config.DataProviders;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Security;
using mRemoteNG.Security.Authentication;
namespace mRemoteNG.Credential.Repositories
{
@@ -11,28 +13,42 @@ namespace mRemoteNG.Credential.Repositories
{
private readonly IDataProvider<string> _dataProvider;
private readonly XmlCredentialDeserializer _deserializer;
private readonly XmlCredentialRecordSerializer _serializer;
public ICredentialRepositoryConfig Config { get; }
public IList<ICredentialRecord> CredentialRecords { get; }
public IAuthenticator Authenticator { get; set; }
public XmlCredentialRepository(ICredentialRepositoryConfig config, IDataProvider<string> dataProvider, XmlCredentialDeserializer deserializer)
public XmlCredentialRepository(ICredentialRepositoryConfig config, IDataProvider<string> dataProvider, ICryptographyProvider cryptographyProvider)
{
if (dataProvider == null)
throw new ArgumentNullException(nameof(dataProvider));
if (deserializer == null)
throw new ArgumentNullException(nameof(deserializer));
if (config == null)
throw new ArgumentNullException(nameof(config));
Config = config;
CredentialRecords = new List<ICredentialRecord>();
Config.PropertyChanged += (sender, args) => RaisePropertyChangedEvent(args);
_dataProvider = dataProvider;
_deserializer = deserializer;
_deserializer = new XmlCredentialDeserializer();
_serializer = new XmlCredentialRecordSerializer(cryptographyProvider);
}
public IEnumerable<ICredentialRecord> LoadCredentials(SecureString decryptionKey)
public void LoadCredentials()
{
var serializedCredentials = _dataProvider.Load();
return _deserializer.Deserialize(serializedCredentials, decryptionKey);
var newCredentials = _deserializer.Deserialize(serializedCredentials, Config.Key);
foreach (var newCredential in newCredentials)
{
if (CredentialRecords.Any(cred => cred.Id.Equals(newCredential.Id))) continue;
CredentialRecords.Add(newCredential);
}
}
public void SaveCredentials()
{
var data = _serializer.Serialize(CredentialRecords, Config.Key);
_dataProvider.Save(data);
}
public event PropertyChangedEventHandler PropertyChanged;

View File

@@ -9,6 +9,11 @@ namespace mRemoteNG.Security
{
public class CryptographyProviderFactory
{
public static ICryptographyProvider BuildCryptographyProviderFromSettings()
{
return new CryptographyProviderFactory().CreateAeadCryptographyProvider(Settings.Default.EncryptionEngine, Settings.Default.EncryptionBlockCipherMode);
}
public ICryptographyProvider CreateAeadCryptographyProvider(BlockCipherEngines engine, BlockCipherModes mode)
{
var cipherEngine = ChooseBlockCipherEngine(engine);

View File

@@ -4,6 +4,7 @@ using mRemoteNG.Config.DataProviders;
using mRemoteNG.Config.Serializers;
using mRemoteNG.Credential;
using mRemoteNG.Credential.Repositories;
using mRemoteNG.Security;
using mRemoteNG.UI.Controls.PageSequence;
namespace mRemoteNG.UI.Forms.CredentialManagerPages.CredentialRepositoryEditorPages
@@ -57,8 +58,8 @@ namespace mRemoteNG.UI.Forms.CredentialManagerPages.CredentialRepositoryEditorPa
if (!_repositoryList.Contains(_repositoryConfig.Id))
{
var dataProvider = new FileDataProvider(_repositoryConfig.Source);
var deserializer = new XmlCredentialDeserializer();
var repository = new XmlCredentialRepository(_repositoryConfig, dataProvider, deserializer);
var cryptoProvider = CryptographyProviderFactory.BuildCryptographyProviderFromSettings();
var repository = new XmlCredentialRepository(_repositoryConfig, dataProvider, cryptoProvider);
_repositoryList.AddProvider(repository);
}
RaiseNextPageEvent();