예제 #1
0
        private async void OnUnhandledException(object sender, Windows.UI.Xaml.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;

            if (realException is SaveException)
            {
                unhandledExceptionEventArgs.Handled = true;
                //_hockey.TrackException(realException);
                await _dialog.ShowMessage(realException.Message,
                                          _resource.GetResourceValue("MessageDialogSaveErrorTitle"),
                                          _resource.GetResourceValue("MessageDialogSaveErrorButtonSaveAs"),
                                          _resource.GetResourceValue("MessageDialogSaveErrorButtonDiscard"),
                                          async isOk =>
                {
                    if (isOk)
                    {
                        var database   = await _mediator.Send(new GetDatabaseQuery());
                        var savePicker = new FileSavePicker
                        {
                            SuggestedStartLocation = PickerLocationId.DocumentsLibrary,
                            SuggestedFileName      = $"{database.Name} - copy"
                        };
                        savePicker.FileTypeChoices.Add(
                            _resource.GetResourceValue("MessageDialogSaveErrorFileTypeDesc"),
                            new List <string> {
                            ".kdbx"
                        });

                        var file = await savePicker.PickSaveFileAsync().AsTask();
                        if (file != null)
                        {
                            var token = StorageApplicationPermissions.FutureAccessList.Add(file, file.Name);
                            await _mediator.Send(new SaveDatabaseCommand {
                                FilePath = token
                            });
                        }
                    }
                });
            }
            else
            {
                await _dialog.ShowError(realException, realException.Message, "OK", () => { });
            }
        }
예제 #2
0
        private async Task CreateKeyFile()
        {
            var file = await _file.CreateFile(_resource.GetResourceValue("CompositeKeyFileNameSuggestion"),
                                              Constants.Extensions.Key, _resource.GetResourceValue("CompositeKeyFileTypeDesc"),
                                              false);

            if (file == null)
            {
                return;
            }
            SetKeyFileInfo(file);

            await _mediator.Send(new GenerateKeyFileCommand { KeyFilePath = KeyFilePath });
        }
예제 #3
0
        private async Task SaveAs()
        {
            var file = await _file.CreateFile(_resource.GetResourceValue("MessageDialogSaveNameSuggestion"),
                                              Domain.Common.Constants.Extensions.Kdbx,
                                              _resource.GetResourceValue("MessageDialogSaveErrorFileTypeDesc"),
                                              true);

            if (file == null)
            {
                return;
            }
            await _mediator.Send(new SaveDatabaseCommand { FilePath = file.Id });

            _navigation.NavigateTo(Constants.Navigation.MainPage);
        }
예제 #4
0
        private async Task CreateDatabaseFile()
        {
            var file = await _file.CreateFile(_resource.GetResourceValue("MessageDialogSaveNameSuggestion"),
                                              Domain.Common.Constants.Extensions.Kdbx,
                                              _resource.GetResourceValue("MessageDialogSaveErrorFileTypeDesc"),
                                              true);

            if (file == null)
            {
                return;
            }
            Token = file.Id;
            Path  = file.Path;
            Name  = file.Name;
        }
예제 #5
0
      private async Task HandleSaveError(SaveErrorMessage message)
      {
          _notification.Show(_resource.GetResourceValue("MessageDialogSaveErrorTitle"), message?.Message);
          var database = await _mediator.Send(new GetDatabaseQuery());

          var file = await _file.CreateFile($"{database.Name} - copy",
                                            Domain.Common.Constants.Extensions.Kdbx,
                                            _resource.GetResourceValue("MessageDialogSaveErrorFileTypeDesc"), true);

          if (file != null)
          {
              await _mediator.Send(new SaveDatabaseCommand { FilePath = file.Id });

              _messenger.Send(new DatabaseSavedMessage());
          }
      }
