diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultStats.java b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultStats.java index 69564b876..c23682008 100644 --- a/main/commons/src/main/java/org/cryptomator/common/vaults/VaultStats.java +++ b/main/commons/src/main/java/org/cryptomator/common/vaults/VaultStats.java @@ -59,6 +59,10 @@ public class VaultStats { private class UpdateStatsService extends ScheduledService> { + private UpdateStatsService() { + setOnFailed(event -> LOG.error("Error in UpdateStateService.", getException())); + } + @Override protected Task> createTask() { return new Task<>() { diff --git a/main/ui/src/main/java/org/cryptomator/ui/common/Tasks.java b/main/ui/src/main/java/org/cryptomator/ui/common/Tasks.java index ab0a80d47..164ee41e3 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/common/Tasks.java +++ b/main/ui/src/main/java/org/cryptomator/ui/common/Tasks.java @@ -174,6 +174,8 @@ public class Tasks { RestartingService(Supplier> taskFactory) { this.taskFactory = taskFactory; + + setOnFailed(event -> LOG.error("Failed to execute service", getException())); } @Override diff --git a/main/ui/src/main/java/org/cryptomator/ui/common/VaultService.java b/main/ui/src/main/java/org/cryptomator/ui/common/VaultService.java index 8aadd8c98..a6b7dc425 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/common/VaultService.java +++ b/main/ui/src/main/java/org/cryptomator/ui/common/VaultService.java @@ -69,7 +69,6 @@ public class VaultService { public Task createLockTask(Vault vault, boolean forced) { Task task = new LockVaultTask(vault, forced); task.setOnSucceeded(evt -> LOG.info("Locked {}", vault.getDisplayName())); - task.setOnFailed(evt -> LOG.error("Failed to lock " + vault.getDisplayName(), evt.getSource().getException())); return task; } @@ -109,6 +108,8 @@ public class VaultService { */ public RevealVaultTask(Vault vault) { this.vault = vault; + + setOnFailed(evt -> LOG.error("Failed to reveal " + vault.getDisplayName(), getException())); } @Override @@ -127,6 +128,8 @@ public class VaultService { public WaitForTasksTask(Collection> tasks) { this.startedTasks = List.copyOf(tasks); + + setOnFailed(event -> LOG.error("Failed to lock multiple vaults", getException())); } @Override @@ -165,6 +168,8 @@ public class VaultService { public LockVaultTask(Vault vault, boolean forced) { this.vault = vault; this.forced = forced; + + setOnFailed(event -> LOG.error("Failed to lock " + vault.getDisplayName(), event.getSource().getException())); } @Override diff --git a/main/ui/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerModule.java b/main/ui/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerModule.java index 7784bd89e..a15b81044 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerModule.java @@ -11,6 +11,8 @@ import javafx.concurrent.Task; import javafx.util.Duration; import org.apache.commons.lang3.SystemUtils; import org.cryptomator.common.settings.Settings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.inject.Named; import java.net.URI; @@ -22,6 +24,8 @@ import java.util.concurrent.ExecutorService; @Module public abstract class UpdateCheckerModule { + private static final Logger LOG = LoggerFactory.getLogger(UpdateCheckerModule.class); + private static final URI LATEST_VERSION_URI = URI.create("https://api.cryptomator.org/updates/latestVersion.json"); private static final Duration UPDATE_CHECK_INTERVAL = Duration.hours(3); private static final Duration DISABLED_UPDATE_CHECK_INTERVAL = Duration.hours(100000); // Duration.INDEFINITE leads to overflows... @@ -69,6 +73,7 @@ public abstract class UpdateCheckerModule { return new UpdateCheckerTask(httpClient, checkForUpdatesRequest); } }; + service.setOnFailed(event -> LOG.error("Failed to execute update service", service.getException())); service.setExecutor(executor); service.periodProperty().bind(period); return service; diff --git a/main/ui/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerTask.java b/main/ui/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerTask.java index 4d077a24c..8fec56b64 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerTask.java +++ b/main/ui/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerTask.java @@ -6,6 +6,8 @@ import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import javafx.concurrent.Task; import org.apache.commons.lang3.SystemUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; @@ -19,6 +21,8 @@ import java.util.Map; public class UpdateCheckerTask extends Task { + private static final Logger LOG = LoggerFactory.getLogger(UpdateCheckerTask.class); + private static final long MAX_RESPONSE_SIZE = 10 * 1024; // 10kb should be sufficient. protect against flooding private static final Gson GSON = new GsonBuilder().setLenient().create(); @@ -28,6 +32,8 @@ public class UpdateCheckerTask extends Task { UpdateCheckerTask(HttpClient httpClient, HttpRequest checkForUpdatesRequest) { this.httpClient = httpClient; this.checkForUpdatesRequest = checkForUpdatesRequest; + + setOnFailed(event -> LOG.error("Failed to check for updates", getException())); } @Override diff --git a/main/ui/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java b/main/ui/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java index fdec00d62..3cf94d22e 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java @@ -109,7 +109,10 @@ public class GeneralPreferencesController implements FxController { autoStartStrategy.ifPresent(autoStart -> { boolean enableAutoStart = autoStartCheckbox.isSelected(); Task toggleTask = new ToggleAutoStartTask(autoStart, enableAutoStart); - toggleTask.setOnFailed(evt -> autoStartCheckbox.setSelected(!enableAutoStart)); // restore previous state + toggleTask.setOnFailed(event -> { + autoStartCheckbox.setSelected(!enableAutoStart); // restore previous state + LOG.error("Failed to toggle autostart.", event.getSource().getException()); + }); executor.execute(toggleTask); }); } @@ -158,6 +161,8 @@ public class GeneralPreferencesController implements FxController { public ToggleAutoStartTask(AutoStartStrategy autoStart, boolean enable) { this.autoStart = autoStart; this.enable = enable; + + setOnFailed(event -> LOG.error("Failed to toggle Autostart", getException())); } @Override diff --git a/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyCreationController.java b/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyCreationController.java index 6bb6a9f80..f5b002cbf 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyCreationController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyCreationController.java @@ -71,6 +71,10 @@ public class RecoveryKeyCreationController implements FxController { private class RecoveryKeyCreationTask extends Task { + private RecoveryKeyCreationTask() { + setOnFailed(event -> LOG.error("Failed to create recovery key", getException())); + } + @Override protected String call() throws IOException { return recoveryKeyFactory.createRecoveryKey(vault.getPath(), passwordField.getCharacters()); diff --git a/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyResetPasswordController.java b/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyResetPasswordController.java index 87d916492..8f626a652 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyResetPasswordController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyResetPasswordController.java @@ -77,6 +77,10 @@ public class RecoveryKeyResetPasswordController implements FxController { private class ResetPasswordTask extends Task { + private ResetPasswordTask() { + setOnFailed(event -> LOG.error("Failed to reset password", getException())); + } + @Override protected Void call() throws IOException, IllegalArgumentException { recoveryKeyFactory.resetPasswordWithRecoveryKey(vault.getPath(), recoveryKey.get(), newPassword.get()); diff --git a/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java b/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java index c339cb344..12633452a 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java +++ b/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java @@ -73,6 +73,15 @@ public class UnlockWorkflow extends Task { this.successScene = successScene; this.invalidMountPointScene = invalidMountPointScene; this.errorComponent = errorComponent; + + setOnFailed(event -> { + Throwable throwable = event.getSource().getException(); + if (throwable instanceof InvalidMountPointException) { + handleInvalidMountPoint((InvalidMountPointException) throwable); + } else { + handleGenericError(throwable); + } + }); } @Override @@ -85,12 +94,6 @@ public class UnlockWorkflow extends Task { cancel(false); // set Tasks state to cancelled return false; } - } catch (InvalidMountPointException e) { - handleInvalidMountPoint(e); - throw e; // rethrow to trigger correct exception handling in Task - } catch (Exception e) { - handleGenericError(e); - throw e; // rethrow to trigger correct exception handling in Task } finally { wipePassword(password.get()); wipePassword(savedPassword.orElse(null));