Show errors in GUI during vault creation

This commit is contained in:
Sebastian Stenzel
2020-03-09 15:46:22 +01:00
parent 54c0df51d5
commit 3f2f368dca
5 changed files with 31 additions and 21 deletions

View File

@@ -41,6 +41,8 @@ public class CreateNewVaultLocationController implements FxController {
private final Stage window;
private final Lazy<Scene> chooseNameScene;
private final Lazy<Scene> choosePasswordScene;
private final Lazy<Scene> genericErrorScene;
private final ObjectProperty<Throwable> genericErrorCause;
private final LocationPresets locationPresets;
private final ObjectProperty<Path> vaultPath;
private final StringProperty vaultName;
@@ -59,10 +61,12 @@ public class CreateNewVaultLocationController implements FxController {
public RadioButton customRadioButton;
@Inject
CreateNewVaultLocationController(@AddVaultWizardWindow Stage window, @FxmlScene(FxmlFile.ADDVAULT_NEW_NAME) Lazy<Scene> chooseNameScene, @FxmlScene(FxmlFile.ADDVAULT_NEW_PASSWORD) Lazy<Scene> choosePasswordScene, LocationPresets locationPresets, ObjectProperty<Path> vaultPath, @Named("vaultName") StringProperty vaultName, ResourceBundle resourceBundle) {
CreateNewVaultLocationController(@AddVaultWizardWindow Stage window, @FxmlScene(FxmlFile.ADDVAULT_NEW_NAME) Lazy<Scene> chooseNameScene, @FxmlScene(FxmlFile.ADDVAULT_NEW_PASSWORD) Lazy<Scene> choosePasswordScene, @FxmlScene(FxmlFile.ADDVAULT_GENERIC_ERROR) Lazy<Scene> genericErrorScene, @Named("genericErrorCause") ObjectProperty<Throwable> genericErrorCause, LocationPresets locationPresets, ObjectProperty<Path> vaultPath, @Named("vaultName") StringProperty vaultName, ResourceBundle resourceBundle) {
this.window = window;
this.chooseNameScene = chooseNameScene;
this.choosePasswordScene = choosePasswordScene;
this.genericErrorScene = genericErrorScene;
this.genericErrorCause = genericErrorCause;
this.locationPresets = locationPresets;
this.vaultPath = vaultPath;
this.vaultName = vaultName;
@@ -123,9 +127,9 @@ public class CreateNewVaultLocationController implements FxController {
LOG.warn("Can not use already existing vault path {}", vaultPath.get());
warningText.set(resourceBundle.getString("addvaultwizard.new.fileAlreadyExists"));
} catch (IOException e) {
LOG.warn("Can not create vault at path: {}", vaultPath.get());
LOG.warn("Thrown Exception:", e);
warningText.set(resourceBundle.getString("addvaultwizard.new.ioException"));
LOG.error("Failed to create and delete directory at chosen vault path.", e);
genericErrorCause.set(e);
window.setScene(genericErrorScene.get());
}
}

View File

@@ -53,6 +53,9 @@ public class CreateNewVaultPasswordController implements FxController {
private final Lazy<Scene> chooseLocationScene;
private final Lazy<Scene> recoveryKeyScene;
private final Lazy<Scene> successScene;
private final Lazy<Scene> genericErrorScene;
private final ObjectProperty<Throwable> genericErrorCause;
private final ObjectProperty<Scene> genericErrorReturnScene;
private final ExecutorService executor;
private final RecoveryKeyFactory recoveryKeyFactory;
private final StringProperty vaultNameProperty;
@@ -72,11 +75,14 @@ public class CreateNewVaultPasswordController implements FxController {
public Toggle skipRecoveryKey;
@Inject
CreateNewVaultPasswordController(@AddVaultWizardWindow Stage window, @FxmlScene(FxmlFile.ADDVAULT_NEW_LOCATION) Lazy<Scene> chooseLocationScene, @FxmlScene(FxmlFile.ADDVAULT_NEW_RECOVERYKEY) Lazy<Scene> recoveryKeyScene, @FxmlScene(FxmlFile.ADDVAULT_SUCCESS) Lazy<Scene> successScene, ExecutorService executor, RecoveryKeyFactory recoveryKeyFactory, @Named("vaultName") StringProperty vaultName, ObjectProperty<Path> vaultPath, @AddVaultWizardWindow ObjectProperty<Vault> vault, @Named("recoveryKey") StringProperty recoveryKey, VaultListManager vaultListManager, ResourceBundle resourceBundle, @Named("newPassword") ObjectProperty<CharSequence> password, ReadmeGenerator readmeGenerator) {
CreateNewVaultPasswordController(@AddVaultWizardWindow Stage window, @FxmlScene(FxmlFile.ADDVAULT_NEW_LOCATION) Lazy<Scene> chooseLocationScene, @FxmlScene(FxmlFile.ADDVAULT_NEW_RECOVERYKEY) Lazy<Scene> recoveryKeyScene, @FxmlScene(FxmlFile.ADDVAULT_SUCCESS) Lazy<Scene> successScene, @FxmlScene(FxmlFile.ADDVAULT_GENERIC_ERROR) Lazy<Scene> genericErrorScene, @Named("genericErrorCause") ObjectProperty<Throwable> genericErrorCause, @Named("genericErrorReturnScene") ObjectProperty<Scene> genericErrorReturnScene, ExecutorService executor, RecoveryKeyFactory recoveryKeyFactory, @Named("vaultName") StringProperty vaultName, ObjectProperty<Path> vaultPath, @AddVaultWizardWindow ObjectProperty<Vault> vault, @Named("recoveryKey") StringProperty recoveryKey, VaultListManager vaultListManager, ResourceBundle resourceBundle, @Named("newPassword") ObjectProperty<CharSequence> password, ReadmeGenerator readmeGenerator) {
this.window = window;
this.chooseLocationScene = chooseLocationScene;
this.recoveryKeyScene = recoveryKeyScene;
this.successScene = successScene;
this.genericErrorScene = genericErrorScene;
this.genericErrorCause = genericErrorCause;
this.genericErrorReturnScene = genericErrorReturnScene;
this.executor = executor;
this.recoveryKeyFactory = recoveryKeyFactory;
this.vaultNameProperty = vaultName;
@@ -109,12 +115,12 @@ public class CreateNewVaultPasswordController implements FxController {
try {
Files.createDirectory(pathToVault);
} catch (FileAlreadyExistsException e) {
LOG.error("Vault dir already exists.", e);
window.setScene(chooseLocationScene.get());
} catch (IOException e) {
// TODO show generic error screen
LOG.error("", e);
LOG.error("Failed to create vault directory.", e);
genericErrorReturnScene.set(window.getScene());
genericErrorCause.set(e);
window.setScene(genericErrorScene.get());
return;
}
if (showRecoveryKey.equals(recoveryKeyChoice.getSelectedToggle())) {
@@ -137,8 +143,10 @@ public class CreateNewVaultPasswordController implements FxController {
recoveryKeyProperty.set(recoveryKey);
window.setScene(recoveryKeyScene.get());
}).onError(IOException.class, e -> {
// TODO show generic error screen
LOG.error("", e);
LOG.error("Failed to initialize vault.", e);
genericErrorReturnScene.set(window.getScene());
genericErrorCause.set(e);
window.setScene(genericErrorScene.get());
}).andFinally(() -> {
processing.set(false);
}).runOnce(executor);
@@ -153,8 +161,10 @@ public class CreateNewVaultPasswordController implements FxController {
initializationSucceeded(pathToVault);
window.setScene(successScene.get());
}).onError(IOException.class, e -> {
// TODO show generic error screen
LOG.error("", e);
LOG.error("Failed to initialize vault.", e);
genericErrorReturnScene.set(window.getScene());
genericErrorCause.set(e);
window.setScene(genericErrorScene.get());
}).andFinally(() -> {
processing.set(false);
}).runOnce(executor);

View File

@@ -71,7 +71,6 @@ public class ChangePasswordController implements FxController {
} catch (IOException e) {
// TODO show generic error screen
LOG.error("IO error occured during password change. Unable to perform operation.", e);
e.printStackTrace();
} catch (InvalidPassphraseException e) {
Animations.createShakeWindowAnimation(window).play();
oldPasswordField.selectAll();

View File

@@ -3,7 +3,6 @@
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ButtonBar?>
<?import javafx.scene.layout.Region?>
<?import javafx.scene.layout.VBox?>
<VBox xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
@@ -16,9 +15,7 @@
<Insets topRightBottomLeft="24"/>
</padding>
<children>
<fx:include source="/fxml/stacktrace.fxml"/>
<Region VBox.vgrow="ALWAYS"/>
<fx:include source="/fxml/stacktrace.fxml" VBox.vgrow="ALWAYS"/>
<ButtonBar buttonMinWidth="120" buttonOrder="B+C">
<buttons>

View File

@@ -13,7 +13,7 @@
minWidth="300"
spacing="12">
<children>
<HBox spacing="12" VBox.vgrow="ALWAYS">
<HBox spacing="12" VBox.vgrow="NEVER">
<StackPane alignment="CENTER" HBox.hgrow="NEVER">
<Circle styleClass="glyph-icon-primary" radius="24"/>
<FontAwesome5IconView styleClass="glyph-icon-white" glyph="EXCLAMATION" glyphSize="24"/>
@@ -24,6 +24,6 @@
</VBox>
</HBox>
<TextArea text="${controller.stackTrace}" prefRowCount="5" editable="false"/>
<TextArea VBox.vgrow="ALWAYS" text="${controller.stackTrace}" prefRowCount="5" editable="false"/>
</children>
</VBox>