예제 #6
0
        private async Task AskForDelete()
        {
            if (IsCurrentEntry)
            {
                if (IsRecycleOnDelete)
                {
                    await Delete();

                    _notification.Show(_resource.GetResourceValue("EntityDeleting"), string.Format(_resource.GetResourceValue("EntryRecycled"), Title));
                }
                else
                {
                    await _dialog.ShowMessage(
                        string.Format(_resource.GetResourceValue("EntryDeletingConfirmation"), Title),
                        _resource.GetResourceValue("EntityDeleting"),
                        _resource.GetResourceValue("EntityDeleteActionButton"),
                        _resource.GetResourceValue("EntityDeleteCancelButton"),
                        async isOk =>
                    {
                        if (isOk)
                        {
                            await Delete();
                        }
                    });
                }
            }
            else
            {
                await _dialog.ShowMessage(_resource.GetResourceValue("HistoryDeleteDescription"),
                                          _resource.GetResourceValue("HistoryDeleteTitle"),
                                          _resource.GetResourceValue("EntityDeleteActionButton"),
                                          _resource.GetResourceValue("EntityDeleteCancelButton"), async isOk =>
                {
                    if (!isOk)
                    {
                        return;
                    }
                    await _mediator.Send(new DeleteHistoryCommand {
                        Entry = History[0] as EntryVm, HistoryIndex = History.Count - SelectedIndex - 1
                    });
                    History.RemoveAt(SelectedIndex);
                });
            }
        }
예제 #7
0
 public OpenDatabaseControlVm(IMediator mediator, IResourceProxy resource, INotificationService notification, IFileProxy file, IDialogService dialog)
 {
     _mediator           = mediator;
     _resource           = resource;
     _notification       = notification;
     _file               = file;
     _dialog             = dialog;
     OpenKeyFileCommand  = new RelayCommand(async() => await OpenKeyFile());
     OpenDatabaseCommand = new RelayCommand <string>(async databaseFilePath => await TryOpenDatabase(databaseFilePath), _ => IsValid);
     _keyFileText        = _resource.GetResourceValue("CompositeKeyDefaultKeyFile");
 }
예제 #8
0
        public async Task UpdateDatabaseCredentials(CredentialsSetMessage message)
        {
            await _mediator.Send(new UpdateCredentialsCommand
            {
                KeyFilePath = message.KeyFilePath,
                Password    = message.Password
            });

            var database = await _mediator.Send(new GetDatabaseQuery());

            _notification.Show(database.Name, _resource.GetResourceValue("CompositeKeyUpdated"));
        }
예제 #9
0
        public async Task OpenDatabase(string databaseFilePath)
        {
            IsOpening = true;
            try
            {
                await _mediator.Send(new OpenDatabaseQuery
                {
                    FilePath    = databaseFilePath,
                    KeyFilePath = HasKeyFile ? KeyFilePath : null,
                    Password    = HasPassword ? Password : null,
                });

                var database = await _mediator.Send(new GetDatabaseQuery());

                if (database.Size > Common.Constants.File.OneMegaByte)
                {
                    await _dialog.ShowMessage(_resource.GetResourceValue("DatabaseTooBigDescription"), _resource.GetResourceValue("DatabaseTooBigTitle"));
                }
                MessengerInstance.Send(new DatabaseOpenedMessage {
                    RootGroupId = database.RootGroupId
                });
            }
            catch (ArgumentException)
            {
                var errorMessage = new StringBuilder($"{_resource.GetResourceValue("CompositeKeyErrorOpen")}\n");
                if (HasPassword)
                {
                    errorMessage.AppendLine(_resource.GetResourceValue("CompositeKeyErrorUserPassword"));
                }
                if (HasKeyFile)
                {
                    errorMessage.AppendLine(_resource.GetResourceValue("CompositeKeyErrorUserKeyFile"));
                }
                Status  = errorMessage.ToString();
                IsError = true;
            }
            catch (FileNotFoundException)
            {
                _notification.Show(
                    $"{_resource.GetResourceValue("FileNotFoundTitle")}",
                    $"{_resource.GetResourceValue("FileNotFoundDescription")}");
                MessengerInstance.Send(new FileNotFoundMessage());
                IsError = true;
            }
            catch (Exception e)
            {
                Status  = $"{_resource.GetResourceValue("CompositeKeyErrorOpen")}{e.Message}";
                IsError = true;
            }
            finally
            {
                IsOpening = false;
            }
        }
