From 1292548042ea465f534affd8a4d293d42e80df72 Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Mon, 29 Mar 2021 10:44:39 +0200 Subject: [PATCH] Implementing new settings and locking after a certain amount of minutes --- .../common/settings/VaultSettings.java | 14 ++++++- .../settings/VaultSettingsJsonAdapter.java | 8 ++++ .../cryptomator/ui/fxapp/FxApplication.java | 38 ++++++++++++++----- .../AutoLockVaultOptionsController.java | 5 ++- .../fxml/vault_options_autolock.fxml | 10 ++++- .../main/resources/i18n/strings.properties | 3 +- 6 files changed, 64 insertions(+), 14 deletions(-) diff --git a/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java b/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java index 79d9629ba..c73190f38 100644 --- a/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java +++ b/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java @@ -40,6 +40,8 @@ public class VaultSettings { public static final boolean DEFAULT_LOCK_ON_SLEEP = false; public static final boolean DEFAULT_LOCK_AFTER_IDLETIME = false; public static final String DEFAULT_LOCK_IDLETIME_IN_MINUTES = "30"; + public static final boolean DEFAULT_LOCK_AFTER_TIME = false; + public static final String DEFAULT_LOCK_TIME_IN_MINUTES = "30"; private static final Random RNG = new Random(); @@ -58,6 +60,8 @@ public class VaultSettings { private final BooleanProperty lockOnSleep = new SimpleBooleanProperty(DEFAULT_LOCK_ON_SLEEP); private final BooleanProperty lockAfterIdleTime = new SimpleBooleanProperty(DEFAULT_LOCK_AFTER_IDLETIME); private final StringProperty lockIdleTimeInMinutes = new SimpleStringProperty(DEFAULT_LOCK_IDLETIME_IN_MINUTES); + private final BooleanProperty lockAfterTime = new SimpleBooleanProperty(DEFAULT_LOCK_AFTER_TIME); + private final StringProperty lockTimeInMinutes = new SimpleStringProperty(DEFAULT_LOCK_TIME_IN_MINUTES); private final StringBinding mountName; public VaultSettings(String id) { @@ -66,7 +70,7 @@ public class VaultSettings { } Observable[] observables() { - return new Observable[]{path, displayName, winDriveLetter, unlockAfterStartup, revealAfterMount, useCustomMountPath, customMountPath, usesReadOnlyMode, mountFlags, filenameLengthLimit, actionAfterUnlock, lockOnSleep, lockAfterIdleTime, lockIdleTimeInMinutes}; + return new Observable[]{path, displayName, winDriveLetter, unlockAfterStartup, revealAfterMount, useCustomMountPath, customMountPath, usesReadOnlyMode, mountFlags, filenameLengthLimit, actionAfterUnlock, lockOnSleep, lockAfterIdleTime, lockIdleTimeInMinutes, lockAfterTime, lockTimeInMinutes}; } public static VaultSettings withRandomId() { @@ -179,6 +183,14 @@ public class VaultSettings { return lockIdleTimeInMinutes; } + public BooleanProperty lockAfterTime() { + return lockAfterTime; + } + + public StringProperty lockTimeInMinutes() { + return lockTimeInMinutes; + } + /* Hashcode/Equals */ @Override diff --git a/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java b/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java index 42d0e3b39..717f2474d 100644 --- a/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java +++ b/main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java @@ -34,6 +34,8 @@ class VaultSettingsJsonAdapter { out.name("lockOnSleep").value(value.lockOnSleep().get()); out.name("lockAfterIdleTime").value(value.lockAfterIdleTime().get()); out.name("lockIdleTimeInMinutes").value(value.lockIdleTimeInMinutes().get()); + out.name("lockAfterTime").value(value.lockAfterTime().get()); + out.name("lockTimeInMinutes").value(value.lockTimeInMinutes().get()); out.endObject(); } @@ -54,6 +56,8 @@ class VaultSettingsJsonAdapter { boolean lockOnSleep = VaultSettings.DEFAULT_LOCK_ON_SLEEP; boolean lockAfterIdleTime = VaultSettings.DEFAULT_LOCK_AFTER_IDLETIME; String lockIdleTimeInMinutes = VaultSettings.DEFAULT_LOCK_IDLETIME_IN_MINUTES; + boolean lockAfterTime = VaultSettings.DEFAULT_LOCK_AFTER_TIME; + String lockTimeInMinutes = VaultSettings.DEFAULT_LOCK_TIME_IN_MINUTES; in.beginObject(); while (in.hasNext()) { @@ -75,6 +79,8 @@ class VaultSettingsJsonAdapter { case "lockOnSleep" -> lockOnSleep = in.nextBoolean(); case "lockAfterIdleTime" -> lockAfterIdleTime = in.nextBoolean(); case "lockIdleTimeInMinutes" -> lockIdleTimeInMinutes = in.nextString(); + case "lockAfterTime" -> lockAfterTime = in.nextBoolean(); + case "lockTimeInMinutes" -> lockTimeInMinutes = in.nextString(); default -> { LOG.warn("Unsupported vault setting found in JSON: " + name); in.skipValue(); @@ -102,6 +108,8 @@ class VaultSettingsJsonAdapter { vaultSettings.lockOnSleep().set(lockOnSleep); vaultSettings.lockAfterIdleTime().set(lockAfterIdleTime); vaultSettings.lockIdleTimeInMinutes().set(lockIdleTimeInMinutes); + vaultSettings.lockAfterTime().set(lockAfterTime); + vaultSettings.lockTimeInMinutes().set(lockTimeInMinutes); return vaultSettings; } diff --git a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java index 7b1adb47a..d49ef2c7e 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java +++ b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java @@ -15,9 +15,9 @@ import org.cryptomator.common.settings.UiTheme; import org.cryptomator.common.vaults.Vault; import org.cryptomator.common.vaults.VaultListManager; import org.cryptomator.common.vaults.Volume; -import org.cryptomator.integrations.autolock.AutoLockException; -import org.cryptomator.integrations.autolock.AutoLockProvider; -import org.cryptomator.integrations.autolock.SystemState; +//import org.cryptomator.integrations.autolock.AutoLockException; +//import org.cryptomator.integrations.autolock.AutoLockProvider; +//import org.cryptomator.integrations.autolock.SystemState; import org.cryptomator.integrations.tray.TrayIntegrationProvider; import org.cryptomator.integrations.uiappearance.Theme; import org.cryptomator.integrations.uiappearance.UiAppearanceException; @@ -36,8 +36,7 @@ import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.inject.Provider; import java.awt.desktop.QuitResponse; -import java.awt.desktop.SystemSleepEvent; -import java.awt.desktop.SystemSleepListener; +import java.util.Date; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; @@ -61,10 +60,12 @@ public class FxApplication extends Application { private final BooleanBinding hasVisibleWindows; private final UiAppearanceListener systemInterfaceThemeListener = this::systemInterfaceThemeChanged; private final VaultListManager vaultListManager; - private final Optional autoLockProvider; + //private final Optional autoLockProvider; @Inject - FxApplication(Settings settings, Lazy mainWindow, Lazy preferencesWindow, Provider unlockWindowBuilderProvider, Provider lockWindowBuilderProvider, Lazy quitWindow, Optional trayIntegration, Optional appearanceProvider, VaultService vaultService, LicenseHolder licenseHolder, VaultListManager vaultListManager, Optional autoLockProvider) { + //FxApplication(Settings settings, Lazy mainWindow, Lazy preferencesWindow, Provider unlockWindowBuilderProvider, Provider lockWindowBuilderProvider, Lazy quitWindow, Optional trayIntegration, Optional appearanceProvider, VaultService vaultService, LicenseHolder licenseHolder, VaultListManager vaultListManager, Optional autoLockProvider) { + FxApplication(Settings settings, Lazy mainWindow, Lazy preferencesWindow, Provider unlockWindowBuilderProvider, Provider lockWindowBuilderProvider, Lazy quitWindow, Optional trayIntegration, Optional appearanceProvider, VaultService vaultService, LicenseHolder licenseHolder, VaultListManager vaultListManager) { + this.settings = settings; this.mainWindow = mainWindow; this.preferencesWindow = preferencesWindow; @@ -78,7 +79,7 @@ public class FxApplication extends Application { this.visibleWindows = Stage.getWindows().filtered(Window::isShowing); this.hasVisibleWindows = Bindings.isNotEmpty(visibleWindows); this.vaultListManager = vaultListManager; - this.autoLockProvider = autoLockProvider; + //this.autoLockProvider = autoLockProvider; } public void start() { @@ -89,7 +90,7 @@ public class FxApplication extends Application { settings.theme().addListener(this::appThemeChanged); loadSelectedStyleSheet(settings.theme().get()); - applySystemListener(); + //applySystemListener(); } @Override @@ -128,6 +129,7 @@ public class FxApplication extends Application { unlockWindowBuilderProvider.get().vault(vault).owner(owner).build().startUnlockWorkflow(); LOG.debug("Showing UnlockWindow for {}", vault.getDisplayName()); }); + checkAutolock(vault, owner); } public void startLockWorkflow(Vault vault, Optional owner) { @@ -204,7 +206,7 @@ public class FxApplication extends Application { }); } - private void applySystemListener() { + /*private void applySystemListener() { autoLockProvider.ifPresent(autoLockProvider -> { try { autoLockProvider.addListener(this::systemInterfaceStateChanged); @@ -229,5 +231,21 @@ public class FxApplication extends Application { } }); } + */ + + public void checkAutolock(Vault vault, Optional owner){ + if (vault.getVaultSettings().lockAfterTime().get()){ //TODO: this is lock after a fixed amount of minutes + LOG.info("Locking after {} minutes", vault.getVaultSettings().lockTimeInMinutes().get()); + new java.util.Timer().schedule( + new java.util.TimerTask() { + @Override + public void run() { + startLockWorkflow(vault, owner); + } + }, + new Date(System.currentTimeMillis() + Integer.parseInt(vault.getVaultSettings().lockTimeInMinutes().get()) * 60 * 1000) + ); + } + } } diff --git a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/AutoLockVaultOptionsController.java b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/AutoLockVaultOptionsController.java index 24de5c8c1..722dcab97 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/AutoLockVaultOptionsController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/AutoLockVaultOptionsController.java @@ -19,13 +19,14 @@ public class AutoLockVaultOptionsController implements FxController { private final Stage window; public CheckBox lockOnSleepCheckbox; public CheckBox lockAfterIdleTimeCheckbox; + public CheckBox lockAfterTimeCheckbox; public TextField lockIdleTimeInMinutesTextField; + public TextField lockTimeInMinutesTextField; @Inject AutoLockVaultOptionsController(@VaultOptionsWindow Stage window, @VaultOptionsWindow Vault vault, ResourceBundle resourceBundle) { this.window = window; this.vault = vault; - //this.resourceBundle = resourceBundle; } @FXML @@ -33,5 +34,7 @@ public class AutoLockVaultOptionsController implements FxController { lockOnSleepCheckbox.selectedProperty().bindBidirectional(vault.getVaultSettings().lockOnSleep()); lockAfterIdleTimeCheckbox.selectedProperty().bindBidirectional(vault.getVaultSettings().lockAfterIdleTime()); lockIdleTimeInMinutesTextField.textProperty().bindBidirectional(vault.getVaultSettings().lockIdleTimeInMinutes()); + lockAfterTimeCheckbox.selectedProperty().bindBidirectional(vault.getVaultSettings().lockAfterTime()); + lockTimeInMinutesTextField.textProperty().bindBidirectional(vault.getVaultSettings().lockTimeInMinutes()); } } diff --git a/main/ui/src/main/resources/fxml/vault_options_autolock.fxml b/main/ui/src/main/resources/fxml/vault_options_autolock.fxml index a2f14453f..466d4d21b 100644 --- a/main/ui/src/main/resources/fxml/vault_options_autolock.fxml +++ b/main/ui/src/main/resources/fxml/vault_options_autolock.fxml @@ -15,11 +15,19 @@ + + + + + + + + - + diff --git a/main/ui/src/main/resources/i18n/strings.properties b/main/ui/src/main/resources/i18n/strings.properties index fc66d90ea..31311fc2a 100644 --- a/main/ui/src/main/resources/i18n/strings.properties +++ b/main/ui/src/main/resources/i18n/strings.properties @@ -297,7 +297,8 @@ vaultOptions.autoLock=Auto-Lock vaultOptions.autoLock.lockOnSleep=Lock on sleep vaultOptions.autoLock.lockAfterIdleTimePart1=Lock after computer is idle for vaultOptions.autoLock.lockAfterIdleTimePart2=minutes. -vaultOptions.autoLock.lockAfterAmountOfIdleTime=Following minutes are set: +vaultOptions.autoLock.lockAfterTimePart1=Lock after +vaultOptions.autoLock.lockAfterTimePart2=minutes. # Recovery Key recoveryKey.title=Recovery Key