diff --git a/ModernKeePass.Application/Application.csproj b/ModernKeePass.Application/Application.csproj index e32898d..1b819ed 100644 --- a/ModernKeePass.Application/Application.csproj +++ b/ModernKeePass.Application/Application.csproj @@ -39,7 +39,6 @@ - diff --git a/ModernKeePass.Application/ApplicationModule.cs b/ModernKeePass.Application/ApplicationModule.cs deleted file mode 100644 index b891e03..0000000 --- a/ModernKeePass.Application/ApplicationModule.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Reflection; -using Autofac; -using AutoMapper; -using MediatR; -using ModernKeePass.Application.Common.Mappings; -using Module = Autofac.Module; - -namespace ModernKeePass.Application -{ - public class ApplicationModule: Module - { - protected override void Load(ContainerBuilder builder) - { - // Register Automapper profiles - builder.RegisterType().As(); - - // Register Mediatr - builder - .RegisterType() - .As() - .InstancePerLifetimeScope(); - - // request & notification handlers - builder.Register(context => - { - var c = context.Resolve(); - return t => c.Resolve(t); - }); - builder.RegisterAssemblyTypes(typeof(ApplicationModule).GetTypeInfo().Assembly).AsImplementedInterfaces(); - } - } -} \ No newline at end of file diff --git a/ModernKeePass.Application/Common/Interfaces/IEntityVm.cs b/ModernKeePass.Application/Common/Interfaces/IEntityVm.cs index f221062..d334bd7 100644 --- a/ModernKeePass.Application/Common/Interfaces/IEntityVm.cs +++ b/ModernKeePass.Application/Common/Interfaces/IEntityVm.cs @@ -1,4 +1,6 @@ -using ModernKeePass.Domain.Enums; +using System.Collections.Generic; +using ModernKeePass.Application.Group.Models; +using ModernKeePass.Domain.Enums; namespace ModernKeePass.Application.Common.Interfaces { @@ -7,5 +9,7 @@ namespace ModernKeePass.Application.Common.Interfaces string Id { get; set; } string Title { get; set; } Icon Icon { get; set; } + List Breadcrumb { get; } + GroupVm ParentGroup { get; set; } } } \ No newline at end of file diff --git a/ModernKeePass.Application/Database/Queries/OpenDatabase/OpenDatabaseQuery.cs b/ModernKeePass.Application/Database/Queries/OpenDatabase/OpenDatabaseQuery.cs index 7715553..daa5bf8 100644 --- a/ModernKeePass.Application/Database/Queries/OpenDatabase/OpenDatabaseQuery.cs +++ b/ModernKeePass.Application/Database/Queries/OpenDatabase/OpenDatabaseQuery.cs @@ -1,9 +1,12 @@ -using System.Threading.Tasks; +using System.Linq; +using System.Threading.Tasks; using AutoMapper; using MediatR; using ModernKeePass.Application.Common.Interfaces; +using ModernKeePass.Application.Entry.Models; using ModernKeePass.Application.Group.Models; using ModernKeePass.Domain.Dtos; +using ModernKeePass.Domain.Entities; using ModernKeePass.Domain.Exceptions; namespace ModernKeePass.Application.Database.Queries.OpenDatabase @@ -39,7 +42,29 @@ namespace ModernKeePass.Application.Database.Queries.OpenDatabase KeyFilePath = request.KeyFilePath, Password = request.Password }); - return _mapper.Map(rootGroup); + return BuildHierarchy(null, rootGroup); + } + + private GroupVm BuildHierarchy(GroupVm parentGroup, GroupEntity groupEntity) + { + var groupVm = _mapper.Map(groupEntity); + groupVm.ParentGroup = parentGroup; + if (parentGroup != null) + { + groupVm.Breadcrumb.AddRange(parentGroup.Breadcrumb); + groupVm.Breadcrumb.Add(parentGroup); + } + groupVm.Entries = groupEntity.Entries.Select(e => + { + var entry = _mapper.Map(e); + entry.ParentGroup = groupVm; + entry.Breadcrumb.AddRange(groupVm.Breadcrumb); + entry.Breadcrumb.Add(groupVm); + return entry; + }).OrderBy(e => e.Title).ToList(); + groupVm.SubGroups = groupEntity.SubGroups.Select(g => BuildHierarchy(groupVm, g)).ToList(); + + return groupVm; } } } diff --git a/ModernKeePass.Application/Entry/Models/EntryVm.cs b/ModernKeePass.Application/Entry/Models/EntryVm.cs index e07deb5..e6bdac5 100644 --- a/ModernKeePass.Application/Entry/Models/EntryVm.cs +++ b/ModernKeePass.Application/Entry/Models/EntryVm.cs @@ -13,6 +13,7 @@ namespace ModernKeePass.Application.Entry.Models public class EntryVm: IEntityVm, IMapFrom { public GroupVm ParentGroup { get; set; } + public List Breadcrumb { get; } = new List(); public string Id { get; set; } public string Title { get; set; } public string Username { get; set; } @@ -24,14 +25,19 @@ namespace ModernKeePass.Application.Entry.Models public Icon Icon { get; set; } public Color ForegroundColor { get; set; } public Color BackgroundColor { get; set; } - public bool HasExpirationDate { get; internal set; } - public DateTimeOffset ExpirationDate { get; internal set; } - public DateTimeOffset ModificationDate { get; internal set; } + public bool HasExpirationDate { get; set; } + public DateTimeOffset ExpirationDate { get; set; } + public DateTimeOffset ModificationDate { get; set; } + + public override string ToString() + { + return ModificationDate.ToString("g"); + } public void Mapping(Profile profile) { profile.CreateMap() - .ForMember(d => d.ParentGroup, opts => opts.MapFrom(s => s.Parent)) + //.ForMember(d => d.ParentGroup, opts => opts.MapFrom(s => s.Parent)) .ForMember(d => d.Id, opts => opts.MapFrom(s => s.Id)) .ForMember(d => d.Title, opts => opts.MapFrom(s => s.Name)) .ForMember(d => d.Username, opts => opts.MapFrom(s => s.UserName)) diff --git a/ModernKeePass.Application/Group/Models/GroupVm.cs b/ModernKeePass.Application/Group/Models/GroupVm.cs index e99ff1f..8871267 100644 --- a/ModernKeePass.Application/Group/Models/GroupVm.cs +++ b/ModernKeePass.Application/Group/Models/GroupVm.cs @@ -16,10 +16,11 @@ namespace ModernKeePass.Application.Group.Models public string Id { get; set; } public string Title { get; set; } public Icon Icon { get; set; } + public List Breadcrumb { get; } = new List(); public List SubGroups { get; set; } public List Entries { get; set; } public bool IsSelected { get; set; } - + public override string ToString() { return Title; @@ -28,12 +29,12 @@ namespace ModernKeePass.Application.Group.Models public void Mapping(Profile profile) { profile.CreateMap() - .ForMember(d => d.ParentGroup, opts => opts.MapFrom(s => s.Parent)) + //.ForMember(d => d.ParentGroup, opts => opts.MapFrom(s => s.Parent)) .ForMember(d => d.Id, opts => opts.MapFrom(s => s.Id)) .ForMember(d => d.Title, opts => opts.MapFrom(s => s.Name)) - .ForMember(d => d.Icon, opts => opts.MapFrom(s => s.Icon)) - .ForMember(d => d.Entries, opts => opts.MapFrom(s => s.Entries.OrderBy(e => e.Name))) - .ForMember(d => d.SubGroups, opts => opts.MapFrom(s => s.SubGroups)); + .ForMember(d => d.Icon, opts => opts.MapFrom(s => s.Icon)); + //.ForMember(d => d.Entries, opts => opts.MapFrom(s => s.Entries.OrderBy(e => e.Name))) + //.ForMember(d => d.SubGroups, opts => opts.MapFrom(s => s.SubGroups)); } } diff --git a/ModernKeePass.Application/project.json b/ModernKeePass.Application/project.json index 9661f58..193b228 100644 --- a/ModernKeePass.Application/project.json +++ b/ModernKeePass.Application/project.json @@ -1,10 +1,7 @@ { "supports": {}, "dependencies": { - "Autofac": "4.9.4", - "Autofac.Extensions.DependencyInjection": "4.4.0", - "AutoMapper": "6.0.2", - "AutoMapper.Extensions.Microsoft.DependencyInjection": "2.0.1", + "AutoMapper": "5.2.0", "FluentValidation": "8.6.2", "MediatR": "3.0.1", "MediatR.Extensions.Microsoft.DependencyInjection": "2.0.0", diff --git a/ModernKeePass.Domain/Entities/BaseEntity.cs b/ModernKeePass.Domain/Entities/BaseEntity.cs index 367dd62..dd1cb8f 100644 --- a/ModernKeePass.Domain/Entities/BaseEntity.cs +++ b/ModernKeePass.Domain/Entities/BaseEntity.cs @@ -7,6 +7,7 @@ namespace ModernKeePass.Domain.Entities public string Id { get; set; } public string Name { get; set; } public GroupEntity Parent { get; set; } + public string ParentId { get; set; } public DateTimeOffset LastModificationDate { get; set; } } } \ No newline at end of file diff --git a/ModernKeePass.Infrastructure/Infrastructure.csproj b/ModernKeePass.Infrastructure/Infrastructure.csproj index 1a05db5..722cc20 100644 --- a/ModernKeePass.Infrastructure/Infrastructure.csproj +++ b/ModernKeePass.Infrastructure/Infrastructure.csproj @@ -42,7 +42,6 @@ - diff --git a/ModernKeePass.Infrastructure/InfrastructureModule.cs b/ModernKeePass.Infrastructure/InfrastructureModule.cs deleted file mode 100644 index c479d57..0000000 --- a/ModernKeePass.Infrastructure/InfrastructureModule.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Autofac; -using AutoMapper; -using ModernKeePass.Application.Common.Interfaces; -using ModernKeePass.Infrastructure.KeePass; -using ModernKeePass.Infrastructure.UWP; - -namespace ModernKeePass.Infrastructure -{ - public class InfrastructureModule: Module - { - protected override void Load(ContainerBuilder builder) - { - builder.RegisterType().As().SingleInstance(); - builder.RegisterType().As().SingleInstance(); - builder.RegisterType().As(); - builder.RegisterType().As(); - builder.RegisterType().As(); - builder.RegisterType().As(); - builder.RegisterType().As(); - - // Register Automapper profiles - builder.RegisterType().As(); - } - } -} \ No newline at end of file diff --git a/ModernKeePass.Infrastructure/KeePass/EntryMappingProfile.cs b/ModernKeePass.Infrastructure/KeePass/EntryMappingProfile.cs index 123e2bc..bcb03a1 100644 --- a/ModernKeePass.Infrastructure/KeePass/EntryMappingProfile.cs +++ b/ModernKeePass.Infrastructure/KeePass/EntryMappingProfile.cs @@ -19,7 +19,7 @@ namespace ModernKeePass.Infrastructure.KeePass { Uri url; CreateMap() - //.ForMember(dest => dest.Parent, opt => opt.MapFrom(src => src.ParentGroup)) + .ForMember(dest => dest.ParentId, opt => opt.MapFrom(src => src.ParentGroup.Uuid.ToHexString())) .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Uuid.ToHexString())) .ForMember(dest => dest.Name, opt => opt.MapFrom(src => GetEntryValue(src, PwDefs.TitleField))) .ForMember(dest => dest.UserName, opt => opt.MapFrom(src => GetEntryValue(src, PwDefs.UserNameField))) @@ -38,7 +38,6 @@ namespace ModernKeePass.Infrastructure.KeePass .ForMember(dest => dest.AdditionalFields, opt => opt.MapFrom(src => src.Strings.Where(s => !PwDefs.GetStandardFields().Contains(s.Key)).ToDictionary(s => s.Key, s => GetEntryValue(src, s.Key)))) .ForMember(dest => dest.LastModificationDate, opt => opt.MapFrom(src => new DateTimeOffset(src.LastModificationTime))); - //.MaxDepth(1); } private void FromModelToDto() diff --git a/ModernKeePass.Infrastructure/KeePass/GroupMappingProfile.cs b/ModernKeePass.Infrastructure/KeePass/GroupMappingProfile.cs index 04d6efa..2abe23f 100644 --- a/ModernKeePass.Infrastructure/KeePass/GroupMappingProfile.cs +++ b/ModernKeePass.Infrastructure/KeePass/GroupMappingProfile.cs @@ -15,14 +15,13 @@ namespace ModernKeePass.Infrastructure.KeePass private void FromDtoToModel() { CreateMap() - //.ForMember(d => d.Parent, opts => opts.MapFrom(s => s.ParentGroup)) + .ForMember(d => d.ParentId, opts => opts.MapFrom(s => s.ParentGroup.Uuid.ToHexString())) .ForMember(d => d.Id, opts => opts.MapFrom(s => s.Uuid.ToHexString())) .ForMember(d => d.Name, opts => opts.MapFrom(s => s.Name)) .ForMember(d => d.Icon, opts => opts.MapFrom(s => IconMapper.MapPwIconToIcon(s.IconId))) - .ForMember(d => d.LastModificationDate, opts => opts.MapFrom(s => s.LastModificationTime)) - .ForMember(d => d.Entries, opts => opts.MapFrom(s => s.Entries)) - .ForMember(d => d.SubGroups, opts => opts.MapFrom(s => s.Groups)); - //.MaxDepth(1); + .ForMember(d => d.LastModificationDate, opts => opts.MapFrom(s => s.LastModificationTime)); + //.ForMember(d => d.Entries, opts => opts.MapFrom(s => s.Entries)) + //.ForMember(d => d.SubGroups, opts => opts.MapFrom(s => s.Groups)); } private void FromModelToDto() diff --git a/ModernKeePass.Infrastructure/KeePass/KeePassDatabaseClient.cs b/ModernKeePass.Infrastructure/KeePass/KeePassDatabaseClient.cs index 1ad1935..63527c9 100644 --- a/ModernKeePass.Infrastructure/KeePass/KeePassDatabaseClient.cs +++ b/ModernKeePass.Infrastructure/KeePass/KeePassDatabaseClient.cs @@ -95,7 +95,7 @@ namespace ModernKeePass.Infrastructure.KeePass _credentials = credentials; _fileAccessToken = fileInfo.Path; - RootGroup = _mapper.Map(_pwDatabase.RootGroup); + RootGroup = BuildHierarchy(null, _pwDatabase.RootGroup); return RootGroup; } catch (InvalidCompositeKeyException ex) @@ -125,7 +125,7 @@ namespace ModernKeePass.Infrastructure.KeePass _fileAccessToken = fileInfo.Path; - RootGroup = _mapper.Map(_pwDatabase.RootGroup); + RootGroup = BuildHierarchy(null, _pwDatabase.RootGroup); return RootGroup; } @@ -337,7 +337,29 @@ namespace ModernKeePass.Infrastructure.KeePass var fileContents = await _fileService.OpenBinaryFile(fileInfo.Path); return IOConnectionInfo.FromByteArray(fileContents); } - + private GroupEntity BuildHierarchy(GroupEntity parentGroup, PwGroup pwGroup) + { + var group = _mapper.Map(pwGroup); + group.Parent = parentGroup; + group.Entries = pwGroup.Entries.Select(e => + { + var entry = _mapper.Map(e); + entry.Parent = group; + return entry; + }).ToList(); + group.SubGroups = pwGroup.Groups.Select(g => BuildHierarchy(group, g)).ToList(); + + /*var group = new GroupEntity + { + Id = pwGroup.Uuid.ToHexString(), + Name = pwGroup.Name, + Icon = IconMapper.MapPwIconToIcon(pwGroup.IconId), + Entries = pwGroup.Entries.Select(e => _mapper.Map(e)).ToList(), + SubGroups = pwGroup.Groups.Select(BuildHierarchy).ToList() + };*/ + return group; + } + private PwUuid BuildIdFromString(string id) { return new PwUuid(MemUtil.HexStringToByteArray(id)); diff --git a/ModernKeePass.Infrastructure/project.json b/ModernKeePass.Infrastructure/project.json index 28259f4..1236a05 100644 --- a/ModernKeePass.Infrastructure/project.json +++ b/ModernKeePass.Infrastructure/project.json @@ -1,8 +1,7 @@ { "supports": {}, "dependencies": { - "AutoMapper": "6.0.2", - "AutoMapper.Extensions.Microsoft.DependencyInjection": "2.0.1", + "AutoMapper": "5.2.0", "Microsoft.NETCore.Portable.Compatibility": "1.0.1", "ModernKeePassLib": "2.44.2", "NETStandard.Library": "2.0.3" diff --git a/ModernKeePass.KeePassDatabaseTests/KeePassDatabaseClientTests.cs b/ModernKeePass.KeePassDatabaseTests/KeePassDatabaseClientTests.cs index d20f3e4..03a23ca 100644 --- a/ModernKeePass.KeePassDatabaseTests/KeePassDatabaseClientTests.cs +++ b/ModernKeePass.KeePassDatabaseTests/KeePassDatabaseClientTests.cs @@ -3,7 +3,6 @@ using System.Linq; using System.Threading.Tasks; using AutoMapper; using ModernKeePass.Application.Common.Interfaces; -using ModernKeePass.Application.Services; using ModernKeePass.Domain.Dtos; using ModernKeePass.Domain.Entities; using ModernKeePass.Domain.Interfaces; @@ -27,7 +26,7 @@ namespace ModernKeePass.KeePassDatabaseTests [SetUp] public void SetUp() { - var settingsService = Substitute.For(); + var dateTime = Substitute.For(); var fileProxy = Substitute.For(); fileProxy.OpenBinaryFile(Arg.Any()).Returns(async parameters => { @@ -42,9 +41,8 @@ namespace ModernKeePass.KeePassDatabaseTests var contents = (byte[]) parameters[1]; await stream.WriteAsync(contents, 0, contents.Length); }); - var fileService = new FileService(fileProxy); var mapper = new Mapper(new MapperConfiguration(cfg => { cfg.AddProfile(typeof(EntryMappingProfile)); })); - _database = new KeePassDatabaseClient(settingsService, fileService, mapper); + _database = new KeePassDatabaseClient(fileProxy, mapper, dateTime); } [TearDown] @@ -57,12 +55,12 @@ namespace ModernKeePass.KeePassDatabaseTests [Test] public async Task TestOpen() { - var FileInfo = new FileInfo + var fileInfo = new FileInfo { Path = Path.Combine(Directory.GetCurrentDirectory(), "Data", "TestDatabase.kdbx") }; - var rootGroup = await _database.Open(FileInfo, _credentials); + var rootGroup = await _database.Open(fileInfo, _credentials); Assert.That(rootGroup.Name, Is.EqualTo("TestDatabase")); Assert.That(rootGroup.Entries.Count(), Is.EqualTo(2)); } @@ -95,7 +93,7 @@ namespace ModernKeePass.KeePassDatabaseTests }; await _database.Open(originalFileInfo, _credentials); - await _database.SaveDatabase(_fileInfo); + await _database.SaveDatabase(_fileInfo.Path); _database.CloseDatabase(); Assert.DoesNotThrowAsync(async () => { await _database.Open(_fileInfo, _credentials); }); @@ -115,8 +113,8 @@ namespace ModernKeePass.KeePassDatabaseTests var newGroup = new GroupEntity {Name = "New Group Test"}; var rootGroup = await _database.Open(originalFileInfo, _credentials); - await _database.AddEntity(rootGroup, newGroup); - await _database.SaveDatabase(_fileInfo); + await _database.AddGroup(rootGroup.Id, newGroup.Id); + await _database.SaveDatabase(_fileInfo.Path); _database.CloseDatabase(); rootGroup = await _database.Open(_fileInfo, _credentials); @@ -142,8 +140,8 @@ namespace ModernKeePass.KeePassDatabaseTests }; var rootGroup = await _database.Open(originalFileInfo, _credentials); - await _database.AddEntity(rootGroup, newEntry); - await _database.SaveDatabase(_fileInfo); + await _database.AddEntry(rootGroup.Id, newEntry.Id); + await _database.SaveDatabase(_fileInfo.Path); _database.CloseDatabase(); rootGroup = await _database.Open(_fileInfo, _credentials); diff --git a/ModernKeePass/ViewModels/EntryVm.cs b/ModernKeePass/ViewModels/EntryVm.cs index cd0f944..09c6a1e 100644 --- a/ModernKeePass/ViewModels/EntryVm.cs +++ b/ModernKeePass/ViewModels/EntryVm.cs @@ -16,9 +16,9 @@ using ModernKeePass.Application.Group.Commands.RemoveEntry; using ModernKeePass.Application.Security.Commands.GeneratePassword; using ModernKeePass.Application.Security.Queries.EstimatePasswordComplexity; using ModernKeePass.Common; +using ModernKeePass.Domain.Enums; using ModernKeePass.Domain.Interfaces; using ModernKeePass.Interfaces; -using ModernKeePass.Services; namespace ModernKeePass.ViewModels { @@ -38,21 +38,7 @@ namespace ModernKeePass.ViewModels public string CustomChars { get; set; } = string.Empty; public string Id => _entry.Id; - public IEnumerable BreadCrumb - { - get - { - var groups = new Stack(); - var group = _entry.ParentGroup; - while (group.ParentGroup != null) - { - group = group.ParentGroup; - groups.Push(group); - } - - return groups; - } - } + public IEnumerable BreadCrumb => _entry.Breadcrumb; /// /// Determines if the Entry is current or from history @@ -72,14 +58,21 @@ namespace ModernKeePass.ViewModels public string Title { get { return _entry.Title; } - set { _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = nameof(Title), FieldValue = value}); } + set + { + _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = nameof(Title), FieldValue = value}).Wait(); + _entry.Title = value; + } } - public string UserName { get { return _entry.Username; } - set { _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = nameof(UserName), FieldValue = value }); } + set + { + _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = nameof(UserName), FieldValue = value }).Wait(); + _entry.Username = value; + } } public string Password @@ -87,7 +80,8 @@ namespace ModernKeePass.ViewModels get { return _entry.Password; } set { - _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = nameof(Password), FieldValue = value }); + _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = nameof(Password), FieldValue = value }).Wait(); + _entry.Password = value; OnPropertyChanged(); OnPropertyChanged(nameof(PasswordComplexityIndicator)); } @@ -95,14 +89,22 @@ namespace ModernKeePass.ViewModels public string Url { - get { return _entry.Url.ToString();} - set { _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = nameof(Url), FieldValue = value }); } + get { return _entry.Url?.ToString(); } + set + { + _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = nameof(Url), FieldValue = value }).Wait(); + _entry.Url = new Uri(value); + } } public string Notes { get { return _entry.Notes; } - set { _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = nameof(Notes), FieldValue = value }); } + set + { + _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = nameof(Notes), FieldValue = value }).Wait(); + _entry.Notes = value; + } } public Symbol Icon @@ -112,7 +114,11 @@ namespace ModernKeePass.ViewModels if (HasExpired) return Symbol.ReportHacked; return (Symbol) _entry.Icon; } - set { _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = nameof(Icon), FieldValue = value }); } + set + { + _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = nameof(Icon), FieldValue = value }).Wait(); + _entry.Icon = (Icon)value; + } } public DateTimeOffset ExpiryDate @@ -121,7 +127,8 @@ namespace ModernKeePass.ViewModels set { if (!HasExpirationDate) return; - _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = "ExpirationDate", FieldValue = value.Date }); + _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = "ExpirationDate", FieldValue = value.Date }).Wait(); + _entry.ExpirationDate = value.Date; } } @@ -131,9 +138,48 @@ namespace ModernKeePass.ViewModels set { if (!HasExpirationDate) return; - _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = "ExpirationDate", FieldValue = ExpiryDate.Date.Add(value) }); + _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = "ExpirationDate", FieldValue = ExpiryDate.Date.Add(value) }).Wait(); + _entry.ExpirationDate = _entry.ExpirationDate.Date.Add(value); } } + + public bool HasExpirationDate + { + get { return _entry.HasExpirationDate; } + set + { + _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = nameof(HasExpirationDate), FieldValue = value }).Wait(); + _entry.HasExpirationDate = value; + OnPropertyChanged(); + } + } + + public Color? BackgroundColor + { + get { return _entry?.BackgroundColor; } + set + { + if (value != null) + { + _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = nameof(BackgroundColor), FieldValue = value }).Wait(); + _entry.BackgroundColor = (Color)value; + } + } + } + + public Color? ForegroundColor + { + get { return _entry?.ForegroundColor; } + set + { + if (value != null) + { + _mediator.Send(new SetFieldValueCommand { EntryId = Id, FieldName = nameof(ForegroundColor), FieldValue = value }).Wait(); + _entry.ForegroundColor = (Color)value; + } + } + } + public IEnumerable History => _entry.History; public bool IsEditMode { @@ -164,36 +210,6 @@ namespace ModernKeePass.ViewModels OnPropertyChanged(); } } - public bool HasExpirationDate - { - get { return _entry.HasExpirationDate; } - set - { - _mediator.Send(new SetFieldValueCommand {EntryId = Id, FieldName = nameof(HasExpirationDate), FieldValue = value}); - OnPropertyChanged(); - } - } - - public IEnumerable History => _entry.History; - - - public Color? BackgroundColor - { - get { return _entry?.BackgroundColor; } - set - { - if (value != null) _entry.BackgroundColor = (Color) value; - } - } - - public Color? ForegroundColor - { - get { return _entry?.ForegroundColor; } - set - { - if (value != null) _entry.ForegroundColor = (Color)value; - } - } public bool CanRestore => _entry.ParentGroup == _database.RecycleBin; @@ -203,7 +219,6 @@ namespace ModernKeePass.ViewModels private readonly Application.Entry.Models.EntryVm _entry; private readonly IMediator _mediator; - private readonly IResourceService _resource; private readonly DatabaseVm _database; private bool _isEditMode; private bool _isRevealPassword; @@ -212,13 +227,12 @@ namespace ModernKeePass.ViewModels public EntryVm() { } - internal EntryVm(Application.Entry.Models.EntryVm entry, bool isNewEntry = false) : this(entry, App.Mediator, new ResourcesService(), isNewEntry) { } + internal EntryVm(Application.Entry.Models.EntryVm entry, bool isNewEntry = false) : this(entry, App.Mediator, isNewEntry) { } - public EntryVm(Application.Entry.Models.EntryVm entry, IMediator mediator, IResourceService resource, bool isNewEntry = false) + public EntryVm(Application.Entry.Models.EntryVm entry, IMediator mediator, bool isNewEntry = false) { _entry = entry; _mediator = mediator; - _resource = resource; _database = _mediator.Send(new GetDatabaseQuery()).GetAwaiter().GetResult(); _isEditMode = isNewEntry; if (isNewEntry) GeneratePassword().GetAwaiter().GetResult(); @@ -246,7 +260,6 @@ namespace ModernKeePass.ViewModels OnPropertyChanged(nameof(IsRevealPasswordEnabled)); } - public async Task MarkForDelete(string recycleBinTitle) { if (_database.IsRecycleBinEnabled && _database.RecycleBin == null) @@ -274,12 +287,5 @@ namespace ModernKeePass.ViewModels { return _entry; } - - public override string ToString() - { - return IsSelected ? - _resource.GetResourceValue("EntryCurrent") : - _entry.ModificationDate.ToString("g"); - } } } diff --git a/ModernKeePass/ViewModels/GroupVm.cs b/ModernKeePass/ViewModels/GroupVm.cs index 78cb14a..9142f68 100644 --- a/ModernKeePass/ViewModels/GroupVm.cs +++ b/ModernKeePass/ViewModels/GroupVm.cs @@ -103,21 +103,7 @@ namespace ModernKeePass.ViewModels set { SetProperty(ref _isMenuClosed, value); } } - public IEnumerable BreadCrumb - { - get - { - var groups = new Stack(); - var group = _group; - while (group.ParentGroup != null) - { - group = group.ParentGroup; - groups.Push(group); - } - - return groups; - } - } + public IEnumerable BreadCrumb => _group.Breadcrumb; public ICommand SaveCommand { get; } public ICommand SortEntriesCommand { get; } @@ -209,11 +195,6 @@ namespace ModernKeePass.ViewModels { await _mediator.Send(new DeleteGroupCommand { Group = _group }); } - - public override string ToString() - { - return Title; - } private async Task SortEntriesAsync() { diff --git a/ModernKeePass/ViewModels/Items/SettingsDatabaseVm.cs b/ModernKeePass/ViewModels/Items/SettingsDatabaseVm.cs index ba50b05..230bf33 100644 --- a/ModernKeePass/ViewModels/Items/SettingsDatabaseVm.cs +++ b/ModernKeePass/ViewModels/Items/SettingsDatabaseVm.cs @@ -30,7 +30,7 @@ namespace ModernKeePass.ViewModels get { return _database.IsRecycleBinEnabled; } set { - _mediator.Send(new SetHasRecycleBinCommand {HasRecycleBin = value}).GetAwaiter().GetResult(); + _mediator.Send(new SetHasRecycleBinCommand {HasRecycleBin = value}).Wait(); OnPropertyChanged(nameof(HasRecycleBin)); } } @@ -40,7 +40,7 @@ namespace ModernKeePass.ViewModels get { return _database.RecycleBin == null; } set { - if (value) _mediator.Send(new SetRecycleBinCommand { RecycleBin = null }).GetAwaiter().GetResult(); + if (value) _mediator.Send(new SetRecycleBinCommand { RecycleBin = null }).Wait(); } } @@ -53,19 +53,19 @@ namespace ModernKeePass.ViewModels public CipherVm SelectedCipher { get { return Ciphers.FirstOrDefault(c => c.Id == _database.CipherId); } - set { _mediator.Send(new SetCipherCommand {CipherId = value.Id}).GetAwaiter().GetResult(); } + set { _mediator.Send(new SetCipherCommand {CipherId = value.Id}).Wait(); } } public string SelectedCompression { get { return Compressions.FirstOrDefault(c => c == _database.Compression); } - set { _mediator.Send(new SetCompressionCommand {Compression = value}).GetAwaiter().GetResult(); } + set { _mediator.Send(new SetCompressionCommand {Compression = value}).Wait(); } } public KeyDerivationVm SelectedKeyDerivation { get { return KeyDerivations.FirstOrDefault(c => c.Id == _database.KeyDerivationId); } - set { _mediator.Send(new SetKeyDerivationCommand {KeyDerivationId = value.Id}).GetAwaiter().GetResult(); } + set { _mediator.Send(new SetKeyDerivationCommand {KeyDerivationId = value.Id}).Wait(); } } /*public int CipherIndex diff --git a/ModernKeePass/Views/GroupDetailPage.xaml.cs b/ModernKeePass/Views/GroupDetailPage.xaml.cs index a38e14b..74bb480 100644 --- a/ModernKeePass/Views/GroupDetailPage.xaml.cs +++ b/ModernKeePass/Views/GroupDetailPage.xaml.cs @@ -55,7 +55,7 @@ namespace ModernKeePass.Views { var vm = e.Parameter as Application.Group.Models.GroupVm; if (vm != null) - DataContext = vm; + DataContext = new GroupVm(vm); } } @@ -103,13 +103,13 @@ namespace ModernKeePass.Views e.DestinationItem.Item = e.SourceItem.Item; } } - private void CreateEntry_ButtonClick(object sender, RoutedEventArgs e) + private async void CreateEntry_ButtonClick(object sender, RoutedEventArgs e) { - Frame.Navigate(typeof(EntryDetailPage), Model.AddNewEntry()); + Frame.Navigate(typeof(EntryDetailPage), await Model.AddNewEntry()); } - private void CreateGroup_ButtonClick(object sender, RoutedEventArgs e) + private async void CreateGroup_ButtonClick(object sender, RoutedEventArgs e) { - Frame.Navigate(typeof(GroupDetailPage), Model.AddNewGroup()); + Frame.Navigate(typeof(GroupDetailPage), await Model.AddNewGroup()); } private void GridView_DragItemsStarting(object sender, DragItemsStartingEventArgs e) diff --git a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs index 404b12d..116ae58 100644 --- a/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs +++ b/ModernKeePass/Views/MainPageFrames/SaveDatabasePage.xaml.cs @@ -28,9 +28,9 @@ namespace ModernKeePass.Views _mainFrame = e.Parameter as Frame; } - private void SaveButton_OnClick(object sender, RoutedEventArgs e) + private async void SaveButton_OnClick(object sender, RoutedEventArgs e) { - Model.Save(); + await Model.Save(); _mainFrame.Navigate(typeof(MainPage)); } @@ -45,7 +45,7 @@ namespace ModernKeePass.Views var file = await savePicker.PickSaveFileAsync(); if (file == null) return; - Model.Save(file); + await Model.Save(file); _mainFrame.Navigate(typeof(MainPage)); } diff --git a/ModernKeePass/Views/UserControls/BreadCrumbUserControl.xaml b/ModernKeePass/Views/UserControls/BreadCrumbUserControl.xaml index f1247ff..9a3de5b 100644 --- a/ModernKeePass/Views/UserControls/BreadCrumbUserControl.xaml +++ b/ModernKeePass/Views/UserControls/BreadCrumbUserControl.xaml @@ -16,7 +16,7 @@ - + @@ -29,7 +29,7 @@ - + diff --git a/ModernKeePass/Views/UserControls/BreadCrumbUserControl.xaml.cs b/ModernKeePass/Views/UserControls/BreadCrumbUserControl.xaml.cs index ad01a1f..9b50c61 100644 --- a/ModernKeePass/Views/UserControls/BreadCrumbUserControl.xaml.cs +++ b/ModernKeePass/Views/UserControls/BreadCrumbUserControl.xaml.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; using Windows.UI.Xaml; -using ModernKeePass.Interfaces; +using ModernKeePass.Application.Common.Interfaces; // The User Control item template is documented at http://go.microsoft.com/fwlink/?LinkId=234236 @@ -13,17 +13,17 @@ namespace ModernKeePass.Views.UserControls InitializeComponent(); } - public IEnumerable ItemsSource + public IEnumerable ItemsSource { - get { return (IEnumerable)GetValue(ItemsSourceProperty); } + get { return (IEnumerable)GetValue(ItemsSourceProperty); } set { SetValue(ItemsSourceProperty, value); } } public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register( "ItemsSource", - typeof(IEnumerable), + typeof(IEnumerable), typeof(BreadCrumbUserControl), - new PropertyMetadata(new Stack(), (o, args) => { })); + new PropertyMetadata(new Stack(), (o, args) => { })); } } diff --git a/ModernKeePass/Win81App.csproj b/ModernKeePass/Win81App.csproj index aec44d5..eadbce6 100644 --- a/ModernKeePass/Win81App.csproj +++ b/ModernKeePass/Win81App.csproj @@ -388,15 +388,12 @@ - - ..\..\..\..\..\.nuget\packages\Autofac\4.9.4\lib\netstandard1.1\Autofac.dll - - - ..\packages\AutoMapper.6.0.2\lib\netstandard1.1\AutoMapper.dll + + ..\packages\AutoMapper.5.2.0\lib\netstandard1.1\AutoMapper.dll True - - ..\packages\AutoMapper.Extensions.Microsoft.DependencyInjection.2.0.1\lib\netstandard1.1\AutoMapper.Extensions.Microsoft.DependencyInjection.dll + + ..\packages\AutoMapper.Extensions.Microsoft.DependencyInjection.1.2.0\lib\netstandard1.1\AutoMapper.Extensions.Microsoft.DependencyInjection.dll True diff --git a/ModernKeePass/packages.config b/ModernKeePass/packages.config index a58024d..c2fd7a0 100644 --- a/ModernKeePass/packages.config +++ b/ModernKeePass/packages.config @@ -1,7 +1,7 @@  - - + +