예제 #10
0
        public SetCredentialsVm(IMediator mediator, IResourceProxy resource, IFileProxy file)
        {
            _mediator = mediator;
            _resource = resource;
            _file     = file;

            OpenKeyFileCommand         = new RelayCommand(async() => await OpenKeyFile(), () => HasKeyFile);
            CreateKeyFileCommand       = new RelayCommand(async() => await CreateKeyFile(), () => HasKeyFile);
            GenerateCredentialsCommand = new RelayCommand(GenerateCredentials, () => IsValid);

            _keyFileText = resource.GetResourceValue("CompositeKeyDefaultKeyFile");

            MessengerInstance.Register <PasswordGeneratedMessage>(this, message =>
            {
                Password        = message.Password;
                ConfirmPassword = message.Password;
            });
        }
예제 #11
0
        public SettingsVm(IMediator mediator, IResourceProxy resource)
        {
            var database  = mediator.Send(new GetDatabaseQuery()).GetAwaiter().GetResult();
            var menuItems = new ObservableCollection <ListMenuItemVm>
            {
                new ListMenuItemVm
                {
                    Title      = resource.GetResourceValue("SettingsMenuItemNew"),
                    Group      = resource.GetResourceValue("SettingsMenuGroupApplication"),
                    SymbolIcon = Symbol.Add,
                    PageType   = typeof(SettingsNewDatabasePage),
                    IsSelected = true
                },
                new ListMenuItemVm
                {
                    Title      = resource.GetResourceValue("SettingsMenuItemGeneral"),
                    Group      = resource.GetResourceValue("SettingsMenuGroupApplication"),
                    SymbolIcon = Symbol.Setting,
                    PageType   = typeof(SettingsGeneralPage)
                },
                new ListMenuItemVm
                {
                    Title      = resource.GetResourceValue("SettingsMenuItemSecurity"),
                    Group      = resource.GetResourceValue("SettingsMenuGroupDatabase"),
                    SymbolIcon = Symbol.Permissions,
                    PageType   = typeof(SettingsSecurityPage),
                    IsEnabled  = database.IsOpen
                },
                new ListMenuItemVm
                {
                    Title      = resource.GetResourceValue("SettingsMenuItemHistory"),
                    Group      = resource.GetResourceValue("SettingsMenuGroupDatabase"),
                    SymbolIcon = Symbol.Undo,
                    PageType   = typeof(SettingsHistoryPage),
                    IsEnabled  = database.IsOpen
                },
                new ListMenuItemVm
                {
                    Title      = resource.GetResourceValue("SettingsMenuItemRecycleBin"),
                    Group      = resource.GetResourceValue("SettingsMenuGroupDatabase"),
                    SymbolIcon = Symbol.Delete,
                    PageType   = typeof(SettingsRecycleBinPage),
                    IsEnabled  = database.IsOpen
                },
                new ListMenuItemVm
                {
                    Title      = resource.GetResourceValue("SettingsMenuItemCredentials"),
                    Group      = resource.GetResourceValue("SettingsMenuGroupDatabase"),
                    SymbolIcon = Symbol.Account,
                    PageType   = typeof(SettingsCredentialsPage),
                    IsEnabled  = database.IsOpen
                }
            };

            SelectedItem = menuItems.FirstOrDefault(m => m.IsSelected);

            MenuItems = from item in menuItems group item by item.Group into grp orderby grp.Key select grp;
        }
