Moved application code to the Application layer

Imported Win10 project
Code cleanup
WIP - Use common UWP services for Win8.1 and Win10
This commit is contained in:
Geoffroy BONNEVILLE
2020-04-06 20:20:45 +02:00
parent e795a8c3c4
commit 56d93a5187
292 changed files with 48614 additions and 837 deletions

View File

@@ -7,6 +7,7 @@ namespace ModernKeePass.Application.Common.Interfaces
{ {
public interface IDatabaseProxy public interface IDatabaseProxy
{ {
string ZeroId { get; }
bool IsOpen { get; } bool IsOpen { get; }
string Name { get; } string Name { get; }
string RootGroupId { get; } string RootGroupId { get; }
@@ -15,14 +16,14 @@ namespace ModernKeePass.Application.Common.Interfaces
string KeyDerivationId { get; set; } string KeyDerivationId { get; set; }
string Compression { get; set; } string Compression { get; set; }
bool IsRecycleBinEnabled { get; set; } bool IsRecycleBinEnabled { get; set; }
string FileAccessToken { get; set; }
Task Open(FileInfo fileInfo, Credentials credentials); Task Open(byte[] file, Credentials credentials);
Task ReOpen(); Task ReOpen(byte[] file);
Task Create(FileInfo fileInfo, Credentials credentials, DatabaseVersion version = DatabaseVersion.V2); Task Create(byte[] file, Credentials credentials, DatabaseVersion version = DatabaseVersion.V2);
Task SaveDatabase(); Task<byte[]> SaveDatabase();
Task SaveDatabase(string filePath); Task<byte[]> SaveDatabase(byte[] newFileContents);
void SetRecycleBin(string id); void UpdateCredentials(Credentials credentials);
Task UpdateCredentials(Credentials credentials);
void CloseDatabase(); void CloseDatabase();
Task AddEntry(string parentGroupId, string entryId); Task AddEntry(string parentGroupId, string entryId);
@@ -32,8 +33,7 @@ namespace ModernKeePass.Application.Common.Interfaces
void UpdateGroup(string groupId); void UpdateGroup(string groupId);
Task RemoveEntry(string parentGroupId, string entryId); Task RemoveEntry(string parentGroupId, string entryId);
Task RemoveGroup(string parentGroupId, string groupId); Task RemoveGroup(string parentGroupId, string groupId);
Task DeleteEntry(string parentGroupId, string entryId, string recycleBinName); void DeleteEntity(string entityId);
Task DeleteGroup(string parentGroupId, string groupId, string recycleBinName);
EntryEntity CreateEntry(string parentGroupId); EntryEntity CreateEntry(string parentGroupId);
GroupEntity CreateGroup(string parentGroupId, string nameId, bool isRecycleBin = false); GroupEntity CreateGroup(string parentGroupId, string nameId, bool isRecycleBin = false);
void SortEntries(string groupId); void SortEntries(string groupId);

View File

@@ -5,6 +5,6 @@ namespace ModernKeePass.Application.Common.Interfaces
{ {
public interface IImportFormat public interface IImportFormat
{ {
Task<List<Dictionary<string, string>>> Import(string path); Task<List<Dictionary<string, string>>> Import(IList<string> fileContents);
} }
} }

View File

@@ -9,15 +9,19 @@ namespace ModernKeePass.Application.Database.Commands.CloseDatabase
public class CloseDatabaseCommandHandler : IRequestHandler<CloseDatabaseCommand> public class CloseDatabaseCommandHandler : IRequestHandler<CloseDatabaseCommand>
{ {
private readonly IDatabaseProxy _database; private readonly IDatabaseProxy _database;
private readonly IFileProxy _file;
public CloseDatabaseCommandHandler(IDatabaseProxy database) public CloseDatabaseCommandHandler(IDatabaseProxy database, IFileProxy file)
{ {
_database = database; _database = database;
_file = file;
} }
public void Handle(CloseDatabaseCommand message) public void Handle(CloseDatabaseCommand message)
{ {
if (_database.IsOpen) _database.CloseDatabase(); if (!_database.IsOpen) throw new DatabaseClosedException();
else throw new DatabaseClosedException(); _database.CloseDatabase();
_file.ReleaseFile(_database.FileAccessToken);
_database.FileAccessToken = null;
} }
} }
} }

View File

@@ -15,26 +15,26 @@ namespace ModernKeePass.Application.Database.Commands.CreateDatabase
public class CreateDatabaseCommandHandler : IAsyncRequestHandler<CreateDatabaseCommand> public class CreateDatabaseCommandHandler : IAsyncRequestHandler<CreateDatabaseCommand>
{ {
private readonly IDatabaseProxy _database; private readonly IDatabaseProxy _database;
private readonly IFileProxy _file;
public CreateDatabaseCommandHandler(IDatabaseProxy database) public CreateDatabaseCommandHandler(IDatabaseProxy database, IFileProxy file)
{ {
_database = database; _database = database;
_file = file;
} }
public async Task Handle(CreateDatabaseCommand message) public async Task Handle(CreateDatabaseCommand message)
{ {
if (_database.IsOpen) throw new DatabaseOpenException(); if (_database.IsOpen) throw new DatabaseOpenException();
await _database.Create( var file = await _file.OpenBinaryFile(message.FilePath);
new FileInfo await _database.Create(file,
{
Path = message.FilePath
},
new Credentials new Credentials
{ {
KeyFilePath = message.KeyFilePath, KeyFileContents = await _file.OpenBinaryFile(message.KeyFilePath),
Password = message.Password Password = message.Password
}); });
_database.FileAccessToken = message.FilePath;
} }
} }

View File

@@ -12,18 +12,34 @@ namespace ModernKeePass.Application.Database.Commands.SaveDatabase
public class SaveDatabaseCommandHandler : IAsyncRequestHandler<SaveDatabaseCommand> public class SaveDatabaseCommandHandler : IAsyncRequestHandler<SaveDatabaseCommand>
{ {
private readonly IDatabaseProxy _database; private readonly IDatabaseProxy _database;
private readonly IFileProxy _file;
public SaveDatabaseCommandHandler(IDatabaseProxy database) public SaveDatabaseCommandHandler(IDatabaseProxy database, IFileProxy file)
{ {
_database = database; _database = database;
_file = file;
} }
public async Task Handle(SaveDatabaseCommand message) public async Task Handle(SaveDatabaseCommand message)
{ {
if (!_database.IsOpen) throw new DatabaseClosedException(); if (!_database.IsOpen) throw new DatabaseClosedException();
if (string.IsNullOrEmpty(message.FilePath)) await _database.SaveDatabase(); byte[] contents;
else await _database.SaveDatabase(message.FilePath); if (string.IsNullOrEmpty(message.FilePath))
{
contents = await _database.SaveDatabase();
await _file.WriteBinaryContentsToFile(_database.FileAccessToken, contents);
}
else
{
var newFileContents = await _file.OpenBinaryFile(message.FilePath);
contents = await _database.SaveDatabase(newFileContents);
await _file.WriteBinaryContentsToFile(message.FilePath, contents);
_file.ReleaseFile(_database.FileAccessToken);
_database.FileAccessToken = message.FilePath;
}
} }
} }
} }

View File

@@ -14,23 +14,22 @@ namespace ModernKeePass.Application.Database.Commands.UpdateCredentials
public class UpdateCredentialsCommandHandler : IAsyncRequestHandler<UpdateCredentialsCommand> public class UpdateCredentialsCommandHandler : IAsyncRequestHandler<UpdateCredentialsCommand>
{ {
private readonly IDatabaseProxy _database; private readonly IDatabaseProxy _database;
private readonly IFileProxy _file;
public UpdateCredentialsCommandHandler(IDatabaseProxy database) public UpdateCredentialsCommandHandler(IDatabaseProxy database, IFileProxy file)
{ {
_database = database; _database = database;
_file = file;
} }
public async Task Handle(UpdateCredentialsCommand message) public async Task Handle(UpdateCredentialsCommand message)
{ {
if (_database.IsOpen) if (!_database.IsOpen) throw new DatabaseClosedException();
_database.UpdateCredentials(new Credentials
{ {
await _database.UpdateCredentials(new Credentials KeyFileContents = await _file.OpenBinaryFile(message.KeyFilePath),
{ Password = message.Password
KeyFilePath = message.KeyFilePath, });
Password = message.Password
});
}
else throw new DatabaseClosedException();
} }
} }
} }

View File

@@ -2,7 +2,6 @@
using MediatR; using MediatR;
using ModernKeePass.Application.Common.Interfaces; using ModernKeePass.Application.Common.Interfaces;
using ModernKeePass.Application.Database.Models; using ModernKeePass.Application.Database.Models;
using ModernKeePass.Application.Group.Models;
namespace ModernKeePass.Application.Database.Queries.GetDatabase namespace ModernKeePass.Application.Database.Queries.GetDatabase
{ {

View File

@@ -15,26 +15,25 @@ namespace ModernKeePass.Application.Database.Queries.OpenDatabase
public class OpenDatabaseQueryHandler : IAsyncRequestHandler<OpenDatabaseQuery> public class OpenDatabaseQueryHandler : IAsyncRequestHandler<OpenDatabaseQuery>
{ {
private readonly IDatabaseProxy _database; private readonly IDatabaseProxy _database;
private readonly IFileProxy _file;
public OpenDatabaseQueryHandler(IDatabaseProxy database) public OpenDatabaseQueryHandler(IDatabaseProxy database, IFileProxy file)
{ {
_database = database; _database = database;
_file = file;
} }
public async Task Handle(OpenDatabaseQuery request) public async Task Handle(OpenDatabaseQuery request)
{ {
if (_database.IsOpen) throw new DatabaseOpenException(); if (_database.IsOpen) throw new DatabaseOpenException();
await _database.Open( var file = await _file.OpenBinaryFile(request.FilePath);
new FileInfo await _database.Open(file, new Credentials
{ {
Path = request.FilePath KeyFileContents = await _file.OpenBinaryFile(request.KeyFilePath),
},
new Credentials
{
KeyFilePath = request.KeyFilePath,
Password = request.Password Password = request.Password
}); });
_database.FileAccessToken = request.FilePath;
} }
} }

View File

@@ -10,17 +10,20 @@ namespace ModernKeePass.Application.Database.Queries.ReOpenDatabase
public class ReOpenDatabaseQueryHandler : IAsyncRequestHandler<ReOpenDatabaseQuery> public class ReOpenDatabaseQueryHandler : IAsyncRequestHandler<ReOpenDatabaseQuery>
{ {
private readonly IDatabaseProxy _database; private readonly IDatabaseProxy _database;
private readonly IFileProxy _file;
public ReOpenDatabaseQueryHandler(IDatabaseProxy database) public ReOpenDatabaseQueryHandler(IDatabaseProxy database, IFileProxy file)
{ {
_database = database; _database = database;
_file = file;
} }
public async Task Handle(ReOpenDatabaseQuery request) public async Task Handle(ReOpenDatabaseQuery request)
{ {
if (!_database.IsOpen) throw new DatabaseClosedException(); if (!_database.IsOpen) throw new DatabaseClosedException();
await _database.ReOpen(); var file = await _file.OpenBinaryFile(_database.FileAccessToken);
await _database.ReOpen(file);
} }
} }
} }

View File

@@ -24,7 +24,21 @@ namespace ModernKeePass.Application.Group.Commands.DeleteEntry
{ {
if (!_database.IsOpen) throw new DatabaseClosedException(); if (!_database.IsOpen) throw new DatabaseClosedException();
await _database.DeleteEntry(message.ParentGroupId, message.EntryId, message.RecycleBinName); if (_database.IsRecycleBinEnabled && (string.IsNullOrEmpty(_database.RecycleBinId) || _database.RecycleBinId.Equals(_database.ZeroId)))
{
_database.CreateGroup(_database.RootGroupId, message.RecycleBinName, true);
}
if (!_database.IsRecycleBinEnabled || message.ParentGroupId.Equals(_database.RecycleBinId))
{
_database.DeleteEntity(message.EntryId);
}
else
{
await _database.AddEntry(_database.RecycleBinId, message.EntryId);
}
await _database.RemoveEntry(message.ParentGroupId, message.EntryId);
} }
} }
} }

View File

@@ -24,7 +24,21 @@ namespace ModernKeePass.Application.Group.Commands.DeleteGroup
{ {
if (!_database.IsOpen) throw new DatabaseClosedException(); if (!_database.IsOpen) throw new DatabaseClosedException();
await _database.DeleteEntry(message.ParentGroupId, message.GroupId, message.RecycleBinName); if (_database.IsRecycleBinEnabled && (string.IsNullOrEmpty(_database.RecycleBinId) || _database.RecycleBinId.Equals(_database.ZeroId)))
{
_database.CreateGroup(_database.RootGroupId, message.RecycleBinName, true);
}
if (!_database.IsRecycleBinEnabled || message.ParentGroupId.Equals(_database.RecycleBinId))
{
_database.DeleteEntity(message.GroupId);
}
else
{
await _database.AddGroup(_database.RecycleBinId, message.GroupId);
}
await _database.RemoveGroup(message.ParentGroupId, message.GroupId);
} }
} }
} }

View File

@@ -19,7 +19,7 @@ namespace ModernKeePass.Application.Parameters.Commands.SetRecycleBin
public void Handle(SetRecycleBinCommand message) public void Handle(SetRecycleBinCommand message)
{ {
if (_database.IsOpen) _database.SetRecycleBin(message.RecycleBinId); if (_database.IsOpen) _database.RecycleBinId = message.RecycleBinId;
else throw new DatabaseClosedException(); else throw new DatabaseClosedException();
} }
} }

View File

@@ -57,6 +57,7 @@
<Compile Include="Exceptions\SaveException.cs" /> <Compile Include="Exceptions\SaveException.cs" />
<Compile Include="Interfaces\IDateTime.cs" /> <Compile Include="Interfaces\IDateTime.cs" />
<Compile Include="Interfaces\IHasSelectableObject.cs" /> <Compile Include="Interfaces\IHasSelectableObject.cs" />
<Compile Include="Interfaces\IImportFormat.cs" />
<Compile Include="Interfaces\IIsEnabled.cs" /> <Compile Include="Interfaces\IIsEnabled.cs" />
<Compile Include="Interfaces\ISelectableModel.cs" /> <Compile Include="Interfaces\ISelectableModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />

View File

@@ -3,7 +3,7 @@
public class Credentials public class Credentials
{ {
public string Password { get; set; } public string Password { get; set; }
public string KeyFilePath { get; set; } public byte[] KeyFileContents { get; set; }
// TODO: add Windows Hello // TODO: add Windows Hello
} }
} }

View File

@@ -0,0 +1,10 @@
using System.Collections.Generic;
using System.Threading.Tasks;
namespace ModernKeePass.Domain.Interfaces
{
public interface IImportFormat
{
Task<List<Dictionary<string, string>>> Import(string path);
}
}

View File

@@ -9,16 +9,25 @@ namespace ModernKeePass.Infrastructure
{ {
public static class DependencyInjection public static class DependencyInjection
{ {
public static IServiceCollection AddInfrastructure(this IServiceCollection services) public static IServiceCollection AddInfrastructureCommon(this IServiceCollection services)
{
services.AddTransient(typeof(IDateTime), typeof(MachineDateTime));
return services;
}
public static IServiceCollection AddInfrastructureKeePass(this IServiceCollection services)
{ {
services.AddSingleton(typeof(IDatabaseProxy), typeof(KeePassDatabaseClient)); services.AddSingleton(typeof(IDatabaseProxy), typeof(KeePassDatabaseClient));
services.AddTransient(typeof(ICryptographyClient), typeof(KeePassCryptographyClient)); services.AddTransient(typeof(ICryptographyClient), typeof(KeePassCryptographyClient));
services.AddTransient(typeof(IPasswordProxy), typeof(KeePassPasswordClient)); services.AddTransient(typeof(IPasswordProxy), typeof(KeePassPasswordClient));
/*services.AddTransient(typeof(IResourceProxy), typeof(UwpResourceClient)); return services;
services.AddTransient(typeof(ISettingsProxy), typeof(UwpSettingsClient)); }
services.AddTransient(typeof(IRecentProxy), typeof(UwpRecentFilesClient));*/
public static IServiceCollection AddInfrastructureUwp(this IServiceCollection services)
{
services.AddScoped(typeof(IFileProxy), typeof(StorageFileClient)); services.AddScoped(typeof(IFileProxy), typeof(StorageFileClient));
services.AddTransient(typeof(IDateTime), typeof(MachineDateTime)); services.AddTransient(typeof(ISettingsProxy), typeof(UwpSettingsClient));
services.AddTransient(typeof(IRecentProxy), typeof(UwpRecentFilesClient));
return services; return services;
} }
} }

View File

@@ -6,21 +6,14 @@ namespace ModernKeePass.Infrastructure.File
{ {
public class CsvImportFormat: IImportFormat public class CsvImportFormat: IImportFormat
{ {
private readonly IFileProxy _fileService;
private const bool HasHeaderRow = true; private const bool HasHeaderRow = true;
private const char Delimiter = ';'; private const char Delimiter = ';';
private const char LineDelimiter = '\n'; private const char LineDelimiter = '\n';
public CsvImportFormat(IFileProxy fileService) public async Task<List<Dictionary<string, string>>> Import(IList<string> fileContents)
{
_fileService = fileService;
}
public async Task<List<Dictionary<string, string>>> Import(string path)
{ {
var parsedResult = new List<Dictionary<string, string>>(); var parsedResult = new List<Dictionary<string, string>>();
var content = await _fileService.OpenTextFile(path); foreach (var line in fileContents)
foreach (var line in content)
{ {
var fields = line.Split(Delimiter); var fields = line.Split(Delimiter);
var recordItem = new Dictionary<string, string>(); var recordItem = new Dictionary<string, string>();

View File

@@ -18,19 +18,20 @@ using ModernKeePassLib.Utility;
namespace ModernKeePass.Infrastructure.KeePass namespace ModernKeePass.Infrastructure.KeePass
{ {
public class KeePassDatabaseClient: IDatabaseProxy public class KeePassDatabaseClient: IDatabaseProxy, IDisposable
{ {
private readonly IFileProxy _fileService;
private readonly IMapper _mapper; private readonly IMapper _mapper;
private readonly IDateTime _dateTime; private readonly IDateTime _dateTime;
private readonly PwDatabase _pwDatabase = new PwDatabase(); private readonly PwDatabase _pwDatabase = new PwDatabase();
private string _fileAccessToken;
private Credentials _credentials; private Credentials _credentials;
public string ZeroId => PwUuid.Zero.ToHexString();
// Main information // Main information
public bool IsOpen => (_pwDatabase?.IsOpen).GetValueOrDefault(); public bool IsOpen => (_pwDatabase?.IsOpen).GetValueOrDefault();
public string Name => _pwDatabase?.Name; public string Name => _pwDatabase?.Name;
public string RootGroupId => _pwDatabase?.RootGroup.Uuid.ToHexString(); public string RootGroupId => _pwDatabase?.RootGroup.Uuid.ToHexString();
public string FileAccessToken { get; set; }
// Settings // Settings
public bool IsRecycleBinEnabled public bool IsRecycleBinEnabled
@@ -50,7 +51,11 @@ namespace ModernKeePass.Infrastructure.KeePass
return null; return null;
} }
set { _pwDatabase.RecycleBinUuid = BuildIdFromString(value); } set
{
_pwDatabase.RecycleBinUuid = BuildIdFromString(value);
_pwDatabase.RecycleBinChanged = _dateTime.Now;
}
} }
public string CipherId public string CipherId
@@ -75,24 +80,25 @@ namespace ModernKeePass.Infrastructure.KeePass
set { _pwDatabase.Compression = (PwCompressionAlgorithm) Enum.Parse(typeof(PwCompressionAlgorithm), value); } set { _pwDatabase.Compression = (PwCompressionAlgorithm) Enum.Parse(typeof(PwCompressionAlgorithm), value); }
} }
public KeePassDatabaseClient(IFileProxy fileService, IMapper mapper, IDateTime dateTime) public KeePassDatabaseClient(IMapper mapper, IDateTime dateTime)
{ {
_fileService = fileService;
_mapper = mapper; _mapper = mapper;
_dateTime = dateTime; _dateTime = dateTime;
} }
public async Task Open(FileInfo fileInfo, Credentials credentials) public async Task Open(byte[] file, Credentials credentials)
{ {
try try
{ {
var compositeKey = await CreateCompositeKey(credentials); await Task.Run(() =>
var ioConnection = await BuildConnectionInfo(fileInfo); {
var compositeKey = CreateCompositeKey(credentials);
var ioConnection = IOConnectionInfo.FromByteArray(file);
_pwDatabase.Open(ioConnection, compositeKey, new NullStatusLogger()); _pwDatabase.Open(ioConnection, compositeKey, new NullStatusLogger());
_credentials = credentials; _credentials = credentials;
_fileAccessToken = fileInfo.Path; });
} }
catch (InvalidCompositeKeyException ex) catch (InvalidCompositeKeyException ex)
{ {
@@ -100,35 +106,45 @@ namespace ModernKeePass.Infrastructure.KeePass
} }
} }
public async Task ReOpen() public async Task ReOpen(byte[] file)
{ {
await Open(new FileInfo {Path = _fileAccessToken}, _credentials); await Open(file, _credentials);
} }
public async Task Create(FileInfo fileInfo, Credentials credentials, DatabaseVersion version = DatabaseVersion.V2) public async Task Create(byte[] file, Credentials credentials, DatabaseVersion version = DatabaseVersion.V2)
{ {
var compositeKey = await CreateCompositeKey(credentials);
var ioConnection = await BuildConnectionInfo(fileInfo);
_pwDatabase.New(ioConnection, compositeKey);
switch (version)
{
case DatabaseVersion.V4:
_pwDatabase.KdfParameters = KdfPool.Get("Argon2").GetDefaultParameters();
break;
}
_fileAccessToken = fileInfo.Path;
}
public async Task SaveDatabase()
{
if (!_pwDatabase.IsOpen) return;
try try
{ {
_pwDatabase.Save(new NullStatusLogger()); await Task.Run(() =>
await _fileService.WriteBinaryContentsToFile(_fileAccessToken, _pwDatabase.IOConnectionInfo.Bytes); {
var compositeKey = CreateCompositeKey(credentials);
var ioConnection = IOConnectionInfo.FromByteArray(file);
_pwDatabase.New(ioConnection, compositeKey);
switch (version)
{
case DatabaseVersion.V4:
_pwDatabase.KdfParameters = KdfPool.Get("Argon2").GetDefaultParameters();
break;
}
});
}
catch (Exception ex)
{
throw new ArgumentException(ex.Message, ex);
}
}
public async Task<byte[]> SaveDatabase()
{
try
{
return await Task.Run(() =>
{
_pwDatabase.Save(new NullStatusLogger());
return _pwDatabase.IOConnectionInfo.Bytes;
});
} }
catch (Exception e) catch (Exception e)
{ {
@@ -136,33 +152,25 @@ namespace ModernKeePass.Infrastructure.KeePass
} }
} }
public async Task SaveDatabase(string filePath) public async Task<byte[]> SaveDatabase(byte[] newFileContents)
{ {
try try
{ {
var newFileContents = await _fileService.OpenBinaryFile(filePath); return await Task.Run(() =>
_pwDatabase.SaveAs(IOConnectionInfo.FromByteArray(newFileContents), true, new NullStatusLogger()); {
await _fileService.WriteBinaryContentsToFile(filePath, _pwDatabase.IOConnectionInfo.Bytes); _pwDatabase.SaveAs(IOConnectionInfo.FromByteArray(newFileContents), true, new NullStatusLogger());
return _pwDatabase.IOConnectionInfo.Bytes;
_fileService.ReleaseFile(_fileAccessToken); });
_fileAccessToken = filePath;
} }
catch (Exception e) catch (Exception e)
{ {
throw new SaveException(e); throw new SaveException(e);
} }
} }
public void SetRecycleBin(string id)
{
_pwDatabase.RecycleBinUuid = BuildIdFromString(id);
_pwDatabase.RecycleBinChanged = _dateTime.Now;
}
public void CloseDatabase() public void CloseDatabase()
{ {
_pwDatabase?.Close(); _pwDatabase?.Close();
_fileService.ReleaseFile(_fileAccessToken);
} }
public async Task AddEntry(string parentGroupId, string entryId) public async Task AddEntry(string parentGroupId, string entryId)
@@ -214,42 +222,9 @@ namespace ModernKeePass.Infrastructure.KeePass
}); });
} }
public async Task DeleteEntry(string parentGroupId, string entryId, string recycleBinName) public void DeleteEntity(string entityId)
{ {
if (IsRecycleBinEnabled && (string.IsNullOrEmpty(RecycleBinId) || _pwDatabase.RecycleBinUuid.Equals(PwUuid.Zero))) _pwDatabase.DeletedObjects.Add(new PwDeletedObject(BuildIdFromString(entityId), _dateTime.Now));
{
CreateGroup(RootGroupId, recycleBinName, true);
}
if (!IsRecycleBinEnabled || parentGroupId.Equals(RecycleBinId))
{
_pwDatabase.DeletedObjects.Add(new PwDeletedObject(BuildIdFromString(entryId), _dateTime.Now));
}
else
{
await AddEntry(RecycleBinId, entryId);
}
await RemoveEntry(parentGroupId, entryId);
}
public async Task DeleteGroup(string parentGroupId, string groupId, string recycleBinName)
{
if (IsRecycleBinEnabled && (string.IsNullOrEmpty(RecycleBinId) || _pwDatabase.RecycleBinUuid.Equals(PwUuid.Zero)))
{
CreateGroup(RootGroupId, recycleBinName, true);
}
if (!IsRecycleBinEnabled || parentGroupId.Equals(RecycleBinId))
{
_pwDatabase.DeletedObjects.Add(new PwDeletedObject(BuildIdFromString(groupId), _dateTime.Now));
}
else
{
await AddEntry(RecycleBinId, groupId);
}
await RemoveGroup(parentGroupId, groupId);
} }
public void UpdateEntry(string entryId, string fieldName, object fieldValue) public void UpdateEntry(string entryId, string fieldName, object fieldValue)
@@ -328,32 +303,30 @@ namespace ModernKeePass.Infrastructure.KeePass
return _mapper.Map<GroupEntity>(pwGroup); return _mapper.Map<GroupEntity>(pwGroup);
} }
public async Task UpdateCredentials(Credentials credentials) public void UpdateCredentials(Credentials credentials)
{ {
_pwDatabase.MasterKey = await CreateCompositeKey(credentials); _pwDatabase.MasterKey = CreateCompositeKey(credentials);
} }
private async Task<CompositeKey> CreateCompositeKey(Credentials credentials) private CompositeKey CreateCompositeKey(Credentials credentials)
{ {
var compositeKey = new CompositeKey(); var compositeKey = new CompositeKey();
if (!string.IsNullOrEmpty(credentials.Password)) compositeKey.AddUserKey(new KcpPassword(credentials.Password)); if (!string.IsNullOrEmpty(credentials.Password)) compositeKey.AddUserKey(new KcpPassword(credentials.Password));
if (!string.IsNullOrEmpty(credentials.KeyFilePath)) if (credentials.KeyFileContents != null)
{ {
var kcpFileContents = await _fileService.OpenBinaryFile(credentials.KeyFilePath); compositeKey.AddUserKey(new KcpKeyFile(IOConnectionInfo.FromByteArray(credentials.KeyFileContents)));
compositeKey.AddUserKey(new KcpKeyFile(IOConnectionInfo.FromByteArray(kcpFileContents)));
} }
return compositeKey; return compositeKey;
} }
private async Task<IOConnectionInfo> BuildConnectionInfo(FileInfo fileInfo)
{
var fileContents = await _fileService.OpenBinaryFile(fileInfo.Path);
return IOConnectionInfo.FromByteArray(fileContents);
}
private PwUuid BuildIdFromString(string id) private PwUuid BuildIdFromString(string id)
{ {
return new PwUuid(MemUtil.HexStringToByteArray(id)); return new PwUuid(MemUtil.HexStringToByteArray(id));
} }
public void Dispose()
{
if (IsOpen) CloseDatabase();
}
} }
} }

