From 00ba661456efad7ff4b5c96ac471f24f0605237d Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sat, 11 Feb 2017 14:39:08 -0700 Subject: [PATCH] refactored the credential repository to project all loaded items to a locally managed list --- mRemoteV1/Credential/ICredentialRepository.cs | 5 ++-- .../CredentialRepositoryFactory.cs | 7 +++-- .../Repositories/XmlCredentialRepository.cs | 30 ++++++++++++++----- .../Security/CryptographyProviderFactory.cs | 5 ++++ .../XmlCredentialRepositoryEditorPage.cs | 5 ++-- 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/mRemoteV1/Credential/ICredentialRepository.cs b/mRemoteV1/Credential/ICredentialRepository.cs index 33d9f75a..1fd19ab6 100644 --- a/mRemoteV1/Credential/ICredentialRepository.cs +++ b/mRemoteV1/Credential/ICredentialRepository.cs @@ -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 LoadCredentials(SecureString key); + IList CredentialRecords { get; } + void LoadCredentials(); + void SaveCredentials(); } } \ No newline at end of file diff --git a/mRemoteV1/Credential/Repositories/CredentialRepositoryFactory.cs b/mRemoteV1/Credential/Repositories/CredentialRepositoryFactory.cs index 2273204e..d3072978 100644 --- a/mRemoteV1/Credential/Repositories/CredentialRepositoryFactory.cs +++ b/mRemoteV1/Credential/Repositories/CredentialRepositoryFactory.cs @@ -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); } } } \ No newline at end of file diff --git a/mRemoteV1/Credential/Repositories/XmlCredentialRepository.cs b/mRemoteV1/Credential/Repositories/XmlCredentialRepository.cs index 1c800060..fcb5d1ad 100644 --- a/mRemoteV1/Credential/Repositories/XmlCredentialRepository.cs +++ b/mRemoteV1/Credential/Repositories/XmlCredentialRepository.cs @@ -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 _dataProvider; private readonly XmlCredentialDeserializer _deserializer; + private readonly XmlCredentialRecordSerializer _serializer; public ICredentialRepositoryConfig Config { get; } + public IList CredentialRecords { get; } + public IAuthenticator Authenticator { get; set; } - public XmlCredentialRepository(ICredentialRepositoryConfig config, IDataProvider dataProvider, XmlCredentialDeserializer deserializer) + public XmlCredentialRepository(ICredentialRepositoryConfig config, IDataProvider 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(); Config.PropertyChanged += (sender, args) => RaisePropertyChangedEvent(args); _dataProvider = dataProvider; - _deserializer = deserializer; + _deserializer = new XmlCredentialDeserializer(); + _serializer = new XmlCredentialRecordSerializer(cryptographyProvider); } - public IEnumerable 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; diff --git a/mRemoteV1/Security/CryptographyProviderFactory.cs b/mRemoteV1/Security/CryptographyProviderFactory.cs index ef360bc8..9fa1e829 100644 --- a/mRemoteV1/Security/CryptographyProviderFactory.cs +++ b/mRemoteV1/Security/CryptographyProviderFactory.cs @@ -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); diff --git a/mRemoteV1/UI/Forms/CredentialManagerPages/CredentialRepositoryEditorPages/XmlCredentialRepositoryEditorPage.cs b/mRemoteV1/UI/Forms/CredentialManagerPages/CredentialRepositoryEditorPages/XmlCredentialRepositoryEditorPage.cs index a021cb29..827b85bf 100644 --- a/mRemoteV1/UI/Forms/CredentialManagerPages/CredentialRepositoryEditorPages/XmlCredentialRepositoryEditorPage.cs +++ b/mRemoteV1/UI/Forms/CredentialManagerPages/CredentialRepositoryEditorPages/XmlCredentialRepositoryEditorPage.cs @@ -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();