From 6efb839fd025785bbe8d0c5560d113267c4fb1f2 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Mon, 24 Jul 2023 15:00:28 +0200 Subject: [PATCH 01/31] prepare 1.10.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b54dd2b44..9912e7b93 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.cryptomator cryptomator - 1.10.0-SNAPSHOT + 1.10.0 Cryptomator Desktop App From 7d7b88829ddca4be233d65f6a5f954f693e0e230 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Tue, 1 Aug 2023 10:04:07 +0200 Subject: [PATCH 02/31] allow notarization on manually dispatched builds --- .github/workflows/mac-dmg.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/mac-dmg.yml b/.github/workflows/mac-dmg.yml index 1b3b4f0b9..764af2d9a 100644 --- a/.github/workflows/mac-dmg.yml +++ b/.github/workflows/mac-dmg.yml @@ -8,6 +8,11 @@ on: version: description: 'Version' required: false + notarize: + description: 'Notarize' + required: true + default: false + type: boolean env: JAVA_VERSION: 20 @@ -222,7 +227,7 @@ jobs: env: VERSION_NO: ${{ needs.get-version.outputs.semVerNum }} - name: Notarize .dmg - if: startsWith(github.ref, 'refs/tags/') + if: startsWith(github.ref, 'refs/tags/') || inputs.notarize uses: cocoalibs/xcode-notarization-action@v1 with: app-path: 'Cryptomator-*.dmg' From c7e23f964655c680f524c31597e70709265771d3 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Wed, 6 Sep 2023 16:40:00 +0200 Subject: [PATCH 03/31] build AppImage for aarch64 --- .../{appimage-amd64.yml => appimage.yml} | 34 +++++++++++++------ .github/workflows/mac-dmg.yml | 2 +- 2 files changed, 25 insertions(+), 11 deletions(-) rename .github/workflows/{appimage-amd64.yml => appimage.yml} (87%) diff --git a/.github/workflows/appimage-amd64.yml b/.github/workflows/appimage.yml similarity index 87% rename from .github/workflows/appimage-amd64.yml rename to .github/workflows/appimage.yml index dbc180473..47bcc97ee 100644 --- a/.github/workflows/appimage-amd64.yml +++ b/.github/workflows/appimage.yml @@ -14,6 +14,8 @@ env: JAVA_VERSION: 20 OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_linux-x64_bin-jmods.zip' OPENJFX_JMODS_AMD64_HASH: 'f522ac2ae4bdd61f0219b7b8d2058ff72a22f36a44378453bcfdcd82f8f5e08c' + OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_linux-aarch64_bin-jmods.zip' + OPENJFX_JMODS_AARCH64_HASH: 'c0d80ebbe0aab404ef9ad8b46c05bf533a1e40b39b2720eebd9238d81f6326ca' jobs: get-version: @@ -23,8 +25,20 @@ jobs: build: name: Build AppImage - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} needs: [get-version] + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + appimage-suffix: x86_64 + openjfx-url: ${{ env.OPENJFX_JMODS_AMD64 }} + openjfx-sha: ${{ env.OPENJFX_JMODS_AMD64_HASH }} + - os: [self-hosted, Linux, ARM64] + appimage-suffix: aarch64 + openjfx-url: ${{ env.OPENJFX_JMODS_AARCH64 }} + openjfx-sha: ${{ env.OPENJFX_JMODS_AARCH64_HASH }} steps: - uses: actions/checkout@v3 - name: Setup Java @@ -38,21 +52,21 @@ jobs: - name: Download OpenJFX jmods id: download-jmods run: | - curl -L ${{ env.OPENJFX_JMODS_AMD64 }} -o openjfx-jmods.zip - echo "${{ env.OPENJFX_JMODS_AMD64_HASH }} openjfx-jmods.zip" | shasum -a256 --check + curl -L ${{ matrix.openjfx-url }} -o openjfx-jmods.zip + echo "${{ matrix.openjfx-sha }} openjfx-jmods.zip" | shasum -a256 --check mkdir -p openjfx-jmods unzip -j openjfx-jmods.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/javafx.fxml.jmod \*/javafx.graphics.jmod -d openjfx-jmods - name: Ensure major jfx version in pom and in jmods is the same run: | - JMOD_VERSION_AMD64=$(jmod describe openjfx-jmods/javafx.base.jmod | head -1) - JMOD_VERSION_AMD64=${JMOD_VERSION_AMD64#*@} - JMOD_VERSION_AMD64=${JMOD_VERSION_AMD64%%.*} + JMOD_VERSION=$(jmod describe openjfx-jmods/javafx.base.jmod | head -1) + JMOD_VERSION=${JMOD_VERSION#*@} + JMOD_VERSION=${JMOD_VERSION%%.*} POM_JFX_VERSION=$(mvn help:evaluate "-Dexpression=javafx.version" -q -DforceStdout) POM_JFX_VERSION=${POM_JFX_VERSION#*@} POM_JFX_VERSION=${POM_JFX_VERSION%%.*} if [ $POM_JFX_VERSION -ne $JMOD_VERSION_AMD64 ]; then - >&2 echo "Major JavaFX version in pom.xml (${POM_JFX_VERSION}) != amd64 jmod version (${JMOD_VERSION_AMD64})" + >&2 echo "Major JavaFX version in pom.xml (${POM_JFX_VERSION}) != amd64 jmod version (${JMOD_VERSION})" exit 1 fi - name: Set version @@ -133,7 +147,7 @@ jobs: ln -s bin/cryptomator.sh Cryptomator.AppDir/AppRun - name: Download AppImageKit run: | - curl -L https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-x86_64.AppImage -o appimagetool.AppImage + curl -L https://github.com/AppImage/AppImageKit/releases/download/13/appimagetool-${{ matrix.appimage-suffix }}.AppImage -o appimagetool.AppImage chmod +x appimagetool.AppImage ./appimagetool.AppImage --appimage-extract - name: Prepare GPG-Agent for signing with key 615D449FE6E6A235 @@ -145,8 +159,8 @@ jobs: GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }} - name: Build AppImage run: > - ./squashfs-root/AppRun Cryptomator.AppDir cryptomator-${{ needs.get-version.outputs.semVerStr }}-x86_64.AppImage - -u 'gh-releases-zsync|cryptomator|cryptomator|latest|cryptomator-*-x86_64.AppImage.zsync' + ./squashfs-root/AppRun Cryptomator.AppDir cryptomator-${{ needs.get-version.outputs.semVerStr }}-${{ matrix.appimage-suffix }}.AppImage + -u 'gh-releases-zsync|cryptomator|cryptomator|latest|cryptomator-*-${{ matrix.appimage-suffix }}.AppImage.zsync' --sign --sign-key=615D449FE6E6A235 --sign-args="--batch --pinentry-mode loopback" - name: Create detached GPG signatures run: | diff --git a/.github/workflows/mac-dmg.yml b/.github/workflows/mac-dmg.yml index fe10ce531..8d693b051 100644 --- a/.github/workflows/mac-dmg.yml +++ b/.github/workflows/mac-dmg.yml @@ -77,7 +77,7 @@ jobs: POM_JFX_VERSION=${POM_JFX_VERSION%%.*} if [ $POM_JFX_VERSION -ne $JMOD_VERSION ]; then - >&2 echo "Major JavaFX version in pom.xml (${POM_JFX_VERSION}) != jmod version (${JMOD_VERSION_AMD64})" + >&2 echo "Major JavaFX version in pom.xml (${POM_JFX_VERSION}) != jmod version (${JMOD_VERSION})" exit 1 fi - name: Set version From 8786b5ee2a14e9ff522adc55926b28c670f3baea Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Wed, 6 Sep 2023 16:43:58 +0200 Subject: [PATCH 04/31] can't use env vars in matrix builds --- .github/workflows/appimage.yml | 12 ++++-------- .github/workflows/mac-dmg.yml | 12 ++++-------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index 47bcc97ee..e3841c8dc 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -12,10 +12,6 @@ on: env: JAVA_DIST: 'temurin' JAVA_VERSION: 20 - OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_linux-x64_bin-jmods.zip' - OPENJFX_JMODS_AMD64_HASH: 'f522ac2ae4bdd61f0219b7b8d2058ff72a22f36a44378453bcfdcd82f8f5e08c' - OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_linux-aarch64_bin-jmods.zip' - OPENJFX_JMODS_AARCH64_HASH: 'c0d80ebbe0aab404ef9ad8b46c05bf533a1e40b39b2720eebd9238d81f6326ca' jobs: get-version: @@ -33,12 +29,12 @@ jobs: include: - os: ubuntu-latest appimage-suffix: x86_64 - openjfx-url: ${{ env.OPENJFX_JMODS_AMD64 }} - openjfx-sha: ${{ env.OPENJFX_JMODS_AMD64_HASH }} + openjfx-url: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_linux-x64_bin-jmods.zip' + openjfx-sha: 'f522ac2ae4bdd61f0219b7b8d2058ff72a22f36a44378453bcfdcd82f8f5e08c' - os: [self-hosted, Linux, ARM64] appimage-suffix: aarch64 - openjfx-url: ${{ env.OPENJFX_JMODS_AARCH64 }} - openjfx-sha: ${{ env.OPENJFX_JMODS_AARCH64_HASH }} + openjfx-url: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_linux-aarch64_bin-jmods.zip' + openjfx-sha: 'c0d80ebbe0aab404ef9ad8b46c05bf533a1e40b39b2720eebd9238d81f6326ca' steps: - uses: actions/checkout@v3 - name: Setup Java diff --git a/.github/workflows/mac-dmg.yml b/.github/workflows/mac-dmg.yml index 8d693b051..a394101ff 100644 --- a/.github/workflows/mac-dmg.yml +++ b/.github/workflows/mac-dmg.yml @@ -17,10 +17,6 @@ on: env: JAVA_DIST: 'temurin' JAVA_VERSION: 20 - OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_osx-x64_bin-jmods.zip' - OPENJFX_JMODS_AMD64_HASH: '55b8ff7453d59c89ae129f6c9c5ad7b09a5d359568811b376ac1766c14d6a17c' - OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_osx-aarch64_bin-jmods.zip' - OPENJFX_JMODS_AARCH64_HASH: 'c60f5f19aa847e0e620e0b011e5de68f2c6755641c2141cec27a0b89f612beaf' jobs: get-version: @@ -41,15 +37,15 @@ jobs: output-suffix: x64 xcode-path: '/Applications/Xcode_13.2.1.app' fuse-lib: macFUSE - openjfx-url: ${{ env.OPENJFX_JMODS_AMD64 }} - openjfx-sha: ${{ env.OPENJFX_JMODS_AMD64_HASH }} + openjfx-url: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_osx-x64_bin-jmods.zip' + openjfx-sha: '55b8ff7453d59c89ae129f6c9c5ad7b09a5d359568811b376ac1766c14d6a17c' - os: [self-hosted, macOS, ARM64] architecture: aarch64 output-suffix: arm64 xcode-path: '/Applications/Xcode_13.2.1.app' fuse-lib: FUSE-T - openjfx-url: ${{ env.OPENJFX_JMODS_AARCH64 }} - openjfx-sha: ${{ env.OPENJFX_JMODS_AARCH64_HASH }} + openjfx-url: 'https://download2.gluonhq.com/openjfx/20.0.2/openjfx-20.0.2_osx-aarch64_bin-jmods.zip' + openjfx-sha: 'c60f5f19aa847e0e620e0b011e5de68f2c6755641c2141cec27a0b89f612beaf' steps: - uses: actions/checkout@v3 - name: Setup Java From f19ff590051cc39841a9b554a2d9c2cb352877e6 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Wed, 6 Sep 2023 16:47:29 +0200 Subject: [PATCH 05/31] add suffix to uploaded artifacts --- .github/workflows/appimage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index e3841c8dc..fbbc879b6 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -165,7 +165,7 @@ jobs: - name: Upload artifacts uses: actions/upload-artifact@v3 with: - name: appimage + name: appimage-${{ matrix.appimage-suffix }} path: | cryptomator-*.AppImage cryptomator-*.AppImage.zsync From 18b648473174b30cc4df876a2fa24b32d2f43b5a Mon Sep 17 00:00:00 2001 From: Cryptobot Date: Mon, 11 Sep 2023 09:46:49 +0200 Subject: [PATCH 06/31] New Crowdin updates (#3095) New translations strings.properties Arabic; Chinese Simplified; Filipino; German; Japanese; Norwegian Bokmal; Polish; Portuguese, Brazilian; Spanish; Swedish; Ukrainian; [ci skip] --- src/main/resources/i18n/strings_ar.properties | 34 ++++++++++-- src/main/resources/i18n/strings_de.properties | 4 +- src/main/resources/i18n/strings_es.properties | 4 ++ .../resources/i18n/strings_fil.properties | 54 +++++++++++++++++++ src/main/resources/i18n/strings_ja.properties | 4 ++ src/main/resources/i18n/strings_nb.properties | 4 ++ src/main/resources/i18n/strings_pl.properties | 1 + .../resources/i18n/strings_pt_BR.properties | 4 ++ src/main/resources/i18n/strings_sv.properties | 4 ++ src/main/resources/i18n/strings_uk.properties | 6 +++ src/main/resources/i18n/strings_zh.properties | 4 ++ 11 files changed, 117 insertions(+), 6 deletions(-) diff --git a/src/main/resources/i18n/strings_ar.properties b/src/main/resources/i18n/strings_ar.properties index e8531fe20..832667de1 100644 --- a/src/main/resources/i18n/strings_ar.properties +++ b/src/main/resources/i18n/strings_ar.properties @@ -41,6 +41,7 @@ traymenu.vault.reveal=إظهار # Add Vault Wizard addvaultwizard.title=أضِف مخزنًا ## New +addvaultwizard.new.title=إضافة مخزن جديد ### Name addvaultwizard.new.nameInstruction=اختر اسم للمخزن addvaultwizard.new.namePrompt=اسم الخزينة @@ -85,11 +86,12 @@ addvault.new.readme.storageLocation.8=2. فتح المخزن باستخدام Cr 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.1=🔐️ وحدة التخزين مشفرة 🔐️ addvault.new.readme.accessLocation.2=هذا هو موقع الوصول للخرنة الخاص بك. addvault.new.readme.accessLocation.3=سيتم تشفير أي ملفات تضاف إلى هذا المجلد من قبل Cryptomator. يمكنك العمل عليه كأي مجلد آخر. هذه فقط طريقة عرض غير مشفرة لمحتوياتها، ملفاتك تبقى مشفرة على القرص الصلب الخاص بك طوال الوقت. addvault.new.readme.accessLocation.4=لا تتردد في إزالة هذا الملف. ## Existing +addvaultwizard.existing.title=أضِف مخزن موجود addvaultwizard.existing.instruction=اختر ملف "vault.cryptomator" من خزينتك الحالية. إذا كان يوجد فقط ملف اسمه "masterkey.cryptomator"، اختره عوضاً عنه. addvaultwizard.existing.chooseBtn=اختر… addvaultwizard.existing.filePickerTitle=حدد مِلَفّ المخزن @@ -132,9 +134,10 @@ unlock.success.rememberChoice=تذكر اختياري ولا تظهر هذا م unlock.success.revealBtn=اظهار القرص ## Failure unlock.error.customPath.message=غير قادر على تركيب المخزن إلى المسار المخصص -unlock.error.customPath.description.notSupported=إذا كنت ترغب في الاستمرار في استخدام المسار المخصص، يرجى الذَّهاب إلى التفضيلات وتحديد نوع واسطة التخزين الذي يدعمها. خلاف ذلك، انتقل إلى خيارات المخزن واختر نقطة تركيب مدعومة. +unlock.error.customPath.description.notSupported=إذا كنت ترغب في الاستمرار في استخدام المسار المخصص، يرجى الذَّهاب إلى التفضيلات وتحديد نوع وحدة التخزين\n الذي يدعمها. خلاف ذلك، انتقل إلى خيارات المخزن واختر نقطة تركيب مدعومة. unlock.error.customPath.description.notExists=مسار التركيب المخصص غير موجود. قم بإنشائه في نظام الملفات المحلي الخاص بك أو اختر غيره في خيارات الخزانة. unlock.error.customPath.description.inUse=حرف القرص أو مسار التركيب المخصص "%s" قيد الاستخدام بالفعل. +unlock.error.customPath.description.hideawayNotDir=لا يمكن إزالة المِلَفّ المؤقت المخفي "%3$s" المستخدم لفتح القُفْل. الرجاء التحقق من المِلَفّ ثم حذفه يدوياً. unlock.error.customPath.description.couldNotBeCleaned=لا يمكن تركيب خزانتك على المسار "%s". الرجاء المحاولة مرة أخرى أو اختيار مسار مختلف. unlock.error.customPath.description.notEmptyDir=مسار التركيب المخصص "%s" ليس مجلد فارغ. الرجاء اختيار مجلد فارغ وحاول مرة أخرى. unlock.error.customPath.description.generic=لقد اخترت مسار تركيب مخصص لهذه الخزانة، ولكن استخدامه فشل مع الرسالة: %2$s @@ -245,6 +248,11 @@ health.result.severityFilter.info=معلومات health.result.severityFilter.warn=تحذير health.result.severityFilter.crit=حرج health.result.severityTip.good=الخطورة: جيد\nبنية المخزن عادية. +health.result.severityTip.info=الخطورة: معلومات\nبنية المخزن سليمة، إصلاح المقترح. +health.result.severityTip.warn=الخطورة: تحذير\nبنية المخزن تالفة، ننصح لإصلاح. +health.result.severityTip.crit=الخطورة: حرجة\nبنية المخزن تالفة، وتم تحديد فقدان البيانات. +health.result.fixStateFilter.all=حالة لإصلاح - الكل +health.result.fixStateFilter.fixable=قابلة للإصلاح health.result.fixStateFilter.notFixable=غير قابل للإصلاح health.result.fixStateFilter.fixing=يتم الإصلاح… health.result.fixStateFilter.fixed=تم الإصلاح @@ -259,15 +267,33 @@ preferences.title=تفضيلات ## General preferences.general=عام preferences.general.startHidden=إخفاء النافذة عند بدء تشغيل Cryptomator +preferences.general.autoCloseVaults=اقفل الخزانات المفتوحة تلقائياً عند الإقلاع عن التطبيق preferences.general.debugLogging=تمكين سجلات التصحيح preferences.general.debugDirectory=عرض ملفات السجل preferences.general.autoStart=تشغيل Cryptomator عند بدء تشغيل النظام preferences.general.keychainBackend=تخزين كلمات المرور مع ## Interface +preferences.interface=الواجهة +preferences.interface.theme=الشكل والمظهر +preferences.interface.theme.automatic=تلقائي preferences.interface.theme.dark=مظلم (أسود) preferences.interface.theme.light=فاتح (أبيض) +preferences.interface.unlockThemes=تفعيل الوضع الداكن +preferences.interface.language=اللغة (يتطلب إعادة التشغيل) +preferences.interface.language.auto=النظام الافتراضي +preferences.interface.interfaceOrientation=اتجاه الواجهة +preferences.interface.interfaceOrientation.ltr=من اليسار إلى اليمين +preferences.interface.interfaceOrientation.rtl=من اليمين إلى اليسار +preferences.interface.showMinimizeButton=إظهار زر التصغير +preferences.interface.showTrayIcon=إظهار أيقونة اللوحة (يتطلب إعادة تشغيل) ## Volume preferences.volume=القرص الإفتراضي +preferences.volume.type=‮نوع وحدة التخزين +preferences.volume.type.automatic=تلقائي +preferences.volume.docsTooltip=افتح الوثائق لمعرفة المزيد عن مختلف أنواع وحدة التخزين. +preferences.volume.fuseRestartRequired=لتطبيق التغييرات، يحتاج Cryptomator إلى إعادة التشغيل. +preferences.volume.tcp.port=منفذ TCP +preferences.volume.supportedFeatures=يدعم نوع وحدة تخزين المختار الميزات التالية: ## Updates preferences.updates=تحديثات preferences.updates.currentVersion=الإصدار الحالي: %s @@ -353,8 +379,8 @@ wrongFileAlert.message=هل حاولت تشفير هذه الملفات؟ wrongFileAlert.description=لهذا الغرض، بوفر Cryptomator مجلداً في مدير ملفات النظام الخاص بك. wrongFileAlert.instruction.0=لتشفير الملفات، قم باتباع الخطوات التالية: wrongFileAlert.instruction.1=1. فتح المخزن الخاص بك. -wrongFileAlert.instruction.2=2. انقر على "إظهار" لفتح المجلد في مدير الملفات الخاص بك. -wrongFileAlert.instruction.3=3. أضف ملفاتك إلى هذا المجلد. +wrongFileAlert.instruction.2=2. انقر على "إظهار" لفتح وحدة التخزين في مدير ملفاتك. +wrongFileAlert.instruction.3=3. أضِف ملفاتك إلى هذه وحدة التخزين. wrongFileAlert.link=لمزيد من المساعدة، قم بزيارة # Vault Options diff --git a/src/main/resources/i18n/strings_de.properties b/src/main/resources/i18n/strings_de.properties index 2568b791c..25bcf8541 100644 --- a/src/main/resources/i18n/strings_de.properties +++ b/src/main/resources/i18n/strings_de.properties @@ -366,8 +366,8 @@ main.vaultlist.contextMenu.unlockNow=Jetzt entsperren main.vaultlist.contextMenu.vaultoptions=Tresoroptionen anzeigen main.vaultlist.contextMenu.reveal=Laufwerk anzeigen main.vaultlist.addVaultBtn=Hinzufügen -main.vaultlist.addVaultBtn.menuItemNew=Neuer Tresor... -main.vaultlist.addVaultBtn.menuItemExisting=Bestehender Tresor... +main.vaultlist.addVaultBtn.menuItemNew=Neuer Tresor … +main.vaultlist.addVaultBtn.menuItemExisting=Bestehender Tresor … ## Vault Detail ### Welcome main.vaultDetail.welcomeOnboarding=Danke, dass du zum Schutz deiner Dateien Cryptomator gewählt hast. Falls du Hilfe brauchst, schau dir unsere Anleitungen an: diff --git a/src/main/resources/i18n/strings_es.properties b/src/main/resources/i18n/strings_es.properties index 8b3070c25..27804b73c 100644 --- a/src/main/resources/i18n/strings_es.properties +++ b/src/main/resources/i18n/strings_es.properties @@ -41,6 +41,7 @@ traymenu.vault.reveal=Revelar # Add Vault Wizard addvaultwizard.title=Añadir bóveda ## New +addvaultwizard.new.title=Añadir nueva bóveda ### Name addvaultwizard.new.nameInstruction=Elegir un nombre para la bóveda addvaultwizard.new.namePrompt=Nombre de la bóveda @@ -90,6 +91,7 @@ addvault.new.readme.accessLocation.2=Este es el lugar de acceso de la bóveda. addvault.new.readme.accessLocation.3=Los archivos agregados a este volumen serán cifrados por Cryptomator. Se puede trabajar con ellos como en cualquier otra unidad/carpeta. Esta es sólo una vista descifrada del contenido, sus archivos permanecen cifrados en el disco duro todo el tiempo. addvault.new.readme.accessLocation.4=No dude en eliminar este archivo. ## Existing +addvaultwizard.existing.title=Añadir bóveda existente addvaultwizard.existing.instruction=Elija el archivo "vault.cryptomator" de su bóveda existente. Si solo existe un archivo llamado "masterkey.cryptomator", selecciónelo en su lugar. addvaultwizard.existing.chooseBtn=Elegir… addvaultwizard.existing.filePickerTitle=Seleccionar archivo de bóveda @@ -364,6 +366,8 @@ main.vaultlist.contextMenu.unlockNow=Desbloquear ahora main.vaultlist.contextMenu.vaultoptions=Mostrar opciones de la bóveda main.vaultlist.contextMenu.reveal=Revelar unidad main.vaultlist.addVaultBtn=Añadir +main.vaultlist.addVaultBtn.menuItemNew=Nueva bóveda... +main.vaultlist.addVaultBtn.menuItemExisting=Bóveda existente... ## Vault Detail ### Welcome main.vaultDetail.welcomeOnboarding=Gracias por elegir Cryptomator para proteger sus archivos. En caso de necesitar ayuda, revise nuestras guías: diff --git a/src/main/resources/i18n/strings_fil.properties b/src/main/resources/i18n/strings_fil.properties index 1a4dd5202..b9fb10c8e 100644 --- a/src/main/resources/i18n/strings_fil.properties +++ b/src/main/resources/i18n/strings_fil.properties @@ -20,6 +20,10 @@ error.description=Oops! Hindi inaasahan ng Cryptomator na ito'y mangyari. Maaari error.hyperlink.lookup=Hanapin ang solusyon error.hyperlink.report=I-report ang problema error.technicalDetails=Mga detalye: +error.existingSolutionDescription=Hindi inaasahan ng Cryptomator na mangyayari ito. Ngunit nakakita kami ng kasalukuyang solusyon para sa error na ito. Mangyaring tingnan ang sumusunod na link. +error.hyperlink.solution=Hanapin ang solusyon +error.lookupPermissionMessage=Maaaring maghanap ng solusyon ang Cryptomator para sa problemang ito online. Magpapadala ito ng kahilingan sa aming database ng problema mula sa iyong IP address. +error.dismiss=I-dismiss error.lookUpSolution=Itignan ang solusyon # Defaults @@ -37,6 +41,7 @@ traymenu.vault.reveal=Ipakita # Add Vault Wizard addvaultwizard.title=Magdagdag ng Vault ## New +addvaultwizard.new.title=Magdagdag ng Bagong Vault ### Name addvaultwizard.new.nameInstruction=Pangalanan ang vault addvaultwizard.new.namePrompt=Pangalan ng Vault @@ -47,34 +52,78 @@ addvaultwizard.new.locationPrompt=… addvaultwizard.new.directoryPickerLabel=Custom Location addvaultwizard.new.directoryPickerButton=Mamili… addvaultwizard.new.directoryPickerTitle=Pumili ng Direktoryo +addvaultwizard.new.fileAlreadyExists=Mayroon nang file o direktoryo na may pangalan ng vault +addvaultwizard.new.locationDoesNotExist=Ang isang direktoryo sa tinukoy na landas ay hindi umiiral o hindi ma-access +addvaultwizard.new.locationIsNotWritable=Walang access sa pagsulat sa tinukoy na landas +addvaultwizard.new.locationIsOk=Angkop na lokasyon para sa iyong vault +addvaultwizard.new.invalidName=Di-wastong pangalan ng vault +addvaultwizard.new.validName=Wastong pangalan ng vault +addvaultwizard.new.validCharacters.message=Maaaring naglalaman ang pangalan ng vault ng mga sumusunod na character: +addvaultwizard.new.validCharacters.chars=Mga character ng salita (hal. a, ж o 수) +addvaultwizard.new.validCharacters.numbers=Numero +addvaultwizard.new.validCharacters.dashes=Hyphen (%s) o underscore (%s) ### Expert Settings +addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Paganahin ang mga setting ng eksperto +addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Maglagay ng value sa pagitan ng 36 at 220 (default 220) addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=Ibukas ang dokumentasyon para matuto pa. +addvaultwizard.new.expertSettings.shorteningThreshold.title=Pinakamataas na haba ng mga naka-encrypt na pangalan ng file +addvaultwizard.new.expertSettings.shorteningThreshold.valid=Wasto ### Password addvaultwizard.new.createVaultBtn=Gumawa ng bagong Vault +addvaultwizard.new.generateRecoveryKeyChoice=Hindi mo maa-access ang iyong data nang wala ang iyong password. Gusto mo ba ng recovery key para sa kaso na nawala mo ang iyong password? +addvaultwizard.new.generateRecoveryKeyChoice.yes=Oo pakiusap, mas ligtas kaysa sorry +addvaultwizard.new.generateRecoveryKeyChoice.no=Hindi, salamat, hindi ko mawawala ang aking password ### Information +addvault.new.readme.storageLocation.fileName=MAHALAGA.rtf +addvault.new.readme.storageLocation.1=⚠️ VAULT FILES ⚠️ addvault.new.readme.storageLocation.2=Ito ang lokasyon ng iyong vault na imbakan. addvault.new.readme.storageLocation.3=HUWAG +addvault.new.readme.storageLocation.4=• baguhin ang anumang mga file sa loob ng direktoryong ito o +addvault.new.readme.storageLocation.5=• i-paste ang anumang mga file para sa pag-encrypt sa direktoryong ito. addvault.new.readme.storageLocation.6=Kung gusto mo i-encrypt ang mga files at makita nang nilalaman ng vault, gawin ang nakasabi: addvault.new.readme.storageLocation.7=1. Idagdag ang vault na ito sa Cryptomator. +addvault.new.readme.storageLocation.8=2. I-unlock ang vault sa Cryptomator. +addvault.new.readme.storageLocation.9=3. Buksan ang lokasyon ng pag-access sa pamamagitan ng pag-click sa pindutang "Ibunyag". +addvault.new.readme.storageLocation.10=Kung kailangan mo ng tulong, bisitahin ang dokumentasyon: %s +addvault.new.readme.accessLocation.fileName=WELCOME.rtf +addvault.new.readme.accessLocation.1=🔐️ Naka-encrypt na VOLUME 🔐️ addvault.new.readme.accessLocation.2=Ito ang lokasyon ng iyong vault. +addvault.new.readme.accessLocation.3=Ang anumang mga file na idinagdag sa volume na ito ay ie-encrypt ng Cryptomator. Maaari mong gawin ito tulad ng sa anumang iba pang drive/folder. Ito ay isang decrypted view lamang ng nilalaman nito, ang iyong mga file ay mananatiling naka-encrypt sa iyong hard drive sa lahat ng oras. +addvault.new.readme.accessLocation.4=Huwag mag-atubiling tanggalin ang file na ito. ## Existing +addvaultwizard.existing.title=Magdagdag ng Umiiral na Vault +addvaultwizard.existing.instruction=Piliin ang "vault.cryptomator" file ng iyong kasalukuyang vault. Kung mayroon lamang file na may pangalang "masterkey.cryptomator," piliin iyon sa halip. addvaultwizard.existing.chooseBtn=Mamili… +addvaultwizard.existing.filePickerTitle=Piliin ang Vault File +addvaultwizard.existing.filePickerMimeDesc=Cryptomator Vault ## Success +addvaultwizard.success.nextStepsInstructions=Idinagdag ang vault na "%s".\nKailangan mong i-unlock ang vault na ito para ma-access o magdagdag ng mga content. Bilang kahalili, maaari mo itong i-unlock sa anumang susunod na oras. +addvaultwizard.success.unlockNow=I-unlock Ngayon # Remove Vault removeVault.title=Tanggalin %s removeVault.message=Itangal ang vault? +removeVault.description=Makakalimutan lang nito ang Cryptomator tungkol sa vault na ito. Maaari mo itong idagdag muli. Walang matatanggal na mga naka-encrypt na file mula sa iyong hard drive. removeVault.confirmBtn=Itangal ang vault # Change Password +changepassword.title=Palitan ANG password +changepassword.enterOldPassword=Ilagay ang kasalukuyang password para sa "%s" +changepassword.finalConfirmation=Naiintindihan ko na hindi ko maa-access ang aking data kung nakalimutan ko ang aking password # Forget Password +forgetPassword.title=Kalimutan ang Password forgetPassword.message=Nakalimutan ang iyong password? +forgetPassword.description=Tatanggalin nito ang naka-save na password ng vault na ito mula sa keychain ng iyong system. +forgetPassword.confirmBtn=Kalimutan ang Password # Unlock +unlock.title=I-unlock ang "%s" +unlock.passwordPrompt=Ipasok ang password para sa "%s": unlock.savePassword=Maalala ang password unlock.unlockBtn=I-unlock ## Select +unlock.chooseMasterkey.message=Hindi nahanap ang masterkey file unlock.chooseMasterkey.filePickerTitle=Piliin ang masterkey file unlock.chooseMasterkey.filePickerMimeDesc=Cryptomator Masterkey ## Success @@ -100,6 +149,7 @@ lock.forced.retryBtn=Subukan muli ## Start ## Run ## Success +migration.success.unlockNow=I-unlock Ngayon ## Missing file system capabilities ## Impossible @@ -136,9 +186,12 @@ main.closeBtn.tooltip=Isara main.preferencesBtn.tooltip=Mga Kagustuhan ## Vault List main.vaultlist.contextMenu.lock=I-lock +main.vaultlist.contextMenu.unlockNow=I-unlock Ngayon +main.vaultlist.addVaultBtn=Idagdag ## Vault Detail ### Welcome ### Locked +main.vaultDetail.unlockNowBtn=I-unlock Ngayon ### Unlocked main.vaultDetail.lockBtn=I-lock ### Missing @@ -154,6 +207,7 @@ vaultOptions.general.vaultName=Pangalan ng Vault ## Mount vaultOptions.mount.mountPoint.directoryPickerButton=Mamili… ## Master Key +vaultOptions.masterkey.changePasswordBtn=Palitan ANG password ## Hub # Recovery Key diff --git a/src/main/resources/i18n/strings_ja.properties b/src/main/resources/i18n/strings_ja.properties index fa3d7d3e4..aa7af70d2 100644 --- a/src/main/resources/i18n/strings_ja.properties +++ b/src/main/resources/i18n/strings_ja.properties @@ -41,6 +41,7 @@ traymenu.vault.reveal=表示 # Add Vault Wizard addvaultwizard.title=金庫を追加 ## New +addvaultwizard.new.title=新しい金庫を追加 ### Name addvaultwizard.new.nameInstruction=金庫の名前を入力してください addvaultwizard.new.namePrompt=金庫の名前 @@ -90,6 +91,7 @@ addvault.new.readme.accessLocation.2=ここは金庫のアクセス先です。 addvault.new.readme.accessLocation.3=このボリュームに追加したファイルは Cryptomator によって暗号化されます。一般的なドライブ/フォルダー上のように作業することができます。ここでは復号したコンテンツのビューにすぎず、ファイルは常にハードドライブ上で暗号化されています。 addvault.new.readme.accessLocation.4=このファイルはいつでも削除できます。 ## Existing +addvaultwizard.existing.title=既存の金庫を追加 addvaultwizard.existing.instruction=すでにある金庫の "vault.cryptomator" ファイルを選択してください。"masterkey.cryptomator" という名前のファイルだけが存在する場合は、このファイルを代わりに選択してください。 addvaultwizard.existing.chooseBtn=選択... addvaultwizard.existing.filePickerTitle=金庫のファイルを選択 @@ -364,6 +366,8 @@ main.vaultlist.contextMenu.unlockNow=今すぐ解錠 main.vaultlist.contextMenu.vaultoptions=金庫のオプションを表示 main.vaultlist.contextMenu.reveal=ドライブを表示 main.vaultlist.addVaultBtn=追加 +main.vaultlist.addVaultBtn.menuItemNew=新しい金庫... +main.vaultlist.addVaultBtn.menuItemExisting=既存の金庫... ## Vault Detail ### Welcome main.vaultDetail.welcomeOnboarding=ファイルを保護するために Cryptomator を選んでいただきありがとうございます。ヘルプが必要であれば、スタートガイドをご覧ください: diff --git a/src/main/resources/i18n/strings_nb.properties b/src/main/resources/i18n/strings_nb.properties index 080df2a13..4a146b15c 100644 --- a/src/main/resources/i18n/strings_nb.properties +++ b/src/main/resources/i18n/strings_nb.properties @@ -41,6 +41,7 @@ traymenu.vault.reveal=Gjør synlig # Add Vault Wizard addvaultwizard.title=Legg til hvelv ## New +addvaultwizard.new.title=Legg til nytt hvelv ### Name addvaultwizard.new.nameInstruction=Navngi hvelvet addvaultwizard.new.namePrompt=Navn på hvelvet @@ -90,6 +91,7 @@ addvault.new.readme.accessLocation.2=Dette er hvelvets lagringssted. addvault.new.readme.accessLocation.3=Alle filer som er lagt til i dette volumet, blir kryptert av Cryptomator. Du kan jobbe med dem som på alle andre enheter/mapper. Dette er bare en dekryptert visning av innholdet, filene dine forblir kryptert på harddisken hele tiden. addvault.new.readme.accessLocation.4=Denne filen kan fjernes hvis ønskelig. ## Existing +addvaultwizard.existing.title=Legg til et eksisterende hvelv addvaultwizard.existing.instruction=Velg "vault.cryptomator"-filen til ditt eksisterende hvelv. Hvis det kun finnes en fil med navnet "masterkey.cryptomator", så velger du den i stedet. addvaultwizard.existing.chooseBtn=Velg… addvaultwizard.existing.filePickerTitle=Velg hvelvfil @@ -364,6 +366,8 @@ main.vaultlist.contextMenu.unlockNow=Lås opp nå main.vaultlist.contextMenu.vaultoptions=Alternativer for hvelvet main.vaultlist.contextMenu.reveal=Vis enheten main.vaultlist.addVaultBtn=Legg til +main.vaultlist.addVaultBtn.menuItemNew=Nytt hvelv... +main.vaultlist.addVaultBtn.menuItemExisting=Eksisterende hvelv... ## Vault Detail ### Welcome main.vaultDetail.welcomeOnboarding=Takk for at du valgte Cryptomator for å beskytte filene dine. Hvis du trenger hjelp, sjekk ut våre guider for å komme i gang: diff --git a/src/main/resources/i18n/strings_pl.properties b/src/main/resources/i18n/strings_pl.properties index c5f519308..a50b9f9ad 100644 --- a/src/main/resources/i18n/strings_pl.properties +++ b/src/main/resources/i18n/strings_pl.properties @@ -137,6 +137,7 @@ unlock.error.customPath.message=Nie można zamontować sejfu na niestandardowej unlock.error.customPath.description.notSupported=Jeśli chcesz nadal używać niestandardowej ścieżki, przejdź do preferencji i wybierz typ udziału, który ją obsługuje. W przeciwnym razie przejdź do opcji sejfu i wybierz obsługiwany punkt montowania. unlock.error.customPath.description.notExists=Niestandardowa ścieżka montowania nie istnieje. Stwórz ją w lokalnym systemie plików lub zmień ją w opcjach sejfu. unlock.error.customPath.description.inUse=Litera dysku lub podana ścieżka montowania "%s" jest już w użyciu. +unlock.error.customPath.description.hideawayNotDir=Nie można usunąć ukrytego pliku tymczasowego "%3$s", używanego do odblokowywania. Sprawdź plik, po czym usuń go ręcznie. unlock.error.customPath.description.couldNotBeCleaned=Twój sejf nie mógł być zamontowany do ścieżki "%s". Spróbuj ponownie lub wybierz inną ścieżkę. unlock.error.customPath.description.notEmptyDir=Wybrana ścieżka montowania "%s" nie jest pustym katalogiem. Wybierz pusty katalog i spróbuj ponownie. unlock.error.customPath.description.generic=Wybrałeś własną ścieżkę montowania dla tego sejfu, ale użycie jej nie powiodło się. Powód: %2$s diff --git a/src/main/resources/i18n/strings_pt_BR.properties b/src/main/resources/i18n/strings_pt_BR.properties index 6c512e1c6..970c50888 100644 --- a/src/main/resources/i18n/strings_pt_BR.properties +++ b/src/main/resources/i18n/strings_pt_BR.properties @@ -41,6 +41,7 @@ traymenu.vault.reveal=Exibir # Add Vault Wizard addvaultwizard.title=Adicionar Cofre ## New +addvaultwizard.new.title=Adicionar Novo Cofre ### Name addvaultwizard.new.nameInstruction=Escolha um nome para o cofre addvaultwizard.new.namePrompt=Nome do Cofre @@ -90,6 +91,7 @@ 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 criptografados de forma transparente pelo Cryptomator. Você pode trabalhar nele como se fosse qualquer unidade/pasta. Esta é apenas uma visão não criptografada do seu conteúdo, mas seus arquivos permanecem criptografados na sua unidade o tempo todo. addvault.new.readme.accessLocation.4=Fique à vontade para apagar este arquivo. ## Existing +addvaultwizard.existing.title=Adicionar Cofre Existente 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 @@ -364,6 +366,8 @@ main.vaultlist.contextMenu.unlockNow=Desbloquear Agora main.vaultlist.contextMenu.vaultoptions=Exibir Opções de Cofre main.vaultlist.contextMenu.reveal=Revelar Volume main.vaultlist.addVaultBtn=Adicionar +main.vaultlist.addVaultBtn.menuItemNew=Novo Cofre... +main.vaultlist.addVaultBtn.menuItemExisting=Cofre Existente... ## Vault Detail ### Welcome main.vaultDetail.welcomeOnboarding=Obrigado por escolher o Cryptomator para proteger seus arquivos. Se precisar de ajuda, confira nossos guias de introdução: diff --git a/src/main/resources/i18n/strings_sv.properties b/src/main/resources/i18n/strings_sv.properties index f1feda15c..c36dc1cf6 100644 --- a/src/main/resources/i18n/strings_sv.properties +++ b/src/main/resources/i18n/strings_sv.properties @@ -41,6 +41,7 @@ traymenu.vault.reveal=Visa # Add Vault Wizard addvaultwizard.title=Lägg till valv ## New +addvaultwizard.new.title=Lägg till nytt valv ### Name addvaultwizard.new.nameInstruction=Ange namn för valvet addvaultwizard.new.namePrompt=Valvnamn @@ -90,6 +91,7 @@ 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.title=Öppna befintligt valv 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 @@ -364,6 +366,8 @@ main.vaultlist.contextMenu.unlockNow=Lås upp nu main.vaultlist.contextMenu.vaultoptions=Visa inställningar för valv main.vaultlist.contextMenu.reveal=Visa enhet main.vaultlist.addVaultBtn=Lägg till +main.vaultlist.addVaultBtn.menuItemNew=Nytt valv... +main.vaultlist.addVaultBtn.menuItemExisting=Öppna befintligt valv... ## Vault Detail ### Welcome main.vaultDetail.welcomeOnboarding=Tack för att du väljer Cryptomator för att skydda dina filer. Om du behöver hjälp kan du kolla in våra guider: diff --git a/src/main/resources/i18n/strings_uk.properties b/src/main/resources/i18n/strings_uk.properties index 2f45c80ab..cf4c5b0e1 100644 --- a/src/main/resources/i18n/strings_uk.properties +++ b/src/main/resources/i18n/strings_uk.properties @@ -20,6 +20,8 @@ error.description=Cryptomator не очікував, що таке трапит error.hyperlink.lookup=Дізнатися більше про цю помилку error.hyperlink.report=Повідомити про помилку error.technicalDetails=Подробиці: +error.hyperlink.solution=Знайдіть рішення +error.dismiss=Відхилити # Defaults defaults.vault.vaultName=Сховище @@ -36,6 +38,7 @@ traymenu.vault.reveal=Показати # Add Vault Wizard addvaultwizard.title=Додати сховище ## New +addvaultwizard.new.title=Додайте нове сховище ### Name addvaultwizard.new.nameInstruction=Оберіть назву для сховища addvaultwizard.new.namePrompt=Назва сховища @@ -57,6 +60,7 @@ addvaultwizard.new.validCharacters.chars=Літери (напр. a, ж or 수) addvaultwizard.new.validCharacters.numbers=Цифри addvaultwizard.new.validCharacters.dashes=Дефіс (%s) або підкреслення (%s) ### Expert Settings +addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=Відкрийте документацію, щоб дізнатися більше. ### Password addvaultwizard.new.createVaultBtn=Створити сховище addvaultwizard.new.generateRecoveryKeyChoice=Ви не зможете отримати доступ до своїх даних, якщо втратите пароль. Хочете створити ключ відновлення на випадок втрати паролю? @@ -80,6 +84,7 @@ addvault.new.readme.accessLocation.2=Це місце розташування в addvault.new.readme.accessLocation.3=Будь-які файли, додані до цього тому, будуть зашифровані за допомогою Cryptomator. Ви можете працювати із ним як із будь-якою іншою директорією або накопичувачем. Це лише розшифрований вигляд його вмісту, ваші файли завжди знаходяться в зашифрованому вигляді на диску. addvault.new.readme.accessLocation.4=Якщо хочете, то можете видалити цей файл. ## Existing +addvaultwizard.existing.title=Додати існуюче сховище addvaultwizard.existing.instruction=Виберіть файл "vault.cryptomator" у вашому існуючому сховищі. Якщо існує лише файл з назвою "masterkey.cryptomator", виберіть його. addvaultwizard.existing.chooseBtn=Обрати… addvaultwizard.existing.filePickerTitle=Виберіть Vault Файл @@ -179,6 +184,7 @@ migration.error.missingFileSystemCapabilities.title=Непідтримувана # Health Check ## Start ## Start Failure +health.fail.moreInfo=Більше інформації ## Check Selection ## Detail view health.check.detail.checkRunning=Перевірка триває… diff --git a/src/main/resources/i18n/strings_zh.properties b/src/main/resources/i18n/strings_zh.properties index c60ff33c5..d47632466 100644 --- a/src/main/resources/i18n/strings_zh.properties +++ b/src/main/resources/i18n/strings_zh.properties @@ -41,6 +41,7 @@ traymenu.vault.reveal=显示 # Add Vault Wizard addvaultwizard.title=添加保险库 ## New +addvaultwizard.new.title=添加新保险库 ### Name addvaultwizard.new.nameInstruction=为保险库创建一个名称 addvaultwizard.new.namePrompt=保险库名称 @@ -90,6 +91,7 @@ addvault.new.readme.accessLocation.2=这是您的保险库的访问路径。 addvault.new.readme.accessLocation.3=任何添加到此卷的文件都将被 Cryptomator 加密。您可以像在一般磁盘/文件夹上那样操作它。 这只是对其内容的解密查看,您的文件会在硬盘上一直保持加密。 addvault.new.readme.accessLocation.4=您可以随时删除此文件。 ## Existing +addvaultwizard.existing.title=添加现有保险库 addvaultwizard.existing.instruction=请选择现有保险库中的“vault.cryptomator”文件。如果只有一个名为“masterkey.cryptomator”的文件,则改为选择该文件。 addvaultwizard.existing.chooseBtn=选择... addvaultwizard.existing.filePickerTitle=请选择保险库对应文件 @@ -364,6 +366,8 @@ main.vaultlist.contextMenu.unlockNow=立即解锁 main.vaultlist.contextMenu.vaultoptions=显示保险库选项 main.vaultlist.contextMenu.reveal=显示驱动器 main.vaultlist.addVaultBtn=添加 +main.vaultlist.addVaultBtn.menuItemNew=新保险库... +main.vaultlist.addVaultBtn.menuItemExisting=现有保险库... ## Vault Detail ### Welcome main.vaultDetail.welcomeOnboarding=感谢您使用 Cryptomator 来保护您的文件。如果您需要任何帮助,请查看我们的快速开始指南: From 0130c7cce697c0b426b08aef7cfbfbc8bb2b4121 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Mon, 11 Sep 2023 09:50:17 +0200 Subject: [PATCH 07/31] fix local windows build script [ci skip] --- dist/win/build.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/win/build.ps1 b/dist/win/build.ps1 index d695e7302..bef7a9acb 100644 --- a/dist/win/build.ps1 +++ b/dist/win/build.ps1 @@ -65,8 +65,8 @@ if( $jmodsChecksumActual -ne $jfxJmodsChecksum ) { Write-Error "Checksum mismatch for jfxJmods.zip. Expected: $jfxJmodsChecksum, actual: $jmodsChecksumActual" exit 1; } -Expand-Archive -Force -Path $jfxJmodsZip -DestinationPath ".\resources\" -Move-Item -Path ".\resources\javafx-jmods-*" -Destination ".\resources\javafx-jmods" -ErrorAction Stop +Expand-Archive -Path $jfxJmodsZip -DestinationPath ".\resources\" +Move-Item -Force -Path ".\resources\javafx-jmods-*" -Destination ".\resources\javafx-jmods" -ErrorAction Stop & "$Env:JAVA_HOME\bin\jlink" ` From 189e2679f1ce399ca09504db730bfbbc14bad038 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Mon, 11 Sep 2023 09:53:35 +0200 Subject: [PATCH 08/31] finalize 1.10.0 --- dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml b/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml index f1deff111..596ebea4a 100644 --- a/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml +++ b/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml @@ -66,6 +66,7 @@ + From eb4d39e8b481a5c16996b3002d318b1bb42f9f8d Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Tue, 12 Sep 2023 13:34:55 +0200 Subject: [PATCH 09/31] introduce 'errorCode' parameter in request --- src/main/java/org/cryptomator/ui/error/ErrorController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/error/ErrorController.java b/src/main/java/org/cryptomator/ui/error/ErrorController.java index 3feb3ff44..deb114116 100644 --- a/src/main/java/org/cryptomator/ui/error/ErrorController.java +++ b/src/main/java/org/cryptomator/ui/error/ErrorController.java @@ -42,7 +42,7 @@ public class ErrorController implements FxController { private static final ObjectMapper JSON = new ObjectMapper(); private static final Logger LOG = LoggerFactory.getLogger(ErrorController.class); - private static final String ERROR_CODES_URL = "https://api.cryptomator.org/desktop/error-codes.json"; + private static final String ERROR_CODES_URL = "https://api.cryptomator.org/desktop/error-codes.json?error-code=%s"; private static final String SEARCH_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/categories/errors?discussions_q=category:Errors+%s"; private static final String REPORT_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/new?category=Errors&title=Error+%s&body=%s"; private static final String SEARCH_ERRORCODE_DELIM = " OR "; @@ -146,7 +146,7 @@ public class ErrorController implements FxController { askedForLookupDatabasePermission.set(true); HttpClient httpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build(); HttpRequest httpRequest = HttpRequest.newBuilder()// - .uri(URI.create(ERROR_CODES_URL))// + .uri(URI.create(ERROR_CODES_URL.formatted(errorCode.toString())))// .build(); httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofInputStream())// .thenAcceptAsync(this::loadHttpResponse, executorService)// From 666cd4a4f05367a4a5723d1fcec9b3517bd6c451 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Tue, 12 Sep 2023 17:14:45 +0200 Subject: [PATCH 10/31] enhanced request URI with URLEncoder for errorCode --- src/main/java/org/cryptomator/ui/error/ErrorController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/cryptomator/ui/error/ErrorController.java b/src/main/java/org/cryptomator/ui/error/ErrorController.java index deb114116..686d219e1 100644 --- a/src/main/java/org/cryptomator/ui/error/ErrorController.java +++ b/src/main/java/org/cryptomator/ui/error/ErrorController.java @@ -146,7 +146,7 @@ public class ErrorController implements FxController { askedForLookupDatabasePermission.set(true); HttpClient httpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build(); HttpRequest httpRequest = HttpRequest.newBuilder()// - .uri(URI.create(ERROR_CODES_URL.formatted(errorCode.toString())))// + .uri(URI.create(ERROR_CODES_URL.formatted(URLEncoder.encode(errorCode.toString(),StandardCharsets.UTF_8))))// .build(); httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofInputStream())// .thenAcceptAsync(this::loadHttpResponse, executorService)// From 5d7906972b0c59d877c391573d44ed8b9c64e1f4 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Tue, 12 Sep 2023 17:59:08 +0200 Subject: [PATCH 11/31] added user-agent header with / to HttpRequest --- .../org/cryptomator/ui/error/ErrorController.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/error/ErrorController.java b/src/main/java/org/cryptomator/ui/error/ErrorController.java index 686d219e1..856d8599f 100644 --- a/src/main/java/org/cryptomator/ui/error/ErrorController.java +++ b/src/main/java/org/cryptomator/ui/error/ErrorController.java @@ -6,6 +6,7 @@ import org.cryptomator.common.Environment; import org.cryptomator.common.ErrorCode; import org.cryptomator.common.Nullable; import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.fxapp.UpdateChecker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +43,8 @@ public class ErrorController implements FxController { private static final ObjectMapper JSON = new ObjectMapper(); private static final Logger LOG = LoggerFactory.getLogger(ErrorController.class); - private static final String ERROR_CODES_URL = "https://api.cryptomator.org/desktop/error-codes.json?error-code=%s"; + private static final String USER_AGENT_VERSION_FORMAT = "Cryptomator/%s"; + private static final String ERROR_CODES_URL_FORMAT = "https://api.cryptomator.org/desktop/error-codes.json?error-code=%s"; private static final String SEARCH_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/categories/errors?discussions_q=category:Errors+%s"; private static final String REPORT_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/new?category=Errors&title=Error+%s&body=%s"; private static final String SEARCH_ERRORCODE_DELIM = " OR "; @@ -67,6 +69,7 @@ public class ErrorController implements FxController { private final Stage window; private final Environment environment; private final ExecutorService executorService; + private final UpdateChecker updateChecker; private final BooleanProperty copiedDetails = new SimpleBooleanProperty(); private final ObjectProperty matchingErrorDiscussion = new SimpleObjectProperty<>(); @@ -75,7 +78,7 @@ public class ErrorController implements FxController { private final BooleanProperty askedForLookupDatabasePermission = new SimpleBooleanProperty(); @Inject - ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window, Environment environment, ExecutorService executorService) { + ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window, Environment environment, ExecutorService executorService, UpdateChecker updateChecker) { this.application = application; this.stackTrace = stackTrace; this.errorCode = errorCode; @@ -83,6 +86,7 @@ public class ErrorController implements FxController { this.window = window; this.environment = environment; this.executorService = executorService; + this.updateChecker = updateChecker; } @FXML @@ -146,7 +150,8 @@ public class ErrorController implements FxController { askedForLookupDatabasePermission.set(true); HttpClient httpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build(); HttpRequest httpRequest = HttpRequest.newBuilder()// - .uri(URI.create(ERROR_CODES_URL.formatted(URLEncoder.encode(errorCode.toString(),StandardCharsets.UTF_8))))// + .header("User-Agent", USER_AGENT_VERSION_FORMAT.formatted(updateChecker.getCurrentVersion())) + .uri(URI.create(ERROR_CODES_URL_FORMAT.formatted(URLEncoder.encode(errorCode.toString(),StandardCharsets.UTF_8))))// .build(); httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofInputStream())// .thenAcceptAsync(this::loadHttpResponse, executorService)// From 4c836178470b2d1635fdab3a947bd09aed8b7556 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Tue, 12 Sep 2023 18:07:30 +0200 Subject: [PATCH 12/31] fixed build error --- .../java/org/cryptomator/ui/error/ErrorController.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/error/ErrorController.java b/src/main/java/org/cryptomator/ui/error/ErrorController.java index 856d8599f..8fcc01ea8 100644 --- a/src/main/java/org/cryptomator/ui/error/ErrorController.java +++ b/src/main/java/org/cryptomator/ui/error/ErrorController.java @@ -6,7 +6,6 @@ import org.cryptomator.common.Environment; import org.cryptomator.common.ErrorCode; import org.cryptomator.common.Nullable; import org.cryptomator.ui.common.FxController; -import org.cryptomator.ui.fxapp.UpdateChecker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -69,7 +68,6 @@ public class ErrorController implements FxController { private final Stage window; private final Environment environment; private final ExecutorService executorService; - private final UpdateChecker updateChecker; private final BooleanProperty copiedDetails = new SimpleBooleanProperty(); private final ObjectProperty matchingErrorDiscussion = new SimpleObjectProperty<>(); @@ -78,7 +76,7 @@ public class ErrorController implements FxController { private final BooleanProperty askedForLookupDatabasePermission = new SimpleBooleanProperty(); @Inject - ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window, Environment environment, ExecutorService executorService, UpdateChecker updateChecker) { + ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window, Environment environment, ExecutorService executorService) { this.application = application; this.stackTrace = stackTrace; this.errorCode = errorCode; @@ -86,7 +84,6 @@ public class ErrorController implements FxController { this.window = window; this.environment = environment; this.executorService = executorService; - this.updateChecker = updateChecker; } @FXML @@ -150,7 +147,7 @@ public class ErrorController implements FxController { askedForLookupDatabasePermission.set(true); HttpClient httpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build(); HttpRequest httpRequest = HttpRequest.newBuilder()// - .header("User-Agent", USER_AGENT_VERSION_FORMAT.formatted(updateChecker.getCurrentVersion())) + .header("User-Agent", USER_AGENT_VERSION_FORMAT.formatted(environment.getAppVersion())) .uri(URI.create(ERROR_CODES_URL_FORMAT.formatted(URLEncoder.encode(errorCode.toString(),StandardCharsets.UTF_8))))// .build(); httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofInputStream())// From 9d640b57cee557541b5b46db46a8cde234fbe10a Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Wed, 13 Sep 2023 12:31:53 +0200 Subject: [PATCH 13/31] added build number to user-agent header --- src/main/java/org/cryptomator/ui/error/ErrorController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/error/ErrorController.java b/src/main/java/org/cryptomator/ui/error/ErrorController.java index 8fcc01ea8..5009229b5 100644 --- a/src/main/java/org/cryptomator/ui/error/ErrorController.java +++ b/src/main/java/org/cryptomator/ui/error/ErrorController.java @@ -42,7 +42,7 @@ public class ErrorController implements FxController { private static final ObjectMapper JSON = new ObjectMapper(); private static final Logger LOG = LoggerFactory.getLogger(ErrorController.class); - private static final String USER_AGENT_VERSION_FORMAT = "Cryptomator/%s"; + private static final String USER_AGENT_VERSION_FORMAT = "Cryptomator/%s (Build %s)"; private static final String ERROR_CODES_URL_FORMAT = "https://api.cryptomator.org/desktop/error-codes.json?error-code=%s"; private static final String SEARCH_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/categories/errors?discussions_q=category:Errors+%s"; private static final String REPORT_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/new?category=Errors&title=Error+%s&body=%s"; @@ -147,7 +147,7 @@ public class ErrorController implements FxController { askedForLookupDatabasePermission.set(true); HttpClient httpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build(); HttpRequest httpRequest = HttpRequest.newBuilder()// - .header("User-Agent", USER_AGENT_VERSION_FORMAT.formatted(environment.getAppVersion())) + .header("User-Agent", USER_AGENT_VERSION_FORMAT.formatted(environment.getAppVersion(),environment.getBuildNumber().orElse("undefined"))) .uri(URI.create(ERROR_CODES_URL_FORMAT.formatted(URLEncoder.encode(errorCode.toString(),StandardCharsets.UTF_8))))// .build(); httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofInputStream())// From bcb970afb1639fe5869a3670fbb9d2eeb8e0d2c6 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Wed, 13 Sep 2023 13:59:50 +0200 Subject: [PATCH 14/31] Update bug.yml Add missing FUSE option in volume type selection --- .github/ISSUE_TEMPLATE/bug.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 6c30aa606..9ced33c15 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -43,6 +43,7 @@ body: - WinFsp (Local Drive) - FUSE-T - macFUSE + - FUSE - WebDAV (Windows Explorer) - WebDAV (AppleScript) - WebDAV (gio) @@ -95,4 +96,4 @@ body: id: further-info attributes: label: Anything else? - description: Links? References? Screenshots? Configurations? Any data that might be necessary to reproduce the issue? \ No newline at end of file + description: Links? References? Screenshots? Configurations? Any data that might be necessary to reproduce the issue? From 84ac803a7d8dfa3682b25627c3c7b4ae8a3a86cd Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Mon, 18 Sep 2023 10:10:50 +0200 Subject: [PATCH 15/31] reordered properties [ci skip] --- .../org/cryptomator/common/Environment.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/cryptomator/common/Environment.java b/src/main/java/org/cryptomator/common/Environment.java index c47870dd8..8e378b93d 100644 --- a/src/main/java/org/cryptomator/common/Environment.java +++ b/src/main/java/org/cryptomator/common/Environment.java @@ -43,15 +43,15 @@ public class Environment { logCryptomatorSystemProperty(SETTINGS_PATH_PROP_NAME); logCryptomatorSystemProperty(IPC_SOCKET_PATH_PROP_NAME); logCryptomatorSystemProperty(KEYCHAIN_PATHS_PROP_NAME); + logCryptomatorSystemProperty(P12_PATH_PROP_NAME); logCryptomatorSystemProperty(LOG_DIR_PROP_NAME); logCryptomatorSystemProperty(LOOPBACK_ALIAS_PROP_NAME); - logCryptomatorSystemProperty(PLUGIN_DIR_PROP_NAME); logCryptomatorSystemProperty(MOUNTPOINT_DIR_PROP_NAME); logCryptomatorSystemProperty(MIN_PW_LENGTH_PROP_NAME); logCryptomatorSystemProperty(APP_VERSION_PROP_NAME); logCryptomatorSystemProperty(BUILD_NUMBER_PROP_NAME); + logCryptomatorSystemProperty(PLUGIN_DIR_PROP_NAME); logCryptomatorSystemProperty(TRAY_ICON_PROP_NAME); - logCryptomatorSystemProperty(P12_PATH_PROP_NAME); } public static Environment getInstance() { @@ -74,10 +74,6 @@ public class Environment { return getPaths(SETTINGS_PATH_PROP_NAME); } - public Stream getP12Path() { - return getPaths(P12_PATH_PROP_NAME); - } - public Stream getIpcSocketPath() { return getPaths(IPC_SOCKET_PATH_PROP_NAME); } @@ -86,6 +82,10 @@ public class Environment { return getPaths(KEYCHAIN_PATHS_PROP_NAME); } + public Stream getP12Path() { + return getPaths(P12_PATH_PROP_NAME); + } + public Optional getLogDir() { return getPath(LOG_DIR_PROP_NAME); } @@ -94,14 +94,14 @@ public class Environment { return Optional.ofNullable(System.getProperty(LOOPBACK_ALIAS_PROP_NAME)); } - public Optional getPluginDir() { - return getPath(PLUGIN_DIR_PROP_NAME); - } - public Optional getMountPointsDir() { return getPath(MOUNTPOINT_DIR_PROP_NAME); } + public int getMinPwLength() { + return Integer.getInteger(MIN_PW_LENGTH_PROP_NAME, DEFAULT_MIN_PW_LENGTH); + } + /** * Returns the app version defined in the {@value APP_VERSION_PROP_NAME} property or returns "SNAPSHOT". * @@ -115,8 +115,8 @@ public class Environment { return Optional.ofNullable(System.getProperty(BUILD_NUMBER_PROP_NAME)); } - public int getMinPwLength() { - return Integer.getInteger(MIN_PW_LENGTH_PROP_NAME, DEFAULT_MIN_PW_LENGTH); + public Optional getPluginDir() { + return getPath(PLUGIN_DIR_PROP_NAME); } public boolean showTrayIcon() { From e31e06b288be0be0e58ffe4ae7ed925819896277 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Mon, 18 Sep 2023 10:13:51 +0200 Subject: [PATCH 16/31] added `@VisibleForTesting` --- src/main/java/org/cryptomator/common/Environment.java | 3 ++- src/main/java/org/cryptomator/common/ErrorCode.java | 5 +++-- .../cryptomator/common/mount/MountWithinParentUtil.java | 9 +++++---- .../org/cryptomator/common/settings/VaultSettings.java | 3 ++- .../org/cryptomator/launcher/FileOpenRequestHandler.java | 3 ++- .../cryptomator/ui/addvaultwizard/ReadmeGenerator.java | 6 ++++-- .../ui/convertvault/HubToPasswordConvertController.java | 7 ++++--- .../cryptomator/ui/recoverykey/RecoveryKeyFactory.java | 3 ++- 8 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/cryptomator/common/Environment.java b/src/main/java/org/cryptomator/common/Environment.java index 8e378b93d..17816df96 100644 --- a/src/main/java/org/cryptomator/common/Environment.java +++ b/src/main/java/org/cryptomator/common/Environment.java @@ -2,6 +2,7 @@ package org.cryptomator.common; import com.google.common.base.Splitter; import com.google.common.base.Strings; +import org.jetbrains.annotations.VisibleForTesting; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -128,7 +129,7 @@ public class Environment { return Optional.ofNullable(value).map(Paths::get); } - // visible for testing + @VisibleForTesting Stream getPaths(String propertyName) { Stream rawSettingsPaths = getRawList(propertyName, System.getProperty("path.separator").charAt(0)); return rawSettingsPaths.filter(Predicate.not(Strings::isNullOrEmpty)).map(Path::of); diff --git a/src/main/java/org/cryptomator/common/ErrorCode.java b/src/main/java/org/cryptomator/common/ErrorCode.java index 7363e2278..d75ab97d0 100644 --- a/src/main/java/org/cryptomator/common/ErrorCode.java +++ b/src/main/java/org/cryptomator/common/ErrorCode.java @@ -3,6 +3,7 @@ package org.cryptomator.common; import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.common.base.Throwables; +import org.jetbrains.annotations.VisibleForTesting; import java.util.Locale; import java.util.Objects; @@ -114,7 +115,7 @@ public class ErrorCode { * @param bottomFrames Other stack frames, potentially forming the bottom of the stack of allFrames * @return The number of additional frames in allFrames. In most cases this should be equal to the difference in size. */ - // visible for testing + @VisibleForTesting static int countTopmostFrames(StackTraceElement[] allFrames, StackTraceElement[] bottomFrames) { if (allFrames.length < bottomFrames.length) { // if frames had been stacked on top of bottomFrames, allFrames would be larger @@ -124,7 +125,7 @@ public class ErrorCode { } } - // visible for testing + @VisibleForTesting static int commonSuffixLength(T[] set, T[] subset) { Preconditions.checkArgument(set.length >= subset.length); // iterate items backwards as long as they are identical diff --git a/src/main/java/org/cryptomator/common/mount/MountWithinParentUtil.java b/src/main/java/org/cryptomator/common/mount/MountWithinParentUtil.java index b632923a8..b436bc19a 100644 --- a/src/main/java/org/cryptomator/common/mount/MountWithinParentUtil.java +++ b/src/main/java/org/cryptomator/common/mount/MountWithinParentUtil.java @@ -1,6 +1,7 @@ package org.cryptomator.common.mount; import org.apache.commons.lang3.SystemUtils; +import org.jetbrains.annotations.VisibleForTesting; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -66,7 +67,7 @@ public final class MountWithinParentUtil { } } - //visible for testing + @VisibleForTesting static MountPointState getMountPointState(Path path) throws IOException, IllegalMountPointException { if (Files.notExists(path, LinkOption.NOFOLLOW_LINKS)) { return MountPointState.NOT_EXISTING; @@ -82,7 +83,7 @@ public final class MountWithinParentUtil { return MountPointState.BROKEN_JUNCTION; } - //visible for testing + @VisibleForTesting enum MountPointState { NOT_EXISTING, @@ -93,7 +94,7 @@ public final class MountWithinParentUtil { } - //visible for testing + @VisibleForTesting static void removeResidualHideaway(Path mountPoint, Path hideaway) throws IOException { checkIsHideawayDirectory(mountPoint, hideaway); Files.delete(hideaway); //Fails if not empty @@ -155,7 +156,7 @@ public final class MountWithinParentUtil { } } - //visible for testing + @VisibleForTesting static Path getHideaway(Path mountPoint) { return mountPoint.resolveSibling(HIDEAWAY_PREFIX + mountPoint.getFileName().toString() + HIDEAWAY_SUFFIX); } diff --git a/src/main/java/org/cryptomator/common/settings/VaultSettings.java b/src/main/java/org/cryptomator/common/settings/VaultSettings.java index 7b7e319c9..6662f61ff 100644 --- a/src/main/java/org/cryptomator/common/settings/VaultSettings.java +++ b/src/main/java/org/cryptomator/common/settings/VaultSettings.java @@ -9,6 +9,7 @@ import com.google.common.base.CharMatcher; import com.google.common.base.Strings; import com.google.common.io.BaseEncoding; import org.apache.commons.lang3.SystemUtils; +import org.jetbrains.annotations.VisibleForTesting; import javafx.beans.Observable; import javafx.beans.binding.Bindings; @@ -126,7 +127,7 @@ public class VaultSettings { return json; } - //visible for testing + @VisibleForTesting static String normalizeDisplayName(String original) { if (original.isBlank() || ".".equals(original) || "..".equals(original)) { return "_"; diff --git a/src/main/java/org/cryptomator/launcher/FileOpenRequestHandler.java b/src/main/java/org/cryptomator/launcher/FileOpenRequestHandler.java index eb2418c69..dbdb37823 100644 --- a/src/main/java/org/cryptomator/launcher/FileOpenRequestHandler.java +++ b/src/main/java/org/cryptomator/launcher/FileOpenRequestHandler.java @@ -6,6 +6,7 @@ *******************************************************************************/ package org.cryptomator.launcher; +import org.jetbrains.annotations.VisibleForTesting; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,7 +49,7 @@ class FileOpenRequestHandler { handleLaunchArgs(FileSystems.getDefault(), args); } - // visible for testing + @VisibleForTesting void handleLaunchArgs(FileSystem fs, List args) { Collection pathsToOpen = args.stream().map(str -> { try { diff --git a/src/main/java/org/cryptomator/ui/addvaultwizard/ReadmeGenerator.java b/src/main/java/org/cryptomator/ui/addvaultwizard/ReadmeGenerator.java index 5cf14444a..2ffda4d73 100644 --- a/src/main/java/org/cryptomator/ui/addvaultwizard/ReadmeGenerator.java +++ b/src/main/java/org/cryptomator/ui/addvaultwizard/ReadmeGenerator.java @@ -1,5 +1,7 @@ package org.cryptomator.ui.addvaultwizard; +import org.jetbrains.annotations.VisibleForTesting; + import javax.inject.Inject; import java.util.List; import java.util.ResourceBundle; @@ -51,7 +53,7 @@ public class ReadmeGenerator { resourceBundle.getString("addvault.new.readme.accessLocation.4"))); } - // visible for testing + @VisibleForTesting String createDocument(Iterable paragraphs) { StringBuilder sb = new StringBuilder(RTF_HEADER); for (String p : paragraphs) { @@ -63,7 +65,7 @@ public class ReadmeGenerator { return sb.toString(); } - // visible for testing + @VisibleForTesting String escapeNonAsciiChars(CharSequence input) { StringBuilder sb = new StringBuilder(); appendEscaped(sb, input); diff --git a/src/main/java/org/cryptomator/ui/convertvault/HubToPasswordConvertController.java b/src/main/java/org/cryptomator/ui/convertvault/HubToPasswordConvertController.java index 51ff65ec1..fd6d49b89 100644 --- a/src/main/java/org/cryptomator/ui/convertvault/HubToPasswordConvertController.java +++ b/src/main/java/org/cryptomator/ui/convertvault/HubToPasswordConvertController.java @@ -16,6 +16,7 @@ import org.cryptomator.ui.common.FxmlFile; import org.cryptomator.ui.common.FxmlScene; import org.cryptomator.ui.fxapp.FxApplicationWindows; import org.cryptomator.ui.recoverykey.RecoveryKeyFactory; +import org.jetbrains.annotations.VisibleForTesting; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -116,7 +117,7 @@ public class HubToPasswordConvertController implements FxController { }, Platform::runLater); // } - //visible for testing + @VisibleForTesting void convertInternal() throws CompletionException, IllegalArgumentException { var passphrase = newPasswordController.getNewPassword(); var vaultPath = vault.getPath(); @@ -141,7 +142,7 @@ public class HubToPasswordConvertController implements FxController { } } - //visible for testing + @VisibleForTesting void backupHubConfig(Path hubConfigPath) throws IOException { byte[] hubConfigBytes = Files.readAllBytes(hubConfigPath); Path backupPath = hubConfigPath.resolveSibling(VAULTCONFIG_FILENAME + BackupHelper.generateFileIdSuffix(hubConfigBytes) + MASTERKEY_BACKUP_SUFFIX); @@ -149,7 +150,7 @@ public class HubToPasswordConvertController implements FxController { LOG.debug("Successfully created hub config backup {}", backupPath.getFileName()); } - //visible for testing + @VisibleForTesting Path createPasswordConfig(Path passwordConfigPath, Path masterkeyFile, Passphrase passphrase) throws IOException, MasterkeyLoadingFailedException { var unverifiedVaultConfig = vault.getVaultConfigCache().get(); try (var masterkey = masterkeyFileAccess.load(masterkeyFile, passphrase)) { diff --git a/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyFactory.java b/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyFactory.java index 73279396d..8f5bb0500 100644 --- a/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyFactory.java +++ b/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyFactory.java @@ -8,6 +8,7 @@ import org.cryptomator.cryptolib.api.InvalidPassphraseException; import org.cryptomator.cryptolib.api.Masterkey; import org.cryptomator.cryptolib.common.MasterkeyFileAccess; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.VisibleForTesting; import javax.inject.Inject; import javax.inject.Singleton; @@ -58,7 +59,7 @@ public class RecoveryKeyFactory { } } - // visible for testing + @VisibleForTesting String createRecoveryKey(byte[] rawKey) { Preconditions.checkArgument(rawKey.length == 64, "key should be 64 bytes"); byte[] paddedKey = Arrays.copyOf(rawKey, 66); From 6017d6b7a904a2d039a4c27d674f032a20a6fc3e Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Mon, 18 Sep 2023 12:34:49 +0200 Subject: [PATCH 17/31] bump webdav-nio-adapter containing fixes for CVE-2023-40167, CVE-2023-2976, CVE-2023-37895 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5e2e46028..311fcaf58 100644 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,7 @@ 1.3.0-beta6 3.0.0 2.0.0 - 2.0.3 + 2.0.4 3.13.0 From c5d6c0ce9839ad620098c8049614d81a874780a0 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Mon, 18 Sep 2023 13:03:09 +0200 Subject: [PATCH 18/31] add `cryptomator.disableUpdateCheck` property --- .../java/org/cryptomator/common/Environment.java | 6 ++++++ .../java/org/cryptomator/ui/fxapp/FxApplication.java | 9 +++++++-- .../java/org/cryptomator/ui/fxapp/UpdateChecker.java | 12 ++++++------ .../ui/preferences/PreferencesController.java | 8 +++++++- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/cryptomator/common/Environment.java b/src/main/java/org/cryptomator/common/Environment.java index 17816df96..981b3729b 100644 --- a/src/main/java/org/cryptomator/common/Environment.java +++ b/src/main/java/org/cryptomator/common/Environment.java @@ -32,6 +32,7 @@ public class Environment { private static final String BUILD_NUMBER_PROP_NAME = "cryptomator.buildNumber"; private static final String PLUGIN_DIR_PROP_NAME = "cryptomator.pluginDir"; private static final String TRAY_ICON_PROP_NAME = "cryptomator.showTrayIcon"; + private static final String DISABLE_UPDATE_CHECK_PROP_NAME = "cryptomator.disableUpdateCheck"; private Environment() {} @@ -53,6 +54,7 @@ public class Environment { logCryptomatorSystemProperty(BUILD_NUMBER_PROP_NAME); logCryptomatorSystemProperty(PLUGIN_DIR_PROP_NAME); logCryptomatorSystemProperty(TRAY_ICON_PROP_NAME); + logCryptomatorSystemProperty(DISABLE_UPDATE_CHECK_PROP_NAME); } public static Environment getInstance() { @@ -124,6 +126,10 @@ public class Environment { return Boolean.getBoolean(TRAY_ICON_PROP_NAME); } + public boolean disableUpdateCheck() { + return Boolean.getBoolean(DISABLE_UPDATE_CHECK_PROP_NAME); + } + private Optional getPath(String propertyName) { String value = System.getProperty(propertyName); return Optional.ofNullable(value).map(Paths::get); diff --git a/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java b/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java index d845655cf..711a0fa44 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java +++ b/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java @@ -1,6 +1,7 @@ package org.cryptomator.ui.fxapp; import dagger.Lazy; +import org.cryptomator.common.Environment; import org.cryptomator.common.settings.Settings; import org.cryptomator.ui.traymenu.TrayMenuComponent; import org.slf4j.Logger; @@ -17,6 +18,7 @@ public class FxApplication { private static final Logger LOG = LoggerFactory.getLogger(FxApplication.class); private final long startupTime; + private final Environment environment; private final Settings settings; private final AppLaunchEventHandler launchEventHandler; private final Lazy trayMenu; @@ -26,8 +28,9 @@ public class FxApplication { private final AutoUnlocker autoUnlocker; @Inject - FxApplication(@Named("startupTime") long startupTime, Settings settings, AppLaunchEventHandler launchEventHandler, Lazy trayMenu, FxApplicationWindows appWindows, FxApplicationStyle applicationStyle, FxApplicationTerminator applicationTerminator, AutoUnlocker autoUnlocker) { + FxApplication(@Named("startupTime") long startupTime, Environment environment, Settings settings, AppLaunchEventHandler launchEventHandler, Lazy trayMenu, FxApplicationWindows appWindows, FxApplicationStyle applicationStyle, FxApplicationTerminator applicationTerminator, AutoUnlocker autoUnlocker) { this.startupTime = startupTime; + this.environment = environment; this.settings = settings; this.launchEventHandler = launchEventHandler; this.trayMenu = trayMenu; @@ -68,7 +71,9 @@ public class FxApplication { return null; }); - appWindows.checkAndShowUpdateReminderWindow(); + if (!environment.disableUpdateCheck()) { + appWindows.checkAndShowUpdateReminderWindow(); + } launchEventHandler.startHandlingLaunchEvents(); autoUnlocker.tryUnlockForTimespan(2, TimeUnit.MINUTES); diff --git a/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java b/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java index 4418f79b5..709eb2fe7 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java +++ b/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java @@ -22,23 +22,23 @@ public class UpdateChecker { private static final Logger LOG = LoggerFactory.getLogger(UpdateChecker.class); private static final Duration AUTOCHECK_DELAY = Duration.seconds(5); + private final Environment env; private final Settings settings; - private final String currentVersion; private final StringProperty latestVersionProperty; private final Comparator semVerComparator; private final ScheduledService updateCheckerService; @Inject UpdateChecker(Settings settings, Environment env, @Named("latestVersion") StringProperty latestVersionProperty, @Named("SemVer") Comparator semVerComparator, ScheduledService updateCheckerService) { + this.env = env; this.settings = settings; this.latestVersionProperty = latestVersionProperty; this.semVerComparator = semVerComparator; this.updateCheckerService = updateCheckerService; - this.currentVersion = env.getAppVersion(); } public void automaticallyCheckForUpdatesIfEnabled() { - if (settings.checkForUpdates.get()) { + if (!env.disableUpdateCheck() && settings.checkForUpdates.get()) { startCheckingForUpdates(AUTOCHECK_DELAY); } } @@ -63,9 +63,9 @@ public class UpdateChecker { private void checkSucceeded(WorkerStateEvent event) { String latestVersion = updateCheckerService.getValue(); - LOG.info("Current version: {}, lastest version: {}", currentVersion, latestVersion); + LOG.info("Current version: {}, lastest version: {}", getCurrentVersion(), latestVersion); - if (semVerComparator.compare(currentVersion, latestVersion) < 0) { + if (semVerComparator.compare(getCurrentVersion(), latestVersion) < 0) { // update is available latestVersionProperty.set(latestVersion); } else { @@ -88,7 +88,7 @@ public class UpdateChecker { } public String getCurrentVersion() { - return currentVersion; + return env.getAppVersion(); } } diff --git a/src/main/java/org/cryptomator/ui/preferences/PreferencesController.java b/src/main/java/org/cryptomator/ui/preferences/PreferencesController.java index caaaf7d80..0937fccd9 100644 --- a/src/main/java/org/cryptomator/ui/preferences/PreferencesController.java +++ b/src/main/java/org/cryptomator/ui/preferences/PreferencesController.java @@ -1,5 +1,6 @@ package org.cryptomator.ui.preferences; +import org.cryptomator.common.Environment; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.fxapp.UpdateChecker; import org.slf4j.Logger; @@ -19,6 +20,7 @@ public class PreferencesController implements FxController { private static final Logger LOG = LoggerFactory.getLogger(PreferencesController.class); + private final Environment env; private final Stage window; private final ObjectProperty selectedTabProperty; private final BooleanBinding updateAvailable; @@ -31,7 +33,8 @@ public class PreferencesController implements FxController { public Tab aboutTab; @Inject - public PreferencesController(@PreferencesWindow Stage window, ObjectProperty selectedTabProperty, UpdateChecker updateChecker) { + public PreferencesController(Environment env, @PreferencesWindow Stage window, ObjectProperty selectedTabProperty, UpdateChecker updateChecker) { + this.env = env; this.window = window; this.selectedTabProperty = selectedTabProperty; this.updateAvailable = updateChecker.latestVersionProperty().isNotNull(); @@ -42,6 +45,9 @@ public class PreferencesController implements FxController { window.setOnShowing(this::windowWillAppear); selectedTabProperty.addListener(observable -> this.selectChosenTab()); tabPane.getSelectionModel().selectedItemProperty().addListener(observable -> this.selectedTabChanged()); + if (env.disableUpdateCheck()) { + tabPane.getTabs().remove(updatesTab); + } } private void selectChosenTab() { From 47bd0ca64738e6b218b4ba81af4be788d252b11d Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Mon, 18 Sep 2023 13:10:19 +0200 Subject: [PATCH 19/31] disable update check for PPA builds --- .github/workflows/debian.yml | 3 ++- dist/linux/debian/rules | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/debian.yml b/.github/workflows/debian.yml index 14cdca80a..2ae6c3262 100644 --- a/.github/workflows/debian.yml +++ b/.github/workflows/debian.yml @@ -97,7 +97,8 @@ jobs: run: | cp -r dist/linux/debian/ pkgdir export RFC2822_TIMESTAMP=`date --rfc-2822` - envsubst '${SEMVER_STR} ${VERSION_NUM} ${REVISION_NUM}' < dist/linux/debian/rules > pkgdir/debian/rules + export DISABLE_UPDATE_CHECK=${{ inputs.dput }} + envsubst '${SEMVER_STR} ${VERSION_NUM} ${REVISION_NUM} ${DISABLE_UPDATE_CHECK}' < dist/linux/debian/rules > pkgdir/debian/rules envsubst '${PPA_VERSION} ${RFC2822_TIMESTAMP}' < dist/linux/debian/changelog > pkgdir/debian/changelog find . -name "*.jar" >> pkgdir/debian/source/include-binaries mv pkgdir cryptomator_${{ inputs.ppaver }} diff --git a/dist/linux/debian/rules b/dist/linux/debian/rules index 231f2a1d5..c12879025 100755 --- a/dist/linux/debian/rules +++ b/dist/linux/debian/rules @@ -59,6 +59,7 @@ override_dh_auto_build: --java-options "-Dcryptomator.integrationsLinux.trayIconsDir=\"/usr/share/icons/hicolor/symbolic/apps\"" \ --java-options "-Dcryptomator.buildNumber=\"deb-${REVISION_NUM}\"" \ --java-options "-Dcryptomator.appVersion=\"${SEMVER_STR}\"" \ + --java-options "-Dcryptomator.disableUpdateCheck=\"${DISABLE_UPDATE_CHECK}\"" \ --app-version "${VERSION_NUM}.${REVISION_NUM}" \ --resource-dir resources \ --verbose From 1657cd50fc89922f64c69939a4a82d5693fbb470 Mon Sep 17 00:00:00 2001 From: Tobias Hagemann Date: Tue, 19 Sep 2023 12:12:27 +0200 Subject: [PATCH 20/31] fixes #3112 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 311fcaf58..9034aba9d 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ 1.3.0 1.2.2 1.2.1 - 1.3.0-beta6 + 1.3.0 3.0.0 2.0.0 2.0.4 From 5554dfdd89767552d3e718d8663ae0c0c9827fa8 Mon Sep 17 00:00:00 2001 From: Tobias Hagemann Date: Tue, 19 Sep 2023 12:22:24 +0200 Subject: [PATCH 21/31] fixes #3121 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9034aba9d..0edfaa862 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,7 @@ 2.6.7 1.3.0 1.2.2 - 1.2.1 + 1.2.2 1.3.0 3.0.0 2.0.0 From d6a7efcb7f0b98aeddfc6b263a999437685057af Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Tue, 19 Sep 2023 14:00:45 +0200 Subject: [PATCH 22/31] added OS_NAME, OS_VERSION and OS_ARCH to user-agent --- .../org/cryptomator/ui/error/ErrorController.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/error/ErrorController.java b/src/main/java/org/cryptomator/ui/error/ErrorController.java index 5009229b5..0ca8c9dcd 100644 --- a/src/main/java/org/cryptomator/ui/error/ErrorController.java +++ b/src/main/java/org/cryptomator/ui/error/ErrorController.java @@ -2,6 +2,7 @@ package org.cryptomator.ui.error; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.lang3.SystemUtils; import org.cryptomator.common.Environment; import org.cryptomator.common.ErrorCode; import org.cryptomator.common.Nullable; @@ -42,7 +43,7 @@ public class ErrorController implements FxController { private static final ObjectMapper JSON = new ObjectMapper(); private static final Logger LOG = LoggerFactory.getLogger(ErrorController.class); - private static final String USER_AGENT_VERSION_FORMAT = "Cryptomator/%s (Build %s)"; + private static final String USER_AGENT_VERSION_FORMAT = "Cryptomator/%s (Build %s) %s %s (%s)"; private static final String ERROR_CODES_URL_FORMAT = "https://api.cryptomator.org/desktop/error-codes.json?error-code=%s"; private static final String SEARCH_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/categories/errors?discussions_q=category:Errors+%s"; private static final String REPORT_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/new?category=Errors&title=Error+%s&body=%s"; @@ -143,11 +144,17 @@ public class ErrorController implements FxController { @FXML public void lookUpSolution() { + String userAgent = USER_AGENT_VERSION_FORMAT.formatted( // + environment.getAppVersion(), // + environment.getBuildNumber().orElse("undefined"), // + SystemUtils.OS_NAME, // + SystemUtils.OS_VERSION, // + SystemUtils.OS_ARCH); // isLoadingHttpResponse.set(true); askedForLookupDatabasePermission.set(true); HttpClient httpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build(); HttpRequest httpRequest = HttpRequest.newBuilder()// - .header("User-Agent", USER_AGENT_VERSION_FORMAT.formatted(environment.getAppVersion(),environment.getBuildNumber().orElse("undefined"))) + .header("User-Agent", userAgent) .uri(URI.create(ERROR_CODES_URL_FORMAT.formatted(URLEncoder.encode(errorCode.toString(),StandardCharsets.UTF_8))))// .build(); httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofInputStream())// From c40ad58028df8cc2d438858fa4b77a13ed5990d9 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Tue, 19 Sep 2023 15:03:22 +0200 Subject: [PATCH 23/31] detached context menu from button to fix misbehavior --- .../ui/mainwindow/VaultListController.java | 12 +++++-- src/main/resources/fxml/vault_list.fxml | 32 +++++++++---------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java b/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java index 357222b33..889ac290c 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java @@ -22,7 +22,9 @@ import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; import javafx.event.Event; import javafx.fxml.FXML; +import javafx.geometry.Side; import javafx.scene.control.Button; +import javafx.scene.control.ContextMenu; import javafx.scene.control.ListView; import javafx.scene.input.ContextMenuEvent; import javafx.scene.input.DragEvent; @@ -67,6 +69,8 @@ public class VaultListController implements FxController { public ListView vaultList; public StackPane root; public Button addVaultBtn; + @FXML + private ContextMenu addVaultContextMenu; @Inject VaultListController(@MainWindow Stage mainWindow, // @@ -146,9 +150,11 @@ public class VaultListController implements FxController { @FXML private void showMenu() { - double screenX = addVaultBtn.localToScreen(addVaultBtn.getBoundsInLocal()).getMinX(); - double screenY = addVaultBtn.localToScreen(addVaultBtn.getBoundsInLocal()).getMaxY(); - addVaultBtn.getContextMenu().show(addVaultBtn, screenX, screenY); + if (addVaultContextMenu.isShowing()) { + addVaultContextMenu.hide(); + } else { + addVaultContextMenu.show(addVaultBtn, Side.BOTTOM, 0.0, 0.0); + } } private void deselect(MouseEvent released) { diff --git a/src/main/resources/fxml/vault_list.fxml b/src/main/resources/fxml/vault_list.fxml index 146fa877c..cfa3750a7 100644 --- a/src/main/resources/fxml/vault_list.fxml +++ b/src/main/resources/fxml/vault_list.fxml @@ -32,23 +32,23 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + From 113717f955dc83b13e0ddba5f069abfbb0fa0456 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Tue, 19 Sep 2023 15:12:40 +0200 Subject: [PATCH 24/31] addVaultButton context menu event filter removed --- .../java/org/cryptomator/ui/mainwindow/VaultListController.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java b/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java index 889ac290c..afdb0bb36 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java @@ -144,8 +144,6 @@ public class VaultListController implements FxController { root.setOnDragOver(this::handleDragEvent); root.setOnDragDropped(this::handleDragEvent); root.setOnDragExited(this::handleDragEvent); - - addVaultBtn.addEventFilter(ContextMenuEvent.CONTEXT_MENU_REQUESTED, Event::consume); } @FXML From 76a4062f8b21ab637dad2de91541ec1301dfad9d Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Tue, 19 Sep 2023 15:12:45 +0200 Subject: [PATCH 25/31] update org.cryptomator.integrations:integrations-win from 1.2.2 to 1.2.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0edfaa862..796e73541 100644 --- a/pom.xml +++ b/pom.xml @@ -35,7 +35,7 @@ 2.6.7 1.3.0 - 1.2.2 + 1.2.3 1.2.2 1.3.0 3.0.0 From 9b2987d0a24e5ea0aedd42aa62c013ff0d4a2b11 Mon Sep 17 00:00:00 2001 From: Jan-Peter Klein Date: Tue, 19 Sep 2023 16:26:55 +0200 Subject: [PATCH 26/31] improved function naming --- .../org/cryptomator/ui/mainwindow/VaultListController.java | 3 +-- src/main/resources/fxml/vault_list.fxml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java b/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java index afdb0bb36..8f0a91d58 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java @@ -20,7 +20,6 @@ import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.value.ObservableValue; import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; -import javafx.event.Event; import javafx.fxml.FXML; import javafx.geometry.Side; import javafx.scene.control.Button; @@ -147,7 +146,7 @@ public class VaultListController implements FxController { } @FXML - private void showMenu() { + private void toggleMenu() { if (addVaultContextMenu.isShowing()) { addVaultContextMenu.hide(); } else { diff --git a/src/main/resources/fxml/vault_list.fxml b/src/main/resources/fxml/vault_list.fxml index cfa3750a7..f9cb29258 100644 --- a/src/main/resources/fxml/vault_list.fxml +++ b/src/main/resources/fxml/vault_list.fxml @@ -28,7 +28,7 @@ -