mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-17 22:11:48 +08:00
refactored the credential repository to project all loaded items to a locally managed list
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user