View File

@@ -0,0 +1,17 @@
using ModernKeePass.ViewModels;
using NUnit.Framework;
using Windows.ApplicationModel;
namespace ModernKeePassApp.ViewModelTest
{
[TestFixture]
public class AboutViewModelTests
{
[Test]
public void Should_Display_App_Version()
{
var aboutVm = new AboutViewModel(Package.Current);
Assert.AreEqual("1.0", aboutVm.Version);
}
}
}

View File

@@ -0,0 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="nunit" Version="3.11.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.11.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ModernKeePass10\Win10App.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="Windows">
<HintPath>C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.18362.0\Windows.winmd</HintPath>
</Reference>
</ItemGroup>
</Project>

View File

@@ -28,6 +28,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Infrastructure", "ModernKee
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ModernKeePass.KeePassDatabaseTests", "ModernKeePass.KeePassDatabaseTests\ModernKeePass.KeePassDatabaseTests.csproj", "{52FEA1EE-2FA7-4862-85FE-CB05893D439E}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ModernKeePass.KeePassDatabaseTests", "ModernKeePass.KeePassDatabaseTests\ModernKeePass.KeePassDatabaseTests.csproj", "{52FEA1EE-2FA7-4862-85FE-CB05893D439E}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Win10App", "ModernKeePass10\Win10App.csproj", "{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ModernKeePassApp.ViewModelTest", "ModernKeePass.ViewModelTest\ModernKeePassApp.ViewModelTest.csproj", "{D978E25B-028C-446C-8143-D85563ECA914}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@@ -152,6 +156,42 @@ Global
{52FEA1EE-2FA7-4862-85FE-CB05893D439E}.Release|x64.Build.0 = Release|Any CPU {52FEA1EE-2FA7-4862-85FE-CB05893D439E}.Release|x64.Build.0 = Release|Any CPU
{52FEA1EE-2FA7-4862-85FE-CB05893D439E}.Release|x86.ActiveCfg = Release|Any CPU {52FEA1EE-2FA7-4862-85FE-CB05893D439E}.Release|x86.ActiveCfg = Release|Any CPU
{52FEA1EE-2FA7-4862-85FE-CB05893D439E}.Release|x86.Build.0 = Release|Any CPU {52FEA1EE-2FA7-4862-85FE-CB05893D439E}.Release|x86.Build.0 = Release|Any CPU
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Debug|Any CPU.ActiveCfg = Debug|x86
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Debug|ARM.ActiveCfg = Debug|ARM
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Debug|ARM.Build.0 = Debug|ARM
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Debug|ARM.Deploy.0 = Debug|ARM
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Debug|x64.ActiveCfg = Debug|x64
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Debug|x64.Build.0 = Debug|x64
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Debug|x64.Deploy.0 = Debug|x64
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Debug|x86.ActiveCfg = Debug|x86
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Debug|x86.Build.0 = Debug|x86
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Debug|x86.Deploy.0 = Debug|x86
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Release|Any CPU.ActiveCfg = Release|x86
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Release|ARM.ActiveCfg = Release|ARM
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Release|ARM.Build.0 = Release|ARM
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Release|ARM.Deploy.0 = Release|ARM
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Release|x64.ActiveCfg = Release|x64
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Release|x64.Build.0 = Release|x64
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Release|x64.Deploy.0 = Release|x64
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Release|x86.ActiveCfg = Release|x86
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Release|x86.Build.0 = Release|x86
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF}.Release|x86.Deploy.0 = Release|x86
{D978E25B-028C-446C-8143-D85563ECA914}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D978E25B-028C-446C-8143-D85563ECA914}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D978E25B-028C-446C-8143-D85563ECA914}.Debug|ARM.ActiveCfg = Debug|Any CPU
{D978E25B-028C-446C-8143-D85563ECA914}.Debug|ARM.Build.0 = Debug|Any CPU
{D978E25B-028C-446C-8143-D85563ECA914}.Debug|x64.ActiveCfg = Debug|Any CPU
{D978E25B-028C-446C-8143-D85563ECA914}.Debug|x64.Build.0 = Debug|Any CPU
{D978E25B-028C-446C-8143-D85563ECA914}.Debug|x86.ActiveCfg = Debug|Any CPU
{D978E25B-028C-446C-8143-D85563ECA914}.Debug|x86.Build.0 = Debug|Any CPU
{D978E25B-028C-446C-8143-D85563ECA914}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D978E25B-028C-446C-8143-D85563ECA914}.Release|Any CPU.Build.0 = Release|Any CPU
{D978E25B-028C-446C-8143-D85563ECA914}.Release|ARM.ActiveCfg = Release|Any CPU
{D978E25B-028C-446C-8143-D85563ECA914}.Release|ARM.Build.0 = Release|Any CPU
{D978E25B-028C-446C-8143-D85563ECA914}.Release|x64.ActiveCfg = Release|Any CPU
{D978E25B-028C-446C-8143-D85563ECA914}.Release|x64.Build.0 = Release|Any CPU
{D978E25B-028C-446C-8143-D85563ECA914}.Release|x86.ActiveCfg = Release|Any CPU
{D978E25B-028C-446C-8143-D85563ECA914}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@@ -164,6 +204,8 @@ Global
{9A0759F1-9069-4841-99E3-3BEC44E17356} = {0B30588B-07B8-4A88-A268-F58D06EA1627} {9A0759F1-9069-4841-99E3-3BEC44E17356} = {0B30588B-07B8-4A88-A268-F58D06EA1627}
{09577E4C-4899-45B9-BF80-1803D617CCAE} = {0B30588B-07B8-4A88-A268-F58D06EA1627} {09577E4C-4899-45B9-BF80-1803D617CCAE} = {0B30588B-07B8-4A88-A268-F58D06EA1627}
{52FEA1EE-2FA7-4862-85FE-CB05893D439E} = {107C7C00-56F4-41B0-A8CC-0156C46A3650} {52FEA1EE-2FA7-4862-85FE-CB05893D439E} = {107C7C00-56F4-41B0-A8CC-0156C46A3650}
{D16CAFF7-4187-45A8-A69E-D0658B7AC5BF} = {C7DB9A6F-77A8-4FE5-83CB-9C11F7100647}
{D978E25B-028C-446C-8143-D85563ECA914} = {107C7C00-56F4-41B0-A8CC-0156C46A3650}
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0ADC1BC6-B1CA-427D-A97C-3CA40AAB0428} SolutionGuid = {0ADC1BC6-B1CA-427D-A97C-3CA40AAB0428}

View File