예제 #12
0
        public async Task Initialize(Frame referenceFrame, Frame destinationFrame, FileInfo databaseFile = null)
        {
            var database = await _mediator.Send(new GetDatabaseQuery());

            var mainMenuItems = new ObservableCollection <MainMenuItemVm>
            {
                new MainMenuItemVm
                {
                    Title       = _resource.GetResourceValue("MainMenuItemOpen"),
                    PageType    = typeof(OpenDatabasePage),
                    Destination = destinationFrame,
                    Parameter   = databaseFile,
                    SymbolIcon  = Symbol.Page2,
                    IsSelected  = databaseFile != null
                },
                new MainMenuItemVm
                {
                    Title       = _resource.GetResourceValue("MainMenuItemNew"),
                    PageType    = typeof(NewDatabasePage),
                    Destination = destinationFrame,
                    SymbolIcon  = Symbol.Add
                },
                new MainMenuItemVm
                {
                    Title       = _resource.GetResourceValue("MainMenuItemSave"),
                    PageType    = typeof(SaveDatabasePage),
                    Destination = destinationFrame,
                    Parameter   = referenceFrame,
                    SymbolIcon  = Symbol.Save,
                    IsSelected  = database.IsOpen,
                    IsEnabled   = database.IsOpen
                },
                new MainMenuItemVm
                {
                    Title       = _resource.GetResourceValue("MainMenuItemRecent"),
                    PageType    = typeof(RecentDatabasesPage),
                    Destination = destinationFrame,
                    Parameter   = referenceFrame,
                    SymbolIcon  = Symbol.Copy,
                    IsSelected  = !database.IsOpen && _recent.EntryCount > 0,
                    IsEnabled   = _recent.EntryCount > 0
                },
                new MainMenuItemVm
                {
                    Title       = _resource.GetResourceValue("MainMenuItemSettings"),
                    PageType    = typeof(SettingsPage),
                    Destination = referenceFrame,
                    SymbolIcon  = Symbol.Setting
                },
                new MainMenuItemVm
                {
                    Title       = _resource.GetResourceValue("MainMenuItemAbout"),
                    PageType    = typeof(AboutPage),
                    Destination = destinationFrame,
                    SymbolIcon  = Symbol.Help
                },
                new MainMenuItemVm
                {
                    Title       = _resource.GetResourceValue("MainMenuItemDonate"),
                    PageType    = typeof(DonatePage),
                    Destination = destinationFrame,
                    SymbolIcon  = Symbol.Shop
                }
            };

            // Auto-select the Recent Items menu item if the conditions are met
            SelectedItem = mainMenuItems.FirstOrDefault(m => m.IsSelected);

            // Add currently opened database to the menu
            if (database.IsOpen)
            {
                mainMenuItems.Add(new MainMenuItemVm
                {
                    Title       = database.Name,
                    PageType    = typeof(GroupDetailPage),
                    Destination = referenceFrame,
                    Parameter   = new NavigationItem {
                        Id = database.RootGroupId
                    },
                    Group      = "Databases",
                    SymbolIcon = Symbol.ProtectedDocument
                });
            }

            MainMenuItems = from item in mainMenuItems group item by item.Group into grp orderby grp.Key select grp;
        }
예제 #13
0
        private async Task AskForDelete()
        {
            if (IsRecycleOnDelete)
            {
                await Delete();

                _notification.Show(_resource.GetResourceValue("EntityDeleting"), string.Format(_resource.GetResourceValue("GroupRecycled"), Title));
            }
            else
            {
                await _dialog.ShowMessage(
                    string.Format(_resource.GetResourceValue("GroupDeletingConfirmation"), Title),
                    _resource.GetResourceValue("EntityDeleting"),
                    _resource.GetResourceValue("EntityDeleteActionButton"),
                    _resource.GetResourceValue("EntityDeleteCancelButton"),
                    async isOk =>
                {
                    if (isOk)
                    {
                        await Delete();
                    }
                });
            }
        }