From 54a005a5c97fcb4a0bb98d10a0baacd73883acf2 Mon Sep 17 00:00:00 2001 From: Ralph Plawetzki Date: Mon, 4 Oct 2021 19:45:26 +0200 Subject: [PATCH 01/23] Pass the name of the vault on storing a passphrase --- pom.xml | 2 +- .../org/cryptomator/common/keychain/KeychainManager.java | 6 ++++++ .../masterkeyfile/MasterkeyFileLoadingFinisher.java | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ce8a4b4d8..e6544520a 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ 2.1.0-beta13 - 1.0.0 + 1.1.0 1.0.0-rc1 1.0.0-rc1 1.0.0-rc2 diff --git a/src/main/java/org/cryptomator/common/keychain/KeychainManager.java b/src/main/java/org/cryptomator/common/keychain/KeychainManager.java index c97d0e9c9..e8783e159 100644 --- a/src/main/java/org/cryptomator/common/keychain/KeychainManager.java +++ b/src/main/java/org/cryptomator/common/keychain/KeychainManager.java @@ -49,6 +49,12 @@ public class KeychainManager implements KeychainAccessProvider { setPassphraseStored(key, true); } + @Override + public void storePassphrase(String key, String displayName, CharSequence passphrase) throws KeychainAccessException { + getKeychainOrFail().storePassphrase(key, displayName, passphrase); + setPassphraseStored(key, true); + } + @Override public char[] loadPassphrase(String key) throws KeychainAccessException { char[] passphrase = getKeychainOrFail().loadPassphrase(key); diff --git a/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingFinisher.java b/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingFinisher.java index 8eda41cd0..44d7ebfb0 100644 --- a/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingFinisher.java +++ b/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingFinisher.java @@ -47,7 +47,7 @@ class MasterkeyFileLoadingFinisher { private void savePasswordToSystemkeychain() { if (keychain.isSupported()) { try { - keychain.storePassphrase(vault.getId(), CharBuffer.wrap(enteredPassword.get())); + keychain.storePassphrase(vault.getId(), vault.getDisplayName(), CharBuffer.wrap(enteredPassword.get())); } catch (KeychainAccessException e) { LOG.error("Failed to store passphrase in system keychain.", e); } From 445cb7e242beef36d9d6f84bed19ba15ca6b0d9d Mon Sep 17 00:00:00 2001 From: Ralph Plawetzki Date: Wed, 6 Oct 2021 07:53:38 +0200 Subject: [PATCH 02/23] Pass the name of the vault on changing a passphrase --- .../org/cryptomator/common/keychain/KeychainManager.java | 8 ++++++++ .../ui/changepassword/ChangePasswordController.java | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/cryptomator/common/keychain/KeychainManager.java b/src/main/java/org/cryptomator/common/keychain/KeychainManager.java index e8783e159..d6adadfe4 100644 --- a/src/main/java/org/cryptomator/common/keychain/KeychainManager.java +++ b/src/main/java/org/cryptomator/common/keychain/KeychainManager.java @@ -76,6 +76,14 @@ public class KeychainManager implements KeychainAccessProvider { } } + @Override + public void changePassphrase(String key, String displayName, CharSequence passphrase) throws KeychainAccessException { + if (isPassphraseStored(key)) { + getKeychainOrFail().changePassphrase(key, displayName, passphrase); + setPassphraseStored(key, true); + } + } + @Override public boolean isSupported() { return keychain.getValue() != null; diff --git a/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java b/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java index 54519f21f..b36ae89bf 100644 --- a/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java +++ b/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java @@ -102,7 +102,7 @@ public class ChangePasswordController implements FxController { private void updatePasswordInSystemkeychain() { if (keychain.isSupported() && !keychain.isLocked()) { try { - keychain.changePassphrase(vault.getId(), newPasswordController.passwordField.getCharacters()); + keychain.changePassphrase(vault.getId(), vault.getDisplayName(), newPasswordController.passwordField.getCharacters()); LOG.info("Successfully updated password in system keychain for {}", vault.getDisplayName()); } catch (KeychainAccessException e) { LOG.error("Failed to update password in system keychain.", e); From d4e0b4d07d38a398b97015a48341db87e960b7f9 Mon Sep 17 00:00:00 2001 From: Ralph Plawetzki Date: Fri, 8 Oct 2021 12:13:28 +0200 Subject: [PATCH 03/23] Change to 1.1.0-beta1 for now, so CI can load the dependency --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e6544520a..39757709d 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ 2.1.0-beta13 - 1.1.0 + 1.1.0-beta1 1.0.0-rc1 1.0.0-rc1 1.0.0-rc2 From c1c5367e2a73a436bfe399626a1ed1288a72b2cc Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Wed, 3 Nov 2021 11:54:24 +0100 Subject: [PATCH 04/23] closes #1891 --- .../cryptomator/ui/common/ErrorController.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/common/ErrorController.java b/src/main/java/org/cryptomator/ui/common/ErrorController.java index c75df26ce..a2204fae3 100644 --- a/src/main/java/org/cryptomator/ui/common/ErrorController.java +++ b/src/main/java/org/cryptomator/ui/common/ErrorController.java @@ -1,5 +1,6 @@ package org.cryptomator.ui.common; +import org.cryptomator.common.Environment; import org.cryptomator.common.ErrorCode; import org.cryptomator.common.Nullable; @@ -25,7 +26,11 @@ public class ErrorController implements FxController { private static final String REPORT_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/new?category=Errors&title=Error+%s&body=%s"; private static final String SEARCH_ERRORCODE_DELIM = " OR "; private static final String REPORT_BODY_TEMPLATE = """ + OS: %s / %s + App: %s / %s + + """; @@ -34,16 +39,18 @@ public class ErrorController implements FxController { private final ErrorCode errorCode; private final Scene previousScene; private final Stage window; + private final Environment environment; private BooleanProperty copiedDetails = new SimpleBooleanProperty(); @Inject - ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window) { + ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window, Environment environment) { this.application = application; this.stackTrace = stackTrace; this.errorCode = errorCode; this.previousScene = previousScene; this.window = window; + this.environment = environment; } @FXML @@ -67,7 +74,12 @@ public class ErrorController implements FxController { @FXML public void reportError() { var title = URLEncoder.encode(getErrorCode(), StandardCharsets.UTF_8); - var body = URLEncoder.encode(REPORT_BODY_TEMPLATE, StandardCharsets.UTF_8); + var enhancedTemplate = String.format(REPORT_BODY_TEMPLATE, // + System.getProperty("os.name"), // + System.getProperty("os.version"), // + environment.getAppVersion().orElse("undefined"), // + environment.getBuildNumber().orElse("undefined")); + var body = URLEncoder.encode(enhancedTemplate, StandardCharsets.UTF_8); application.getHostServices().showDocument(REPORT_URL_FORMAT.formatted(title, body)); } From ce9e1184ec83c3dc613b31a06a2ee1f763594daf Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Tue, 9 Nov 2021 12:39:45 +0100 Subject: [PATCH 05/23] bump cryptofs dependency --- pom.xml | 2 +- .../ui/changepassword/ChangePasswordController.java | 4 ++-- .../org/cryptomator/ui/recoverykey/RecoveryKeyFactory.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 86b1106ae..1b7fdf4e4 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ com.github.serceman,com.github.jnr,org.ow2.asm,net.java.dev.jna,org.apache.jackrabbit,org.apache.httpcomponents,de.swiesend,org.purejava,com.github.hypfvieh - 2.1.1 + 2.2.0 1.0.0 1.0.0 1.0.0 diff --git a/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java b/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java index 54519f21f..79b3790a0 100644 --- a/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java +++ b/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java @@ -2,7 +2,7 @@ package org.cryptomator.ui.changepassword; import org.cryptomator.common.keychain.KeychainManager; import org.cryptomator.common.vaults.Vault; -import org.cryptomator.cryptofs.common.MasterkeyBackupHelper; +import org.cryptomator.cryptofs.common.BackupHelper; import org.cryptomator.cryptolib.api.CryptoException; import org.cryptomator.cryptolib.api.InvalidPassphraseException; import org.cryptomator.cryptolib.common.MasterkeyFileAccess; @@ -83,7 +83,7 @@ public class ChangePasswordController implements FxController { Path masterkeyPath = vault.getPath().resolve(MASTERKEY_FILENAME); byte[] oldMasterkeyBytes = Files.readAllBytes(masterkeyPath); byte[] newMasterkeyBytes = masterkeyFileAccess.changePassphrase(oldMasterkeyBytes, oldPassphrase, newPassphrase); - Path backupKeyPath = vault.getPath().resolve(MASTERKEY_FILENAME + MasterkeyBackupHelper.generateFileIdSuffix(oldMasterkeyBytes) + MASTERKEY_BACKUP_SUFFIX); + Path backupKeyPath = vault.getPath().resolve(MASTERKEY_FILENAME + BackupHelper.generateFileIdSuffix(oldMasterkeyBytes) + MASTERKEY_BACKUP_SUFFIX); Files.move(masterkeyPath, backupKeyPath, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); Files.write(masterkeyPath, newMasterkeyBytes, StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE); LOG.info("Successfully changed password for {}", vault.getDisplayName()); diff --git a/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyFactory.java b/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyFactory.java index c078c718b..311f5746e 100644 --- a/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyFactory.java +++ b/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyFactory.java @@ -2,7 +2,7 @@ package org.cryptomator.ui.recoverykey; import com.google.common.base.Preconditions; import com.google.common.hash.Hashing; -import org.cryptomator.cryptofs.common.MasterkeyBackupHelper; +import org.cryptomator.cryptofs.common.BackupHelper; import org.cryptomator.cryptolib.api.CryptoException; import org.cryptomator.cryptolib.api.InvalidPassphraseException; import org.cryptomator.cryptolib.api.Masterkey; @@ -86,7 +86,7 @@ public class RecoveryKeyFactory { if (Files.exists(masterkeyPath)) { byte[] oldMasterkeyBytes = Files.readAllBytes(masterkeyPath); // TODO: deduplicate with ChangePasswordController: - Path backupKeyPath = vaultPath.resolve(MASTERKEY_FILENAME + MasterkeyBackupHelper.generateFileIdSuffix(oldMasterkeyBytes) + MASTERKEY_BACKUP_SUFFIX); + Path backupKeyPath = vaultPath.resolve(MASTERKEY_FILENAME + BackupHelper.generateFileIdSuffix(oldMasterkeyBytes) + MASTERKEY_BACKUP_SUFFIX); Files.move(masterkeyPath, backupKeyPath, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); } masterkeyFileAccess.persist(masterkey, masterkeyPath, newPassword); From b565a5a3f4d86f32ac51b570880f3f1cae69c0da Mon Sep 17 00:00:00 2001 From: Tobias Hagemann Date: Tue, 9 Nov 2021 15:49:25 +0100 Subject: [PATCH 06/23] added dmg step to mac build script [ci skip] --- dist/mac/dmg/.gitignore | 3 ++- dist/mac/dmg/build.sh | 28 +++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/dist/mac/dmg/.gitignore b/dist/mac/dmg/.gitignore index 738927994..c186170c9 100644 --- a/dist/mac/dmg/.gitignore +++ b/dist/mac/dmg/.gitignore @@ -1,3 +1,4 @@ # created during build runtime/ -*.app/ +dmg/ +*.dmg diff --git a/dist/mac/dmg/build.sh b/dist/mac/dmg/build.sh index 6051e6f4c..b8d17cbe0 100755 --- a/dist/mac/dmg/build.sh +++ b/dist/mac/dmg/build.sh @@ -16,13 +16,14 @@ shift "$((OPTIND-1))" # prepare working dir and variables cd $(dirname $0) -rm -rf runtime *.app +rm -rf runtime dmg REVISION_NO=`git rev-list --count HEAD` VERSION_NO=`mvn -f../../../pom.xml help:evaluate -Dexpression=project.version -q -DforceStdout | sed -rn 's/.*([0-9]+\.[0-9]+\.[0-9]+).*/\1/p'` # check preconditions if [ -z "${JAVA_HOME}" ]; then echo "JAVA_HOME not set. Run using JAVA_HOME=/path/to/jdk ./build.sh"; exit 1; fi command -v mvn >/dev/null 2>&1 || { echo >&2 "mvn not found."; exit 1; } +command -v create-dmg >/dev/null 2>&1 || { echo >&2 "create-dmg not found."; exit 1; } if [ -n "${CODESIGN_IDENTITY}" ]; then command -v codesign >/dev/null 2>&1 || { echo >&2 "codesign not found. Fix by 'xcode-select --install'."; exit 1; } if [[ ! `security find-identity -v -p codesigning | grep -w "${CODESIGN_IDENTITY}"` ]]; then echo "Given codesign identity is invalid."; exit 1; fi @@ -59,6 +60,7 @@ ${JAVA_HOME}/bin/jpackage \ --java-options "-Dcryptomator.appVersion=\"${VERSION_NO}\"" \ --app-version "${VERSION_NO}" \ --java-options "-Dfile.encoding=\"utf-8\"" \ + --java-options "-Dapple.awt.enableTemplateImages=true" \ --java-options "-Dcryptomator.logDir=\"~/Library/Logs/Cryptomator\"" \ --java-options "-Dcryptomator.pluginDir=\"~/Library/Application Support/Cryptomator/Plugins\"" \ --java-options "-Dcryptomator.settingsPath=\"~/Library/Application Support/Cryptomator/settings.json\"" \ @@ -94,3 +96,27 @@ if [ -n "${CODESIGN_IDENTITY}" ]; then echo "Codesigning Cryptomator.app..." codesign --force --deep --entitlements ../Cryptomator.entitlements -o runtime -s ${CODESIGN_IDENTITY} Cryptomator.app fi + +# prepare dmg contents +mkdir dmg +mv Cryptomator.app dmg +cp resources/macFUSE.webloc dmg + +# create dmg +create-dmg \ + --volname Cryptomator \ + --volicon "resources/Cryptomator-Volume.icns" \ + --background "resources/Cryptomator-background.tiff" \ + --window-pos 400 100 \ + --window-size 640 694 \ + --icon-size 128 \ + --icon "Cryptomator.app" 128 245 \ + --hide-extension "Cryptomator.app" \ + --icon "macFUSE.webloc" 320 501 \ + --hide-extension "macFUSE.webloc" \ + --app-drop-link 512 245 \ + --eula "resources/license.rtf" \ + --icon ".background" 128 758 \ + --icon ".fseventsd" 320 758 \ + --icon ".VolumeIcon.icns" 512 758 \ + Cryptomator-${VERSION_NO}.dmg dmg From 0c6ecef92bd7058b58528d1af492d39e381aa2dc Mon Sep 17 00:00:00 2001 From: Tobias Hagemann Date: Wed, 10 Nov 2021 08:51:50 +0100 Subject: [PATCH 07/23] Update README.md [ci skip] --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 4e29763ba..7ffb1fba1 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,14 @@ Cryptomator is provided free of charge as an open-source project despite the hig ### Silver Sponsors + + + + + + +
Mow Capital
+ - [Jameson Lopp](https://www.lopp.net/) --- From c5b6d8f81fcedf4c853dc6b99166fd318ccbcc3e Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Wed, 10 Nov 2021 12:20:52 +0100 Subject: [PATCH 08/23] target Ubuntu Bionic in PPA release (#1909) --- .github/workflows/release.yml | 2 +- dist/linux/debian/changelog | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 03d913c91..11268a60c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -207,7 +207,7 @@ jobs: ppa: name: Upload source package to PPA needs: [buildkit, metadata] - runs-on: ubuntu-latest + runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v2 - name: install build tools diff --git a/dist/linux/debian/changelog b/dist/linux/debian/changelog index 84a9756f9..2c7606733 100644 --- a/dist/linux/debian/changelog +++ b/dist/linux/debian/changelog @@ -1,4 +1,4 @@ -cryptomator (${PPA_VERSION}) focal; urgency=low +cryptomator (${PPA_VERSION}) bionic; urgency=low * Full changelog can be found on https://github.com/cryptomator/cryptomator/releases From 71a575e0792ae2c3569533733a0ace03a4c6edf5 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Wed, 10 Nov 2021 16:08:11 +0100 Subject: [PATCH 09/23] add build scripts for windows [ci skip] --- dist/win/.gitignore | 3 ++ dist/win/build.bat | 2 + dist/win/build.ps1 | 91 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 dist/win/.gitignore create mode 100644 dist/win/build.bat create mode 100644 dist/win/build.ps1 diff --git a/dist/win/.gitignore b/dist/win/.gitignore new file mode 100644 index 000000000..2b66ddbed --- /dev/null +++ b/dist/win/.gitignore @@ -0,0 +1,3 @@ +runtime +Cryptomator +installer \ No newline at end of file diff --git a/dist/win/build.bat b/dist/win/build.bat new file mode 100644 index 000000000..ebfe2aa0b --- /dev/null +++ b/dist/win/build.bat @@ -0,0 +1,2 @@ +@echo off +powershell -NoExit -ExecutionPolicy Unrestricted -Command .\build.ps1 \ No newline at end of file diff --git a/dist/win/build.ps1 b/dist/win/build.ps1 new file mode 100644 index 000000000..e4024d46d --- /dev/null +++ b/dist/win/build.ps1 @@ -0,0 +1,91 @@ +# check preconditions +if ((Get-Command "git" -ErrorAction SilentlyContinue) -eq $null) +{ + Write-Host "Unable to find git.exe in your PATH (try: choco install git)" + exit 1 +} +if ((Get-Command "mvn" -ErrorAction SilentlyContinue) -eq $null) +{ + Write-Host "Unable to find mvn.cmd in your PATH (try: choco install maven)" + exit 1 +} + +$buildDir = Split-Path -Parent $PSCommandPath +$version = $(mvn -f $buildDir/../../pom.xml help:evaluate -Dexpression="project.version" -q -DforceStdout) +$semVerNo = $version -replace '(\d\.\d\.\d).*','$1' +$revisionNo = $(git rev-list --count HEAD) + +Write-Output "`$version=$version" +Write-Output "`$semVerNo=$semVerNo" +Write-Output "`$revisionNo=$revisionNo" +Write-Output "`$buildDir=$buildDir" +Write-Output "`$Env:JAVA_HOME=$Env:JAVA_HOME" + +# compile +&mvn -B -f $buildDir/../../pom.xml clean package -DskipTests -Pwin +Copy-Item "$buildDir\..\..\target\cryptomator-*.jar" -Destination "$buildDir\..\..\target\mods" + +# add runtime +& "$Env:JAVA_HOME\bin\jlink" ` + --verbose ` + --output runtime ` + --module-path "$Env:JAVA_HOME/jmods" ` + --add-modules java.base,java.desktop,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,jdk.unsupported,jdk.crypto.ec,jdk.accessibility ` + --no-header-files ` + --no-man-pages ` + --strip-debug ` + --compress=1 + +# create app dir +& "$Env:JAVA_HOME\bin\jpackage" ` + --verbose ` + --type app-image ` + --runtime-image runtime ` + --input ../../target/libs ` + --module-path ../../target/mods ` + --module org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator ` + --dest . ` + --name Cryptomator ` + --vendor "Skymatic GmbH" ` + --copyright "(C) 2016 - 2021 Skymatic GmbH" ` + --java-options "-Xss5m" ` + --java-options "-Xmx256m" ` + --java-options "-Dcryptomator.appVersion=`"$semVerNo`"" ` + --app-version "$semVerNo.$revisionNo" ` + --java-options "-Dfile.encoding=`"utf-8`"" ` + --java-options "-Dcryptomator.logDir=`"~/AppData/Roaming/Cryptomator`"" ` + --java-options "-Dcryptomator.pluginDir=`"~/AppData/Roaming/Cryptomator/Plugins`"" ` + --java-options "-Dcryptomator.settingsPath=`"~/AppData/Roaming/Cryptomator/settings.json`"" ` + --java-options "-Dcryptomator.ipcSocketPath=`"~/AppData/Roaming/Cryptomator/ipc.socket`"" ` + --java-options "-Dcryptomator.keychainPath=`"~/AppData/Roaming/Cryptomator/keychain.json`"" ` + --java-options "-Dcryptomator.mountPointsDir=`"~/Cryptomator`"" ` + --java-options "-Dcryptomator.showTrayIcon=true" ` + --java-options "-Dcryptomator.buildNumber=`"msi-$revisionNo`"" ` + --resource-dir resources ` + --icon resources/Cryptomator.ico + +# patch app dir +Copy-Item "contrib\*" -Destination "Cryptomator" +attrib -r "Cryptomator\Cryptomator.exe" + + +# create .msi bundle +$Env:JP_WIXWIZARD_RESOURCES = "$buildDir\resources" +& "$Env:JAVA_HOME\bin\jpackage" ` + --verbose ` + --type msi ` + --win-upgrade-uuid bda45523-42b1-4cae-9354-a45475ed4775 ` + --app-image Cryptomator ` + --dest installer ` + --name Cryptomator ` + --vendor "Skymatic GmbH" ` + --copyright "(C) 2016 - 2021 Skymatic GmbH" ` + --app-version "$semVerNo" ` + --win-menu ` + --win-dir-chooser ` + --win-shortcut-prompt ` + --win-update-url "https:\\cryptomator.org" ` + --win-menu-group Cryptomator ` + --resource-dir resources ` + --license-file resources/license.rtf ` + --file-associations resources/FAvaultFile.properties \ No newline at end of file From 1b43bf395fd0d268f0306124cabaddf91aa9ed9f Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Wed, 17 Nov 2021 13:45:43 +0100 Subject: [PATCH 10/23] apply same error handling to "force lock" as well --- .../ui/common/UserInteractionLock.java | 6 ++++- .../org/cryptomator/ui/lock/LockWorkflow.java | 25 +++++++++++-------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/common/UserInteractionLock.java b/src/main/java/org/cryptomator/ui/common/UserInteractionLock.java index f0c199648..4eba62552 100644 --- a/src/main/java/org/cryptomator/ui/common/UserInteractionLock.java +++ b/src/main/java/org/cryptomator/ui/common/UserInteractionLock.java @@ -16,7 +16,11 @@ public class UserInteractionLock { private volatile E state; public UserInteractionLock(E initialValue) { - state = initialValue; + this.state = initialValue; + } + + public synchronized void reset(E value) { + this.state = value; } public void interacted(E result) { diff --git a/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java b/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java index 73b4844b9..db3ff2484 100644 --- a/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java +++ b/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java @@ -51,20 +51,25 @@ public class LockWorkflow extends Task { @Override protected Void call() throws Volume.VolumeException, InterruptedException, LockNotCompletedException { - try { - vault.lock(false); - } catch (Volume.VolumeException | LockNotCompletedException e) { - LOG.debug("Regular lock of {} failed.", vault.getDisplayName(), e); - var decision = askUserForAction(); - switch (decision) { - case FORCE -> vault.lock(true); - case CANCEL -> cancel(false); - } - } + lock(false); return null; } + private void lock(boolean forced) throws InterruptedException { + try { + vault.lock(forced); + } catch (Volume.VolumeException | LockNotCompletedException e) { + LOG.info("Locking {} failed (forced: {}).", vault.getDisplayName(), forced, e); + var decision = askUserForAction(); + switch (decision) { + case FORCE -> lock(true); + case CANCEL -> cancel(false); + } + } + } + private LockModule.ForceLockDecision askUserForAction() throws InterruptedException { + forceLockDecisionLock.reset(null); // show forcedLock dialogue ... Platform.runLater(() -> { lockWindow.setScene(lockForcedScene.get()); From 21d342d1176989eebd052c6e9865d685327fb12a Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Wed, 17 Nov 2021 14:03:04 +0100 Subject: [PATCH 11/23] Add non-forced retry lock button --- .../cryptomator/ui/lock/LockForcedController.java | 12 +++++++++++- .../java/org/cryptomator/ui/lock/LockModule.java | 1 + .../java/org/cryptomator/ui/lock/LockWorkflow.java | 1 + src/main/resources/fxml/lock_forced.fxml | 6 +++--- src/main/resources/i18n/strings.properties | 3 ++- 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/lock/LockForcedController.java b/src/main/java/org/cryptomator/ui/lock/LockForcedController.java index 8d4ce32d3..c3a452acc 100644 --- a/src/main/java/org/cryptomator/ui/lock/LockForcedController.java +++ b/src/main/java/org/cryptomator/ui/lock/LockForcedController.java @@ -35,7 +35,13 @@ public class LockForcedController implements FxController { } @FXML - public void confirmForcedLock() { + public void retry() { + forceLockDecisionLock.interacted(LockModule.ForceLockDecision.RETRY); + window.close(); + } + + @FXML + public void force() { forceLockDecisionLock.interacted(LockModule.ForceLockDecision.FORCE); window.close(); } @@ -54,4 +60,8 @@ public class LockForcedController implements FxController { return vault.getDisplayName(); } + public boolean isForceSupported() { + return vault.supportsForcedUnmount(); + } + } diff --git a/src/main/java/org/cryptomator/ui/lock/LockModule.java b/src/main/java/org/cryptomator/ui/lock/LockModule.java index 160dcf6fb..d1eb5f189 100644 --- a/src/main/java/org/cryptomator/ui/lock/LockModule.java +++ b/src/main/java/org/cryptomator/ui/lock/LockModule.java @@ -28,6 +28,7 @@ abstract class LockModule { enum ForceLockDecision { CANCEL, + RETRY, FORCE; } diff --git a/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java b/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java index db3ff2484..00b25c507 100644 --- a/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java +++ b/src/main/java/org/cryptomator/ui/lock/LockWorkflow.java @@ -62,6 +62,7 @@ public class LockWorkflow extends Task { LOG.info("Locking {} failed (forced: {}).", vault.getDisplayName(), forced, e); var decision = askUserForAction(); switch (decision) { + case RETRY -> lock(false); case FORCE -> lock(true); case CANCEL -> cancel(false); } diff --git a/src/main/resources/fxml/lock_forced.fxml b/src/main/resources/fxml/lock_forced.fxml index 4596af119..b0b5baa63 100644 --- a/src/main/resources/fxml/lock_forced.fxml +++ b/src/main/resources/fxml/lock_forced.fxml @@ -33,11 +33,11 @@ - +