From 54a005a5c97fcb4a0bb98d10a0baacd73883acf2 Mon Sep 17 00:00:00 2001 From: Ralph Plawetzki Date: Mon, 4 Oct 2021 19:45:26 +0200 Subject: [PATCH 01/31] 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/31] 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/31] 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 2808d777e0a45eb3f35da80d37afaee75d7b938a Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Mon, 29 Nov 2021 16:37:23 +0100 Subject: [PATCH 04/31] Add `cryptomator-vault` alias to etc/hosts during (re)install (#1914) Co-authored-by: Armin Schrenk --- dist/win/build.bat | 2 +- dist/win/build.ps1 | 1 - dist/win/contrib/patchHosts.bat | 3 +++ dist/win/contrib/patchHosts.ps1 | 16 ++++++++++++++++ dist/win/resources/main.wxs | 4 ++++ 5 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 dist/win/contrib/patchHosts.bat create mode 100644 dist/win/contrib/patchHosts.ps1 diff --git a/dist/win/build.bat b/dist/win/build.bat index ebfe2aa0b..8ca9183b4 100644 --- a/dist/win/build.bat +++ b/dist/win/build.bat @@ -1,2 +1,2 @@ @echo off -powershell -NoExit -ExecutionPolicy Unrestricted -Command .\build.ps1 \ No newline at end of file +powershell -NoLogo -NoExit -ExecutionPolicy Unrestricted -Command .\build.ps1 \ No newline at end of file diff --git a/dist/win/build.ps1 b/dist/win/build.ps1 index e4024d46d..8ed5d9193 100644 --- a/dist/win/build.ps1 +++ b/dist/win/build.ps1 @@ -68,7 +68,6 @@ Copy-Item "$buildDir\..\..\target\cryptomator-*.jar" -Destination "$buildDir\..\ Copy-Item "contrib\*" -Destination "Cryptomator" attrib -r "Cryptomator\Cryptomator.exe" - # create .msi bundle $Env:JP_WIXWIZARD_RESOURCES = "$buildDir\resources" & "$Env:JAVA_HOME\bin\jpackage" ` diff --git a/dist/win/contrib/patchHosts.bat b/dist/win/contrib/patchHosts.bat new file mode 100644 index 000000000..6363b3e33 --- /dev/null +++ b/dist/win/contrib/patchHosts.bat @@ -0,0 +1,3 @@ +@echo off +cd %~dp0 +powershell -NoLogo -NonInteractive -ExecutionPolicy Unrestricted -Command .\patchHosts.ps1 \ No newline at end of file diff --git a/dist/win/contrib/patchHosts.ps1 b/dist/win/contrib/patchHosts.ps1 new file mode 100644 index 000000000..bab50cc63 --- /dev/null +++ b/dist/win/contrib/patchHosts.ps1 @@ -0,0 +1,16 @@ +#Requires -RunAsAdministrator + +$sysdir = [Environment]::SystemDirectory +$hostsFile = "$sysdir\drivers\etc\hosts" +$aliasLine = '127.0.0.1 cryptomator-vault' + +foreach ($line in Get-Content $hostsFile) { + if ($line -eq $aliasLine){ + Write-Output 'No changes necessary' + exit 0 + } +} + +Add-Content -Path $hostsFile -Encoding ascii -Value "`r`n$aliasLine" +Write-Output 'Added alias to hosts file' +exit 0 diff --git a/dist/win/resources/main.wxs b/dist/win/resources/main.wxs index cd9677a1c..8a0123a57 100644 --- a/dist/win/resources/main.wxs +++ b/dist/win/resources/main.wxs @@ -124,6 +124,8 @@ + + @@ -153,6 +155,8 @@ JP_DOWNGRADABLE_FOUND + + NOT Installed OR REINSTALL From e9e5df63102ab1d21522417fe1df7a8575c6bfe9 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Mon, 29 Nov 2021 17:12:30 +0100 Subject: [PATCH 05/31] Bump dependencies: * cryptofs * gson * logback Closes #1825 --- pom.xml | 6 +++--- src/main/resources/license/THIRD-PARTY.txt | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 1b7fdf4e4..0da3fd9da 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.2.0 + 2.3.0 1.0.0 1.0.0 1.0.0 @@ -43,10 +43,10 @@ 2.2 31.0-jre 2.39 - 2.8.8 + 2.8.9 1.5.2 1.7.32 - 1.2.6 + 1.2.7 5.8.1 diff --git a/src/main/resources/license/THIRD-PARTY.txt b/src/main/resources/license/THIRD-PARTY.txt index dc72e661d..fbb380718 100644 --- a/src/main/resources/license/THIRD-PARTY.txt +++ b/src/main/resources/license/THIRD-PARTY.txt @@ -17,7 +17,6 @@ Cryptomator uses 40 third-party dependencies under the following licenses: - jnr-a64asm (com.github.jnr:jnr-a64asm:1.0.0 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-a64asm) - jnr-constants (com.github.jnr:jnr-constants:0.10.2 - http://github.com/jnr/jnr-constants) - jnr-ffi (com.github.jnr:jnr-ffi:2.2.7 - http://github.com/jnr/jnr-ffi) - - Gson (com.google.code.gson:gson:2.8.8 - https://github.com/google/gson/gson) - Dagger (com.google.dagger:dagger:2.39 - https://github.com/google/dagger) - Guava InternalFutureFailureAccess and InternalFutures (com.google.guava:failureaccess:1.0.1 - https://github.com/google/guava/failureaccess) - Guava: Google Core Libraries for Java (com.google.guava:guava:31.0-jre - https://github.com/google/guava) @@ -34,6 +33,7 @@ Cryptomator uses 40 third-party dependencies under the following licenses: - Jetty :: Utilities (org.eclipse.jetty:jetty-util:10.0.6 - https://eclipse.org/jetty/jetty-util) - Jetty :: Servlet API and Schemas for JPMS and OSGi (org.eclipse.jetty.toolchain:jetty-servlet-api:4.0.6 - https://eclipse.org/jetty/jetty-servlet-api) Apache-2.0: + - Gson (com.google.code.gson:gson:2.8.9 - https://github.com/google/gson/gson) - Java Native Access (net.java.dev.jna:jna:5.9.0 - https://github.com/java-native-access/jna) - Java Native Access Platform (net.java.dev.jna:jna-platform:5.9.0 - https://github.com/java-native-access/jna) BSD-3-Clause: @@ -52,13 +52,13 @@ Cryptomator uses 40 third-party dependencies under the following licenses: - Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:10.0.6 - https://eclipse.org/jetty/jetty-servlet) - Jetty :: Utilities (org.eclipse.jetty:jetty-util:10.0.6 - https://eclipse.org/jetty/jetty-util) Eclipse Public License - v 1.0: - - Logback Classic Module (ch.qos.logback:logback-classic:1.2.6 - http://logback.qos.ch/logback-classic) - - Logback Core Module (ch.qos.logback:logback-core:1.2.6 - http://logback.qos.ch/logback-core) + - Logback Classic Module (ch.qos.logback:logback-classic:1.2.7 - http://logback.qos.ch/logback-classic) + - Logback Core Module (ch.qos.logback:logback-core:1.2.7 - http://logback.qos.ch/logback-core) Eclipse Public License - v 2.0: - jnr-posix (com.github.jnr:jnr-posix:3.1.10 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix) GNU Lesser General Public License: - - Logback Classic Module (ch.qos.logback:logback-classic:1.2.6 - http://logback.qos.ch/logback-classic) - - Logback Core Module (ch.qos.logback:logback-core:1.2.6 - http://logback.qos.ch/logback-core) + - Logback Classic Module (ch.qos.logback:logback-classic:1.2.7 - http://logback.qos.ch/logback-classic) + - Logback Core Module (ch.qos.logback:logback-core:1.2.7 - http://logback.qos.ch/logback-core) GPLv2: - jnr-posix (com.github.jnr:jnr-posix:3.1.10 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix) GPLv2+CE: From 13e9775458d92f4b0f56891eb10e1fb7d5ad3ad3 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Mon, 29 Nov 2021 17:33:11 +0100 Subject: [PATCH 06/31] Closes #1918 --- .../MasterkeyFileLoadingStrategy.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingStrategy.java b/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingStrategy.java index 39db1cc04..1fa7dd986 100644 --- a/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingStrategy.java +++ b/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingStrategy.java @@ -3,6 +3,7 @@ package org.cryptomator.ui.keyloading.masterkeyfile; import com.google.common.base.Preconditions; import dagger.Lazy; import org.cryptomator.common.vaults.Vault; +import org.cryptomator.cryptofs.common.BackupHelper; import org.cryptomator.cryptolib.api.InvalidPassphraseException; import org.cryptomator.cryptolib.api.Masterkey; import org.cryptomator.cryptolib.api.MasterkeyLoadingFailedException; @@ -20,6 +21,7 @@ import javafx.application.Platform; import javafx.scene.Scene; import javafx.stage.Stage; import javafx.stage.Window; +import java.io.IOException; import java.net.URI; import java.nio.CharBuffer; import java.nio.file.Files; @@ -61,14 +63,24 @@ public class MasterkeyFileLoadingStrategy implements KeyLoadingStrategy { @Override public Masterkey loadKey(URI keyId) throws MasterkeyLoadingFailedException { Preconditions.checkArgument(SCHEME.equalsIgnoreCase(keyId.getScheme()), "Only supports keys with scheme " + SCHEME); - try { Path filePath = vault.getPath().resolve(keyId.getSchemeSpecificPart()); if (!Files.exists(filePath)) { filePath = getAlternateMasterkeyFilePath(); } CharSequence passphrase = getPassphrase(); - return masterkeyFileAccess.load(filePath, passphrase); + var masterkey = masterkeyFileAccess.load(filePath, passphrase); + //backup + if (filePath.startsWith(vault.getPath())) { + try { + BackupHelper.attemptBackup(filePath); + } catch (IOException e) { + LOG.warn("Unable to create backup for masterkey file."); + } + } else { + LOG.info("Masterkey file not stored inside vault. Not creating a backup."); + } + return masterkey; } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new UnlockCancelledException("Unlock interrupted", e); From b9bbbc1f869f9de679be3f1179b1357e32be8748 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Tue, 30 Nov 2021 17:02:37 +0100 Subject: [PATCH 07/31] Bump javafx --- pom.xml | 2 +- src/main/resources/license/THIRD-PARTY.txt | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 0da3fd9da..8caeb8a32 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ 1.2.6 - 17.0.0.1 + 17.0.1 3.12.0 3.18.2 2.2 diff --git a/src/main/resources/license/THIRD-PARTY.txt b/src/main/resources/license/THIRD-PARTY.txt index fbb380718..3b3ad5ab2 100644 --- a/src/main/resources/license/THIRD-PARTY.txt +++ b/src/main/resources/license/THIRD-PARTY.txt @@ -62,10 +62,10 @@ Cryptomator uses 40 third-party dependencies under the following licenses: GPLv2: - jnr-posix (com.github.jnr:jnr-posix:3.1.10 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix) GPLv2+CE: - - javafx-base (org.openjfx:javafx-base:17.0.0.1 - https://openjdk.java.net/projects/openjfx/javafx-base/) - - javafx-controls (org.openjfx:javafx-controls:17.0.0.1 - https://openjdk.java.net/projects/openjfx/javafx-controls/) - - javafx-fxml (org.openjfx:javafx-fxml:17.0.0.1 - https://openjdk.java.net/projects/openjfx/javafx-fxml/) - - javafx-graphics (org.openjfx:javafx-graphics:17.0.0.1 - https://openjdk.java.net/projects/openjfx/javafx-graphics/) + - javafx-base (org.openjfx:javafx-base:17.0.1 - https://openjdk.java.net/projects/openjfx/javafx-base/) + - javafx-controls (org.openjfx:javafx-controls:17.0.1 - https://openjdk.java.net/projects/openjfx/javafx-controls/) + - javafx-fxml (org.openjfx:javafx-fxml:17.0.1 - https://openjdk.java.net/projects/openjfx/javafx-fxml/) + - javafx-graphics (org.openjfx:javafx-graphics:17.0.1 - https://openjdk.java.net/projects/openjfx/javafx-graphics/) LGPL 2.1: - jnr-posix (com.github.jnr:jnr-posix:3.1.10 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix) LGPL-2.1-or-later: From 9f4a7c8cce67a9eede779fb97897de3f04507cac Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Wed, 1 Dec 2021 12:28:23 +0100 Subject: [PATCH 08/31] renamed scripts --- dist/win/contrib/{patchHosts.bat => patchWebDAV.bat} | 2 +- dist/win/contrib/{patchHosts.ps1 => patchWebDAV.ps1} | 0 dist/win/resources/main.wxs | 5 +++-- 3 files changed, 4 insertions(+), 3 deletions(-) rename dist/win/contrib/{patchHosts.bat => patchWebDAV.bat} (75%) rename dist/win/contrib/{patchHosts.ps1 => patchWebDAV.ps1} (100%) diff --git a/dist/win/contrib/patchHosts.bat b/dist/win/contrib/patchWebDAV.bat similarity index 75% rename from dist/win/contrib/patchHosts.bat rename to dist/win/contrib/patchWebDAV.bat index 6363b3e33..e31249831 100644 --- a/dist/win/contrib/patchHosts.bat +++ b/dist/win/contrib/patchWebDAV.bat @@ -1,3 +1,3 @@ @echo off cd %~dp0 -powershell -NoLogo -NonInteractive -ExecutionPolicy Unrestricted -Command .\patchHosts.ps1 \ No newline at end of file +powershell -NoLogo -NonInteractive -ExecutionPolicy Unrestricted -Command .\patchWebDAV.ps1 \ No newline at end of file diff --git a/dist/win/contrib/patchHosts.ps1 b/dist/win/contrib/patchWebDAV.ps1 similarity index 100% rename from dist/win/contrib/patchHosts.ps1 rename to dist/win/contrib/patchWebDAV.ps1 diff --git a/dist/win/resources/main.wxs b/dist/win/resources/main.wxs index 8a0123a57..4954e1ea8 100644 --- a/dist/win/resources/main.wxs +++ b/dist/win/resources/main.wxs @@ -124,7 +124,8 @@ - + + @@ -156,7 +157,7 @@ - NOT Installed OR REINSTALL + NOT Installed OR REINSTALL From eee672f9eefd65805365c8ebab5eba218428c410 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Wed, 1 Dec 2021 13:53:33 +0100 Subject: [PATCH 09/31] closes #1932, closes #1931 --- dist/win/contrib/patchWebDAV.ps1 | 63 +++++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/dist/win/contrib/patchWebDAV.ps1 b/dist/win/contrib/patchWebDAV.ps1 index bab50cc63..51b063560 100644 --- a/dist/win/contrib/patchWebDAV.ps1 +++ b/dist/win/contrib/patchWebDAV.ps1 @@ -1,16 +1,61 @@ #Requires -RunAsAdministrator -$sysdir = [Environment]::SystemDirectory -$hostsFile = "$sysdir\drivers\etc\hosts" -$aliasLine = '127.0.0.1 cryptomator-vault' +# Adds for address 127.0.0.1 the 'cryptomator-vault' alias to the hosts file +function Add-AliasToHost { + $sysdir = [Environment]::SystemDirectory + $hostsFile = "$sysdir\drivers\etc\hosts" + $aliasLine = '127.0.0.1 cryptomator-vault' -foreach ($line in Get-Content $hostsFile) { - if ($line -eq $aliasLine){ - Write-Output 'No changes necessary' - exit 0 + foreach ($line in Get-Content $hostsFile) { + if ($line -eq $aliasLine){ + return + } } + + Add-Content -Path $hostsFile -Encoding ascii -Value "`r`n$aliasLine" } -Add-Content -Path $hostsFile -Encoding ascii -Value "`r`n$aliasLine" -Write-Output 'Added alias to hosts file' + +# Sets in the registry the webclient file size limit to the maximum value +function Set-WebDAVFileSizeLimit { + # Set variables to indicate value and key to set + $RegistryPath = 'HKLM:\SYSTEM\CurrentControlSet\Services\WebClient\Parameters' + $Name = 'FileSizeLimitInBytes' + $Value = '0xffffffff' + + # Create the key if it does not exist + If (-NOT (Test-Path $RegistryPath)) { + New-Item -Path $RegistryPath -Force | Out-Null + } + + # Now set the value + New-ItemProperty -Path $RegistryPath -Name $Name -Value $Value -PropertyType DWORD -Force | Out-Null +} + + +# Changes the network provider order such that the builtin Windows webclient is always first +function Edit-ProviderOrder { + $RegistryPath = 'HKLM:\SYSTEM\CurrentControlSet\Control\NetworkProvider\HwOrder' + $Name = 'ProviderOrder' + $WebClientString = 'webclient' + + $CurrentOrder = (Get-ItemProperty $RegistryPath $Name).$Name + + $OrderWithoutWebclientArray = $CurrentOrder -split ',' | Where-Object {$_ -ne $WebClientString} + $WebClientArray = @($WebClientString) + + $UpdatedOrder = ($WebClientArray + $OrderWithoutWebclientArray) -join "," + New-ItemProperty -Path $RegistryPath -Name $Name -Value $UpdatedOrder -PropertyType String -Force | Out-Null +} + + +Add-AliasToHost +Write-Output 'Ensured alias exists in hosts file' + +Set-WebDAVFileSizeLimit +Write-Output 'Set WebDAV file size limit' + +Edit-ProviderOrder +Write-Output 'Ensured correct provider order' + exit 0 From 61d84a0da711a335fdafa3e6ed032839c3087c52 Mon Sep 17 00:00:00 2001 From: Cryptobot Date: Thu, 2 Dec 2021 08:45:23 +0100 Subject: [PATCH 10/31] New Crowdin updates (#1894) * New translations strings.properties [ci skip] --- src/main/resources/i18n/strings_ar.properties | 3 +- src/main/resources/i18n/strings_bs.properties | 2 - src/main/resources/i18n/strings_ca.properties | 7 +- src/main/resources/i18n/strings_cs.properties | 6 +- src/main/resources/i18n/strings_de.properties | 7 +- src/main/resources/i18n/strings_el.properties | 5 +- src/main/resources/i18n/strings_es.properties | 9 +- .../resources/i18n/strings_fil.properties | 1 + src/main/resources/i18n/strings_fr.properties | 9 +- src/main/resources/i18n/strings_he.properties | 156 ++++++++++++++++++ src/main/resources/i18n/strings_hi.properties | 1 + src/main/resources/i18n/strings_hu.properties | 33 ++++ src/main/resources/i18n/strings_id.properties | 136 ++++++++++++++- src/main/resources/i18n/strings_it.properties | 5 +- src/main/resources/i18n/strings_ja.properties | 7 +- src/main/resources/i18n/strings_ko.properties | 3 +- src/main/resources/i18n/strings_nb.properties | 3 +- src/main/resources/i18n/strings_nl.properties | 5 +- src/main/resources/i18n/strings_pa.properties | 2 - src/main/resources/i18n/strings_pl.properties | 5 +- src/main/resources/i18n/strings_pt.properties | 16 +- .../resources/i18n/strings_pt_BR.properties | 7 +- src/main/resources/i18n/strings_ro.properties | 3 +- src/main/resources/i18n/strings_ru.properties | 11 +- src/main/resources/i18n/strings_sk.properties | 5 +- src/main/resources/i18n/strings_sr.properties | 2 - .../resources/i18n/strings_sr_Latn.properties | 2 - src/main/resources/i18n/strings_sv.properties | 5 +- src/main/resources/i18n/strings_ta.properties | 89 ++++++++++ src/main/resources/i18n/strings_te.properties | 89 ++++++++++ src/main/resources/i18n/strings_tr.properties | 5 +- src/main/resources/i18n/strings_uk.properties | 48 ++++++ src/main/resources/i18n/strings_zh.properties | 5 +- .../resources/i18n/strings_zh_TW.properties | 3 +- 34 files changed, 634 insertions(+), 61 deletions(-) create mode 100644 src/main/resources/i18n/strings_he.properties create mode 100644 src/main/resources/i18n/strings_ta.properties create mode 100644 src/main/resources/i18n/strings_te.properties diff --git a/src/main/resources/i18n/strings_ar.properties b/src/main/resources/i18n/strings_ar.properties index c640ec7a5..a10658b48 100644 --- a/src/main/resources/i18n/strings_ar.properties +++ b/src/main/resources/i18n/strings_ar.properties @@ -108,9 +108,8 @@ unlock.error.invalidMountPoint.existing=نقطة/مجلد التحميل موج # Lock ## Force -lock.forced.heading=فشل عملية القفل lock.forced.message=تم حظر قفل "%s" بواسطة العمليات المعلقة أو الملفات المفتوحة. يمكنك فرض قفل هذا المخزن، ولكن مقاطعة عمليات الادخال والاخراج I/O قد تؤدي لفقدان البيانات غير المحفوظة. -lock.forced.confirmBtn=فرض القفل +lock.forced.retryBtn=اعد المحاولة ## Failure lock.fail.heading=فشلت عملية اقفال الخزنة. lock.fail.message=فشل عملية قفل %s". تأكد من حفظ العمل غير المحفوظ في مكان آخر وأن العمليات الهامة للقراءة/الكتابة قد انتهت. من أجل إغلاق المخزن، اقتل تطبيق Cryptomator. diff --git a/src/main/resources/i18n/strings_bs.properties b/src/main/resources/i18n/strings_bs.properties index 28f61dc95..e336ff9d3 100644 --- a/src/main/resources/i18n/strings_bs.properties +++ b/src/main/resources/i18n/strings_bs.properties @@ -108,9 +108,7 @@ unlock.error.invalidMountPoint.existing=Tačka povezivanja "%s" već postoji ili # Lock ## Force -lock.forced.heading=Zaključavanje nije uspjelo lock.forced.message=Zaključavanje "%s" blokirano je operacijama na čekanju ili otvorenim datotekama. Možete prisilno zaključati ovaj sef, međutim prekid U / I-a može rezultirati gubitkom nespremljenih podataka. -lock.forced.confirmBtn=Prisilno zaključaj ## Failure lock.fail.heading=Zaključavanje sefa nije uspjelo. lock.fail.message=Sef "%s" nije moguće zaključati. Osigurajte da je nespremljeni rad sačuvan negdje drugdje i da su važne operacije čitanja / pisanja završene. Da biste zatvorili sef, zaustavite Cryptomator proces. diff --git a/src/main/resources/i18n/strings_ca.properties b/src/main/resources/i18n/strings_ca.properties index e70eac4a9..520b7d073 100644 --- a/src/main/resources/i18n/strings_ca.properties +++ b/src/main/resources/i18n/strings_ca.properties @@ -75,7 +75,9 @@ addvault.new.readme.accessLocation.2=Aquesta és la ubicació d'accès de la vos addvault.new.readme.accessLocation.3=Cryptomator xifra tots els fitxers afegits a aquest volum. Podeu treballar en aquest volum com en qualsevol altra unitat o carpeta. La vista mostra el contingut desxifrat però els fitxers sempre estan xifrats en el vostre disc dur. addvault.new.readme.accessLocation.4=Pots esborrar aquest fitxer si vols. ## Existing +addvaultwizard.existing.instruction=Selecciona el fitxer "vault.cryptomator" de la teva caixa forta. Si només existeix un fitxer anomenat "masterkey.cryptomator", selecciona aquest. addvaultwizard.existing.chooseBtn=Trieu… +addvaultwizard.existing.filePickerTitle=Selecciona el fitxer de la Caixa forta ## Success addvaultwizard.success.nextStepsInstructions=S'ha afegit la caixa forta "%s".\nHeu de desbloquejar-la si voleu accedir-hi o afegir nou contingut. També podeu desbloquejar-la en qualsevol altre moment. addvaultwizard.success.unlockNow=Desbloqueja ara @@ -115,9 +117,10 @@ unlock.error.invalidMountPoint.existing=El punt de muntatge o la carpeta ja exis # Lock ## Force -lock.forced.heading=Ha fallat el blocatge +lock.forced.heading=El bloqueig ha fallat lock.forced.message=No s'ha blocat "%s" perquè hi ha operacions pendents o fitxers oberts. Podeu forçar-ne el blocatge però heu de saber que interrompre l'entrada/sortida pot produir la pèrdua de dades. -lock.forced.confirmBtn=Força el blocatge +lock.forced.retryBtn=Reintenta +lock.forced.forceBtn=Forçar bloqueig ## Failure lock.fail.heading=Ha fallat el blocatge de la caixa forta. lock.fail.message=La caixa forta "%s" no s'ha pogut blocar. Assegureu-vos que el treball s'ha desat en algun altre lloc i que les operacions de lectura/escriptura han acabat. Per tal de tancar la caixa, mateu el procés Cryptomator. diff --git a/src/main/resources/i18n/strings_cs.properties b/src/main/resources/i18n/strings_cs.properties index d88e84d91..5bac326e1 100644 --- a/src/main/resources/i18n/strings_cs.properties +++ b/src/main/resources/i18n/strings_cs.properties @@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Připojovací bod %s již existuje nebo # Lock ## Force -lock.forced.heading=Běžné uzamčení selhalo +lock.forced.heading=Zamknutí se nezdařilo lock.forced.message=Uzamčení "%s" bylo zablokováno nevyřízenými operacemi nebo otevřenými soubory. Můžete vynutit uzamčení tohoto trezoru, ale přerušení I/O může mít za následek ztrátu neuložených dat. -lock.forced.confirmBtn=Přesto uzamknout +lock.forced.retryBtn=Opakovat +lock.forced.forceBtn=Přesto uzamknout ## Failure lock.fail.heading=Uzamčení trezoru selhalo. lock.fail.message=Trezor "%s" nelze uzamknout. Ujistěte se, že je neuložená práce uložena jinde a že jsou dokončeny důležité operace čtení/zápis. Za účelem uzavření trezoru ukončte proces Cryptomatoru. @@ -301,6 +302,7 @@ main.vaultDetail.migrateButton=Upgrade trezoru main.vaultDetail.migratePrompt=Váš trezor musí být aktualizován na nový formát, než k němu budete mít přístup ### Error main.vaultDetail.error.reload=Obnovit +main.vaultDetail.error.windowTitle=Chyba při načítání trezoru # Wrong File Alert wrongFileAlert.title=Jak šifrovat soubory diff --git a/src/main/resources/i18n/strings_de.properties b/src/main/resources/i18n/strings_de.properties index e39a84ec8..fa5551619 100644 --- a/src/main/resources/i18n/strings_de.properties +++ b/src/main/resources/i18n/strings_de.properties @@ -75,7 +75,7 @@ addvault.new.readme.accessLocation.2=Dies ist der Zugangsort deines Tresors. addvault.new.readme.accessLocation.3=Alle zu diesem Laufwerk hinzugefügten Dateien werden von Cryptomator verschlüsselt. Du kannst mit diesem arbeiten wie mit jedem anderen Laufwerk bzw. Ordner. Dies ist lediglich eine unverschlüsselte Ansicht des Laufwerkinhalts; auf deiner Festplatte bleiben deine Dateien weiterhin verschlüsselt. addvault.new.readme.accessLocation.4=Diese Datei kannst du löschen. ## Existing -addvaultwizard.existing.instruction=Wähle die Datei "vault.cryptomator" deines bestehenden Tresors aus. Falls nur eine Datei mit der Bezeichnung "masterkey.cryptomator" vorhanden sein sollte, nutze stattdessen diese. +addvaultwizard.existing.instruction=Wähle die Datei "vault.cryptomator" deines bestehenden Tresors aus. Falls nur eine Datei mit der Bezeichnung "masterkey.cryptomator" vorhanden ist, nutze stattdessen diese. addvaultwizard.existing.chooseBtn=Durchsuchen… addvaultwizard.existing.filePickerTitle=Tresor Datei auswählen ## Success @@ -119,7 +119,8 @@ unlock.error.invalidMountPoint.existing=Einhängepunkt/Ordner bereits vorhanden ## Force lock.forced.heading=Sperren fehlgeschlagen lock.forced.message=Aufgrund von Zugriffen laufender Prozesse oder geöffneter Dateien konnte „%s“ nicht gesperrt werden. Du kannst das Sperren dieses Tresors erzwingen, allerdings kann dies zum Verlust ungespeicherter Daten führen. -lock.forced.confirmBtn=Sperren erzwingen +lock.forced.retryBtn=Wiederholen +lock.forced.forceBtn=Sperren erzwingen ## Failure lock.fail.heading=Tresor konnte nicht gesperrt werden. lock.fail.message=Der Tresor „%s“ konnte nicht gesperrt werden. Stelle sicher, dass du deine ungespeicherte Arbeit an anderer Stelle speicherst und wichtige Lese-/Schreibvorgänge abgeschlossen sind. Um den Tresor zu schließen, beende den Cryptomator-Prozess. @@ -191,7 +192,7 @@ preferences.general.theme.automatic=Automatisch preferences.general.theme.light=Hell preferences.general.theme.dark=Dunkel preferences.general.unlockThemes=Dunklen Modus freischalten -preferences.general.showMinimizeButton=Minimieren-Schaltfläche anzeigen +preferences.general.showMinimizeButton=Schaltfläche zum Minimieren anzeigen preferences.general.showTrayIcon=Symbol im Infobereich anzeigen (Neustart erforderlich) preferences.general.startHidden=Cryptomator im Hintergrund starten preferences.general.debugLogging=Diagnoseprotokoll aktivieren diff --git a/src/main/resources/i18n/strings_el.properties b/src/main/resources/i18n/strings_el.properties index 0f5596391..756530597 100644 --- a/src/main/resources/i18n/strings_el.properties +++ b/src/main/resources/i18n/strings_el.properties @@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Το σημείο/φάκελος προ # Lock ## Force -lock.forced.heading=Το κανονικό κλείδωμα απέτυχε +lock.forced.heading=Το κλείδωμα απέτυχε lock.forced.message=Το κλείδωμα "%s" μπλοκαρίστηκε από εκκρεμείς διεργασίες ή ανοιχτά αρχεία. Μπορείτε να εξαναγκάσετε το κλείδωμα του vault, αλλά η διακοπή Ι/Ο ενδέχεται να οδηγήσει σε απώλεια μη αποθηκευμένων δεδομένων. -lock.forced.confirmBtn=Εξαναγκασμένο κλείδωμα +lock.forced.retryBtn=Επανάληψη +lock.forced.forceBtn=Εξαναγκασμός Κλειδώματος ## Failure lock.fail.heading=Το κλείδωμα του vault απέτυχε. lock.fail.message=Το Vault "%s" δεν κλειδώθηκε. Εξασφαλίστε την αποθήκευση της εργασίας σε άλλο σημείο και πως οι σημαντικές διεργασίας Ανάγνωσης/Εγγραφής έχουν ολοκληρωθεί. Για να κλείσετε το vault, τερματίστε τη διεργασία του Cryptomator. diff --git a/src/main/resources/i18n/strings_es.properties b/src/main/resources/i18n/strings_es.properties index 3ed2961bf..cb3d9d3e7 100644 --- a/src/main/resources/i18n/strings_es.properties +++ b/src/main/resources/i18n/strings_es.properties @@ -117,17 +117,18 @@ unlock.error.invalidMountPoint.existing=El punto de montaje/carpeta ya existe o # Lock ## Force -lock.forced.heading=Bloqueo automático fallido +lock.forced.heading=Error al bloquear lock.forced.message=El bloqueo de "%s" fue bloqueado por operaciones pendientes o archivos abiertos. Puede forzar el bloqueo de esta bóveda, sin embargo, interrumpir la I/O puede provocar la pérdida de datos no guardados. -lock.forced.confirmBtn=Forzar bloqueo +lock.forced.retryBtn=Reintentar +lock.forced.forceBtn=Forzar bloqueo ## Failure lock.fail.heading=Falló al bloquear la bóveda. lock.fail.message=No se pudo bloquear la bóveda "%s". Asegúrese de que el trabajo no guardado se ha guardado en otro lugar y las operaciones de lectura/escritura importantes han finalizado. Para cerrar la bóveda termine el proceso de Cryptomator. # Migration -migration.title=Mejorar bóveda +migration.title=Actualizar bóveda ## Start -migration.start.prompt=La bóveda "%s" necesita ser actualizada a un formato más nuevo. Antes de continuar, asegurarse de que no haya ninguna sincronización pendiente afectando esta bóveda. +migration.start.prompt=La bóveda "%s" necesita ser actualizada a un formato más nuevo. Antes de continuar, asegúrese de que no haya ninguna sincronización pendiente afectando esta bóveda. migration.start.confirm=Sí, mi bóveda está sincronizada ## Run migration.run.enterPassword=Ingresar la contraseña para "%s" diff --git a/src/main/resources/i18n/strings_fil.properties b/src/main/resources/i18n/strings_fil.properties index 9ad4d8b1f..9f2a7767f 100644 --- a/src/main/resources/i18n/strings_fil.properties +++ b/src/main/resources/i18n/strings_fil.properties @@ -68,6 +68,7 @@ unlock.unlockBtn=I-unlock # Lock ## Force +lock.forced.retryBtn=Subukan muli ## Failure # Migration diff --git a/src/main/resources/i18n/strings_fr.properties b/src/main/resources/i18n/strings_fr.properties index 12894f2e9..6a6a4d90d 100644 --- a/src/main/resources/i18n/strings_fr.properties +++ b/src/main/resources/i18n/strings_fr.properties @@ -72,7 +72,7 @@ addvault.new.readme.storageLocation.10=Si vous avez besoin d'aide, consultez la addvault.new.readme.accessLocation.fileName=BIENVENUE.rtf addvault.new.readme.accessLocation.1=🔐 VOLUME CHIFFRÉ 🔐 addvault.new.readme.accessLocation.2=Ceci est le chemin d'accès de votre coffre-fort. -addvault.new.readme.accessLocation.3=Tous les fichiers ajoutés à ce volume seront chiffrés par Cryptomator. Vous pouvez l'utiliser comme n'importe quel lecteur/répertoire. Ceci est seulement une vue déchiffrée de son contenu, vos fichiers restent chiffrés dans votre disque dur à tout le temps. +addvault.new.readme.accessLocation.3=Tous les fichiers ajoutés à ce volume seront chiffrés par Cryptomator. Vous pouvez l'utiliser comme n'importe quel lecteur/répertoire. Ceci est seulement une vue déchiffrée de son contenu, vos fichiers restent chiffrés dans votre disque dur en permanence. addvault.new.readme.accessLocation.4=Vous pouvez supprimer ce fichier. ## Existing addvaultwizard.existing.instruction=Choisissez le fichier "vault.cryptomator" de votre coffre existant. S'il existe seulement un fichier "masterkey.cryptomator", sélectionnez celui-ci. @@ -93,7 +93,7 @@ changepassword.enterOldPassword=Entrez le mot de passe actuel pour "%s" changepassword.finalConfirmation=Je comprends que je ne pourrai pas récupérer mes données si j'oublie mon mot de passe # Forget Password -forgetPassword.title=Oublier le mot de passe +forgetPassword.title=Mot de passe oublié forgetPassword.information=Ceci supprimera le mot de passe enregistré pour ce coffre de votre chaîne de clés système. forgetPassword.confirmBtn=Oublier le mot de passe @@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Le point de montage/le répertoire exist # Lock ## Force -lock.forced.heading=Le verrouillage normal a échoué +lock.forced.heading=Échec du verrouillage lock.forced.message=Le verrouillage de «%s» a été bloqué par des opérations en attente ou des fichiers ouverts. Vous pouvez forcer le verrouillage de ce coffre, mais l'interruption d'E/S peut entraîner la perte de données non enregistrées. -lock.forced.confirmBtn=Forcer le verrouillage +lock.forced.retryBtn=Réessayer +lock.forced.forceBtn=Forcer le verrouillage ## Failure lock.fail.heading=Le verrouillage du coffre a échoué. lock.fail.message=Le coffre-fort "%s" n'a pas pu être verrouillé. Assurez-vous que le travail non sauvegardé est sauvegardé ailleurs et que les opérations importantes de lecture/écriture sont bien terminées. Pour fermer le coffre-fort, tuez le processus Cryptomator. diff --git a/src/main/resources/i18n/strings_he.properties b/src/main/resources/i18n/strings_he.properties new file mode 100644 index 000000000..2a4d51e6c --- /dev/null +++ b/src/main/resources/i18n/strings_he.properties @@ -0,0 +1,156 @@ +# Locale Specific CSS files such as CJK, RTL,... + +# Generics +## Button +generic.button.apply=החל +generic.button.back=חזור +generic.button.cancel=ביטול +generic.button.change=שנה +generic.button.close=סגור +generic.button.copy=העתק +generic.button.copied=הועתק! +generic.button.done=סיום +generic.button.next=המשך +generic.button.print=הדפס +## Error +generic.error.title=שגיאה %s +generic.error.instruction=אופס! Cryptomator לא ציפה שזה יקרה. את/ה יכול/ה לחפש פתרונות קיימים לשגיאה זו. או שבמקרה והשגיאה לא דווחה עדיין, תרגיש/י בנוח לעשות זאת. +generic.error.hyperlink.lookup=חפש שגיאה זו +generic.error.hyperlink.report=דווח על שגיאה זו +generic.error.technicalDetails=פרטים: + +# Defaults +defaults.vault.vaultName=כספת + +# Tray Menu +traymenu.showMainWindow=הצג +traymenu.showPreferencesWindow=העדפות +traymenu.lockAllVaults=נעל הכל +traymenu.quitApplication=צא +traymenu.vault.unlock=בטל נעילה +traymenu.vault.lock=נעילה +traymenu.vault.reveal=חשוף + +# Add Vault Wizard +addvaultwizard.title=הוסף כספת +## Welcome +addvaultwizard.welcome.newButton=צור כספת חדשה +addvaultwizard.welcome.existingButton=פתח כספת קיימת +## New +### Name +addvaultwizard.new.nameInstruction=בחר שם עבור הכספת שלך +addvaultwizard.new.namePrompt=שם הכספת +### Location +addvaultwizard.new.locationInstruction=היכן Cryptomator צריך לשמור את הקבצים המוצפנים של הכספת שלך? +addvaultwizard.new.locationLabel=מיקום אחסון +addvaultwizard.new.directoryPickerLabel=מיקום מותאם אישית +addvaultwizard.new.directoryPickerButton=בחר... +addvaultwizard.new.directoryPickerTitle=בחירת ספרייה +addvaultwizard.new.fileAlreadyExists=שם הקובץ או שם התיקייה עם שם הכספת כבר קיים +addvaultwizard.new.locationDoesNotExist=מחיצה בנתיב הנקוב לא קיימת או אין אפשרות לקבל אליה גישה +addvaultwizard.new.locationIsNotWritable=אין הרשאת כתיבה בנתיב הנקוב +addvaultwizard.new.locationIsOk=מיקום מתאים לכספת שלך +addvaultwizard.new.invalidName=שם כספת שגוי. אנא שקול שם מחיצה רגיל. +### Password +addvaultwizard.new.createVaultBtn=צור כספת חדשה +addvaultwizard.new.generateRecoveryKeyChoice=לא תיהיה אפשרות לקבל גישה למידע שלך בלי הסיסמה שלך. האם תרצה/י מפתח שחזור למקרה ותאבד/י את הסיסמה שלך? +addvaultwizard.new.generateRecoveryKeyChoice.yes=כן בבקשה, עדיף ללכת על בטוח +addvaultwizard.new.generateRecoveryKeyChoice.no=לא תודה, אני לא אאבד את הסיסמה שלי +### Information +addvault.new.readme.storageLocation.fileName=חשוב.rtf +addvault.new.readme.storageLocation.1=⚠️ קבצי כספת ⚠️ +addvault.new.readme.storageLocation.2=זהו מיקום אחסון לכספת שלך. +addvault.new.readme.storageLocation.3=אל +addvault.new.readme.storageLocation.4=תשנה קבצים במחיצה זו או +addvault.new.readme.storageLocation.5=תדביק קבצים כלשהם להצפנה במחיצה זו. +addvault.new.readme.storageLocation.6=אם תרצה להצפין קבצים ולצפות בתוכן של הכספת, עשה את הבא: +addvault.new.readme.storageLocation.7=1. הוסף כספת זו ל-Cryptomator. +addvault.new.readme.storageLocation.8=2. בטל נעילת כספת ב-Cryptomator. +addvault.new.readme.storageLocation.9=3. פתח את מיקום הגישה ע"י לחיצה על מקש "חשוף". +addvault.new.readme.storageLocation.10=אם הנך נדרש/ת בעזרה, בקר/י את התיעוד: %s +addvault.new.readme.accessLocation.fileName=ברוכים הבאים.rtf +addvault.new.readme.accessLocation.1=ספרייה מוצפנת +addvault.new.readme.accessLocation.2=זהו מיקום גישה לכספת שלך. +addvault.new.readme.accessLocation.3=כל קובץ אשר יצורף לספרייה זו יעבור הצפנה באמצעות Cryptomator. את/ה תוכל/י לעבוד עליו כמו עם כל קבוץ/מחיצה רגילים. זהו מצב הצגה מפוענח של התוכן, הקבצים שלך נשארים מוצפנים על הדיסק הקשיח שלך בכל רגע. +addvault.new.readme.accessLocation.4=תרגיש/י בנוח להסיר את הקובץ הזה. +## Existing +addvaultwizard.existing.chooseBtn=בחר... +## Success + +# Remove Vault + +# Change Password + +# Forget Password + +# Unlock +unlock.unlockBtn=בטל נעילה +## +## Success +## Failure +### Invalid Mount Point + +# Lock +## Force +## Failure + +# Migration +## Start +## Run +## Success +## Missing file system capabilities +## Impossible + +# Health Check +## Start +## Start Failure +## Check Selection +## Detail view +## Fix Application + +# Preferences +preferences.title=העדפות +## General +## Volume +## Updates +## Contribution +#<-- Add entries for donations and code/translation/documentation contribution --> + +## About + +# Vault Statistics +## Read +## Write + +# Main Window +main.closeBtn.tooltip=סגור +main.preferencesBtn.tooltip=העדפות +## Drag 'n' Drop +## Vault List +main.vaultlist.contextMenu.lock=נעילה +main.vaultlist.addVaultBtn=הוסף כספת +## Vault Detail +### Welcome +### Locked +### Unlocked +main.vaultDetail.lockBtn=נעילה +### Missing +### Needs Migration +### Error + +# Wrong File Alert + +# Vault Options +## General +vaultOptions.general.vaultName=שם הכספת + +## Mount +vaultOptions.mount.mountPoint.directoryPickerButton=בחר... +## Master Key + + +# Recovery Key + +# New Password + +# Quit diff --git a/src/main/resources/i18n/strings_hi.properties b/src/main/resources/i18n/strings_hi.properties index e0a4455d0..26fe68bda 100644 --- a/src/main/resources/i18n/strings_hi.properties +++ b/src/main/resources/i18n/strings_hi.properties @@ -75,6 +75,7 @@ unlock.unlockBtn=अनलॉक करें # Lock ## Force +lock.forced.retryBtn=पुन: प्रयास करें ## Failure # Migration diff --git a/src/main/resources/i18n/strings_hu.properties b/src/main/resources/i18n/strings_hu.properties index 4368c9ef9..ff18ab346 100644 --- a/src/main/resources/i18n/strings_hu.properties +++ b/src/main/resources/i18n/strings_hu.properties @@ -13,6 +13,11 @@ generic.button.done=Kész generic.button.next=Következő generic.button.print=Nyomtatás ## Error +generic.error.title=Hiba: %s +generic.error.instruction=Upsz! A Cryptomator nem számított rá, hogy ez megtörténik. Keressen meglévő megoldást erre a hibára. Vagy ha még nem jelentették, bátran tegye ezt meg. +generic.error.hyperlink.lookup=Hiba okának keresése +generic.error.hyperlink.report=Hiba jelentése +generic.error.technicalDetails=Részletek: # Defaults defaults.vault.vaultName=Széf @@ -38,9 +43,14 @@ addvaultwizard.new.namePrompt=A széf neve ### Location addvaultwizard.new.locationInstruction=Hova mentse a Cryptomator a széf titkosított fájljait? addvaultwizard.new.locationLabel=Tárolási hely +addvaultwizard.new.locationPrompt=… addvaultwizard.new.directoryPickerLabel=Egyedi hely addvaultwizard.new.directoryPickerButton=Választás… addvaultwizard.new.directoryPickerTitle=Könyvtár kiválasztása +addvaultwizard.new.fileAlreadyExists=Már létezik fájl/könyvtár ezzel a trezornévvel +addvaultwizard.new.locationDoesNotExist=A megadott elérési úton lévő könyvtár nem létezik, vagy nem érhető el +addvaultwizard.new.locationIsNotWritable=Nincs írási hozzáférés a megadott elérési úthoz +addvaultwizard.new.locationIsOk=Megfelelő hely a trezornak addvaultwizard.new.invalidName=Érvénytelen széf elnevezés. Kérjük vegye figyelembe a szabályos könyvtárelnevezésre vonatkozó szabályokat. ### Password addvaultwizard.new.createVaultBtn=Új széf létrehozása @@ -65,7 +75,9 @@ addvault.new.readme.accessLocation.2=Ez a széf hozzáférési helye. addvault.new.readme.accessLocation.3=Bármilyen, a kötethez hozzáadott fájl titkosításra kerül a Cryptomator által. Úgy dolgozhat vele, mint minden más meghajtóval/mappával. Ez az egyetlen dekódolt tartalmi nézet. A fájlai folyamatosan titkosítva maradnak a merevlemezén. addvault.new.readme.accessLocation.4=Bátran eltávolíthatja ezt a fájlt. ## Existing +addvaultwizard.existing.instruction=Válassza ki a "vault.cryptomatotor" fájlt a meglévő tárolóhoz. Ha csak egy "masterkey.cryptomatotor" nevű fájl létezik, válassza azt. addvaultwizard.existing.chooseBtn=Kiválaszt… +addvaultwizard.existing.filePickerTitle=Trezor fájl kiválasztása ## Success addvaultwizard.success.nextStepsInstructions=Széf létrehozva "%s".\nA tartalom eléréséhez, vagy hozzáadásához fel kell oldania a széfet. Alternatív megoldásként később bármikor feloldhatja. addvaultwizard.success.unlockNow=Azonnali feloldás @@ -86,11 +98,15 @@ forgetPassword.information=Eltávolítja a széf mentett jelszavát a rendszere forgetPassword.confirmBtn=Jelszó elfelejtése # Unlock +unlock.title="%s" feloldása unlock.passwordPrompt=Írja be a jelszavát a következő széfhez "%s": +unlock.savePassword=Jelszó megjegyzése unlock.unlockBtn=Feloldás ## +unlock.chooseMasterkey.prompt=Nem található a tároló kulcsfájlja a várt helyen. Kérjük válassza ki a kulcsfájlt manuálisan. unlock.chooseMasterkey.filePickerTitle=Mesterkulcs fájl kiválasztása ## Success +unlock.success.message="%s" sikreresen feloldásra került! Mostmár hozzáférhet a virtuális trezorhoz. unlock.success.rememberChoice=Jegyezze meg a választást és ne mutassa többet unlock.success.revealBtn=Széf megjelenítése ## Failure @@ -101,7 +117,11 @@ unlock.error.invalidMountPoint.existing=A csatolási pont "%s" már létezik vag # Lock ## Force +lock.forced.message=A „%s” zárolását függőben lévő műveletek vagy megnyitott fájlok blokkolták. Kényszerítheti a tároló zárolását, bár az I/O megszakítása a nem mentett adatok elvesztéséhez vezethet. +lock.forced.retryBtn=Újra ## Failure +lock.fail.heading=Zárolás sikertelen. +lock.fail.message=A "%s" tárolót nem lehetett zárolni. Győződjön meg arról, hogy a nem mentett munkát máshová menti, és a fontos olvasási/írási műveletek befejeződtek. A trezor bezárásához szakítsa meg a Cryptomator folyamatot. # Migration migration.title=Széf frissítése @@ -129,7 +149,18 @@ migration.impossible.moreInfo=A széf továbbra is megnyitható marad egy régeb # Health Check ## Start +health.title="%s" állapotellenőrzése +health.intro.header=Állapotfelmérés +health.intro.text=Az állapotfelmérés olyan ellenőrzéscsomag, amely felderíti és esetlegesen kijavítja a trezor belső szerkezetében fellépő problémákat. Kérjük, ne feledje: +health.intro.remarkSync=Győződjön meg arról, hogy minden eszköz teljesen szinkronizálva van, ez megoldja a legtöbb problémát. +health.intro.remarkFix=Nem minden probléma javítható. +health.intro.remarkBackup=Ha az adatok sérültek, csak a biztonsági mentés segíthet. +health.intro.affirmation=Elolvastam és megértettem a fenti információkat ## Start Failure +health.fail.header=Hiba a Trezor konfiguráció betöltésekor +health.fail.ioError=Hiba történt a konfigurációs fájl elérése és olvasása közben. +health.fail.parseError=Hiba történt a tároló konfigurációjának elemzése közben. +health.fail.moreInfo=További infó ## Check Selection ## Detail view ## Fix Application @@ -238,6 +269,8 @@ main.vaultDetail.missing.changeLocation=A széf helyének megváltoztatása… main.vaultDetail.migrateButton=Széf frissítése main.vaultDetail.migratePrompt=A széfet új formátumra kell frissíteni, mielőtt hozzáférhet ### Error +main.vaultDetail.error.reload=Újratöltés +main.vaultDetail.error.windowTitle=Hiba az adatok betöltése közben # Wrong File Alert wrongFileAlert.title=Hogyan lehet fájlokat titkosítani diff --git a/src/main/resources/i18n/strings_id.properties b/src/main/resources/i18n/strings_id.properties index 8c1bc51f0..8b4d9e8df 100644 --- a/src/main/resources/i18n/strings_id.properties +++ b/src/main/resources/i18n/strings_id.properties @@ -13,6 +13,11 @@ generic.button.done=Selesai generic.button.next=Lanjut generic.button.print=Cetak ## Error +generic.error.title=Kesalahan %s +generic.error.instruction=Ups! Cryptomator tidak mengharapkan ini terjadi. Anda dapat mencari solusi yang ada untuk kesalahan ini. Atau jika belum dilaporkan, jangan ragu untuk melakukannya. +generic.error.hyperlink.lookup=Cari kesalahan +generic.error.hyperlink.report=Laporkan kesalahan +generic.error.technicalDetails=Rincian: # Defaults defaults.vault.vaultName=Brankas @@ -70,7 +75,9 @@ addvault.new.readme.accessLocation.2=Ini adalah lokasi akses brankas kamu. addvault.new.readme.accessLocation.3=File yang ditambahkan ke volume ini akan dienkripsi oleh Cryptomator. Anda dapat mempergunakan isi vault seperti dalam folder lain. Saat ini Anda sedang mengakses tampilan versi dekripsi, file Anda selalu terenkripsi di dalam cakram keras Anda. addvault.new.readme.accessLocation.4=Anda dapat menghapus file ini. ## Existing +addvaultwizard.existing.instruction=Pilih file "vault.cryptomator" Anda dari vault yang ada. Jika hanya ada file bernama "masterkey.cryptomator", pilih file tersebut. addvaultwizard.existing.chooseBtn=Pilih… +addvaultwizard.existing.filePickerTitle=Pilih File Vault ## Success addvaultwizard.success.nextStepsInstructions=Vault "%s" telah dibuat.\nAnda harus membuka kunci vault ini untuk mengakses atau menambahkan konten. Anda juga dapat membuka kunci vault ini kapan saja di kemudian hari. addvaultwizard.success.unlockNow=Buka Kunci Sekarang @@ -91,6 +98,7 @@ forgetPassword.information=Kata sandi vault yang tersimpan akan dihapus dari key forgetPassword.confirmBtn=Lupa Kata Sandi # Unlock +unlock.title=Membuka "%s" unlock.passwordPrompt=Masukkan kata sandi untuk "%s": unlock.savePassword=Simpan Kata Sandi unlock.unlockBtn=Buka Gembok @@ -109,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Poin mount "%s" sudah ada atau folder in # Lock ## Force -lock.forced.heading=Gagal mengunci secara normal +lock.forced.heading=Gagal mengunci lock.forced.message=Penguncian "%s" terblokir oleh operasi yang sedang berjalan atau file yang masih terbuka. Anda dapat mengunci paksa vault ini, namun ada kemungkinan mengganggu I/O akan menghilangkan data yang belum disimpan. -lock.forced.confirmBtn=Kunci Paksa +lock.forced.retryBtn=Coba lagi +lock.forced.forceBtn=Kunci Paksa ## Failure lock.fail.heading=Gagal mengunci vault. lock.fail.message=Vault "%s" tidak dapat dikunci. Pastikan bahwa file yang belum tersimpan telah disimpan di lokasi lain, dan operasi Baca/Tulis yang penting telah selesai. Untuk menutup vault ini, matikan proses Cryptomator. @@ -142,13 +151,37 @@ migration.impossible.moreInfo=Vault dapat dibuka dengan program versi lebih lama # Health Check ## Start +health.title=Pemeriksaan Kesehatan "%s" +health.intro.header=Pemeriksaan Kesehatan +health.intro.text=Pemeriksaan Kesehatan adalah kumpulan pemeriksaan untuk mendeteksi dan mungkin memperbaiki masalah dalam struktur internal brankas Anda. Harap diingat: +health.intro.remarkSync=Pastikan semua perangkat disinkronkan sepenuhnya, ini menyelesaikan sebagian besar masalah. +health.intro.remarkFix=Tidak semua masalah bisa diperbaiki. +health.intro.remarkBackup=Jika data rusak, hanya cadangan yang dapat membantu. +health.intro.affirmation=Saya telah membaca dan memahami informasi di atas ## Start Failure +health.fail.header=Kesalahan saat memuat Konfigurasi Vault +health.fail.ioError=Terjadi kesalahan saat mengakses dan membaca file konfigurasi. +health.fail.parseError=Terjadi kesalahan saat mengurai konfigurasi vault. +health.fail.moreInfo=Info Selengkapnya ## Check Selection +health.checkList.description=Centang daftar di bagian kiri atau gunakan tombol di bawah. +health.checkList.selectAllButton=Centang Semua +health.checkList.deselectAllButton=Jangan Centang Semua health.check.runBatchBtn=Cek Jalankan yang dipilih ## Detail view health.check.detail.noSelectedCheck=Untuk hasil, pilih pemeriksaan kesehatan yang sudah selesai di sebelah kiri. +health.check.detail.checkScheduled=Pemeriksaan dijadwalkan. +health.check.detail.checkRunning=Saat ini pemeriksaan sedang berjalan… +health.check.detail.checkSkipped=Pemeriksaan tidak dipilih untuk dijalankan. +health.check.detail.checkFinished=Pemeriksaan berhasil diselesaikan. +health.check.detail.checkFinishedAndFound=Pemeriksaan selesai berjalan. Harap tinjau hasilnya. +health.check.detail.checkFailed=Pemeriksaan terhenti karena terjadi kesalahan. +health.check.detail.checkCancelled=Pemeriksaan dibatalkan. health.check.exportBtn=Ekspor Laporan ## Fix Application +health.fix.fixBtn=Perbaiki +health.fix.successTip=Perbaikan berhasil +health.fix.failTip=Perbaikan gagal, lihat log untuk detailnya # Preferences preferences.title=Preferensi @@ -183,54 +216,153 @@ preferences.updates.updateAvailable=Pembaharuan ke versi %s tersedia. ## Contribution preferences.contribute=Dukung Kami preferences.contribute.registeredFor=Sertifikat pendukung terdaftar untuk %s +preferences.contribute.noCertificate=Dukung Cryptomator dan terima sertifikat pendukung. Ini seperti kunci lisensi tetapi untuk orang-orang hebat yang menggunakan perangkat lunak gratis. ;-) +preferences.contribute.getCertificate=Belum punya? Pelajari bagaimana Anda bisa mendapatkannya. +preferences.contribute.promptText=Tempel kode sertifikat pendukung di sini #<-- Add entries for donations and code/translation/documentation contribution --> ## About +preferences.about=Tentang # Vault Statistics +stats.title=Statistik untuk %s +stats.cacheHitRate=Tingkat Hit Cache ## Read +stats.read.throughput.idle=Read: idle +stats.read.throughput.kibs=Read: %.2f kiB/s +stats.read.throughput.mibs=Read: %.2f MiB/s +stats.read.total.data.none=Data read: - +stats.read.total.data.kib=Data read: %.1f kiB +stats.read.total.data.mib=Data read: %.1f MiB +stats.read.total.data.gib=Data read: %.1f GiB +stats.decr.total.data.none=Data decrypted: - +stats.decr.total.data.kib=Data decrypted: %.1f kiB +stats.decr.total.data.mib=Data decrypted: %.1f MiB +stats.decr.total.data.gib=Data decrypted: %.1f GiB +stats.read.accessCount=Total reads: %d ## Write +stats.write.throughput.idle=Write: idle +stats.write.throughput.kibs=Write: %.2f kiB/s +stats.write.throughput.mibs=Write: %.2f MiB/s +stats.write.total.data.none=Data tertulis: - +stats.write.total.data.kib=Data tertulis: %.1f kiB +stats.write.total.data.mib=Data tertulis: %.1f MiB +stats.write.total.data.gib=Data tertulis: %.1f GiB +stats.encr.total.data.none=Data terenkripsi: - +stats.encr.total.data.kib=Data terenkripsi: %.1f kiB +stats.encr.total.data.mib=Data terenkripsi: %.1f MiB +stats.encr.total.data.gib=Data terenkripsi: %.1f GiB +stats.write.accessCount=Total menulis: %d # Main Window main.closeBtn.tooltip=Tutup +main.minimizeBtn.tooltip=Minimalkan main.preferencesBtn.tooltip=Preferensi +main.debugModeEnabled.tooltip=Mode Debug diaktifkan +main.donationKeyMissing.tooltip=Pertimbangjan untuk donasi ## Drag 'n' Drop +main.dropZone.dropVault=Tambah vault ini +main.dropZone.unknownDragboardContent=Jika Anda ingin menambahkan vault, seret ke jendela ini ## Vault List +main.vaultlist.emptyList.onboardingInstruction=Klik untuk tambah vault +main.vaultlist.contextMenu.remove=Hapus… main.vaultlist.contextMenu.lock=Gembok +main.vaultlist.contextMenu.unlock=Membuka… main.vaultlist.contextMenu.unlockNow=Buka Kunci Sekarang +main.vaultlist.contextMenu.vaultoptions=Tampilkan Opsi Vault main.vaultlist.contextMenu.reveal=Buka Drive main.vaultlist.addVaultBtn=Tambah Brankas ## Vault Detail ### Welcome +main.vaultDetail.welcomeOnboarding=Terima kasih telah memilih Cryptomator untuk melindungi file Anda. Jika Anda memerlukan bantuan, lihat panduan awal kami: ### Locked +main.vaultDetail.lockedStatus=TERKUNCI +main.vaultDetail.unlockBtn=Membuka… main.vaultDetail.unlockNowBtn=Buka Kunci Sekarang +main.vaultDetail.optionsBtn=Opsi Vault +main.vaultDetail.passwordSavedInKeychain=Kata Sandi tersimpan ### Unlocked +main.vaultDetail.unlockedStatus=TERBUKA +main.vaultDetail.accessLocation=Konten vault Anda dapat diakses di sini: main.vaultDetail.revealBtn=Buka Drive main.vaultDetail.lockBtn=Gembok +main.vaultDetail.bytesPerSecondRead=Read: +main.vaultDetail.bytesPerSecondWritten=Write: +main.vaultDetail.throughput.idle=idle +main.vaultDetail.throughput.kbps=%.1f kiB/s main.vaultDetail.throughput.mbps=%.1f MiB/detik main.vaultDetail.stats=Statistik Vault ### Missing +main.vaultDetail.missing.info=Cryptomator tidak dapat menemukan vault di path ini. +main.vaultDetail.missing.recheck=Periksa kembali +main.vaultDetail.missing.remove=Hapus dari Daftar Vault… +main.vaultDetail.missing.changeLocation=Ganti Lokasi Vault… ### Needs Migration main.vaultDetail.migrateButton=Tingkatkan Vault +main.vaultDetail.migratePrompt=Vault Anda perlu ditingkatkan ke format baru, sebelum Anda dapat mengaksesnya ### Error +main.vaultDetail.error.info=Terjadi kesalahan saat memuat vault dari disk. +main.vaultDetail.error.reload=Muat Ulang +main.vaultDetail.error.windowTitle=Terjadi kesalahan saat memuat vault # Wrong File Alert +wrongFileAlert.title=Cara Mengenkripsi File +wrongFileAlert.header.title=Apakah Anda mencoba mengenkripsi file-file ini? +wrongFileAlert.header.lead=Untuk itu, Cryptomator menyediakan volume di sistem file manager Anda. +wrongFileAlert.instruction.0=Untuk mengenkripsi file, ikuti langkah-langkah berikut: +wrongFileAlert.instruction.1=1. Membuka vault Anda. +wrongFileAlert.instruction.2=Klik "Reveal" untuk membuka volume di file manager Anda. +wrongFileAlert.instruction.3=3. Tambahkan file Anda ke volume ini. +wrongFileAlert.link=Untuk bantuan lebih lanjut, kunjungi # Vault Options ## General vaultOptions.general=Umum vaultOptions.general.vaultName=Nama Brankas +vaultOptions.general.autoLock.lockAfterTimePart1=Kunci saat idle untuk +vaultOptions.general.autoLock.lockAfterTimePart2=menit +vaultOptions.general.unlockAfterStartup=Buka vault saat memulai Cryptomator +vaultOptions.general.actionAfterUnlock=Setelah berhasil membuka +vaultOptions.general.actionAfterUnlock.ignore=Biarkan vaultOptions.general.actionAfterUnlock.reveal=Buka Drive +vaultOptions.general.actionAfterUnlock.ask=Tanya +vaultOptions.general.startHealthCheckBtn=Mulai Pemeriksaan Kesehatan ## Mount +vaultOptions.mount=Pemasangan +vaultOptions.mount.readonly=Read-Only +vaultOptions.mount.customMountFlags=Custom Mount Flags +vaultOptions.mount.winDriveLetterOccupied=terisi +vaultOptions.mount.mountPoint=Titik Pasang +vaultOptions.mount.mountPoint.auto=Secara otomatis memilih lokasi yang sesuai +vaultOptions.mount.mountPoint.driveLetter=Gunakan huruf drive yang ditetapkan +vaultOptions.mount.mountPoint.custom=Path khusus vaultOptions.mount.mountPoint.directoryPickerButton=Pilih… +vaultOptions.mount.mountPoint.directoryPickerTitle=Pilih direktori kosong ## Master Key +vaultOptions.masterkey=Kata Sandi vaultOptions.masterkey.changePasswordBtn=Ubah Kata Sandi +vaultOptions.masterkey.forgetSavedPasswordBtn=Lupa Kata Sandi +vaultOptions.masterkey.recoveryKeyExplanation=Kunci pemulihan adalah satu-satunya cara Anda untuk memulihkan akses ke vault jika Anda kehilangan kata sandi. +vaultOptions.masterkey.showRecoveryKeyBtn=Tampilkan Kunci Pemulihan +vaultOptions.masterkey.recoverPasswordBtn=Pemulihan Kata Sandi # Recovery Key +recoveryKey.title=Kunci Pemulihan +recoveryKey.enterPassword.prompt=Masukkan kata sandi untuk menampilkan kunci pemulikan untuk "%s": +recoveryKey.display.message=Kunci pemulihan berikut dapat digunakan untuk memulihkan akses ke "%s": +recoveryKey.display.StorageHints=Simpan di tempat yang sangat aman, misal.:\n • Simpan menggunakan password manager\n • Simpan di USB\n • cetak di kertas +recoveryKey.recover.prompt=Masukkan kunci pemulihan untuk "%s": +recoveryKey.recover.validKey=Ini adalah kunci pemulihan yang valid +recoveryKey.printout.heading=Kunci Pemulihan Cryptomator\n"%s"\n # New Password +newPassword.promptText=Masukkan kata sandi baru +newPassword.reenterPassword=Konfirmasi kata sandi baru +newPassword.passwordsMatch=Kasmta Sandi sesuai! +newPassword.passwordsDoNotMatch=Kata Sandi tidak sesuai +passwordStrength.messageLabel.tooShort=Gunakan minimal %d characters passwordStrength.messageLabel.0=Sangat lemah passwordStrength.messageLabel.1=Lemah passwordStrength.messageLabel.2=Cukup diff --git a/src/main/resources/i18n/strings_it.properties b/src/main/resources/i18n/strings_it.properties index 9fe88f563..51adc6e18 100644 --- a/src/main/resources/i18n/strings_it.properties +++ b/src/main/resources/i18n/strings_it.properties @@ -75,7 +75,9 @@ addvault.new.readme.accessLocation.2=Questa è la posizione d'accesso della tua addvault.new.readme.accessLocation.3=Ogni file aggiunto a questo volume sarà crittografato da Cryptomator. Puoi lavorarci come su ogni altra unità/cartella. Questa è solo una vista decrittografata del suo contenuto, i tuoi file restano sempre crittografati sul tuo disco rigido. addvault.new.readme.accessLocation.4=Sentiti libero di rimuovere questo file. ## Existing +addvaultwizard.existing.instruction=Scegliere il file "vault.cryptomator" della tua cassaforte. Se esiste solo un file chiamato "masterkey.cryptomator", allora scegli quello. addvaultwizard.existing.chooseBtn=Scegli… +addvaultwizard.existing.filePickerTitle=Seleziona file cassaforte ## Success addvaultwizard.success.nextStepsInstructions=Cassaforte "%s" aggiunta.\nDevi sbloccare questa cassaforte per accedere o aggiungere contenuti. Altrimenti, puoi sbloccarla in qualsiasi momento successivo. addvaultwizard.success.unlockNow=Sblocca Ora @@ -115,9 +117,8 @@ unlock.error.invalidMountPoint.existing=Il punto di montaggio "%s" esiste già o # Lock ## Force -lock.forced.heading=Blocco normale fallito lock.forced.message=Il bloccaggio di "%s" è stato impedito dalle operazioni in sospeso o dai file aperti. Puoi forzare il blocco di questa cassaforte, tuttavia, interrompere I/O potrebbe risultare nella perdita dei dati non salvati. -lock.forced.confirmBtn=Forza Blocco +lock.forced.retryBtn=Riprova ## Failure lock.fail.heading=Blocco della cassaforte fallito. lock.fail.message=Impossibile bloccare la cassaforte "%s". Assicurati che il lavoro non salvato sia salvato altrove e che le importanti operazioni di Lettura/Scrittura siano terminate. Per chiudere la cassaforte, termina il processo di Cryptomator. diff --git a/src/main/resources/i18n/strings_ja.properties b/src/main/resources/i18n/strings_ja.properties index b0947bf2f..dfda53a95 100644 --- a/src/main/resources/i18n/strings_ja.properties +++ b/src/main/resources/i18n/strings_ja.properties @@ -75,7 +75,9 @@ addvault.new.readme.accessLocation.2=ここは金庫のアクセス先です。 addvault.new.readme.accessLocation.3=このボリュームに追加したファイルは Cryptomator によって暗号化されます。一般的なドライブ/フォルダー上のように作業することができます。ここでは復号したコンテンツのビューにすぎず、ファイルは常にハードドライブ上で暗号化されています。 addvault.new.readme.accessLocation.4=このファイルはいつでも削除できます。 ## Existing +addvaultwizard.existing.instruction=すでにある金庫の "vault.cryptomator" ファイルを選択してください。"masterkey.cryptomator" という名前のファイルだけが存在する場合は、このファイルを代わりに選択してください。 addvaultwizard.existing.chooseBtn=選択... +addvaultwizard.existing.filePickerTitle=金庫のファイルを選択 ## Success addvaultwizard.success.nextStepsInstructions=金庫 "%s" を追加しました。\n金庫にアクセスしたり、コンテンツを追加したりするには、金庫を解錠する必要があります。あるいは、後で解錠することが可能です。 addvaultwizard.success.unlockNow=今すぐ解錠 @@ -115,9 +117,10 @@ unlock.error.invalidMountPoint.existing=マウント ポイント "%s" が既に # Lock ## Force -lock.forced.heading=正常な施錠に失敗しました +lock.forced.heading=施錠に失敗 lock.forced.message=保留中の操作または、開かれたファイルによって、"%s" の施錠が中断されました。この金庫を強制的に施錠することはできますが、I/O を中断すると保存されていないデータを失う可能性があります。 -lock.forced.confirmBtn=強制施錠 +lock.forced.retryBtn=再試行 +lock.forced.forceBtn=強制的に施錠 ## Failure lock.fail.heading=金庫の施錠に失敗しました。 lock.fail.message=金庫 "%s" を施錠できませんでした。保存されていないデータがほかの場所に保存され、重要な読み込み/書き込み操作が完了していることを確認してください。金庫を閉じるには、Cryptomator のプロセスを強制終了してください。 diff --git a/src/main/resources/i18n/strings_ko.properties b/src/main/resources/i18n/strings_ko.properties index 8c8f581c0..63b1d9111 100644 --- a/src/main/resources/i18n/strings_ko.properties +++ b/src/main/resources/i18n/strings_ko.properties @@ -113,9 +113,8 @@ unlock.error.invalidMountPoint.existing=구성지점/폴더가 이미 존재하 # Lock ## Force -lock.forced.heading=정상적인 잠금을 실패하였습니다. lock.forced.message=대기 중인 작동이나 파일이 열려있어 "%s"를 잠그는데 실패하였습니다. 이 Vault를 강제로 잠글 수 있으나, 입/출력의 중단은 저장되지 않은 데이터의 유실을 초래할 수 있습니다. -lock.forced.confirmBtn=강제 잠금 +lock.forced.retryBtn=재시도 ## Failure lock.fail.heading=Vault 잠금에 실패하였습니다. lock.fail.message="%s" Vault를 잠글 수 없습니다. 저장되지 않은 작업이 다른 곳에 저장된 것과 중요한 읽기/쓰기 동작이 완료되었는지 확인 하십시요. Vault를 닫기 위해, Cryptomator 프로세스를 강제로 종료 하십시요. diff --git a/src/main/resources/i18n/strings_nb.properties b/src/main/resources/i18n/strings_nb.properties index 278b0a397..9a3fb5fe5 100644 --- a/src/main/resources/i18n/strings_nb.properties +++ b/src/main/resources/i18n/strings_nb.properties @@ -106,9 +106,8 @@ unlock.error.invalidMountPoint.existing=Monteringspunktet "%s" finnes enten alle # Lock ## Force -lock.forced.heading=Låsingen mislyktes lock.forced.message=Låsing "%s" ble blokkert av ventende operasjoner eller åpne filer. Du kan tvinge låsing av dette hvelvet, men avbrytelse av I/O kan føre til tap av ulagrede data. -lock.forced.confirmBtn=Tving låsing +lock.forced.retryBtn=Prøv igjen ## Failure lock.fail.heading=Låsing av hvelvet mislyktes. lock.fail.message=Hvelvet "%s" kunne ikke låses. Forsikre deg om at ulagrede arbeider lagres andre steder, og at viktige lese/skrive-operasjoner er fullført. For å lukke hvelvet må du avbryte Cryptomatorprosessen. diff --git a/src/main/resources/i18n/strings_nl.properties b/src/main/resources/i18n/strings_nl.properties index 74279a24b..0f95c1619 100644 --- a/src/main/resources/i18n/strings_nl.properties +++ b/src/main/resources/i18n/strings_nl.properties @@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Koppelpunt "%s" bestaat reeds of de bove # Lock ## Force -lock.forced.heading=De kluis kon niet op een gecontroleerde manier vergrendeld worden +lock.forced.heading=Vergrendelen mislukt lock.forced.message=Het vergrendelen van "%s" werd voorkomen door lopende processen of geopende bestanden. U kunt de vergrendeling op deze kluis forceren, maar dit kan leiden tot het verlies van niet-opgeslagen gegevens. -lock.forced.confirmBtn=Forceer vergrendeling +lock.forced.retryBtn=Opnieuw proberen +lock.forced.forceBtn=Forceer vergrendeling ## Failure lock.fail.heading=Kluis kan niet vergrendeld worden. lock.fail.message=Kluis "%s" kan niet vergrendeld worden. Zorg ervoor dat u uw niet-opgeslagen werk ergens anders opslaat en belangrijke lees-/schrijfbewerkingen hebt voltooid. Om de kluis te sluiten, beëindigt u het Cryptomator-proces. diff --git a/src/main/resources/i18n/strings_pa.properties b/src/main/resources/i18n/strings_pa.properties index dd4587076..394ab7355 100644 --- a/src/main/resources/i18n/strings_pa.properties +++ b/src/main/resources/i18n/strings_pa.properties @@ -103,9 +103,7 @@ unlock.error.invalidMountPoint.existing="%s" ਮਾਊਂਟ ਪੁਆਇੰਟ # Lock ## Force -lock.forced.heading=ਸਧਾਰਨ ਲਾਕ ਕਰਨਾ ਅਸਫ਼ਲ ਹੈ lock.forced.message=ਬਾਕੀ ਰਹਿੰਦੀਆਂ ਕਾਰਵਾਈਆਂ ਜਾਂ ਫ਼ਾਈਲਾਂ ਖੁੱਲ੍ਹਣ ਕਰਕੇ "%s" ਲਾਕ ਕਰਨ ਨੂੰ ਰੋਕਿਆ ਗਿਆ ਹੈ। ਤੁਸੀਂ ਇਸ ਵਾਲਟ ਨੂੰ ਧੱਕੇ ਨਾਲ ਲਾਕ ਕਰ ਸਕਦੇ ਹੋ, ਪਰ I/O ਵਿੱਚ ਰੁਕਾਵਟ ਪਾਉਣ ਨਾਲ ਨਾ-ਸੰਭਾਲਿਆ ਡਾਟਾ ਖਤਮ ਹੋ ਜਾ ਸਕਦਾ ਹੈ। -lock.forced.confirmBtn=ਧੱਕੇ ਨਾਲ ਲਾਕ ਕਰੋ ## Failure lock.fail.heading=ਵਾਲਟ ਲਾਕ ਕਰਨਾ ਅਸਫ਼ਲ ਹੈ। lock.fail.message=ਵਾਲਟ "%s" ਨੂੰ ਲਾਕ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਨਾ-ਸੰਭਾਲੇ ਕੰਮ ਨੂੰ ਹੋਰ ਥਾਂ ਸੰਭਾਲ ਲਿਆ ਹੈ ਅਤੇ ਖਾਸ ਪੜ੍ਹਨ/ਲਿਖਣ ਕਾਰਵਾਈਆਂ ਪੂਰੀਆਂ ਹੋਈਆਂ ਹਨ। ਵਾਲਟ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ Cryptomator ਕਾਰਵਾਈ ਨੂੰ ਖਤਮ ਕਰੋ। diff --git a/src/main/resources/i18n/strings_pl.properties b/src/main/resources/i18n/strings_pl.properties index 331f30916..e823d166f 100644 --- a/src/main/resources/i18n/strings_pl.properties +++ b/src/main/resources/i18n/strings_pl.properties @@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Punkt montowania już istnieje lub braku # Lock ## Force -lock.forced.heading=Blokada nie powiodła się +lock.forced.heading=Nieudana próba blokady lock.forced.message=Zamknięcie "%s" zostało zablokowane przez oczekujące operacje lub otwarte pliki. Możesz wymusić zamknięcie tego sejfu, ale może to spowodować utratę niezapisanych danych. -lock.forced.confirmBtn=Wymuś zablokowanie +lock.forced.retryBtn=Ponów +lock.forced.forceBtn=Wymuś blokowanie ## Failure lock.fail.heading=Błąd blokowania sejfu. lock.fail.message=Nie można zablokować sejfu "%s". Zapisz wszelkie zmiany w bezpiecznym miejscu i upewnij się, że nie ma żadnych ważnych oczekujących operacji odczytu/zapisu. W celu zamknięcia sejfu ubij Cryptomator. diff --git a/src/main/resources/i18n/strings_pt.properties b/src/main/resources/i18n/strings_pt.properties index 7305e0f11..5f60e7025 100644 --- a/src/main/resources/i18n/strings_pt.properties +++ b/src/main/resources/i18n/strings_pt.properties @@ -13,6 +13,11 @@ generic.button.done=Ok generic.button.next=Seguinte generic.button.print=Imprimir ## Error +generic.error.title=Erro %s +generic.error.instruction=Opa! Cryptomator não esperava que isto acontecesse. Pode procurar as soluções existentes para este erro. Ou se ainda não tiver sido relatado, sinta-se à vontade para o fazer. +generic.error.hyperlink.lookup=Procure este erro +generic.error.hyperlink.report=Relatar este erro +generic.error.technicalDetails=Detalhes: # Defaults defaults.vault.vaultName=Cofre @@ -43,6 +48,9 @@ addvaultwizard.new.directoryPickerLabel=Outro Local addvaultwizard.new.directoryPickerButton=Escolher… addvaultwizard.new.directoryPickerTitle=Selecionar diretório addvaultwizard.new.fileAlreadyExists=Aviso: Já existe um Ficheiro ou Diretório com o mesmo nome +addvaultwizard.new.locationDoesNotExist=Um diretório no caminho especificado não existe ou não pode ser acessado +addvaultwizard.new.locationIsNotWritable=Sem acesso de escrita no caminho especificado +addvaultwizard.new.locationIsOk=Localização adequada para o seu cofre addvaultwizard.new.invalidName=Nome de cofre inválido. Por favor considere um nome de diretório regular. ### Password addvaultwizard.new.createVaultBtn=Criar Cofre @@ -53,6 +61,9 @@ addvaultwizard.new.generateRecoveryKeyChoice.no=Não obrigado, não vou perder a addvault.new.readme.storageLocation.fileName=IMPORTANTE.rtf addvault.new.readme.storageLocation.1=⚠ ARQUIVOS DO COFRE ⚠ addvault.new.readme.storageLocation.2=Este é o local de armazenamento do seu cofre. +addvault.new.readme.storageLocation.3=NÃO FAÇA +addvault.new.readme.storageLocation.4=- alterar quaisquer ficheiros dentro deste directório ou +addvault.new.readme.storageLocation.5=- colar quaisquer ficheiros para encriptação neste directório. addvault.new.readme.storageLocation.6=Se deseja criptografar arquivos e visualizar o conteúdo do cofre, faça o seguinte: addvault.new.readme.storageLocation.7=1. Adicione este cofre ao Cryptomator. addvault.new.readme.storageLocation.8=2. Desbloqueie o cofre no Cryptomator. @@ -60,6 +71,7 @@ addvault.new.readme.storageLocation.9=3. Abra o local de acesso clicando no bot addvault.new.readme.storageLocation.10=Se precisar de ajuda, visite a documentação: %s addvault.new.readme.accessLocation.fileName=BEM-VINDO.rtf addvault.new.readme.accessLocation.1=🔐 VOLUME CRIPTOGRAFADO 🔐 +addvault.new.readme.accessLocation.2=Este é o local de acesso do seu cofre. addvault.new.readme.accessLocation.4=Sinta-se livre para remover este ficheiro. ## Existing addvaultwizard.existing.chooseBtn=Escolher… @@ -92,7 +104,9 @@ unlock.success.rememberChoice=Lembrar escolha, não mostrar isto novamente # Lock ## Force -lock.forced.confirmBtn=Forçar Bloqueio +lock.forced.heading=Cadeado falhou\nOr\nBloqueio falhou +lock.forced.retryBtn=Tente novamente +lock.forced.forceBtn=Forçar bloqueio ## Failure # Migration diff --git a/src/main/resources/i18n/strings_pt_BR.properties b/src/main/resources/i18n/strings_pt_BR.properties index be7ecb16c..bd19fa5bf 100644 --- a/src/main/resources/i18n/strings_pt_BR.properties +++ b/src/main/resources/i18n/strings_pt_BR.properties @@ -75,7 +75,9 @@ addvault.new.readme.accessLocation.2=Este é o local de acesso ao seu cofre. addvault.new.readme.accessLocation.3=Todos os arquivos adicionados a este volume serão encriptados pelo Cryptomator. Você pode trabalhar nele tal como em qualquer outra unidade/pasta. Esta é apenas uma visão desencriptada do seu conteúdo, seus arquivos ficam encriptados em seu disco rígido o tempo todo. addvault.new.readme.accessLocation.4=Sinta-se livre para apagar este arquivo. ## Existing +addvaultwizard.existing.instruction=Escolha o arquivo "vault.cryptomator" do seu cofre existente. Se existir apenas um arquivo chamado "masterkey.cryptomator", selecione outro. addvaultwizard.existing.chooseBtn=Selecionar… +addvaultwizard.existing.filePickerTitle=Selecionar arquivo do Cofre ## Success addvaultwizard.success.nextStepsInstructions=Cofre "%s" adicionado.\nVocê precisa desbloquear este cofre para acessar ou adicionar conteúdo. Você também pode desbloqueá-lo a qualquer momento. addvaultwizard.success.unlockNow=Desbloquear Agora @@ -115,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Ponto de montagem/pasta já existe ou a # Lock ## Force -lock.forced.heading=Bloqueio normal falhou +lock.forced.heading=Bloqueio falhou lock.forced.message=Trancar "%s" foi bloqueado por operações pendentes ou arquivos abertos. Você pode forçar o bloqueio deste cofre, no entanto, a interrupção pode resultar em perda de dados não salvos. -lock.forced.confirmBtn=Forçar Bloqueio +lock.forced.retryBtn=Tentar Novamente +lock.forced.forceBtn=Forçar Bloqueio ## Failure lock.fail.heading=O bloqueio do cofre falhou. lock.fail.message=Cofre "%s" não pôde ser bloqueado. Certifique-se de que o trabalho não salvo está salvo em outro lugar e que operações de Leitura/Escrita importantes sejam concluídas. Para fechar o cofre, encerre o processo do Cryptomator. diff --git a/src/main/resources/i18n/strings_ro.properties b/src/main/resources/i18n/strings_ro.properties index 9276f89aa..2663460b0 100644 --- a/src/main/resources/i18n/strings_ro.properties +++ b/src/main/resources/i18n/strings_ro.properties @@ -110,9 +110,8 @@ unlock.error.invalidMountPoint.existing=Punctul de montare "%s" există deja sau # Lock ## Force -lock.forced.heading=Blocarea elegantă a eșuat lock.forced.message=Blocarea "%s" a fost blocată de operațiile în așteptare sau de fișierele deschise. Puteți forța blocarea acestui seif, dar întreruperea I/O poate duce la pierderea datelor nesalvate. -lock.forced.confirmBtn=Forțați blocarea +lock.forced.retryBtn=Încercați din nou ## Failure lock.fail.heading=Blocarea seifului a eșuat. lock.fail.message=Seiful "%s" nu a putut fi blocat. Asigurați-vă că lucrările nesalvate sunt salvate altundeva și că operațiunile importante de citire/scriere sunt terminate. Pentru a închide seiful omoară procesul Cryptomator. diff --git a/src/main/resources/i18n/strings_ru.properties b/src/main/resources/i18n/strings_ru.properties index e1f6a3475..22b529478 100644 --- a/src/main/resources/i18n/strings_ru.properties +++ b/src/main/resources/i18n/strings_ru.properties @@ -14,8 +14,8 @@ generic.button.next=Далее generic.button.print=Печать ## Error generic.error.title=Ошибка: %s -generic.error.instruction=Произошла непредвиденная ситуация. Попробуйте найти уже имеющиеся решения этой ошибки. Если об этой ошибке ещё не сообщали, то сделайте это. -generic.error.hyperlink.lookup=Найти ошибку +generic.error.instruction=Ой! Криптоматор не ожидал, что так произойдет. Вы можете поискать существующие решения этой ошибки. Или если об этом еще не сообщалось, не стесняйтесь сделать это. +generic.error.hyperlink.lookup=Искать ошибку generic.error.hyperlink.report=Сообщить об ошибке generic.error.technicalDetails=Подробности: @@ -95,7 +95,7 @@ changepassword.finalConfirmation=Я понимаю, что не смогу по # Forget Password forgetPassword.title=Не помню пароль forgetPassword.information=Сохранённый пароль от этого хранилища будет удалён из вашей связки ключей. -forgetPassword.confirmBtn=Не помню пароль +forgetPassword.confirmBtn=Забыть сохранённый пароль # Unlock unlock.title=Разблокировать "%s" @@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Точка монтирования %s # Lock ## Force -lock.forced.heading=Ошибка мягкой блокировки +lock.forced.heading=Не удалось заблокировать lock.forced.message=Блокировка "%s" невозможна из-за незавершённых операций или открытых файлов. Вы можете заблокировать это хранилище принудительно, однако прерывание ввода-вывода может привести к потере несохранённых данных. -lock.forced.confirmBtn=Принудительная блокировка +lock.forced.retryBtn=Повторить +lock.forced.forceBtn=Принудительная блокировка ## Failure lock.fail.heading=Не удалось заблокировать хранилище. lock.fail.message=Хранилище "%s" не удалось заблокировать. Убедитесь, что несохранённые данные сохранены в другом месте и завершены важные операции чтения/записи. Чтобы закрыть хранилище, завершите процесс Cryptomator. diff --git a/src/main/resources/i18n/strings_sk.properties b/src/main/resources/i18n/strings_sk.properties index 6223320c1..ac52f4a22 100644 --- a/src/main/resources/i18n/strings_sk.properties +++ b/src/main/resources/i18n/strings_sk.properties @@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Bod pripojenia "%s" už existuje alebo c # Lock ## Force -lock.forced.heading=Bežné uzamknutie zlyhalo +lock.forced.heading=Uzamknutie zlyhalo lock.forced.message=Zamknutie "%s" bolo zablokované prebiehajúcimi operáciami alebo otvorenými súbormi. Smiete vynútiť uzamknutie tohto trezoru, ale prerušením I/O môže viesť k strate alebo neuloženiu dát. -lock.forced.confirmBtn=Vynútené uzamknutie +lock.forced.retryBtn=Skúsiť znovu +lock.forced.forceBtn=Vynútené uzamknutie ## Failure lock.fail.heading=Uzatváranie trezoru zlyhalo. lock.fail.message=Trezor "%s" nie je možné uzamknúť. Uistite sa že neuložená páca je uložená inde a dôležité Read/Write operácie sú ukončené. Ináč uzavretím trezoru, ukončíte proces Cryptomator-a. diff --git a/src/main/resources/i18n/strings_sr.properties b/src/main/resources/i18n/strings_sr.properties index 3e7183746..f01d76a67 100644 --- a/src/main/resources/i18n/strings_sr.properties +++ b/src/main/resources/i18n/strings_sr.properties @@ -108,9 +108,7 @@ unlock.error.invalidMountPoint.existing=Тачка везивања "%s" већ # Lock ## Force -lock.forced.heading=Нормално закључавање није успело lock.forced.message=Закључавање "%s" је блокирано операцијама на чекању или отвореним датотекама. Можете присилно закључати овај сеф, међутим прекид "I/O" операција може резултирати губитком несачуваних података. -lock.forced.confirmBtn=Присилно закључај ## Failure lock.fail.heading=Закључавање сефа није успело. lock.fail.message=Сеф "%s" није могуће закључати. Будите сигурни да је несачувани рад сачуван негде другде и да су важне операције читања/писања завршене. Како бисте затворили сеф, зауставите Cryptomator процес у систему. diff --git a/src/main/resources/i18n/strings_sr_Latn.properties b/src/main/resources/i18n/strings_sr_Latn.properties index 2b681e4a5..83b9161a9 100644 --- a/src/main/resources/i18n/strings_sr_Latn.properties +++ b/src/main/resources/i18n/strings_sr_Latn.properties @@ -108,9 +108,7 @@ unlock.error.invalidMountPoint.existing=Tačka vezivanja "%s" već postoji ili j # Lock ## Force -lock.forced.heading=Normalno zaključavanje nije uspelo lock.forced.message=Zaključavanje "%s" je blokirano operacijama na čekanju ili otvorenim datotekama. Možete prisilno zaključati ovaj sef, međutim prekid "I/O" operacija može rezultirati gubitkom nesačuvanih podataka. -lock.forced.confirmBtn=Prisilno zaključaj ## Failure lock.fail.heading=Zaključavanje sefa nije uspelo. lock.fail.message=Sef "%s" nije moguće zaključati. Budite sigurni da je nesačuvani rad sačuvan negde drugde i da su važne operacije čitanja/pisanja završene. Kako biste zatvorili sef, zaustavite Cryptomator proces u sistemu. diff --git a/src/main/resources/i18n/strings_sv.properties b/src/main/resources/i18n/strings_sv.properties index 2831a9cba..547a8b8fa 100644 --- a/src/main/resources/i18n/strings_sv.properties +++ b/src/main/resources/i18n/strings_sv.properties @@ -75,7 +75,9 @@ addvault.new.readme.accessLocation.2=Detta är ditt valvs åtkomstplats. addvault.new.readme.accessLocation.3=Alla filer som läggs till denna volym kommer att krypteras av Cryptomator. Du kan arbeta med dem som i vilken annan enhet/mapp som helst. Detta är bara en dekrypterad vy av dess innehåll, dina filer förblir krypterade på din hårddisk hela tiden. addvault.new.readme.accessLocation.4=Du kan ta bort denna fil. ## Existing +addvaultwizard.existing.instruction=Välj filen "vault.cryptomator" i ditt befintliga valv. Om det endast finns en fil som heter "masterkey.cryptomator", välj den istället. addvaultwizard.existing.chooseBtn=Välj… +addvaultwizard.existing.filePickerTitle=Välj valvfil ## Success addvaultwizard.success.nextStepsInstructions=Lade till valv "%s".\nDu måste låsa upp detta valv för att komma åt eller lägga till innehåll. Du kan även låsa upp det vid ett senare tillfälle. addvaultwizard.success.unlockNow=Lås upp nu @@ -115,9 +117,8 @@ unlock.error.invalidMountPoint.existing=Monteringspunkten "%s" finns redan eller # Lock ## Force -lock.forced.heading=Normal låsning misslyckades lock.forced.message=Låsning av "%s" förhindras av pågående operationer eller öppna filer. Du kan tvinga låsning av detta valv, men det kan resultera i förlust av osparade data. -lock.forced.confirmBtn=Tvinga låsning +lock.forced.retryBtn=Försök igen ## Failure lock.fail.heading=Låsning av valv misslyckades. lock.fail.message=Valvet "%s" kunde inte låsas. Se till att osparat arbete sparas någon annanstans och viktiga läs- och skrivfunktioner är klara. För att stänga valvet, avsluta Cryptomator-processen. diff --git a/src/main/resources/i18n/strings_ta.properties b/src/main/resources/i18n/strings_ta.properties new file mode 100644 index 000000000..6b5ea4bc9 --- /dev/null +++ b/src/main/resources/i18n/strings_ta.properties @@ -0,0 +1,89 @@ +# Locale Specific CSS files such as CJK, RTL,... + +# Generics +## Button +## Error + +# Defaults + +# Tray Menu + +# Add Vault Wizard +## Welcome +## New +### Name +### Location +### Password +### Information +## Existing +## Success + +# Remove Vault + +# Change Password + +# Forget Password + +# Unlock +## +## Success +## Failure +### Invalid Mount Point + +# Lock +## Force +lock.forced.retryBtn=மீண்டும் முயற்சிக்கவும் +## Failure + +# Migration +## Start +## Run +## Success +## Missing file system capabilities +## Impossible + +# Health Check +## Start +## Start Failure +## Check Selection +## Detail view +## Fix Application + +# Preferences +## General +## Volume +## Updates +## Contribution +#<-- Add entries for donations and code/translation/documentation contribution --> + +## About + +# Vault Statistics +## Read +## Write + +# Main Window +## Drag 'n' Drop +## Vault List +## Vault Detail +### Welcome +### Locked +### Unlocked +### Missing +### Needs Migration +### Error + +# Wrong File Alert + +# Vault Options +## General + +## Mount +## Master Key + + +# Recovery Key + +# New Password + +# Quit diff --git a/src/main/resources/i18n/strings_te.properties b/src/main/resources/i18n/strings_te.properties new file mode 100644 index 000000000..e2ce80d76 --- /dev/null +++ b/src/main/resources/i18n/strings_te.properties @@ -0,0 +1,89 @@ +# Locale Specific CSS files such as CJK, RTL,... + +# Generics +## Button +## Error + +# Defaults + +# Tray Menu + +# Add Vault Wizard +## Welcome +## New +### Name +### Location +### Password +### Information +## Existing +## Success + +# Remove Vault + +# Change Password + +# Forget Password + +# Unlock +## +## Success +## Failure +### Invalid Mount Point + +# Lock +## Force +lock.forced.retryBtn=మళ్ళీ చేయండి +## Failure + +# Migration +## Start +## Run +## Success +## Missing file system capabilities +## Impossible + +# Health Check +## Start +## Start Failure +## Check Selection +## Detail view +## Fix Application + +# Preferences +## General +## Volume +## Updates +## Contribution +#<-- Add entries for donations and code/translation/documentation contribution --> + +## About + +# Vault Statistics +## Read +## Write + +# Main Window +## Drag 'n' Drop +## Vault List +## Vault Detail +### Welcome +### Locked +### Unlocked +### Missing +### Needs Migration +### Error + +# Wrong File Alert + +# Vault Options +## General + +## Mount +## Master Key + + +# Recovery Key + +# New Password + +# Quit diff --git a/src/main/resources/i18n/strings_tr.properties b/src/main/resources/i18n/strings_tr.properties index 906356704..ecb4fff5f 100644 --- a/src/main/resources/i18n/strings_tr.properties +++ b/src/main/resources/i18n/strings_tr.properties @@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=Bağlama noktası / klasör zaten var ve # Lock ## Force -lock.forced.heading=Normal kilitleme başarısız oldu +lock.forced.heading=Kilitleme başarısız lock.forced.message="%s" nin kilitlenmesi, bekleyen işlemler veya açık dosyalar tarafından engellendi. Bu kasayı zorla kilitleyebilirsiniz, ancak G/Ç'nin kesilmesi kaydedilmemiş verilerin kaybına neden olabilir. -lock.forced.confirmBtn=Kilitlemeyi Zorla +lock.forced.retryBtn=Yeniden dene +lock.forced.forceBtn=Kilitlemeye zorla ## Failure lock.fail.heading=Kasa kilitlenemedi. lock.fail.message="%s" kasası kilitlenemedi. Kaydedilmemiş çalışmanın başka bir yere kaydedildiğinden ve önemli Okuma / Yazma işlemlerinin tamamlandığından emin olun. Kasayı kapatmak için Cryptomator işlemini sonlandırın. diff --git a/src/main/resources/i18n/strings_uk.properties b/src/main/resources/i18n/strings_uk.properties index 1b7af9c4d..ff6e674e8 100644 --- a/src/main/resources/i18n/strings_uk.properties +++ b/src/main/resources/i18n/strings_uk.properties @@ -2,20 +2,56 @@ # Generics ## Button +generic.button.apply=Застосувати +generic.button.back=Назад +generic.button.cancel=Відмінити +generic.button.change=Змінити +generic.button.close=Закрити +generic.button.copy=Копіювати +generic.button.copied=Скопійовано! +generic.button.done=Готово +generic.button.next=Далі +generic.button.print=Друкувати ## Error +generic.error.title=Помилка %s +generic.error.instruction=Ой! Cryptomator не очікував, що таке трапиться. Ви можете знайти існуючі рішення цієї помилки. Або, якщо про це ще не повідомили, то не соромтеся зробити це. +generic.error.hyperlink.lookup=Дізнатися більше про цю помилку +generic.error.hyperlink.report=Повідомити про помилку +generic.error.technicalDetails=Докладно: # Defaults +defaults.vault.vaultName=Сховище # Tray Menu +traymenu.showMainWindow=Показати +traymenu.showPreferencesWindow=Властивості +traymenu.lockAllVaults=Заблокувати все +traymenu.quitApplication=Вийти +traymenu.vault.unlock=Розблокувати +traymenu.vault.lock=Заблокувати +traymenu.vault.reveal=Показати # Add Vault Wizard +addvaultwizard.title=Додати сховище ## Welcome +addvaultwizard.welcome.newButton=Створити нове сховище +addvaultwizard.welcome.existingButton=Відкрити існуюче сховище ## New ### Name +addvaultwizard.new.nameInstruction=Оберіть назву для сховища +addvaultwizard.new.namePrompt=Назва сховища ### Location +addvaultwizard.new.locationInstruction=Де Cryptomator має зберігати зашифровані файли вашого сховища? +addvaultwizard.new.locationLabel=Розташування сховища +addvaultwizard.new.locationPrompt=… +addvaultwizard.new.directoryPickerLabel=Власне розташування +addvaultwizard.new.directoryPickerButton=Обрати… +addvaultwizard.new.directoryPickerTitle=Оберіть директорію +addvaultwizard.new.fileAlreadyExists=Файл чи папка з іменем сховища вже існує ### Password ### Information ## Existing +addvaultwizard.existing.chooseBtn=Обрати… ## Success # Remove Vault @@ -25,6 +61,7 @@ # Forget Password # Unlock +unlock.unlockBtn=Розблокувати ## ## Success ## Failure @@ -32,6 +69,9 @@ # Lock ## Force +lock.forced.heading=Помилка блокування +lock.forced.retryBtn=Повторити +lock.forced.forceBtn=Примусове блокування ## Failure # Migration @@ -49,6 +89,7 @@ ## Fix Application # Preferences +preferences.title=Властивості ## General ## Volume ## Updates @@ -62,12 +103,17 @@ ## Write # Main Window +main.closeBtn.tooltip=Закрити +main.preferencesBtn.tooltip=Властивості ## Drag 'n' Drop ## Vault List +main.vaultlist.contextMenu.lock=Заблокувати +main.vaultlist.addVaultBtn=Додати сховище ## Vault Detail ### Welcome ### Locked ### Unlocked +main.vaultDetail.lockBtn=Заблокувати ### Missing ### Needs Migration ### Error @@ -76,8 +122,10 @@ # Vault Options ## General +vaultOptions.general.vaultName=Назва сховища ## Mount +vaultOptions.mount.mountPoint.directoryPickerButton=Обрати… ## Master Key diff --git a/src/main/resources/i18n/strings_zh.properties b/src/main/resources/i18n/strings_zh.properties index 184254e34..fbd2fa861 100644 --- a/src/main/resources/i18n/strings_zh.properties +++ b/src/main/resources/i18n/strings_zh.properties @@ -117,9 +117,10 @@ unlock.error.invalidMountPoint.existing=挂载点 "%s" 已存在或缺少父文 # Lock ## Force -lock.forced.heading=常规锁定失败 +lock.forced.heading=锁定失败 lock.forced.message=锁定 "%s" 被挂起的操作或使用中的文件中断。您可以强制锁定此保险库,不过请注意打断 I/O 可能导致未保存的数据丢失 -lock.forced.confirmBtn=强制锁定 +lock.forced.retryBtn=重试 +lock.forced.forceBtn=强制锁定 ## Failure lock.fail.heading=锁定保险库失败 lock.fail.message=保险库 "%s" 无法锁定。请确保在其他地方保存未保存的工作,以及重要的 "读/写" 操作已完成。为了顺利关闭保险库,请查杀 Cryptomator 进程 diff --git a/src/main/resources/i18n/strings_zh_TW.properties b/src/main/resources/i18n/strings_zh_TW.properties index c79b9c28f..cf77ffbbe 100644 --- a/src/main/resources/i18n/strings_zh_TW.properties +++ b/src/main/resources/i18n/strings_zh_TW.properties @@ -117,9 +117,8 @@ unlock.error.invalidMountPoint.existing=掛載點已經存在或上層資料夾 # Lock ## Force -lock.forced.heading=正常鎖定失敗 lock.forced.message=仍有未完成的操作或開啟中的檔案以致無法鎖定 "%s"。您可以強制鎖定這個加密檔案庫,不過中斷讀寫可能會導致資料遺失或未被儲存。 -lock.forced.confirmBtn=強制鎖定 +lock.forced.retryBtn=重試 ## Failure lock.fail.heading=鎖定加密檔案庫失敗。 lock.fail.message=加密檔案庫 "%s" 無法被鎖定。請確保未存檔的工作已儲存在別的地方以及重要的讀寫工作都已經完成。請強制結束 Cryptomator 以關閉加密檔案庫。 From 4baf05e6847ea91238bce2a74d7b56c9f395e5df Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Thu, 2 Dec 2021 08:46:35 +0100 Subject: [PATCH 11/31] prepare 1.6.4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8caeb8a32..e4d5a57d2 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.cryptomator cryptomator - 1.7.0-SNAPSHOT + 1.6.4 Cryptomator Desktop App From 919257a99eb56a188e9fdebd4b7970ec66edc2e1 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Thu, 2 Dec 2021 11:23:27 +0100 Subject: [PATCH 12/31] Bump dagger --- pom.xml | 2 +- src/main/resources/license/THIRD-PARTY.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 613654b56..55501fb5c 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,7 @@ 3.18.2 2.2 31.0-jre - 2.39 + 2.40.3 2.8.9 1.5.2 1.7.32 diff --git a/src/main/resources/license/THIRD-PARTY.txt b/src/main/resources/license/THIRD-PARTY.txt index 3b3ad5ab2..dac878ab9 100644 --- a/src/main/resources/license/THIRD-PARTY.txt +++ b/src/main/resources/license/THIRD-PARTY.txt @@ -17,7 +17,7 @@ Cryptomator uses 40 third-party dependencies under the following licenses: - jnr-a64asm (com.github.jnr:jnr-a64asm:1.0.0 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-a64asm) - jnr-constants (com.github.jnr:jnr-constants:0.10.2 - http://github.com/jnr/jnr-constants) - jnr-ffi (com.github.jnr:jnr-ffi:2.2.7 - http://github.com/jnr/jnr-ffi) - - Dagger (com.google.dagger:dagger:2.39 - https://github.com/google/dagger) + - Dagger (com.google.dagger:dagger:2.40.3 - https://github.com/google/dagger) - Guava InternalFutureFailureAccess and InternalFutures (com.google.guava:failureaccess:1.0.1 - https://github.com/google/guava/failureaccess) - Guava: Google Core Libraries for Java (com.google.guava:guava:31.0-jre - https://github.com/google/guava) - Apache Commons CLI (commons-cli:commons-cli:1.4 - http://commons.apache.org/proper/commons-cli/) From 335a91d24a416ecf94a23d4ab93e8f622eaf3b94 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Thu, 2 Dec 2021 12:33:51 +0100 Subject: [PATCH 13/31] reset to snapshot version [ci skip] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0ad640f72..55501fb5c 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.cryptomator cryptomator - 1.6.4 + 1.7.0-SNAPSHOT Cryptomator Desktop App From 085304ec0421653881a087b4d8834a15724ad6cb Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Thu, 2 Dec 2021 17:16:01 +0100 Subject: [PATCH 14/31] set up SonarCloud --- .github/workflows/build.yml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2ffc3070e..750b64826 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,8 +24,24 @@ jobs: distribution: 'temurin' java-version: ${{ env.JAVA_VERSION }} cache: 'maven' + - name: Cache SonarCloud packages + uses: actions/cache@v2 + with: + path: ~/.sonar/cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar - name: Build and Test - run: mvn -B clean install jacoco:report -Pcoverage,dependency-check + run: > + mvn -B verify + jacoco:report + org.sonarsource.scanner.maven:sonar-maven-plugin:sonar + -Pcoverage,dependency-check + -Dsonar.projectKey=cryptomator_cryptomator + -Dsonar.organization=cryptomator + -Dsonar.host.url=https://sonarcloud.io + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - name: Upload code coverage report id: codacyCoverageReporter if: "github.event_name == 'push' || contains(github.event.pull_request.labels.*.name, 'pr:safe')" From f277d4d21bbb8c536dff2c77efe72ceb77e88cd2 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Fri, 3 Dec 2021 11:38:25 +0100 Subject: [PATCH 15/31] fix resource leak --- .../common/mountpoint/MountPointHelper.java | 10 ++++++---- src/main/java/org/cryptomator/ipc/Server.java | 18 ++++++++++++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/cryptomator/common/mountpoint/MountPointHelper.java b/src/main/java/org/cryptomator/common/mountpoint/MountPointHelper.java index 704f2f62d..fe64902bd 100644 --- a/src/main/java/org/cryptomator/common/mountpoint/MountPointHelper.java +++ b/src/main/java/org/cryptomator/common/mountpoint/MountPointHelper.java @@ -66,9 +66,9 @@ class MountPointHelper { private void clearIrregularUnmountDebris(Path dirContainingMountPoints) { IOException cleanupFailed = new IOException("Cleanup failed"); - try { + try (var ds = Files.newDirectoryStream(dirContainingMountPoints)) { LOG.debug("Performing cleanup of mountpoint dir {}.", dirContainingMountPoints); - for (Path p : Files.newDirectoryStream(dirContainingMountPoints)) { + for (Path p : ds) { try { var attr = Files.readAttributes(p, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS); if (attr.isOther() && attr.isDirectory()) { // yes, this is possible with windows junction points -.- @@ -113,8 +113,10 @@ class MountPointHelper { } private void ensureIsEmpty(Path dir) throws IOException { - if (Files.newDirectoryStream(dir).iterator().hasNext()) { - throw new DirectoryNotEmptyException(dir.toString()); + try (var ds = Files.newDirectoryStream(dir)) { + if (ds.iterator().hasNext()){ + throw new DirectoryNotEmptyException(dir.toString()); + } } } } diff --git a/src/main/java/org/cryptomator/ipc/Server.java b/src/main/java/org/cryptomator/ipc/Server.java index 6058a608f..770373681 100644 --- a/src/main/java/org/cryptomator/ipc/Server.java +++ b/src/main/java/org/cryptomator/ipc/Server.java @@ -7,9 +7,11 @@ import java.io.EOFException; import java.io.IOException; import java.net.StandardProtocolFamily; import java.net.UnixDomainSocketAddress; +import java.nio.channels.AlreadyBoundException; import java.nio.channels.AsynchronousCloseException; import java.nio.channels.ClosedChannelException; import java.nio.channels.ServerSocketChannel; +import java.nio.channels.UnsupportedAddressTypeException; import java.nio.file.Files; import java.nio.file.Path; import java.util.concurrent.Executor; @@ -29,10 +31,18 @@ class Server implements IpcCommunicator { public static Server create(Path socketPath) throws IOException { Files.createDirectories(socketPath.getParent()); var address = UnixDomainSocketAddress.of(socketPath); - var serverSocketChannel = ServerSocketChannel.open(StandardProtocolFamily.UNIX); - serverSocketChannel.bind(address); - LOG.info("Spawning IPC server listening on socket {}", socketPath); - return new Server(serverSocketChannel, socketPath); + ServerSocketChannel ch = null; + try { + ch = ServerSocketChannel.open(StandardProtocolFamily.UNIX); + ch.bind(address); + LOG.info("Spawning IPC server listening on socket {}", socketPath); + return new Server(ch, socketPath); + } catch (IOException | AlreadyBoundException | UnsupportedAddressTypeException e) { + if (ch != null) { + ch.close(); + } + throw e; + } } @Override From 0fd6e5bbb0d275327f106f35271eba70b8e8054d Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Fri, 3 Dec 2021 12:17:07 +0100 Subject: [PATCH 16/31] fixed code smells --- .../org/cryptomator/logging/LoggerModule.java | 10 +++++---- .../ui/common/UserInteractionLock.java | 21 ++++++++++++------- .../ui/fxapp/UpdateCheckerTask.java | 2 +- .../ui/stats/VaultStatisticsController.java | 4 ++-- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/cryptomator/logging/LoggerModule.java b/src/main/java/org/cryptomator/logging/LoggerModule.java index 4866655e3..5031fe3be 100644 --- a/src/main/java/org/cryptomator/logging/LoggerModule.java +++ b/src/main/java/org/cryptomator/logging/LoggerModule.java @@ -79,8 +79,9 @@ public class LoggerModule { @Singleton @Named("fileAppender") static Appender provideFileAppender(LoggerContext context, PatternLayoutEncoder encoder, Environment environment) { - if (environment.getLogDir().isPresent()) { - Path logDir = environment.getLogDir().get(); + var optionalLogDir = environment.getLogDir(); + if (optionalLogDir.isPresent()) { + Path logDir = optionalLogDir.get(); RollingFileAppender appender = new RollingFileAppender<>(); appender.setContext(context); appender.setFile(logDir.resolve(LOGFILE_NAME).toString()); @@ -110,9 +111,10 @@ public class LoggerModule { @Singleton @Named("upgradeAppender") static Appender provideUpgradeAppender(LoggerContext context, PatternLayoutEncoder encoder, Environment environment) { - if (environment.getLogDir().isPresent()) { + var optionalLogDir = environment.getLogDir(); + if (optionalLogDir.isPresent()) { FileAppender appender = new FileAppender<>(); - appender.setFile(environment.getLogDir().get().resolve(UPGRADE_FILENAME).toString()); + appender.setFile(optionalLogDir.get().resolve(UPGRADE_FILENAME).toString()); appender.setContext(context); appender.setEncoder(encoder); appender.start(); diff --git a/src/main/java/org/cryptomator/ui/common/UserInteractionLock.java b/src/main/java/org/cryptomator/ui/common/UserInteractionLock.java index 4eba62552..12c394533 100644 --- a/src/main/java/org/cryptomator/ui/common/UserInteractionLock.java +++ b/src/main/java/org/cryptomator/ui/common/UserInteractionLock.java @@ -4,30 +4,35 @@ import javafx.application.Platform; import javafx.beans.property.BooleanProperty; import javafx.beans.property.ReadOnlyBooleanProperty; import javafx.beans.property.SimpleBooleanProperty; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -public class UserInteractionLock { +public class UserInteractionLock> { private final Lock lock = new ReentrantLock(); private final Condition condition = lock.newCondition(); private final BooleanProperty awaitingInteraction = new SimpleBooleanProperty(); - private volatile E state; + private final AtomicBoolean interacted = new AtomicBoolean(); + private final AtomicReference state; public UserInteractionLock(E initialValue) { - this.state = initialValue; + this.state = new AtomicReference<>(initialValue); } public synchronized void reset(E value) { - this.state = value; + state.set(value); + interacted.set(false); } public void interacted(E result) { assert Platform.isFxApplicationThread(); lock.lock(); try { - state = result; + state.set(result); + interacted.set(true); awaitingInteraction.set(false); condition.signal(); } finally { @@ -40,8 +45,10 @@ public class UserInteractionLock { lock.lock(); try { Platform.runLater(() -> awaitingInteraction.set(true)); - condition.await(); - return state; + while (!interacted.get()) { + condition.await(); + } + return state.get(); } finally { lock.unlock(); } diff --git a/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerTask.java b/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerTask.java index d9de7f2da..032148cea 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerTask.java +++ b/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerTask.java @@ -23,7 +23,7 @@ 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 long MAX_RESPONSE_SIZE = 10L * 1024; // 10kb should be sufficient. protect against flooding private static final Gson GSON = new GsonBuilder().setLenient().create(); private final HttpClient httpClient; diff --git a/src/main/java/org/cryptomator/ui/stats/VaultStatisticsController.java b/src/main/java/org/cryptomator/ui/stats/VaultStatisticsController.java index a3c430946..56729f1fe 100644 --- a/src/main/java/org/cryptomator/ui/stats/VaultStatisticsController.java +++ b/src/main/java/org/cryptomator/ui/stats/VaultStatisticsController.java @@ -127,10 +127,10 @@ public class VaultStatisticsController implements FxController { encryptedBytesWrite.getData().add(new Data<>(currentStep, encBytes)); // adjust ranges: - readChartXAxis.setLowerBound(currentStep - IO_SAMPLING_STEPS); + readChartXAxis.setLowerBound(currentStep - IO_SAMPLING_STEPS * 1.0); readChartXAxis.setUpperBound(currentStep); readChartYAxis.setUpperBound(allTimeMax); - writeChartXAxis.setLowerBound(currentStep - IO_SAMPLING_STEPS); + writeChartXAxis.setLowerBound(currentStep - IO_SAMPLING_STEPS * 1.0); writeChartXAxis.setUpperBound(currentStep); writeChartYAxis.setUpperBound(allTimeMax); } From 46a3a4fc119948337b8a5cd67a7dbe9d7e6e370e Mon Sep 17 00:00:00 2001 From: JaniruTEC Date: Thu, 9 Dec 2021 23:10:45 +0100 Subject: [PATCH 17/31] Added error message if user tries to mount to occupied drive. Fixes #1888 --- .../mountpoint/CustomDriveLetterChooser.java | 12 +++++++++ .../mountpoint/CustomMountPointChooser.java | 2 +- .../TemporaryMountPointChooser.java | 2 +- .../common/vaults/DokanyVolume.java | 2 +- .../cryptomator/common/vaults/FuseVolume.java | 13 ++++++--- .../common/vaults/MountPointRequirement.java | 5 ++++ .../UnlockInvalidMountPointController.java | 27 ++++++++++++++----- .../cryptomator/ui/unlock/UnlockWorkflow.java | 10 +++++-- .../fxml/unlock_invalid_mount_point.fxml | 5 ++-- src/main/resources/i18n/strings.properties | 1 + 10 files changed, 62 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/cryptomator/common/mountpoint/CustomDriveLetterChooser.java b/src/main/java/org/cryptomator/common/mountpoint/CustomDriveLetterChooser.java index 1a42aa5ad..02f75d4a1 100644 --- a/src/main/java/org/cryptomator/common/mountpoint/CustomDriveLetterChooser.java +++ b/src/main/java/org/cryptomator/common/mountpoint/CustomDriveLetterChooser.java @@ -5,6 +5,9 @@ import org.cryptomator.common.settings.VaultSettings; import org.cryptomator.common.vaults.Volume; import javax.inject.Inject; +import java.nio.file.FileAlreadyExistsException; +import java.nio.file.Files; +import java.nio.file.LinkOption; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Optional; @@ -27,4 +30,13 @@ class CustomDriveLetterChooser implements MountPointChooser { public Optional chooseMountPoint(Volume caller) { return this.vaultSettings.getWinDriveLetter().map(letter -> letter.charAt(0) + ":\\").map(Paths::get); } + + @Override + public boolean prepare(Volume caller, Path driveLetter) throws InvalidMountPointException { + if (!Files.notExists(driveLetter, LinkOption.NOFOLLOW_LINKS)) { + //Drive already exists OR can't be determined + throw new InvalidMountPointException(new FileAlreadyExistsException(driveLetter.toString())); + } + return false; + } } diff --git a/src/main/java/org/cryptomator/common/mountpoint/CustomMountPointChooser.java b/src/main/java/org/cryptomator/common/mountpoint/CustomMountPointChooser.java index 5f1a7fedd..a78564db4 100644 --- a/src/main/java/org/cryptomator/common/mountpoint/CustomMountPointChooser.java +++ b/src/main/java/org/cryptomator/common/mountpoint/CustomMountPointChooser.java @@ -56,7 +56,7 @@ class CustomMountPointChooser implements MountPointChooser { throw new InvalidMountPointException(new IllegalStateException("Illegal MountPointRequirement")); } default -> { - //Currently the case for "PARENT_OPT_MOUNT_POINT" + //Currently the case for "NO_PARENT_NO_MOUNT_POINT, PARENT_OPT_MOUNT_POINT" throw new InvalidMountPointException(new IllegalStateException("Not implemented")); } } diff --git a/src/main/java/org/cryptomator/common/mountpoint/TemporaryMountPointChooser.java b/src/main/java/org/cryptomator/common/mountpoint/TemporaryMountPointChooser.java index eb1d8d0b1..b119ff084 100644 --- a/src/main/java/org/cryptomator/common/mountpoint/TemporaryMountPointChooser.java +++ b/src/main/java/org/cryptomator/common/mountpoint/TemporaryMountPointChooser.java @@ -65,7 +65,7 @@ class TemporaryMountPointChooser implements MountPointChooser { throw new InvalidMountPointException(new IllegalStateException("Illegal MountPointRequirement")); } default -> { - //Currently the case for "PARENT_OPT_MOUNT_POINT" + //Currently the case for "NO_PARENT_NO_MOUNT_POINT, PARENT_OPT_MOUNT_POINT" throw new InvalidMountPointException(new IllegalStateException("Not implemented")); } } diff --git a/src/main/java/org/cryptomator/common/vaults/DokanyVolume.java b/src/main/java/org/cryptomator/common/vaults/DokanyVolume.java index c998761d0..64bd41edf 100644 --- a/src/main/java/org/cryptomator/common/vaults/DokanyVolume.java +++ b/src/main/java/org/cryptomator/common/vaults/DokanyVolume.java @@ -86,7 +86,7 @@ public class DokanyVolume extends AbstractVolume { @Override public MountPointRequirement getMountPointRequirement() { - return MountPointRequirement.EMPTY_MOUNT_POINT; + return this.vaultSettings.getWinDriveLetter().isPresent() ? MountPointRequirement.NO_PARENT_NO_MOUNT_POINT : MountPointRequirement.EMPTY_MOUNT_POINT; } public static boolean isSupportedStatic() { diff --git a/src/main/java/org/cryptomator/common/vaults/FuseVolume.java b/src/main/java/org/cryptomator/common/vaults/FuseVolume.java index a1579fdaf..e3b0d2ed5 100644 --- a/src/main/java/org/cryptomator/common/vaults/FuseVolume.java +++ b/src/main/java/org/cryptomator/common/vaults/FuseVolume.java @@ -4,6 +4,7 @@ import com.google.common.collect.Iterators; import org.apache.commons.lang3.SystemUtils; import org.cryptomator.common.mountpoint.InvalidMountPointException; import org.cryptomator.common.mountpoint.MountPointChooser; +import org.cryptomator.common.settings.VaultSettings; import org.cryptomator.common.settings.VolumeImpl; import org.cryptomator.cryptofs.CryptoFileSystem; import org.cryptomator.frontend.fuse.mount.EnvironmentVariables; @@ -28,11 +29,14 @@ public class FuseVolume extends AbstractVolume { private static final Logger LOG = LoggerFactory.getLogger(FuseVolume.class); private static final Pattern NON_WHITESPACE_OR_QUOTED = Pattern.compile("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'"); // Thanks to https://stackoverflow.com/a/366532 + private final VaultSettings vaultSettings; + private Mount mount; @Inject - public FuseVolume(@Named("orderedMountPointChoosers") Iterable choosers) { + public FuseVolume(VaultSettings vaultSettings, @Named("orderedMountPointChoosers") Iterable choosers) { super(choosers); + this.vaultSettings = vaultSettings; } @Override @@ -50,7 +54,7 @@ public class FuseVolume extends AbstractVolume { .withFileNameTranscoder(mounter.defaultFileNameTranscoder()) // .build(); this.mount = mounter.mount(root, envVars, onExitAction); - } catch ( FuseMountException | FuseNotSupportedException e) { + } catch (FuseMountException | FuseNotSupportedException e) { throw new VolumeException("Unable to mount Filesystem", e); } } @@ -119,7 +123,10 @@ public class FuseVolume extends AbstractVolume { @Override public MountPointRequirement getMountPointRequirement() { - return SystemUtils.IS_OS_WINDOWS ? MountPointRequirement.PARENT_NO_MOUNT_POINT : MountPointRequirement.EMPTY_MOUNT_POINT; + if (!SystemUtils.IS_OS_WINDOWS) { + return MountPointRequirement.EMPTY_MOUNT_POINT; + } + return this.vaultSettings.getWinDriveLetter().isPresent() ? MountPointRequirement.NO_PARENT_NO_MOUNT_POINT : MountPointRequirement.PARENT_NO_MOUNT_POINT; } public static boolean isSupportedStatic() { diff --git a/src/main/java/org/cryptomator/common/vaults/MountPointRequirement.java b/src/main/java/org/cryptomator/common/vaults/MountPointRequirement.java index 84a798e59..b7510e811 100644 --- a/src/main/java/org/cryptomator/common/vaults/MountPointRequirement.java +++ b/src/main/java/org/cryptomator/common/vaults/MountPointRequirement.java @@ -6,6 +6,11 @@ package org.cryptomator.common.vaults; */ public enum MountPointRequirement { + /** + * There must not be a parent folder and the actual Mountpoint must not exist. + */ + NO_PARENT_NO_MOUNT_POINT, + /** * No Mountpoint on the local filesystem required. (e.g. WebDAV) */ diff --git a/src/main/java/org/cryptomator/ui/unlock/UnlockInvalidMountPointController.java b/src/main/java/org/cryptomator/ui/unlock/UnlockInvalidMountPointController.java index fd85db988..f84842807 100644 --- a/src/main/java/org/cryptomator/ui/unlock/UnlockInvalidMountPointController.java +++ b/src/main/java/org/cryptomator/ui/unlock/UnlockInvalidMountPointController.java @@ -1,5 +1,6 @@ package org.cryptomator.ui.unlock; +import org.apache.commons.lang3.SystemUtils; import org.cryptomator.common.vaults.MountPointRequirement; import org.cryptomator.common.vaults.Vault; import org.cryptomator.ui.common.FxController; @@ -32,12 +33,24 @@ public class UnlockInvalidMountPointController implements FxController { return vault.getVaultSettings().getCustomMountPath().orElse("AUTO"); } - public boolean getMustExist() { - MountPointRequirement requirement = vault.getVolume().orElseThrow(() -> new IllegalStateException("Invalid Mountpoint without a Volume?!")).getMountPointRequirement(); - assert requirement != MountPointRequirement.NONE; //An invalid MountPoint with no required MountPoint doesn't seem sensible - assert requirement != MountPointRequirement.PARENT_OPT_MOUNT_POINT; //Not implemented anywhere (yet) - - return requirement == MountPointRequirement.EMPTY_MOUNT_POINT; + public boolean getNotExisting() { + return getMountPointRequirement() == MountPointRequirement.EMPTY_MOUNT_POINT; } -} + public boolean getExisting() { + return getMountPointRequirement() == MountPointRequirement.PARENT_NO_MOUNT_POINT; + } + + public boolean getDriveLetterOccupied() { + return getMountPointRequirement() == MountPointRequirement.NO_PARENT_NO_MOUNT_POINT; + } + + private MountPointRequirement getMountPointRequirement() { + var requirement = vault.getVolume().orElseThrow(() -> new IllegalStateException("Invalid Mountpoint without a Volume?!")).getMountPointRequirement(); + assert requirement != MountPointRequirement.NONE; //An invalid MountPoint with no required MountPoint doesn't seem sensible + assert requirement != MountPointRequirement.PARENT_OPT_MOUNT_POINT; //Not implemented anywhere (yet) + assert requirement != MountPointRequirement.NO_PARENT_NO_MOUNT_POINT || SystemUtils.IS_OS_WINDOWS; //Not implemented anywhere, but on Windows + + return requirement; + } +} \ No newline at end of file diff --git a/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java b/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java index 073258d80..db7b6f7d9 100644 --- a/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java +++ b/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java @@ -2,6 +2,7 @@ package org.cryptomator.ui.unlock; import com.google.common.base.Throwables; import dagger.Lazy; +import org.apache.commons.lang3.SystemUtils; import org.cryptomator.common.mountpoint.InvalidMountPointException; import org.cryptomator.common.vaults.MountPointRequirement; import org.cryptomator.common.vaults.Vault; @@ -79,9 +80,10 @@ public class UnlockWorkflow extends Task { } private void handleInvalidMountPoint(InvalidMountPointException impExc) { - MountPointRequirement requirement = vault.getVolume().orElseThrow(() -> new IllegalStateException("Invalid Mountpoint without a Volume?!", impExc)).getMountPointRequirement(); + var requirement = vault.getVolume().orElseThrow(() -> new IllegalStateException("Invalid Mountpoint without a Volume?!", impExc)).getMountPointRequirement(); assert requirement != MountPointRequirement.NONE; //An invalid MountPoint with no required MountPoint doesn't seem sensible assert requirement != MountPointRequirement.PARENT_OPT_MOUNT_POINT; //Not implemented anywhere (yet) + assert requirement != MountPointRequirement.NO_PARENT_NO_MOUNT_POINT || SystemUtils.IS_OS_WINDOWS; //Not implemented anywhere, but on Windows Throwable cause = impExc.getCause(); // TODO: apply https://openjdk.java.net/jeps/8213076 in future JDK versions @@ -93,7 +95,11 @@ public class UnlockWorkflow extends Task { } showInvalidMountPointScene(); } else if (cause instanceof FileAlreadyExistsException) { - LOG.error("Unlock failed. Mountpoint already exists: {}", cause.getMessage()); + if (requirement == MountPointRequirement.NO_PARENT_NO_MOUNT_POINT) { + LOG.error("Unlock failed. Drive Letter already occupied: {}", cause.getMessage()); + } else { + LOG.error("Unlock failed. Mountpoint already exists: {}", cause.getMessage()); + } showInvalidMountPointScene(); } else if (cause instanceof DirectoryNotEmptyException) { LOG.error("Unlock failed. Mountpoint not an empty directory: {}", cause.getMessage()); diff --git a/src/main/resources/fxml/unlock_invalid_mount_point.fxml b/src/main/resources/fxml/unlock_invalid_mount_point.fxml index 253ff5704..062981304 100644 --- a/src/main/resources/fxml/unlock_invalid_mount_point.fxml +++ b/src/main/resources/fxml/unlock_invalid_mount_point.fxml @@ -29,8 +29,9 @@ - - + + + diff --git a/src/main/resources/i18n/strings.properties b/src/main/resources/i18n/strings.properties index 7b17fa791..38b8128a2 100644 --- a/src/main/resources/i18n/strings.properties +++ b/src/main/resources/i18n/strings.properties @@ -115,6 +115,7 @@ unlock.error.heading=Unable to unlock vault ### Invalid Mount Point unlock.error.invalidMountPoint.notExisting=Mount point "%s" is not a directory, not empty or does not exist. unlock.error.invalidMountPoint.existing=Mount point "%s" already exists or parent folder is missing. +unlock.error.invalidMountPoint.driveLetterOccupied=Drive Letter "%s" is already occupied. # Lock ## Force From 8ac7ba8f56c16fa206269ab2a2f2ebf50de17af8 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Wed, 15 Dec 2021 12:45:52 +0100 Subject: [PATCH 18/31] preparing hotfix 1.6.5 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0ad640f72..4121bd008 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.cryptomator cryptomator - 1.6.4 + 1.6.5 Cryptomator Desktop App From 36f87b36431e11322be1869b6599f635681150d6 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Wed, 15 Dec 2021 12:46:23 +0100 Subject: [PATCH 19/31] closes #1961 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4121bd008..ae22639ed 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.3.0 + 2.3.1 1.1.0-beta1 1.0.0 1.0.0 From 9775eaa2a8309798299e3d396a26190edb42a90b Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Wed, 15 Dec 2021 12:48:46 +0100 Subject: [PATCH 20/31] bump logback to close possible vulnerability --- pom.xml | 2 +- src/main/resources/license/THIRD-PARTY.txt | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index ae22639ed..39008b723 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ 2.8.9 1.5.2 1.7.32 - 1.2.7 + 1.2.8 5.8.1 diff --git a/src/main/resources/license/THIRD-PARTY.txt b/src/main/resources/license/THIRD-PARTY.txt index dac878ab9..32680971b 100644 --- a/src/main/resources/license/THIRD-PARTY.txt +++ b/src/main/resources/license/THIRD-PARTY.txt @@ -52,13 +52,13 @@ Cryptomator uses 40 third-party dependencies under the following licenses: - Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:10.0.6 - https://eclipse.org/jetty/jetty-servlet) - Jetty :: Utilities (org.eclipse.jetty:jetty-util:10.0.6 - https://eclipse.org/jetty/jetty-util) Eclipse Public License - v 1.0: - - Logback Classic Module (ch.qos.logback:logback-classic:1.2.7 - http://logback.qos.ch/logback-classic) - - Logback Core Module (ch.qos.logback:logback-core:1.2.7 - http://logback.qos.ch/logback-core) + - Logback Classic Module (ch.qos.logback:logback-classic:1.2.8 - http://logback.qos.ch/logback-classic) + - Logback Core Module (ch.qos.logback:logback-core:1.2.8 - http://logback.qos.ch/logback-core) Eclipse Public License - v 2.0: - jnr-posix (com.github.jnr:jnr-posix:3.1.10 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix) GNU Lesser General Public License: - - Logback Classic Module (ch.qos.logback:logback-classic:1.2.7 - http://logback.qos.ch/logback-classic) - - Logback Core Module (ch.qos.logback:logback-core:1.2.7 - http://logback.qos.ch/logback-core) + - Logback Classic Module (ch.qos.logback:logback-classic:1.2.8 - http://logback.qos.ch/logback-classic) + - Logback Core Module (ch.qos.logback:logback-core:1.2.8 - http://logback.qos.ch/logback-core) GPLv2: - jnr-posix (com.github.jnr:jnr-posix:3.1.10 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix) GPLv2+CE: From 6403991bad831fd51aeecbe50d22f31b88cbca19 Mon Sep 17 00:00:00 2001 From: Tobias Hagemann Date: Thu, 16 Dec 2021 14:03:15 +0100 Subject: [PATCH 21/31] Update release.yml [ci skip] --- .github/workflows/release.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 39b6ce77d..92c2ba49f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -612,14 +612,18 @@ jobs: *.asc *.dmg *.msi - body: | + body: |- :construction: Work in Progress - ## What's new + ## What's New ## Bugfixes ## Misc + --- - :scroll: A complete list of closed issues is available [here](LINK) + + :scroll: A complete list of closed issues is available [here](LINK). + --- + :floppy_disk: SHA-256 checksums of release artifacts: ``` ${{ env.SHA256_SUMS }} From 2afd9f1c1d399b7c434819e7a4a3d2bd92cf167b Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Fri, 17 Dec 2021 14:52:18 +0100 Subject: [PATCH 22/31] Bump logback hotfix 1.2.8 is superseded by 1.2.9 as stated in https://jira.qos.ch/browse/LOGBACK-1591?focusedCommentId=20920&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-20920 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9fb10faef..6f0243597 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ 2.8.9 1.5.2 1.7.32 - 1.2.8 + 1.2.9 5.8.1 From 550903325d253ba470ece774e8f7d649c9d3366b Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Tue, 4 Jan 2022 16:35:09 +0100 Subject: [PATCH 23/31] Add vault name in unlock window titles --- .../MasterkeyFileLoadingModule.java | 22 +++++++++++++++---- src/main/resources/i18n/strings.properties | 3 ++- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingModule.java b/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingModule.java index 901eacfb9..72e902ded 100644 --- a/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingModule.java +++ b/src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/MasterkeyFileLoadingModule.java @@ -23,8 +23,10 @@ import org.slf4j.LoggerFactory; import javax.inject.Named; import javafx.scene.Scene; +import javafx.stage.Stage; import java.nio.file.Path; import java.util.Optional; +import java.util.ResourceBundle; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; @@ -93,15 +95,27 @@ public abstract class MasterkeyFileLoadingModule { @Provides @FxmlScene(FxmlFile.UNLOCK_ENTER_PASSWORD) @KeyLoadingScoped - static Scene provideUnlockScene(@KeyLoading FxmlLoaderFactory fxmlLoaders) { - return fxmlLoaders.createScene(FxmlFile.UNLOCK_ENTER_PASSWORD); + static Scene provideUnlockScene(@KeyLoading FxmlLoaderFactory fxmlLoaders, @KeyLoading Stage window, @KeyLoading Vault v, ResourceBundle resourceBundle) { + var scene = fxmlLoaders.createScene(FxmlFile.UNLOCK_ENTER_PASSWORD); + scene.windowProperty().addListener((prop, oldVal, newVal) -> { + if (window.equals(newVal)) { + window.setTitle(String.format(resourceBundle.getString("unlock.title"), v.getDisplayName())); + } + }); + return scene; } @Provides @FxmlScene(FxmlFile.UNLOCK_SELECT_MASTERKEYFILE) @KeyLoadingScoped - static Scene provideUnlockSelectMasterkeyFileScene(@KeyLoading FxmlLoaderFactory fxmlLoaders) { - return fxmlLoaders.createScene(FxmlFile.UNLOCK_SELECT_MASTERKEYFILE); + static Scene provideUnlockSelectMasterkeyFileScene(@KeyLoading FxmlLoaderFactory fxmlLoaders, @KeyLoading Stage window, @KeyLoading Vault v, ResourceBundle resourceBundle) { + var scene = fxmlLoaders.createScene(FxmlFile.UNLOCK_SELECT_MASTERKEYFILE); + scene.windowProperty().addListener((prop, oldVal, newVal) -> { + if (window.equals(newVal)) { + window.setTitle(String.format(resourceBundle.getString("unlock.chooseMasterkey.title"), v.getDisplayName())); + } + }); + return scene; } @Binds diff --git a/src/main/resources/i18n/strings.properties b/src/main/resources/i18n/strings.properties index 7b17fa791..63e2bbecf 100644 --- a/src/main/resources/i18n/strings.properties +++ b/src/main/resources/i18n/strings.properties @@ -103,7 +103,8 @@ unlock.title=Unlock "%s" unlock.passwordPrompt=Enter password for "%s": unlock.savePassword=Remember Password unlock.unlockBtn=Unlock -## +## Select +unlock.chooseMasterkey.title=Select Masterkey of "%s" unlock.chooseMasterkey.prompt=Could not find the masterkey file for this vault at its expected location. Please choose the key file manually. unlock.chooseMasterkey.filePickerTitle=Select Masterkey File ## Success From 7486fa2167418734a28647c1044a906ba2c1bb81 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Tue, 4 Jan 2022 16:35:42 +0100 Subject: [PATCH 24/31] update Third parties license file --- src/main/resources/license/THIRD-PARTY.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/license/THIRD-PARTY.txt b/src/main/resources/license/THIRD-PARTY.txt index 32680971b..ba4310dd5 100644 --- a/src/main/resources/license/THIRD-PARTY.txt +++ b/src/main/resources/license/THIRD-PARTY.txt @@ -52,13 +52,13 @@ Cryptomator uses 40 third-party dependencies under the following licenses: - Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:10.0.6 - https://eclipse.org/jetty/jetty-servlet) - Jetty :: Utilities (org.eclipse.jetty:jetty-util:10.0.6 - https://eclipse.org/jetty/jetty-util) Eclipse Public License - v 1.0: - - Logback Classic Module (ch.qos.logback:logback-classic:1.2.8 - http://logback.qos.ch/logback-classic) - - Logback Core Module (ch.qos.logback:logback-core:1.2.8 - http://logback.qos.ch/logback-core) + - Logback Classic Module (ch.qos.logback:logback-classic:1.2.9 - http://logback.qos.ch/logback-classic) + - Logback Core Module (ch.qos.logback:logback-core:1.2.9 - http://logback.qos.ch/logback-core) Eclipse Public License - v 2.0: - jnr-posix (com.github.jnr:jnr-posix:3.1.10 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix) GNU Lesser General Public License: - - Logback Classic Module (ch.qos.logback:logback-classic:1.2.8 - http://logback.qos.ch/logback-classic) - - Logback Core Module (ch.qos.logback:logback-core:1.2.8 - http://logback.qos.ch/logback-core) + - Logback Classic Module (ch.qos.logback:logback-classic:1.2.9 - http://logback.qos.ch/logback-classic) + - Logback Core Module (ch.qos.logback:logback-core:1.2.9 - http://logback.qos.ch/logback-core) GPLv2: - jnr-posix (com.github.jnr:jnr-posix:3.1.10 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix) GPLv2+CE: From bf382d928f3c18c9e967163ce41fed5f12d05e8e Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Wed, 5 Jan 2022 10:51:15 +0100 Subject: [PATCH 25/31] Update dokan.dll [ci skip] --- dist/win/contrib/dokan1.dll | Bin 524800 -> 520088 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dist/win/contrib/dokan1.dll b/dist/win/contrib/dokan1.dll index badc12b2ad424a7045097df3a5ed25df72b1f135..194945aed8d0aadb36aa6fc8999e71a8080eded4 100755 GIT binary patch delta 127028 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 N#`~%)J$Xin{{`5*n(_bu delta 127547 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

b^+DxeKuF2Vw!10W7G9|3n7{wsi; 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%0D5u-3P)vl$)M2TNXQ)?=hqr~af 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 Date: Mon, 10 Jan 2022 04:01:07 -0500 Subject: [PATCH 26/31] Update copyright years from 2021 to 2022 to reflect the new year (#2015) --- .github/workflows/release.yml | 4 ++-- dist/linux/appimage/build.sh | 2 +- dist/linux/debian/copyright | 6 +++--- dist/linux/debian/rules | 2 +- dist/mac/dmg/build.sh | 2 +- dist/mac/dmg/resources/license.rtf | 4 ++-- dist/win/build.ps1 | 6 +++--- dist/win/resources/license.rtf | 3 +-- src/main/resources/fxml/preferences_about.fxml | 2 +- 9 files changed, 15 insertions(+), 16 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 92c2ba49f..630d5bbf2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -184,7 +184,7 @@ jobs: --dest appdir --name Cryptomator --vendor "Skymatic GmbH" - --copyright "(C) 2016 - 2021 Skymatic GmbH" + --copyright "(C) 2016 - 2022 Skymatic GmbH" --java-options "-Xss5m" --java-options "-Xmx256m" --java-options "-Dcryptomator.appVersion=\"${{ needs.metadata.outputs.semVerStr }}\"" @@ -529,7 +529,7 @@ jobs: --dest installer --name Cryptomator --vendor "Skymatic GmbH" - --copyright "(C) 2016 - 2021 Skymatic GmbH" + --copyright "(C) 2016 - 2022 Skymatic GmbH" --app-version "${{ needs.metadata.outputs.semVerNum }}" --win-menu --win-dir-chooser diff --git a/dist/linux/appimage/build.sh b/dist/linux/appimage/build.sh index 24d636bb4..335532cba 100755 --- a/dist/linux/appimage/build.sh +++ b/dist/linux/appimage/build.sh @@ -35,7 +35,7 @@ ${JAVA_HOME}/bin/jpackage \ --dest . \ --name Cryptomator \ --vendor "Skymatic GmbH" \ - --copyright "(C) 2016 - 2021 Skymatic GmbH" \ + --copyright "(C) 2016 - 2022 Skymatic GmbH" \ --java-options "-Xss5m" \ --java-options "-Xmx256m" \ --app-version "${VERSION}.${REVISION_NO}" \ diff --git a/dist/linux/debian/copyright b/dist/linux/debian/copyright index ba6980bb8..34be0a4c9 100644 --- a/dist/linux/debian/copyright +++ b/dist/linux/debian/copyright @@ -4,11 +4,11 @@ Upstream-Contact: Cryptomator Source: https://cryptomator.org Files: * -Copyright: 2016-2021 Skymatic GmbH +Copyright: 2016-2022 Skymatic GmbH License: GPL-3+ Files: debian/org.cryptomator.Cryptomator.appdata.xml -Copyright: 2016-2021 Skymatic GmbH +Copyright: 2016-2022 Skymatic GmbH License: FSFAP License: GPL-3+ @@ -36,4 +36,4 @@ License: FSFAP Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without any - warranty. \ No newline at end of file + warranty. diff --git a/dist/linux/debian/rules b/dist/linux/debian/rules index b36819f8b..fc237107e 100755 --- a/dist/linux/debian/rules +++ b/dist/linux/debian/rules @@ -29,7 +29,7 @@ override_dh_auto_build: --dest . \ --name cryptomator \ --vendor "Skymatic GmbH" \ - --copyright "(C) 2016 - 2021 Skymatic GmbH" \ + --copyright "(C) 2016 - 2022 Skymatic GmbH" \ --java-options "-Xss5m" \ --java-options "-Xmx256m" \ --java-options "-Dfile.encoding=\"utf-8\"" \ diff --git a/dist/mac/dmg/build.sh b/dist/mac/dmg/build.sh index b8d17cbe0..ebec045bc 100755 --- a/dist/mac/dmg/build.sh +++ b/dist/mac/dmg/build.sh @@ -54,7 +54,7 @@ ${JAVA_HOME}/bin/jpackage \ --dest . \ --name Cryptomator \ --vendor "Skymatic GmbH" \ - --copyright "(C) 2016 - 2021 Skymatic GmbH" \ + --copyright "(C) 2016 - 2022 Skymatic GmbH" \ --java-options "-Xss5m" \ --java-options "-Xmx256m" \ --java-options "-Dcryptomator.appVersion=\"${VERSION_NO}\"" \ diff --git a/dist/mac/dmg/resources/license.rtf b/dist/mac/dmg/resources/license.rtf index ae2b7ece4..72730adb8 100644 --- a/dist/mac/dmg/resources/license.rtf +++ b/dist/mac/dmg/resources/license.rtf @@ -10,7 +10,7 @@ \f1\b0 \ \ -\f0\b \'a9 2016 \'96 2021 Skymatic GmbH +\f0\b \'a9 2016 \'96 2022 Skymatic GmbH \f1\b0 \ \ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\ @@ -97,4 +97,4 @@ You should have received a copy of the GNU General Public License along with thi SIL OFL 1.1 License:\ - Font Awesome 5.12.0 ({\field{\*\fldinst{HYPERLINK "https://fontawesome.com/"}}{\fldrslt https://fontawesome.com/}})\ \ -} \ No newline at end of file +} diff --git a/dist/win/build.ps1 b/dist/win/build.ps1 index 8ed5d9193..eb33c2462 100644 --- a/dist/win/build.ps1 +++ b/dist/win/build.ps1 @@ -47,7 +47,7 @@ Copy-Item "$buildDir\..\..\target\cryptomator-*.jar" -Destination "$buildDir\..\ --dest . ` --name Cryptomator ` --vendor "Skymatic GmbH" ` - --copyright "(C) 2016 - 2021 Skymatic GmbH" ` + --copyright "(C) 2016 - 2022 Skymatic GmbH" ` --java-options "-Xss5m" ` --java-options "-Xmx256m" ` --java-options "-Dcryptomator.appVersion=`"$semVerNo`"" ` @@ -78,7 +78,7 @@ $Env:JP_WIXWIZARD_RESOURCES = "$buildDir\resources" --dest installer ` --name Cryptomator ` --vendor "Skymatic GmbH" ` - --copyright "(C) 2016 - 2021 Skymatic GmbH" ` + --copyright "(C) 2016 - 2022 Skymatic GmbH" ` --app-version "$semVerNo" ` --win-menu ` --win-dir-chooser ` @@ -87,4 +87,4 @@ $Env:JP_WIXWIZARD_RESOURCES = "$buildDir\resources" --win-menu-group Cryptomator ` --resource-dir resources ` --license-file resources/license.rtf ` - --file-associations resources/FAvaultFile.properties \ No newline at end of file + --file-associations resources/FAvaultFile.properties diff --git a/dist/win/resources/license.rtf b/dist/win/resources/license.rtf index 6782bebab..28956ed42 100644 --- a/dist/win/resources/license.rtf +++ b/dist/win/resources/license.rtf @@ -3,7 +3,7 @@ {\*\generator Riched20 10.0.17134}\viewkind4\uc1 \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\b\fs16\lang7 Cryptomator is distributed under the GPLv3 License, found below. Please see the bottom of this document for any other license applicable to code used within Cryptomator.\b0\par \par -\b\'a9 2016 \endash 2021 Skymatic GmbH\b0\par +\b\'a9 2016 \endash 2022 Skymatic GmbH\b0\par \par This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\par \par @@ -82,4 +82,3 @@ You should have received a copy of the GNU General Public License along with thi \tab SIL OFL 1.1 License:\par \tab\tab - Font Awesome 5.12.0 ({{\field{\*\fldinst{HYPERLINK https://fontawesome.com/ }}{\fldrslt{https://fontawesome.com/\ul0\cf0}}}}\f0\fs16 )\b\par } - \ No newline at end of file diff --git a/src/main/resources/fxml/preferences_about.fxml b/src/main/resources/fxml/preferences_about.fxml index 287e91da3..cfa8ec010 100644 --- a/src/main/resources/fxml/preferences_about.fxml +++ b/src/main/resources/fxml/preferences_about.fxml @@ -22,7 +22,7 @@ - From 3e8690ca119104487b072835218d0a03645b456a Mon Sep 17 00:00:00 2001 From: Tobias Hagemann Date: Wed, 12 Jan 2022 11:01:59 +0100 Subject: [PATCH 27/31] removed unnecessary entitlement in mac build [ci skip] --- dist/mac/Cryptomator.entitlements | 2 -- 1 file changed, 2 deletions(-) diff --git a/dist/mac/Cryptomator.entitlements b/dist/mac/Cryptomator.entitlements index 00f46d649..16890d644 100644 --- a/dist/mac/Cryptomator.entitlements +++ b/dist/mac/Cryptomator.entitlements @@ -2,8 +2,6 @@ - com.apple.security.cs.allow-dyld-environment-variables - com.apple.security.cs.allow-jit com.apple.security.cs.allow-unsigned-executable-memory From 080ddbbb0196554b96a8829e367d62225447fce7 Mon Sep 17 00:00:00 2001 From: JaniruTEC Date: Tue, 18 Jan 2022 02:25:04 +0100 Subject: [PATCH 28/31] Applied changes from code review. --- .../org/cryptomator/common/vaults/MountPointRequirement.java | 2 +- src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java | 2 +- src/main/resources/i18n/strings.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/cryptomator/common/vaults/MountPointRequirement.java b/src/main/java/org/cryptomator/common/vaults/MountPointRequirement.java index b7510e811..cc21df03d 100644 --- a/src/main/java/org/cryptomator/common/vaults/MountPointRequirement.java +++ b/src/main/java/org/cryptomator/common/vaults/MountPointRequirement.java @@ -7,7 +7,7 @@ package org.cryptomator.common.vaults; public enum MountPointRequirement { /** - * There must not be a parent folder and the actual Mountpoint must not exist. + * The Mountpoint needs to be a filesystem root and must not exist. */ NO_PARENT_NO_MOUNT_POINT, diff --git a/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java b/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java index db7b6f7d9..1227fc9de 100644 --- a/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java +++ b/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java @@ -96,7 +96,7 @@ public class UnlockWorkflow extends Task { showInvalidMountPointScene(); } else if (cause instanceof FileAlreadyExistsException) { if (requirement == MountPointRequirement.NO_PARENT_NO_MOUNT_POINT) { - LOG.error("Unlock failed. Drive Letter already occupied: {}", cause.getMessage()); + LOG.error("Unlock failed. Drive Letter already in use: {}", cause.getMessage()); } else { LOG.error("Unlock failed. Mountpoint already exists: {}", cause.getMessage()); } diff --git a/src/main/resources/i18n/strings.properties b/src/main/resources/i18n/strings.properties index 241c8e538..36932b877 100644 --- a/src/main/resources/i18n/strings.properties +++ b/src/main/resources/i18n/strings.properties @@ -116,7 +116,7 @@ unlock.error.heading=Unable to unlock vault ### Invalid Mount Point unlock.error.invalidMountPoint.notExisting=Mount point "%s" is not a directory, not empty or does not exist. unlock.error.invalidMountPoint.existing=Mount point "%s" already exists or parent folder is missing. -unlock.error.invalidMountPoint.driveLetterOccupied=Drive Letter "%s" is already occupied. +unlock.error.invalidMountPoint.driveLetterOccupied=Drive Letter "%s" is already in use. # Lock ## Force From a9846744fe875dd040192ffa2bacf66f817f4ea7 Mon Sep 17 00:00:00 2001 From: KarlKeu00 <47644344+KarlKeu00@users.noreply.github.com> Date: Fri, 21 Jan 2022 13:16:06 +0100 Subject: [PATCH 29/31] Update JavaFX to 17.0.2 (#2031) Updating JavaFX inside Maven to 17.0.2 to fix JDK-8275723. This is only relevant for development on a Mac with an M1 processor. --- .gitignore | 4 +++- pom.xml | 2 +- src/main/resources/license/THIRD-PARTY.txt | 8 ++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index be67207df..8e239b35e 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,6 @@ pom.xml.versionsBackup .idea/jarRepositories.xml .idea/uiDesigner.xml .idea/**/libraries/ -*.iml \ No newline at end of file +*.iml + +hs_err_pid*.log \ No newline at end of file diff --git a/pom.xml b/pom.xml index 6f0243597..3caa9b899 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ 1.2.6 - 17.0.1 + 17.0.2 3.12.0 3.18.2 2.2 diff --git a/src/main/resources/license/THIRD-PARTY.txt b/src/main/resources/license/THIRD-PARTY.txt index ba4310dd5..9c9d92c7d 100644 --- a/src/main/resources/license/THIRD-PARTY.txt +++ b/src/main/resources/license/THIRD-PARTY.txt @@ -62,10 +62,10 @@ Cryptomator uses 40 third-party dependencies under the following licenses: GPLv2: - jnr-posix (com.github.jnr:jnr-posix:3.1.10 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix) GPLv2+CE: - - javafx-base (org.openjfx:javafx-base:17.0.1 - https://openjdk.java.net/projects/openjfx/javafx-base/) - - javafx-controls (org.openjfx:javafx-controls:17.0.1 - https://openjdk.java.net/projects/openjfx/javafx-controls/) - - javafx-fxml (org.openjfx:javafx-fxml:17.0.1 - https://openjdk.java.net/projects/openjfx/javafx-fxml/) - - javafx-graphics (org.openjfx:javafx-graphics:17.0.1 - https://openjdk.java.net/projects/openjfx/javafx-graphics/) + - javafx-base (org.openjfx:javafx-base:17.0.2 - https://openjdk.java.net/projects/openjfx/javafx-base/) + - javafx-controls (org.openjfx:javafx-controls:17.0.2 - https://openjdk.java.net/projects/openjfx/javafx-controls/) + - javafx-fxml (org.openjfx:javafx-fxml:17.0.2 - https://openjdk.java.net/projects/openjfx/javafx-fxml/) + - javafx-graphics (org.openjfx:javafx-graphics:17.0.2 - https://openjdk.java.net/projects/openjfx/javafx-graphics/) LGPL 2.1: - jnr-posix (com.github.jnr:jnr-posix:3.1.10 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix) LGPL-2.1-or-later: From d6ccb410274d925bf764da04d6103921a8817268 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Wed, 26 Jan 2022 12:58:58 +0100 Subject: [PATCH 30/31] add modules required for JFR --- .github/workflows/release.yml | 2 +- dist/linux/appimage/build.sh | 2 +- dist/linux/debian/rules | 2 +- dist/mac/dmg/build.sh | 6 +++--- dist/win/build.ps1 | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 630d5bbf2..6fe6283ba 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -167,7 +167,7 @@ jobs: --verbose --output runtime --module-path "${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 + --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,jdk.management.jfr --no-header-files --no-man-pages --strip-debug diff --git a/dist/linux/appimage/build.sh b/dist/linux/appimage/build.sh index 335532cba..af1f2291f 100755 --- a/dist/linux/appimage/build.sh +++ b/dist/linux/appimage/build.sh @@ -18,7 +18,7 @@ cp ../../../target/cryptomator-*.jar ../../../target/mods ${JAVA_HOME}/bin/jlink \ --output runtime \ --module-path "${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 \ + --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,jdk.management.jfr \ --no-header-files \ --no-man-pages \ --strip-debug \ diff --git a/dist/linux/debian/rules b/dist/linux/debian/rules index fc237107e..b381a2331 100755 --- a/dist/linux/debian/rules +++ b/dist/linux/debian/rules @@ -15,7 +15,7 @@ override_dh_auto_clean: override_dh_auto_build: jlink \ --output runtime \ - --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 \ + --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,jdk.management.jfr \ --no-header-files \ --no-man-pages \ --strip-debug \ diff --git a/dist/mac/dmg/build.sh b/dist/mac/dmg/build.sh index ebec045bc..c90411acb 100755 --- a/dist/mac/dmg/build.sh +++ b/dist/mac/dmg/build.sh @@ -22,8 +22,8 @@ VERSION_NO=`mvn -f../../../pom.xml help:evaluate -Dexpression=project.version -q # 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; } +command -v mvn >/dev/null 2>&1 || { echo >&2 "mvn not found. Fix by 'brew install maven'."; exit 1; } +command -v create-dmg >/dev/null 2>&1 || { echo >&2 "create-dmg not found. Fix by 'brew install create-dmg'."; 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 @@ -37,7 +37,7 @@ cp ../../../target/cryptomator-*.jar ../../../target/mods ${JAVA_HOME}/bin/jlink \ --output runtime \ --module-path "${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 \ + --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,jdk.management.jfr \ --no-header-files \ --no-man-pages \ --strip-debug \ diff --git a/dist/win/build.ps1 b/dist/win/build.ps1 index eb33c2462..2919e493a 100644 --- a/dist/win/build.ps1 +++ b/dist/win/build.ps1 @@ -30,7 +30,7 @@ Copy-Item "$buildDir\..\..\target\cryptomator-*.jar" -Destination "$buildDir\..\ --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 ` + --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,jdk.management.jfr ` --no-header-files ` --no-man-pages ` --strip-debug ` From 1641a06d650ace9fa6a1c6aa7da11804d09b9aec Mon Sep 17 00:00:00 2001 From: JaniruTEC Date: Sun, 30 Jan 2022 01:33:44 +0100 Subject: [PATCH 31/31] Renamed NO_PARENT_NO_MOUNT_POINT to UNUSED_ROOT_DIR in MountPointRequirement --- .../common/mountpoint/CustomMountPointChooser.java | 2 +- .../common/mountpoint/TemporaryMountPointChooser.java | 2 +- src/main/java/org/cryptomator/common/vaults/DokanyVolume.java | 2 +- src/main/java/org/cryptomator/common/vaults/FuseVolume.java | 2 +- .../org/cryptomator/common/vaults/MountPointRequirement.java | 2 +- .../ui/unlock/UnlockInvalidMountPointController.java | 4 ++-- src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java | 4 ++-- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/cryptomator/common/mountpoint/CustomMountPointChooser.java b/src/main/java/org/cryptomator/common/mountpoint/CustomMountPointChooser.java index a78564db4..c55ede640 100644 --- a/src/main/java/org/cryptomator/common/mountpoint/CustomMountPointChooser.java +++ b/src/main/java/org/cryptomator/common/mountpoint/CustomMountPointChooser.java @@ -56,7 +56,7 @@ class CustomMountPointChooser implements MountPointChooser { throw new InvalidMountPointException(new IllegalStateException("Illegal MountPointRequirement")); } default -> { - //Currently the case for "NO_PARENT_NO_MOUNT_POINT, PARENT_OPT_MOUNT_POINT" + //Currently the case for "UNUSED_ROOT_DIR, PARENT_OPT_MOUNT_POINT" throw new InvalidMountPointException(new IllegalStateException("Not implemented")); } } diff --git a/src/main/java/org/cryptomator/common/mountpoint/TemporaryMountPointChooser.java b/src/main/java/org/cryptomator/common/mountpoint/TemporaryMountPointChooser.java index b119ff084..bcda3d8f2 100644 --- a/src/main/java/org/cryptomator/common/mountpoint/TemporaryMountPointChooser.java +++ b/src/main/java/org/cryptomator/common/mountpoint/TemporaryMountPointChooser.java @@ -65,7 +65,7 @@ class TemporaryMountPointChooser implements MountPointChooser { throw new InvalidMountPointException(new IllegalStateException("Illegal MountPointRequirement")); } default -> { - //Currently the case for "NO_PARENT_NO_MOUNT_POINT, PARENT_OPT_MOUNT_POINT" + //Currently the case for "UNUSED_ROOT_DIR, PARENT_OPT_MOUNT_POINT" throw new InvalidMountPointException(new IllegalStateException("Not implemented")); } } diff --git a/src/main/java/org/cryptomator/common/vaults/DokanyVolume.java b/src/main/java/org/cryptomator/common/vaults/DokanyVolume.java index 64bd41edf..c08642073 100644 --- a/src/main/java/org/cryptomator/common/vaults/DokanyVolume.java +++ b/src/main/java/org/cryptomator/common/vaults/DokanyVolume.java @@ -86,7 +86,7 @@ public class DokanyVolume extends AbstractVolume { @Override public MountPointRequirement getMountPointRequirement() { - return this.vaultSettings.getWinDriveLetter().isPresent() ? MountPointRequirement.NO_PARENT_NO_MOUNT_POINT : MountPointRequirement.EMPTY_MOUNT_POINT; + return this.vaultSettings.getWinDriveLetter().isPresent() ? MountPointRequirement.UNUSED_ROOT_DIR : MountPointRequirement.EMPTY_MOUNT_POINT; } public static boolean isSupportedStatic() { diff --git a/src/main/java/org/cryptomator/common/vaults/FuseVolume.java b/src/main/java/org/cryptomator/common/vaults/FuseVolume.java index e3b0d2ed5..0321cfa0f 100644 --- a/src/main/java/org/cryptomator/common/vaults/FuseVolume.java +++ b/src/main/java/org/cryptomator/common/vaults/FuseVolume.java @@ -126,7 +126,7 @@ public class FuseVolume extends AbstractVolume { if (!SystemUtils.IS_OS_WINDOWS) { return MountPointRequirement.EMPTY_MOUNT_POINT; } - return this.vaultSettings.getWinDriveLetter().isPresent() ? MountPointRequirement.NO_PARENT_NO_MOUNT_POINT : MountPointRequirement.PARENT_NO_MOUNT_POINT; + return this.vaultSettings.getWinDriveLetter().isPresent() ? MountPointRequirement.UNUSED_ROOT_DIR : MountPointRequirement.PARENT_NO_MOUNT_POINT; } public static boolean isSupportedStatic() { diff --git a/src/main/java/org/cryptomator/common/vaults/MountPointRequirement.java b/src/main/java/org/cryptomator/common/vaults/MountPointRequirement.java index cc21df03d..deec61e1a 100644 --- a/src/main/java/org/cryptomator/common/vaults/MountPointRequirement.java +++ b/src/main/java/org/cryptomator/common/vaults/MountPointRequirement.java @@ -9,7 +9,7 @@ public enum MountPointRequirement { /** * The Mountpoint needs to be a filesystem root and must not exist. */ - NO_PARENT_NO_MOUNT_POINT, + UNUSED_ROOT_DIR, /** * No Mountpoint on the local filesystem required. (e.g. WebDAV) diff --git a/src/main/java/org/cryptomator/ui/unlock/UnlockInvalidMountPointController.java b/src/main/java/org/cryptomator/ui/unlock/UnlockInvalidMountPointController.java index f84842807..234bac65b 100644 --- a/src/main/java/org/cryptomator/ui/unlock/UnlockInvalidMountPointController.java +++ b/src/main/java/org/cryptomator/ui/unlock/UnlockInvalidMountPointController.java @@ -42,14 +42,14 @@ public class UnlockInvalidMountPointController implements FxController { } public boolean getDriveLetterOccupied() { - return getMountPointRequirement() == MountPointRequirement.NO_PARENT_NO_MOUNT_POINT; + return getMountPointRequirement() == MountPointRequirement.UNUSED_ROOT_DIR; } private MountPointRequirement getMountPointRequirement() { var requirement = vault.getVolume().orElseThrow(() -> new IllegalStateException("Invalid Mountpoint without a Volume?!")).getMountPointRequirement(); assert requirement != MountPointRequirement.NONE; //An invalid MountPoint with no required MountPoint doesn't seem sensible assert requirement != MountPointRequirement.PARENT_OPT_MOUNT_POINT; //Not implemented anywhere (yet) - assert requirement != MountPointRequirement.NO_PARENT_NO_MOUNT_POINT || SystemUtils.IS_OS_WINDOWS; //Not implemented anywhere, but on Windows + assert requirement != MountPointRequirement.UNUSED_ROOT_DIR || SystemUtils.IS_OS_WINDOWS; //Not implemented anywhere, but on Windows return requirement; } diff --git a/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java b/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java index 1227fc9de..6964c3c86 100644 --- a/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java +++ b/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java @@ -83,7 +83,7 @@ public class UnlockWorkflow extends Task { var requirement = vault.getVolume().orElseThrow(() -> new IllegalStateException("Invalid Mountpoint without a Volume?!", impExc)).getMountPointRequirement(); assert requirement != MountPointRequirement.NONE; //An invalid MountPoint with no required MountPoint doesn't seem sensible assert requirement != MountPointRequirement.PARENT_OPT_MOUNT_POINT; //Not implemented anywhere (yet) - assert requirement != MountPointRequirement.NO_PARENT_NO_MOUNT_POINT || SystemUtils.IS_OS_WINDOWS; //Not implemented anywhere, but on Windows + assert requirement != MountPointRequirement.UNUSED_ROOT_DIR || SystemUtils.IS_OS_WINDOWS; //Not implemented anywhere, but on Windows Throwable cause = impExc.getCause(); // TODO: apply https://openjdk.java.net/jeps/8213076 in future JDK versions @@ -95,7 +95,7 @@ public class UnlockWorkflow extends Task { } showInvalidMountPointScene(); } else if (cause instanceof FileAlreadyExistsException) { - if (requirement == MountPointRequirement.NO_PARENT_NO_MOUNT_POINT) { + if (requirement == MountPointRequirement.UNUSED_ROOT_DIR) { LOG.error("Unlock failed. Drive Letter already in use: {}", cause.getMessage()); } else { LOG.error("Unlock failed. Mountpoint already exists: {}", cause.getMessage());