@@ -1,11 +1,11 @@
using System.Windows.Input; using System.Windows.Input;
using Windows.UI.Xaml; using Windows.UI.Xaml;
using MediatR; using MediatR;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Xaml.Interactivity; using Microsoft.Xaml.Interactivity;
using ModernKeePass.Application.Database.Queries.GetDatabase; using ModernKeePass.Application.Database.Queries.GetDatabase;
using ModernKeePass.Common; using ModernKeePass.Common;
using ModernKeePass.Interfaces; using ModernKeePass.Interfaces;
using ModernKeePass.Services;
using ModernKeePass.ViewModels; using ModernKeePass.ViewModels;
namespace ModernKeePass.Actions namespace ModernKeePass.Actions
@@ -34,7 +34,7 @@ namespace ModernKeePass.Actions
DependencyProperty.Register("Command", typeof(ICommand), typeof(DeleteEntityAction), DependencyProperty.Register("Command", typeof(ICommand), typeof(DeleteEntityAction),
new PropertyMetadata(null)); new PropertyMetadata(null));
public DeleteEntityAction() : this(App.Mediator) { } public DeleteEntityAction() : this(App.Services.GetService<IMediator>()) { }
public DeleteEntityAction(IMediator mediator) public DeleteEntityAction(IMediator mediator)
{ {
@@ -43,7 +43,7 @@ namespace ModernKeePass.Actions
public object Execute(object sender, object parameter) public object Execute(object sender, object parameter)
{ {
var resource = new ResourcesService(); var resource = new ResourceHelper();
var type = Entity is GroupDetailVm ? "Group" : "Entry"; var type = Entity is GroupDetailVm ? "Group" : "Entry";
var isRecycleOnDelete = _mediator.Send(new GetDatabaseQuery()).GetAwaiter().GetResult().IsRecycleBinEnabled; var isRecycleOnDelete = _mediator.Send(new GetDatabaseQuery()).GetAwaiter().GetResult().IsRecycleBinEnabled;

View File

@@ -14,14 +14,15 @@ using MediatR;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.HockeyApp; using Microsoft.HockeyApp;
using ModernKeePass.Application; using ModernKeePass.Application;
using ModernKeePass.Application.Common.Interfaces;
using ModernKeePass.Application.Database.Commands.CloseDatabase; using ModernKeePass.Application.Database.Commands.CloseDatabase;
using ModernKeePass.Application.Database.Commands.SaveDatabase; using ModernKeePass.Application.Database.Commands.SaveDatabase;
using ModernKeePass.Application.Database.Queries.GetDatabase; using ModernKeePass.Application.Database.Queries.GetDatabase;
using ModernKeePass.Application.Database.Queries.ReOpenDatabase; using ModernKeePass.Application.Database.Queries.ReOpenDatabase;
using ModernKeePass.Common; using ModernKeePass.Common;
using ModernKeePass.Domain.Dtos;
using ModernKeePass.Domain.Exceptions; using ModernKeePass.Domain.Exceptions;
using ModernKeePass.Infrastructure; using ModernKeePass.Infrastructure;
using ModernKeePass.Services;
using ModernKeePass.Views; using ModernKeePass.Views;
// The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=234227 // The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=234227
@@ -33,9 +34,11 @@ namespace ModernKeePass
/// </summary> /// </summary>
sealed partial class App sealed partial class App
{ {
public IServiceProvider Services { get; } private readonly IResourceProxy _resource;
private readonly IMediator _mediator;
private readonly ISettingsProxy _settings;
public static IMediator Mediator { get; private set; } public static IServiceProvider Services { get; private set; }
/// <summary> /// <summary>
/// Initializes the singleton application object. This is the first line of authored code /// Initializes the singleton application object. This is the first line of authored code
@@ -56,10 +59,15 @@ namespace ModernKeePass
// Setup DI // Setup DI
IServiceCollection serviceCollection = new ServiceCollection(); IServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddApplication(); serviceCollection.AddApplication();
serviceCollection.AddInfrastructure(); serviceCollection.AddInfrastructureCommon();
serviceCollection.AddInfrastructureKeePass();
serviceCollection.AddInfrastructureUwp();
serviceCollection.AddAppAutomapper(); serviceCollection.AddAppAutomapper();
Services = serviceCollection.BuildServiceProvider(); Services = serviceCollection.BuildServiceProvider();
Mediator = Services.GetService<IMediator>();
_mediator = Services.GetService<IMediator>();
_resource = Services.GetService<IResourceProxy>();
_settings = Services.GetService<ISettingsProxy>();
} }
#region Event Handlers #region Event Handlers
@@ -74,30 +82,29 @@ namespace ModernKeePass
? exception.InnerException ? exception.InnerException
: exception; : exception;
var resource = new ResourcesService();
if (realException is SaveException) if (realException is SaveException)
{ {
unhandledExceptionEventArgs.Handled = true; unhandledExceptionEventArgs.Handled = true;
await MessageDialogHelper.ShowActionDialog(resource.GetResourceValue("MessageDialogSaveErrorTitle"), await MessageDialogHelper.ShowActionDialog(_resource.GetResourceValue("MessageDialogSaveErrorTitle"),
realException.InnerException.Message, realException.InnerException.Message,
resource.GetResourceValue("MessageDialogSaveErrorButtonSaveAs"), _resource.GetResourceValue("MessageDialogSaveErrorButtonSaveAs"),
resource.GetResourceValue("MessageDialogSaveErrorButtonDiscard"), _resource.GetResourceValue("MessageDialogSaveErrorButtonDiscard"),
async command => async command =>
{ {
var database = await Mediator.Send(new GetDatabaseQuery()); var database = await _mediator.Send(new GetDatabaseQuery());
var savePicker = new FileSavePicker var savePicker = new FileSavePicker
{ {
SuggestedStartLocation = PickerLocationId.DocumentsLibrary, SuggestedStartLocation = PickerLocationId.DocumentsLibrary,
SuggestedFileName = $"{database.Name} - copy" SuggestedFileName = $"{database.Name} - copy"
}; };
savePicker.FileTypeChoices.Add(resource.GetResourceValue("MessageDialogSaveErrorFileTypeDesc"), savePicker.FileTypeChoices.Add(_resource.GetResourceValue("MessageDialogSaveErrorFileTypeDesc"),
new List<string> {".kdbx"}); new List<string> {".kdbx"});
var file = await savePicker.PickSaveFileAsync(); var file = await savePicker.PickSaveFileAsync();
if (file != null) if (file != null)
{ {
var token = StorageApplicationPermissions.FutureAccessList.Add(file); var token = StorageApplicationPermissions.FutureAccessList.Add(file);
await Mediator.Send(new SaveDatabaseCommand { FilePath = token }); await _mediator.Send(new SaveDatabaseCommand { FilePath = token });
} }
}, null); }, null);
} }
@@ -124,7 +131,7 @@ namespace ModernKeePass
#if DEBUG #if DEBUG
if (System.Diagnostics.Debugger.IsAttached) if (System.Diagnostics.Debugger.IsAttached)
{ {
//DebugSettings.EnableFrameRateCounter = true; DebugSettings.EnableFrameRateCounter = true;
} }
#endif #endif
@@ -167,7 +174,7 @@ namespace ModernKeePass
try try
{ {
await Mediator.Send(new ReOpenDatabaseQuery()); await _mediator.Send(new ReOpenDatabaseQuery());
#if DEBUG #if DEBUG
ToastNotificationHelper.ShowGenericToast("App resumed", "Database reopened (changes were saved)"); ToastNotificationHelper.ShowGenericToast("App resumed", "Database reopened (changes were saved)");
#endif #endif
@@ -203,11 +210,11 @@ namespace ModernKeePass
var deferral = e.SuspendingOperation.GetDeferral(); var deferral = e.SuspendingOperation.GetDeferral();
try try
{ {
if (SettingsService.Instance.GetSetting("SaveSuspend", true)) if (_settings.GetSetting("SaveSuspend", true))
{ {
await Mediator.Send(new SaveDatabaseCommand()); await _mediator.Send(new SaveDatabaseCommand());
} }
await Mediator.Send(new CloseDatabaseCommand()); await _mediator.Send(new CloseDatabaseCommand());
} }
catch (Exception exception) catch (Exception exception)
{ {
@@ -226,7 +233,22 @@ namespace ModernKeePass
base.OnFileActivated(args); base.OnFileActivated(args);
var rootFrame = new Frame(); var rootFrame = new Frame();
var file = args.Files[0] as StorageFile; var file = args.Files[0] as StorageFile;
rootFrame.Navigate(typeof(MainPage), file);
if (file != null)
{
var token = StorageApplicationPermissions.FutureAccessList.Add(file);
var fileInfo = new FileInfo
{
Path = token,
Name = file.DisplayName
};
rootFrame.Navigate(typeof(MainPage), fileInfo);
}
else
{
rootFrame.Navigate(typeof(MainPage));
}
Window.Current.Content = rootFrame; Window.Current.Content = rootFrame;
Window.Current.Activate(); Window.Current.Activate();
} }

View File

@@ -1,9 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using Windows.System; using Windows.System;
using Windows.UI.Core; using Windows.UI.Core;
using Windows.UI.Xaml; using Windows.UI.Xaml;

View File

@@ -1,28 +0,0 @@
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace ModernKeePass.Common
{
public class NotifyPropertyChangedBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
protected bool SetProperty<T>(ref T property, T value, [CallerMemberName] string propertyName = "")
{
if (EqualityComparer<T>.Default.Equals(property, value))
{
return false;
}
property = value;
OnPropertyChanged(propertyName);
return true;
}
}
}

View File

@@ -1,9 +1,8 @@
using Windows.ApplicationModel.Resources; using Windows.ApplicationModel.Resources;
using ModernKeePass.Interfaces;
namespace ModernKeePass.Services namespace ModernKeePass.Common
{ {
public class ResourcesService: IResourceService public class ResourceHelper
{ {
private const string ResourceFileName = "CodeBehind"; private const string ResourceFileName = "CodeBehind";
private readonly ResourceLoader _resourceLoader = ResourceLoader.GetForCurrentView(); private readonly ResourceLoader _resourceLoader = ResourceLoader.GetForCurrentView();
@@ -14,4 +13,4 @@ namespace ModernKeePass.Services
return resource; return resource;
} }
} }
} }

View File

@@ -3,7 +3,6 @@ using Windows.Data.Json;
using Windows.Data.Xml.Dom; using Windows.Data.Xml.Dom;
using Windows.UI.Notifications; using Windows.UI.Notifications;
using ModernKeePass.Interfaces; using ModernKeePass.Interfaces;
using ModernKeePass.ViewModels;
namespace ModernKeePass.Common namespace ModernKeePass.Common
{ {

View File

@@ -1,35 +0,0 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Windows.Storage;
using ModernKeePass.Interfaces;
namespace ModernKeePass.ImportFormats
{
public class CsvImportFormat: IFormat
{
public bool HasHeaderRow { get; set; } = true;
public char Delimiter { get; set; } = ';';
public char LineDelimiter { get; set; } = '\n';
public async Task<List<Dictionary<string, string>>> Import(IStorageFile source)
{
var parsedResult = new List<Dictionary<string, string>>();
var content = await FileIO.ReadLinesAsync(source);
foreach (var line in content)
{
var fields = line.Split(Delimiter);
var recordItem = new Dictionary<string, string>();
var i = 0;
foreach (var field in fields)
{
recordItem.Add(i.ToString(), field);
i++;
}
parsedResult.Add(recordItem);
}
return parsedResult;
}
}
}

View File

@@ -1,16 +0,0 @@
using Windows.Storage;
using ModernKeePass.Interfaces;
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace ModernKeePass.ImportFormats
{
public class NullImportFormat: IFormat
{
public Task<List<Dictionary<string, string>>> Import(IStorageFile source)
{
throw new NotImplementedException();
}
}
}

View File

@@ -1,11 +0,0 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Windows.Storage;
namespace ModernKeePass.Interfaces
{
public interface IFormat
{
Task<List<Dictionary<string, string>>> Import(IStorageFile source);
}
}

View File

@@ -1,9 +0,0 @@
using System.Reflection;
namespace ModernKeePass.Interfaces
{
public interface IProxyInvocationHandler
{
object Invoke(object proxy, MethodInfo method, object[] parameters);
}
}

View File

@@ -1,11 +0,0 @@
using Windows.Storage;
namespace ModernKeePass.Interfaces
{
public interface IRecentItem
{
StorageFile DatabaseFile { get; }
string Token { get; }
string Name { get; }
}
}

View File

@@ -1,15 +0,0 @@
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using Windows.Storage;
namespace ModernKeePass.Interfaces
{
public interface IRecentService
{
int EntryCount { get; }
Task<IStorageItem> GetFileAsync(string token);
ObservableCollection<IRecentItem> GetAllFiles(bool removeIfNonExistant = true);
void Add(IStorageItem file, string metadata);
void ClearAll();
}
}

View File

@@ -1,7 +0,0 @@
namespace ModernKeePass.Interfaces
{
public interface IResourceService
{
string GetResourceValue(string key);
}
}

View File

@@ -1,8 +0,0 @@
namespace ModernKeePass.Interfaces
{
public interface ISettingsService
{
T GetSetting<T>(string property, T defaultValue = default(T));
void PutSetting<T>(string property, T value);
}
}

View File

@@ -1,194 +0,0 @@
using System;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Threading.Tasks;
using Windows.Storage;
using Microsoft.HockeyApp;
using ModernKeePass.Domain.Exceptions;
using ModernKeePass.Interfaces;
using ModernKeePass.ViewModels;
using ModernKeePassLib;
using ModernKeePassLib.Cryptography.KeyDerivation;
using ModernKeePassLib.Interfaces;
using ModernKeePassLib.Keys;
using ModernKeePassLib.Serialization;
namespace ModernKeePass.Services
{
public class DatabaseService: SingletonServiceBase<DatabaseService>, IDatabaseService
{
private readonly PwDatabase _pwDatabase = new PwDatabase();
private readonly ISettingsService _settings;
private StorageFile _databaseFile;
private GroupVm _recycleBin;
private CompositeKey _compositeKey;
public GroupVm RootGroup { get; set; }
public GroupVm RecycleBin
{
get { return _recycleBin; }
set
{
_recycleBin = value;
_pwDatabase.RecycleBinUuid = _recycleBin?.IdUuid;
}
}
public string Name => _databaseFile?.Name;
public bool RecycleBinEnabled
{
get { return _pwDatabase.RecycleBinEnabled; }
set { _pwDatabase.RecycleBinEnabled = value; }
}
public PwUuid DataCipher
{
get { return _pwDatabase.DataCipherUuid; }
set { _pwDatabase.DataCipherUuid = value; }
}
public PwCompressionAlgorithm CompressionAlgorithm
{
get { return _pwDatabase.Compression; }
set { _pwDatabase.Compression = value; }
}
public KdfParameters KeyDerivation
{
get { return _pwDatabase.KdfParameters; }
set { _pwDatabase.KdfParameters = value; }
}
public bool IsOpen => _pwDatabase.IsOpen;
public bool IsFileOpen => !_pwDatabase.IsOpen && _databaseFile != null;
public bool IsClosed => _databaseFile == null;
public bool HasChanged { get; set; }
public DatabaseService() : this(SettingsService.Instance)
{
}
public DatabaseService(ISettingsService settings)
{
_settings = settings;
}
/// <summary>
/// Open a KeePass database
/// </summary>
/// <param name="databaseFile">The database file</param>
/// <param name="key">The database composite key</param>
/// <param name="createNew">True to create a new database before opening it</param>
/// <returns>An error message, if any</returns>
public async Task Open(StorageFile databaseFile, CompositeKey key, bool createNew = false)
{
try
{
if (databaseFile == null)
{
throw new ArgumentNullException(nameof(databaseFile));
}
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
_compositeKey = key;
var fileContents = await FileIO.ReadBufferAsync(databaseFile);
var ioConnection = IOConnectionInfo.FromByteArray(fileContents.ToArray());
if (createNew)
{
_pwDatabase.New(ioConnection, key);
var fileFormat = _settings.GetSetting<string>("DefaultFileFormat");
switch (fileFormat)
{
case "4":
KeyDerivation = KdfPool.Get("Argon2").GetDefaultParameters();
break;
}
}
else _pwDatabase.Open(ioConnection, key, new NullStatusLogger());
_databaseFile = databaseFile;
RootGroup = new GroupVm(_pwDatabase.RootGroup, null, RecycleBinEnabled ? _pwDatabase.RecycleBinUuid : null);
}
catch (InvalidCompositeKeyException ex)
{
HockeyClient.Current.TrackException(ex);
throw new ArgumentException(ex.Message, ex);
}
}
public async Task ReOpen()
{
await Open(_databaseFile, _compositeKey);
}
/// <summary>
/// Commit the changes to the currently opened database to file
/// </summary>
public void Save()
{
if (!IsOpen) return;
try
{
_pwDatabase.Save(new NullStatusLogger());
}
catch (Exception e)
{
throw new SaveException(e);
}
}
/// <summary>
/// Save the current database to another file and open it
/// </summary>
/// <param name="file">The new database file</param>
public async Task Save(StorageFile file)
{
var oldFile = _databaseFile;
_databaseFile = file;
try
{
var fileContents = await FileIO.ReadBufferAsync(file);
_pwDatabase.SaveAs(IOConnectionInfo.FromByteArray(fileContents.ToArray()), true, new NullStatusLogger());
}
catch
{
_databaseFile = oldFile;
throw;
}
}
/// <summary>
/// Close the currently opened database
/// </summary>
public void Close(bool releaseFile = true)
{
_pwDatabase?.Close();
if (releaseFile) _databaseFile = null;
}
public void AddDeletedItem(PwUuid id)
{
_pwDatabase.DeletedObjects.Add(new PwDeletedObject(id, DateTime.UtcNow));
}
public void CreateRecycleBin(string title)
{
RecycleBin = RootGroup.AddNewGroup(title);
RecycleBin.IsSelected = true;
RecycleBin.IconId = (int)PwIcon.TrashBin;
}
public void UpdateCompositeKey(CompositeKey newCompositeKey)
{
if (newCompositeKey == null) return;
_compositeKey = newCompositeKey;
_pwDatabase.MasterKey = newCompositeKey;
}
}
}

View File

@@ -1,25 +0,0 @@
using System.Threading.Tasks;
using Windows.Storage;
using ModernKeePass.Interfaces;
using ModernKeePass.ViewModels;
namespace ModernKeePass.Services
{
public class ImportService : IImportService<IFormat>
{
public async Task Import(IFormat format, IStorageFile source, GroupVm group)
{
var data = await format.Import(source);
foreach (var entity in data)
{
var entry = group.AddNewEntry();
entry.Title = entity["0"];
entry.UserName = entity["1"];
entry.Password = entity["2"];
if (entity.Count > 3) entry.Url = entity["3"];
if (entity.Count > 4) entry.Notes = entity["4"];
}
}
}
}

View File

@@ -1,50 +0,0 @@
using System;
using System.Collections.ObjectModel;
using System.Threading.Tasks;
using ModernKeePass.Interfaces;
using Windows.Storage;
using Windows.Storage.AccessCache;
using ModernKeePass.ViewModels;
namespace ModernKeePass.Services
{
public class RecentService : SingletonServiceBase<RecentService>, IRecentService
{
private readonly StorageItemMostRecentlyUsedList _mru = StorageApplicationPermissions.MostRecentlyUsedList;
public int EntryCount => _mru.Entries.Count;
public ObservableCollection<IRecentItem> GetAllFiles(bool removeIfNonExistant = true)
{
var result = new ObservableCollection<IRecentItem>();
foreach (var entry in _mru.Entries)
{
try
{
var file = _mru.GetFileAsync(entry.Token, AccessCacheOptions.SuppressAccessTimeUpdate).GetAwaiter().GetResult();
result.Add(new RecentItemVm(entry.Token, entry.Metadata, file));
}
catch (Exception)
{
if (removeIfNonExistant) _mru.Remove(entry.Token);
}
}
return result;
}
public void Add(IStorageItem file, string metadata)
{
_mru.Add(file, metadata);
}
public void ClearAll()
{
_mru.Clear();
}
public async Task<IStorageItem> GetFileAsync(string token)
{
return await _mru.GetFileAsync(token);
}
}
}

View File

@@ -1,31 +0,0 @@
using System;
using Windows.Foundation.Collections;
using Windows.Storage;
using ModernKeePass.Interfaces;
namespace ModernKeePass.Services
{
public class SettingsService : SingletonServiceBase<SettingsService>, ISettingsService
{
private readonly IPropertySet _values = ApplicationData.Current.LocalSettings.Values;
public T GetSetting<T>(string property, T defaultValue = default(T))
{
try
{
return (T)Convert.ChangeType(_values[property], typeof(T));
}
catch (InvalidCastException)
{
return defaultValue;
}
}
public void PutSetting<T>(string property, T value)
{
if (_values.ContainsKey(property))
_values[property] = value;
else _values.Add(property, value);
}
}
}

View File

@@ -1,12 +0,0 @@
using System;
namespace ModernKeePass.Services
{
public abstract class SingletonServiceBase<T> where T : new()
{
private static readonly Lazy<T> LazyInstance =
new Lazy<T>(() => new T());
public static T Instance => LazyInstance.Value;
}
}

View File

@@ -1,17 +1,16 @@
using System; using System;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Windows.Storage;
using Windows.Storage.AccessCache;
using MediatR; using MediatR;
using Microsoft.Extensions.DependencyInjection;
using ModernKeePass.Application.Database.Commands.UpdateCredentials; using ModernKeePass.Application.Database.Commands.UpdateCredentials;
using ModernKeePass.Application.Database.Queries.GetDatabase; using ModernKeePass.Application.Database.Queries.GetDatabase;
using ModernKeePass.Application.Database.Queries.OpenDatabase; using ModernKeePass.Application.Database.Queries.OpenDatabase;
using ModernKeePass.Application.Security.Commands.GenerateKeyFile; using ModernKeePass.Application.Security.Commands.GenerateKeyFile;
using ModernKeePass.Application.Security.Queries.EstimatePasswordComplexity; using ModernKeePass.Application.Security.Queries.EstimatePasswordComplexity;
using ModernKeePass.Domain.AOP;
using ModernKeePass.Domain.Dtos;
using ModernKeePass.Common; using ModernKeePass.Common;
using ModernKeePass.Interfaces;
using ModernKeePass.Services;
namespace ModernKeePass.ViewModels namespace ModernKeePass.ViewModels
{ {
@@ -55,7 +54,7 @@ namespace ModernKeePass.ViewModels
} }
} }
public bool IsValid => !_isOpening && (HasPassword || HasKeyFile && KeyFile != null || HasUserAccount); public bool IsValid => !_isOpening && (HasPassword || HasKeyFile && KeyFilePath != null || HasUserAccount);
public string Status public string Status
{ {
@@ -75,20 +74,19 @@ namespace ModernKeePass.ViewModels
set set
{ {
_password = value; _password = value;
OnPropertyChanged("PasswordComplexityIndicator"); OnPropertyChanged(nameof(PasswordComplexityIndicator));
StatusType = (int)StatusTypes.Normal; StatusType = (int)StatusTypes.Normal;
Status = string.Empty; Status = string.Empty;
} }
} }
public StorageFile KeyFile public string KeyFilePath
{ {
get { return _keyFile; } get { return _keyFilePath; }
set set
{ {
_keyFile = value; _keyFilePath = value;
KeyFileText = value?.Name; OnPropertyChanged(nameof(IsValid));
OnPropertyChanged("IsValid");
} }
} }
@@ -109,21 +107,21 @@ namespace ModernKeePass.ViewModels
private string _password = string.Empty; private string _password = string.Empty;
private string _status; private string _status;
private StatusTypes _statusType; private StatusTypes _statusType;
private StorageFile _keyFile; private string _keyFilePath;
private string _keyFileText; private string _keyFileText;
private readonly IMediator _mediator; private readonly IMediator _mediator;
private readonly IResourceService _resource; private readonly ResourceHelper _resource;
public CompositeKeyVm() : this(App.Mediator, new ResourcesService()) { } public CompositeKeyVm() : this(App.Services.GetService<IMediator>()) { }
public CompositeKeyVm(IMediator mediator, IResourceService resource) public CompositeKeyVm(IMediator mediator)
{ {
_mediator = mediator; _mediator = mediator;
_resource = resource; _resource = new ResourceHelper();
_keyFileText = _resource.GetResourceValue("CompositeKeyDefaultKeyFile"); _keyFileText = _resource.GetResourceValue("CompositeKeyDefaultKeyFile");
} }
public async Task<bool> OpenDatabase(StorageFile databaseFile, bool createNew) public async Task<bool> OpenDatabase(string databaseFilePath, bool createNew)
{ {
try try
{ {
@@ -131,9 +129,9 @@ namespace ModernKeePass.ViewModels
OnPropertyChanged(nameof(IsValid)); OnPropertyChanged(nameof(IsValid));
await _mediator.Send(new OpenDatabaseQuery { await _mediator.Send(new OpenDatabaseQuery {
FilePath = StorageApplicationPermissions.FutureAccessList.Add(databaseFile), FilePath = databaseFilePath,
KeyFilePath = HasKeyFile && KeyFile != null ? StorageApplicationPermissions.FutureAccessList.Add(KeyFile) : null, KeyFilePath = HasKeyFile ? KeyFilePath : null,
Password = Password = HasPassword ? Password : null, Password = HasPassword ? Password : null,
}); });
RootGroupId = (await _mediator.Send(new GetDatabaseQuery())).RootGroupId; RootGroupId = (await _mediator.Send(new GetDatabaseQuery())).RootGroupId;
return true; return true;
@@ -163,18 +161,18 @@ namespace ModernKeePass.ViewModels
{ {
await _mediator.Send(new UpdateCredentialsCommand await _mediator.Send(new UpdateCredentialsCommand
{ {
KeyFilePath = HasKeyFile && KeyFile != null ? StorageApplicationPermissions.FutureAccessList.Add(KeyFile) : null, KeyFilePath = HasKeyFile ? KeyFilePath : null,
Password = Password = HasPassword ? Password : null, Password = HasPassword ? Password : null,
}); });
UpdateStatus(_resource.GetResourceValue("CompositeKeyUpdated"), StatusTypes.Success); UpdateStatus(_resource.GetResourceValue("CompositeKeyUpdated"), StatusTypes.Success);
} }
public async Task CreateKeyFile(StorageFile file) public async Task CreateKeyFile(FileInfo file)
{ {
var token = StorageApplicationPermissions.FutureAccessList.Add(file);
// TODO: implement entropy generator // TODO: implement entropy generator
await _mediator.Send(new GenerateKeyFileCommand {KeyFilePath = token}); await _mediator.Send(new GenerateKeyFileCommand {KeyFilePath = file.Path});
KeyFile = file; KeyFilePath = file.Path;
KeyFileText = file.Name;
} }
private void UpdateStatus(string text, StatusTypes type) private void UpdateStatus(string text, StatusTypes type)

View File

@@ -5,6 +5,7 @@ using System.Threading.Tasks;
using System.Windows.Input; using System.Windows.Input;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using MediatR; using MediatR;
using Microsoft.Extensions.DependencyInjection;
using ModernKeePass.Application.Database.Commands.SaveDatabase; using ModernKeePass.Application.Database.Commands.SaveDatabase;
using ModernKeePass.Application.Database.Models; using ModernKeePass.Application.Database.Models;
using ModernKeePass.Application.Database.Queries.GetDatabase; using ModernKeePass.Application.Database.Queries.GetDatabase;
@@ -22,6 +23,7 @@ using ModernKeePass.Domain.Enums;
using ModernKeePass.Domain.Interfaces; using ModernKeePass.Domain.Interfaces;
using ModernKeePass.Interfaces; using ModernKeePass.Interfaces;
using ModernKeePass.Application.Group.Models; using ModernKeePass.Application.Group.Models;
using ModernKeePass.Domain.AOP;
namespace ModernKeePass.ViewModels namespace ModernKeePass.ViewModels
{ {
@@ -49,21 +51,13 @@ namespace ModernKeePass.ViewModels
public bool IsSelected public bool IsSelected
{ {
get { return _isSelected; } get { return _isSelected; }
set set { SetProperty(ref _isSelected, value); }
{
_isSelected = value;
OnPropertyChanged();
}
} }
public double PasswordLength public double PasswordLength
{ {
get { return _passwordLength; } get { return _passwordLength; }
set set { SetProperty(ref _passwordLength, value); }
{
_passwordLength = value;
OnPropertyChanged();
}
} }
public string Title public string Title
@@ -191,31 +185,19 @@ namespace ModernKeePass.ViewModels
public bool IsEditMode public bool IsEditMode
{ {
get { return IsSelected && _isEditMode; } get { return IsSelected && _isEditMode; }
set set { SetProperty(ref _isEditMode, value); }
{
_isEditMode = value;
OnPropertyChanged();
}
} }
public bool IsVisible public bool IsVisible
{ {
get { return _isVisible; } get { return _isVisible; }
set set { SetProperty(ref _isVisible, value); }
{
_isVisible = value;
OnPropertyChanged();
}
} }
public bool IsRevealPassword public bool IsRevealPassword
{ {
get { return _isRevealPassword; } get { return _isRevealPassword; }
set set { SetProperty(ref _isRevealPassword, value); }
{
_isRevealPassword = value;
OnPropertyChanged();
}
} }
public bool CanRestore => _entry.ParentGroupId == _database.RecycleBinId; public bool CanRestore => _entry.ParentGroupId == _database.RecycleBinId;
@@ -237,7 +219,7 @@ namespace ModernKeePass.ViewModels
public EntryDetailVm() { } public EntryDetailVm() { }
internal EntryDetailVm(string entryId, bool isNewEntry = false) : this(entryId, App.Mediator, isNewEntry) { } internal EntryDetailVm(string entryId, bool isNewEntry = false) : this(entryId, App.Services.GetService<IMediator>(), isNewEntry) { }
public EntryDetailVm(string entryId, IMediator mediator, bool isNewEntry = false) public EntryDetailVm(string entryId, IMediator mediator, bool isNewEntry = false)
{ {

View File

@@ -6,6 +6,7 @@ using System.Threading.Tasks;
using System.Windows.Input; using System.Windows.Input;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using MediatR; using MediatR;
using Microsoft.Extensions.DependencyInjection;
using ModernKeePass.Application.Database.Commands.SaveDatabase; using ModernKeePass.Application.Database.Commands.SaveDatabase;
using ModernKeePass.Application.Database.Models; using ModernKeePass.Application.Database.Models;
using ModernKeePass.Application.Database.Queries.GetDatabase; using ModernKeePass.Application.Database.Queries.GetDatabase;
@@ -23,6 +24,7 @@ using ModernKeePass.Application.Group.Commands.SortGroups;
using ModernKeePass.Application.Group.Models; using ModernKeePass.Application.Group.Models;
using ModernKeePass.Application.Group.Queries.GetGroup; using ModernKeePass.Application.Group.Queries.GetGroup;
using ModernKeePass.Common; using ModernKeePass.Common;
using ModernKeePass.Domain.AOP;
using ModernKeePass.Domain.Enums; using ModernKeePass.Domain.Enums;
using ModernKeePass.Domain.Interfaces; using ModernKeePass.Domain.Interfaces;
using ModernKeePass.Interfaces; using ModernKeePass.Interfaces;
@@ -122,7 +124,7 @@ namespace ModernKeePass.ViewModels
public GroupDetailVm() {} public GroupDetailVm() {}
internal GroupDetailVm(string groupId) : this(groupId, App.Mediator) internal GroupDetailVm(string groupId) : this(groupId, App.Services.GetService<IMediator>())
{ } { }
public GroupDetailVm(string groupId, IMediator mediator, bool isEditMode = false) public GroupDetailVm(string groupId, IMediator mediator, bool isEditMode = false)

View File

@@ -1,8 +1,7 @@
using System; using System;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using ModernKeePass.Common; using ModernKeePass.Domain.AOP;
using ModernKeePass.Domain.Interfaces; using ModernKeePass.Domain.Interfaces;
using ModernKeePass.Interfaces;
namespace ModernKeePass.ViewModels namespace ModernKeePass.ViewModels
{ {

View File

@@ -1,20 +1,20 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Windows.Storage; using Microsoft.Extensions.DependencyInjection;
using ModernKeePass.Common; using ModernKeePass.Application.Common.Interfaces;
using ModernKeePass.Domain.AOP;
using ModernKeePass.Domain.Dtos;
using ModernKeePass.Domain.Interfaces; using ModernKeePass.Domain.Interfaces;
using ModernKeePass.Interfaces;
using ModernKeePass.Services;
namespace ModernKeePass.ViewModels namespace ModernKeePass.ViewModels
{ {
public class RecentItemVm: NotifyPropertyChangedBase, ISelectableModel, IRecentItem public class RecentItemVm: NotifyPropertyChangedBase, ISelectableModel
{ {
private readonly IRecentProxy _recent;
private bool _isSelected; private bool _isSelected;
public StorageFile DatabaseFile { get; }
public string Token { get; } public string Token { get; }
public string Name { get; } public string Name { get; }
public string Path => DatabaseFile?.Path; public string Path => string.Empty;
public bool IsSelected public bool IsSelected
{ {
@@ -22,22 +22,17 @@ namespace ModernKeePass.ViewModels
set { SetProperty(ref _isSelected, value); } set { SetProperty(ref _isSelected, value); }
} }
public RecentItemVm() {} public RecentItemVm(FileInfo file): this(App.Services.GetService<IRecentProxy>(), file) {}
public RecentItemVm(string token, string metadata, IStorageItem file) public RecentItemVm(IRecentProxy recent, FileInfo file)
{ {
Token = token; _recent = recent;
Name = metadata; Token = file.Path;
DatabaseFile = file as StorageFile; Name = file.Name;
} }
public void UpdateAccessTime() public async Task UpdateAccessTime()
{ {
UpdateAccessTime(RecentService.Instance).Wait(); await _recent.Get(Token);
}
public async Task UpdateAccessTime(IRecentService recent)
{
await recent.GetFileAsync(Token);
} }
} }
} }

View File

@@ -2,6 +2,7 @@
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using MediatR; using MediatR;
using Microsoft.Extensions.DependencyInjection;
using ModernKeePass.Application.Common.Interfaces; using ModernKeePass.Application.Common.Interfaces;
using ModernKeePass.Application.Database.Models; using ModernKeePass.Application.Database.Models;
using ModernKeePass.Application.Database.Queries.GetDatabase; using ModernKeePass.Application.Database.Queries.GetDatabase;
@@ -15,7 +16,7 @@ using ModernKeePass.Application.Parameters.Models;
using ModernKeePass.Application.Parameters.Queries.GetCiphers; using ModernKeePass.Application.Parameters.Queries.GetCiphers;
using ModernKeePass.Application.Parameters.Queries.GetCompressions; using ModernKeePass.Application.Parameters.Queries.GetCompressions;
using ModernKeePass.Application.Parameters.Queries.GetKeyDerivations; using ModernKeePass.Application.Parameters.Queries.GetKeyDerivations;
using ModernKeePass.Common; using ModernKeePass.Domain.AOP;
namespace ModernKeePass.ViewModels namespace ModernKeePass.ViewModels
{ {
@@ -73,7 +74,7 @@ namespace ModernKeePass.ViewModels
set { _mediator.Send(new SetRecycleBinCommand { RecycleBinId = value.Id}).Wait(); } set { _mediator.Send(new SetRecycleBinCommand { RecycleBinId = value.Id}).Wait(); }
} }
public SettingsDatabaseVm() : this(App.Mediator) { } public SettingsDatabaseVm() : this(App.Services.GetService<IMediator>()) { }
public SettingsDatabaseVm(IMediator mediator) public SettingsDatabaseVm(IMediator mediator)
{ {

View File

@@ -1,17 +1,17 @@
using System.Collections.Generic; using System.Collections.Generic;
using ModernKeePass.Interfaces; using Microsoft.Extensions.DependencyInjection;
using ModernKeePass.Services; using ModernKeePass.Application.Common.Interfaces;
namespace ModernKeePass.ViewModels namespace ModernKeePass.ViewModels
{ {
public class SettingsNewVm public class SettingsNewVm
{ {
private readonly ISettingsService _settings; private readonly ISettingsProxy _settings;
public SettingsNewVm() : this(SettingsService.Instance) public SettingsNewVm() : this(App.Services.GetService<ISettingsProxy>())
{ } { }
public SettingsNewVm(ISettingsService settings) public SettingsNewVm(ISettingsProxy settings)
{ {
_settings = settings; _settings = settings;
} }

View File

@@ -1,16 +1,16 @@
using ModernKeePass.Interfaces; using Microsoft.Extensions.DependencyInjection;
using ModernKeePass.Services; using ModernKeePass.Application.Common.Interfaces;
namespace ModernKeePass.ViewModels namespace ModernKeePass.ViewModels
{ {
public class SettingsSaveVm public class SettingsSaveVm
{ {
private readonly ISettingsService _settings; private readonly ISettingsProxy _settings;
public SettingsSaveVm() : this(SettingsService.Instance) public SettingsSaveVm() : this(App.Services.GetService<ISettingsProxy>())
{ } { }
public SettingsSaveVm(ISettingsService settings) public SettingsSaveVm(ISettingsProxy settings)
{ {
_settings = settings; _settings = settings;
} }

View File

@@ -1,14 +1,15 @@
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using Windows.ApplicationModel; using Windows.ApplicationModel;
using Windows.Storage;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using MediatR; using MediatR;
using Microsoft.Extensions.DependencyInjection;
using ModernKeePass.Application.Common.Interfaces;
using ModernKeePass.Application.Database.Queries.GetDatabase; using ModernKeePass.Application.Database.Queries.GetDatabase;
using ModernKeePass.Common; using ModernKeePass.Common;
using ModernKeePass.Domain.AOP;
using ModernKeePass.Domain.Dtos;
using ModernKeePass.Domain.Interfaces; using ModernKeePass.Domain.Interfaces;
using ModernKeePass.Interfaces;
using ModernKeePass.Services;
using ModernKeePass.Views; using ModernKeePass.Views;
namespace ModernKeePass.ViewModels namespace ModernKeePass.ViewModels
@@ -48,12 +49,13 @@ namespace ModernKeePass.ViewModels
public MainVm() {} public MainVm() {}
internal MainVm(Frame referenceFrame, Frame destinationFrame, StorageFile databaseFile = null) : this(referenceFrame, destinationFrame, internal MainVm(Frame referenceFrame, Frame destinationFrame, FileInfo databaseFile = null) : this(referenceFrame, destinationFrame,
App.Mediator, new ResourcesService(), RecentService.Instance, databaseFile) App.Services.GetService<IMediator>(), App.Services.GetService<IRecentProxy>(), databaseFile)
{ } { }
public MainVm(Frame referenceFrame, Frame destinationFrame, IMediator mediator, IResourceService resource, IRecentService recent, StorageFile databaseFile = null) public MainVm(Frame referenceFrame, Frame destinationFrame, IMediator mediator, IRecentProxy recent, FileInfo databaseFile = null)
{ {
var resource = new ResourceHelper();
var database = mediator.Send(new GetDatabaseQuery()).GetAwaiter().GetResult(); var database = mediator.Send(new GetDatabaseQuery()).GetAwaiter().GetResult();
var mainMenuItems = new ObservableCollection<MainMenuItemVm> var mainMenuItems = new ObservableCollection<MainMenuItemVm>

View File

@@ -1,6 +1,8 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Windows.Storage; using Windows.Storage;
using MediatR; using MediatR;
using Microsoft.Extensions.DependencyInjection;
using ModernKeePass.Application.Common.Interfaces;
using ModernKeePass.Application.Database.Queries.GetDatabase; using ModernKeePass.Application.Database.Queries.GetDatabase;
using ModernKeePass.Application.Entry.Commands.SetFieldValue; using ModernKeePass.Application.Entry.Commands.SetFieldValue;
using ModernKeePass.Application.Group.Commands.CreateEntry; using ModernKeePass.Application.Group.Commands.CreateEntry;
@@ -8,15 +10,13 @@ using ModernKeePass.Application.Group.Commands.CreateGroup;
using ModernKeePass.Application.Group.Models; using ModernKeePass.Application.Group.Models;
using ModernKeePass.Application.Group.Queries.GetGroup; using ModernKeePass.Application.Group.Queries.GetGroup;
using ModernKeePass.Domain.Enums; using ModernKeePass.Domain.Enums;
using ModernKeePass.Interfaces;
using ModernKeePass.Services;
namespace ModernKeePass.ViewModels namespace ModernKeePass.ViewModels
{ {
public class NewVm : OpenVm public class NewVm : OpenVm
{ {
private readonly IMediator _mediator; private readonly IMediator _mediator;
private readonly ISettingsService _settings; private readonly ISettingsProxy _settings;
private string _importFormatHelp; private string _importFormatHelp;
public string Password { get; set; } public string Password { get; set; }
@@ -26,7 +26,7 @@ namespace ModernKeePass.ViewModels
public string ImportFileExtensionFilter { get; set; } = "*"; public string ImportFileExtensionFilter { get; set; } = "*";
public IFormat ImportFormat { get; set; } public IImportFormat ImportFormat { get; set; }
public string ImportFormatHelp public string ImportFormatHelp
{ {
@@ -38,9 +38,9 @@ namespace ModernKeePass.ViewModels
} }
} }
public NewVm(): this(App.Mediator, new SettingsService()) { } public NewVm(): this(App.Services.GetService<IMediator>(), App.Services.GetService<ISettingsProxy>()) { }
public NewVm(IMediator mediator, ISettingsService settings) public NewVm(IMediator mediator, ISettingsProxy settings)
{ {
_mediator = mediator; _mediator = mediator;
_settings = settings; _settings = settings;

View File

@@ -1,38 +1,38 @@
using Windows.Storage; using System.Threading.Tasks;
using ModernKeePass.Common; using Microsoft.Extensions.DependencyInjection;
using ModernKeePass.Interfaces; using ModernKeePass.Application.Common.Interfaces;
using ModernKeePass.Services; using ModernKeePass.Domain.AOP;
using ModernKeePass.Domain.Dtos;
namespace ModernKeePass.ViewModels namespace ModernKeePass.ViewModels
{ {
public class OpenVm: NotifyPropertyChangedBase public class OpenVm: NotifyPropertyChangedBase
{ {
private readonly IRecentService _recent; private readonly IRecentProxy _recent;
public bool IsFileSelected => DatabaseFile != null; public bool IsFileSelected => !string.IsNullOrEmpty(Path);
public string Name => DatabaseFile?.DisplayName; public string Name { get; private set; }
public string Path { get; private set; }
public StorageFile DatabaseFile { get; private set; } public OpenVm(): this(App.Services.GetService<IRecentProxy>()) { }
public OpenVm(): this(new RecentService()) { } public OpenVm(IRecentProxy recent)
public OpenVm(IRecentService recent)
{ {
_recent = recent; _recent = recent;
} }
public void OpenFile(StorageFile file) public async Task OpenFile(FileInfo file)
{ {
DatabaseFile = file; Name = file.Name;
OnPropertyChanged("Name"); Path = file.Path;
OnPropertyChanged("IsFileSelected"); OnPropertyChanged(nameof(Name));
OnPropertyChanged("DatabaseFile"); OnPropertyChanged(nameof(IsFileSelected));
AddToRecentList(file); await AddToRecentList(file);
} }
private void AddToRecentList(StorageFile file) private async Task AddToRecentList(FileInfo file)
{ {
_recent.Add(file, file.DisplayName); await _recent.Add(file);
} }
} }
} }

View File

@@ -1,19 +1,21 @@
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq;
using System.Windows.Input; using System.Windows.Input;
using Microsoft.Extensions.DependencyInjection;
using ModernKeePass.Application.Common.Interfaces;
using ModernKeePass.Common; using ModernKeePass.Common;
using ModernKeePass.Domain.AOP;
using ModernKeePass.Domain.Interfaces; using ModernKeePass.Domain.Interfaces;
using ModernKeePass.Interfaces;
using ModernKeePass.Services;
namespace ModernKeePass.ViewModels namespace ModernKeePass.ViewModels
{ {
public class RecentVm : NotifyPropertyChangedBase, IHasSelectableObject public class RecentVm : NotifyPropertyChangedBase, IHasSelectableObject
{ {
private readonly IRecentService _recent; private readonly IRecentProxy _recent;
private ISelectableModel _selectedItem; private ISelectableModel _selectedItem;
private ObservableCollection<IRecentItem> _recentItems = new ObservableCollection<IRecentItem>(); private ObservableCollection<RecentItemVm> _recentItems;
public ObservableCollection<IRecentItem> RecentItems public ObservableCollection<RecentItemVm> RecentItems
{ {
get { return _recentItems; } get { return _recentItems; }
set { SetProperty(ref _recentItems, value); } set { SetProperty(ref _recentItems, value); }
@@ -39,15 +41,16 @@ namespace ModernKeePass.ViewModels
public ICommand ClearAllCommand { get; } public ICommand ClearAllCommand { get; }
public RecentVm() : this (RecentService.Instance) public RecentVm() : this (App.Services.GetService<IRecentProxy>())
{ } { }
public RecentVm(IRecentService recent) public RecentVm(IRecentProxy recent)
{ {
_recent = recent; _recent = recent;
ClearAllCommand = new RelayCommand(ClearAll); ClearAllCommand = new RelayCommand(ClearAll);
RecentItems = _recent.GetAllFiles(); RecentItems = new ObservableCollection<RecentItemVm>(_recent.GetAll().GetAwaiter().GetResult()
.Select(r => new RecentItemVm(r)));
if (RecentItems.Count > 0) if (RecentItems.Count > 0)
SelectedItem = RecentItems[0] as RecentItemVm; SelectedItem = RecentItems[0] as RecentItemVm;
} }

View File

@@ -2,6 +2,7 @@
using Windows.Storage; using Windows.Storage;
using Windows.Storage.AccessCache; using Windows.Storage.AccessCache;
using MediatR; using MediatR;
using Microsoft.Extensions.DependencyInjection;
using ModernKeePass.Application.Database.Commands.CloseDatabase; using ModernKeePass.Application.Database.Commands.CloseDatabase;
using ModernKeePass.Application.Database.Commands.SaveDatabase; using ModernKeePass.Application.Database.Commands.SaveDatabase;
@@ -10,7 +11,7 @@ namespace ModernKeePass.ViewModels
public class SaveVm public class SaveVm
{ {
private readonly IMediator _mediator; private readonly IMediator _mediator;
public SaveVm() : this(App.Mediator) { } public SaveVm() : this(App.Services.GetService<IMediator>()) { }
public SaveVm(IMediator mediator) public SaveVm(IMediator mediator)
{ {

View File

@@ -2,12 +2,12 @@
using System.Linq; using System.Linq;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using MediatR; using MediatR;
using Microsoft.Extensions.DependencyInjection;
using ModernKeePass.Application.Database.Queries.GetDatabase; using ModernKeePass.Application.Database.Queries.GetDatabase;
using ModernKeePass.Common; using ModernKeePass.Common;
using ModernKeePass.Domain.AOP;
using ModernKeePass.Domain.Interfaces; using ModernKeePass.Domain.Interfaces;
using ModernKeePass.Interfaces;
using ModernKeePass.Views; using ModernKeePass.Views;
using ModernKeePass.Services;
namespace ModernKeePass.ViewModels namespace ModernKeePass.ViewModels
{ {
@@ -43,10 +43,11 @@ namespace ModernKeePass.ViewModels
} }
} }
public SettingsVm() : this(App.Mediator, new ResourcesService()) { } public SettingsVm() : this(App.Services.GetService<IMediator>()) { }
public SettingsVm(IMediator mediator, IResourceService resource) public SettingsVm(IMediator mediator)
{ {
var resource = new ResourceHelper();
var database = mediator.Send(new GetDatabaseQuery()).GetAwaiter().GetResult(); var database = mediator.Send(new GetDatabaseQuery()).GetAwaiter().GetResult();
var menuItems = new ObservableCollection<ListMenuItemVm> var menuItems = new ObservableCollection<ListMenuItemVm>
{ {

View File

@@ -5,7 +5,6 @@ using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Navigation; using Windows.UI.Xaml.Navigation;
using ModernKeePass.Common; using ModernKeePass.Common;
using ModernKeePass.Domain.Interfaces; using ModernKeePass.Domain.Interfaces;
using ModernKeePass.Interfaces;
namespace ModernKeePass.Views.BasePages namespace ModernKeePass.Views.BasePages
{ {

View File

@@ -1,6 +1,6 @@
using Windows.Storage; using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation; using Windows.UI.Xaml.Navigation;
using ModernKeePass.Domain.Dtos;
using ModernKeePass.ViewModels; using ModernKeePass.ViewModels;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
@@ -33,7 +33,7 @@ namespace ModernKeePass.Views
protected override void OnNavigatedTo(NavigationEventArgs e) protected override void OnNavigatedTo(NavigationEventArgs e)
{ {
base.OnNavigatedTo(e); base.OnNavigatedTo(e);
var file = e.Parameter as StorageFile; var file = e.Parameter as FileInfo;
DataContext = new MainVm(Frame, MenuFrame, file); DataContext = new MainVm(Frame, MenuFrame, file);
} }
} }

View File

@@ -21,7 +21,7 @@
<Border HorizontalAlignment="Left" BorderThickness="1" BorderBrush="AliceBlue" Width="550" Visibility="{Binding IsFileSelected, Converter={StaticResource BooleanToVisibilityConverter}}"> <Border HorizontalAlignment="Left" BorderThickness="1" BorderBrush="AliceBlue" Width="550" Visibility="{Binding IsFileSelected, Converter={StaticResource BooleanToVisibilityConverter}}">
<StackPanel Margin="25,0,25,0"> <StackPanel Margin="25,0,25,0">
<TextBlock Text="{Binding Name}" /> <TextBlock Text="{Binding Name}" />
<userControls:CompositeKeyUserControl x:Uid="CompositeKeyNewButton" CreateNew="True" DatabaseFile="{Binding DatabaseFile}" ValidationChecked="CompositeKeyUserControl_OnValidationChecked" /> <userControls:CompositeKeyUserControl x:Uid="CompositeKeyNewButton" CreateNew="True" DatabaseFilePath="{Binding Path}" ValidationChecked="CompositeKeyUserControl_OnValidationChecked" />
</StackPanel> </StackPanel>
</Border> </Border>
<CheckBox x:Name="CheckBox" x:Uid="NewImportCheckbox" Margin="15,10,0,0" IsChecked="{Binding IsImportChecked, Mode=TwoWay}" Visibility="{Binding IsFileSelected, Converter={StaticResource BooleanToVisibilityConverter}}" /> <CheckBox x:Name="CheckBox" x:Uid="NewImportCheckbox" Margin="15,10,0,0" IsChecked="{Binding IsImportChecked, Mode=TwoWay}" Visibility="{Binding IsFileSelected, Converter={StaticResource BooleanToVisibilityConverter}}" />

View File

@@ -1,12 +1,14 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Windows.Storage.AccessCache;
using Windows.Storage.Pickers; using Windows.Storage.Pickers;
using Windows.UI.Xaml; using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation; using Windows.UI.Xaml.Navigation;
using ModernKeePass.Common;
using ModernKeePass.Domain.Dtos;
using ModernKeePass.Events; using ModernKeePass.Events;
using ModernKeePass.ImportFormats; using ModernKeePass.Infrastructure.File;
using ModernKeePass.Services;
using ModernKeePass.ViewModels; using ModernKeePass.ViewModels;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
@@ -44,22 +46,26 @@ namespace ModernKeePass.Views
var file = await savePicker.PickSaveFileAsync(); var file = await savePicker.PickSaveFileAsync();
if (file == null) return; if (file == null) return;
Model.OpenFile(file);
var token = StorageApplicationPermissions.FutureAccessList.Add(file);
var fileInfo = new FileInfo
{
Path = token,
Name = file.DisplayName
};
await Model.OpenFile(fileInfo);
} }
private void ImportFormatComboBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e) private void ImportFormatComboBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{ {
var resources = new ResourcesService(); var resource = new ResourceHelper();
var comboBox = sender as ComboBox; var comboBox = sender as ComboBox;
switch (comboBox?.SelectedIndex) switch (comboBox?.SelectedIndex)
{ {
case 0: case 0:
Model.ImportFormat = new CsvImportFormat(); Model.ImportFormat = new CsvImportFormat();
Model.ImportFileExtensionFilter = ".csv"; Model.ImportFileExtensionFilter = ".csv";
Model.ImportFormatHelp = resources.GetResourceValue("NewImportFormatHelpCSV"); Model.ImportFormatHelp = resource.GetResourceValue("NewImportFormatHelpCSV");
break;
default:
Model.ImportFormat = new NullImportFormat();
break; break;
} }
} }

View File

@@ -5,7 +5,8 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewModels="using:ModernKeePass.ViewModels" xmlns:viewModels="using:ModernKeePass.ViewModels"
xmlns:converters="using:ModernKeePass.Converters" xmlns:converters="using:ModernKeePass.Converters"
xmlns:interactivity="using:Microsoft.Xaml.Interactivity" xmlns:Core="using:Microsoft.Xaml.Interactions.Core" xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
xmlns:userControls="using:ModernKeePass.Views.UserControls" xmlns:userControls="using:ModernKeePass.Views.UserControls"
x:Class="ModernKeePass.Views.OpenDatabasePage" x:Class="ModernKeePass.Views.OpenDatabasePage"
mc:Ignorable="d"> mc:Ignorable="d">
@@ -24,11 +25,11 @@
<Border HorizontalAlignment="Left" BorderThickness="1" BorderBrush="AliceBlue" Width="550" Visibility="{Binding IsFileSelected, Converter={StaticResource BooleanToVisibilityConverter}}"> <Border HorizontalAlignment="Left" BorderThickness="1" BorderBrush="AliceBlue" Width="550" Visibility="{Binding IsFileSelected, Converter={StaticResource BooleanToVisibilityConverter}}">
<StackPanel Margin="25,0,25,0"> <StackPanel Margin="25,0,25,0">
<TextBlock Text="{Binding Name}" /> <TextBlock Text="{Binding Name}" />
<userControls:CompositeKeyUserControl x:Uid="CompositeKeyOpenButton" DatabaseFile="{Binding DatabaseFile}"> <userControls:CompositeKeyUserControl x:Uid="CompositeKeyOpenButton" DatabaseFilePath="{Binding Path}">
<interactivity:Interaction.Behaviors> <interactivity:Interaction.Behaviors>
<Core:EventTriggerBehavior EventName="ValidationChecked"> <core:EventTriggerBehavior EventName="ValidationChecked">
<Core:NavigateToPageAction TargetPage="ModernKeePass.Views.GroupDetailPage" /> <core:NavigateToPageAction TargetPage="ModernKeePass.Views.GroupDetailPage" />
</Core:EventTriggerBehavior> </core:EventTriggerBehavior>
</interactivity:Interaction.Behaviors> </interactivity:Interaction.Behaviors>
</userControls:CompositeKeyUserControl> </userControls:CompositeKeyUserControl>
</StackPanel> </StackPanel>

View File

@@ -1,8 +1,9 @@
using System; using System;
using Windows.Storage; using Windows.Storage.AccessCache;
using Windows.Storage.Pickers; using Windows.Storage.Pickers;
using Windows.UI.Xaml; using Windows.UI.Xaml;
using Windows.UI.Xaml.Navigation; using Windows.UI.Xaml.Navigation;
using ModernKeePass.Domain.Dtos;
using ModernKeePass.ViewModels; using ModernKeePass.ViewModels;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 // The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
@@ -21,13 +22,13 @@ namespace ModernKeePass.Views
InitializeComponent(); InitializeComponent();
} }
protected override void OnNavigatedTo(NavigationEventArgs e) protected override async void OnNavigatedTo(NavigationEventArgs e)
{ {
base.OnNavigatedTo(e); base.OnNavigatedTo(e);
var file = e.Parameter as StorageFile; var file = e.Parameter as FileInfo;
if (file != null) if (file != null)
{ {
Model.OpenFile(file); await Model.OpenFile(file);
} }
} }
@@ -43,7 +44,15 @@ namespace ModernKeePass.Views
// Application now has read/write access to the picked file // Application now has read/write access to the picked file
var file = await picker.PickSingleFileAsync(); var file = await picker.PickSingleFileAsync();
if (file == null) return; if (file == null) return;
Model.OpenFile(file);
var token = StorageApplicationPermissions.FutureAccessList.Add(file);
var fileInfo = new FileInfo
{
Path = token,
Name = file.DisplayName
};
await Model.OpenFile(fileInfo);
} }
} }
} }

View File

@@ -45,7 +45,7 @@
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Text="{Binding Name}" Padding="5,0,0,0" /> <TextBlock Grid.Row="0" Text="{Binding Name}" Padding="5,0,0,0" />
<TextBlock Grid.Row="1" Text="{Binding Path}" Padding="5,0,0,0" FontSize="10" /> <TextBlock Grid.Row="1" Text="{Binding Path}" Padding="5,0,0,0" FontSize="10" />
<userControls:CompositeKeyUserControl Grid.Row="2" x:Name="DatabaseUserControl" x:Uid="CompositeKeyOpenButton" HorizontalAlignment="Stretch" MinWidth="400" Margin="0,10,0,0" Visibility="{Binding IsSelected, Converter={StaticResource BooleanToVisibilityConverter}}" DatabaseFile="{Binding DatabaseFile}"> <userControls:CompositeKeyUserControl Grid.Row="2" x:Name="DatabaseUserControl" x:Uid="CompositeKeyOpenButton" HorizontalAlignment="Stretch" MinWidth="400" Margin="0,10,0,0" Visibility="{Binding IsSelected, Converter={StaticResource BooleanToVisibilityConverter}}" DatabaseFilePath="{Binding Path}">
<interactivity:Interaction.Behaviors> <interactivity:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="ValidationChecked"> <core:EventTriggerBehavior EventName="ValidationChecked">
<core:CallMethodAction TargetObject="{Binding}" MethodName="UpdateAccessTime" /> <core:CallMethodAction TargetObject="{Binding}" MethodName="UpdateAccessTime" />

View File

@@ -11,7 +11,7 @@
mc:Ignorable="d" > mc:Ignorable="d" >
<UserControl.Resources> <UserControl.Resources>
<converters:ProgressBarLegalValuesConverter x:Key="ProgressBarLegalValuesConverter"/> <converters:ProgressBarLegalValuesConverter x:Key="ProgressBarLegalValuesConverter"/>
<converters:DoubleToSolidColorBrushConverter x:Key="DoubleToForegroungBrushConverter"/> <converters:DoubleToSolidColorBrushConverter x:Key="DoubleToForegroundBrushConverter"/>
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> <converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
<converters:DiscreteIntToSolidColorBrushConverter x:Key="DiscreteIntToSolidColorBrushConverter"/> <converters:DiscreteIntToSolidColorBrushConverter x:Key="DiscreteIntToSolidColorBrushConverter"/>
<converters:EmptyStringToVisibilityConverter x:Key="EmptyStringToVisibilityConverter"/> <converters:EmptyStringToVisibilityConverter x:Key="EmptyStringToVisibilityConverter"/>
@@ -42,7 +42,7 @@
<ProgressBar Grid.Row="0" Grid.Column="1" <ProgressBar Grid.Row="0" Grid.Column="1"
Maximum="128" VerticalAlignment="Bottom" Maximum="128" VerticalAlignment="Bottom"
Value="{Binding PasswordComplexityIndicator, ConverterParameter=0\,128, Converter={StaticResource ProgressBarLegalValuesConverter}}" Value="{Binding PasswordComplexityIndicator, ConverterParameter=0\,128, Converter={StaticResource ProgressBarLegalValuesConverter}}"
Foreground="{Binding PasswordComplexityIndicator, ConverterParameter=128, Converter={StaticResource DoubleToForegroungBrushConverter}}" Foreground="{Binding PasswordComplexityIndicator, ConverterParameter=128, Converter={StaticResource DoubleToForegroundBrushConverter}}"
Visibility="{Binding ShowComplexityIndicator, ElementName=UserControl, Converter={StaticResource BooleanToVisibilityConverter}}" /> Visibility="{Binding ShowComplexityIndicator, ElementName=UserControl, Converter={StaticResource BooleanToVisibilityConverter}}" />
<CheckBox Grid.Row="1" Grid.Column="0" IsChecked="{Binding HasKeyFile, Mode=TwoWay}" /> <CheckBox Grid.Row="1" Grid.Column="0" IsChecked="{Binding HasKeyFile, Mode=TwoWay}" />
<HyperlinkButton Grid.Row="1" Grid.Column="1" Margin="-15,0,0,0" Content="{Binding KeyFileText}" IsEnabled="{Binding HasKeyFile}" Click="KeyFileButton_Click" Style="{StaticResource MainColorHyperlinkButton}" /> <HyperlinkButton Grid.Row="1" Grid.Column="1" Margin="-15,0,0,0" Content="{Binding KeyFileText}" IsEnabled="{Binding HasKeyFile}" Click="KeyFileButton_Click" Style="{StaticResource MainColorHyperlinkButton}" />

View File

@@ -1,20 +1,20 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Windows.Storage; using Windows.Storage.AccessCache;
using Windows.Storage.Pickers; using Windows.Storage.Pickers;
using Windows.System; using Windows.System;
using Windows.UI.Xaml; using Windows.UI.Xaml;
using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Input;
using MediatR; using MediatR;
using Microsoft.Extensions.DependencyInjection;
using ModernKeePass.Application.Database.Commands.CloseDatabase; using ModernKeePass.Application.Database.Commands.CloseDatabase;
using ModernKeePass.Application.Database.Commands.SaveDatabase; using ModernKeePass.Application.Database.Commands.SaveDatabase;
using ModernKeePass.Application.Database.Queries.GetDatabase; using ModernKeePass.Application.Database.Queries.GetDatabase;
using ModernKeePass.Common; using ModernKeePass.Common;
using ModernKeePass.Domain.Dtos;
using ModernKeePass.Events; using ModernKeePass.Events;
using ModernKeePass.Extensions; using ModernKeePass.Extensions;
using ModernKeePass.Interfaces;
using ModernKeePass.Services;
using ModernKeePass.ViewModels; using ModernKeePass.ViewModels;
// Pour en savoir plus sur le modèle d'élément Contrôle utilisateur, consultez la page http://go.microsoft.com/fwlink/?LinkId=234236 // Pour en savoir plus sur le modèle d'élément Contrôle utilisateur, consultez la page http://go.microsoft.com/fwlink/?LinkId=234236
@@ -24,6 +24,7 @@ namespace ModernKeePass.Views.UserControls
public sealed partial class CompositeKeyUserControl public sealed partial class CompositeKeyUserControl
{ {
private readonly IMediator _mediator; private readonly IMediator _mediator;
private readonly ResourceHelper _resource;
public CompositeKeyVm Model => Grid.DataContext as CompositeKeyVm; public CompositeKeyVm Model => Grid.DataContext as CompositeKeyVm;
public bool CreateNew public bool CreateNew
@@ -62,26 +63,27 @@ namespace ModernKeePass.Views.UserControls
typeof(CompositeKeyUserControl), typeof(CompositeKeyUserControl),
new PropertyMetadata("OK", (o, args) => { })); new PropertyMetadata("OK", (o, args) => { }));
public StorageFile DatabaseFile public string DatabaseFilePath
{ {
get { return (StorageFile)GetValue(DatabaseFileProperty); } get { return (string)GetValue(DatabaseFilePathProperty); }
set { SetValue(DatabaseFileProperty, value); } set { SetValue(DatabaseFilePathProperty, value); }
} }
public static readonly DependencyProperty DatabaseFileProperty = public static readonly DependencyProperty DatabaseFilePathProperty =
DependencyProperty.Register( DependencyProperty.Register(
"DatabaseFile", "DatabaseFilePath",
typeof(StorageFile), typeof(string),
typeof(CompositeKeyUserControl), typeof(CompositeKeyUserControl),
new PropertyMetadata(null, (o, args) => { })); new PropertyMetadata(null, (o, args) => { }));
public bool ShowComplexityIndicator => CreateNew || UpdateKey; public bool ShowComplexityIndicator => CreateNew || UpdateKey;
public CompositeKeyUserControl(): this(App.Mediator) public CompositeKeyUserControl(): this(App.Services.GetService<IMediator>())
{ } { }
public CompositeKeyUserControl(IMediator mediator) public CompositeKeyUserControl(IMediator mediator)
{ {
_mediator = mediator; _mediator = mediator;
_resource = new ResourceHelper();
InitializeComponent(); InitializeComponent();
} }
@@ -100,31 +102,30 @@ namespace ModernKeePass.Views.UserControls
else else
{ {
var database = await _mediator.Send(new GetDatabaseQuery()); var database = await _mediator.Send(new GetDatabaseQuery());
var resource = new ResourcesService();
if (database.IsOpen) if (database.IsOpen)
{ {
await MessageDialogHelper.ShowActionDialog(resource.GetResourceValue("MessageDialogDBOpenTitle"), await MessageDialogHelper.ShowActionDialog(_resource.GetResourceValue("MessageDialogDBOpenTitle"),
string.Format(resource.GetResourceValue("MessageDialogDBOpenDesc"), database.Name), string.Format(_resource.GetResourceValue("MessageDialogDBOpenDesc"), database.Name),
resource.GetResourceValue("MessageDialogDBOpenButtonSave"), _resource.GetResourceValue("MessageDialogDBOpenButtonSave"),
resource.GetResourceValue("MessageDialogDBOpenButtonDiscard"), _resource.GetResourceValue("MessageDialogDBOpenButtonDiscard"),
async command => async command =>
{ {
await _mediator.Send(new SaveDatabaseCommand()); await _mediator.Send(new SaveDatabaseCommand());
ToastNotificationHelper.ShowGenericToast( ToastNotificationHelper.ShowGenericToast(
database.Name, database.Name,
resource.GetResourceValue("ToastSavedMessage")); _resource.GetResourceValue("ToastSavedMessage"));
await _mediator.Send(new CloseDatabaseCommand()); await _mediator.Send(new CloseDatabaseCommand());
await OpenDatabase(resource); await OpenDatabase();
}, },
async command => async command =>
{ {
await _mediator.Send(new CloseDatabaseCommand()); await _mediator.Send(new CloseDatabaseCommand());
await OpenDatabase(resource); await OpenDatabase();
}); });
} }
else else
{ {
await OpenDatabase(resource); await OpenDatabase();
} }
} }
} }
@@ -151,7 +152,9 @@ namespace ModernKeePass.Views.UserControls
// Application now has read/write access to the picked file // Application now has read/write access to the picked file
var file = await picker.PickSingleFileAsync(); var file = await picker.PickSingleFileAsync();
if (file == null) return; if (file == null) return;
Model.KeyFile = file;
var token = StorageApplicationPermissions.FutureAccessList.Add(file);
Model.KeyFilePath = token;
} }
private async void CreateKeyFileButton_Click(object sender, RoutedEventArgs e) private async void CreateKeyFileButton_Click(object sender, RoutedEventArgs e)
@@ -166,14 +169,19 @@ namespace ModernKeePass.Views.UserControls
var file = await savePicker.PickSaveFileAsync(); var file = await savePicker.PickSaveFileAsync();
if (file == null) return; if (file == null) return;
await Model.CreateKeyFile(file); var token = StorageApplicationPermissions.FutureAccessList.Add(file);
await Model.CreateKeyFile(new FileInfo
{
Path = token,
Name = file.DisplayName
});
} }
private async Task OpenDatabase(IResourceService resource) private async Task OpenDatabase()
{ {
var oldLabel = ButtonLabel; var oldLabel = ButtonLabel;
ButtonLabel = resource.GetResourceValue("CompositeKeyOpening"); ButtonLabel = _resource.GetResourceValue("CompositeKeyOpening");
if (await Dispatcher.RunTaskAsync(async () => await Model.OpenDatabase(DatabaseFile, CreateNew))) if (await Dispatcher.RunTaskAsync(async () => await Model.OpenDatabase(DatabaseFilePath, CreateNew)))
{ {
ValidationChecked?.Invoke(this, new PasswordEventArgs(Model.RootGroupId)); ValidationChecked?.Invoke(this, new PasswordEventArgs(Model.RootGroupId));
} }

View File

@@ -117,32 +117,19 @@
<Compile Include="App.xaml.cs"> <Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon> <DependentUpon>App.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="Common\ResourceHelper.cs" />
<Compile Include="Converters\IconToSymbolConverter.cs" /> <Compile Include="Converters\IconToSymbolConverter.cs" />
<Compile Include="DependencyInjection.cs" /> <Compile Include="DependencyInjection.cs" />
<Compile Include="ImportFormats\CsvImportFormat.cs" />
<Compile Include="ImportFormats\NullImportFormat.cs" />
<Compile Include="Interfaces\IFormat.cs" />
<Compile Include="Interfaces\IProxyInvocationHandler.cs" />
<Compile Include="Interfaces\IRecentService.cs" />
<Compile Include="Interfaces\IRecentItem.cs" />
<Compile Include="Interfaces\IResourceService.cs" />
<Compile Include="Services\SingletonServiceBase.cs" />
<Compile Include="TemplateSelectors\SelectableDataTemplateSelector.cs" /> <Compile Include="TemplateSelectors\SelectableDataTemplateSelector.cs" />
<Compile Include="ViewModels\Items\SettingsSaveVm.cs" /> <Compile Include="ViewModels\Items\SettingsSaveVm.cs" />
<Compile Include="Views\MainPageFrames\DonatePage.xaml.cs"> <Compile Include="Views\MainPageFrames\DonatePage.xaml.cs">
<DependentUpon>DonatePage.xaml</DependentUpon> <DependentUpon>DonatePage.xaml</DependentUpon>
</Compile> </Compile>
<Content Include="Services\DatabaseService.cs" />
<Compile Include="Interfaces\ISettingsService.cs" />
<Compile Include="Common\MessageDialogHelper.cs" /> <Compile Include="Common\MessageDialogHelper.cs" />
<Compile Include="Common\NavigationHelper.cs" /> <Compile Include="Common\NavigationHelper.cs" />
<Compile Include="Common\NotifyPropertyChangedBase.cs" />
<Compile Include="Common\ObservableDictionary.cs" /> <Compile Include="Common\ObservableDictionary.cs" />
<Compile Include="Common\RelayCommand.cs" /> <Compile Include="Common\RelayCommand.cs" />
<Compile Include="Common\SuspensionManager.cs" /> <Compile Include="Common\SuspensionManager.cs" />
<Compile Include="Services\RecentService.cs" />
<Compile Include="Services\ResourcesService.cs" />
<Compile Include="Services\SettingsService.cs" />
<Compile Include="Common\ToastNotificationHelper.cs" /> <Compile Include="Common\ToastNotificationHelper.cs" />
<Compile Include="Converters\DiscreteIntToSolidColorBrushConverter.cs" /> <Compile Include="Converters\DiscreteIntToSolidColorBrushConverter.cs" />
<Compile Include="Converters\EmptyStringToVisibilityConverter.cs" /> <Compile Include="Converters\EmptyStringToVisibilityConverter.cs" />

37
ModernKeePass10/.gitignore vendored Normal file
View File

@@ -0,0 +1,37 @@
################################################################################
# This .gitignore file was automatically created by Microsoft(R) Visual Studio.
################################################################################
#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.obj
*.exe
*.pdb
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.lib
*.sbr
obj/
[Rr]elease*/
_ReSharper*/
[Tt]est[Rr]esult*
Translation/TrlUtil.vshost.exe.manifest
*.nupkg
.vs/
/UpgradeLog.htm
ModernKeePass_StoreKey.pfx

View File

@@ -0,0 +1 @@
C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\out\0

View File

@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<AnalysisConfig xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.sonarsource.com/msbuild/integration/2015/1">
<SonarConfigDir>C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\conf</SonarConfigDir>
<SonarOutputDir>C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\out</SonarOutputDir>
<SonarBinDir>C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\bin</SonarBinDir>
<SonarScannerWorkingDirectory>C:\Sources\Other\ModernKeePass\ModernKeePass</SonarScannerWorkingDirectory>
<HasBeginStepCommandLineCredentials>true</HasBeginStepCommandLineCredentials>
<SonarQubeHostUrl>https://sonarcloud.io</SonarQubeHostUrl>
<SonarQubeVersion>7.2.0.12953</SonarQubeVersion>
<SonarProjectKey>ModernKeePass</SonarProjectKey>
<AdditionalConfig>
<ConfigSetting Id="BuildUri" />
<ConfigSetting Id="TfsUri" />
<ConfigSetting Id="settings.file.path" Value="c:\sonar\SonarQube.Analysis.xml" />
</AdditionalConfig>
<ServerSettings>
<Property Name="sonaranalyzer-cs.nuget.packageVersion">7.1.0.5212</Property>
<Property Name="sonar.editions.jsonUrl">https://update.sonarsource.org/editions.json</Property>
<Property Name="sonar.cs.ignoreHeaderComments">true</Property>
<Property Name="sonar.cfamily.useSema">true</Property>
<Property Name="sonar.c.file.suffixes">.c,.h</Property>
<Property Name="sonar.typescript.file.suffixes">.ts,.tsx</Property>
<Property Name="email.fromName">SonarQube</Property>
<Property Name="sonar.python.xunit.skipDetails">false</Property>
<Property Name="sonar.auth.bitbucket.loginStrategy">Unique</Property>
<Property Name="sonar.plsql.jdbc.driver.class">oracle.jdbc.OracleDriver</Property>
<Property Name="sonar.go.exclusions">**/vendor/**</Property>
<Property Name="sonar.forceAuthentication">false</Property>
<Property Name="sonar.notifications.delay">60</Property>
<Property Name="sonar.cpp.file.suffixes">.cc,.cpp,.cxx,.c++,.hh,.hpp,.hxx,.h++,.ipp</Property>
<Property Name="sonaranalyzer-cs.ruleNamespace">SonarAnalyzer.CSharp</Property>
<Property Name="sonar.web.file.suffixes">.html,.xhtml,.rhtml,.shtml</Property>
<Property Name="sonar.builtInQualityProfiles.disableNotificationOnUpdate">false</Property>
<Property Name="sonar.java.failOnException">false</Property>
<Property Name="sonar.organizations.createPersonalOrg">true</Property>
<Property Name="sonar.cpd.abap.minimumTokens">100</Property>
<Property Name="sonar.jacoco.reportPaths">target/jacoco.exec, target/jacoco-it.exec</Property>
<Property Name="sonar.cpd.cross_project">false</Property>
<Property Name="sonar.vbnet.ignoreHeaderComments">true</Property>
<Property Name="sonar.leak.period">30</Property>
<Property Name="sonar.auth.github.groupsSync">false</Property>
<Property Name="sonar.dbcleaner.daysBeforeDeletingInactiveShortLivingBranches">30</Property>
<Property Name="sonar.auth.github.loginStrategy">Unique</Property>
<Property Name="sonar.auth.microsoft.enabled">true</Property>
<Property Name="sonaranalyzer-vbnet.ruleNamespace">SonarAnalyzer.VisualBasic</Property>
<Property Name="sonar.auth.microsoft.allowsUsersToSignUp">true</Property>
<Property Name="sonar.javascript.ignoreHeaderComments">true</Property>
<Property Name="sonar.dbcleaner.daysBeforeDeletingClosedIssues">730</Property>
<Property Name="sonar.dbcleaner.weeksBeforeKeepingOnlyOneSnapshotByMonth">4</Property>
<Property Name="sonar.lf.gravatarServerUrl">https://secure.gravatar.com/avatar/{EMAIL_MD5}.jpg?s={SIZE}&amp;d=identicon</Property>
<Property Name="sonar.notifications.runningDelayBeforeReportingStatus">600</Property>
<Property Name="sonar.javascript.environments">amd, applescript, atomtest, browser, commonjs, couch, embertest, flow, greasemonkey, jasmine, jest, jquery, meteor, mocha, mongo, nashorn, node, phantomjs, prototypejs, protractor, qunit, rhino, serviceworker, shared-node-browser, shelljs, webextensions, worker, wsh, yui</Property>
<Property Name="sonar.scm.disabled">false</Property>
<Property Name="sonar.typescript.exclusions">**/node_modules/**,**/bower_components/**</Property>
<Property Name="sonar.vbnet.file.suffixes">.vb</Property>
<Property Name="sonar.abap.file.suffixes">.abap,.ab4,.flow,.asprog</Property>
<Property Name="sonar.cfamily.ignoreHeaderComments">true</Property>
<Property Name="sonar.technicalDebt.developmentCost">30</Property>
<Property Name="sonar.python.file.suffixes">py</Property>
<Property Name="sonar.cs.file.suffixes">.cs</Property>
<Property Name="sonar.plsql.file.suffixes">sql,tab,pkb</Property>
<Property Name="sonaranalyzer-vbnet.staticResourceName">SonarAnalyzer-7.1.0.5212.zip</Property>
<Property Name="sonar.java.file.suffixes">.java,.jav</Property>
<Property Name="sonar.php.file.suffixes">php,php3,php4,php5,phtml,inc</Property>
<Property Name="sonar.xml.file.suffixes">.xml,.xsd,.xsl</Property>
<Property Name="sonar.dbcleaner.weeksBeforeDeletingAllSnapshots">480</Property>
<Property Name="sonar.auth.bitbucket.allowUsersToSignUp">true</Property>
<Property Name="sonar.auth.github.enabled">true</Property>
<Property Name="sonar.javascript.jQueryObjectAliases">$, jQuery</Property>
<Property Name="sonaranalyzer-vbnet.nuget.packageVersion">7.1.0.5212</Property>
<Property Name="sonar.go.file.suffixes">.go</Property>
<Property Name="sonar.dbcleaner.weeksBeforeKeepingOnlyAnalysesWithVersion">104</Property>
<Property Name="sonar.swift.file.suffixes">.swift</Property>
<Property Name="sonar.github.endpoint">https://api.github.com</Property>
<Property Name="sonar.plsql.ignoreHeaderComments">false</Property>
<Property Name="sonar.flex.file.suffixes">as</Property>
<Property Name="sonar.auth.github.apiUrl">https://api.github.com/</Property>
<Property Name="sonar.auth.github.allowUsersToSignUp">true</Property>
<Property Name="sonar.python.xunit.reportPath">xunit-reports/xunit-result-*.xml</Property>
<Property Name="sonar.javascript.globals">angular,goog,google,OpenLayers,d3,dojo,dojox,dijit,Backbone,moment,casper</Property>
<Property Name="sonar.dbcleaner.hoursBeforeKeepingOnlyOneSnapshotByDay">24</Property>
<Property Name="sonar.auth.bitbucket.enabled">true</Property>
<Property Name="sonar.javascript.exclusions">**/node_modules/**,**/bower_components/**</Property>
<Property Name="sonar.auth.github.webUrl">https://github.com/</Property>
<Property Name="sonar.dbcleaner.cleanDirectory">true</Property>
<Property Name="sonar.onboardingTutorial.showToNewUsers">false</Property>
<Property Name="sonaranalyzer-vbnet.nuget.packageId">SonarAnalyzer.VisualBasic</Property>
<Property Name="email.from">noreply@sonarcloud.io</Property>
<Property Name="sonaranalyzer-vbnet.pluginVersion">7.1.0.5212</Property>
<Property Name="sonar.typescript.node">node</Property>
<Property Name="sonar.dbcleaner.weeksBeforeKeepingOnlyOneSnapshotByWeek">1</Property>
<Property Name="sonaranalyzer-vbnet.analyzerId">SonarAnalyzer.VisualBasic</Property>
<Property Name="email.prefix">[SonarCloud]</Property>
<Property Name="sonar.c.std">c11</Property>
<Property Name="sonaranalyzer-cs.pluginKey">csharp</Property>
<Property Name="sonar.cfamily.useCache">true</Property>
<Property Name="sonar.branch.longLivedBranches.regex">(branch|release)-.*</Property>
<Property Name="sonar.objc.file.suffixes">.m</Property>
<Property Name="sonar.go.coverage.reportPaths">coverage.out</Property>
<Property Name="sonaranalyzer-cs.staticResourceName">SonarAnalyzer-7.1.0.5212.zip</Property>
<Property Name="sonaranalyzer-cs.nuget.packageId">SonarAnalyzer.CSharp</Property>
<Property Name="sonar.auth.bitbucket.apiUrl">https://api.bitbucket.org/</Property>
<Property Name="sonar.authenticator.downcase">false</Property>
<Property Name="sonar.github.disableInlineComments">false</Property>
<Property Name="sonar.python.coverage.reportPath">coverage-reports/*coverage-*.xml</Property>
<Property Name="sonaranalyzer-cs.analyzerId">SonarAnalyzer.CSharp</Property>
<Property Name="sonar.organizations.anyoneCanCreate">true</Property>
<Property Name="sonar.technicalDebt.ratingGrid">0.05,0.1,0.2,0.5</Property>
<Property Name="sonar.lf.enableGravatar">true</Property>
<Property Name="sonar.preview.excludePlugins">devcockpit,pdfreport,governance,ldap,authaad,authgithub,authbitbucket,googleanalytics</Property>
<Property Name="sonaranalyzer-cs.pluginVersion">7.1.0.5212</Property>
<Property Name="sonar.javascript.file.suffixes">.js,.jsx,.vue</Property>
<Property Name="sonar.cpd.abap.minimumLines">20</Property>
<Property Name="sonaranalyzer-vbnet.pluginKey">vbnet</Property>
<Property Name="sonar.java.collectAnalysisErrors">true</Property>
<Property Name="sonar.updatecenter.url">https://update.sonarsource.org/update-center.properties</Property>
<Property Name="sonar.tsql.file.suffixes">.tsql</Property>
<Property Name="sonar.cpp.std">c++11</Property>
<Property Name="sonar.core.serverBaseURL">https://sonarcloud.io</Property>
<Property Name="sonar.lf.logoUrl">https://about.sonarcloud.io/images/SonarCloud-white-210px.png</Property>
<Property Name="sonar.lf.logoWidthPx">105</Property>
<Property Name="sonar.lf.aboutText">&lt;div class="boxed-group" style="border: none; border-radius: 3px;"&gt;
&lt;div class="boxed-group-inner clearfix" style="padding: 30px; border-radius: 3px; border: #e6e6e6 1px solid; background: #f3f3f3;"&gt;
&lt;div style="overflow: hidden; line-height: 1.5; font-size: 16px;"&gt;
&lt;p&gt;
Analyze your open source and private projects on SonarCloud.
Select your &lt;a href="https://about.sonarcloud.io"&gt;plan&lt;/a&gt; and start improving.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</Property>
<Property Name="sonar.core.id">AWHW8ct9-T_TB3XqouNu</Property>
<Property Name="sonar.core.startTime">07/06/2018 12:32:21</Property>
</ServerSettings>
<LocalSettings>
<Property Name="sonar.organization">geogeob</Property>
<Property Name="sonar.host.url">https://sonarcloud.io</Property>
</LocalSettings>
<AnalyzersSettings>
<AnalyzerSettings>
<Language>cs</Language>
<RuleSetFilePath>C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\conf\SonarQubeRoslyn-cs.ruleset</RuleSetFilePath>
<AnalyzerAssemblyPaths>
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\0\Google.Protobuf.dll</Path>
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\0\SonarAnalyzer.CSharp.dll</Path>
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\0\SonarAnalyzer.dll</Path>
</AnalyzerAssemblyPaths>
<AdditionalFilePaths>
<Path>C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\conf\cs\SonarLint.xml</Path>
</AdditionalFilePaths>
</AnalyzerSettings>
<AnalyzerSettings>
<Language>vbnet</Language>
<RuleSetFilePath>C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\conf\SonarQubeRoslyn-vbnet.ruleset</RuleSetFilePath>
<AnalyzerAssemblyPaths>
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\SonarAnalyzer.VisualBasic.nuspec</Path>
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\[Content_Types].xml</Path>
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\analyzers\Google.Protobuf.dll</Path>
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\analyzers\SonarAnalyzer.dll</Path>
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\analyzers\SonarAnalyzer.VisualBasic.dll</Path>
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\package\services\metadata\core-properties\f124441cdae948bb922ac980ea59570c.psmdcp</Path>
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\tools\install.ps1</Path>
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\tools\uninstall.ps1</Path>
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\_rels\.rels</Path>
</AnalyzerAssemblyPaths>
<AdditionalFilePaths>
<Path>C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\conf\vbnet\SonarLint.xml</Path>
</AdditionalFilePaths>
</AnalyzerSettings>
</AnalyzersSettings>
</AnalysisConfig>

View File

@@ -0,0 +1,348 @@
<?xml version="1.0" encoding="utf-8"?>
<RuleSet xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="Rules for SonarQube" Description="This rule set was automatically generated from SonarQube" ToolsVersion="14.0">
<Rules AnalyzerId="SonarAnalyzer.CSharp" RuleNamespace="SonarAnalyzer.CSharp">
<Rule Id="S2589" Action="Warning" />
<Rule Id="S3433" Action="Warning" />
<Rule Id="S4061" Action="Warning" />
<Rule Id="S1121" Action="Warning" />
<Rule Id="S1854" Action="Warning" />
<Rule Id="S4457" Action="Warning" />
<Rule Id="S4456" Action="Warning" />
<Rule Id="S2278" Action="Warning" />
<Rule Id="S4211" Action="Warning" />
<Rule Id="S3923" Action="Warning" />
<Rule Id="S4426" Action="Warning" />
<Rule Id="S2486" Action="Warning" />
<Rule Id="S4433" Action="Warning" />
<Rule Id="S2758" Action="Warning" />
<Rule Id="S1751" Action="Warning" />
<Rule Id="S1871" Action="Warning" />
<Rule Id="S4586" Action="Warning" />
<Rule Id="S4581" Action="Warning" />
<Rule Id="S2737" Action="Warning" />
<Rule Id="S3400" Action="Warning" />
<Rule Id="S3649" Action="Warning" />
<Rule Id="S1144" Action="Warning" />
<Rule Id="S1264" Action="Warning" />
<Rule Id="S2201" Action="Warning" />
<Rule Id="S1118" Action="Warning" />
<Rule Id="S1006" Action="Warning" />
<Rule Id="S4214" Action="Warning" />
<Rule Id="S4210" Action="Warning" />
<Rule Id="S3241" Action="Warning" />
<Rule Id="S4428" Action="Warning" />
<Rule Id="S1048" Action="Warning" />
<Rule Id="S2183" Action="Warning" />
<Rule Id="S3168" Action="Warning" />
<Rule Id="S4220" Action="Warning" />
<Rule Id="S3261" Action="Warning" />
<Rule Id="S4260" Action="Warning" />
<Rule Id="S4159" Action="Warning" />
<Rule Id="S4277" Action="Warning" />
<Rule Id="S2583" Action="Warning" />
<Rule Id="S3440" Action="Warning" />
<Rule Id="S3776" Action="Warning" />
<Rule Id="S2326" Action="Warning" />
<Rule Id="S1116" Action="Warning" />
<Rule Id="S3358" Action="Warning" />
<Rule Id="S4200" Action="Warning" />
<Rule Id="S1172" Action="Warning" />
<Rule Id="S1862" Action="Warning" />
<Rule Id="S2275" Action="Warning" />
<Rule Id="S3457" Action="Warning" />
<Rule Id="S3459" Action="Warning" />
<Rule Id="S3464" Action="Warning" />
<Rule Id="S3343" Action="Warning" />
<Rule Id="S818" Action="Warning" />
<Rule Id="S1656" Action="Warning" />
<Rule Id="S2184" Action="Warning" />
<Rule Id="S1764" Action="Warning" />
<Rule Id="S2971" Action="Warning" />
<Rule Id="S3060" Action="Warning" />
<Rule Id="S101" Action="Warning" />
<Rule Id="S1066" Action="Warning" />
<Rule Id="S107" Action="Warning" />
<Rule Id="S1075" Action="Warning" />
<Rule Id="S108" Action="Warning" />
<Rule Id="S110" Action="Warning" />
<Rule Id="S1104" Action="Warning" />
<Rule Id="S1110" Action="Warning" />
<Rule Id="S1117" Action="Warning" />
<Rule Id="S112" Action="Warning" />
<Rule Id="S1123" Action="Warning" />
<Rule Id="S1125" Action="Warning" />
<Rule Id="S1134" Action="Warning" />
<Rule Id="S1135" Action="Warning" />
<Rule Id="S1155" Action="Warning" />
<Rule Id="S1163" Action="Warning" />
<Rule Id="S1168" Action="Warning" />
<Rule Id="S1185" Action="Warning" />
<Rule Id="S1186" Action="Warning" />
<Rule Id="S1206" Action="Warning" />
<Rule Id="S1210" Action="Warning" />
<Rule Id="S1215" Action="Warning" />
<Rule Id="S125" Action="Warning" />
<Rule Id="S1450" Action="Warning" />
<Rule Id="S1479" Action="Warning" />
<Rule Id="S1481" Action="Warning" />
<Rule Id="S1607" Action="Warning" />
<Rule Id="S1643" Action="Warning" />
<Rule Id="S1699" Action="Warning" />
<Rule Id="S1848" Action="Warning" />
<Rule Id="S1905" Action="Warning" />
<Rule Id="S1939" Action="Warning" />
<Rule Id="S1940" Action="Warning" />
<Rule Id="S1944" Action="Warning" />
<Rule Id="S2068" Action="Warning" />
<Rule Id="S2114" Action="Warning" />
<Rule Id="S2123" Action="Warning" />
<Rule Id="S2178" Action="Warning" />
<Rule Id="S2187" Action="Warning" />
<Rule Id="S2190" Action="Warning" />
<Rule Id="S2219" Action="Warning" />
<Rule Id="S2223" Action="Warning" />
<Rule Id="S2225" Action="Warning" />
<Rule Id="S2234" Action="Warning" />
<Rule Id="S2259" Action="Warning" />
<Rule Id="S2290" Action="Warning" />
<Rule Id="S2291" Action="Warning" />
<Rule Id="S2292" Action="Warning" />
<Rule Id="S2306" Action="Warning" />
<Rule Id="S2328" Action="Warning" />
<Rule Id="S2342" Action="Warning" />
<Rule Id="S2344" Action="Warning" />
<Rule Id="S2345" Action="Warning" />
<Rule Id="S2346" Action="Warning" />
<Rule Id="S2365" Action="Warning" />
<Rule Id="S2368" Action="Warning" />
<Rule Id="S2372" Action="Warning" />
<Rule Id="S2376" Action="Warning" />
<Rule Id="S2386" Action="Warning" />
<Rule Id="S2436" Action="Warning" />
<Rule Id="S2437" Action="Warning" />
<Rule Id="S2681" Action="Warning" />
<Rule Id="S2688" Action="Warning" />
<Rule Id="S2692" Action="Warning" />
<Rule Id="S2696" Action="Warning" />
<Rule Id="S2743" Action="Warning" />
<Rule Id="S2757" Action="Warning" />
<Rule Id="S2761" Action="Warning" />
<Rule Id="S2930" Action="Warning" />
<Rule Id="S2933" Action="Warning" />
<Rule Id="S2934" Action="Warning" />
<Rule Id="S2953" Action="Warning" />
<Rule Id="S2995" Action="Warning" />
<Rule Id="S2996" Action="Warning" />
<Rule Id="S2997" Action="Warning" />
<Rule Id="S3005" Action="Warning" />
<Rule Id="S3010" Action="Warning" />
<Rule Id="S3169" Action="Warning" />
<Rule Id="S3172" Action="Warning" />
<Rule Id="S3217" Action="Warning" />
<Rule Id="S3218" Action="Warning" />
<Rule Id="S3220" Action="Warning" />
<Rule Id="S3236" Action="Warning" />
<Rule Id="S3237" Action="Warning" />
<Rule Id="S3244" Action="Warning" />
<Rule Id="S3246" Action="Warning" />
<Rule Id="S3247" Action="Warning" />
<Rule Id="S3249" Action="Warning" />
<Rule Id="S3251" Action="Warning" />
<Rule Id="S3256" Action="Warning" />
<Rule Id="S3262" Action="Warning" />
<Rule Id="S3263" Action="Warning" />
<Rule Id="S3264" Action="Warning" />
<Rule Id="S3265" Action="Warning" />
<Rule Id="S3346" Action="Warning" />
<Rule Id="S3376" Action="Warning" />
<Rule Id="S3397" Action="Warning" />
<Rule Id="S3415" Action="Warning" />
<Rule Id="S3427" Action="Warning" />
<Rule Id="S3442" Action="Warning" />
<Rule Id="S3443" Action="Warning" />
<Rule Id="S3444" Action="Warning" />
<Rule Id="S3445" Action="Warning" />
<Rule Id="S3447" Action="Warning" />
<Rule Id="S3449" Action="Warning" />
<Rule Id="S3450" Action="Warning" />
<Rule Id="S3451" Action="Warning" />
<Rule Id="S3453" Action="Warning" />
<Rule Id="S3456" Action="Warning" />
<Rule Id="S3458" Action="Warning" />
<Rule Id="S3466" Action="Warning" />
<Rule Id="S3597" Action="Warning" />
<Rule Id="S3598" Action="Warning" />
<Rule Id="S3600" Action="Warning" />
<Rule Id="S3603" Action="Warning" />
<Rule Id="S3604" Action="Warning" />
<Rule Id="S3610" Action="Warning" />
<Rule Id="S3626" Action="Warning" />
<Rule Id="S3655" Action="Warning" />
<Rule Id="S3693" Action="Warning" />
<Rule Id="S3869" Action="Warning" />
<Rule Id="S3871" Action="Warning" />
<Rule Id="S3875" Action="Warning" />
<Rule Id="S3877" Action="Warning" />
<Rule Id="S3881" Action="Warning" />
<Rule Id="S3884" Action="Warning" />
<Rule Id="S3885" Action="Warning" />
<Rule Id="S3887" Action="Warning" />
<Rule Id="S3889" Action="Warning" />
<Rule Id="S3897" Action="Warning" />
<Rule Id="S3903" Action="Warning" />
<Rule Id="S3904" Action="Warning" />
<Rule Id="S3925" Action="Warning" />
<Rule Id="S3926" Action="Warning" />
<Rule Id="S3927" Action="Warning" />
<Rule Id="S3928" Action="Warning" />
<Rule Id="S3966" Action="Warning" />
<Rule Id="S3971" Action="Warning" />
<Rule Id="S3972" Action="Warning" />
<Rule Id="S3981" Action="Warning" />
<Rule Id="S3984" Action="Warning" />
<Rule Id="S3998" Action="Warning" />
<Rule Id="S4015" Action="Warning" />
<Rule Id="S4016" Action="Warning" />
<Rule Id="S4019" Action="Warning" />
<Rule Id="S4035" Action="Warning" />
<Rule Id="S4144" Action="Warning" />
<Rule Id="S4158" Action="Warning" />
<Rule Id="S907" Action="Warning" />
<Rule Id="S927" Action="Warning" />
<Rule Id="S4524" Action="None" />
<Rule Id="S2228" Action="None" />
<Rule Id="S881" Action="None" />
<Rule Id="S4564" Action="None" />
<Rule Id="S4212" Action="None" />
<Rule Id="S2245" Action="None" />
<Rule Id="S131" Action="None" />
<Rule Id="S3330" Action="None" />
<Rule Id="S2255" Action="None" />
<Rule Id="S4432" Action="None" />
<Rule Id="S109" Action="None" />
<Rule Id="S2070" Action="None" />
<Rule Id="S4462" Action="None" />
<Rule Id="S1192" Action="None" />
<Rule Id="S2302" Action="None" />
<Rule Id="S1694" Action="None" />
<Rule Id="S4040" Action="None" />
<Rule Id="S4142" Action="None" />
<Rule Id="S2092" Action="None" />
<Rule Id="S3900" Action="None" />
<Rule Id="S1821" Action="None" />
<Rule Id="S3235" Action="None" />
<Rule Id="S3366" Action="None" />
<Rule Id="S1151" Action="None" />
<Rule Id="S4041" Action="None" />
<Rule Id="S4261" Action="None" />
<Rule Id="S1147" Action="None" />
<Rule Id="S3532" Action="None" />
<Rule Id="S3353" Action="None" />
<Rule Id="S126" Action="None" />
<Rule Id="S138" Action="None" />
<Rule Id="S1659" Action="None" />
<Rule Id="S2197" Action="None" />
<Rule Id="S100" Action="None" />
<Rule Id="S103" Action="None" />
<Rule Id="S104" Action="None" />
<Rule Id="S105" Action="None" />
<Rule Id="S1067" Action="None" />
<Rule Id="S1109" Action="None" />
<Rule Id="S113" Action="None" />
<Rule Id="S1145" Action="None" />
<Rule Id="S1200" Action="None" />
<Rule Id="S121" Action="None" />
<Rule Id="S122" Action="None" />
<Rule Id="S1226" Action="None" />
<Rule Id="S1227" Action="None" />
<Rule Id="S1244" Action="None" />
<Rule Id="S127" Action="None" />
<Rule Id="S1301" Action="None" />
<Rule Id="S1309" Action="None" />
<Rule Id="S1313" Action="None" />
<Rule Id="S134" Action="None" />
<Rule Id="S1449" Action="None" />
<Rule Id="S1451" Action="None" />
<Rule Id="S1541" Action="None" />
<Rule Id="S1696" Action="None" />
<Rule Id="S1697" Action="None" />
<Rule Id="S1698" Action="None" />
<Rule Id="S1858" Action="None" />
<Rule Id="S1994" Action="None" />
<Rule Id="S2156" Action="None" />
<Rule Id="S2221" Action="None" />
<Rule Id="S2325" Action="None" />
<Rule Id="S2330" Action="None" />
<Rule Id="S2333" Action="None" />
<Rule Id="S2339" Action="None" />
<Rule Id="S2357" Action="None" />
<Rule Id="S2360" Action="None" />
<Rule Id="S2387" Action="None" />
<Rule Id="S2551" Action="None" />
<Rule Id="S2674" Action="None" />
<Rule Id="S2699" Action="None" />
<Rule Id="S2701" Action="None" />
<Rule Id="S2760" Action="None" />
<Rule Id="S2931" Action="None" />
<Rule Id="S2952" Action="None" />
<Rule Id="S2955" Action="None" />
<Rule Id="S3052" Action="None" />
<Rule Id="S3215" Action="None" />
<Rule Id="S3216" Action="None" />
<Rule Id="S3234" Action="None" />
<Rule Id="S3240" Action="None" />
<Rule Id="S3242" Action="None" />
<Rule Id="S3253" Action="None" />
<Rule Id="S3254" Action="None" />
<Rule Id="S3257" Action="None" />
<Rule Id="S3431" Action="None" />
<Rule Id="S3441" Action="None" />
<Rule Id="S3717" Action="None" />
<Rule Id="S3872" Action="None" />
<Rule Id="S3874" Action="None" />
<Rule Id="S3876" Action="None" />
<Rule Id="S3880" Action="None" />
<Rule Id="S3898" Action="None" />
<Rule Id="S3902" Action="None" />
<Rule Id="S3906" Action="None" />
<Rule Id="S3908" Action="None" />
<Rule Id="S3909" Action="None" />
<Rule Id="S3956" Action="None" />
<Rule Id="S3962" Action="None" />
<Rule Id="S3963" Action="None" />
<Rule Id="S3967" Action="None" />
<Rule Id="S3990" Action="None" />
<Rule Id="S3992" Action="None" />
<Rule Id="S3993" Action="None" />
<Rule Id="S3994" Action="None" />
<Rule Id="S3995" Action="None" />
<Rule Id="S3996" Action="None" />
<Rule Id="S3997" Action="None" />
<Rule Id="S4000" Action="None" />
<Rule Id="S4002" Action="None" />
<Rule Id="S4004" Action="None" />
<Rule Id="S4005" Action="None" />
<Rule Id="S4017" Action="None" />
<Rule Id="S4018" Action="None" />
<Rule Id="S4022" Action="None" />
<Rule Id="S4023" Action="None" />
<Rule Id="S4025" Action="None" />
<Rule Id="S4026" Action="None" />
<Rule Id="S4027" Action="None" />
<Rule Id="S4039" Action="None" />
<Rule Id="S4047" Action="None" />
<Rule Id="S4049" Action="None" />
<Rule Id="S4050" Action="None" />
<Rule Id="S4052" Action="None" />
<Rule Id="S4055" Action="None" />
<Rule Id="S4056" Action="None" />
<Rule Id="S4057" Action="None" />
<Rule Id="S4058" Action="None" />
<Rule Id="S4059" Action="None" />
<Rule Id="S4060" Action="None" />
<Rule Id="S4069" Action="None" />
<Rule Id="S4070" Action="None" />
<Rule Id="S4225" Action="None" />
<Rule Id="S4226" Action="None" />
</Rules>
</RuleSet>

View File

@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<RuleSet xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="Rules for SonarQube" Description="This rule set was automatically generated from SonarQube" ToolsVersion="14.0">
<Rules AnalyzerId="SonarAnalyzer.VisualBasic" RuleNamespace="SonarAnalyzer.VisualBasic">
<Rule Id="S1751" Action="Warning" />
<Rule Id="S1871" Action="Warning" />
<Rule Id="S1656" Action="Warning" />
<Rule Id="S1862" Action="Warning" />
<Rule Id="S1764" Action="Warning" />
<Rule Id="S2178" Action="Warning" />
<Rule Id="S101" Action="Warning" />
<Rule Id="S1075" Action="Warning" />
<Rule Id="S112" Action="Warning" />
<Rule Id="S114" Action="Warning" />
<Rule Id="S117" Action="Warning" />
<Rule Id="S1197" Action="Warning" />
<Rule Id="S1542" Action="Warning" />
<Rule Id="S1643" Action="Warning" />
<Rule Id="S1645" Action="Warning" />
<Rule Id="S1654" Action="Warning" />
<Rule Id="S2304" Action="Warning" />
<Rule Id="S2340" Action="Warning" />
<Rule Id="S2342" Action="Warning" />
<Rule Id="S2344" Action="Warning" />
<Rule Id="S2345" Action="Warning" />
<Rule Id="S2346" Action="Warning" />
<Rule Id="S2347" Action="Warning" />
<Rule Id="S2349" Action="Warning" />
<Rule Id="S2352" Action="Warning" />
<Rule Id="S2355" Action="Warning" />
<Rule Id="S2358" Action="Warning" />
<Rule Id="S2359" Action="Warning" />
<Rule Id="S2365" Action="Warning" />
<Rule Id="S2368" Action="Warning" />
<Rule Id="S2372" Action="Warning" />
<Rule Id="S2375" Action="Warning" />
<Rule Id="S2376" Action="Warning" />
<Rule Id="S2951" Action="Warning" />
<Rule Id="S3385" Action="Warning" />
<Rule Id="S3981" Action="Warning" />
<Rule Id="S4144" Action="Warning" />
<Rule Id="S4142" Action="None" />
<Rule Id="S1659" Action="None" />
<Rule Id="S131" Action="None" />
<Rule Id="S103" Action="None" />
<Rule Id="S104" Action="None" />
<Rule Id="S105" Action="None" />
<Rule Id="S1067" Action="None" />
<Rule Id="S1147" Action="None" />
<Rule Id="S122" Action="None" />
<Rule Id="S1226" Action="None" />
<Rule Id="S134" Action="None" />
<Rule Id="S139" Action="None" />
<Rule Id="S1541" Action="None" />
<Rule Id="S2339" Action="None" />
<Rule Id="S2343" Action="None" />
<Rule Id="S2348" Action="None" />
<Rule Id="S2353" Action="None" />
<Rule Id="S2354" Action="None" />
<Rule Id="S2357" Action="None" />
<Rule Id="S2360" Action="None" />
<Rule Id="S2362" Action="None" />
<Rule Id="S2363" Action="None" />
<Rule Id="S2364" Action="None" />
<Rule Id="S2366" Action="None" />
<Rule Id="S2367" Action="None" />
<Rule Id="S2369" Action="None" />
<Rule Id="S2370" Action="None" />
<Rule Id="S2373" Action="None" />
<Rule Id="S2374" Action="None" />
<Rule Id="S2429" Action="None" />
<Rule Id="S3860" Action="None" />
<Rule Id="S3866" Action="None" />
</Rules>
</RuleSet>

View File

@@ -0,0 +1,695 @@
<?xml version="1.0" encoding="UTF-8"?>
<AnalysisInput>
<Settings>
<Setting>
<Key>sonar.cs.ignoreHeaderComments</Key>
<Value>true</Value>
</Setting>
<Setting>
<Key>sonar.cs.file.suffixes</Key>
<Value>.cs</Value>
</Setting>
</Settings>
<Rules>
<Rule>
<Key>S2589</Key>
</Rule>
<Rule>
<Key>S3433</Key>
</Rule>
<Rule>
<Key>S4061</Key>
</Rule>
<Rule>
<Key>S1121</Key>
</Rule>
<Rule>
<Key>S1854</Key>
</Rule>
<Rule>
<Key>S4457</Key>
</Rule>
<Rule>
<Key>S4456</Key>
</Rule>
<Rule>
<Key>S2278</Key>
</Rule>
<Rule>
<Key>S4211</Key>
</Rule>
<Rule>
<Key>S3923</Key>
</Rule>
<Rule>
<Key>S4426</Key>
</Rule>
<Rule>
<Key>S2486</Key>
</Rule>
<Rule>
<Key>S4433</Key>
</Rule>
<Rule>
<Key>S2758</Key>
</Rule>
<Rule>
<Key>S1751</Key>
</Rule>
<Rule>
<Key>S1871</Key>
</Rule>
<Rule>
<Key>S4586</Key>
</Rule>
<Rule>
<Key>S4581</Key>
</Rule>
<Rule>
<Key>S2737</Key>
</Rule>
<Rule>
<Key>S3400</Key>
</Rule>
<Rule>
<Key>S3649</Key>
</Rule>
<Rule>
<Key>S1144</Key>
</Rule>
<Rule>
<Key>S1264</Key>
</Rule>
<Rule>
<Key>S2201</Key>
</Rule>
<Rule>
<Key>S1118</Key>
</Rule>
<Rule>
<Key>S1006</Key>
</Rule>
<Rule>
<Key>S4214</Key>
</Rule>
<Rule>
<Key>S4210</Key>
</Rule>
<Rule>
<Key>S3241</Key>
</Rule>
<Rule>
<Key>S4428</Key>
</Rule>
<Rule>
<Key>S1048</Key>
</Rule>
<Rule>
<Key>S2183</Key>
</Rule>
<Rule>
<Key>S3168</Key>
</Rule>
<Rule>
<Key>S4220</Key>
</Rule>
<Rule>
<Key>S3261</Key>
</Rule>
<Rule>
<Key>S4260</Key>
</Rule>
<Rule>
<Key>S4159</Key>
</Rule>
<Rule>
<Key>S4277</Key>
</Rule>
<Rule>
<Key>S2583</Key>
</Rule>
<Rule>
<Key>S3440</Key>
</Rule>
<Rule>
<Key>S3776</Key>
<Parameters>
<Parameter>
<Key>threshold</Key>
<Value>15</Value>
</Parameter>
<Parameter>
<Key>propertyThreshold</Key>
<Value>3</Value>
</Parameter>
</Parameters>
</Rule>
<Rule>
<Key>S2326</Key>
</Rule>
<Rule>
<Key>S1116</Key>
</Rule>
<Rule>
<Key>S3358</Key>
</Rule>
<Rule>
<Key>S4200</Key>
</Rule>
<Rule>
<Key>S1172</Key>
</Rule>
<Rule>
<Key>S1862</Key>
</Rule>
<Rule>
<Key>S2275</Key>
</Rule>
<Rule>
<Key>S3457</Key>
</Rule>
<Rule>
<Key>S3459</Key>
</Rule>
<Rule>
<Key>S3464</Key>
</Rule>
<Rule>
<Key>S3343</Key>
</Rule>
<Rule>
<Key>S818</Key>
</Rule>
<Rule>
<Key>S1656</Key>
</Rule>
<Rule>
<Key>S2184</Key>
</Rule>
<Rule>
<Key>S1764</Key>
</Rule>
<Rule>
<Key>S2971</Key>
</Rule>
<Rule>
<Key>S3060</Key>
</Rule>
<Rule>
<Key>S101</Key>
</Rule>
<Rule>
<Key>S1066</Key>
</Rule>
<Rule>
<Key>S107</Key>
<Parameters>
<Parameter>
<Key>max</Key>
<Value>7</Value>
</Parameter>
</Parameters>
</Rule>
<Rule>
<Key>S1075</Key>
</Rule>
<Rule>
<Key>S108</Key>
</Rule>
<Rule>
<Key>S110</Key>
<Parameters>
<Parameter>
<Key>max</Key>
<Value>5</Value>
</Parameter>
</Parameters>
</Rule>
<Rule>
<Key>S1104</Key>
</Rule>
<Rule>
<Key>S1110</Key>
</Rule>
<Rule>
<Key>S1117</Key>
</Rule>
<Rule>
<Key>S112</Key>
</Rule>
<Rule>
<Key>S1123</Key>
</Rule>
<Rule>
<Key>S1125</Key>
</Rule>
<Rule>
<Key>S1134</Key>
</Rule>
<Rule>
<Key>S1135</Key>
</Rule>
<Rule>
<Key>S1155</Key>
</Rule>
<Rule>
<Key>S1163</Key>
</Rule>
<Rule>
<Key>S1168</Key>
</Rule>
<Rule>
<Key>S1185</Key>
</Rule>
<Rule>
<Key>S1186</Key>
</Rule>
<Rule>
<Key>S1206</Key>
</Rule>
<Rule>
<Key>S1210</Key>
</Rule>
<Rule>
<Key>S1215</Key>
</Rule>
<Rule>
<Key>S125</Key>
</Rule>
<Rule>
<Key>S1450</Key>
</Rule>
<Rule>
<Key>S1479</Key>
<Parameters>
<Parameter>
<Key>maximum</Key>
<Value>30</Value>
</Parameter>
</Parameters>
</Rule>
<Rule>
<Key>S1481</Key>
</Rule>
<Rule>
<Key>S1607</Key>
</Rule>
<Rule>
<Key>S1643</Key>
</Rule>
<Rule>
<Key>S1699</Key>
</Rule>
<Rule>
<Key>S1848</Key>
</Rule>
<Rule>
<Key>S1905</Key>
</Rule>
<Rule>
<Key>S1939</Key>
</Rule>
<Rule>
<Key>S1940</Key>
</Rule>
<Rule>
<Key>S1944</Key>
</Rule>
<Rule>
<Key>S2068</Key>
<Parameters>
<Parameter>
<Key>credentialWords</Key>
<Value>password, passwd, pwd</Value>
</Parameter>
</Parameters>
</Rule>
<Rule>
<Key>S2114</Key>
</Rule>
<Rule>
<Key>S2123</Key>
</Rule>
<Rule>
<Key>S2178</Key>
</Rule>
<Rule>
<Key>S2187</Key>
</Rule>
<Rule>
<Key>S2190</Key>
</Rule>
<Rule>
<Key>S2219</Key>
</Rule>
<Rule>
<Key>S2223</Key>
</Rule>
<Rule>
<Key>S2225</Key>
</Rule>
<Rule>
<Key>S2234</Key>
</Rule>
<Rule>
<Key>S2259</Key>
</Rule>
<Rule>
<Key>S2290</Key>
</Rule>
<Rule>
<Key>S2291</Key>
</Rule>
<Rule>
<Key>S2292</Key>
</Rule>
<Rule>
<Key>S2306</Key>
</Rule>
<Rule>
<Key>S2328</Key>
</Rule>
<Rule>
<Key>S2342</Key>
<Parameters>
<Parameter>
<Key>format</Key>
<Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
</Parameter>
<Parameter>
<Key>flagsAttributeFormat</Key>
<Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?s$</Value>
</Parameter>
</Parameters>
</Rule>
<Rule>
<Key>S2344</Key>
</Rule>
<Rule>
<Key>S2345</Key>
</Rule>
<Rule>
<Key>S2346</Key>
</Rule>
<Rule>
<Key>S2365</Key>
</Rule>
<Rule>
<Key>S2368</Key>
</Rule>
<Rule>
<Key>S2372</Key>
</Rule>
<Rule>
<Key>S2376</Key>
</Rule>
<Rule>
<Key>S2386</Key>
</Rule>
<Rule>
<Key>S2436</Key>
<Parameters>
<Parameter>
<Key>max</Key>
<Value>2</Value>
</Parameter>
<Parameter>
<Key>maxMethod</Key>
<Value>3</Value>
</Parameter>
</Parameters>
</Rule>
<Rule>
<Key>S2437</Key>
</Rule>
<Rule>
<Key>S2681</Key>
</Rule>
<Rule>
<Key>S2688</Key>
</Rule>
<Rule>
<Key>S2692</Key>
</Rule>
<Rule>
<Key>S2696</Key>
</Rule>
<Rule>
<Key>S2743</Key>
</Rule>
<Rule>
<Key>S2757</Key>
</Rule>
<Rule>
<Key>S2761</Key>
</Rule>
<Rule>
<Key>S2930</Key>
</Rule>
<Rule>
<Key>S2933</Key>
</Rule>
<Rule>
<Key>S2934</Key>
</Rule>
<Rule>
<Key>S2953</Key>
</Rule>
<Rule>
<Key>S2995</Key>
</Rule>
<Rule>
<Key>S2996</Key>
</Rule>
<Rule>
<Key>S2997</Key>
</Rule>
<Rule>
<Key>S3005</Key>
</Rule>
<Rule>
<Key>S3010</Key>
</Rule>
<Rule>
<Key>S3169</Key>
</Rule>
<Rule>
<Key>S3172</Key>
</Rule>
<Rule>
<Key>S3217</Key>
</Rule>
<Rule>
<Key>S3218</Key>
</Rule>
<Rule>
<Key>S3220</Key>
</Rule>
<Rule>
<Key>S3236</Key>
</Rule>
<Rule>
<Key>S3237</Key>
</Rule>
<Rule>
<Key>S3244</Key>
</Rule>
<Rule>
<Key>S3246</Key>
</Rule>
<Rule>
<Key>S3247</Key>
</Rule>
<Rule>
<Key>S3249</Key>
</Rule>
<Rule>
<Key>S3251</Key>
</Rule>
<Rule>
<Key>S3256</Key>
</Rule>
<Rule>
<Key>S3262</Key>
</Rule>
<Rule>
<Key>S3263</Key>
</Rule>
<Rule>
<Key>S3264</Key>
</Rule>
<Rule>
<Key>S3265</Key>
</Rule>
<Rule>
<Key>S3346</Key>
</Rule>
<Rule>
<Key>S3376</Key>
</Rule>
<Rule>
<Key>S3397</Key>
</Rule>
<Rule>
<Key>S3415</Key>
</Rule>
<Rule>
<Key>S3427</Key>
</Rule>
<Rule>
<Key>S3442</Key>
</Rule>
<Rule>
<Key>S3443</Key>
</Rule>
<Rule>
<Key>S3444</Key>
</Rule>
<Rule>
<Key>S3445</Key>
</Rule>
<Rule>
<Key>S3447</Key>
</Rule>
<Rule>
<Key>S3449</Key>
</Rule>
<Rule>
<Key>S3450</Key>
</Rule>
<Rule>
<Key>S3451</Key>
</Rule>
<Rule>
<Key>S3453</Key>
</Rule>
<Rule>
<Key>S3456</Key>
</Rule>
<Rule>
<Key>S3458</Key>
</Rule>
<Rule>
<Key>S3466</Key>
</Rule>
<Rule>
<Key>S3597</Key>
</Rule>
<Rule>
<Key>S3598</Key>
</Rule>
<Rule>
<Key>S3600</Key>
</Rule>
<Rule>
<Key>S3603</Key>
</Rule>
<Rule>
<Key>S3604</Key>
</Rule>
<Rule>
<Key>S3610</Key>
</Rule>
<Rule>
<Key>S3626</Key>
</Rule>
<Rule>
<Key>S3655</Key>
</Rule>
<Rule>
<Key>S3693</Key>
</Rule>
<Rule>
<Key>S3869</Key>
</Rule>
<Rule>
<Key>S3871</Key>
</Rule>
<Rule>
<Key>S3875</Key>
</Rule>
<Rule>
<Key>S3877</Key>
</Rule>
<Rule>
<Key>S3881</Key>
</Rule>
<Rule>
<Key>S3884</Key>
</Rule>
<Rule>
<Key>S3885</Key>
</Rule>
<Rule>
<Key>S3887</Key>
</Rule>
<Rule>
<Key>S3889</Key>
</Rule>
<Rule>
<Key>S3897</Key>
</Rule>
<Rule>
<Key>S3903</Key>
</Rule>
<Rule>
<Key>S3904</Key>
</Rule>
<Rule>
<Key>S3925</Key>
</Rule>
<Rule>
<Key>S3926</Key>
</Rule>
<Rule>
<Key>S3927</Key>
</Rule>
<Rule>
<Key>S3928</Key>
</Rule>
<Rule>
<Key>S3966</Key>
</Rule>
<Rule>
<Key>S3971</Key>
</Rule>
<Rule>
<Key>S3972</Key>
</Rule>
<Rule>
<Key>S3981</Key>
</Rule>
<Rule>
<Key>S3984</Key>
</Rule>
<Rule>
<Key>S3998</Key>
</Rule>
<Rule>
<Key>S4015</Key>
</Rule>
<Rule>
<Key>S4016</Key>
</Rule>
<Rule>
<Key>S4019</Key>
</Rule>
<Rule>
<Key>S4035</Key>
</Rule>
<Rule>
<Key>S4144</Key>
</Rule>
<Rule>
<Key>S4158</Key>
</Rule>
<Rule>
<Key>S907</Key>
</Rule>
<Rule>
<Key>S927</Key>
</Rule>
</Rules>
<Files>
</Files>
</AnalysisInput>

View File

@@ -0,0 +1,186 @@
<?xml version="1.0" encoding="UTF-8"?>
<AnalysisInput>
<Settings>
<Setting>
<Key>sonar.vbnet.ignoreHeaderComments</Key>
<Value>true</Value>
</Setting>
<Setting>
<Key>sonar.vbnet.file.suffixes</Key>
<Value>.vb</Value>
</Setting>
</Settings>
<Rules>
<Rule>
<Key>S1751</Key>
</Rule>
<Rule>
<Key>S1871</Key>
</Rule>
<Rule>
<Key>S1656</Key>
</Rule>
<Rule>
<Key>S1862</Key>
</Rule>
<Rule>
<Key>S1764</Key>
</Rule>
<Rule>
<Key>S2178</Key>
</Rule>
<Rule>
<Key>S101</Key>
<Parameters>
<Parameter>
<Key>format</Key>
<Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
</Parameter>
</Parameters>
</Rule>
<Rule>
<Key>S1075</Key>
</Rule>
<Rule>
<Key>S112</Key>
</Rule>
<Rule>
<Key>S114</Key>
<Parameters>
<Parameter>
<Key>format</Key>
<Value>^I([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
</Parameter>
</Parameters>
</Rule>
<Rule>
<Key>S117</Key>
<Parameters>
<Parameter>
<Key>format</Key>
<Value>^[a-z][a-z0-9]*([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
</Parameter>
</Parameters>
</Rule>
<Rule>
<Key>S1197</Key>
</Rule>
<Rule>
<Key>S1542</Key>
<Parameters>
<Parameter>
<Key>format</Key>
<Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
</Parameter>
</Parameters>
</Rule>
<Rule>
<Key>S1643</Key>
</Rule>
<Rule>
<Key>S1645</Key>
</Rule>
<Rule>
<Key>S1654</Key>
<Parameters>
<Parameter>
<Key>format</Key>
<Value>^[a-z][a-z0-9]*([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
</Parameter>
</Parameters>
</Rule>
<Rule>
<Key>S2304</Key>
<Parameters>
<Parameter>
<Key>format</Key>
<Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?(\.([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?)*$</Value>
</Parameter>
</Parameters>
</Rule>
<Rule>
<Key>S2340</Key>
</Rule>
<Rule>
<Key>S2342</Key>
<Parameters>
<Parameter>
<Key>format</Key>
<Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
</Parameter>
<Parameter>
<Key>flagsAttributeFormat</Key>
<Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?s$</Value>
</Parameter>
</Parameters>
</Rule>
<Rule>
<Key>S2344</Key>
</Rule>
<Rule>
<Key>S2345</Key>
</Rule>
<Rule>
<Key>S2346</Key>
</Rule>
<Rule>
<Key>S2347</Key>
<Parameters>
<Parameter>
<Key>format</Key>
<Value>^(([a-z][a-z0-9]*)?([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?_)?([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
</Parameter>
</Parameters>
</Rule>
<Rule>
<Key>S2349</Key>
</Rule>
<Rule>
<Key>S2352</Key>
</Rule>
<Rule>
<Key>S2355</Key>
</Rule>
<Rule>
<Key>S2358</Key>
</Rule>
<Rule>
<Key>S2359</Key>
</Rule>
<Rule>
<Key>S2365</Key>
</Rule>
<Rule>
<Key>S2368</Key>
</Rule>
<Rule>
<Key>S2372</Key>
</Rule>
<Rule>
<Key>S2375</Key>
<Parameters>
<Parameter>
<Key>minimumSeriesLength</Key>
<Value>6</Value>
</Parameter>
</Parameters>
</Rule>
<Rule>
<Key>S2376</Key>
</Rule>
<Rule>
<Key>S2951</Key>
</Rule>
<Rule>
<Key>S3385</Key>
</Rule>
<Rule>
<Key>S3981</Key>
</Rule>
<Rule>
<Key>S4144</Key>
</Rule>
</Rules>
<Files>
</Files>
</AnalysisInput>

View File

@@ -0,0 +1,7 @@
organization=geogeob
projectKey=ModernKeePass
serverUrl=https://sonarcloud.io
serverVersion=7.2.0.12953
dashboardUrl=https://sonarcloud.io/dashboard/index/ModernKeePass
ceTaskId=AWQER9hfTzX59Iu7A6N0
ceTaskUrl=https://sonarcloud.io/api/ce/task?id=AWQER9hfTzX59Iu7A6N0

Binary file not shown.

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<ProjectInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.sonarsource.com/msbuild/integration/2015/1">
<ProjectName>ModernKeePass.App</ProjectName>
<ProjectLanguage>C#</ProjectLanguage>
<ProjectType>Product</ProjectType>
<ProjectGuid>a0cfc681-769b-405a-8482-0cdee595a91f</ProjectGuid>
<FullPath>C:\Sources\Other\ModernKeePass\ModernKeePass\ModernKeePass.App.csproj</FullPath>
<IsExcluded>false</IsExcluded>
<AnalysisResults>
<AnalysisResult Id="FilesToAnalyze" Location="C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\out\0\FilesToAnalyze.txt" />
</AnalysisResults>
<AnalysisSettings>
<Property Name="sonar.cs.roslyn.reportFilePath">C:\Sources\Other\ModernKeePass\ModernKeePass\bin\Debug\ModernKeePass.exe.RoslynCA.json</Property>
<Property Name="sonar.cs.analyzer.projectOutPath">C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\out\0</Property>
</AnalysisSettings>
<Configuration>Debug</Configuration>
<Platform>AnyCPU</Platform>
</ProjectInfo>

View File

@@ -0,0 +1,85 @@
P
GC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\ClipboardAction.csutf-8T
KC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\NavigateToUrlAction.csutf-8Q
HC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\SetupFocusAction.csutf-8A
8C:\Sources\Other\ModernKeePass\ModernKeePass\App.xaml.csutf-8X
OC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\IntToSymbolConverter.csutf-8[
RC:\Sources\Other\ModernKeePass\ModernKeePass\Exceptions\DatabaseOpenedException.csutf-8S
JC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ILicenseService.csutf-8[
RC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IProxyInvocationHandler.csutf-8R
IC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IRecentService.csutf-8O
FC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IRecentItem.csutf-8T
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IResourceService.csutf-8V
MC:\Sources\Other\ModernKeePass\ModernKeePass\Services\SingletonServiceBase.csutf-8i
`C:\Sources\Other\ModernKeePass\ModernKeePass\TemplateSelectors\SelectableDataTemplateSelector.csutf-8X
OC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\SettingsSaveVm.csutf-8]
TC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\DonatePage.xaml.csutf-8Q
HC:\Sources\Other\ModernKeePass\ModernKeePass\Services\DatabaseService.csutf-8T
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ISettingsService.csutf-8S
JC:\Sources\Other\ModernKeePass\ModernKeePass\Common\MessageDialogHelper.csutf-8P
GC:\Sources\Other\ModernKeePass\ModernKeePass\Common\NavigationHelper.csutf-8Y
PC:\Sources\Other\ModernKeePass\ModernKeePass\Common\NotifyPropertyChangedBase.csutf-8T
KC:\Sources\Other\ModernKeePass\ModernKeePass\Common\ObservableDictionary.csutf-8L
CC:\Sources\Other\ModernKeePass\ModernKeePass\Common\RelayCommand.csutf-8Q
HC:\Sources\Other\ModernKeePass\ModernKeePass\Common\SuspensionManager.csutf-8P
GC:\Sources\Other\ModernKeePass\ModernKeePass\Services\LicenseService.csutf-8O
FC:\Sources\Other\ModernKeePass\ModernKeePass\Services\RecentService.csutf-8R
IC:\Sources\Other\ModernKeePass\ModernKeePass\Services\ResourcesService.csutf-8Q
HC:\Sources\Other\ModernKeePass\ModernKeePass\Services\SettingsService.csutf-8W
NC:\Sources\Other\ModernKeePass\ModernKeePass\Common\ToastNotificationHelper.csutf-8i
`C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\DiscreteIntToSolidColorBrushConverter.csutf-8d
[C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\EmptyStringToVisibilityConverter.csutf-8Z
QC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\NullToBooleanConverter.csutf-8Q
HC:\Sources\Other\ModernKeePass\ModernKeePass\Exceptions\SaveException.csutf-8\
SC:\Sources\Other\ModernKeePass\ModernKeePass\Extensions\DispatcherTaskExtensions.csutf-8T
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IDatabaseService.csutf-8X
OC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IHasSelectableObject.csutf-8T
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ISelectableModel.csutf-8\
SC:\Sources\Other\ModernKeePass\ModernKeePass\Views\BasePages\LayoutAwarePageBase.csutf-8k
bC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsDatabasePage.xaml.csutf-8n
eC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsNewDatabasePage.xaml.csutf-8g
^C:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsSavePage.xaml.csutf-8k
bC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsSecurityPage.xaml.csutf-8j
aC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsWelcomePage.xaml.csutf-8h
_C:\Sources\Other\ModernKeePass\ModernKeePass\TemplateSelectors\FirstItemDataTemplateSelector.csutf-8U
LC:\Sources\Other\ModernKeePass\ModernKeePass\Controls\ListViewWithDisable.csutf-8f
]C:\Sources\Other\ModernKeePass\ModernKeePass\Views\UserControls\BreadCrumbUserControl.xaml.csutf-8h
_C:\Sources\Other\ModernKeePass\ModernKeePass\Views\UserControls\CompositeKeyUserControl.xaml.csutf-8S
JC:\Sources\Other\ModernKeePass\ModernKeePass\Controls\TextBoxWithButton.csutf-8`
WC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\BooleanToVisibilityConverter.csutf-8Y
PC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\ColorToBrushConverter.csutf-8d
[C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\DoubleToSolidColorBrushConverter.csutf-8g
^C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\InverseBooleanToVisibilityConverter.csutf-8Z
QC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\PluralizationConverter.csutf-8c
ZC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\ProgressBarLegalValuesConverter.csutf-8X
OC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\TextToWidthConverter.csutf-8Q
HC:\Sources\Other\ModernKeePass\ModernKeePass\Events\PasswordEventArgs.csutf-8N
EC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IIsEnabled.csutf-8M
DC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IPwEntity.csutf-8L
CC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPage.xaml.csutf-8\
SC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\AboutPage.xaml.csutf-8b
YC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\NewDatabasePage.xaml.csutf-8P
GC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPage.xaml.csutf-8^
UC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\WelcomePage.xaml.csutf-8K
BC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\AboutVm.csutf-8R
IC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\CompositeKeyVm.csutf-8X
OC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\ListMenuItemVm.csutf-8X
OC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\MainMenuItemVm.csutf-8V
MC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\RecentItemVm.csutf-8S
JC:\Sources\Other\ModernKeePass\ModernKeePass\Views\EntryDetailPage.xaml.csutf-8S
JC:\Sources\Other\ModernKeePass\ModernKeePass\Views\GroupDetailPage.xaml.csutf-8c
ZC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\OpenDatabasePage.xaml.csutf-8f
]C:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\RecentDatabasesPage.xaml.csutf-8c
ZC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\SaveDatabasePage.xaml.csutf-8P
GC:\Sources\Other\ModernKeePass\ModernKeePass\Properties\AssemblyInfo.csutf-8K
BC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\EntryVm.csutf-8K
BC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\GroupVm.csutf-8W
NC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\SettingsNewVm.csutf-8N
EC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\SettingsVm.csutf-8J
AC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\MainVm.csutf-8I
@C:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\NewVm.csutf-8J
AC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\OpenVm.csutf-8L
CC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\RecentVm.csutf-8J
AC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\SaveVm.csutf-8\
SC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\SettingsDatabaseVm.csutf-8i
`C:\Sources\Other\ModernKeePass\ModernKeePass\Views\UserControls\HamburgerMenuUserControl.xaml.csutf-8

View File

@@ -0,0 +1,139 @@
I
GC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\ClipboardAction.csM
KC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\NavigateToUrlAction.csJ
HC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\SetupFocusAction.cs:
8C:\Sources\Other\ModernKeePass\ModernKeePass\App.xaml.csQ
OC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\IntToSymbolConverter.csT
RC:\Sources\Other\ModernKeePass\ModernKeePass\Exceptions\DatabaseOpenedException.csL
JC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ILicenseService.csT
RC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IProxyInvocationHandler.csK
IC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IRecentService.csH
FC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IRecentItem.csM
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IResourceService.csO
MC:\Sources\Other\ModernKeePass\ModernKeePass\Services\SingletonServiceBase.csb
`C:\Sources\Other\ModernKeePass\ModernKeePass\TemplateSelectors\SelectableDataTemplateSelector.csQ
OC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\SettingsSaveVm.csV
TC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\DonatePage.xaml.csJ
HC:\Sources\Other\ModernKeePass\ModernKeePass\Services\DatabaseService.csM
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ISettingsService.csL
JC:\Sources\Other\ModernKeePass\ModernKeePass\Common\MessageDialogHelper.csI
GC:\Sources\Other\ModernKeePass\ModernKeePass\Common\NavigationHelper.csR
PC:\Sources\Other\ModernKeePass\ModernKeePass\Common\NotifyPropertyChangedBase.csM
KC:\Sources\Other\ModernKeePass\ModernKeePass\Common\ObservableDictionary.csE
CC:\Sources\Other\ModernKeePass\ModernKeePass\Common\RelayCommand.csJ
HC:\Sources\Other\ModernKeePass\ModernKeePass\Common\SuspensionManager.csI
GC:\Sources\Other\ModernKeePass\ModernKeePass\Services\LicenseService.csH
FC:\Sources\Other\ModernKeePass\ModernKeePass\Services\RecentService.csK
IC:\Sources\Other\ModernKeePass\ModernKeePass\Services\ResourcesService.csJ
HC:\Sources\Other\ModernKeePass\ModernKeePass\Services\SettingsService.csP
NC:\Sources\Other\ModernKeePass\ModernKeePass\Common\ToastNotificationHelper.csb
`C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\DiscreteIntToSolidColorBrushConverter.cs]
[C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\EmptyStringToVisibilityConverter.csS
QC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\NullToBooleanConverter.csJ
HC:\Sources\Other\ModernKeePass\ModernKeePass\Exceptions\SaveException.csU
SC:\Sources\Other\ModernKeePass\ModernKeePass\Extensions\DispatcherTaskExtensions.csM
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IDatabaseService.csQ
OC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IHasSelectableObject.csM
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ISelectableModel.csU
SC:\Sources\Other\ModernKeePass\ModernKeePass\Views\BasePages\LayoutAwarePageBase.csd
bC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsDatabasePage.xaml.csg
eC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsNewDatabasePage.xaml.cs`
^C:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsSavePage.xaml.csd
bC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsSecurityPage.xaml.csc
aC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsWelcomePage.xaml.csa
_C:\Sources\Other\ModernKeePass\ModernKeePass\TemplateSelectors\FirstItemDataTemplateSelector.csN
LC:\Sources\Other\ModernKeePass\ModernKeePass\Controls\ListViewWithDisable.cs_
]C:\Sources\Other\ModernKeePass\ModernKeePass\Views\UserControls\BreadCrumbUserControl.xaml.csa
_C:\Sources\Other\ModernKeePass\ModernKeePass\Views\UserControls\CompositeKeyUserControl.xaml.csL
JC:\Sources\Other\ModernKeePass\ModernKeePass\Controls\TextBoxWithButton.csY
WC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\BooleanToVisibilityConverter.csR
PC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\ColorToBrushConverter.cs]
[C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\DoubleToSolidColorBrushConverter.cs`
^C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\InverseBooleanToVisibilityConverter.csS
QC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\PluralizationConverter.cs\
ZC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\ProgressBarLegalValuesConverter.csQ
OC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\TextToWidthConverter.csJ
HC:\Sources\Other\ModernKeePass\ModernKeePass\Events\PasswordEventArgs.csG
EC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IIsEnabled.csF
DC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IPwEntity.csE
CC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPage.xaml.csU
SC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\AboutPage.xaml.cs[
YC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\NewDatabasePage.xaml.csI
GC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPage.xaml.csW
UC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\WelcomePage.xaml.csD
BC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\AboutVm.csK
IC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\CompositeKeyVm.csQ
OC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\ListMenuItemVm.csQ
OC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\MainMenuItemVm.csO
MC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\RecentItemVm.csL
JC:\Sources\Other\ModernKeePass\ModernKeePass\Views\EntryDetailPage.xaml.csL
JC:\Sources\Other\ModernKeePass\ModernKeePass\Views\GroupDetailPage.xaml.cs\
ZC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\OpenDatabasePage.xaml.cs_
]C:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\RecentDatabasesPage.xaml.cs\
ZC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\SaveDatabasePage.xaml.csI
GC:\Sources\Other\ModernKeePass\ModernKeePass\Properties\AssemblyInfo.csD
BC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\EntryVm.csD
BC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\GroupVm.csP
NC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\SettingsNewVm.csG
EC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\SettingsVm.csC
AC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\MainVm.csB
@C:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\NewVm.csC
AC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\OpenVm.csE
CC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\RecentVm.csC
AC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\SaveVm.csU
SC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\SettingsDatabaseVm.csb
`C:\Sources\Other\ModernKeePass\ModernKeePass\Views\UserControls\HamburgerMenuUserControl.xaml.csE
AC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\App.g.i.csC
?C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\App.g.csO
KC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\Colors.g.i.csM
IC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\Colors.g.csk
gC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsSavePage.g.i.csi
eC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsSavePage.g.csj
fC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\UserControls\BreadCrumbUserControl.g.i.csh
dC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\UserControls\BreadCrumbUserControl.g.csl
hC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\UserControls\CompositeKeyUserControl.g.i.csj
fC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\UserControls\CompositeKeyUserControl.g.csP
LC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPage.g.i.csN
JC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPage.g.cs`
\C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\AboutPage.g.i.cs^
ZC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\AboutPage.g.csW
SC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\EntryDetailPage.g.i.csU
QC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\EntryDetailPage.g.csW
SC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\GroupDetailPage.g.i.csU
QC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\GroupDetailPage.g.csa
]C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\DonatePage.g.i.cs_
[C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\DonatePage.g.csf
bC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\NewDatabasePage.g.i.csd
`C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\NewDatabasePage.g.csg
cC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\OpenDatabasePage.g.i.cse
aC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\OpenDatabasePage.g.csj
fC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\RecentDatabasesPage.g.i.csh
dC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\RecentDatabasesPage.g.csg
cC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\SaveDatabasePage.g.i.cse
aC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\SaveDatabasePage.g.csT
PC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPage.g.i.csR
NC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPage.g.csb
^C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\WelcomePage.g.i.cs`
\C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\WelcomePage.g.cso
kC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsDatabasePage.g.i.csm
iC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsDatabasePage.g.csr
nC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsNewDatabasePage.g.i.csp
lC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsNewDatabasePage.g.cso
kC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsSecurityPage.g.i.csm
iC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsSecurityPage.g.csn
jC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsWelcomePage.g.i.csl
hC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsWelcomePage.g.cs]
YC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\HamburgerButtonStyle.g.i.cs[
WC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\HamburgerButtonStyle.g.csc
_C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\ListViewLeftIndicatorStyle.g.i.csa
]C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\ListViewLeftIndicatorStyle.g.cs\
XC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\NoBorderButtonStyle.g.i.csZ
VC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\NoBorderButtonStyle.g.csO
KC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\Styles.g.i.csM
IC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\Styles.g.cs_
[C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\TextBoxWithButtonStyle.g.i.cs]
YC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\TextBoxWithButtonStyle.g.csm
iC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\UserControls\HamburgerMenuUserControl.g.i.csk
gC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\UserControls\HamburgerMenuUserControl.g.csL
HC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\XamlTypeInfo.g.csQ
MC:\Users\GBE\AppData\Local\Temp\.NETCore,Version=v4.5.1.AssemblyAttributes.cs

View File

@@ -0,0 +1,180 @@
<EFBFBD>
GC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\ClipboardAction.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=3;2=0;4=0;6=0;8=0;10=0;12=0r
<1A> <17>
KC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\NavigateToUrlAction.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=3;2=0;4=0;6=0;8=0;10=0;12=0r
 !x<01>
<1D>
HC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\SetupFocusAction.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=2;2=1;4=0;6=0;8=0;10=0;12=0r
<1B>
<18>
8C:\Sources\Other\ModernKeePass\ModernKeePass\App.xaml.cs7 8@HR 0=0;5=0;10=0;20=1;30=0;60=0;90=0Z1=5;2=1;4=2;6=1;8=0;10=0;12=0jH*>?@ABFTZ[^`fluvwz|}<7D><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>r<>
 !"#()+,-./023456789:;<CDEFGIJKLNORSUX\]_bdehjmnpqrstxy<79><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>x<10>I !"+-./24579:EFKRX\_bdhmpsx<73><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>
OC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\IntToSymbolConverter.cs7 (08;@;H;R 0=0;5=0;10=0;20=0;30=1;60=0;90=0Z1=0;2=1;4=0;6=0;8=0;10=0;12=1j<31>+,08<@JKLMZ[\]^_`abcdefgjklmnopqrstuvwxyz{|}~<><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03>r[
 !"#$%&'()*-./12345679:;=>?ABCDEFGHINOPQRSUVWXYhi<68><03><03><03><03><03>x<02>?
 !"#$%&'()*-./12345679:;=>?ABCDEFGHINOPQXhi<68><03>
RC:\Sources\Other\ModernKeePass\ModernKeePass\Exceptions\DatabaseOpenedException.cs(0R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r <09>
JC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ILicenseService.cs(08@R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r 
<0C>
RC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IProxyInvocationHandler.cs(0R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r <09>
IC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IRecentService.cs(08@R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r
<0F>
FC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IRecentItem.cs(08@R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r

<0B>
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IResourceService.cs(0R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r<07>
MC:\Sources\Other\ModernKeePass\ModernKeePass\Services\SingletonServiceBase.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=0;8=0;10=0;12=0r

<0C>
<EFBFBD>
`C:\Sources\Other\ModernKeePass\ModernKeePass\TemplateSelectors\SelectableDataTemplateSelector.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=4;2=1;4=0;6=0;8=0;10=0;12=0r
x<02><0F>
OC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\SettingsSaveVm.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=4;2=0;4=0;6=0;8=0;10=0;12=0r
<18>
<15>
TC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\DonatePage.xaml.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=0;8=0;10=0;12=0jr

<0F> <0C>
HC:\Sources\Other\ModernKeePass\ModernKeePass\Services\DatabaseService.csQ (082@2H2R 0=0;5=0;10=0;20=0;30=1;60=0;90=0Z1=25;2=5;4=0;6=2;8=0;10=0;12=0j$cdefghky<6B><01><01><01><01><01><01><01><01><01><01><01><01><01>r<>
 !"#$%')*+,-/0123456789:<=>?@BCDEFHIJKLNOPQRTUVWYZ[]^_`ijlmnopqstuvwz{|}~<><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><02><02><02><02><02>x<16><01>"#'+,1468>?DEJKPQTUY_npstuwz{|<><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><02><02>
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ISettingsService.cs(0R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r<08>
JC:\Sources\Other\ModernKeePass\ModernKeePass\Common\MessageDialogHelper.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=4;2=2;4=0;6=0;8=0;10=0;12=0j 9<DJMPSr?
 !"$%&')*+,-./01234678:=>@ABEFHIKNQTVWXYx<03> "$%+-.028:=BENQTV<54>
GC:\Sources\Other\ModernKeePass\ModernKeePass\Common\NavigationHelper.csD (8>@>H>R 0=0;5=0;10=0;20=0;30=0;60=1;90=0Z1=12;2=8;4=1;6=1;8=0;10=0;12=1j<31> !"#&(*,-./02579:ABCDEFKLMSW`stuvxyz<79><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03>r<>
;<=>?GHINOTUVXYZ[\^abfghiklpq{|}~<><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03>x*<2A><01>?INTUXZ[afhi<69><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><03><03><03>
PC:\Sources\Other\ModernKeePass\ModernKeePass\Common\NotifyPropertyChangedBase.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=2;4=0;6=0;8=0;10=0;12=0r
x<01>
<19>
KC:\Sources\Other\ModernKeePass\ModernKeePass\Common\ObservableDictionary.cs( (08!@&H!R 0=0;5=0;10=0;20=0;30=1;60=0;90=0Z1=18;2=5;4=1;6=0;8=0;10=0;12=0j
r<>
 !"#$&'()*,-./12345679:;<=>?@ACDEFGHIJKLMOPQRSTUVWXYZ\]^_`abcdfghiklmnpqrsuvwxz{|}<><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>x <09>. "().35;=>@FGIJLSWX^_`bhmrw|<7C><01><01><01><01><01><01><01><01>
CC:\Sources\Other\ModernKeePass\ModernKeePass\Common\RelayCommand.cs (8@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=2;2=3;4=0;6=0;8=0;10=0;12=0j%
$%&'(1234567=>?@ABHIJKLr*  !")*+,-./89:;CDEFMNOPQRSTUVx<03>+,-.:EPR<50>
HC:\Sources\Other\ModernKeePass\ModernKeePass\Common\SuspensionManager.cs8 (08@HR 0=0;5=0;10=0;20=1;30=0;60=0;90=0Z1=5;2=3;4=3;6=0;8=0;10=0;12=0j~ !"#)*+,-3456789>HIN\]^_`abcdefmqv<71><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>r<>
$%&'./01:;<=?@ABCDEFJKLOPQRSTUVWXYZghiklnoprstwxyz{|}~<><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><02><02><02><02><02><02><02><02><02><02><02>x<15>S&0?BDLOPRSXinoswz|}<7D><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>
GC:\Sources\Other\ModernKeePass\ModernKeePass\Services\LicenseService.cs (08 @ H R 0=0;5=0;10=1;20=0;30=0;60=0;90=0Z1=5;2=0;4=0;6=1;8=0;10=0;12=0j*+r?
!"#$%&'(),-./012345678:;<=>@ABCEFGHIJx<03>#$&'(),.012346<=BG<42>
FC:\Sources\Other\ModernKeePass\ModernKeePass\Services\RecentService.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=4;2=1;4=0;6=0;8=0;10=0;12=0r,
 !#$%&()*+-./012x<06>
 %*/<2F>
IC:\Sources\Other\ModernKeePass\ModernKeePass\Services\ResourcesService.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=0;8=0;10=0;12=0r
<11>
<0E>
HC:\Sources\Other\ModernKeePass\ModernKeePass\Services\SettingsService.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=1;4=0;6=0;8=0;10=0;12=0r
x<03>
<1C>
NC:\Sources\Other\ModernKeePass\ModernKeePass\Common\ToastNotificationHelper.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=2;2=1;4=0;6=0;8=0;10=0;12=0r0
 !#$%&'(*+,-./123456x<01> %&'(,.3<EFBFBD>
`C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\DiscreteIntToSolidColorBrushConverter.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=1;6=0;8=0;10=0;12=0r
x<01>
<18>
[C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\EmptyStringToVisibilityConverter.cs 8@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=1;4=0;6=0;8=0;10=0;12=0r
x<02> <11>
QC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\NullToBooleanConverter.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=2;2=0;4=0;6=0;8=0;10=0;12=0r
<12>
<0F>
HC:\Sources\Other\ModernKeePass\ModernKeePass\Exceptions\SaveException.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=2;2=0;4=0;6=0;8=0;10=0;12=0r 
<0E> <0B>
SC:\Sources\Other\ModernKeePass\ModernKeePass\Extensions\DispatcherTaskExtensions.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=2;2=0;4=0;6=0;8=0;10=0;12=0jr
 x<03>
<1E>
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IDatabaseService.cs(08@R 0=0;5=0;10=0;20=1;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0jr 
 !"#<23>
OC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IHasSelectableObject.cs(08@R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r<07>
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ISelectableModel.cs(08@R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r<07>
SC:\Sources\Other\ModernKeePass\ModernKeePass\Views\BasePages\LayoutAwarePageBase.cs" (08#@#H#R 0=0;5=0;10=0;20=0;30=1;60=0;90=0Z1=13;2=4;4=1;6=1;8=0;10=0;12=0j\
"#*+,-.456789:;<=>ABFGOWXYZ[\]^ijlmnrstuv|}~<><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>r<>
 $%&()/012?@DEHIJKLMNPQRSTU_`abcdepwxyz<79><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>x<10>1 $%/01DHJPRacy<63><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>
bC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsDatabasePage.xaml.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=0;8=0;10=0;12=0jr

<0F> <0C>
eC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsNewDatabasePage.xaml.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=0;8=0;10=0;12=0jr

<0F> <0C>
^C:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsSavePage.xaml.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=0;8=0;10=0;12=0jr

<0F> <0C>
bC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsSecurityPage.xaml.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=2;2=0;4=0;6=0;8=0;10=0;12=0j
r
<17><14>
aC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsWelcomePage.xaml.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=0;8=0;10=0;12=0jr

<0F> <0C>
_C:\Sources\Other\ModernKeePass\ModernKeePass\TemplateSelectors\FirstItemDataTemplateSelector.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=4;2=1;4=0;6=0;8=0;10=0;12=0r
x<01>
<0F>
LC:\Sources\Other\ModernKeePass\ModernKeePass\Controls\ListViewWithDisable.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=1;4=0;6=0;8=0;10=0;12=0r
x<02> <11>
]C:\Sources\Other\ModernKeePass\ModernKeePass\Views\UserControls\BreadCrumbUserControl.xaml.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=3;2=0;4=0;6=0;8=0;10=0;12=0jr
<1D>
<1B>
_C:\Sources\Other\ModernKeePass\ModernKeePass\Views\UserControls\CompositeKeyUserControl.xaml.cs
(08@HR 0=0;5=0;10=0;20=1;30=0;60=0;90=0Z1=8;2=4;4=0;6=1;8=0;10=0;12=0j `ort
 !"#$%&'()*,-./01234569;<=>@ABCEFGIJKLMNOPQRSTUVWXY[\]^_abcefghijklmpqrsuvwxyz{|~<><01><01><01>x <09>%"#&*./26=GIKLRSUW]_ajkmpqry|~<><01>
JC:\Sources\Other\ModernKeePass\ModernKeePass\Controls\TextBoxWithButton.cs (
0
8 @ H R 0=0;5=0;10=1;20=0;30=0;60=0;90=0Z1=8;2=1;4=0;6=0;8=0;10=0;12=0r@
 !#$%&'()*+,-/0123456789;<=>?@ABCDEx<01>
!%&)-1259=>?A<>
WC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\BooleanToVisibilityConverter.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=0;2=1;4=1;6=0;8=0;10=0;12=0jr
x<04> <18>
PC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\ColorToBrushConverter.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=1;6=0;8=0;10=0;12=0r
x<03>
<17>
[C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\DoubleToSolidColorBrushConverter.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=2;2=0;4=0;6=0;8=0;10=0;12=0r
x<01><1C>
^C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\InverseBooleanToVisibilityConverter.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=0;2=1;4=1;6=0;8=0;10=0;12=0jr
x<04> <18>
QC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\PluralizationConverter.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=1;8=0;10=0;12=0jr
x<04>
<15>
ZC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\ProgressBarLegalValuesConverter.cs
(08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=1;8=0;10=0;12=0r
x<05> <18>
OC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\TextToWidthConverter.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=1;4=0;6=0;8=0;10=0;12=0r
<14>
<11>
HC:\Sources\Other\ModernKeePass\ModernKeePass\Events\PasswordEventArgs.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=3;2=0;4=0;6=0;8=0;10=0;12=0r

<0F> <0C>
EC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IIsEnabled.cs(08@R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r<07>
DC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IPwEntity.cs(08 @ R 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0j "#$r

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,210 @@
sonar.projectKey=ModernKeePass
sonar.working.directory=C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\.sonarqube\\out\\.sonar
sonar.projectBaseDir=C:\\Sources\\Other\\ModernKeePass\\ModernKeePass
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.projectKey=ModernKeePass:A0CFC681-769B-405A-8482-0CDEE595A91F
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.projectName=ModernKeePass.App
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.projectBaseDir=C:\\Sources\\Other\\ModernKeePass\\ModernKeePass
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.sourceEncoding=utf-8
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.sources=\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Actions\\ClipboardAction.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Actions\\NavigateToUrlAction.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Actions\\SetupFocusAction.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\App.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\IntToSymbolConverter.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Exceptions\\DatabaseOpenedException.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\ILicenseService.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\IProxyInvocationHandler.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\IRecentService.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\IRecentItem.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\IResourceService.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Services\\SingletonServiceBase.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\TemplateSelectors\\SelectableDataTemplateSelector.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\Items\\SettingsSaveVm.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\DonatePage.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Services\\DatabaseService.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\ISettingsService.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Common\\MessageDialogHelper.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Common\\NavigationHelper.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Common\\NotifyPropertyChangedBase.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Common\\ObservableDictionary.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Common\\RelayCommand.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Common\\SuspensionManager.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Services\\LicenseService.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Services\\RecentService.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Services\\ResourcesService.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Services\\SettingsService.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Common\\ToastNotificationHelper.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\DiscreteIntToSolidColorBrushConverter.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\EmptyStringToVisibilityConverter.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\NullToBooleanConverter.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Exceptions\\SaveException.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Extensions\\DispatcherTaskExtensions.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\IDatabaseService.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\IHasSelectableObject.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\ISelectableModel.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\BasePages\\LayoutAwarePageBase.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsDatabasePage.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsNewDatabasePage.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsSavePage.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsSecurityPage.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsWelcomePage.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\TemplateSelectors\\FirstItemDataTemplateSelector.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Controls\\ListViewWithDisable.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\UserControls\\BreadCrumbUserControl.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\UserControls\\CompositeKeyUserControl.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Controls\\TextBoxWithButton.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\BooleanToVisibilityConverter.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\ColorToBrushConverter.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\DoubleToSolidColorBrushConverter.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\InverseBooleanToVisibilityConverter.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\PluralizationConverter.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\ProgressBarLegalValuesConverter.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\TextToWidthConverter.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Events\\PasswordEventArgs.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\IIsEnabled.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\IPwEntity.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPage.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\AboutPage.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\NewDatabasePage.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPage.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\WelcomePage.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\AboutVm.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\CompositeKeyVm.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\Items\\ListMenuItemVm.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\Items\\MainMenuItemVm.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\Items\\RecentItemVm.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\EntryDetailPage.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\GroupDetailPage.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\OpenDatabasePage.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\RecentDatabasesPage.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\SaveDatabasePage.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Properties\\AssemblyInfo.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\EntryVm.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\GroupVm.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\Items\\SettingsNewVm.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\SettingsVm.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\MainVm.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\NewVm.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\OpenVm.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\RecentVm.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\SaveVm.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\Items\\SettingsDatabaseVm.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\UserControls\\HamburgerMenuUserControl.xaml.cs",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\description.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\description.Entry.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\description.Filter.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\description.Group.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\description.New.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\description.Open.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\description.Recent.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\description.Semantic.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\description.Settings.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\Entry.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\Filter.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\Group.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\New.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\Open.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\Recent.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\Semantic.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\Settings.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\keywords.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\privacyPolicy.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\releaseNotes.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\websiteUrl.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\description.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\description.Entry.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\description.Filter.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\description.Group.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\description.New.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\description.Open.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\description.Recent.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\description.Semantic.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\description.Settings.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\Entry.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\Filter.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\Group.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\New.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\Open.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\Recent.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\Semantic.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\Settings.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\keywords.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\privacyPolicy.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\releaseNotes.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\websiteUrl.txt",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Logo.scale-100.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Logo.scale-140.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Logo.scale-180.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Logo.scale-80.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SmallLogo.scale-100.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SmallLogo.scale-140.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SmallLogo.scale-180.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SmallLogo.scale-80.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SmallLogo.targetsize-16.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SmallLogo.targetsize-256.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SmallLogo.targetsize-32.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SmallLogo.targetsize-48.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SplashScreen.scale-100.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SplashScreen.scale-140.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SplashScreen.scale-180.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Square310x310Logo.scale-100.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Square310x310Logo.scale-140.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Square310x310Logo.scale-180.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Square310x310Logo.scale-80.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Square70x70Logo.scale-100.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Square70x70Logo.scale-140.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Square70x70Logo.scale-180.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Square70x70Logo.scale-80.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\StoreLogo.scale-100.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\StoreLogo.scale-140.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\StoreLogo.scale-180.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Wide310x150Logo.scale-100.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Wide310x150Logo.scale-140.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Wide310x150Logo.scale-180.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Wide310x150Logo.scale-80.png",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\packages.config",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Strings\\fr-FR\\Resources.resw",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Strings\\fr-FR\\CodeBehind.resw",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Strings\\en-US\\CodeBehind.resw",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Strings\\en-US\\Resources.resw",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Styles\\Colors.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsSavePage.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\UserControls\\BreadCrumbUserControl.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\UserControls\\CompositeKeyUserControl.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPage.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\AboutPage.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\EntryDetailPage.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\GroupDetailPage.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\DonatePage.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\NewDatabasePage.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\OpenDatabasePage.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\RecentDatabasesPage.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\SaveDatabasePage.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPage.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\WelcomePage.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsDatabasePage.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsNewDatabasePage.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsSecurityPage.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsWelcomePage.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Styles\\HamburgerButtonStyle.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Styles\\ListViewLeftIndicatorStyle.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Styles\\NoBorderButtonStyle.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Styles\\Styles.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Styles\\TextBoxWithButtonStyle.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\UserControls\\HamburgerMenuUserControl.xaml",\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\App.xaml"
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.cs.roslyn.reportFilePath=C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\bin\\Debug\\ModernKeePass.exe.RoslynCA.json
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.cs.analyzer.projectOutPath=C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\.sonarqube\\out\\0
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.cs.analyzer.projectOutPaths=\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\.sonarqube\\out\\0"
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.cs.roslyn.reportFilePaths=\
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\bin\\Debug\\ModernKeePass.exe.RoslynCA.json"
sonar.organization=geogeob
sonar.host.url=https://sonarcloud.io
sonar.visualstudio.enable=false
sonar.modules=A0CFC681-769B-405A-8482-0CDEE595A91F

View File

@@ -0,0 +1,3 @@
Analysis succeeded for SonarQube project "", version [Analysis results](https://sonarcloud.io/dashboard/index/ModernKeePass)
- Product projects: 1, test projects: 0
- Invalid projects: 0, skipped projects: 0, excluded projects: 0

View File

@@ -0,0 +1,27 @@
using Windows.ApplicationModel.DataTransfer;
using Windows.UI.Xaml;
using Microsoft.Xaml.Interactivity;
namespace ModernKeePass.Actions
{
public class ClipboardAction : DependencyObject, IAction
{
public string Text
{
get => (string)GetValue(TextProperty);
set => SetValue(TextProperty, value);
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(ClipboardAction), new PropertyMetadata(string.Empty));
public object Execute(object sender, object parameter)
{
if (string.IsNullOrEmpty(Text)) return null;
var dataPackage = new DataPackage { RequestedOperation = DataPackageOperation.Copy };
dataPackage.SetText(Text);
Clipboard.SetContent(dataPackage);
return null;
}
}
}

View File

@@ -0,0 +1,65 @@
using System.Windows.Input;
using Windows.UI.Xaml;
using Autofac;
using Microsoft.Xaml.Interactivity;
using ModernKeePass.Common;
using ModernKeePass.Domain.Entities;
using ModernKeePass.Domain.Interfaces;
namespace ModernKeePass.Actions
{
public class DeleteEntityAction : DependencyObject, IAction
{
private readonly IResourceService _resourceService;
private readonly IDatabaseService _databaseService;
public Entity Entity
{
get => (Entity)GetValue(EntityProperty);
set => SetValue(EntityProperty, value);
}
public static readonly DependencyProperty EntityProperty =
DependencyProperty.Register("Entity", typeof(Entity), typeof(DeleteEntityAction),
new PropertyMetadata(null));
public ICommand Command
{
get => (ICommand)GetValue(CommandProperty);
set => SetValue(CommandProperty, value);
}
public static readonly DependencyProperty CommandProperty =
DependencyProperty.Register("Command", typeof(ICommand), typeof(DeleteEntityAction),
new PropertyMetadata(null));
public DeleteEntityAction(): this(App.Container.Resolve<IResourceService>(), App.Container.Resolve<IDatabaseService>())
{ }
public DeleteEntityAction(IResourceService resourceService, IDatabaseService databaseService)
{
_resourceService = resourceService;
_databaseService = databaseService;
}
public object Execute(object sender, object parameter)
{
var type = Entity is GroupEntity ? "Group" : "Entry";
var message = _databaseService.IsRecycleBinEnabled
? _resourceService.GetResourceValue($"{type}RecyclingConfirmation")
: _resourceService.GetResourceValue($"{type}DeletingConfirmation");
var text = _databaseService.IsRecycleBinEnabled ? _resourceService.GetResourceValue($"{type}Recycled") : _resourceService.GetResourceValue($"{type}Deleted");
MessageDialogHelper.ShowActionDialog(_resourceService.GetResourceValue("EntityDeleteTitle"), message,
_resourceService.GetResourceValue("EntityDeleteActionButton"),
_resourceService.GetResourceValue("EntityDeleteCancelButton"), a =>
{
ToastNotificationHelper.ShowMovedToast(Entity, _resourceService.GetResourceValue("EntityDeleting"), text);
//Entity.MarkForDelete(_resourceService.GetResourceValue("RecycleBinTitle"));
Command.Execute(null);
}, null).GetAwaiter();
return null;
}
}
}

View File

@@ -0,0 +1,33 @@
using System;
using Windows.UI.Xaml;
using Microsoft.Xaml.Interactivity;
using ModernKeePass.Common;
namespace ModernKeePass.Actions
{
public class NavigateToUrlAction : DependencyObject, IAction
{
public string Url
{
get => (string)GetValue(UrlProperty);
set => SetValue(UrlProperty, value);
}
public static readonly DependencyProperty UrlProperty =
DependencyProperty.Register("Url", typeof(string), typeof(NavigateToUrlAction), new PropertyMetadata(string.Empty));
public object Execute(object sender, object parameter)
{
try
{
var uri = new Uri(Url);
return Windows.System.Launcher.LaunchUriAsync(uri).GetAwaiter().GetResult();
}
catch (Exception ex)
{
MessageDialogHelper.ShowErrorDialog(ex).GetAwaiter();
return false;
}
}
}
}

View File

@@ -0,0 +1,27 @@
using System.Threading.Tasks;
using Windows.UI.Core;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Microsoft.Xaml.Interactivity;
namespace ModernKeePass.Actions
{
public class SetupFocusAction : DependencyObject, IAction
{
public Control TargetObject
{
get => (Control)GetValue(TargetObjectProperty);
set => SetValue(TargetObjectProperty, value);
}
public static readonly DependencyProperty TargetObjectProperty =
DependencyProperty.Register("TargetObject", typeof(Control), typeof(SetupFocusAction), new PropertyMetadata(null));
public object Execute(object sender, object parameter)
{
return Task.Factory.StartNew(
() => Dispatcher.RunAsync(CoreDispatcherPriority.Low,
() => TargetObject?.Focus(FocusState.Programmatic)));
}
}
}

View File

@@ -0,0 +1,33 @@
using Windows.UI.Xaml;
using Microsoft.Xaml.Interactivity;
using ModernKeePass.Common;
namespace ModernKeePass.Actions
{
public class ToastAction : DependencyObject, IAction
{
public string Title
{
get => (string)GetValue(TitleProperty);
set => SetValue(TitleProperty, value);
}
public static readonly DependencyProperty TitleProperty =
DependencyProperty.Register("Title", typeof(string), typeof(ToastAction), new PropertyMetadata(string.Empty));
public string Message
{
get => (string)GetValue(MessageProperty);
set => SetValue(MessageProperty, value);
}
public static readonly DependencyProperty MessageProperty =
DependencyProperty.Register("Message", typeof(string), typeof(ToastAction), new PropertyMetadata(string.Empty));
public object Execute(object sender, object parameter)
{
ToastNotificationHelper.ShowGenericToast(Title, Message);
return null;
}
}
}

20
ModernKeePass10/App.xaml Normal file
View File

@@ -0,0 +1,20 @@
<Application
x:Class="ModernKeePass.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
RequestedTheme="Light">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls"/>
<ResourceDictionary Source="ResourceDictionaries/MasterDetailsView.xaml" />
<!--<ResourceDictionary Source="ResourceDictionaries/TextBoxWithButtonStyle.xaml" />-->
<ResourceDictionary Source="ResourceDictionaries/HamburgerButtonStyle.xaml" />
<ResourceDictionary Source="ResourceDictionaries/ListViewLeftIndicatorStyle.xaml" />
<ResourceDictionary Source="ResourceDictionaries/NoBorderButtonStyle.xaml" />
<ResourceDictionary Source="ResourceDictionaries/NoBorderToggleButtonStyle.xaml" />
<ResourceDictionary Source="ResourceDictionaries/Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>

221
ModernKeePass10/App.xaml.cs Normal file
View File

@@ -0,0 +1,221 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Threading.Tasks;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.Storage;
using Windows.Storage.AccessCache;
using Windows.Storage.Pickers;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
using UnhandledExceptionEventArgs = Windows.UI.Xaml.UnhandledExceptionEventArgs;
using Autofac;
using Microsoft.AppCenter;
using Microsoft.AppCenter.Analytics;
using ModernKeePass.Common;
using ModernKeePass.Composition;
using ModernKeePass.Domain.Dtos;
using ModernKeePass.Domain.Exceptions;
using ModernKeePass.Domain.Interfaces;
using ModernKeePass.Views;
// The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=234227
namespace ModernKeePass
{
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
sealed partial class App
{
private readonly IDatabaseService _databaseService;
public static IContainer Container { get; set; }
/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
AppCenter.Start("79d23520-a486-4f63-af81-8d90bf4e1bea", typeof(Analytics));
InitializeComponent();
Suspending += OnSuspending;
Resuming += OnResuming;
UnhandledException += OnUnhandledException;
// Setup DI
var builder = new ContainerBuilder();
builder.RegisterModule<SharedCompositionRoot>();
builder.RegisterModule<UwpCompositionRoot>();
Container = builder.Build();
_databaseService = Container.Resolve<IDatabaseService>();
}
#region Event Handlers
// TODO: do something else here instead of showing dialog and handle save issues directly where it happens
private async void OnUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs)
{
// Save the argument exception because it's cleared on first access
var exception = unhandledExceptionEventArgs.Exception;
var realException =
exception is TargetInvocationException &&
exception.InnerException != null
? exception.InnerException
: exception;
var resource = Container.Resolve<IResourceService>();
if (realException is SaveException)
{
unhandledExceptionEventArgs.Handled = true;
await MessageDialogHelper.ShowActionDialog(resource.GetResourceValue("MessageDialogSaveErrorTitle"),
realException.InnerException.Message,
resource.GetResourceValue("MessageDialogSaveErrorButtonSaveAs"),
resource.GetResourceValue("MessageDialogSaveErrorButtonDiscard"),
async command =>
{
var savePicker = new FileSavePicker
{
SuggestedStartLocation = PickerLocationId.DocumentsLibrary,
SuggestedFileName = $"{_databaseService.Name} - copy"
};
savePicker.FileTypeChoices.Add(resource.GetResourceValue("MessageDialogSaveErrorFileTypeDesc"),
new List<string> {".kdbx"});
var file = await savePicker.PickSaveFileAsync();
var token = StorageApplicationPermissions.FutureAccessList.Add(file);
var fileInfo = new FileInfo
{
Path = token,
Name = file.DisplayName
};
await _databaseService.SaveAs(fileInfo);
}, null);
}
}
/// <summary>
/// Invoked when the application is launched normally by the end user. Other entry points
/// will be used such as when the application is launched to open a specific file.
/// </summary>
/// <param name="args">Details about the launch request and process.</param>
protected override async void OnLaunched(LaunchActivatedEventArgs args)
{
await OnLaunchOrActivated(args);
}
protected override async void OnActivated(IActivatedEventArgs args)
{
await OnLaunchOrActivated(args);
}
private async Task OnLaunchOrActivated(IActivatedEventArgs e)
{
// Do not repeat app initialization when the Window already has content,
// just ensure that the window is active
if (!(Window.Current.Content is Frame rootFrame))
{
// Create a Frame to act as the navigation context and navigate to the first page
rootFrame = new Frame();
// Set the default language
rootFrame.NavigationFailed += OnNavigationFailed;
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
// Load state from previously terminated application
await SuspensionManager.RestoreAsync();
#if DEBUG
await MessageDialogHelper.ShowNotificationDialog("App terminated", "Windows or an error made the app terminate");
#endif
}
// Place the frame in the current Window
Window.Current.Content = rootFrame;
}
if (e is LaunchActivatedEventArgs lauchActivatedEventArgs && rootFrame.Content == null)
{
rootFrame.Navigate(typeof(MainPage10), lauchActivatedEventArgs.Arguments);
}
// Ensure the current window is active
Window.Current.Activate();
}
private void OnResuming(object sender, object e)
{
var currentFrame = Window.Current.Content as Frame;
try
{
//_databaseService.ReOpen();
#if DEBUG
ToastNotificationHelper.ShowGenericToast(_databaseService.Name, "Database reopened (changes were saved)");
#endif
}
catch (Exception)
{
currentFrame?.Navigate(typeof(MainPage10));
#if DEBUG
ToastNotificationHelper.ShowGenericToast("App resumed", "Nothing to do, no previous database opened");
#endif
}
}
/// <summary>
/// Invoked when Navigation to a certain page fails
/// </summary>
/// <param name="sender">The Frame which failed navigation</param>
/// <param name="e">Details about the navigation failure</param>
private void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
{
throw new NavigationException(e.SourcePageType);
}
/// <summary>
/// Invoked when application execution is being suspended. Application state is saved
/// without knowing whether the application will be terminated or resumed with the contents
/// of memory still intact.
/// </summary>
/// <param name="sender">The source of the suspend request.</param>
/// <param name="e">Details about the suspend request.</param>
private async void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
var settings = Container.Resolve<ISettingsService>();
try
{
// TODO: definitely do something about this to avoid DB corruption if app closes before save has completed
if (settings.GetSetting("SaveSuspend", true)) await _databaseService.Save();
_databaseService.Close();
}
catch (Exception exception)
{
ToastNotificationHelper.ShowErrorToast(exception);
}
await SuspensionManager.SaveAsync();
deferral.Complete();
}
/// <summary>
/// Invoked when application is launched from opening a file in Windows Explorer
/// </summary>
/// <param name="args">Details about the file being opened</param>
protected override void OnFileActivated(FileActivatedEventArgs args)
{
base.OnFileActivated(args);
var rootFrame = new Frame();
rootFrame.Navigate(typeof(MainPage10), args.Files[0] as StorageFile);
Window.Current.Content = rootFrame;
Window.Current.Activate();
}
#endregion
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 700 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 907 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Some files were not shown because too many files have changed in this diff Show More