mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-05-14 08:41:28 +00:00
Compare commits
197 Commits
1.19.0
...
feature/tr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9bba863e1a | ||
|
|
25bca27bc0 | ||
|
|
0d3517a555 | ||
|
|
5bb467496a | ||
|
|
9116212bc6 | ||
|
|
4f156faa24 | ||
|
|
2f26c7b8ba | ||
|
|
bf6f1c578e | ||
|
|
0887af6cfc | ||
|
|
e0fa691994 | ||
|
|
f8053f15a4 | ||
|
|
212b29f6aa | ||
|
|
8c3b3fded0 | ||
|
|
e3e1615400 | ||
|
|
3579f43ddd | ||
|
|
66907026a7 | ||
|
|
86580f6a3b | ||
|
|
c75689b1bb | ||
|
|
64194905b8 | ||
|
|
267beac945 | ||
|
|
31c1a01b5b | ||
|
|
19e7ff16cd | ||
|
|
c37eb859e9 | ||
|
|
72ebf4a8ec | ||
|
|
e73ddee69a | ||
|
|
f105c1ad6c | ||
|
|
c62223c82d | ||
|
|
6498d7dbdd | ||
|
|
4be30fa096 | ||
|
|
e11deb5f18 | ||
|
|
c832ed8341 | ||
|
|
7f4f5d8057 | ||
|
|
c654067828 | ||
|
|
823b334535 | ||
|
|
c2b05c715d | ||
|
|
9a8038b003 | ||
|
|
008afb91b6 | ||
|
|
8da8e8317d | ||
|
|
a2cab3ee7f | ||
|
|
eab454e176 | ||
|
|
376bea5640 | ||
|
|
116ec9502d | ||
|
|
9e998d49be | ||
|
|
97d3ed3b18 | ||
|
|
2400993d05 | ||
|
|
5e5ce6705a | ||
|
|
45ce685ad7 | ||
|
|
7ea75217e3 | ||
|
|
875fe45a7e | ||
|
|
344b1f0234 | ||
|
|
6ee8757d74 | ||
|
|
a630404606 | ||
|
|
5ce7fdc4d7 | ||
|
|
c1b456805c | ||
|
|
2ee50babc9 | ||
|
|
106bd5e04f | ||
|
|
971de7bd33 | ||
|
|
6bb977c66d | ||
|
|
605b9f3693 | ||
|
|
1377dd7b9a | ||
|
|
a7b41b8b1d | ||
|
|
2dc1f55593 | ||
|
|
eff3292ec6 | ||
|
|
fdfe6b66f0 | ||
|
|
b37090772d | ||
|
|
87ff7219c3 | ||
|
|
8bf3b443a3 | ||
|
|
b8b25b53ee | ||
|
|
07de47d4cc | ||
|
|
2b1213f671 | ||
|
|
0051ae377c | ||
|
|
9b6bc4ee5a | ||
|
|
4c38659ac9 | ||
|
|
c53893a0ff | ||
|
|
00ec386e18 | ||
|
|
bd70e9a18d | ||
|
|
97190db3a0 | ||
|
|
d67aa9c10a | ||
|
|
4751c81d06 | ||
|
|
0e1132133c | ||
|
|
a40f17e8f1 | ||
|
|
699e22d31a | ||
|
|
9de0981594 | ||
|
|
87fe209b54 | ||
|
|
21cffb13c7 | ||
|
|
9eca05aeb7 | ||
|
|
a653fc3627 | ||
|
|
db31fcad98 | ||
|
|
b82c73f789 | ||
|
|
70d3507e5d | ||
|
|
518b45d149 | ||
|
|
65f2eea6c9 | ||
|
|
12a4a8218a | ||
|
|
76dd4f079c | ||
|
|
b35fb011e0 | ||
|
|
fa1e9c7ca7 | ||
|
|
75bb64b333 | ||
|
|
1f40045b41 | ||
|
|
1951e5e82c | ||
|
|
0be39c5b7d | ||
|
|
6886188ff4 | ||
|
|
3a2de81369 | ||
|
|
4de3ea2892 | ||
|
|
0beb2e3334 | ||
|
|
537d79f3c2 | ||
|
|
10d5f4f530 | ||
|
|
ab0e7e1ea9 | ||
|
|
967a3aa10b | ||
|
|
821649c821 | ||
|
|
7cf75e9dba | ||
|
|
dfe126f827 | ||
|
|
80ce98991c | ||
|
|
579d42ec74 | ||
|
|
047108683f | ||
|
|
830c9196e7 | ||
|
|
7208f23da1 | ||
|
|
b0a4a0bcfa | ||
|
|
f7b13dd121 | ||
|
|
a5ccfa01d2 | ||
|
|
62bf4c5b45 | ||
|
|
7168d7e31d | ||
|
|
3c633f8a34 | ||
|
|
b606a4ee8e | ||
|
|
1af094692f | ||
|
|
c86d8ac6b8 | ||
|
|
b06d65ab43 | ||
|
|
390bdc33e0 | ||
|
|
2284d1fcee | ||
|
|
62a439e10e | ||
|
|
ddad663489 | ||
|
|
f08e7d9b92 | ||
|
|
6c2865a09d | ||
|
|
5a0d15c937 | ||
|
|
53757dab93 | ||
|
|
e1d4d3e85b | ||
|
|
859fe238b8 | ||
|
|
23df40796b | ||
|
|
b98b1326b2 | ||
|
|
2f8831b561 | ||
|
|
4948b9b586 | ||
|
|
838018e72e | ||
|
|
d5433e7a3f | ||
|
|
194e19bf5e | ||
|
|
1358e7098d | ||
|
|
4be327608a | ||
|
|
929ef37ded | ||
|
|
6fce1807f0 | ||
|
|
c1d72650cc | ||
|
|
dab368e44b | ||
|
|
7548174e4f | ||
|
|
b513060744 | ||
|
|
311a9ef70b | ||
|
|
7331144f9d | ||
|
|
d576b36f7b | ||
|
|
7a6340aac6 | ||
|
|
6b82abcd80 | ||
|
|
97bde05422 | ||
|
|
3bc50eee47 | ||
|
|
b95a220de7 | ||
|
|
2896e18429 | ||
|
|
29db91f976 | ||
|
|
1e3dfe3de1 | ||
|
|
dcb1f5e80f | ||
|
|
5c75eeab27 | ||
|
|
8e4bff8c19 | ||
|
|
e066f155b2 | ||
|
|
c3c7a23ccd | ||
|
|
c816411644 | ||
|
|
f752490624 | ||
|
|
d196b66b4e | ||
|
|
d803a1d71e | ||
|
|
c75430cde2 | ||
|
|
f44c3531c7 | ||
|
|
596829bc77 | ||
|
|
096aeb0c54 | ||
|
|
1a12684557 | ||
|
|
998664acc3 | ||
|
|
c52b3fc4ad | ||
|
|
1fde3650ca | ||
|
|
57614f59e4 | ||
|
|
a95883f98b | ||
|
|
6cf18c33a1 | ||
|
|
232e6fbf71 | ||
|
|
d15731d5a4 | ||
|
|
45d7421e4f | ||
|
|
4d0aabfe6e | ||
|
|
db0e266fde | ||
|
|
6281561ab4 | ||
|
|
b981f0dc19 | ||
|
|
bc41429982 | ||
|
|
a31621cfde | ||
|
|
aa68224d63 | ||
|
|
b8413a21a3 | ||
|
|
af59196f19 | ||
|
|
92d11d8bd5 | ||
|
|
300a811510 | ||
|
|
84a966993f |
34
.github/dependabot.yml
vendored
34
.github/dependabot.yml
vendored
@@ -3,10 +3,7 @@ updates:
|
||||
- package-ecosystem: "maven"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
day: "monday"
|
||||
time: "06:00"
|
||||
timezone: "Etc/UTC"
|
||||
interval: "monthly"
|
||||
ignore:
|
||||
- dependency-name: "org.cryptomator:integrations-api"
|
||||
versions: ["2.0.0-alpha1"]
|
||||
@@ -18,36 +15,9 @@ updates:
|
||||
- dependency-name: "org.apache.maven.plugins:maven-surefire-plugin"
|
||||
versions: [ "3.5.4", "3.5.5" ]
|
||||
groups:
|
||||
java-test-dependencies:
|
||||
patterns:
|
||||
- "org.junit.jupiter:*"
|
||||
- "org.mockito:*"
|
||||
- "org.hamcrest:*"
|
||||
- "com.google.jimfs:jimfs"
|
||||
maven-build-plugins:
|
||||
patterns:
|
||||
- "org.apache.maven.plugins:*"
|
||||
- "org.jacoco:jacoco-maven-plugin"
|
||||
- "org.owasp:dependency-check-maven"
|
||||
- "me.fabriciorby:maven-surefire-junit5-tree-reporter"
|
||||
- "org.codehaus.mojo:license-maven-plugin"
|
||||
javafx:
|
||||
patterns:
|
||||
- "org.openjfx:*"
|
||||
java-production-dependencies:
|
||||
maven-dependencies:
|
||||
patterns:
|
||||
- "*"
|
||||
exclude-patterns:
|
||||
- "org.openjfx:*"
|
||||
- "org.apache.maven.plugins:*"
|
||||
- "org.jacoco:jacoco-maven-plugin"
|
||||
- "org.owasp:dependency-check-maven"
|
||||
- "me.fabriciorby:maven-surefire-junit5-tree-reporter"
|
||||
- "org.codehaus.mojo:license-maven-plugin"
|
||||
- "org.junit.jupiter:*"
|
||||
- "org.mockito:*"
|
||||
- "org.hamcrest:*"
|
||||
- "com.google.jimfs:jimfs"
|
||||
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/" # even for `.github/workflows`
|
||||
|
||||
12
.github/workflows/appimage.yml
vendored
12
.github/workflows/appimage.yml
vendored
@@ -3,6 +3,8 @@ name: Build AppImage
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
schedule:
|
||||
- cron: '0 23 20 * *'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
@@ -47,10 +49,12 @@ jobs:
|
||||
arch: x86_64
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_linux-x64_bin-jmods.zip'
|
||||
openjfx-sha: 'e0a9c29d8cf3af9b8b48848b43f87b5785bc107c53a951b19668ce05842bba1b'
|
||||
appimagetool-sha: 'ed4ce84f0d9caff66f50bcca6ff6f35aae54ce8135408b3fa33abfc3cb384eb0'
|
||||
- os: ubuntu-24.04-arm
|
||||
arch: aarch64
|
||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_linux-aarch64_bin-jmods.zip'
|
||||
openjfx-sha: 'c3408f818693cce09e59829a8e862a82c7695fdfcd585c41cfd527f5fc3fe646'
|
||||
appimagetool-sha: 'f0837e7448a0c1e4e650a93bb3e85802546e60654ef287576f46c71c126a9158'
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
- name: Setup Java
|
||||
@@ -123,7 +127,7 @@ jobs:
|
||||
--dest appdir
|
||||
--name Cryptomator
|
||||
--vendor "Skymatic GmbH"
|
||||
--copyright "(C) 2016 - 2025 Skymatic GmbH"
|
||||
--copyright "(C) 2016 - 2026 Skymatic GmbH"
|
||||
--app-version "${SEMVER_NUM}.${REV_NUM}"
|
||||
--java-options "--enable-preview"
|
||||
--java-options "--enable-native-access=javafx.graphics,org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator"
|
||||
@@ -142,6 +146,7 @@ jobs:
|
||||
--java-options "-Dcryptomator.integrationsLinux.trayIconsDir=\"@{appdir}/usr/share/icons/hicolor/symbolic/apps\""
|
||||
--java-options "-Dcryptomator.buildNumber=\"appimage-${REV_NUM}\""
|
||||
--java-options "-Dcryptomator.networking.truststore.p12Path=\"/etc/cryptomator/certs.p12\""
|
||||
--java-options "-Dcryptomator.hub.enableTrustOnFirstUse=true"
|
||||
--java-options "-XX:ErrorFile=/cryptomator/cryptomator_crash.log"
|
||||
--resource-dir dist/linux/resources
|
||||
- name: Patch Cryptomator.AppDir
|
||||
@@ -165,7 +170,8 @@ jobs:
|
||||
ln -s bin/cryptomator.sh Cryptomator.AppDir/AppRun
|
||||
- name: Download AppImageKit
|
||||
run: |
|
||||
curl --silent --fail-with-body --proto "=https" -L "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-${{ matrix.arch }}.AppImage" -o appimagetool.AppImage
|
||||
curl --silent --fail-with-body --proto "=https" -L "https://github.com/AppImage/appimagetool/releases/download/1.9.1/appimagetool-${{ matrix.arch }}.AppImage" -o appimagetool.AppImage
|
||||
echo "${{ matrix.appimagetool-sha }} appimagetool.AppImage" | shasum -a256 --check
|
||||
chmod +x appimagetool.AppImage
|
||||
./appimagetool.AppImage --appimage-extract
|
||||
- name: Prepare GPG-Agent for signing with key 615D449FE6E6A235
|
||||
@@ -195,7 +201,7 @@ jobs:
|
||||
if-no-files-found: error
|
||||
- name: Publish AppImage on GitHub Releases
|
||||
if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published'
|
||||
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0
|
||||
uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1
|
||||
with:
|
||||
fail_on_unmatched_files: true
|
||||
token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }}
|
||||
|
||||
4
.github/workflows/av-whitelist.yml
vendored
4
.github/workflows/av-whitelist.yml
vendored
@@ -63,7 +63,7 @@ jobs:
|
||||
if: inputs.kaspersky
|
||||
steps:
|
||||
- name: Download artifact
|
||||
uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: ${{ needs.download-file.outputs.fileName }}
|
||||
path: upload
|
||||
@@ -83,7 +83,7 @@ jobs:
|
||||
if: inputs.avast
|
||||
steps:
|
||||
- name: Download artifact
|
||||
uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: ${{ needs.download-file.outputs.fileName }}
|
||||
path: upload
|
||||
|
||||
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@@ -29,7 +29,7 @@ jobs:
|
||||
java-version: ${{ env.JAVA_VERSION }}
|
||||
cache: 'maven'
|
||||
- name: Cache SonarCloud packages
|
||||
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
|
||||
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
|
||||
with:
|
||||
path: ~/.sonar/cache
|
||||
key: ${{ runner.os }}-sonar
|
||||
@@ -49,7 +49,7 @@ jobs:
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
- name: Draft a release
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0
|
||||
uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1
|
||||
with:
|
||||
draft: true
|
||||
discussion_category_name: releases
|
||||
|
||||
2
.github/workflows/debian.yml
vendored
2
.github/workflows/debian.yml
vendored
@@ -1,6 +1,8 @@
|
||||
name: Build Debian Package
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 22 20 * *'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
semver:
|
||||
|
||||
85
.github/workflows/flathub.yml
vendored
85
.github/workflows/flathub.yml
vendored
@@ -1,85 +0,0 @@
|
||||
name: Create PR for flathub
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tag:
|
||||
description: 'Release tag'
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
get-version:
|
||||
uses: ./.github/workflows/get-version.yml
|
||||
with:
|
||||
version: ${{ inputs.tag }}
|
||||
tarball:
|
||||
name: Determines tarball url and compute checksum
|
||||
runs-on: ubuntu-latest
|
||||
needs: [get-version]
|
||||
if: github.event_name == 'workflow_dispatch' || needs.get-version.outputs.versionType == 'stable'
|
||||
outputs:
|
||||
url: ${{ steps.url.outputs.url}}
|
||||
sha512: ${{ steps.sha512.outputs.sha512}}
|
||||
steps:
|
||||
- name: Determine tarball url
|
||||
id: url
|
||||
run: |
|
||||
URL="https://github.com/cryptomator/cryptomator/archive/refs/tags/${TAG}.tar.gz"
|
||||
echo "url=${URL}" >> "$GITHUB_OUTPUT"
|
||||
env:
|
||||
TAG: ${{ inputs.tag || github.event.release.tag_name}}
|
||||
- name: Download source tarball and compute checksum
|
||||
id: sha512
|
||||
run: |
|
||||
curl --silent --fail-with-body --proto "=https" -L -H "Accept: application/vnd.github+json" ${{ steps.url.outputs.url }} --output cryptomator.tar.gz
|
||||
TARBALL_SHA512=$(sha512sum cryptomator.tar.gz | cut -d ' ' -f1)
|
||||
echo "sha512=${TARBALL_SHA512}" >> "$GITHUB_OUTPUT"
|
||||
flathub:
|
||||
name: Create PR for flathub
|
||||
runs-on: ubuntu-latest
|
||||
needs: [tarball, get-version]
|
||||
env:
|
||||
FLATHUB_PR_URL: tbd
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
repository: 'flathub/org.cryptomator.Cryptomator'
|
||||
token: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||
- name: Checkout release branch
|
||||
run: |
|
||||
git checkout -b release/${{ needs.get-version.outputs.semVerStr }}
|
||||
- name: Update build file
|
||||
run: |
|
||||
sed -i -e 's/VERSION: [0-9]\+\.[0-9]\+\.[0-9]\+.*/VERSION: ${{ needs.get-version.outputs.semVerStr }}/g' org.cryptomator.Cryptomator.yaml
|
||||
sed -i -e 's/sha512: [0-9A-Za-z_\+-]\{128\} #CRYPTOMATOR/sha512: ${{ needs.tarball.outputs.sha512 }} #CRYPTOMATOR/g' org.cryptomator.Cryptomator.yaml
|
||||
sed -i -e 's;url: https://github.com/cryptomator/cryptomator/archive/refs/tags/[^[:blank:]]\+;url: ${{ needs.tarball.outputs.url }};g' org.cryptomator.Cryptomator.yaml
|
||||
- name: Commit and push
|
||||
run: |
|
||||
git config user.name "${{ github.actor }}"
|
||||
git config user.email "${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com"
|
||||
git config push.autoSetupRemote true
|
||||
git stage .
|
||||
git commit -m "Prepare release ${{needs.get-version.outputs.semVerStr}}"
|
||||
git push
|
||||
- name: Create pull request
|
||||
run: |
|
||||
printf "> [!IMPORTANT]\n> Todos:\n> - [ ] Update maven dependencies\n> - [ ] Check for JDK update\n> - [ ] Check for JFX update" > pr_body.md
|
||||
PR_URL=$(gh pr create --title "Release ${{ needs.get-version.outputs.semVerStr }}" --body-file pr_body.md)
|
||||
echo "FLATHUB_PR_URL=$PR_URL" >> "$GITHUB_ENV"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||
- name: Slack Notification
|
||||
uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # v2.3.3
|
||||
if: github.event_name == 'release'
|
||||
env:
|
||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
|
||||
SLACK_USERNAME: 'Cryptobot'
|
||||
SLACK_ICON: false
|
||||
SLACK_ICON_EMOJI: ':bot:'
|
||||
SLACK_CHANNEL: 'cryptomator-desktop'
|
||||
SLACK_TITLE: "Flathub release PR created for ${{ github.event.repository.name }} ${{ github.event.release.tag_name }} created."
|
||||
SLACK_MESSAGE: "See <${{ env.FLATHUB_PR_URL }}|PR> on how to proceed.>."
|
||||
SLACK_FOOTER: false
|
||||
MSG_MINIMAL: true
|
||||
2
.github/workflows/get-version.yml
vendored
2
.github/workflows/get-version.yml
vendored
@@ -73,6 +73,6 @@ jobs:
|
||||
env:
|
||||
VERSION_STRING: ${{ inputs.version }}
|
||||
- name: Validate Version
|
||||
uses: skymatic/semver-validation-action@7a6ae1c9e121540d11c9c7e4e667c83d583aa153 # v3.0.0
|
||||
uses: skymatic/semver-validation-action@7c80b6b03a18b42884761daa9862ff5683ec8c8a # v4.0.0
|
||||
with:
|
||||
version: ${{ steps.versions.outputs.semVerStr }}
|
||||
264
.github/workflows/linux-flatpak.yml
vendored
Normal file
264
.github/workflows/linux-flatpak.yml
vendored
Normal file
@@ -0,0 +1,264 @@
|
||||
name: Build flatpak
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
src-tag:
|
||||
description: 'Source or Release tag'
|
||||
required: false
|
||||
create-pr:
|
||||
description: 'Create Flathub PR'
|
||||
required: false
|
||||
type: boolean
|
||||
default: false
|
||||
push:
|
||||
branches-ignore:
|
||||
- 'dependabot/**'
|
||||
paths:
|
||||
- '.github/workflows/get-version.yml'
|
||||
- '.github/workflows/linux-flatpak.yml'
|
||||
- 'dist/linux/flatpak/**'
|
||||
- 'dist/linux/common/**'
|
||||
- 'dist/linux/resources/**'
|
||||
|
||||
jobs:
|
||||
get-version:
|
||||
uses: ./.github/workflows/get-version.yml
|
||||
with:
|
||||
version: ${{ inputs.src-tag }}
|
||||
|
||||
build-flatpak:
|
||||
name: "Build flatpak"
|
||||
needs: [get-version]
|
||||
container:
|
||||
image: ghcr.io/flathub-infra/flatpak-github-actions:freedesktop-25.08
|
||||
options: --privileged
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
variant:
|
||||
- arch: x86_64
|
||||
runner: ubuntu-24.04
|
||||
- arch: aarch64
|
||||
runner: ubuntu-24.04-arm
|
||||
runs-on: ${{ matrix.variant.runner }}
|
||||
permissions:
|
||||
contents: read
|
||||
env:
|
||||
SRC_GIT_SHA: ${{ inputs.src-tag || github.sha}}
|
||||
steps:
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
repository: flathub/org.cryptomator.Cryptomator
|
||||
submodules: true
|
||||
- name: Checkout build script
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
path: build-scripts
|
||||
- name: Checkout app source
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
path: cryptomator
|
||||
ref: ${{ env.SRC_GIT_SHA }}
|
||||
fetch-depth: 0
|
||||
- name: Prepare build files
|
||||
# using envsubst instead of yq to keep linebreaks
|
||||
run: |
|
||||
cp -r -f build-scripts/dist/linux/flatpak/* .
|
||||
envsubst '$FLATPAK_VERSION $FLATPAK_REVISION $CRYPTOMATOR_SOURCE' < org.cryptomator.Cryptomator.TEMPLATE.yaml > org.cryptomator.Cryptomator.yaml
|
||||
env:
|
||||
FLATPAK_VERSION: ${{ needs.get-version.outputs.semVerNum }}
|
||||
FLATPAK_REVISION: 1
|
||||
CRYPTOMATOR_SOURCE: |-
|
||||
type: git
|
||||
path: cryptomator
|
||||
commit: ${{ env.SRC_GIT_SHA }}
|
||||
- name: Copy build script for upload
|
||||
run: cp org.cryptomator.Cryptomator.yaml org.cryptomator.Cryptomator.${{matrix.variant.arch}}.yaml
|
||||
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||
with:
|
||||
archive: false
|
||||
if-no-files-found: error
|
||||
path: |
|
||||
org.cryptomator.Cryptomator.${{matrix.variant.arch}}.yaml
|
||||
- uses: flatpak/flatpak-github-actions/flatpak-builder@401fe28a8384095fc1531b9d320b292f0ee45adb # SNAPSHOT due to using keep-build-dirs
|
||||
with:
|
||||
bundle: cryptomator.flatpak
|
||||
manifest-path: org.cryptomator.Cryptomator.yaml
|
||||
cache-key: flatpak-builder-${{ env.SRC_GIT_SHA }}
|
||||
arch: ${{ matrix.variant.arch }}
|
||||
keep-build-dirs: true
|
||||
- name: Collect maven dependencies
|
||||
working-directory: .flatpak-builder/build/cryptomator-1/.m2/repository/
|
||||
run: |
|
||||
find * -type f \( -iname '*.jar' -o -iname '*.pom' \) | sort -V > /tmp/maven-dependency-files.txt
|
||||
grep -v '^org/openjfx/javafx-' /tmp/maven-dependency-files.txt > maven-dependency-files-common.txt
|
||||
grep '^org/openjfx/javafx-' /tmp/maven-dependency-files.txt > maven-dependency-files-javafx.txt
|
||||
- name: Update arch independent maven dependencies
|
||||
run: |
|
||||
(
|
||||
cd .flatpak-builder/build/cryptomator-1/.m2/repository/
|
||||
|
||||
while IFS= read -r dependencyPath; do
|
||||
dependencyName=$(dirname "$dependencyPath")
|
||||
dependencySha=$(sha256sum "$dependencyPath" | cut -c 1-64)
|
||||
cat <<EOF
|
||||
- type: file
|
||||
dest: .m2/repository/${dependencyName}
|
||||
url: https://repo.maven.apache.org/maven2/${dependencyPath}
|
||||
sha256: ${dependencySha}
|
||||
EOF
|
||||
done < maven-dependency-files-common.txt
|
||||
) > maven-dependencies.yaml
|
||||
- name: Update arch specific maven dependencies
|
||||
run: |
|
||||
(
|
||||
cd .flatpak-builder/build/cryptomator-1/.m2/repository/
|
||||
|
||||
while IFS= read -r dependencyPath; do
|
||||
dependencyName=$(dirname "$dependencyPath")
|
||||
dependencySha=$(sha256sum "$dependencyPath" | cut -c 1-64)
|
||||
cat <<EOF
|
||||
- type: file
|
||||
dest: .m2/repository/${dependencyName}
|
||||
url: https://repo.maven.apache.org/maven2/${dependencyPath}
|
||||
sha256: ${dependencySha}
|
||||
only-arches: [${{ matrix.variant.arch }}]
|
||||
EOF
|
||||
done < maven-dependency-files-javafx.txt
|
||||
) > javafx-maven-dependencies-${{ matrix.variant.arch }}.yaml
|
||||
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||
with:
|
||||
name: maven-sources-${{ matrix.variant.arch }}
|
||||
if-no-files-found: error
|
||||
path: |
|
||||
maven-dependencies.yaml
|
||||
javafx-maven-dependencies-${{ matrix.variant.arch }}.yaml
|
||||
|
||||
verify-maven-sources:
|
||||
name: Verify maven sources
|
||||
runs-on: ubuntu-latest
|
||||
needs: [build-flatpak]
|
||||
permissions:
|
||||
contents: none
|
||||
steps:
|
||||
- name: Download updated maven aarch64 dependencies
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: maven-sources-aarch64
|
||||
path: mvn-src-aarch64
|
||||
- name: Download updated maven x86_64 dependencies
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: maven-sources-x86_64
|
||||
path: mvn-src-x64
|
||||
- name: Verify arch independent maven dependencies
|
||||
run: cmp --silent mvn-src-aarch64/maven-dependencies.yaml mvn-src-x64/maven-dependencies.yaml
|
||||
|
||||
create-pr:
|
||||
name: Create PR for flathub
|
||||
runs-on: ubuntu-latest
|
||||
needs: [get-version, verify-maven-sources]
|
||||
if: (github.event_name == 'workflow_dispatch' && inputs.create-pr ) || (github.event_name == 'release' && needs.get-version.outputs.versionType == 'stable')
|
||||
permissions:
|
||||
contents: write
|
||||
env:
|
||||
TARBALL_URL: 'https://github.com/cryptomator/cryptomator/archive/refs/tags/${{ github.event.release.tag_name || inputs.src-tag }}.tar.gz'
|
||||
steps:
|
||||
- name: Check that input "src-tag" is actually a tag
|
||||
if: github.event_name == 'workflow_dispatch'
|
||||
run: |
|
||||
if [ -z "$SRC_TAG" ]; then
|
||||
echo '::error::Input "src-tag" must be set to create a Flathub PR'
|
||||
exit 1
|
||||
fi
|
||||
env:
|
||||
SRC_TAG: ${{ inputs.src-tag }}
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
repository: flathub/org.cryptomator.Cryptomator
|
||||
submodules: true #TODO: Update submodule!
|
||||
token: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||
- name: Checkout release branch
|
||||
run: |
|
||||
git checkout -b release/${{ needs.get-version.outputs.semVerStr }}
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
path: cryptomator
|
||||
- name: Download source tarball and compute checksum
|
||||
id: sha512
|
||||
run: |
|
||||
curl --silent --fail-with-body --proto "=https" -L -H "Accept: application/vnd.github+json" ${TARBALL_URL} --output cryptomator.tar.gz
|
||||
TARBALL_SHA512=$(sha512sum cryptomator.tar.gz | cut -d ' ' -f1)
|
||||
echo "value=${TARBALL_SHA512}" >> "$GITHUB_OUTPUT"
|
||||
- name: Download updated maven aarch64 dependencies
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: maven-sources-aarch64
|
||||
path: mvn-src-aarch64
|
||||
- name: Download updated maven x86_64 dependencies
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: maven-sources-x86_64
|
||||
path: mvn-src-x64
|
||||
- name: Determine revision
|
||||
id: revision
|
||||
run: |
|
||||
CURRENT_VERSION="$(yq '(.modules[] | select(.name == "cryptomator") | .build-options.env.VERSION)' org.cryptomator.Cryptomator.yaml)"
|
||||
CURRENT_REVISION="$(yq '(.modules[] | select(.name == "cryptomator") | .build-options.env.REVISION_NO)' org.cryptomator.Cryptomator.yaml)"
|
||||
|
||||
if [[ "$CURRENT_VERSION" == "$TARGET_VERSION" && "$CURRENT_REVISION" =~ ^[0-9]+$ ]]; then
|
||||
NEXT_REVISION=$((CURRENT_REVISION + 1))
|
||||
else
|
||||
NEXT_REVISION=1
|
||||
fi
|
||||
|
||||
echo "value=${NEXT_REVISION}" >> "$GITHUB_OUTPUT"
|
||||
env:
|
||||
TARGET_VERSION: ${{ needs.get-version.outputs.semVerStr }}
|
||||
- name: Update build files
|
||||
run: |
|
||||
cp -r -f cryptomator/dist/linux/flatpak/* .
|
||||
cp -r -f mvn-src-x64/* .
|
||||
cp -r -f mvn-src-aarch64/* .
|
||||
envsubst '$FLATPAK_VERSION $FLATPAK_REVISION $CRYPTOMATOR_SOURCE' < org.cryptomator.Cryptomator.TEMPLATE.yaml > org.cryptomator.Cryptomator.yaml
|
||||
yq -i 'del(.modules[] | select(.name == "cryptomator") | .build-options.build-args)' org.cryptomator.Cryptomator.yaml
|
||||
yq -i '(.modules[] | select(.name == "cryptomator") | .sources) += ["maven-dependencies.yaml", "javafx-maven-dependencies-x86_64.yaml", "javafx-maven-dependencies-aarch64.yaml"]' org.cryptomator.Cryptomator.yaml
|
||||
env:
|
||||
FLATPAK_VERSION: ${{ needs.get-version.outputs.semVerNum }}
|
||||
FLATPAK_REVISION: ${{ steps.revision.outputs.value}}
|
||||
CRYPTOMATOR_SOURCE: |-
|
||||
type: archive
|
||||
sha512: ${{steps.sha512.outputs.value}}
|
||||
url: ${{ env.TARBALL_URL }}
|
||||
- name: Commit and push
|
||||
run: |
|
||||
git config user.name "cryptobot"
|
||||
git config user.email "cryptobot@users.noreply.github.com"
|
||||
git config push.autoSetupRemote true
|
||||
git stage org.cryptomator.Cryptomator.yaml maven-dependencies.yaml javafx-maven-dependencies-aarch64.yaml javafx-maven-dependencies-x86_64.yaml
|
||||
git commit -m "Prepare release ${{needs.get-version.outputs.semVerStr}}"
|
||||
git push
|
||||
- name: Create pull request
|
||||
id: create-pr
|
||||
run: |
|
||||
printf "Created by $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID" > pr_body.md
|
||||
PR_URL=$(gh pr create --title "Release ${{ needs.get-version.outputs.semVerStr }}" --body-file pr_body.md)
|
||||
echo "FLATHUB_PR_URL=$PR_URL" >> "$GITHUB_OUTPUT"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||
- name: Slack Notification
|
||||
uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # v2.3.3
|
||||
if: github.event_name == 'release'
|
||||
env:
|
||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }}
|
||||
SLACK_USERNAME: 'Cryptobot'
|
||||
SLACK_ICON: false
|
||||
SLACK_ICON_EMOJI: ':bot:'
|
||||
SLACK_CHANNEL: 'cryptomator-desktop'
|
||||
SLACK_TITLE: "Flathub release PR created for ${{ github.event.repository.name }} ${{ github.event.release.tag_name }} created."
|
||||
SLACK_MESSAGE: "See <${{ steps.create-pr.outputs.FLATHUB_PR_URL }}|PR> on how to proceed."
|
||||
SLACK_FOOTER: false
|
||||
MSG_MINIMAL: true
|
||||
4
.github/workflows/linux-makepkg.yml
vendored
4
.github/workflows/linux-makepkg.yml
vendored
@@ -3,6 +3,8 @@ name: Build Arch package
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
schedule:
|
||||
- cron: '0 21 20 * *'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
@@ -145,7 +147,7 @@ jobs:
|
||||
env:
|
||||
VERSION: ${{ needs.get-version.outputs.semVerStr }}
|
||||
- name: Download PKGBUILD template
|
||||
uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: pkgbuild-file
|
||||
- name: Prepare PKGBUILD
|
||||
|
||||
9
.github/workflows/mac-dmg-x64.yml
vendored
9
.github/workflows/mac-dmg-x64.yml
vendored
@@ -11,6 +11,8 @@ name: Build macOS .dmg for x64
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
schedule:
|
||||
- cron: '0 20 20 * *'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
@@ -117,7 +119,7 @@ jobs:
|
||||
--dest appdir
|
||||
--name Cryptomator
|
||||
--vendor "Skymatic GmbH"
|
||||
--copyright "(C) 2016 - 2025 Skymatic GmbH"
|
||||
--copyright "(C) 2016 - 2026 Skymatic GmbH"
|
||||
--app-version "${{ needs.get-version.outputs.semVerNum }}"
|
||||
--java-options "--enable-preview"
|
||||
--java-options "--enable-native-access=javafx.graphics,org.cryptomator.jfuse.mac"
|
||||
@@ -138,6 +140,7 @@ jobs:
|
||||
--java-options "-Dcryptomator.showTrayIcon=true"
|
||||
--java-options "-Dcryptomator.updateMechanism=org.cryptomator.macos.update.DmgUpdateMechanism"
|
||||
--java-options "-Dcryptomator.buildNumber=\"dmg-${{ needs.get-version.outputs.revNum }}\""
|
||||
--java-options "-Dcryptomator.hub.enableTrustOnFirstUse=true"
|
||||
--mac-package-identifier org.cryptomator
|
||||
--resource-dir dist/mac/resources
|
||||
- name: Patch Cryptomator.app
|
||||
@@ -248,7 +251,7 @@ jobs:
|
||||
env:
|
||||
CODESIGN_IDENTITY: ${{ secrets.MACOS_CODESIGN_IDENTITY }}
|
||||
- name: Notarize .dmg
|
||||
if: startsWith(github.ref, 'refs/tags/') || inputs.notarize
|
||||
if: startsWith(github.ref, 'refs/tags/') || inputs.notarize || github.event_name == 'schedule'
|
||||
uses: cocoalibs/xcode-notarization-action@5cf433d494b6fa26504b574c591f4dd120388846 # v1.0.3
|
||||
with:
|
||||
app-path: 'Cryptomator-*.dmg'
|
||||
@@ -279,7 +282,7 @@ jobs:
|
||||
if-no-files-found: error
|
||||
- name: Publish dmg on GitHub Releases
|
||||
if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published'
|
||||
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0
|
||||
uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1
|
||||
with:
|
||||
fail_on_unmatched_files: true
|
||||
token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }}
|
||||
|
||||
9
.github/workflows/mac-dmg.yml
vendored
9
.github/workflows/mac-dmg.yml
vendored
@@ -3,6 +3,8 @@ name: Build macOS .dmg for arm64
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
schedule:
|
||||
- cron: '0 20 20 * *'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
@@ -115,7 +117,7 @@ jobs:
|
||||
--dest appdir
|
||||
--name Cryptomator
|
||||
--vendor "Skymatic GmbH"
|
||||
--copyright "(C) 2016 - 2025 Skymatic GmbH"
|
||||
--copyright "(C) 2016 - 2026 Skymatic GmbH"
|
||||
--app-version "${{ needs.get-version.outputs.semVerNum }}"
|
||||
--java-options "--enable-preview"
|
||||
--java-options "--enable-native-access=javafx.graphics,org.cryptomator.jfuse.mac"
|
||||
@@ -137,6 +139,7 @@ jobs:
|
||||
--java-options "-Dcryptomator.updateMechanism=org.cryptomator.macos.update.DmgUpdateMechanism"
|
||||
--java-options "-Dcryptomator.buildNumber=\"dmg-${{ needs.get-version.outputs.revNum }}\""
|
||||
--java-options "-XX:ErrorFile=/cryptomator/cryptomator_crash.log"
|
||||
--java-options "-Dcryptomator.hub.enableTrustOnFirstUse=true"
|
||||
--mac-package-identifier org.cryptomator
|
||||
--resource-dir dist/mac/resources
|
||||
- name: Patch Cryptomator.app
|
||||
@@ -247,7 +250,7 @@ jobs:
|
||||
env:
|
||||
CODESIGN_IDENTITY: ${{ secrets.MACOS_CODESIGN_IDENTITY }}
|
||||
- name: Notarize .dmg
|
||||
if: startsWith(github.ref, 'refs/tags/') || inputs.notarize
|
||||
if: startsWith(github.ref, 'refs/tags/') || inputs.notarize || github.event_name == 'schedule'
|
||||
uses: cocoalibs/xcode-notarization-action@5cf433d494b6fa26504b574c591f4dd120388846 # v1.0.3
|
||||
with:
|
||||
app-path: 'Cryptomator-*.dmg'
|
||||
@@ -278,7 +281,7 @@ jobs:
|
||||
if-no-files-found: error
|
||||
- name: Publish dmg on GitHub Releases
|
||||
if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published'
|
||||
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0
|
||||
uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1
|
||||
with:
|
||||
fail_on_unmatched_files: true
|
||||
token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }}
|
||||
|
||||
2
.github/workflows/post-publish.yml
vendored
2
.github/workflows/post-publish.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
||||
GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
|
||||
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
|
||||
- name: Publish asc on GitHub Releases
|
||||
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0
|
||||
uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1
|
||||
with:
|
||||
fail_on_unmatched_files: true
|
||||
token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }}
|
||||
|
||||
2
.github/workflows/release-check.yml
vendored
2
.github/workflows/release-check.yml
vendored
@@ -50,7 +50,7 @@ jobs:
|
||||
exit 1
|
||||
fi
|
||||
- name: Cache NVD DB
|
||||
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
|
||||
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
|
||||
with:
|
||||
path: ~/.m2/repository/org/owasp/dependency-check-data/
|
||||
key: dependency-check-${{ github.run_id }}
|
||||
|
||||
56
.github/workflows/win-exe.yml
vendored
56
.github/workflows/win-exe.yml
vendored
@@ -3,6 +3,8 @@ name: Build Windows Installer
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
schedule:
|
||||
- cron: '0 19 20 * *'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
@@ -134,7 +136,7 @@ jobs:
|
||||
--dest appdir
|
||||
--name Cryptomator
|
||||
--vendor "Skymatic GmbH"
|
||||
--copyright "(C) 2016 - 2025 Skymatic GmbH"
|
||||
--copyright "(C) 2016 - 2026 Skymatic GmbH"
|
||||
--app-version "${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum }}"
|
||||
--java-options "--enable-preview"
|
||||
--java-options "--enable-native-access=javafx.graphics,org.cryptomator.jfuse.win,org.cryptomator.integrations.win"
|
||||
@@ -157,6 +159,7 @@ jobs:
|
||||
--java-options "-Dcryptomator.integrationsWin.windowsHelloKeychainPaths=\"@{appdata}/Cryptomator/windowsHelloKeychain.json\""
|
||||
--java-options "-Dcryptomator.disableUpdateCheck=false"
|
||||
--java-options "-XX:ErrorFile=C:/cryptomator/cryptomator_crash.log"
|
||||
--java-options "-Dcryptomator.hub.enableTrustOnFirstUse=true"
|
||||
--resource-dir dist/win/resources
|
||||
--icon dist/win/resources/Cryptomator.ico
|
||||
--add-launcher "Cryptomator (Debug)=dist/win/debug-launcher.properties"
|
||||
@@ -192,7 +195,7 @@ jobs:
|
||||
& $env:JAVA_HOME\bin\jmod.exe extract --dir jpackage-jmod "${env:JAVA_HOME}\jmods\jdk.jpackage.jmod"
|
||||
Get-ChildItem -Recurse -Path "jpackage-jmod" -File wixhelper.dll | Select-Object -Last 1 | Copy-Item -Destination "appdir"
|
||||
- name: Sign DLLs with Azure Trusted Signing
|
||||
if: inputs.sign || github.event_name == 'release'
|
||||
if: inputs.sign || github.event_name == 'release' || github.event_name == 'schedule'
|
||||
uses: ./.github/actions/win-sign-action
|
||||
with:
|
||||
base-dir: ${{ github.workspace }}\appdir
|
||||
@@ -201,17 +204,6 @@ jobs:
|
||||
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
|
||||
client-id: ${{ secrets.AZURE_CLIENT_ID }}
|
||||
client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
|
||||
- name: Sign DLLs with Actalis CodeSigner
|
||||
if: inputs.sign || github.event_name == 'release'
|
||||
uses: skymatic/workflows/.github/actions/win-sign-action@957d3c2c08c56855fdac41e5afb9a7aca8c30dd9 # no specific version
|
||||
with:
|
||||
base-dir: 'appdir'
|
||||
file-extensions: 'dll,exe,ps1'
|
||||
recursive: true
|
||||
sign-description: 'Cryptomator'
|
||||
sign-url: 'https://cryptomator.org'
|
||||
username: ${{ secrets.WIN_CODESIGN_USERNAME }}
|
||||
password: ${{ secrets.WIN_CODESIGN_PW }}
|
||||
- name: Replace DLLs inside jars with signed ones
|
||||
shell: pwsh
|
||||
run: |
|
||||
@@ -247,7 +239,7 @@ jobs:
|
||||
--dest installer
|
||||
--name Cryptomator
|
||||
--vendor "Skymatic GmbH"
|
||||
--copyright "(C) 2016 - 2025 Skymatic GmbH"
|
||||
--copyright "(C) 2016 - 2026 Skymatic GmbH"
|
||||
--app-version "${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum}}"
|
||||
--win-menu
|
||||
--win-dir-chooser
|
||||
@@ -261,7 +253,7 @@ jobs:
|
||||
JP_WIXWIZARD_RESOURCES: ${{ github.workspace }}/dist/win/resources # requires abs path, used in resources/main.wxs
|
||||
JP_WIXHELPER_DIR: ${{ github.workspace }}\appdir
|
||||
- name: Sign MSI with Azure Trusted Signing
|
||||
if: inputs.sign || github.event_name == 'release'
|
||||
if: inputs.sign || github.event_name == 'release' || github.event_name == 'schedule'
|
||||
uses: ./.github/actions/win-sign-action
|
||||
with:
|
||||
base-dir: ${{ github.workspace }}\installer
|
||||
@@ -311,7 +303,7 @@ jobs:
|
||||
env:
|
||||
WIX_VERSION: ${{ env.WIX_VERSION }}
|
||||
- name: Download .msi
|
||||
uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: msi-${{ matrix.arch }}
|
||||
path: dist/win/bundle/resources
|
||||
@@ -357,7 +349,7 @@ jobs:
|
||||
-define BundleName="Cryptomator"
|
||||
-define BundleVersion="${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum}}"
|
||||
-define BundleVendor="Skymatic GmbH"
|
||||
-define BundleCopyright="(C) 2016 - 2025 Skymatic GmbH"
|
||||
-define BundleCopyright="(C) 2016 - 2026 Skymatic GmbH"
|
||||
-define AboutUrl="https://cryptomator.org"
|
||||
-define HelpUrl="https://cryptomator.org/contact"
|
||||
-define UpdateUrl="https://cryptomator.org/downloads/"
|
||||
@@ -369,7 +361,7 @@ jobs:
|
||||
run: >
|
||||
wix burn detach installer/unsigned/Cryptomator-Installer.exe -engine tmp/engine.exe
|
||||
- name: Sign WiX burn engine with Azure Trusted Signing
|
||||
if: inputs.sign || github.event_name == 'release'
|
||||
if: inputs.sign || github.event_name == 'release' || github.event_name == 'schedule'
|
||||
uses: ./.github/actions/win-sign-action
|
||||
with:
|
||||
base-dir: ${{ github.workspace }}\tmp
|
||||
@@ -379,21 +371,11 @@ jobs:
|
||||
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
|
||||
client-id: ${{ secrets.AZURE_CLIENT_ID }}
|
||||
client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
|
||||
- name: Sign burn engine with Actalis CodeSigner
|
||||
if: inputs.sign || github.event_name == 'release'
|
||||
uses: skymatic/workflows/.github/actions/win-sign-action@957d3c2c08c56855fdac41e5afb9a7aca8c30dd9 # no specific version
|
||||
with:
|
||||
base-dir: 'tmp'
|
||||
file-extensions: 'exe'
|
||||
sign-description: 'Cryptomator Bundle Installer'
|
||||
sign-url: 'https://cryptomator.org'
|
||||
username: ${{ secrets.WIN_CODESIGN_USERNAME }}
|
||||
password: ${{ secrets.WIN_CODESIGN_PW }}
|
||||
- name: Reattach signed burn engine to installer
|
||||
run: >
|
||||
wix burn reattach installer/unsigned/Cryptomator-Installer.exe -engine tmp/engine.exe -o installer/Cryptomator-Installer.exe
|
||||
- name: Sign EXE installer with Azure Trusted Signing
|
||||
if: inputs.sign || github.event_name == 'release'
|
||||
if: inputs.sign || github.event_name == 'release' || github.event_name == 'schedule'
|
||||
uses: ./.github/actions/win-sign-action
|
||||
with:
|
||||
base-dir: ${{ github.workspace }}\installer
|
||||
@@ -403,16 +385,6 @@ jobs:
|
||||
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
|
||||
client-id: ${{ secrets.AZURE_CLIENT_ID }}
|
||||
client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
|
||||
- name: Sign installer with Actalis CodeSigner
|
||||
if: inputs.sign || github.event_name == 'release'
|
||||
uses: skymatic/workflows/.github/actions/win-sign-action@957d3c2c08c56855fdac41e5afb9a7aca8c30dd9 # no specific version
|
||||
with:
|
||||
base-dir: 'installer'
|
||||
file-extensions: 'exe'
|
||||
sign-description: 'Cryptomator Bundle Installer'
|
||||
sign-url: 'https://cryptomator.org'
|
||||
username: ${{ secrets.WIN_CODESIGN_USERNAME }}
|
||||
password: ${{ secrets.WIN_CODESIGN_PW }}
|
||||
- name: Add possible alpha/beta tags to installer name
|
||||
run: mv installer/Cryptomator-Installer.exe Cryptomator-${{ needs.get-version.outputs.semVerStr }}-${{ matrix.executable-suffix }}.exe
|
||||
- name: Create detached GPG signature with key 615D449FE6E6A235
|
||||
@@ -441,12 +413,12 @@ jobs:
|
||||
download-url-exe-x64: ${{ fromJSON(steps.publish.outputs.assets)[2].browser_download_url }}
|
||||
steps:
|
||||
- name: Download installers
|
||||
uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
merge-multiple: true
|
||||
- name: Publish installers on GitHub Releases
|
||||
id: publish
|
||||
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0
|
||||
uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1
|
||||
with:
|
||||
fail_on_unmatched_files: true
|
||||
token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }}
|
||||
@@ -479,7 +451,7 @@ jobs:
|
||||
- name: Slack Notification
|
||||
uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # v2.3.3
|
||||
env:
|
||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
|
||||
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }}
|
||||
SLACK_USERNAME: 'Cryptobot'
|
||||
SLACK_ICON: false
|
||||
SLACK_ICON_EMOJI: ':bot:'
|
||||
|
||||
2
.github/workflows/winget.yml
vendored
2
.github/workflows/winget.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||
- name: Submit package
|
||||
uses: vedantmgoyal2009/winget-releaser@19e706d4c9121098010096f9c495a70a7518b30f # no_specific_version
|
||||
uses: vedantmgoyal2009/winget-releaser@7bd472be23763def6e16bd06cc8b1cdfab0e2fd5 # no_specific_version
|
||||
with:
|
||||
identifier: Cryptomator.Cryptomator
|
||||
version: ${{ inputs.tag }}
|
||||
|
||||
2
.idea/runConfigurations/Cryptomator_Linux.xml
generated
2
.idea/runConfigurations/Cryptomator_Linux.xml
generated
@@ -2,7 +2,7 @@
|
||||
<configuration default="false" name="Cryptomator Linux" type="Application" factoryName="Application">
|
||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||
<module name="cryptomator" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{userhome}/.config/Cryptomator/settings.json" -Dcryptomator.p12Path="@{userhome}/.config/Cryptomator/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/.config/Cryptomator/ipc.socket" -Dcryptomator.logDir="@{userhome}/.local/share/Cryptomator/logs" -Dcryptomator.pluginDir="@{userhome}/.local/share/Cryptomator/plugins" -Dcryptomator.mountPointsDir="@{userhome}/.local/share/Cryptomator/mnt" -Dcryptomator.showTrayIcon=true -Xss20m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator,javafx.graphics" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{userhome}/.config/Cryptomator/settings.json" -Dcryptomator.p12Path="@{userhome}/.config/Cryptomator/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/.config/Cryptomator/ipc.socket" -Dcryptomator.logDir="@{userhome}/.local/share/Cryptomator/logs" -Dcryptomator.pluginDir="@{userhome}/.local/share/Cryptomator/plugins" -Dcryptomator.mountPointsDir="@{userhome}/.local/share/Cryptomator/mnt" -Dcryptomator.showTrayIcon=true -Dcryptomator.hub.enableTrustOnFirstUse=true -Xss20m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator,javafx.graphics" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<configuration default="false" name="Cryptomator Linux Dev" type="Application" factoryName="Application">
|
||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||
<module name="cryptomator" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{userhome}/.config/Cryptomator-Dev/settings.json" -Dcryptomator.p12Path="@{userhome}/.config/Cryptomator-Dev/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/.config/Cryptomator-Dev/ipc.socket" -Dcryptomator.logDir="@{userhome}/.local/share/Cryptomator-Dev/logs" -Dcryptomator.pluginDir="@{userhome}/.local/share/Cryptomator-Dev/plugins" -Dcryptomator.mountPointsDir="@{userhome}/.local/share/Cryptomator-Dev/mnt" -Dcryptomator.showTrayIcon=true -Dfuse.experimental="true" -Xss20m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator,javafx.graphics" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{userhome}/.config/Cryptomator-Dev/settings.json" -Dcryptomator.p12Path="@{userhome}/.config/Cryptomator-Dev/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/.config/Cryptomator-Dev/ipc.socket" -Dcryptomator.logDir="@{userhome}/.local/share/Cryptomator-Dev/logs" -Dcryptomator.pluginDir="@{userhome}/.local/share/Cryptomator-Dev/plugins" -Dcryptomator.mountPointsDir="@{userhome}/.local/share/Cryptomator-Dev/mnt" -Dcryptomator.showTrayIcon=true -Dcryptomator.hub.enableTrustOnFirstUse=true -Dfuse.experimental="true" -Xss20m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator,javafx.graphics" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
2
.idea/runConfigurations/Cryptomator_Windows.xml
generated
2
.idea/runConfigurations/Cryptomator_Windows.xml
generated
@@ -2,7 +2,7 @@
|
||||
<configuration default="false" name="Cryptomator Windows" type="Application" factoryName="Application">
|
||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||
<module name="cryptomator" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{appdata}/Cryptomator/settings.json;@{userhome}/AppData/Roaming/Cryptomator/settings.json" -Dcryptomator.ipcSocketPath="@{localappdata}/Cryptomator/ipc.socket" -Dcryptomator.logDir="@{localappdata}/Cryptomator" -Dcryptomator.pluginDir="@{appdata}/Cryptomator/Plugins" -Dcryptomator.integrationsWin.keychainPaths="@{appdata}/Cryptomator/keychain.json;@{userhome}/AppData/Roaming/Cryptomator/keychain.json" -Dcryptomator.integrationsWin.windowsHelloKeychainPaths="@{appdata}/Cryptomator/windowsHelloKeychain.json;@{userhome}/AppData/Roaming/Cryptomator/windowsHelloKeychain.json" -Dcryptomator.p12Path="@{appdata}/Cryptomator/key.p12;@{userhome}/AppData/Roaming/Cryptomator/key.p12" -Dcryptomator.mountPointsDir="@{userhome}/Cryptomator" -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win,javafx.graphics" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{appdata}/Cryptomator/settings.json;@{userhome}/AppData/Roaming/Cryptomator/settings.json" -Dcryptomator.ipcSocketPath="@{localappdata}/Cryptomator/ipc.socket" -Dcryptomator.logDir="@{localappdata}/Cryptomator" -Dcryptomator.pluginDir="@{appdata}/Cryptomator/Plugins" -Dcryptomator.integrationsWin.keychainPaths="@{appdata}/Cryptomator/keychain.json;@{userhome}/AppData/Roaming/Cryptomator/keychain.json" -Dcryptomator.integrationsWin.windowsHelloKeychainPaths="@{appdata}/Cryptomator/windowsHelloKeychain.json;@{userhome}/AppData/Roaming/Cryptomator/windowsHelloKeychain.json" -Dcryptomator.p12Path="@{appdata}/Cryptomator/key.p12;@{userhome}/AppData/Roaming/Cryptomator/key.p12" -Dcryptomator.mountPointsDir="@{userhome}/Cryptomator" -Dcryptomator.showTrayIcon=true -Dcryptomator.hub.enableTrustOnFirstUse=true -Xss2m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win,javafx.graphics" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<configuration default="false" name="Cryptomator Windows Dev" type="Application" factoryName="Application">
|
||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||
<module name="cryptomator" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{appdata}/Cryptomator-Dev/settings.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/settings.json" -Dcryptomator.ipcSocketPath="@{localappdata}/Cryptomator-Dev/ipc.socket" -Dcryptomator.logDir="@{localappdata}/Cryptomator-Dev" -Dcryptomator.pluginDir="@{appdata}/Cryptomator-Dev/Plugins" -Dcryptomator.integrationsWin.keychainPaths="@{appdata}/Cryptomator-Dev/keychain.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/keychain.json" -Dcryptomator.integrationsWin.windowsHelloKeychainPaths="@{appdata}/Cryptomator-Dev/windowsHelloKeychain.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/windowsHelloKeychain.json" -Dcryptomator.p12Path="@{appdata}/Cryptomator-Dev/key.p12;@{userhome}/AppData/Roaming/Cryptomator-Dev/key.p12" -Dcryptomator.mountPointsDir="@{userhome}/Cryptomator-Dev" -Dcryptomator.showTrayIcon=true -Xss2m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win,javafx.graphics" />
|
||||
<option name="VM_PARAMETERS" value="-Dcryptomator.settingsPath="@{appdata}/Cryptomator-Dev/settings.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/settings.json" -Dcryptomator.ipcSocketPath="@{localappdata}/Cryptomator-Dev/ipc.socket" -Dcryptomator.logDir="@{localappdata}/Cryptomator-Dev" -Dcryptomator.pluginDir="@{appdata}/Cryptomator-Dev/Plugins" -Dcryptomator.integrationsWin.keychainPaths="@{appdata}/Cryptomator-Dev/keychain.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/keychain.json" -Dcryptomator.integrationsWin.windowsHelloKeychainPaths="@{appdata}/Cryptomator-Dev/windowsHelloKeychain.json;@{userhome}/AppData/Roaming/Cryptomator-Dev/windowsHelloKeychain.json" -Dcryptomator.p12Path="@{appdata}/Cryptomator-Dev/key.p12;@{userhome}/AppData/Roaming/Cryptomator-Dev/key.p12" -Dcryptomator.mountPointsDir="@{userhome}/Cryptomator-Dev" -Dcryptomator.showTrayIcon=true -Dcryptomator.hub.enableTrustOnFirstUse=true -Xss2m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win,javafx.graphics" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
2
.idea/runConfigurations/Cryptomator_macOS.xml
generated
2
.idea/runConfigurations/Cryptomator_macOS.xml
generated
@@ -5,7 +5,7 @@
|
||||
</envs>
|
||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||
<module name="cryptomator" />
|
||||
<option name="VM_PARAMETERS" value="-Dapple.awt.enableTemplateImages=true -Dcryptomator.settingsPath="@{userhome}/Library/Application Support/Cryptomator/settings.json" -Dcryptomator.p12Path="@{userhome}/Library/Application Support/Cryptomator/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/Library/Application Support/Cryptomator/ipc.socket" -Dcryptomator.logDir="@{userhome}/Library/Logs/Cryptomator" -Dcryptomator.pluginDir="@{userhome}/Library/Application Support/Cryptomator/Plugins" -Dcryptomator.mountPointsDir="@{userhome}/Cryptomator" -Dcryptomator.showTrayIcon=true -Dcryptomator.integrationsMac.keychainServiceName=Cryptomator -Dcryptomator.updateMechanism=org.cryptomator.macos.update.DmgUpdateMechanism -Xss2m -Xmx512m -ea --enable-preview --enable-native-access=org.cryptomator.jfuse.mac,javafx.graphics" />
|
||||
<option name="VM_PARAMETERS" value="-Dapple.awt.enableTemplateImages=true -Dcryptomator.settingsPath="@{userhome}/Library/Application Support/Cryptomator/settings.json" -Dcryptomator.p12Path="@{userhome}/Library/Application Support/Cryptomator/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/Library/Application Support/Cryptomator/ipc.socket" -Dcryptomator.logDir="@{userhome}/Library/Logs/Cryptomator" -Dcryptomator.pluginDir="@{userhome}/Library/Application Support/Cryptomator/Plugins" -Dcryptomator.mountPointsDir="@{userhome}/Cryptomator" -Dcryptomator.showTrayIcon=true -Dcryptomator.integrationsMac.keychainServiceName=Cryptomator -Dcryptomator.updateMechanism=org.cryptomator.macos.update.DmgUpdateMechanism -Dcryptomator.hub.enableTrustOnFirstUse=true -Xss2m -Xmx512m -ea --enable-preview --enable-native-access=org.cryptomator.jfuse.mac,javafx.graphics" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
</envs>
|
||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||
<module name="cryptomator" />
|
||||
<option name="VM_PARAMETERS" value="-Dapple.awt.enableTemplateImages=true -Dcryptomator.settingsPath="@{userhome}/Library/Application Support/Cryptomator-Dev/settings.json" -Dcryptomator.p12Path="@{userhome}/Library/Application Support/Cryptomator-Dev/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/Library/Application Support/Cryptomator-Dev/ipc.socket" -Dcryptomator.logDir="@{userhome}/Library/Logs/Cryptomator-Dev" -Dcryptomator.pluginDir="@{userhome}/Library/Application Support/Cryptomator-Dev/Plugins" -Dcryptomator.mountPointsDir="@{userhome}/Library/Application Support/Cryptomator-Dev/mnt" -Dcryptomator.showTrayIcon=true -Dcryptomator.integrationsMac.keychainServiceName=Cryptomator -Xss2m -Xmx512m -ea --enable-preview --enable-native-access=org.cryptomator.jfuse.mac,javafx.graphics" />
|
||||
<option name="VM_PARAMETERS" value="-Dapple.awt.enableTemplateImages=true -Dcryptomator.settingsPath="@{userhome}/Library/Application Support/Cryptomator-Dev/settings.json" -Dcryptomator.p12Path="@{userhome}/Library/Application Support/Cryptomator-Dev/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/Library/Application Support/Cryptomator-Dev/ipc.socket" -Dcryptomator.logDir="@{userhome}/Library/Logs/Cryptomator-Dev" -Dcryptomator.pluginDir="@{userhome}/Library/Application Support/Cryptomator-Dev/Plugins" -Dcryptomator.mountPointsDir="@{userhome}/Library/Application Support/Cryptomator-Dev/mnt" -Dcryptomator.showTrayIcon=true -Dcryptomator.integrationsMac.keychainServiceName=Cryptomator -Dcryptomator.hub.enableTrustOnFirstUse=true -Xss2m -Xmx512m -ea --enable-preview --enable-native-access=org.cryptomator.jfuse.mac,javafx.graphics" />
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
|
||||
37
CHANGELOG.md
37
CHANGELOG.md
@@ -7,6 +7,43 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
The changelog starts with version 1.19.0.
|
||||
Changes to prior versions can be found on the [Github release page](https://github.com/cryptomator/cryptomator/releases).
|
||||
|
||||
|
||||
## [Unreleased](https://github.com/cryptomator/cryptomator/compare/1.19.1...HEAD)
|
||||
|
||||
No changes yet.
|
||||
|
||||
|
||||
## [1.19.2](https://github.com/cryptomator/cryptomator/releases/1.19.2) - 2026-03-20
|
||||
|
||||
### Security
|
||||
* Cryptomamtor Hub Vaults: Additional patch for (#4179, [GHSA-34rf-rwr3-7g43](https://github.com/cryptomator/cryptomator/security/advisories/GHSA-34rf-rwr3-7g43))
|
||||
|
||||
|
||||
## [1.19.1](https://github.com/cryptomator/cryptomator/releases/1.19.1) - 2026-03-12
|
||||
|
||||
### Security
|
||||
* Cryptomamtor Hub Vaults: Fixed possible man-in-the-middle attack with tampered vault config (#4179, [GHSA-34rf-rwr3-7g43](https://github.com/cryptomator/cryptomator/security/advisories/GHSA-34rf-rwr3-7g43))
|
||||
* Disallow unencrypted http connections to hub by default ([CVE-2026-32309](https://github.com/cryptomator/cryptomator/security/advisories/GHSA-vv33-h7qx-c264))
|
||||
* Disallow loading of masterkey file from arbitrary paths (#4180, [CVE-2026-32310](https://github.com/cryptomator/cryptomator/security/advisories/GHSA-5phc-5pfx-hr52))
|
||||
* Fixed not-configured plugin directory does not disable plugin search ([#4176](https://github.com/cryptomator/cryptomator/pull/4176))
|
||||
|
||||
### Added
|
||||
* Trust on first use, adding new config properties `cryptomator.hub.allowedHosts` and `cryptomator.hub.enableTrustOnFirstUse` (#4179)
|
||||
|
||||
### Fixed
|
||||
* Fixed Finder window opens twice when revealing vault on macOS ([#4177](https://github.com/cryptomator/cryptomator/pull/4177))
|
||||
* Fixed app does not start due to secret service detection failure on Linux ([#4175](https://github.com/cryptomator/cryptomator/pull/4175))
|
||||
|
||||
### Changed
|
||||
* Pin version of appimagetool([#4181](https://github.com/cryptomator/cryptomator/pull/4181))
|
||||
* Updated translations
|
||||
* Updated dependencies:
|
||||
* `org.cryptomator:integrations-api` from 1.8.0-beta1 to 1.8.0
|
||||
* `org.cryptomator:integrations-linux` from 1.7.0-beta4 to 1.7.0
|
||||
* `org.cryptomator:integrations-mac` from 1.5.0-beta3 to 1.5.0
|
||||
|
||||
|
||||
|
||||
## [1.19.0](https://github.com/cryptomator/cryptomator/releases/tag/1.19.0) - 2026-03-09
|
||||
|
||||
### Added
|
||||
|
||||
5
dist/linux/appimage/build.sh
vendored
5
dist/linux/appimage/build.sh
vendored
@@ -82,7 +82,7 @@ ${JAVA_HOME}/bin/jpackage \
|
||||
--vendor "Skymatic GmbH" \
|
||||
--java-options "--enable-preview" \
|
||||
--java-options "--enable-native-access=javafx.graphics,org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator" \
|
||||
--copyright "(C) 2016 - 2025 Skymatic GmbH" \
|
||||
--copyright "(C) 2016 - 2026 Skymatic GmbH" \
|
||||
--java-options "-Xss5m" \
|
||||
--java-options "-Xmx256m" \
|
||||
--app-version "${VERSION}.${REVISION_NO}" \
|
||||
@@ -99,6 +99,7 @@ ${JAVA_HOME}/bin/jpackage \
|
||||
--java-options "-Dcryptomator.buildNumber=\"appimage-${REVISION_NO}\"" \
|
||||
--java-options "-Dcryptomator.networking.truststore.p12Path=\"/etc/cryptomator/certs.p12\"" \
|
||||
--java-options "-XX:ErrorFile=/cryptomator/cryptomator_crash.log" \
|
||||
--java-options "-Dcryptomator.hub.enableTrustOnFirstUse=true" \
|
||||
--resource-dir ../resources
|
||||
|
||||
# transform AppDir
|
||||
@@ -123,7 +124,7 @@ ln -s org.cryptomator.Cryptomator.metainfo.xml Cryptomator.AppDir/usr/share/meta
|
||||
ln -s bin/cryptomator.sh Cryptomator.AppDir/AppRun
|
||||
|
||||
# load AppImageTool
|
||||
curl -L https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-${CPU_ARCH}.AppImage -o /tmp/appimagetool.AppImage
|
||||
curl -L https://github.com/AppImage/appimagetool/releases/download/1.9.1/appimagetool-${CPU_ARCH}.AppImage -o /tmp/appimagetool.AppImage
|
||||
chmod +x /tmp/appimagetool.AppImage
|
||||
|
||||
# create AppImage
|
||||
|
||||
@@ -73,6 +73,7 @@
|
||||
<url type="faq">https://community.cryptomator.org/c/kb/faq</url>
|
||||
<url type="help">https://docs.cryptomator.org/</url>
|
||||
<url type="translate">https://translate.cryptomator.org</url>
|
||||
<url type="vcs-browser">https://github.com/cryptomator/cryptomator</url>
|
||||
|
||||
<developer id="de.skymatic">
|
||||
<name>Skymatic GmbH</name>
|
||||
@@ -83,6 +84,12 @@
|
||||
</content_rating>
|
||||
|
||||
<releases>
|
||||
<release date="2026-03-20" version="1.19.2">
|
||||
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.19.2</url>
|
||||
</release>
|
||||
<release date="2026-03-12" version="1.19.1">
|
||||
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.19.1</url>
|
||||
</release>
|
||||
<release date="2026-03-09" version="1.19.0">
|
||||
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.19.0</url>
|
||||
</release>
|
||||
|
||||
3
dist/linux/debian/rules
vendored
3
dist/linux/debian/rules
vendored
@@ -46,7 +46,7 @@ override_dh_auto_build:
|
||||
--vendor "Skymatic GmbH" \
|
||||
--java-options "--enable-preview" \
|
||||
--java-options "--enable-native-access=javafx.graphics,org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator" \
|
||||
--copyright "(C) 2016 - 2025 Skymatic GmbH" \
|
||||
--copyright "(C) 2016 - 2026 Skymatic GmbH" \
|
||||
--java-options "-Xss5m" \
|
||||
--java-options "-Xmx256m" \
|
||||
--java-options "-Dfile.encoding=\"utf-8\"" \
|
||||
@@ -64,6 +64,7 @@ override_dh_auto_build:
|
||||
--java-options "-Dcryptomator.disableUpdateCheck=\"${DISABLE_UPDATE_CHECK}\"" \
|
||||
--java-options "-Dcryptomator.integrationsLinux.autoStartCmd=\"cryptomator\"" \
|
||||
--java-options "-Dcryptomator.networking.truststore.p12Path=\"/etc/cryptomator/certs.p12\"" \
|
||||
--java-options "-Dcryptomator.hub.enableTrustOnFirstUse=true" \
|
||||
--app-version "${VERSION_NUM}.${REVISION_NUM}" \
|
||||
--resource-dir resources \
|
||||
--verbose
|
||||
|
||||
15
dist/linux/flatpak/build-aux/fusermount-wrapper.sh
vendored
Normal file
15
dist/linux/flatpak/build-aux/fusermount-wrapper.sh
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
#!/bin/sh
|
||||
|
||||
# From: https://gitlab.gnome.org/GNOME/gnome-builder/-/blob/main/build-aux/flatpak/fusermount-wrapper.sh
|
||||
|
||||
if [ -z "$_FUSE_COMMFD" ]; then
|
||||
FD_ARGS=
|
||||
else
|
||||
FD_ARGS="--env=_FUSE_COMMFD=${_FUSE_COMMFD} --forward-fd=${_FUSE_COMMFD}"
|
||||
fi
|
||||
|
||||
if [ -e /proc/self/fd/3 ] && [ 3 != "$_FUSE_COMMFD" ]; then
|
||||
FD_ARGS="$FD_ARGS --forward-fd=3"
|
||||
fi
|
||||
|
||||
exec flatpak-spawn --host --forward-fd=1 --forward-fd=2 $FD_ARGS fusermount3 "$@"
|
||||
182
dist/linux/flatpak/org.cryptomator.Cryptomator.TEMPLATE.yaml
vendored
Normal file
182
dist/linux/flatpak/org.cryptomator.Cryptomator.TEMPLATE.yaml
vendored
Normal file
@@ -0,0 +1,182 @@
|
||||
app-id: org.cryptomator.Cryptomator
|
||||
command: cryptomator
|
||||
runtime: org.freedesktop.Platform
|
||||
runtime-version: '25.08'
|
||||
sdk: org.freedesktop.Sdk
|
||||
separate-locales: false
|
||||
finish-args:
|
||||
# Required for FUSE, see https://github.com/flathub/org.cryptomator.Cryptomator/pull/68#issuecomment-1935136502
|
||||
- --device=all
|
||||
# Set the PATH environment variable in the application, as flatpak is resetting the shell's PATH
|
||||
- --env=PATH=/app/bin/:/usr/bin/
|
||||
# Allow filesystem access to the user's home dir
|
||||
# Needed to manage vaults there
|
||||
- --filesystem=home
|
||||
# Reading system certificates
|
||||
- --filesystem=host-etc:ro
|
||||
# Allow access to the XDG data directory
|
||||
# Needed to connect to KeePassXC's UNIX domain socket
|
||||
- --filesystem=xdg-run/org.keepassxc.KeePassXC.BrowserServer
|
||||
- --filesystem=xdg-run/app/org.keepassxc.KeePassXC/
|
||||
# Share IPC namespace with the host, without it the X11 shared memory extension will not work
|
||||
- --share=ipc
|
||||
# Allow access to the network
|
||||
- --share=network
|
||||
# Show windows using X11
|
||||
- --socket=x11
|
||||
# Needed to reveal encrypted files
|
||||
- --talk-name=org.freedesktop.FileManager1
|
||||
# Run any command on the host
|
||||
# Needed to spawn fusermount on the host
|
||||
- --talk-name=org.freedesktop.Flatpak
|
||||
# Allow desktop notifications
|
||||
- --talk-name=org.freedesktop.Notifications
|
||||
# Allow access to the GNOME secret service API and to talk to the GNOME keyring daemon
|
||||
- --talk-name=org.freedesktop.secrets
|
||||
- --talk-name=org.gnome.keyring
|
||||
# Allow to talk to the KDE kwallet daemon
|
||||
- --talk-name=org.kde.kwalletd5
|
||||
- --talk-name=org.kde.kwalletd6
|
||||
# Needed to talk to the gvfs daemons over D-Bus and list mounts using the GIO APIs
|
||||
- --talk-name=org.gtk.vfs.*
|
||||
# Allow access to appindicator icons
|
||||
- --talk-name=org.ayatana
|
||||
# Allow access to appindicator icons on KDE
|
||||
- --talk-name=org.kde.StatusNotifierWatcher
|
||||
cleanup:
|
||||
- /include
|
||||
- /lib/pkgconfig
|
||||
modules:
|
||||
- shared-modules/libayatana-appindicator/libayatana-appindicator-gtk3.json
|
||||
- name: libfuse
|
||||
buildsystem: meson
|
||||
config-opts:
|
||||
- -Dexamples=false
|
||||
- -Dinitscriptdir=
|
||||
- -Duseroot=false
|
||||
- -Dtests=false
|
||||
# don't install rules on the host
|
||||
- -Dudevrulesdir=/tmp/
|
||||
sources:
|
||||
- type: archive
|
||||
url: https://github.com/libfuse/libfuse/releases/download/fuse-3.16.2/fuse-3.16.2.tar.gz
|
||||
sha256: f797055d9296b275e981f5f62d4e32e089614fc253d1ef2985851025b8a0ce87
|
||||
x-checker-data:
|
||||
type: anitya
|
||||
project-id: 861
|
||||
url-template: https://github.com/libfuse/libfuse/releases/download/fuse-$version/fuse-$version.tar.gz
|
||||
versions: {<: '3.17.0'}
|
||||
- name: host-command-wrapper
|
||||
buildsystem: simple
|
||||
build-commands:
|
||||
- install fusermount-wrapper.sh /app/bin/fusermount3
|
||||
sources:
|
||||
- type: file
|
||||
path: build-aux/fusermount-wrapper.sh
|
||||
- name: cryptomator
|
||||
buildsystem: simple
|
||||
build-options:
|
||||
build-args:
|
||||
- --share=network
|
||||
env:
|
||||
PATH: /app/bin:/usr/bin
|
||||
MAVEN_OPTS: -Dmaven.repo.local=.m2/repository
|
||||
JAVA_HOME: jdk
|
||||
JMODS_PATH: jmods
|
||||
VERSION: $FLATPAK_VERSION
|
||||
REVISION_NO: '$FLATPAK_REVISION'
|
||||
build-commands:
|
||||
# Setup Java
|
||||
- tar xvfz jdk.tar.gz --transform 's!^[^/]*!jdk!'
|
||||
- mkdir jmods
|
||||
- unzip -j openjfx.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/javafx.fxml.jmod \*/javafx.graphics.jmod -d jmods
|
||||
# Setup Maven
|
||||
- mkdir maven
|
||||
- tar xf maven.tar.gz --strip-components=1 --exclude=jansi-native --directory=maven
|
||||
# Build project
|
||||
- maven/bin/mvn clean package -DskipTests -P"linux-$(uname -m)"
|
||||
- cp target/cryptomator-*.jar target/mods
|
||||
- cd target
|
||||
- $JAVA_HOME/bin/jlink
|
||||
--output runtime
|
||||
--module-path $JMODS_PATH
|
||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,javafx.base,javafx.graphics,javafx.controls,javafx.fxml,jdk.crypto.ec,jdk.crypto.cryptoki,jdk.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net,java.compiler
|
||||
--no-header-files
|
||||
--no-man-pages
|
||||
--strip-debug
|
||||
--compress=zip-0
|
||||
- $JAVA_HOME/bin/jpackage
|
||||
--type app-image
|
||||
--runtime-image runtime
|
||||
--input target/libs
|
||||
--module-path target/mods
|
||||
--module org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator
|
||||
--dest .
|
||||
--name Cryptomator
|
||||
--vendor 'Skymatic GmbH'
|
||||
--copyright '(C) 2016 - 2026 Skymatic GmbH'
|
||||
--java-options '--enable-native-access=javafx.graphics,org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator'
|
||||
--java-options "--sun-misc-unsafe-memory-access=allow"
|
||||
--java-options '-Xss5m'
|
||||
--java-options '-Xmx256m'
|
||||
--java-options '-Dfile.encoding='utf-8''
|
||||
--java-options '-Djava.net.useSystemProxies=true'
|
||||
--java-options "-Dcryptomator.appVersion='${VERSION}'"
|
||||
--java-options "-Dcryptomator.buildNumber='flatpak-${REVISION_NO}'"
|
||||
--java-options '-Dcryptomator.ipcSocketPath='@{userhome}/.config/Cryptomator/ipc.socket''
|
||||
--java-options '-Dcryptomator.adminConfigPath='/run/host/etc/cryptomator/config.properties''
|
||||
--java-options '-Dcryptomator.logDir='@{userhome}/.local/share/Cryptomator/logs''
|
||||
--java-options '-Dcryptomator.mountPointsDir='@{userhome}/.local/share/Cryptomator/mnt''
|
||||
--java-options '-Dcryptomator.pluginDir='@{userhome}/.local/share/Cryptomator/plugins''
|
||||
--java-options '-Dcryptomator.p12Path='@{userhome}/.config/Cryptomator/key.p12''
|
||||
--java-options '-Dcryptomator.settingsPath='@{userhome}/.config/Cryptomator/settings.json:~/.Cryptomator/settings.json''
|
||||
--java-options '-Dcryptomator.showTrayIcon=true'
|
||||
--java-options '-Dcryptomator.updateMechanism=org.cryptomator.linux.update.FlatpakUpdater'
|
||||
--java-options '-Dcryptomator.networking.truststore.p12Path='/run/host/etc/cryptomator/certs.p12''
|
||||
--java-options '-Dcryptomator.hub.enableTrustOnFirstUse=true'
|
||||
--app-version "${VERSION}.${REVISION_NO}"
|
||||
--verbose
|
||||
- cp -R Cryptomator /app/
|
||||
- ln -s /app/Cryptomator/bin/Cryptomator /app/bin/cryptomator
|
||||
- cp -R /app/lib/* /app/Cryptomator/lib/app/
|
||||
- install -D -m0644 -t /app/share/applications/ dist/linux/common/org.cryptomator.Cryptomator.desktop
|
||||
- install -D -m0644 -t /app/share/icons/hicolor/scalable/apps/ dist/linux/common/org.cryptomator.Cryptomator.svg
|
||||
- install -D -m0644 -T dist/linux/common/org.cryptomator.Cryptomator.tray.svg /app/share/icons/hicolor/symbolic/apps/org.cryptomator.Cryptomator.tray-symbolic.svg
|
||||
- install -D -m0644 -T dist/linux/common/org.cryptomator.Cryptomator.tray-unlocked.svg /app/share/icons/hicolor/symbolic/apps/org.cryptomator.Cryptomator.tray-unlocked-symbolic.svg
|
||||
- install -D -m0644 -t /app/share/metainfo/ dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml
|
||||
sources:
|
||||
- $CRYPTOMATOR_SOURCE
|
||||
- type: file
|
||||
dest-filename: jdk.tar.gz
|
||||
only-arches:
|
||||
- x86_64
|
||||
url: https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.2%2B10/OpenJDK25U-jdk_x64_linux_hotspot_25.0.2_10.tar.gz
|
||||
sha512: 29043fde119a031c2ca8d57aed445fedd9e7f74608fcdc7a809076ba84cfd1c31f08de2ecccf352e159fdcd1cae172395ed46363007552ff242057826c81ab3a
|
||||
- type: file
|
||||
dest-filename: jdk.tar.gz
|
||||
only-arches:
|
||||
- aarch64
|
||||
url: https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.2%2B10/OpenJDK25U-jdk_aarch64_linux_hotspot_25.0.2_10.tar.gz
|
||||
sha512: f1d3ccec3e1f1bed9d632f14b9223709d6e5c2e0d922125d068870dd3016492a2ca8f08924d4a9d0dc5eb2159fa09efee366a748fd0093475baf29e5c70c781a
|
||||
- type: file
|
||||
dest-filename: openjfx.zip
|
||||
only-arches:
|
||||
- x86_64
|
||||
url: https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_linux-x64_bin-jmods.zip
|
||||
sha512: 21f550217101c513f9eb1d7947eba30cb79618238e6539ce770e54e84b01574cdaeba40af602391145f163dd8e43e3794395467413152f13ffffeff948b0ca1b
|
||||
- type: file
|
||||
dest-filename: openjfx.zip
|
||||
only-arches:
|
||||
- aarch64
|
||||
url: https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_linux-aarch64_bin-jmods.zip
|
||||
sha512: a9268409b3803e386490bf1319d0f0a14173cebe862c12254cd51b430ee0a297437d9e38d5ebeae0da8899be898b312b103330d09dcfd3e63c1e7d15f2f14311
|
||||
- type: file
|
||||
dest-filename: maven.tar.gz
|
||||
url: https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.9.13/apache-maven-3.9.13-bin.tar.gz
|
||||
sha512: d9ccd44ba2991586e359c29eb86780ae8ff4ec1b88b0b8af3af074803472690cf2017782a9c4401343c62cbcd056231db9612e1e551cbd9747c21746d732c015
|
||||
x-checker-data:
|
||||
type: anitya
|
||||
project-id: 1894
|
||||
stable-only: true
|
||||
url-template: https://repo1.maven.org/maven2/org/apache/maven/apache-maven/$version/apache-maven-$version-bin.tar.gz
|
||||
versions: {<: '4.0'}
|
||||
1
dist/linux/makepkg/PKGBUILD.template
vendored
1
dist/linux/makepkg/PKGBUILD.template
vendored
@@ -94,6 +94,7 @@ build() {
|
||||
--java-options "-Dcryptomator.p12Path=\"@{userhome}/.config/Cryptomator/key.p12\"" \
|
||||
--java-options "-Dcryptomator.settingsPath=\"@{userhome}/.config/Cryptomator/settings.json:~/.Cryptomator/settings.json\"" \
|
||||
--java-options "-Dcryptomator.showTrayIcon=true" \
|
||||
--java-options "-Dcryptomator.hub.enableTrustOnFirstUse=true" \
|
||||
--app-version "${pkgver//_*/}" \
|
||||
--verbose
|
||||
}
|
||||
|
||||
3
dist/mac/dmg/build.sh
vendored
3
dist/mac/dmg/build.sh
vendored
@@ -24,7 +24,7 @@ rm -rf runtime dmg *.app *.dmg
|
||||
# set variables
|
||||
APP_NAME="Cryptomator"
|
||||
VENDOR="Skymatic GmbH"
|
||||
COPYRIGHT_YEARS="2016 - 2025"
|
||||
COPYRIGHT_YEARS="2016 - 2026"
|
||||
PACKAGE_IDENTIFIER="org.cryptomator"
|
||||
MAIN_JAR_GLOB="cryptomator-*.jar"
|
||||
MODULE_AND_MAIN_CLASS="org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator"
|
||||
@@ -125,6 +125,7 @@ ${JAVA_HOME}/bin/jpackage \
|
||||
--java-options "-Dcryptomator.showTrayIcon=true" \
|
||||
--java-options "-Dcryptomator.updateMechanism=org.cryptomator.macos.update.DmgUpdateMechanism" \
|
||||
--java-options "-Dcryptomator.buildNumber=\"dmg-${REVISION_NO}\"" \
|
||||
--java-options "-Dcryptomator.hub.enableTrustOnFirstUse=true" \
|
||||
--mac-package-identifier ${PACKAGE_IDENTIFIER} \
|
||||
--resource-dir ../resources
|
||||
|
||||
|
||||
1
dist/win/build.ps1
vendored
1
dist/win/build.ps1
vendored
@@ -167,6 +167,7 @@ $javaOptions = @(
|
||||
"--java-options", "-Dcryptomator.showTrayIcon=true"
|
||||
"--java-options", "-Dcryptomator.buildNumber=`"msi-$revisionNo`""
|
||||
"--java-options", "-Dcryptomator.disableUpdateCheck=false"
|
||||
"--java-options", "-Dcryptomator.hub.enableTrustOnFirstUse=true"
|
||||
)
|
||||
|
||||
|
||||
|
||||
56
pom.xml
56
pom.xml
@@ -3,7 +3,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>cryptomator</artifactId>
|
||||
<version>1.19.0</version>
|
||||
<version>1.20.0-SNAPSHOT</version>
|
||||
<name>Cryptomator Desktop App</name>
|
||||
|
||||
<organization>
|
||||
@@ -35,10 +35,10 @@
|
||||
<!-- cryptomator dependencies -->
|
||||
<cryptomator.cryptofs.version>2.10.0</cryptomator.cryptofs.version>
|
||||
<cryptomator.cryptolib.version>2.2.2</cryptomator.cryptolib.version>
|
||||
<cryptomator.integrations.version>1.8.0-beta1</cryptomator.integrations.version>
|
||||
<cryptomator.integrations.version>1.8.0</cryptomator.integrations.version>
|
||||
<cryptomator.integrations.win.version>1.6.0</cryptomator.integrations.win.version>
|
||||
<cryptomator.integrations.mac.version>1.5.0-beta3</cryptomator.integrations.mac.version>
|
||||
<cryptomator.integrations.linux.version>1.7.0-beta4</cryptomator.integrations.linux.version>
|
||||
<cryptomator.integrations.mac.version>1.5.0</cryptomator.integrations.mac.version>
|
||||
<cryptomator.integrations.linux.version>1.7.0</cryptomator.integrations.linux.version>
|
||||
<cryptomator.fuse.version>6.0.1</cryptomator.fuse.version>
|
||||
<cryptomator.webdav.version>3.0.1</cryptomator.webdav.version>
|
||||
<cryptomator.webdav-servlet.version>1.2.12</cryptomator.webdav-servlet.version>
|
||||
@@ -527,11 +527,57 @@
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>linux</id>
|
||||
<id>linux-aarch64</id>
|
||||
<activation>
|
||||
<os>
|
||||
<family>unix</family>
|
||||
<name>Linux</name>
|
||||
<arch>aarch64</arch>
|
||||
</os>
|
||||
<property>
|
||||
<name>idea.version</name>
|
||||
</property>
|
||||
</activation>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.cryptomator</groupId>
|
||||
<artifactId>integrations-linux</artifactId>
|
||||
<version>${cryptomator.integrations.linux.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.openjfx</groupId>
|
||||
<artifactId>javafx-base</artifactId>
|
||||
<version>${javafx.version}</version>
|
||||
<classifier>linux-aarch64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.openjfx</groupId>
|
||||
<artifactId>javafx-graphics</artifactId>
|
||||
<version>${javafx.version}</version>
|
||||
<classifier>linux-aarch64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.openjfx</groupId>
|
||||
<artifactId>javafx-controls</artifactId>
|
||||
<version>${javafx.version}</version>
|
||||
<classifier>linux-aarch64</classifier>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.openjfx</groupId>
|
||||
<artifactId>javafx-fxml</artifactId>
|
||||
<version>${javafx.version}</version>
|
||||
<classifier>linux-aarch64</classifier>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>linux-x86_64</id>
|
||||
<activation>
|
||||
<os>
|
||||
<family>unix</family>
|
||||
<name>Linux</name>
|
||||
<arch>amd64</arch>
|
||||
</os>
|
||||
<property>
|
||||
<name>idea.version</name>
|
||||
|
||||
@@ -9,10 +9,13 @@ import org.slf4j.LoggerFactory;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Arrays;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.Spliterator;
|
||||
import java.util.Spliterators;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.stream.StreamSupport;
|
||||
|
||||
@@ -20,20 +23,22 @@ public class Environment {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(Environment.class);
|
||||
private static final int DEFAULT_MIN_PW_LENGTH = 8;
|
||||
private static final String SETTINGS_PATH_PROP_NAME = "cryptomator.settingsPath";
|
||||
private static final String IPC_SOCKET_PATH_PROP_NAME = "cryptomator.ipcSocketPath";
|
||||
private static final String KEYCHAIN_PATHS_PROP_NAME = "cryptomator.integrationsWin.keychainPaths";
|
||||
private static final String WINDOWS_HELLO_KEYCHAIN_PATHS_PROP_NAME = "cryptomator.integrationsWin.windowsHelloKeychainPaths";
|
||||
private static final String P12_PATH_PROP_NAME = "cryptomator.p12Path";
|
||||
private static final String LOG_DIR_PROP_NAME = "cryptomator.logDir";
|
||||
private static final String LOOPBACK_ALIAS_PROP_NAME = "cryptomator.loopbackAlias";
|
||||
private static final String MOUNTPOINT_DIR_PROP_NAME = "cryptomator.mountPointsDir";
|
||||
private static final String MIN_PW_LENGTH_PROP_NAME = "cryptomator.minPwLength";
|
||||
private static final String APP_VERSION_PROP_NAME = "cryptomator.appVersion";
|
||||
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";
|
||||
public static final String SETTINGS_PATH_PROP_NAME = "cryptomator.settingsPath";
|
||||
public static final String IPC_SOCKET_PATH_PROP_NAME = "cryptomator.ipcSocketPath";
|
||||
public static final String KEYCHAIN_PATHS_PROP_NAME = "cryptomator.integrationsWin.keychainPaths";
|
||||
public static final String WINDOWS_HELLO_KEYCHAIN_PATHS_PROP_NAME = "cryptomator.integrationsWin.windowsHelloKeychainPaths";
|
||||
public static final String P12_PATH_PROP_NAME = "cryptomator.p12Path";
|
||||
public static final String LOG_DIR_PROP_NAME = "cryptomator.logDir";
|
||||
public static final String LOOPBACK_ALIAS_PROP_NAME = "cryptomator.loopbackAlias";
|
||||
public static final String MOUNTPOINT_DIR_PROP_NAME = "cryptomator.mountPointsDir";
|
||||
public static final String MIN_PW_LENGTH_PROP_NAME = "cryptomator.minPwLength";
|
||||
public static final String APP_VERSION_PROP_NAME = "cryptomator.appVersion";
|
||||
public static final String BUILD_NUMBER_PROP_NAME = "cryptomator.buildNumber";
|
||||
public static final String PLUGIN_DIR_PROP_NAME = "cryptomator.pluginDir";
|
||||
public static final String TRAY_ICON_PROP_NAME = "cryptomator.showTrayIcon";
|
||||
public static final String DISABLE_UPDATE_CHECK_PROP_NAME = "cryptomator.disableUpdateCheck";
|
||||
public static final String HUB_ALLOWED_HOSTS_PROP_NAME = "cryptomator.hub.allowedHosts";
|
||||
public static final String HUB_TOFU_PROP_NAME = "cryptomator.hub.enableTrustOnFirstUse";
|
||||
|
||||
private Environment() {}
|
||||
|
||||
@@ -57,6 +62,8 @@ public class Environment {
|
||||
logCryptomatorSystemProperty(PLUGIN_DIR_PROP_NAME);
|
||||
logCryptomatorSystemProperty(TRAY_ICON_PROP_NAME);
|
||||
logCryptomatorSystemProperty(DISABLE_UPDATE_CHECK_PROP_NAME);
|
||||
logCryptomatorSystemProperty(HUB_ALLOWED_HOSTS_PROP_NAME);
|
||||
logCryptomatorSystemProperty(HUB_TOFU_PROP_NAME);
|
||||
}
|
||||
|
||||
public static Environment getInstance() {
|
||||
@@ -145,6 +152,18 @@ public class Environment {
|
||||
return Boolean.getBoolean(DISABLE_UPDATE_CHECK_PROP_NAME);
|
||||
}
|
||||
|
||||
public Set<String> hubAllowedHosts() {
|
||||
var allowedHubHostsString = System.getProperty(HUB_ALLOWED_HOSTS_PROP_NAME, "");
|
||||
return Arrays.stream(allowedHubHostsString.split(","))
|
||||
.map(String::trim)
|
||||
.filter(Predicate.not(String::isEmpty))
|
||||
.collect(Collectors.toUnmodifiableSet());
|
||||
}
|
||||
|
||||
public boolean hubTrustOnFirstUse() {
|
||||
return Boolean.getBoolean(HUB_TOFU_PROP_NAME);
|
||||
}
|
||||
|
||||
private Optional<Path> getPath(String propertyName) {
|
||||
String value = System.getProperty(propertyName);
|
||||
return Optional.ofNullable(value).map(Paths::get);
|
||||
|
||||
@@ -24,9 +24,12 @@ import javafx.beans.property.SimpleStringProperty;
|
||||
import javafx.beans.property.StringProperty;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.collections.ObservableSet;
|
||||
import javafx.geometry.NodeOrientation;
|
||||
import java.nio.file.Path;
|
||||
import java.time.Instant;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class Settings {
|
||||
|
||||
@@ -78,6 +81,7 @@ public class Settings {
|
||||
public final ObjectProperty<Instant> lastSuccessfulUpdateCheck;
|
||||
public final ObjectProperty<Path> previouslyUsedVaultDirectory;
|
||||
public final StringProperty lastUpdateAttemptedByVersion;
|
||||
public final ObservableSet<String> trustedHosts;
|
||||
|
||||
public static Settings create(SettingsProvider provider, Environment env) {
|
||||
var defaults = new SettingsJson();
|
||||
@@ -118,6 +122,7 @@ public class Settings {
|
||||
this.lastSuccessfulUpdateCheck = new SimpleObjectProperty<>(this, "lastSuccessfulUpdateCheck", json.lastSuccessfulUpdateCheck);
|
||||
this.previouslyUsedVaultDirectory = new SimpleObjectProperty<>(this, "previouslyUsedVaultDirectory", json.previouslyUsedVaultDirectory);
|
||||
this.lastUpdateAttemptedByVersion = new SimpleStringProperty(this, "lastUpdateAttemptedByVersion", json.lastUpdateAttemptedByVersion);
|
||||
this.trustedHosts = FXCollections.observableSet(json.trustedHosts);
|
||||
|
||||
this.directories.addAll(json.directories.stream().map(VaultSettings::new).toList());
|
||||
|
||||
@@ -149,6 +154,7 @@ public class Settings {
|
||||
lastSuccessfulUpdateCheck.addListener(this::somethingChanged);
|
||||
previouslyUsedVaultDirectory.addListener(this::somethingChanged);
|
||||
lastUpdateAttemptedByVersion.addListener(this::somethingChanged);
|
||||
trustedHosts.addListener(this::somethingChanged);
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@@ -207,6 +213,7 @@ public class Settings {
|
||||
json.lastSuccessfulUpdateCheck = lastSuccessfulUpdateCheck.get();
|
||||
json.previouslyUsedVaultDirectory = previouslyUsedVaultDirectory.get();
|
||||
json.lastUpdateAttemptedByVersion = lastUpdateAttemptedByVersion.get();
|
||||
json.trustedHosts = Set.copyOf(trustedHosts);
|
||||
return json;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,17 +4,23 @@ import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.fasterxml.jackson.annotation.JsonSetter;
|
||||
import com.fasterxml.jackson.annotation.Nulls;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
class SettingsJson {
|
||||
|
||||
@JsonProperty("directories")
|
||||
List<VaultSettingsJson> directories = List.of();
|
||||
@JsonSetter(nulls = Nulls.AS_EMPTY)
|
||||
List<VaultSettingsJson> directories = new ArrayList<>();
|
||||
|
||||
@JsonProperty("writtenByVersion")
|
||||
String writtenByVersion;
|
||||
@@ -99,4 +105,8 @@ class SettingsJson {
|
||||
|
||||
@JsonProperty("lastUpdateAttemptedByVersion")
|
||||
String lastUpdateAttemptedByVersion;
|
||||
|
||||
@JsonProperty("trustedHosts")
|
||||
@JsonSetter(nulls = Nulls.AS_EMPTY)
|
||||
Set<String> trustedHosts = new HashSet<>();
|
||||
}
|
||||
|
||||
@@ -27,6 +27,8 @@ import java.util.Set;
|
||||
* <li>cryptomator.p12Path</li>
|
||||
* <li>cryptomator.mountPointsDir</li>
|
||||
* <li>cryptomator.disableUpdateCheck</li>
|
||||
* <li>cryptomator.hub.allowedHosts</li>
|
||||
* <li>cryptomator.hub.enableTrustOnFirstUse</li>
|
||||
* </ul>
|
||||
*
|
||||
* @see Properties
|
||||
@@ -42,7 +44,9 @@ class AdminPropertiesFactory {
|
||||
"cryptomator.pluginDir", //
|
||||
"cryptomator.p12Path", //
|
||||
"cryptomator.mountPointsDir", //
|
||||
"cryptomator.disableUpdateCheck");
|
||||
"cryptomator.disableUpdateCheck", //
|
||||
"cryptomator.hub.allowedHosts", //
|
||||
"cryptomator.hub.enableTrustOnFirstUse");
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -19,6 +19,7 @@ public enum FxmlFile {
|
||||
HEALTH_START("/fxml/health_start.fxml"), //
|
||||
HEALTH_CHECK_LIST("/fxml/health_check_list.fxml"), //
|
||||
HUB_NO_KEYCHAIN("/fxml/hub_no_keychain.fxml"), //
|
||||
HUB_CHECK_HOST_TRUST("/fxml/hub_check_host_trust.fxml"), //
|
||||
HUB_AUTH_FLOW("/fxml/hub_auth_flow.fxml"), //
|
||||
HUB_INVALID_LICENSE("/fxml/hub_invalid_license.fxml"), //
|
||||
HUB_RECEIVE_KEY("/fxml/hub_receive_key.fxml"), //
|
||||
@@ -29,6 +30,7 @@ public enum FxmlFile {
|
||||
HUB_REGISTER_FAILED("/fxml/hub_register_failed.fxml"), //
|
||||
HUB_REGISTER_DEVICE("/fxml/hub_register_device.fxml"), //
|
||||
HUB_UNAUTHORIZED_DEVICE("/fxml/hub_unauthorized_device.fxml"), //
|
||||
HUB_UNTRUSTED_HOST("/fxml/hub_untrusted_host.fxml"), //
|
||||
HUB_REQUIRE_ACCOUNT_INIT("/fxml/hub_require_account_init.fxml"), //
|
||||
LOCK_FORCED("/fxml/lock_forced.fxml"), //
|
||||
LOCK_FAILED("/fxml/lock_failed.fxml"), //
|
||||
|
||||
@@ -58,8 +58,6 @@ public class DecryptFileNamesViewController implements FxController {
|
||||
private final Stage window;
|
||||
private final Vault vault;
|
||||
private final ResourceBundle resourceBundle;
|
||||
private final List<Path> initialList;
|
||||
|
||||
@FXML
|
||||
public TableColumn<CipherAndCleartext, String> ciphertextColumn;
|
||||
@FXML
|
||||
@@ -68,12 +66,11 @@ public class DecryptFileNamesViewController implements FxController {
|
||||
public TableView<CipherAndCleartext> cipherToCleartextTable;
|
||||
|
||||
@Inject
|
||||
public DecryptFileNamesViewController(@DecryptNameWindow Stage window, @DecryptNameWindow Vault vault, @DecryptNameWindow List<Path> pathsToDecrypt, ResourceBundle resourceBundle) {
|
||||
public DecryptFileNamesViewController(@DecryptNameWindow Stage window, @DecryptNameWindow Vault vault, ResourceBundle resourceBundle) {
|
||||
this.window = window;
|
||||
this.vault = vault;
|
||||
this.resourceBundle = resourceBundle;
|
||||
this.mapping = new SimpleListProperty<>(FXCollections.observableArrayList());
|
||||
this.initialList = pathsToDecrypt;
|
||||
}
|
||||
|
||||
@FXML
|
||||
@@ -97,8 +94,7 @@ public class DecryptFileNamesViewController implements FxController {
|
||||
});
|
||||
cipherToCleartextTable.setOnDragDropped(event -> {
|
||||
if (event.getGestureSource() == null && event.getDragboard().hasFiles()) {
|
||||
checkAndDecrypt(event.getDragboard().getFiles().stream().map(File::toPath).toList());
|
||||
cipherToCleartextTable.setItems(mapping);
|
||||
decrypt(event.getDragboard().getFiles().stream().map(File::toPath).toList());
|
||||
}
|
||||
});
|
||||
cipherToCleartextTable.setOnDragExited(_ -> cipherToCleartextTable.setItems(mapping));
|
||||
@@ -124,9 +120,7 @@ public class DecryptFileNamesViewController implements FxController {
|
||||
});
|
||||
}
|
||||
});
|
||||
if (!initialList.isEmpty()) {
|
||||
checkAndDecrypt(initialList);
|
||||
}
|
||||
window.setOnHidden(_ -> mapping.clear());
|
||||
}
|
||||
|
||||
private void copySingleCelltoClipboard() {
|
||||
@@ -149,10 +143,18 @@ public class DecryptFileNamesViewController implements FxController {
|
||||
fileChooser.setInitialDirectory(vault.getPath().toFile());
|
||||
var ciphertextNodes = fileChooser.showOpenMultipleDialog(window);
|
||||
if (ciphertextNodes != null) {
|
||||
checkAndDecrypt(ciphertextNodes.stream().map(File::toPath).toList());
|
||||
decrypt(ciphertextNodes.stream().map(File::toPath).toList());
|
||||
}
|
||||
}
|
||||
|
||||
public void decrypt(List<Path> pathsToDecrypt) {
|
||||
if (pathsToDecrypt.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
checkAndDecrypt(pathsToDecrypt);
|
||||
cipherToCleartextTable.setItems(mapping);
|
||||
}
|
||||
|
||||
private void checkAndDecrypt(List<Path> pathsToDecrypt) {
|
||||
mapping.clear();
|
||||
//Assumption: All files are in the same directory
|
||||
|
||||
@@ -28,23 +28,28 @@ public interface DecryptNameComponent {
|
||||
@FxmlScene(FxmlFile.DECRYPTNAMES)
|
||||
Lazy<Scene> decryptNamesView();
|
||||
|
||||
DecryptFileNamesViewController controller();
|
||||
|
||||
@DecryptNameWindow
|
||||
Vault vault();
|
||||
|
||||
default void showDecryptFileNameWindow() {
|
||||
default void showDecryptFileNameWindow(List<Path> pathsToDecrypt) {
|
||||
Stage s = window();
|
||||
s.setScene(decryptNamesView().get());
|
||||
s.sizeToScene();
|
||||
if (vault().isUnlocked()) {
|
||||
controller().decrypt(pathsToDecrypt);
|
||||
s.show();
|
||||
s.requestFocus();
|
||||
} else {
|
||||
LOG.error("Aborted showing DecryptFileName window: vault state is not {}, but {}.", VaultState.Value.UNLOCKED, vault().getState());
|
||||
s.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Subcomponent.Factory
|
||||
interface Factory {
|
||||
|
||||
DecryptNameComponent create(@BindsInstance @DecryptNameWindow Vault vault, @BindsInstance @Named("windowOwner") Stage owner, @BindsInstance @DecryptNameWindow List<Path> pathsToDecrypt);
|
||||
DecryptNameComponent create(@BindsInstance @DecryptNameWindow Vault vault, @BindsInstance @Named("windowOwner") Stage owner);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,17 +64,6 @@ abstract class FxApplicationModule {
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FxApplicationScoped
|
||||
static MainWindowComponent provideMainWindowComponent(MainWindowComponent.Builder builder) {
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FxApplicationScoped
|
||||
static PreferencesComponent providePreferencesComponent(PreferencesComponent.Builder builder) {
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FxApplicationScoped
|
||||
@@ -88,10 +77,4 @@ abstract class FxApplicationModule {
|
||||
return factory.create();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FxApplicationScoped
|
||||
static NotificationComponent provideNotificationComponent(NotificationComponent.Factory factory) {
|
||||
return factory.create();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -39,6 +39,7 @@ import java.util.Optional;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.CompletionStage;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
@FxApplicationScoped
|
||||
public class FxApplicationWindows {
|
||||
@@ -47,15 +48,15 @@ public class FxApplicationWindows {
|
||||
|
||||
private final Stage primaryStage;
|
||||
private final Optional<TrayIntegrationProvider> trayIntegration;
|
||||
private final Lazy<MainWindowComponent> mainWindow;
|
||||
private final Lazy<PreferencesComponent> preferencesWindow;
|
||||
private final CachedLazy<MainWindowComponent> mainWindow;
|
||||
private final CachedLazy<PreferencesComponent> preferencesWindow;
|
||||
private final QuitComponent.Builder quitWindowBuilder;
|
||||
private final UnlockComponent.Factory unlockWorkflowFactory;
|
||||
private final UpdateReminderComponent.Factory updateReminderWindowFactory;
|
||||
private final LockComponent.Factory lockWorkflowFactory;
|
||||
private final ErrorComponent.Factory errorWindowFactory;
|
||||
private final Lazy<EventViewComponent> eventViewWindow;
|
||||
private final Lazy<NotificationComponent> notificationWindow;
|
||||
private final CachedLazy<EventViewComponent> eventViewWindow;
|
||||
private final CachedLazy<NotificationComponent> notificationWindow;
|
||||
private final ExecutorService executor;
|
||||
private final VaultOptionsComponent.Factory vaultOptionsWindow;
|
||||
private final ShareVaultComponent.Factory shareVaultWindow;
|
||||
@@ -65,8 +66,8 @@ public class FxApplicationWindows {
|
||||
@Inject
|
||||
public FxApplicationWindows(@PrimaryStage Stage primaryStage, //
|
||||
Optional<TrayIntegrationProvider> trayIntegration, //
|
||||
Lazy<MainWindowComponent> mainWindow, //
|
||||
Lazy<PreferencesComponent> preferencesWindow, //
|
||||
MainWindowComponent.Builder mainWindowBuilder, //
|
||||
PreferencesComponent.Builder preferencesWindowBuilder, //
|
||||
QuitComponent.Builder quitWindowBuilder, //
|
||||
UnlockComponent.Factory unlockWorkflowFactory, //
|
||||
UpdateReminderComponent.Factory updateReminderWindowFactory, //
|
||||
@@ -74,21 +75,21 @@ public class FxApplicationWindows {
|
||||
ErrorComponent.Factory errorWindowFactory, //
|
||||
VaultOptionsComponent.Factory vaultOptionsWindow, //
|
||||
ShareVaultComponent.Factory shareVaultWindow, //
|
||||
Lazy<EventViewComponent> eventViewWindow, //
|
||||
Lazy<NotificationComponent> notificationWindow,
|
||||
EventViewComponent.Factory eventViewWindowFactory, //
|
||||
NotificationComponent.Factory notificationWindowFactory, //
|
||||
ExecutorService executor, //
|
||||
Dialogs dialogs) {
|
||||
this.primaryStage = primaryStage;
|
||||
this.trayIntegration = trayIntegration;
|
||||
this.mainWindow = mainWindow;
|
||||
this.preferencesWindow = preferencesWindow;
|
||||
this.mainWindow = new CachedLazy<>(mainWindowBuilder::build);
|
||||
this.preferencesWindow = new CachedLazy<>(preferencesWindowBuilder::build);
|
||||
this.quitWindowBuilder = quitWindowBuilder;
|
||||
this.unlockWorkflowFactory = unlockWorkflowFactory;
|
||||
this.updateReminderWindowFactory = updateReminderWindowFactory;
|
||||
this.lockWorkflowFactory = lockWorkflowFactory;
|
||||
this.errorWindowFactory = errorWindowFactory;
|
||||
this.eventViewWindow = eventViewWindow;
|
||||
this.notificationWindow = notificationWindow;
|
||||
this.eventViewWindow = new CachedLazy<>(eventViewWindowFactory::create);
|
||||
this.notificationWindow = new CachedLazy<>(notificationWindowFactory::create);
|
||||
this.executor = executor;
|
||||
this.vaultOptionsWindow = vaultOptionsWindow;
|
||||
this.shareVaultWindow = shareVaultWindow;
|
||||
@@ -218,4 +219,29 @@ public class FxApplicationWindows {
|
||||
LOG.error("Failed to display stage", error);
|
||||
}
|
||||
}
|
||||
|
||||
private static class CachedLazy<T> implements Lazy<T> {
|
||||
|
||||
private final Supplier<T> supplier;
|
||||
private volatile T instance = null;
|
||||
|
||||
public CachedLazy(Supplier<T> supplier) {
|
||||
this.supplier = supplier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public T get() {
|
||||
T value = instance;
|
||||
if (value == null) {
|
||||
synchronized (this) {
|
||||
value = instance;
|
||||
if (value == null) {
|
||||
value = supplier.get();
|
||||
instance = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package org.cryptomator.ui.keyloading.hub;
|
||||
|
||||
import com.nimbusds.jose.JWEObject;
|
||||
import dagger.Lazy;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.cryptomator.ui.common.FxmlFile;
|
||||
@@ -12,8 +11,6 @@ import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javafx.application.Application;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.binding.Bindings;
|
||||
import javafx.beans.binding.StringBinding;
|
||||
import javafx.beans.property.ObjectProperty;
|
||||
import javafx.beans.property.SimpleObjectProperty;
|
||||
import javafx.concurrent.WorkerStateEvent;
|
||||
|
||||
@@ -0,0 +1,179 @@
|
||||
package org.cryptomator.ui.keyloading.hub;
|
||||
|
||||
import dagger.Lazy;
|
||||
import org.cryptomator.common.Environment;
|
||||
import org.cryptomator.common.settings.Settings;
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.cryptomator.ui.common.FxmlFile;
|
||||
import org.cryptomator.ui.common.FxmlScene;
|
||||
import org.cryptomator.ui.keyloading.KeyLoading;
|
||||
import org.cryptomator.ui.keyloading.KeyLoadingScoped;
|
||||
import org.jetbrains.annotations.VisibleForTesting;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.property.SimpleStringProperty;
|
||||
import javafx.beans.property.StringProperty;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.text.Text;
|
||||
import javafx.scene.text.TextFlow;
|
||||
import javafx.stage.Stage;
|
||||
import java.net.URI;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.Set;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
@KeyLoadingScoped
|
||||
public class CheckHostTrustController implements FxController {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(CheckHostTrustController.class);
|
||||
private static final String CHECK_KEY = "hub.checkHostTrust.message.check";
|
||||
private static final String ASK_SINGULAR_KEY = "hub.checkHostTrust.message.ask";
|
||||
private static final String ASK_PLURAL_KEY = "hub.checkHostTrust.message.ask.plural";
|
||||
private static final String TRUSTED_CRYPTOMATOR_CLOUD_DOMAIN = ".cryptomator.cloud";
|
||||
|
||||
private final Stage window;
|
||||
private final HubConfig hubConfig;
|
||||
private final URI canonicalHubUri;
|
||||
private final URI canonicalAuthUri;
|
||||
private final Lazy<Scene> authFlowScene;
|
||||
private final Lazy<Scene> untrustedHostScene;
|
||||
private final CompletableFuture<ReceivedKey> result;
|
||||
private final Settings settings;
|
||||
private final Environment env;
|
||||
private final ResourceBundle resourceBundle;
|
||||
private final SortedSet<String> hostnames;
|
||||
private final StringProperty messageLabel;
|
||||
|
||||
@FXML
|
||||
private TextFlow hostnamesFlow;
|
||||
|
||||
@Inject
|
||||
public CheckHostTrustController(@KeyLoading Stage window, //
|
||||
HubConfig hubConfig, //
|
||||
@FxmlScene(FxmlFile.HUB_AUTH_FLOW) Lazy<Scene> authFlowScene, //
|
||||
@FxmlScene(FxmlFile.HUB_UNTRUSTED_HOST) Lazy<Scene> untrustedHostScene, //
|
||||
CompletableFuture<ReceivedKey> result, //
|
||||
Settings settings, //
|
||||
Environment env, //
|
||||
ResourceBundle resourceBundle) {
|
||||
this.window = window;
|
||||
this.hubConfig = hubConfig;
|
||||
this.canonicalHubUri = hubConfig.getApiBaseUrl();
|
||||
this.canonicalAuthUri = URI.create(hubConfig.authEndpoint);
|
||||
this.authFlowScene = authFlowScene;
|
||||
this.untrustedHostScene = untrustedHostScene;
|
||||
this.result = result;
|
||||
this.settings = settings;
|
||||
this.env = env;
|
||||
this.resourceBundle = resourceBundle;
|
||||
this.hostnames = new TreeSet<>();
|
||||
this.messageLabel = new SimpleStringProperty(resourceBundle.getString(CHECK_KEY));
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void initialize() {
|
||||
if (!isConsistentHubConfig()) {
|
||||
LOG.warn("Inconsistent hub config detected. Denying access to protect the user.");
|
||||
deny();
|
||||
} else if (isAllCryptomatorCloud() && !isAnyHttpHost()) {
|
||||
trust(); // trust *.cryptomator.cloud by default, domain is owned by Cryptomator maintainers
|
||||
} else if (containsAllowedHosts(env.hubAllowedHosts())) {
|
||||
trust(); // trust hosts explicitly allowlisted via system property
|
||||
} else if (isAnyHttpHost() && !isAllLocalhost()) {
|
||||
LOG.warn("Denying attempt to connect to hub instance via unencrypted HTTP.");
|
||||
deny(); // never trust http hosts except for local testing
|
||||
} else if (env.hubTrustOnFirstUse() && containsAllowedHosts(settings.trustedHosts)) {
|
||||
trust(); // trust hosts previously allowlisted by the user
|
||||
} else if (env.hubTrustOnFirstUse()) {
|
||||
hostnames.add(getAuthority(canonicalHubUri));
|
||||
hostnames.add(getAuthority(canonicalAuthUri));
|
||||
renderHostnames(); // ask user whether to trust these hosts
|
||||
} else {
|
||||
LOG.warn("Cryptomator is not allowed to connect to {}. Check your {} config.", getAuthority(canonicalHubUri), Environment.HUB_ALLOWED_HOSTS_PROP_NAME);
|
||||
deny();
|
||||
}
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void trust() {
|
||||
settings.trustedHosts.addAll(hostnames);
|
||||
Platform.runLater(() -> {
|
||||
window.setScene(authFlowScene.get());
|
||||
});
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void deny() {
|
||||
result.cancel(true);
|
||||
Platform.runLater(() -> {
|
||||
window.setScene(untrustedHostScene.get());
|
||||
});
|
||||
}
|
||||
|
||||
private void renderHostnames() {
|
||||
hostnamesFlow.getChildren().clear();
|
||||
for (var hostname : hostnames) {
|
||||
hostnamesFlow.getChildren().add(new Text(hostname + System.lineSeparator()));
|
||||
}
|
||||
var messageKey = hostnames.size() > 1 ? ASK_PLURAL_KEY : ASK_SINGULAR_KEY;
|
||||
messageLabel.set(resourceBundle.getString(messageKey));
|
||||
}
|
||||
|
||||
private boolean isConsistentHubConfig() {
|
||||
var canonicalHubAuthority = getAuthority(canonicalHubUri);
|
||||
var canonicalAuthAuthority = getAuthority(canonicalAuthUri);
|
||||
|
||||
// apiBaseURL.host == deviceUrl.host == authSuccessUrl.host == authErrorUrl.host
|
||||
return (hubConfig.apiBaseUrl == null || getAuthority(hubConfig.apiBaseUrl).equals(canonicalHubAuthority)) //
|
||||
&& (hubConfig.devicesResourceUrl == null || getAuthority(hubConfig.devicesResourceUrl).equals(canonicalHubAuthority)) //
|
||||
&& getAuthority(hubConfig.authSuccessUrl).equals(canonicalHubAuthority) //
|
||||
&& getAuthority(hubConfig.authErrorUrl).equals(canonicalHubAuthority) //
|
||||
// authUrl.host == tokenUrl.host:
|
||||
&& getAuthority(hubConfig.tokenEndpoint).equals(canonicalAuthAuthority);
|
||||
}
|
||||
|
||||
private boolean isAllCryptomatorCloud() {
|
||||
return canonicalHubUri.getHost().endsWith(TRUSTED_CRYPTOMATOR_CLOUD_DOMAIN) && canonicalAuthUri.getHost().endsWith(TRUSTED_CRYPTOMATOR_CLOUD_DOMAIN);
|
||||
}
|
||||
|
||||
private boolean isAnyHttpHost() {
|
||||
return "http".equalsIgnoreCase(canonicalHubUri.getScheme()) || "http".equalsIgnoreCase(canonicalAuthUri.getScheme());
|
||||
}
|
||||
|
||||
private boolean isAllLocalhost() {
|
||||
return "localhost".equalsIgnoreCase(canonicalHubUri.getHost()) && "localhost".equalsIgnoreCase(canonicalAuthUri.getHost());
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
boolean containsAllowedHosts(Set<String> allowedHubHosts) {
|
||||
return allowedHubHosts.contains(getAuthority(canonicalHubUri)) && allowedHubHosts.contains(getAuthority(canonicalAuthUri));
|
||||
}
|
||||
|
||||
public static String getAuthority(String string) {
|
||||
return getAuthority(URI.create(string));
|
||||
}
|
||||
|
||||
public static String getAuthority(URI uri) {
|
||||
if (uri.getPort() == -1) {
|
||||
return "%s://%s".formatted(uri.getScheme(), uri.getHost());
|
||||
} else {
|
||||
return "%s://%s:%s".formatted(uri.getScheme(), uri.getHost(), uri.getPort());
|
||||
}
|
||||
}
|
||||
|
||||
//--- JavaFX property getter & setter
|
||||
public StringProperty messageLabelProperty() {
|
||||
return messageLabel;
|
||||
}
|
||||
|
||||
public String getMessageLabel() {
|
||||
return messageLabel.get();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -98,6 +98,13 @@ public abstract class HubKeyLoadingModule {
|
||||
return fxmlLoaders.createScene(FxmlFile.HUB_NO_KEYCHAIN);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FxmlScene(FxmlFile.HUB_CHECK_HOST_TRUST)
|
||||
@KeyLoadingScoped
|
||||
static Scene provideHubCheckHostTrustScene(@KeyLoading FxmlLoaderFactory fxmlLoaders) {
|
||||
return fxmlLoaders.createScene(FxmlFile.HUB_CHECK_HOST_TRUST);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FxmlScene(FxmlFile.HUB_AUTH_FLOW)
|
||||
@KeyLoadingScoped
|
||||
@@ -168,6 +175,13 @@ public abstract class HubKeyLoadingModule {
|
||||
return fxmlLoaders.createScene(FxmlFile.HUB_UNAUTHORIZED_DEVICE);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FxmlScene(FxmlFile.HUB_UNTRUSTED_HOST)
|
||||
@KeyLoadingScoped
|
||||
static Scene provideHubUntrustedHostScene(@KeyLoading FxmlLoaderFactory fxmlLoaders) {
|
||||
return fxmlLoaders.createScene(FxmlFile.HUB_UNTRUSTED_HOST);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@FxmlScene(FxmlFile.HUB_REQUIRE_ACCOUNT_INIT)
|
||||
@KeyLoadingScoped
|
||||
@@ -180,6 +194,11 @@ public abstract class HubKeyLoadingModule {
|
||||
@FxControllerKey(NoKeychainController.class)
|
||||
abstract FxController bindNoKeychainController(NoKeychainController controller);
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FxControllerKey(CheckHostTrustController.class)
|
||||
abstract FxController bindCheckHostAuthenticityController(CheckHostTrustController controller);
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FxControllerKey(AuthFlowController.class)
|
||||
@@ -225,6 +244,11 @@ public abstract class HubKeyLoadingModule {
|
||||
@FxControllerKey(UnauthorizedDeviceController.class)
|
||||
abstract FxController bindUnauthorizedDeviceController(UnauthorizedDeviceController controller);
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FxControllerKey(UntrustedHostController.class)
|
||||
abstract FxController bindUnauthorizedHostController(UntrustedHostController controller);
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@FxControllerKey(RequireAccountInitController.class)
|
||||
|
||||
@@ -36,19 +36,19 @@ public class HubKeyLoadingStrategy implements KeyLoadingStrategy, FilesystemOwne
|
||||
private final Stage window;
|
||||
private final KeychainManager keychainManager;
|
||||
private final AtomicReference<String> fsOwnerId;
|
||||
private final Lazy<Scene> authFlowScene;
|
||||
private final Lazy<Scene> checkHostTrustScene;
|
||||
private final Lazy<Scene> noKeychainScene;
|
||||
private final CompletableFuture<ReceivedKey> result;
|
||||
private final DeviceKey deviceKey;
|
||||
|
||||
@Inject
|
||||
public HubKeyLoadingStrategy(@KeyLoading Stage window, @FxmlScene(FxmlFile.HUB_AUTH_FLOW) Lazy<Scene> authFlowScene, @FxmlScene(FxmlFile.HUB_NO_KEYCHAIN) Lazy<Scene> noKeychainScene, CompletableFuture<ReceivedKey> result, DeviceKey deviceKey, KeychainManager keychainManager, @Named("windowTitle") String windowTitle, @Named("filesystemOwnerId") AtomicReference<String> fsOwnerId) {
|
||||
public HubKeyLoadingStrategy(@KeyLoading Stage window, @FxmlScene(FxmlFile.HUB_CHECK_HOST_TRUST) Lazy<Scene> checkHostTrustScene, @FxmlScene(FxmlFile.HUB_NO_KEYCHAIN) Lazy<Scene> noKeychainScene, CompletableFuture<ReceivedKey> result, DeviceKey deviceKey, KeychainManager keychainManager, @Named("windowTitle") String windowTitle, @Named("filesystemOwnerId") AtomicReference<String> fsOwnerId) {
|
||||
this.window = window;
|
||||
this.keychainManager = keychainManager;
|
||||
this.fsOwnerId = fsOwnerId;
|
||||
window.setTitle(windowTitle);
|
||||
window.setOnCloseRequest(_ -> result.cancel(true));
|
||||
this.authFlowScene = authFlowScene;
|
||||
this.checkHostTrustScene = checkHostTrustScene;
|
||||
this.noKeychainScene = noKeychainScene;
|
||||
this.result = result;
|
||||
this.deviceKey = deviceKey;
|
||||
@@ -62,7 +62,7 @@ public class HubKeyLoadingStrategy implements KeyLoadingStrategy, FilesystemOwne
|
||||
throw new NoKeychainAccessProviderException();
|
||||
}
|
||||
var keypair = deviceKey.get();
|
||||
showWindow(authFlowScene);
|
||||
showWindow(checkHostTrustScene);
|
||||
var jwe = result.get();
|
||||
return jwe.decryptMasterkey(keypair.getPrivate());
|
||||
} catch (NoKeychainAccessProviderException e) {
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
package org.cryptomator.ui.keyloading.hub;
|
||||
|
||||
import org.cryptomator.ui.common.FxController;
|
||||
import org.cryptomator.ui.keyloading.KeyLoading;
|
||||
import org.cryptomator.ui.keyloading.KeyLoadingScoped;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.stage.Stage;
|
||||
import javafx.stage.WindowEvent;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
@KeyLoadingScoped
|
||||
public class UntrustedHostController implements FxController {
|
||||
|
||||
private final Stage window;
|
||||
private final CompletableFuture<ReceivedKey> result;
|
||||
|
||||
@Inject
|
||||
public UntrustedHostController(@KeyLoading Stage window, CompletableFuture<ReceivedKey> result) {
|
||||
this.window = window;
|
||||
this.result = result;
|
||||
this.window.addEventHandler(WindowEvent.WINDOW_HIDING, this::windowClosed);
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void close() {
|
||||
window.close();
|
||||
}
|
||||
|
||||
private void windowClosed(WindowEvent windowEvent) {
|
||||
result.cancel(true);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.cryptomator.ui.keyloading.masterkeyfile;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import org.cryptomator.common.Constants;
|
||||
import org.cryptomator.common.Passphrase;
|
||||
import org.cryptomator.common.keychain.KeychainManager;
|
||||
import org.cryptomator.common.vaults.Vault;
|
||||
@@ -63,16 +64,21 @@ public class MasterkeyFileLoadingStrategy implements KeyLoadingStrategy {
|
||||
public Masterkey loadKey(URI keyId) throws MasterkeyLoadingFailedException {
|
||||
window.setTitle(resourceBundle.getString("unlock.title").formatted(vault.getDisplayName()));
|
||||
Preconditions.checkArgument(SCHEME.equalsIgnoreCase(keyId.getScheme()), "Only supports keys with scheme " + SCHEME);
|
||||
if (!Constants.MASTERKEY_FILENAME.equals(keyId.getSchemeSpecificPart())) {
|
||||
LOG.warn("unsupported masterkey path found in vault.cryptomator: {}", keyId.getSchemeSpecificPart());
|
||||
}
|
||||
try {
|
||||
Path filePath = vault.getPath().resolve(keyId.getSchemeSpecificPart());
|
||||
// determine masterkey file path:
|
||||
Path filePath = vault.getPath().resolve(Constants.MASTERKEY_FILENAME);
|
||||
if (!Files.exists(filePath)) {
|
||||
filePath = askUserForMasterkeyFilePath();
|
||||
}
|
||||
// unlock:
|
||||
if (passphrase == null) {
|
||||
askForPassphrase();
|
||||
}
|
||||
var masterkey = masterkeyFileAccess.load(filePath, passphrase);
|
||||
//backup
|
||||
// backup on successful unlock:
|
||||
if (filePath.startsWith(vault.getPath())) {
|
||||
try {
|
||||
BackupHelper.attemptBackup(filePath);
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
package org.cryptomator.ui.mainwindow;
|
||||
|
||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.cache.CacheBuilder;
|
||||
import com.google.common.cache.CacheLoader;
|
||||
import com.google.common.cache.LoadingCache;
|
||||
import com.tobiasdiez.easybind.EasyBind;
|
||||
import org.apache.commons.lang3.SystemUtils;
|
||||
import org.cryptomator.common.Nullable;
|
||||
@@ -58,6 +57,7 @@ public class VaultDetailUnlockedController implements FxController {
|
||||
private final DecryptNameComponent.Factory decryptNameWindowFactory;
|
||||
private final ResourceBundle resourceBundle;
|
||||
private final LoadingCache<Vault, VaultStatisticsComponent> vaultStats;
|
||||
private final LoadingCache<Vault, DecryptNameComponent> decryptNameWindows;
|
||||
private final VaultStatisticsComponent.Builder vaultStatsBuilder;
|
||||
private final ObservableValue<Boolean> accessibleViaPath;
|
||||
private final ObservableValue<Boolean> accessibleViaUri;
|
||||
@@ -89,7 +89,8 @@ public class VaultDetailUnlockedController implements FxController {
|
||||
this.revealPathService = revealPathService;
|
||||
this.decryptNameWindowFactory = decryptNameWindowFactory;
|
||||
this.resourceBundle = resourceBundle;
|
||||
this.vaultStats = CacheBuilder.newBuilder().weakValues().build(CacheLoader.from(this::buildVaultStats));
|
||||
this.vaultStats = Caffeine.newBuilder().weakValues().build(this::buildVaultStats);
|
||||
this.decryptNameWindows = Caffeine.newBuilder().weakValues().build(this::buildDecryptNameWindow);
|
||||
this.vaultStatsBuilder = vaultStatsBuilder;
|
||||
var mp = vault.flatMap(Vault::mountPointProperty);
|
||||
this.accessibleViaPath = mp.map(m -> m instanceof Mountpoint.WithPath).orElse(false);
|
||||
@@ -161,7 +162,7 @@ public class VaultDetailUnlockedController implements FxController {
|
||||
}
|
||||
|
||||
private void showDecryptNameWindow(List<Path> pathsToDecrypt) {
|
||||
decryptNameWindowFactory.create(vault.get(), mainWindow, pathsToDecrypt).showDecryptFileNameWindow();
|
||||
decryptNameWindows.get(vault.get()).showDecryptFileNameWindow(pathsToDecrypt);
|
||||
}
|
||||
|
||||
private boolean startsWithVaultAccessPoint(Path path) {
|
||||
@@ -198,6 +199,10 @@ public class VaultDetailUnlockedController implements FxController {
|
||||
return vaultStatsBuilder.vault(vault).build();
|
||||
}
|
||||
|
||||
private DecryptNameComponent buildDecryptNameWindow(Vault vault) {
|
||||
return decryptNameWindowFactory.create(vault, mainWindow);
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void revealAccessLocation() {
|
||||
vaultService.reveal(vault.get());
|
||||
@@ -217,7 +222,7 @@ public class VaultDetailUnlockedController implements FxController {
|
||||
|
||||
@FXML
|
||||
public void showVaultStatistics() {
|
||||
vaultStats.getUnchecked(vault.get()).showVaultStatisticsWindow();
|
||||
vaultStats.get(vault.get()).showVaultStatisticsWindow();
|
||||
}
|
||||
|
||||
/* Getter/Setter */
|
||||
|
||||
@@ -21,6 +21,7 @@ import javax.inject.Inject;
|
||||
import javafx.beans.Observable;
|
||||
import javafx.beans.binding.Bindings;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.CheckBox;
|
||||
import javafx.scene.control.ChoiceBox;
|
||||
import javafx.scene.control.ToggleGroup;
|
||||
@@ -56,6 +57,7 @@ public class GeneralPreferencesController implements FxController {
|
||||
public CheckBox autoCloseVaultsCheckbox;
|
||||
public CheckBox debugModeCheckbox;
|
||||
public CheckBox autoStartCheckbox;
|
||||
public Button resetTrustedHostsButton;
|
||||
public ToggleGroup nodeOrientation;
|
||||
|
||||
private CompletionStage<Void> keychainMigrations = CompletableFuture.completedFuture(null);
|
||||
@@ -105,6 +107,9 @@ public class GeneralPreferencesController implements FxController {
|
||||
quickAccessServiceChoiceBox.setConverter(new NamedServiceConverter<>());
|
||||
Bindings.bindBidirectional(settings.quickAccessService, quickAccessServiceChoiceBox.valueProperty(), quickAccessSettingsConverter);
|
||||
quickAccessServiceChoiceBox.disableProperty().bind(useQuickAccessCheckbox.selectedProperty().not());
|
||||
if (resetTrustedHostsButton != null) {
|
||||
resetTrustedHostsButton.disableProperty().bind(Bindings.isEmpty(settings.trustedHosts));
|
||||
}
|
||||
}
|
||||
|
||||
private void migrateKeychainEntries(Observable observable, KeychainAccessProvider oldProvider, KeychainAccessProvider newProvider) {
|
||||
@@ -131,6 +136,10 @@ public class GeneralPreferencesController implements FxController {
|
||||
return autoStartProvider.isPresent();
|
||||
}
|
||||
|
||||
public boolean isHubTrustOnFirstUseEnabled() {
|
||||
return environment.hubTrustOnFirstUse();
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void toggleAutoStart() {
|
||||
autoStartProvider.ifPresent(autoStart -> {
|
||||
@@ -153,6 +162,11 @@ public class GeneralPreferencesController implements FxController {
|
||||
return !quickAccessServices.isEmpty();
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void resetTrustedHosts() {
|
||||
settings.trustedHosts.clear();
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void showLogfileDirectory() {
|
||||
try {
|
||||
|
||||
@@ -260,7 +260,7 @@ public class UpdatesPreferencesController implements FxController {
|
||||
|
||||
public boolean isProhibitUpdateWhileUnlocked() {
|
||||
// If the result of the last update check was from the fallback mechanism, we don't need to show the warning
|
||||
return !unlockedVaults.isEmpty() && !FallbackUpdateInfo.class.isInstance(updateChecker.getUpdate());
|
||||
return !unlockedVaults.isEmpty() && updateChecker.isUpdateAvailable() && !FallbackUpdateInfo.class.isInstance(updateChecker.getUpdate());
|
||||
}
|
||||
|
||||
public BooleanBinding prohibitUpdateWhileUnlockedProperty() {
|
||||
|
||||
@@ -18,7 +18,10 @@ import java.net.URISyntaxException;
|
||||
public class ShareVaultController implements FxController {
|
||||
|
||||
private static final String SCHEME_PREFIX = "hub+";
|
||||
private static final String VISIT_HUB_URL = "https://cryptomator.org/hub/";
|
||||
private static final String VISIT_HUB_URL = "https://cryptomator.org/hub/" //
|
||||
+ "?utm_source=cryptomator-desktop" //
|
||||
+ "&utm_medium=app" //
|
||||
+ "&utm_campaign=share-vault";
|
||||
private static final String BEST_PRACTICES_URL = "https://docs.cryptomator.org/security/best-practices/#sharing-of-vaults";
|
||||
|
||||
private final Stage window;
|
||||
|
||||
53
src/main/resources/fxml/hub_check_host_trust.fxml
Normal file
53
src/main/resources/fxml/hub_check_host_trust.fxml
Normal file
@@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import org.cryptomator.ui.controls.FontAwesome5IconView?>
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.ButtonBar?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.Group?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<?import javafx.scene.layout.Region?>
|
||||
<?import javafx.scene.layout.StackPane?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.shape.Circle?>
|
||||
<?import javafx.scene.text.TextFlow?>
|
||||
<HBox xmlns:fx="http://javafx.com/fxml"
|
||||
xmlns="http://javafx.com/javafx"
|
||||
fx:controller="org.cryptomator.ui.keyloading.hub.CheckHostTrustController"
|
||||
minWidth="400"
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
<children>
|
||||
<Group>
|
||||
<StackPane>
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="6"/>
|
||||
</padding>
|
||||
<Circle styleClass="glyph-icon-primary" radius="24"/>
|
||||
<FontAwesome5IconView styleClass="glyph-icon-white" glyph="QUESTION" glyphSize="24"/>
|
||||
</StackPane>
|
||||
</Group>
|
||||
<VBox HBox.hgrow="ALWAYS">
|
||||
<Label styleClass="label-large" text="${controller.messageLabel}" wrapText="true" textAlignment="LEFT">
|
||||
<padding>
|
||||
<Insets bottom="6" top="6"/>
|
||||
</padding>
|
||||
</Label>
|
||||
<TextFlow fx:id="hostnamesFlow" styleClass="text-flow" minHeight="60"/>
|
||||
<Region VBox.vgrow="ALWAYS" minHeight="18"/>
|
||||
<ButtonBar buttonMinWidth="120" buttonOrder="+CX">
|
||||
<buttons>
|
||||
<Button text="%hub.checkHostTrust.denyBtn" ButtonBar.buttonData="CANCEL_CLOSE" cancelButton="true" onAction="#deny"/>
|
||||
<Button text="%hub.checkHostTrust.trustBtn" ButtonBar.buttonData="NEXT_FORWARD" defaultButton="true" onAction="#trust"/>
|
||||
</buttons>
|
||||
</ButtonBar>
|
||||
</VBox>
|
||||
</children>
|
||||
</HBox>
|
||||
52
src/main/resources/fxml/hub_untrusted_host.fxml
Normal file
52
src/main/resources/fxml/hub_untrusted_host.fxml
Normal file
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import org.cryptomator.ui.controls.FontAwesome5IconView?>
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.Group?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.ButtonBar?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<?import javafx.scene.layout.Region?>
|
||||
<?import javafx.scene.layout.StackPane?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.shape.Circle?>
|
||||
<HBox xmlns:fx="http://javafx.com/fxml"
|
||||
xmlns="http://javafx.com/javafx"
|
||||
fx:controller="org.cryptomator.ui.keyloading.hub.UntrustedHostController"
|
||||
minWidth="400"
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
<children>
|
||||
<Group>
|
||||
<StackPane>
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="6"/>
|
||||
</padding>
|
||||
<Circle styleClass="glyph-icon-primary" radius="24"/>
|
||||
<FontAwesome5IconView styleClass="glyph-icon-white" glyph="EXCLAMATION" glyphSize="24"/>
|
||||
</StackPane>
|
||||
</Group>
|
||||
<VBox HBox.hgrow="ALWAYS">
|
||||
<Label styleClass="label-large" text="%hub.untrustedHost.message" wrapText="true" textAlignment="LEFT">
|
||||
<padding>
|
||||
<Insets bottom="6" top="6"/>
|
||||
</padding>
|
||||
</Label>
|
||||
<Label text="%hub.untrustedHost.description" wrapText="true"/>
|
||||
<Region VBox.vgrow="ALWAYS" minHeight="18"/>
|
||||
<ButtonBar buttonMinWidth="120" buttonOrder="+C">
|
||||
<buttons>
|
||||
<Button text="%generic.button.close" ButtonBar.buttonData="CANCEL_CLOSE" defaultButton="true" onAction="#close"/>
|
||||
</buttons>
|
||||
</ButtonBar>
|
||||
</VBox>
|
||||
</children>
|
||||
</HBox>
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
</ImageView>
|
||||
<VBox spacing="3" HBox.hgrow="ALWAYS" alignment="CENTER_LEFT">
|
||||
<FormattedLabel styleClass="label-extra-large" format="Cryptomator %s" arg1="${controller.fullApplicationVersion}"/>
|
||||
<Label text="© 2016 – 2025 Skymatic GmbH"/>
|
||||
<Label text="© 2016 – 2026 Skymatic GmbH"/>
|
||||
</VBox>
|
||||
</HBox>
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.CheckBox?>
|
||||
<?import javafx.scene.control.ChoiceBox?>
|
||||
<?import javafx.scene.control.Hyperlink?>
|
||||
@@ -34,6 +35,8 @@
|
||||
<CheckBox fx:id="useQuickAccessCheckbox" text="%preferences.general.quickAccessService"/>
|
||||
<ChoiceBox fx:id="quickAccessServiceChoiceBox" accessibleText="%preferences.general.quickAccessService"/>
|
||||
</HBox>
|
||||
|
||||
<Button fx:id="resetTrustedHostsButton" text="%preferences.general.resetTrustedHosts" visible="${controller.hubTrustOnFirstUseEnabled}" managed="${controller.hubTrustOnFirstUseEnabled}" onAction="#resetTrustedHosts"/>
|
||||
<Region VBox.vgrow="ALWAYS"/>
|
||||
|
||||
<HBox spacing="12" alignment="CENTER_LEFT">
|
||||
|
||||
@@ -162,6 +162,12 @@ unlock.error.title=Unlock "%s" failed
|
||||
hub.noKeychain.message=Unable to access device key
|
||||
hub.noKeychain.description=In order to unlock Hub vaults, a device key is required, which is secured using a keychain. To proceed, enable “%s” and select a keychain in the preferences.
|
||||
hub.noKeychain.openBtn=Open Preferences
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.message.check=Checking Configuration…
|
||||
hub.checkHostTrust.message.ask=Trust this host?
|
||||
hub.checkHostTrust.message.ask.plural=Trust these hosts?
|
||||
hub.checkHostTrust.trustBtn=Trust
|
||||
hub.checkHostTrust.denyBtn=Deny
|
||||
### Waiting
|
||||
hub.auth.message=Waiting for authentication…
|
||||
hub.auth.description=You should automatically be redirected to the login page.
|
||||
@@ -193,6 +199,9 @@ hub.archived.description=This vault has been archived and is no longer accessibl
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Access denied
|
||||
hub.unauthorized.description=You are not authorized to open this vault. Contact the vault's owner to request access.
|
||||
### Untrusted Host
|
||||
hub.untrustedHost.message=Host not trusted
|
||||
hub.untrustedHost.description=Connection to Hub was blocked for your security. If you believe the Hub host is safe, contact your Hub administrator or try again.
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Action required
|
||||
hub.requireAccountInit.description.0=To proceed, please complete the steps required in your
|
||||
@@ -306,6 +315,7 @@ preferences.general.debugDirectory=Reveal log files
|
||||
preferences.general.autoStart=Launch Cryptomator on system start
|
||||
preferences.general.keychainBackend=Store passwords with
|
||||
preferences.general.quickAccessService=Add unlocked vaults to the quick access area
|
||||
preferences.general.resetTrustedHosts=Reset trusted hosts
|
||||
## Interface
|
||||
preferences.interface=Interface
|
||||
preferences.interface.theme=Look & Feel
|
||||
@@ -717,4 +727,4 @@ eventView.entry.inUse.ignoreLock=Ignore use status
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=File is in use on another device
|
||||
notification.inUse.description=The file is open by %s on %s. Ask them to close the file and let synchronization finish. You can ignore the status to open it now, but this may cause conflicts or overwrite newer changes.
|
||||
notification.inUse.action=Ignore Use Status
|
||||
notification.inUse.action=Ignore Use Status
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
## Success
|
||||
## Failure
|
||||
## Hub
|
||||
### Check Host Authenticity
|
||||
### Waiting
|
||||
### Receive Key
|
||||
### Register Device
|
||||
@@ -40,6 +41,7 @@
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
|
||||
@@ -154,4 +156,4 @@
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -154,6 +154,8 @@ unlock.error.title=فشل فتح "%s"
|
||||
hub.noKeychain.message=غير قادر على الوصول إلى مفتاح الجهاز
|
||||
hub.noKeychain.description=من أجل فتح مركز مخازن، مطلوب مفتاح جهاز، يتم تأمينه باستخدام سلسلة مفاتيح. للمضي قدما، قم بتمكين "%s" واختر سلسلة مفاتيح في التفضيلات.
|
||||
hub.noKeychain.openBtn=فتح التفضيلات
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=ثق
|
||||
### Waiting
|
||||
hub.auth.message=جاري الانتظار للمصادقة…
|
||||
hub.auth.description=يجب أن يتم إعادة توجيهك تلقائياً إلى صفحة تسجيل الدخول.
|
||||
@@ -183,6 +185,7 @@ hub.registerFailed.description.deviceAlreadyExists=هذا الجهاز مسجل
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=تم رفض الوصول
|
||||
hub.unauthorized.description=غير مسموح لك بفتح هذا المستودع. اتصل بمالك المستودع لطلب الوصول.
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=مطلوب اتخاذ إجراء
|
||||
hub.requireAccountInit.description.0=للمتابعة، يرجى إكمال الخطوات المطلوبة في
|
||||
@@ -645,4 +648,4 @@ eventView.entry.inUse.showEncrypted=عرض ملَف المشفر
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -151,6 +151,8 @@ unlock.error.title="%s" биге асылманы
|
||||
hub.noKeychain.message=Йыһаз асҡысына инеү рөхсәте юҡ
|
||||
hub.noKeychain.description=Хаб һаҡлағыстарын асыу өсөн йыһаз асҡысы кәрәк, ул иһә асҡыс сылбырында һаҡлана. Артабан “%s” мөмкинлеге бирегеҙ һәм көйләүҙәрҙә асҡыс сылбырын һайлағыҙ.
|
||||
hub.noKeychain.openBtn=Көйләүҙәрҙе ас
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=Ышан
|
||||
### Waiting
|
||||
hub.auth.message=Аутентиклау көтөлә…
|
||||
hub.auth.description=Автоматик рәүештә инеү битенә йүнәлтелергә тейешһегеҙ.
|
||||
@@ -170,6 +172,7 @@ hub.registerSuccess.unlockBtn=Биген ас
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Инеү кире ҡағылды
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Эш-хәрәкәт кәрәкле
|
||||
hub.requireAccountInit.description.0=Дауам итер өсөн, кәрәкле аҙымдар тамамланырға тейеш урын:
|
||||
@@ -555,4 +558,4 @@ dokanySupportEnd.preferencesBtn=Көйләүҙәрҙе ас
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -145,6 +145,7 @@ unlock.error.customPath.description.inUse=Дыскавая літара або
|
||||
hub.noKeychain.message=Няма доступу да ключа прылады
|
||||
hub.noKeychain.description=Каб разамкнуць скарбніцы Hub, патрэбны ключ прылады, які захаваны ў звязку ключоў. Каб працягнуць, уключы "%s" ды абяры звязак ключоў у наладах.
|
||||
hub.noKeychain.openBtn=Адчыніць налады
|
||||
### Check Host Authenticity
|
||||
### Waiting
|
||||
hub.auth.message=Чаканне спраўджання…
|
||||
hub.auth.description=Ты мусіш аўтаматычна перанакіравацца на старонку ўваходу.
|
||||
@@ -162,6 +163,7 @@ hub.registerSuccess.unlockBtn=Адамкнуць
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Адмова ў доступе
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
hub.invalidLicense.message=Несапраўдная ліцэнзія Hub
|
||||
@@ -532,4 +534,4 @@ dokanySupportEnd.preferencesBtn=Адчыніць налады
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -158,6 +158,7 @@ unlock.error.title=Неуспешно отключване на „%s“
|
||||
hub.noKeychain.message=Няма достъп до ключа на устройството
|
||||
hub.noKeychain.description=За да отключите хранилищата в Hub е необходим ключ за устройството, който се защитава с помощта на ключодържател. За да продължите, разрешете „%s“ и изберете ключодържателя в настройките.
|
||||
hub.noKeychain.openBtn=Към настройките
|
||||
### Check Host Authenticity
|
||||
### Waiting
|
||||
hub.auth.message=Изчакване на удостоверяване…
|
||||
hub.auth.description=Автоматично ще бъдете пренасочени към страницата за вход.
|
||||
@@ -177,6 +178,7 @@ hub.registerSuccess.unlockBtn=Отключване
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Отказан достъп
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Необходимо е действие
|
||||
hub.requireAccountInit.description.0=За да продължите завършете необходимите стъпки в
|
||||
@@ -563,4 +565,4 @@ dokanySupportEnd.preferencesBtn=Към настройките
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -92,6 +92,7 @@ unlock.unlockBtn=আনলক করুন
|
||||
## Success
|
||||
## Failure
|
||||
## Hub
|
||||
### Check Host Authenticity
|
||||
### Waiting
|
||||
### Receive Key
|
||||
### Register Device
|
||||
@@ -101,6 +102,7 @@ hub.registerSuccess.unlockBtn=আনলক করুন
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
|
||||
@@ -221,4 +223,4 @@ vaultOptions.mount.mountPoint.directoryPickerButton=নির্বাচন ক
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -104,6 +104,8 @@ unlock.success.rememberChoice=Zapamtite izbor, ne pokazujte ovo ponovo
|
||||
unlock.success.revealBtn=Otkrij pogon
|
||||
## Failure
|
||||
## Hub
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=Povjerenje
|
||||
### Waiting
|
||||
### Receive Key
|
||||
### Register Device
|
||||
@@ -113,6 +115,7 @@ hub.registerSuccess.unlockBtn=Otključaj
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
|
||||
@@ -356,4 +359,4 @@ quit.lockAndQuitBtn=Zaključaj i zatvori
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -155,6 +155,8 @@ unlock.error.title=El desblocatge de "%s" ha fallat
|
||||
hub.noKeychain.message=No es pot accedir a la clau del dispositiu
|
||||
hub.noKeychain.description=Per poder desblocar caixes fortes del Hub es requereix la clau d'un dispositiu, que s'emmagatzema de forma segura en un clauer. Per continuar, habiliti "%s" i seleccioni un clauer en les Preferències.
|
||||
hub.noKeychain.openBtn=Obrir les Preferències
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=Confia-hi
|
||||
### Waiting
|
||||
hub.auth.message=S’està esperant l’autenticació…
|
||||
hub.auth.description=Hauríeu de ser redirigits a la pàgina d'accés.
|
||||
@@ -184,6 +186,7 @@ hub.registerFailed.description.deviceAlreadyExists=El dispositiu ja ha estat reg
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Accés denegat
|
||||
hub.unauthorized.description=No estàs autoritzat a obrir aquesta caixa forta. Contacta amb el seu propietari per obtenir accés.
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Acció necessària
|
||||
hub.requireAccountInit.description.0=Per a continuar, si us plau, seguiu els passos necessaris en el vostre
|
||||
@@ -611,4 +614,4 @@ shareVault.hub.openHub=Obre Cryptomator Hub
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -150,6 +150,8 @@ unlock.error.title=Odemknutí "%s" selhalo
|
||||
hub.noKeychain.message=Nelze získat přístup ke klíči zařízení
|
||||
hub.noKeychain.description=Chcete-li odemknout Hub trezory, je potřeba použít klíč zařízení, který je zabezpečen pomocí klíčenky. Chcete-li pokračovat, povolte „%s“ a vyberte klíčenku v nastavení.
|
||||
hub.noKeychain.openBtn=Otevřít předvolby
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=Důvěřovat
|
||||
### Waiting
|
||||
hub.auth.message=Čekání na ověření…
|
||||
hub.auth.description=Měli byste být automaticky přesměrováni na přihlašovací stránku.
|
||||
@@ -178,6 +180,7 @@ hub.registerFailed.description.deviceAlreadyExists=Toto zařízení je již regi
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Přístup odepřen
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Požadována akce
|
||||
hub.requireAccountInit.description.0=Chcete-li pokračovat, vyplňte prosím požadované kroky ve vašem
|
||||
@@ -572,4 +575,4 @@ shareVault.hub.openHub=Otevřít Cryptomator Hub
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -161,6 +161,12 @@ unlock.error.title=Oplåsning af "%s" mislykkedes
|
||||
hub.noKeychain.message=Kan ikke tilgå enhedsnøgle
|
||||
hub.noKeychain.description=En enhedsnøgle er påkrævet for at låse Hub bokse op. Enhedsnøglen er sikret i en nøglering. For at fortsætte, aktivér “%s” og vælg en nøglering i indstillingerne.
|
||||
hub.noKeychain.openBtn=Åbn Indstillinger
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.message.check=Kontrollerer konfiguration…
|
||||
hub.checkHostTrust.message.ask=Stol på denne vært?
|
||||
hub.checkHostTrust.message.ask.plural=Stol på disse værter?
|
||||
hub.checkHostTrust.trustBtn=Hav tillid
|
||||
hub.checkHostTrust.denyBtn=Afvis
|
||||
### Waiting
|
||||
hub.auth.message=Afventer godkendelse…
|
||||
hub.auth.description=Du burde automatisk blive omdirigeret til login-siden.
|
||||
@@ -192,6 +198,9 @@ hub.archived.description=Denne boks er blevet arkiveret og er ikke længere tilg
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Adgang nægtet
|
||||
hub.unauthorized.description=Du har ikke tilladelse til at åbne denne boks. Kontant ejeren af boksen for at anmode om adgang.
|
||||
### Untrusted Host
|
||||
hub.untrustedHost.message=Vært Ikke pålidelig
|
||||
hub.untrustedHost.description=Forbindelsen til Hub blev blokeret for din sikkerhed. Hvis du mener, at Hub-værten er sikker, så kontakt din Hub-administrator eller prøv igen.
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Handling påkrævet
|
||||
hub.requireAccountInit.description.0=For at fortsætte, skal du fuldføre de nødvendige trin i din
|
||||
@@ -269,6 +278,8 @@ health.check.detail.checkFinishedAndFound=Kontrolproceduren er kørt færdig. Ge
|
||||
health.check.detail.checkFailed=Kontrolproceduren blev afbrudt af en fejl.
|
||||
health.check.detail.checkCancelled=Kontrolproceduren blev annulleret.
|
||||
health.check.detail.listFilters.label=Filter
|
||||
health.check.detail.filterSeverity=Filtrér efter sværhedsgrad
|
||||
health.check.detail.filterFixState=Filtrér efter fix status
|
||||
health.check.detail.fixAllSpecificBtn=Løs alle af type
|
||||
health.check.exportBtn=Eksportér rapport
|
||||
## Result view
|
||||
@@ -303,6 +314,7 @@ preferences.general.debugDirectory=Vis logfiler
|
||||
preferences.general.autoStart=Start Cryptomator automatisk ved opstart
|
||||
preferences.general.keychainBackend=Gem adgangskoder med
|
||||
preferences.general.quickAccessService=Tilføj oplåste bokse til området hurtig adgang
|
||||
preferences.general.resetTrustedHosts=Nulstil betroede værter
|
||||
## Interface
|
||||
preferences.interface=Brugerflade
|
||||
preferences.interface.theme=Udseende
|
||||
@@ -358,6 +370,7 @@ preferences.contribute.promptText=Indsæt koden for supporter-certifikatet her
|
||||
preferences.contribute.thankYou=Tak fordi du støtter Cryptomators open source-udvikling!
|
||||
preferences.contribute.donate=Donér
|
||||
preferences.contribute.sponsor=Sponsor
|
||||
preferences.contribute.removeCert.tooltip=Fjern certifikat
|
||||
|
||||
### Remove License Key Dialog
|
||||
removeCert.title=Fjern certifikat
|
||||
@@ -367,6 +380,7 @@ removeCert.description=Cryptomators kernefunktioner påvirkes ikke af dette. Hve
|
||||
|
||||
## About
|
||||
preferences.about=Om
|
||||
preferences.about.thirdPartyLicenses=Tredjepartslicenser
|
||||
|
||||
# Vault Statistics
|
||||
stats.title=Statistik for %s
|
||||
@@ -406,6 +420,7 @@ stats.access.total=Samlede adgang: %d
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Bokse
|
||||
main.vaultlist.listEntry=Boks %s (%s)
|
||||
main.vaultlist.emptyList.onboardingInstruction=Klik her for at tilføje en boks
|
||||
main.vaultlist.contextMenu.remove=Fjern…
|
||||
main.vaultlist.contextMenu.lock=Lås
|
||||
@@ -419,12 +434,15 @@ main.vaultlist.addVaultBtn.menuItemExisting=Åbn eksisterende boks…
|
||||
main.vaultlist.addVaultBtn.menuItemRecover=Genopret eksisterende boks…
|
||||
main.vaultlist.addVaultButton.tooltip=Tilføj boks
|
||||
main.vaultlist.showEventsButton.tooltip=Åbn begivenhedsvisning
|
||||
main.vaultlist.showPreferencesButton.tooltip=Vis Indstillinger
|
||||
##Notification
|
||||
main.notification.updateAvailable=Opdatering er tilgængelig.
|
||||
main.notification.support=Støt Cryptomator.
|
||||
main.notification.closeButton.tooltip=Luk infobjælke
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Tak fordi du valgte Cryptomator til at beskytte dine filer. Hvis du har brug for hjælp, så tjek vores guider for at komme i gang:
|
||||
main.vaultDetail.storageLocation=Placering af boks
|
||||
### Locked
|
||||
main.vaultDetail.lockedStatus=LÅST
|
||||
main.vaultDetail.unlockBtn=Lås op…
|
||||
@@ -482,6 +500,7 @@ vaultOptions.general=Generelt
|
||||
vaultOptions.general.vaultName=Boks-navn
|
||||
vaultOptions.general.autoLock.lockAfterTimePart1=Lås efter inaktivitet i
|
||||
vaultOptions.general.autoLock.lockAfterTimePart2=minutter
|
||||
vaultOptions.general.autoLock.accessibleText=Lås timeout i minutter
|
||||
vaultOptions.general.unlockAfterStartup=Lås boksen op når Cryptomator starter
|
||||
vaultOptions.general.actionAfterUnlock=Efter oplåsning af boks
|
||||
vaultOptions.general.actionAfterUnlock.ignore=Gør intet
|
||||
@@ -512,6 +531,7 @@ vaultOptions.masterkey.forgetSavedPasswordBtn=Glem gemt adgangskode
|
||||
vaultOptions.masterkey.recoveryKeyExplanation=En gendannelsesnøgle er den eneste måde du kan få adgang til din boks på, hvis du har glemt dit password.
|
||||
vaultOptions.masterkey.showRecoveryKeyBtn=Vis gendannelsesnøgle
|
||||
vaultOptions.masterkey.recoverPasswordBtn=Nulstil adgangskode
|
||||
vaultOptions.masterkey.missingMasterkeyFile=Disse tilvalg er kun tilgængelige hvis masterkeyfilen er til stede i boksmappen.
|
||||
## Hub
|
||||
vaultOptions.hub=Gendannelse
|
||||
vaultOptions.hub.convertInfo=Du kan bruge gendannelsesnøglen til at konvertere denne Hub-boks til en adgangskode-baseret boks i en nødsituation.
|
||||
@@ -665,6 +685,8 @@ decryptNames.filePicker.title=Vælg krypteret fil
|
||||
decryptNames.filePicker.extensionDescription=Cryptomator krypteret fil
|
||||
decryptNames.copyTable.tooltip=Kopiér tabel
|
||||
decryptNames.clearTable.tooltip=Ryd tabel
|
||||
decryptNames.column.encrypted=Krypteret
|
||||
decryptNames.column.decrypted=Dekrypteret
|
||||
decryptNames.copyHint=Kopiér celleindhold med %s
|
||||
decryptNames.dropZone.message=Slip filer eller klik for at vælge
|
||||
decryptNames.dropZone.error.vaultInternalFiles=Boks interne filer med intet dekryptérbart navn valgt
|
||||
@@ -677,6 +699,8 @@ decryptNames.dropZone.error.generic=Kunne ikke dekryptere filnavne
|
||||
eventView.title=Begivenheder
|
||||
eventView.filter.allVaults=Alle
|
||||
eventView.clearListButton.tooltip=Ryd liste
|
||||
eventView.filterVaults=Filtrér efter boks
|
||||
eventView.cell.actionsButton.tooltip=Begivenhedshandlinger
|
||||
## event list entries
|
||||
eventView.entry.vaultLocked.description=Lås "%s" op for detaljer
|
||||
eventView.entry.conflictResolved.message=Løst konflikt
|
||||
@@ -694,6 +718,7 @@ eventView.entry.brokenFileNode.copyDecrypted=Kopiér dekrypteret sti
|
||||
eventView.entry.inUse.message=Fil i brug
|
||||
eventView.entry.inUse.showDecrypted=Vis dekrypteret fil
|
||||
eventView.entry.inUse.showEncrypted=Vis krypteret fil
|
||||
eventView.entry.inUse.copyUserAndDevice=Kopiér låsebruger og enhedsnavn
|
||||
eventView.entry.inUse.ignoreLock=Ignorér anvendelsesstatus
|
||||
|
||||
|
||||
@@ -701,4 +726,4 @@ eventView.entry.inUse.ignoreLock=Ignorér anvendelsesstatus
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=Filen er i brug på en anden enhed
|
||||
notification.inUse.description=Filen er åbnet af %s på %s. Bed dem om at lukke filen og lade synkroniseringen afslutte. Du kan ignorere status for at åbne den nu, men det kan forårsage konflikter eller overskrive nyere ændringer.
|
||||
notification.inUse.action=Ignorér anvendelsesstatus
|
||||
notification.inUse.action=Ignorér anvendelsesstatus
|
||||
|
||||
@@ -156,6 +156,8 @@ unlock.error.title=„%s“ konnte nicht entsperrt werden
|
||||
hub.noKeychain.message=Zugriff auf Geräteschlüssel nicht möglich
|
||||
hub.noKeychain.description=Zum Entsperren von Hub-Tresoren wird ein Geräteschlüssel benötigt, der in einem Schlüsselbund gesichert ist. Um fortzufahren, aktiviere „%s“ und wähle in den Einstellungen einen Schlüsselbund.
|
||||
hub.noKeychain.openBtn=Einstellungen öffnen
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=Vertrauen
|
||||
### Waiting
|
||||
hub.auth.message=Warten auf Authentifizierung …
|
||||
hub.auth.description=Du solltest automatisch zur Anmeldeseite weitergeleitet werden.
|
||||
@@ -187,6 +189,7 @@ hub.archived.description=Dieser Tresor wurde archiviert, daher ist ein Zugriff d
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Zugriff verweigert
|
||||
hub.unauthorized.description=Du bist nicht berechtigt, diesen Tresor zu öffnen. Wende dich an den Tresoreigentümer, um Zugriff zu erhalten.
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Aktion erforderlich
|
||||
hub.requireAccountInit.description.0=Um fortzufahren, führe bitte die erforderlichen Schritte in deinem
|
||||
@@ -298,6 +301,7 @@ preferences.general.debugDirectory=Protokolldateien anzeigen
|
||||
preferences.general.autoStart=Cryptomator beim Systemstart starten
|
||||
preferences.general.keychainBackend=Passwörter speichern mit
|
||||
preferences.general.quickAccessService=Entsperrte Tresore zum Schnellzugriff hinzufügen
|
||||
preferences.general.resetTrustedHosts=Vertrauenswürdige Hosts zurücksetzen
|
||||
## Interface
|
||||
preferences.interface=Benutzeroberfläche
|
||||
preferences.interface.theme=Erscheinungsbild
|
||||
@@ -701,4 +705,4 @@ eventView.entry.inUse.copyUserAndDevice=Benutzer- und Gerätenamen der Sperre ko
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.action=Verwendungsstatus ignorieren
|
||||
notification.inUse.action=Verwendungsstatus ignorieren
|
||||
|
||||
@@ -154,6 +154,8 @@ unlock.error.title=Ξεκλείδωμα "%s" απέτυχε
|
||||
hub.noKeychain.message=Δεν είναι δυνατή η πρόσβαση στο κλειδί της συσκευής
|
||||
hub.noKeychain.description=Για να ξεκλειδώσετε τις κρύπτες Hub, απαιτείται ένα κλειδί συσκευής, το οποίο ασφαλίζεται με χρήση μπρελόκ. Για να συνεχίσετε, ενεργοποιήστε το "%s" και επιλέξτε ένα keychain στις προτιμήσεις.
|
||||
hub.noKeychain.openBtn=Άνοιγμα Προτιμήσεων
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=Εμπιστευτείτε
|
||||
### Waiting
|
||||
hub.auth.message=Αναμονή για επαλήθευση…
|
||||
hub.auth.description=Θα πρέπει να ανακατευθυνθείτε αυτόματα στη σελίδα σύνδεσης.
|
||||
@@ -183,6 +185,7 @@ hub.registerFailed.description.deviceAlreadyExists=Αυτή η συσκευή ε
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Δεν επιτρέπεται η πρόσβαση
|
||||
hub.unauthorized.description=Δεν είστε εξουσιοδοτημένοι να ανοίξετε αυτή την κρύπτη. Επικοινωνήστε με τον ιδιοκτήτη τς κρύπτης για να ζητήσετε πρόσβαση.
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Απαιτείται ενέργεια
|
||||
hub.requireAccountInit.description.0=Για να συνεχίσετε, παρακαλούμε ολοκληρώστε τα βήματα που απαιτούνται στο δικό σας
|
||||
@@ -645,4 +648,4 @@ eventView.entry.inUse.showEncrypted=Εμφάνιση κρυπτογραφημέ
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -156,6 +156,12 @@ unlock.error.title=Error al desbloquear "%s"
|
||||
hub.noKeychain.message=No se puede acceder a la clave del dispositivo
|
||||
hub.noKeychain.description=Para desbloquear las bóvedas de Hub, se requiere una clave de dispositivo que se asegura con un llavero. Para continuar, habilite "%s" y seleccione un llavero en las preferencias.
|
||||
hub.noKeychain.openBtn=Abrir preferencias
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.message.check=Comprobando configuración…
|
||||
hub.checkHostTrust.message.ask=¿Confiar en este host?
|
||||
hub.checkHostTrust.message.ask.plural=¿Confiar en estos hosts?
|
||||
hub.checkHostTrust.trustBtn=Confiar
|
||||
hub.checkHostTrust.denyBtn=Denegar
|
||||
### Waiting
|
||||
hub.auth.message=Esperando la autenticación…
|
||||
hub.auth.description=Debería ser redirigido automáticamente a la página de inicio de sesión.
|
||||
@@ -185,6 +191,9 @@ hub.registerFailed.description.deviceAlreadyExists=Este dispositivo ya se ha reg
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Acceso denegado
|
||||
hub.unauthorized.description=No tiene autorización para abrir esta bóveda. Contacta al propietario de la bóveda para solicitar acceso.
|
||||
### Untrusted Host
|
||||
hub.untrustedHost.message=Host no confiable
|
||||
hub.untrustedHost.description=La conexión al Hub fue bloqueada por su seguridad. Si cree que el Hub es seguro, póngase en contacto con la administración de Hub o vuelva a intentarlo.
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Acción requerida
|
||||
hub.requireAccountInit.description.0=Para continuar, por favor complete los pasos necesarios en su
|
||||
@@ -298,6 +307,7 @@ preferences.general.debugDirectory=Revelar archivos de registro
|
||||
preferences.general.autoStart=Cargar Cryptomator al iniciar el sistema
|
||||
preferences.general.keychainBackend=Guardar contraseñas con
|
||||
preferences.general.quickAccessService=Añadir bóvedas desbloqueadas al área de acceso rápido
|
||||
preferences.general.resetTrustedHosts=Restablecer hosts de confianza
|
||||
## Interface
|
||||
preferences.interface=Interfaz
|
||||
preferences.interface.theme=Apariencia
|
||||
@@ -704,4 +714,4 @@ eventView.entry.inUse.ignoreLock=Ignorar el estado de uso
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=El archivo está en uso en otro dispositivo
|
||||
notification.inUse.description=El archivo está abierto por %s en %s. Solicítale que cierre el archivo y deje que finalice la sincronización. Puede ignorar el estado para abrirlo ahora, pero esto puede causar conflictos o sobrescribir cambios más recientes.
|
||||
notification.inUse.action=Ignorar el Estado de Uso
|
||||
notification.inUse.action=Ignorar el Estado de Uso
|
||||
|
||||
@@ -114,6 +114,7 @@ unlock.success.revealBtn=نمایش درایو
|
||||
## Failure
|
||||
## Hub
|
||||
hub.noKeychain.openBtn=باز کردن تنظیمات
|
||||
### Check Host Authenticity
|
||||
### Waiting
|
||||
### Receive Key
|
||||
### Register Device
|
||||
@@ -124,6 +125,7 @@ hub.registerSuccess.unlockBtn=بازکردن قفل
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
|
||||
@@ -256,4 +258,4 @@ dokanySupportEnd.preferencesBtn=باز کردن تنظیمات
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -156,6 +156,7 @@ unlock.error.title="%s" avaaminen epäonnistui
|
||||
hub.noKeychain.message=Laitteen avainta ei löytynyt
|
||||
hub.noKeychain.description=Hub-holvien purkamiseksi tarvitaan laiteavain joka on suojattu avainrenkaalla. Jatkaaksesi, kytke “%s” päälle ja valitse avainrengas asetuksista.
|
||||
hub.noKeychain.openBtn=Avaa asetukset
|
||||
### Check Host Authenticity
|
||||
### Waiting
|
||||
hub.auth.message=Odotetaan todennusta…
|
||||
hub.auth.description=Pitäisi ohjata sinut automaattisesti uudelleen kirjautumissivulle.
|
||||
@@ -185,6 +186,7 @@ hub.registerFailed.description.deviceAlreadyExists=Tämä laite on jo rekisterö
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Pääsy estetty
|
||||
hub.unauthorized.description=Sinulla ei ole oikeutta avata tätä holvia. Ota yhteyttä holvin omistajaan pyytääksesi pääsyä.
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Toimia vaaditaan
|
||||
hub.requireAccountInit.description.0=Jatkaaksesi, ole hyvä ja suorita tarvittavat toimenpiteet
|
||||
@@ -698,4 +700,4 @@ eventView.entry.inUse.showEncrypted=Näytä salattu tiedosto
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -154,6 +154,8 @@ unlock.error.title=Hindi mabuksan ang "%s"
|
||||
hub.noKeychain.message=Hindi ma-access ang key ng device
|
||||
hub.noKeychain.description=Para ma-unlock ang mga Hub vault, kailangan ng device key, na sini-secure gamit ang keychain. Upang magpatuloy, paganahin ang “%s” at pumili ng keychain sa mga kagustuhan.
|
||||
hub.noKeychain.openBtn=Buksan ang Mga Kagustuhan
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=Magtiwala
|
||||
### Waiting
|
||||
hub.auth.message=Naghihintay para sa pagpapatunay…
|
||||
hub.auth.description=Dapat kang awtomatikong mai-redirect sa pahina ng pag-login.
|
||||
@@ -182,6 +184,7 @@ hub.registerFailed.description.deviceAlreadyExists=Ang device na ito ay registra
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Walang pahintulot
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Kinakailangan ang pagkilos
|
||||
hub.requireAccountInit.description.0=Upang magpatuloy, mangyaring kumpletuhin ang mga hakbang na kinakailangan sa iyong
|
||||
@@ -598,4 +601,4 @@ shareVault.hub.openHub=Buksan ang Cryptomator Hub
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -161,6 +161,12 @@ unlock.error.title=Échec du déverrouillage de "%s"
|
||||
hub.noKeychain.message=Impossible d'accéder à la clé du périphérique
|
||||
hub.noKeychain.description=Le déverrouillage des coffres Hub nécessite une clé de périphérique sécurisée à l'aide d'un trousseau. Pour continuer, activez « %s » et sélectionnez un trousseau dans les préférences.
|
||||
hub.noKeychain.openBtn=Ouvrir les préférences
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.message.check=Vérification de configuration…
|
||||
hub.checkHostTrust.message.ask=Faire confiance à cet hôte ?
|
||||
hub.checkHostTrust.message.ask.plural=Faire confiance à ces hôtes ?
|
||||
hub.checkHostTrust.trustBtn=Approuver
|
||||
hub.checkHostTrust.denyBtn=Refuser
|
||||
### Waiting
|
||||
hub.auth.message=Authentification en cours…
|
||||
hub.auth.description=Vous devriez automatiquement être redirigé vers la page de connexion.
|
||||
@@ -192,6 +198,9 @@ hub.archived.description=Ce coffre a été archivé et n'est plus accessible. Ve
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Accès refusé
|
||||
hub.unauthorized.description=Vous n'êtes pas autorisé à ouvrir ce coffre. Contactez le propriétaire du coffre pour en demander l'accès.
|
||||
### Untrusted Host
|
||||
hub.untrustedHost.message=Hôte non fiable
|
||||
hub.untrustedHost.description=La connexion à Hub a été bloquée pour votre sécurité. Si vous pensez que l'hôte Hub est en sécurité, contactez son administrateur ou réessayez.
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Action requise
|
||||
hub.requireAccountInit.description.0=Pour continuer, veuillez compléter les étapes requises
|
||||
@@ -305,6 +314,7 @@ preferences.general.debugDirectory=Afficher le journal
|
||||
preferences.general.autoStart=Lancer Cryptomator au démarrage du système
|
||||
preferences.general.keychainBackend=Stocker les mots de passe avec
|
||||
preferences.general.quickAccessService=Ajouter les coffres déverrouillés à la zone d'accès rapide
|
||||
preferences.general.resetTrustedHosts=Réinitialiser les hôtes de confiance
|
||||
## Interface
|
||||
preferences.interface=Interface
|
||||
preferences.interface.theme=Apparence
|
||||
@@ -716,4 +726,4 @@ eventView.entry.inUse.ignoreLock=Ignorer le statut d’utilisation
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=Le fichier est utilisé sur un autre appareil
|
||||
notification.inUse.description=Le fichier est ouvert par %s sur %s. Demandez-lui à fermer le fichier et laissez la synchronisation se terminer. Vous pouvez ignorer le statut pour l’ouvrir maintenant, mais cela pourrait entraîner des conflits ou écraser des modifications récentes.
|
||||
notification.inUse.action=Ignorer le statut d’utilisation
|
||||
notification.inUse.action=Ignorer le statut d’utilisation
|
||||
|
||||
@@ -46,6 +46,7 @@ error.message=Produciuse un erro
|
||||
## Success
|
||||
## Failure
|
||||
## Hub
|
||||
### Check Host Authenticity
|
||||
### Waiting
|
||||
### Receive Key
|
||||
### Register Device
|
||||
@@ -54,6 +55,7 @@ error.message=Produciuse un erro
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
|
||||
@@ -169,4 +171,4 @@ lock.forced.retryBtn=Tentar de novo
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -150,6 +150,8 @@ unlock.error.customPath.description.notEmptyDir=הנתיב המותאם "%s" א
|
||||
hub.noKeychain.message=לא ניתן לגשת למפתח המכשיר
|
||||
hub.noKeychain.description=כדאי לשחרר כספות האב נדרש מפתח מכשיר שיאובטח בצרור מפתחות. כדאי להמשיך, אפשר ״%s״ ובחר את צרור המפתחות בהעדפות.
|
||||
hub.noKeychain.openBtn=פתח העדפות
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=סמוך
|
||||
### Waiting
|
||||
hub.auth.message=ממתין לאימות…
|
||||
hub.auth.description=אתה אמור להיות מופנה אוטומטית למסך ההזדהות.
|
||||
@@ -166,6 +168,7 @@ hub.registerSuccess.unlockBtn=בטל נעילה
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=הגישה נדחתה
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
hub.invalidLicense.message=רישיון האב לא תקף
|
||||
@@ -531,4 +534,4 @@ dokanySupportEnd.preferencesBtn=פתח העדפות
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -142,6 +142,8 @@ unlock.error.title="%s" तिजोरी खोलना विफल रह
|
||||
## Hub
|
||||
hub.noKeychain.message=उपकरण के कुंजी तक पहुंचने में असमर्थ
|
||||
hub.noKeychain.openBtn=प्राथमिकताएँ खोलें
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=भरोसा करे
|
||||
### Waiting
|
||||
hub.auth.message=प्रमाणन के लिए इंतज़ार कर रहे...
|
||||
hub.auth.description=आपको स्वचालित रूप से लॉगिन पृष्ठ पर पुनः निर्देशित किया जाना चाहिए।
|
||||
@@ -158,6 +160,7 @@ hub.registerSuccess.unlockBtn=अनलॉक करें
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=प्रवेश अस्वीकृत
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=कार्रवाई आवश्यक है
|
||||
hub.requireAccountInit.description.0=आगे बढ़ने के लिए, कृपया अपने आवश्यक चरणों को पूरा करें
|
||||
@@ -354,4 +357,4 @@ dokanySupportEnd.preferencesBtn=प्राथमिकताएँ खोल
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -116,6 +116,8 @@ unlock.success.rememberChoice=Zapamti izbor, ne prikazuj ovo više
|
||||
unlock.success.revealBtn=Otkrij pogon
|
||||
## Failure
|
||||
## Hub
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=Vjeruj
|
||||
### Waiting
|
||||
### Receive Key
|
||||
### Register Device
|
||||
@@ -125,6 +127,7 @@ hub.registerSuccess.unlockBtn=Otključaj
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
|
||||
@@ -421,4 +424,4 @@ quit.lockAndQuitBtn=Zaključaj i napusti
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -154,6 +154,8 @@ unlock.error.title=A(z) „%s” feloldása sikertelen
|
||||
hub.noKeychain.message=Nem lehet az eszközkulcshoz hozzáférni
|
||||
hub.noKeychain.description=Hogy feloldja a Hub széfeket, egy eszközkulcs szükséges, mely egy kulcslánccal van biztosítva. A folytatáshoz engedélyezze a következőt: “%s” és válasszon egy kulcsláncot a beállításokban.
|
||||
hub.noKeychain.openBtn=Beállítások megnyitása
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=Megbízható
|
||||
### Waiting
|
||||
hub.auth.message=Várakozás a hitelesítésre…
|
||||
hub.auth.description=Automatikusan átirányítjuk a bejelentkezési oldalra.
|
||||
@@ -183,6 +185,7 @@ hub.registerFailed.description.deviceAlreadyExists=Ez az eszköz már egy másik
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Hozzáférés megtagadva
|
||||
hub.unauthorized.description=Nincs hozzáférésed a széf megnyitásához. Vedd fel a kapcsolatot a széf tulajdonosával és kérj hozzáférést.
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Beavatkozás szükséges
|
||||
hub.requireAccountInit.description.0=A folytatáshoz kérlek töltsd ki a szükséges lépéseket a te
|
||||
@@ -613,4 +616,4 @@ shareVault.hub.openHub=Nyissa meg a Cryptomator Hubot
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -154,6 +154,8 @@ unlock.error.title=Gagal membuka kunci "%s"
|
||||
hub.noKeychain.message=Tidak dapat mengakses perangkat kunci
|
||||
hub.noKeychain.description=Untuk membuka kunci Hub vault, diperlukan perangkat kunci, yang diamankan menggunakan keychain. Untuk melanjutkan, aktifkan “%s” dan pilih keychain di preferensi.
|
||||
hub.noKeychain.openBtn=Buka Preferensi
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=Percayai
|
||||
### Waiting
|
||||
hub.auth.message=Menunggu otentikasi…
|
||||
hub.auth.description=Anda secara otomatis akan diarahkan ke halaman login.
|
||||
@@ -183,6 +185,7 @@ hub.registerFailed.description.deviceAlreadyExists=Perangkat ini sudah terdaftar
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Akses ditolak
|
||||
hub.unauthorized.description=Anda tidak punya otorisasi untuk membuka brankas ini. Hubungi pemilik brankas untuk meminta akses.
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Tindakan diperlukan
|
||||
hub.requireAccountInit.description.0=Untuk melanjutkan, silakan lengkapi langkah-langkah yang diperlukan dalam
|
||||
@@ -614,4 +617,4 @@ eventView.filter.allVaults=Semua
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -161,6 +161,12 @@ unlock.error.title=Sblocco "%s" non riuscito
|
||||
hub.noKeychain.message=Impossibile accedere alla chiave del dispositivo
|
||||
hub.noKeychain.description=Per sbloccare le casseforti Hub, è necessaria una chiave del dispositivo, che è protetta tramite un portachiavi. Per procedere, abilita "%s" e seleziona un portachiavi nelle preferenze.
|
||||
hub.noKeychain.openBtn=Apri Preferenze
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.message.check=Controllo Configurazione…
|
||||
hub.checkHostTrust.message.ask=Ti fidi di questo host?
|
||||
hub.checkHostTrust.message.ask.plural=Ti fidi di questi host?
|
||||
hub.checkHostTrust.trustBtn=Fidati
|
||||
hub.checkHostTrust.denyBtn=Rifiuta
|
||||
### Waiting
|
||||
hub.auth.message=In attesa di autenticazione…
|
||||
hub.auth.description=Dovresti essere reindirizzato automaticamente alla pagina di login.
|
||||
@@ -192,6 +198,9 @@ hub.archived.description=Questa cassaforte è stata archiviata e non è più acc
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Accesso negato
|
||||
hub.unauthorized.description=Non sei autorizzato ad aprire questa cassaforte. Chiedi l'accesso al proprietario.
|
||||
### Untrusted Host
|
||||
hub.untrustedHost.message=Host non affidabile
|
||||
hub.untrustedHost.description=La connessione all'Hub è stata bloccata per la tua sicurezza. Se ritieni che l'host Hub sia sicuro, contatta l'amministratore dell'Hub o riprova.
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Azione richiesta
|
||||
hub.requireAccountInit.description.0=Per procedere, completa i passaggi richiesti nel tuo
|
||||
@@ -305,6 +314,7 @@ preferences.general.debugDirectory=Rivela i file di registro
|
||||
preferences.general.autoStart=Avvia Cryptomator all'avvio del sistema
|
||||
preferences.general.keychainBackend=Memorizza le password con
|
||||
preferences.general.quickAccessService=Aggiungi cassaforte sbloccata all'area di accesso rapido
|
||||
preferences.general.resetTrustedHosts=Azzera gli host affidabili
|
||||
## Interface
|
||||
preferences.interface=Interfaccia
|
||||
preferences.interface.theme=Aspetto
|
||||
@@ -716,4 +726,4 @@ eventView.entry.inUse.ignoreLock=Ignora lo stato di utilizzo
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=Il file è in uso su un altro dispositivo
|
||||
notification.inUse.description=Il file è aperto da %s su %s. Chiedigli di chiudere il file e permettere che la sincronizzazione termini. È possibile ignorare lo stato ed aprirlo ora, ma questo può causare conflitti o la sovrascrittura delle modifiche più recenti.
|
||||
notification.inUse.action=Ignora lo Stato di Utilizzo
|
||||
notification.inUse.action=Ignora lo Stato di Utilizzo
|
||||
|
||||
@@ -154,6 +154,8 @@ unlock.error.title=ロック解除 "%s" に失敗しました。
|
||||
hub.noKeychain.message=デバイス キーにアクセスできません
|
||||
hub.noKeychain.description=ハブ金庫を解錠するには、キーチェーンが保護するデバイス キーが必要です。続行するには、"%s" を有効にし環境設定からキーチェーンを選択します。
|
||||
hub.noKeychain.openBtn=環境設定を開く
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=信頼する
|
||||
### Waiting
|
||||
hub.auth.message=認証を待機中…
|
||||
hub.auth.description=ログイン ページに自動的にリダイレクトされます。
|
||||
@@ -183,6 +185,7 @@ hub.registerFailed.description.deviceAlreadyExists=このデバイスは既に
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=アクセスが拒否されました
|
||||
hub.unauthorized.description=この金庫を開く権限がありません。金庫の所有者からアクセス許可を貰って下さい。
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=アクションが必要です
|
||||
hub.requireAccountInit.description.0=続行するには以下のサイトで必要な手順を完了してください
|
||||
@@ -632,4 +635,4 @@ eventView.entry.inUse.copyUserAndDevice=ロックしているユーザーとデ
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -42,7 +42,7 @@ defaults.vault.vaultName=Vault
|
||||
|
||||
# Tray Menu
|
||||
traymenu.showMainWindow=보기
|
||||
traymenu.showPreferencesWindow=환경설정
|
||||
traymenu.showPreferencesWindow=환경 설정
|
||||
traymenu.lockAllVaults=모두 잠그기
|
||||
traymenu.quitApplication=종료
|
||||
traymenu.vault.unlock=잠금 해제
|
||||
@@ -114,7 +114,7 @@ addvaultwizard.success.nextStepsInstructions="%s" Vault가 추가되었습니다
|
||||
addvaultwizard.success.unlockNow=지금 잠금 해제
|
||||
|
||||
# Remove Vault
|
||||
removeVault.title=Vault 제거
|
||||
removeVault.title=Vault "%s" 제거
|
||||
removeVault.message=Vault를 삭제하시겠습니까?
|
||||
removeVault.description=이 행위는 Cryptomator에서만 이 Vault를 지웁니다. 나중에 다시 추가할 수 있습니다. 암호화된 파일은 하드디스크에서 삭제되지 않습니다.
|
||||
|
||||
@@ -132,18 +132,18 @@ forgetPassword.confirmBtn=비밀번호 삭제
|
||||
# Unlock
|
||||
unlock.title="%s" 잠금 해제
|
||||
unlock.passwordPrompt="%s"의 비밀번호를 입력하십시오.
|
||||
unlock.savePassword=비밀번호 기억
|
||||
unlock.savePassword=비밀번호 기억하기
|
||||
unlock.unlockBtn=잠금 해제
|
||||
## Select
|
||||
unlock.chooseMasterkey.message=마스터키 파일을 찾을 수 없습니다
|
||||
unlock.chooseMasterkey.description=이 Vault의 Masterkey를 찾지 못했습니다. 마스터 키 위치를 수동으로 선택하여 주십시오.
|
||||
unlock.chooseMasterkey.description=이 "%s" Vault의 마스터키를 찾지 못했습니다. 마스터키 위치를 수동으로 선택하여 주십시오.
|
||||
unlock.chooseMasterkey.restoreInstead=대신 마스터키 파일 복구
|
||||
unlock.chooseMasterkey.filePickerTitle=Masterkey 파일 선택
|
||||
unlock.chooseMasterkey.filePickerMimeDesc=Cryptomator Masterkey
|
||||
## Success
|
||||
unlock.success.message=잠금 해제 성공
|
||||
unlock.success.description="%s"이(가) 성공적으로 잠금 해제되었습니다. 이제 이 Vault를 마운트 지점으로 접근할 수 있습니다.
|
||||
unlock.success.rememberChoice=선택 기억하기, 다시 묻지 않음
|
||||
unlock.success.rememberChoice=선택을 기억하고 다시 묻지 않음
|
||||
unlock.success.revealBtn=드라이브 표시
|
||||
## Failure
|
||||
unlock.error.customPath.message=Vault를 사용자 정의 경로에 마운트할 수 없습니다.
|
||||
@@ -161,12 +161,18 @@ unlock.error.title="%s" 잠금 해제 실패
|
||||
hub.noKeychain.message=기기 키에 액세스할 수 없습니다
|
||||
hub.noKeychain.description=Hub Vaults를 잠금 해제하려면 키체인을 사용하여 보호되는 기기 키가 필요합니다. 계속하려면 "%s"을(를) 활성화하고 기본 설정에서 키체인을 선택하십시오.
|
||||
hub.noKeychain.openBtn=설정 열기
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.message.check=구성 확인 중…
|
||||
hub.checkHostTrust.message.ask=이 호스트를 신뢰하겠습니까?
|
||||
hub.checkHostTrust.message.ask.plural=이 호스트를 신뢰하겠습니까?
|
||||
hub.checkHostTrust.trustBtn=신뢰하기
|
||||
hub.checkHostTrust.denyBtn=거부
|
||||
### Waiting
|
||||
hub.auth.message=인증 대기 중…
|
||||
hub.auth.description=자동으로 로그인 페이지로 리다이렉트 될 것입니다.
|
||||
hub.auth.loginLink=수동으로 열려면 클릭하십시오.
|
||||
### Receive Key
|
||||
hub.receive.message=응답 처리중…
|
||||
hub.receive.message=응답 처리 중…
|
||||
hub.receive.description=Hub로부터 응답을 처리하고 있습니다. 잠시만 기다려 주십시오.
|
||||
### Register Device
|
||||
hub.register.message=새 기기
|
||||
@@ -181,7 +187,7 @@ hub.register.legacy.description=이 기기로부터 첫번째 Hub 접근입니
|
||||
hub.registerSuccess.message=기기 등록됨
|
||||
hub.registerSuccess.description=등록에 성공하였습니다. Vault를 잠금 해제할 수 있습니다.
|
||||
hub.registerSuccess.unlockBtn=잠금 해제
|
||||
hub.registerSuccess.legacy.description=Vault에 접근하기 위해서는 이 기기를 Vault 소유주가 추가적으로 허가해야 합니다.
|
||||
hub.registerSuccess.legacy.description=Vault에 접근하기 위해서는 이 기기를 Vault 소유자가 추가적으로 허가해야 합니다.
|
||||
### Registration Failed
|
||||
hub.registerFailed.message=기기 등록 실패
|
||||
hub.registerFailed.description.generic=등록 중에 오류가 발생했습니다. 앱 로그에서 자세한 정보를 확인할 수 있습니다.
|
||||
@@ -192,6 +198,9 @@ hub.archived.description=이 Vault는 아카이브되어 더 이상 접근할
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=액세스 거부됨
|
||||
hub.unauthorized.description=해당 Vault에 접근하도록 허가되지 않았습니다. Vault의 소유자에게 권한을 요청하세요.
|
||||
### Untrusted Host
|
||||
hub.untrustedHost.message=호스트를 신뢰할 수 없음
|
||||
hub.untrustedHost.description=보안상의 이유로 Hub 연결이 차단되었습니다. Hub 호스트가 안전하다고 판단되시면 Hub 관리자에게 문의하거나 다시 시도해 주세요.
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=조치가 필요함
|
||||
hub.requireAccountInit.description.0=진행하려면 필요한 조치를 완료하십시오:
|
||||
@@ -199,7 +208,7 @@ hub.requireAccountInit.description.1=Hub 사용자 프로필
|
||||
hub.requireAccountInit.description.2=.
|
||||
### License Exceeded
|
||||
hub.invalidLicense.message=Hub 라이선스가 잘못되었습니다.
|
||||
hub.invalidLicense.description=Cryptomator Hub 인스턴스에 잘못된 라이선스가 있습니다. 라이선스를 업그레이드하거나 갱신하려면 허브 관리자에게 알리십시오.
|
||||
hub.invalidLicense.description=Cryptomator Hub 인스턴스에 잘못된 라이선스가 있습니다. 라이선스를 업그레이드하거나 갱신하려면 Hub 관리자에게 알리십시오.
|
||||
|
||||
# Lock
|
||||
## Force
|
||||
@@ -209,18 +218,18 @@ lock.forced.retryBtn=재시도
|
||||
lock.forced.forceBtn=강제 잠금
|
||||
## Failure
|
||||
lock.fail.message=Vault 잠금에 실패하였습니다.
|
||||
lock.fail.description="%s" Vault를 잠글 수 없습니다. 저장되지 않은 작업이 다른 곳에 저장된 것과 중요한 읽기/쓰기 동작이 완료되었는지 확인 하십시요. Vault를 닫기 위해, Cryptomator 프로세스를 강제로 종료 하십시오.
|
||||
lock.fail.description="%s" Vault를 잠글 수 없습니다. 저장되지 않은 작업이 다른 곳에 저장된 것과 중요한 읽기/쓰기 동작이 완료되었는지 확인 하십시요. Vault를 닫기 위해, Cryptomator 프로세스를 강제로 종료하십시오.
|
||||
|
||||
# Migration
|
||||
migration.title=Vault 업그레이드
|
||||
## Start
|
||||
migration.start.header=Vault 업그레이드
|
||||
migration.start.text=Vault "%s"를 현재 버전의 Cryptomator에서 열기 위해서는 해당 vault를 새 버전으로 업그레이드해야 합니다. 업그레이드를 하기 전에 다음 사항들을 알고 있어야 합니다:
|
||||
migration.start.text=Vault "%s"를 현재 버전의 Cryptomator에서 열기 위해서는 해당 Vault를 새 버전으로 업그레이드해야 합니다. 업그레이드를 하기 전에 다음 사항들을 알고 있어야 합니다:
|
||||
migration.start.remarkUndone=이 업그레이드는 되돌릴 수 없습니다.
|
||||
migration.start.remarkVersions=과거 버전의 Cryptomator는 업그레이드된 Vault를 열 수 없습니다.
|
||||
migration.start.remarkCanRun=이 Vault를 열 때 사용하는 모든 기기가 현재 버전의 Cryptomator를 실행할 수 있는지 확인해야 합니다.
|
||||
migration.start.remarkSynced=업그레이드하기 전에 해당 Vault가 모든 기기에 정상적으로 동기화되어야 합니다.
|
||||
migration.start.confirm=나는 위 정보를 읽고 정말 이해했습니다.
|
||||
migration.start.confirm=위 내용을 충분히 숙지하였음을 확인합니다.
|
||||
## Run
|
||||
migration.run.enterPassword="%s"의 비밀번호를 입력하십시오.
|
||||
migration.run.startMigrationBtn=Vault 마이그레이션
|
||||
@@ -231,8 +240,8 @@ migration.success.unlockNow=지금 잠금 해제
|
||||
## Missing file system capabilities
|
||||
migration.error.missingFileSystemCapabilities.title=지원하지 않는 파일 시스템
|
||||
migration.error.missingFileSystemCapabilities.description=Vault가 부적절한 파일 시스템에 있기 때문에 마이그레이션이 시작되지 않았습니다.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=너무 긴 파일 이름을 파일 시스템에서 지원하지 않습니다.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=너무 긴 경로를 파일 시스템에서 지원하지 않습니다.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=파일 시스템이 긴 파일 이름을 지원하지 않습니다.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=파일 시스템이 긴 경로를 지원하지 않습니다.
|
||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=파일 시스템이 읽기를 허용하지 않습니다.
|
||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=파일 시스템이 쓰기를 허용하지 않습니다.
|
||||
## Impossible
|
||||
@@ -267,7 +276,7 @@ health.check.detail.checkSkipped=선택된 검사항목이 없습니다.
|
||||
health.check.detail.checkFinished=검사가 성공적으로 완료되었습니다.
|
||||
health.check.detail.checkFinishedAndFound=검사가 완료되었습니다. 검사 결과를 확인해주세요.
|
||||
health.check.detail.checkFailed=오류로 인해 검사가 종료되었습니다.
|
||||
health.check.detail.checkCancelled=검사가 취소되었습니다
|
||||
health.check.detail.checkCancelled=검사가 취소되었습니다.
|
||||
health.check.detail.listFilters.label=필터
|
||||
health.check.detail.filterSeverity=중요도로 정렬
|
||||
health.check.detail.filterFixState=해결 상태로 정렬
|
||||
@@ -286,7 +295,7 @@ health.result.severityTip.crit=상태: 심각\nVault 구조가 손상되었습
|
||||
health.result.fixStateFilter.all=모든 문제 해결 상태
|
||||
health.result.fixStateFilter.fixable=문제 해결 가능
|
||||
health.result.fixStateFilter.notFixable=문제 해결 불가
|
||||
health.result.fixStateFilter.fixing=문제 해결중…
|
||||
health.result.fixStateFilter.fixing=문제 해결 중…
|
||||
health.result.fixStateFilter.fixed=문제 해결됨
|
||||
health.result.fixStateFilter.fixFailed=문제 해결 실패
|
||||
## Fix Application
|
||||
@@ -295,7 +304,7 @@ health.fix.successTip=문제 해결이 성공적으로 완료되었습니다
|
||||
health.fix.failTip=문제 해결 실패, 상세 정보는 로그를 참조하십시오.
|
||||
|
||||
# Preferences
|
||||
preferences.title=환경설정
|
||||
preferences.title=환경 설정
|
||||
## General
|
||||
preferences.general=일반
|
||||
preferences.general.startHidden=Cryptomator를 시작할 때 창 숨김
|
||||
@@ -305,13 +314,14 @@ preferences.general.debugDirectory=로그 파일 표시
|
||||
preferences.general.autoStart=시스템 시작 시 Cryptomator 실행
|
||||
preferences.general.keychainBackend=다음 경로에 비밀번호 저장
|
||||
preferences.general.quickAccessService=열린 Vault를 빠른 접근 위치에 추가하기
|
||||
preferences.general.resetTrustedHosts=신뢰하는 호스트 목록 초기화
|
||||
## Interface
|
||||
preferences.interface=인터페이스
|
||||
preferences.interface.theme=테마
|
||||
preferences.interface.theme.automatic=자동
|
||||
preferences.interface.theme.dark=어둡게
|
||||
preferences.interface.theme.light=밝게
|
||||
preferences.interface.unlockThemes=다크모드 해제
|
||||
preferences.interface.theme.dark=다크 모드
|
||||
preferences.interface.theme.light=라이트 모드
|
||||
preferences.interface.unlockThemes=다크 모드 사용 권한을 얻어보세요!
|
||||
preferences.interface.language=언어 (재시작 필요)
|
||||
preferences.interface.language.auto=시스템 기본 설정
|
||||
preferences.interface.interfaceOrientation=인터페이스 방향
|
||||
@@ -356,7 +366,7 @@ preferences.contribute=후원하기
|
||||
preferences.contribute.registeredFor=%s(으)로 후원자 인증 등록됨
|
||||
preferences.contribute.noCertificate=Cryptomator를 후원하시고 후원자 인증을 받으십시오. 라이선스 키와 비슷하지만 무료 소프트웨어를 사용하는 멋진 사람들을 위한 것입니다. ;-)
|
||||
preferences.contribute.getCertificate=아직 후원자 인증이 없으신가요? 어떻게 얻는지 배울 수 있습니다.
|
||||
preferences.contribute.promptText=후원자 인증코드를 여기에 붙여넣기
|
||||
preferences.contribute.promptText=후원자 인증 코드를 여기에 붙여넣기
|
||||
preferences.contribute.thankYou=Cryptomator의 오픈 소스 개발을 지원해 주셔서 감사합니다!
|
||||
preferences.contribute.donate=후원하기
|
||||
preferences.contribute.sponsor=스폰서
|
||||
@@ -364,7 +374,7 @@ preferences.contribute.removeCert.tooltip=인증서 제거
|
||||
|
||||
### Remove License Key Dialog
|
||||
removeCert.title=인증서 제거
|
||||
removeCert.message=서포터 인증서를 제거하시겠습니까?
|
||||
removeCert.message=후원자 인증서를 제거하시겠습니까?
|
||||
removeCert.description=Cryptomator의 핵심 기능은 영향을 받지 않습니다. Vault에 대한 접근이 제한되거나 보안이 약화되지 않습니다.
|
||||
#<-- Add entries for donations and code/translation/documentation contribution -->
|
||||
|
||||
@@ -392,7 +402,7 @@ stats.read.accessCount=총 읽기 횟수: %d
|
||||
stats.write.throughput.idle=쓰기: 대기 중
|
||||
stats.write.throughput.kibs=쓰기: %.2f KiB/s
|
||||
stats.write.throughput.mibs=쓰기: %.2f MiB/s
|
||||
stats.write.total.data.none=데이터 기록됨: -
|
||||
stats.write.total.data.none=데이터 쓰기: -
|
||||
stats.write.total.data.kib=데이터 쓰기: %.1f KiB
|
||||
stats.write.total.data.mib=데이터 쓰기: %.1f MiB
|
||||
stats.write.total.data.gib=데이터 쓰기: %.1f GiB
|
||||
@@ -427,11 +437,11 @@ main.vaultlist.showEventsButton.tooltip=이벤트 뷰어 열기
|
||||
main.vaultlist.showPreferencesButton.tooltip=환경 설정 표시
|
||||
##Notification
|
||||
main.notification.updateAvailable=업데이트가 있습니다.
|
||||
main.notification.support=Cryptomator 지원하기.
|
||||
main.notification.support=Cryptomator 지원해 주세요
|
||||
main.notification.closeButton.tooltip=정보 표시줄 닫기
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=파일을 보호하기 위해 Cryptomator를 선택해주셔서 감사합니다. 만약 다른 도움이 필요하시면, 시작 안내서를 참조하시기 바랍니다.
|
||||
main.vaultDetail.welcomeOnboarding=파일 보호를 위해 Cryptomator를 선택해 주셔서 감사합니다. 도움이 필요하시면 시작 가이드를 확인해 주십시오:
|
||||
main.vaultDetail.storageLocation=Vault 저장 위치
|
||||
### Locked
|
||||
main.vaultDetail.lockedStatus=잠김
|
||||
@@ -581,7 +591,7 @@ recover.recoverMasterkey.title=마스터키 복구하기
|
||||
|
||||
## OnBoarding
|
||||
recover.onBoarding.chooseMethod=복구 방법을 선택하세요:
|
||||
recover.onBoarding.useRecoveryKey=복구키 사용하기
|
||||
recover.onBoarding.useRecoveryKey=복구 키 사용하기
|
||||
recover.onBoarding.usePassword=비밀번호 사용하기
|
||||
recover.onBoarding.intro=아래 사항을 정확히 읽고 확인하세요:
|
||||
recover.onBoarding.pleaseConfirm=진행하기 전, 다음 사항을 확인해 주십시오:
|
||||
@@ -702,7 +712,7 @@ eventView.entry.decryptionFailed.message=복호화 실패
|
||||
eventView.entry.decryptionFailed.showEncrypted=암호화된 파일 보기
|
||||
eventView.entry.brokenDirFile.message=망가진 디렉터리 링크
|
||||
eventView.entry.brokenDirFile.showEncrypted=망가진 암호화된 링크 보기
|
||||
eventView.entry.brokenFileNode.message=망가진 파일시스템 노드
|
||||
eventView.entry.brokenFileNode.message=망가진 파일 시스템 노드
|
||||
eventView.entry.brokenFileNode.showEncrypted=망가진 암호화된 노드 보기
|
||||
eventView.entry.brokenFileNode.copyDecrypted=복호화된 경로 복사하기
|
||||
eventView.entry.inUse.message=파일 사용 중
|
||||
@@ -716,4 +726,4 @@ eventView.entry.inUse.ignoreLock=사용 여부 상태 무시
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=다른 기기에서 파일 사용 중
|
||||
notification.inUse.description=해당 파일은 %s이(가) %s의 컴퓨터에서 열어 놓은 상태입니다. 파일을 닫고 동기화가 완료될 때까지 기다리도록 요청하세요. 상태를 무시하고 지금 파일을 열 수도 있지만, 이렇게 하면 충돌이 발생하거나 최신 변경 사항이 덮어쓰여질 수 있습니다.
|
||||
notification.inUse.action=사용 여부 상태 무시
|
||||
notification.inUse.action=사용 여부 상태 무시
|
||||
|
||||
326
src/main/resources/i18n/strings_lt.properties
Normal file
326
src/main/resources/i18n/strings_lt.properties
Normal file
@@ -0,0 +1,326 @@
|
||||
# Locale Specific CSS files such as CJK, RTL,...
|
||||
|
||||
# Generics
|
||||
## Button
|
||||
generic.button.apply=Taikyti
|
||||
generic.button.back=Atgal
|
||||
generic.button.cancel=Atsisakyti
|
||||
generic.button.change=Keisti
|
||||
generic.button.choose=Pasirinkti…
|
||||
generic.button.close=Užverti
|
||||
generic.button.copy=Kopijuoti
|
||||
generic.button.copied=Nukopijuota!
|
||||
generic.button.done=Atlikta
|
||||
generic.button.previous=Ankstesnis
|
||||
generic.button.next=Kitas
|
||||
generic.button.print=Spausdinti
|
||||
generic.button.remove=Šalinti
|
||||
|
||||
## Vault state
|
||||
vault.state.error=Klaida
|
||||
|
||||
# Error
|
||||
error.message=Įvyko klaida
|
||||
error.technicalDetails=Išsamiau:
|
||||
|
||||
# Defaults
|
||||
defaults.vault.vaultName=Slėptuvė
|
||||
|
||||
# Tray Menu
|
||||
traymenu.vault.unlock=Atrakinti
|
||||
traymenu.vault.lock=Užrakinti
|
||||
|
||||
# Add Vault Wizard
|
||||
## New
|
||||
### Name
|
||||
### Location
|
||||
addvaultwizard.new.locationPrompt=…
|
||||
addvaultwizard.new.directoryPickerButton=Pasirinkti…
|
||||
addvaultwizard.new.invalidName=Netinkamas slėptuvės pavadinimas
|
||||
addvaultwizard.new.validName=Tinkamas slėptuvės pavadinimas
|
||||
addvaultwizard.new.validCharacters.message=Slėptuvės pavadinime gali būti šie simboliai:
|
||||
addvaultwizard.new.validCharacters.chars=Raidės (pvz., a, ж ar 수)
|
||||
addvaultwizard.new.validCharacters.numbers=Skaitmenys
|
||||
addvaultwizard.new.validCharacters.dashes=Brūkšnelis (%s) ar pabraukimo brūkšnys (%s)
|
||||
### Expert Settings
|
||||
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=Atverkite dokumentaciją norėdami sužinoti daugiau.
|
||||
### Password
|
||||
addvaultwizard.new.createVaultBtn=Sukurti slėptuvę
|
||||
addvaultwizard.new.generateRecoveryKeyChoice=Be slaptažodžio nebegalėsite pasiekti savo duomenų. Ar norite sukurti atkūrimo raktą tam atvejui, jei prarasite slaptažodį?
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.yes=Taip, geriau apsidrausti nei gailėtis
|
||||
addvaultwizard.new.generateRecoveryKeyChoice.no=Ne, ačiū, aš neprarasiu slaptažodžio
|
||||
### Information
|
||||
addvault.new.readme.storageLocation.fileName=SVARBU.rtf
|
||||
addvault.new.readme.accessLocation.1=🔐️ ŠIFRUOTAS TOMAS 🔐️
|
||||
## Existing
|
||||
addvaultwizard.existing.chooseBtn=Pasirinkti…
|
||||
## Success
|
||||
|
||||
# Remove Vault
|
||||
removeVault.title=Šalinti „%s“
|
||||
removeVault.message=Šalinti slėptuvę?
|
||||
|
||||
# Change Password
|
||||
changepassword.title=Keisti slaptažodį
|
||||
|
||||
# Forget Password
|
||||
|
||||
# Unlock
|
||||
unlock.title=Atrakinti „%s“
|
||||
unlock.unlockBtn=Atrakinti
|
||||
## Select
|
||||
## Success
|
||||
## Failure
|
||||
unlock.error.restartRequired.message=Nepavyko atrakinti slėptuvės
|
||||
unlock.error.restartRequired.description=Pakeiskite slėptuvės parinktyse tomo tipą arba paleiskite Cryptomator iš naujo.
|
||||
## Hub
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.message.check=Tikrinama konfigūracija…
|
||||
### Waiting
|
||||
hub.auth.message=Laukiama tapatybės nustatymo…
|
||||
### Receive Key
|
||||
### Register Device
|
||||
hub.register.message=Naujas įrenginys
|
||||
### Register Device Legacy
|
||||
### Registration Success
|
||||
hub.registerSuccess.unlockBtn=Atrakinti
|
||||
### Registration Failed
|
||||
### Archived
|
||||
hub.archived.message=Slėptuvė archyvuota
|
||||
hub.archived.description=Ši slėptuvė archyvuota ir daugiau nebepasiekiama. Susisiekite su slėptuvės savininku.
|
||||
### Unauthorized
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
|
||||
# Lock
|
||||
## Force
|
||||
## Failure
|
||||
|
||||
# Migration
|
||||
## Start
|
||||
migration.start.confirm=Аš perskaičiau ir supratau aukščiau pateiktą informaciją
|
||||
## Run
|
||||
## Success
|
||||
migration.success.unlockNow=Atrakinti dabar
|
||||
## Missing file system capabilities
|
||||
migration.error.missingFileSystemCapabilities.title=Nepalaikoma failų sistema
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Failų sistema nepalaiko ilgų failo pavadinimų.
|
||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Failų sistema nepalaiko ilgų kelių.
|
||||
## Impossible
|
||||
|
||||
# Health Check
|
||||
## Start
|
||||
health.title=„%s“ būsenos patikrinimas
|
||||
health.intro.header=Būsenos patikrinimas
|
||||
health.intro.text=Būsenos patikrinimas – tai patikrinimų, skirtų aptikti ir galimai išspręsti jūsų slėptuvės vidinėje struktūroje esančias problemas, rinkinys. Turėkite omenyje:
|
||||
health.intro.remarkSync=Užtikrinkite, kad visi įrenginiai būtų visiškai sinchronizuoti, tai išsprendžia daugumą problemų.
|
||||
health.intro.remarkFix=Ne visos problemos gali būti išspręstos.
|
||||
health.intro.remarkBackup=Jei duomenys yra sugadinti, gali padėti tik atsarginė kopija.
|
||||
health.intro.affirmation=Аš perskaičiau ir supratau aukščiau pateiktą informaciją
|
||||
## Start Failure
|
||||
health.fail.parseError=Nagrinėjant slėptuvės konfigūraciją įvyko klaida.
|
||||
health.fail.moreInfo=Daugiau informacijos
|
||||
## Check Selection
|
||||
## Detail view
|
||||
## Result view
|
||||
health.result.severityFilter.info=Informacija
|
||||
health.result.severityFilter.warn=Įspėjimas
|
||||
## Fix Application
|
||||
|
||||
# Preferences
|
||||
## General
|
||||
## Interface
|
||||
preferences.interface=Sąsaja
|
||||
preferences.interface.theme=Išvaizda ir turinys
|
||||
preferences.interface.language=Kalba (reikalauja paleidimo iš naujo)
|
||||
preferences.interface.language.auto=Sistemos numatytoji
|
||||
preferences.interface.interfaceOrientation=Sąsajos orientacija
|
||||
preferences.interface.interfaceOrientation.ltr=Iš kairės į dešinę
|
||||
preferences.interface.interfaceOrientation.rtl=Iš dešinės į kairę
|
||||
preferences.interface.showTrayIcon=Rodyti dėklo piktogramą (reikalauja paleidimo iš naujo)
|
||||
## Volume
|
||||
preferences.volume.tcp.port=Numatytasis TCP prievadas
|
||||
## Updates
|
||||
preferences.updates.currentVersion=Dabartinė versija: %s
|
||||
preferences.updates.checkNowBtn=Tikrinti dabar
|
||||
preferences.updates.lastUpdateCheck.never=niekada
|
||||
preferences.updates.lastUpdateCheck.recently=neseniai
|
||||
preferences.updates.upToDate=Cryptomator yra naujausios versijos.
|
||||
|
||||
## Contribution
|
||||
preferences.contribute.removeCert.tooltip=Šalinti liudijimą
|
||||
|
||||
### Remove License Key Dialog
|
||||
removeCert.title=Šalinti liudijimą
|
||||
#<-- Add entries for donations and code/translation/documentation contribution -->
|
||||
|
||||
## About
|
||||
preferences.about=Apie
|
||||
preferences.about.thirdPartyLicenses=Trečiųjų šalių licencijos
|
||||
|
||||
# Vault Statistics
|
||||
stats.title=%s statistika
|
||||
## Read
|
||||
## Write
|
||||
|
||||
## Accesses
|
||||
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Slėptuvės
|
||||
main.vaultlist.listEntry=Slėptuvė %s (%s)
|
||||
main.vaultlist.emptyList.onboardingInstruction=Spustelėkite čia norėdami pridėti slėptuvę
|
||||
main.vaultlist.contextMenu.remove=Šalinti…
|
||||
main.vaultlist.contextMenu.lock=Užrakinti
|
||||
main.vaultlist.contextMenu.unlock=Atrakinti…
|
||||
main.vaultlist.contextMenu.unlockNow=Atrakinti dabar
|
||||
main.vaultlist.contextMenu.vaultoptions=Rodyti slėptuvės parinktis
|
||||
main.vaultlist.contextMenu.share=Bendrinti…
|
||||
main.vaultlist.addVaultBtn.menuItemNew=Sukurti naują slėptuvę…
|
||||
main.vaultlist.addVaultBtn.menuItemExisting=Atverti esamą slėptuvę…
|
||||
main.vaultlist.addVaultButton.tooltip=Pridėti slėptuvę
|
||||
main.vaultlist.showPreferencesButton.tooltip=Rodyti nuostatas
|
||||
##Notification
|
||||
main.notification.updateAvailable=Prieinamas atnaujinimas.
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Dėkojame, kad failų apsaugai pasirinkote Cryptomator. Jei prireiks pagalbos, peržiūrėkite darbo pradžios gaires:
|
||||
### Locked
|
||||
main.vaultDetail.lockedStatus=UŽRAKINTA
|
||||
main.vaultDetail.unlockBtn=Atrakinti…
|
||||
main.vaultDetail.unlockNowBtn=Atrakinti dabar
|
||||
main.vaultDetail.optionsBtn=Slėptuvės parinktys
|
||||
### Unlocked
|
||||
main.vaultDetail.unlockedStatus=ATRAKINTA
|
||||
main.vaultDetail.accessLocation=Jūsų slėptuvės turinys yra pasiekiamas štai čia:
|
||||
main.vaultDetail.copyUri=Kopijuoti URI
|
||||
main.vaultDetail.lockBtn=Užrakinti
|
||||
main.vaultDetail.bytesPerSecondRead=Skaitymas:
|
||||
main.vaultDetail.bytesPerSecondWritten=Rašymas:
|
||||
main.vaultDetail.throughput.idle=neveiklus
|
||||
main.vaultDetail.stats=Slėptuvės statistika
|
||||
main.vaultDetail.encryptedPathsCopied=Keliai nukopijuoti į iškarpinę!
|
||||
### Missing
|
||||
main.vaultDetail.missing.remove=Šalinti iš slėptuvių sąrašo…
|
||||
### Missing Vault Config
|
||||
main.vaultDetail.missingVaultConfig.info=Trūksta slėptuvės konfigūracijos.
|
||||
main.vaultDetail.missingVaultConfig.restore=Atkurti slėptuvės konfigūraciją
|
||||
### Needs Migration
|
||||
main.vaultDetail.migrateButton=Naujinti slėptuvę
|
||||
### Error
|
||||
main.vaultDetail.error.info=Įkeliant slėptuvę iš disko įvyko klaida.
|
||||
main.vaultDetail.error.reload=Įkelti iš naujo
|
||||
main.vaultDetail.error.windowTitle=Klaida įkeliant slėptuvę
|
||||
|
||||
# Wrong File Alert
|
||||
wrongFileAlert.title=Kaip šifruoti failus
|
||||
wrongFileAlert.message=Ar mėginote šifruoti šiuos failus?
|
||||
|
||||
# Vault Options
|
||||
## General
|
||||
vaultOptions.general.vaultName=Slėptuvės pavadinimas
|
||||
vaultOptions.general.actionAfterUnlock=Po sėkmingo atrakinimo
|
||||
vaultOptions.general.actionAfterUnlock.ignore=Nieko nedaryti
|
||||
vaultOptions.general.actionAfterUnlock.ask=Klausti
|
||||
|
||||
## Mount
|
||||
vaultOptions.mount=Prijungimas
|
||||
vaultOptions.mount.customMountFlags=Tinkintos prijungimo vėliavėlės
|
||||
vaultOptions.mount.mountPoint=Prijungimo taškas
|
||||
vaultOptions.mount.mountPoint.auto=Automatiškai parinkti tinkamą vietą
|
||||
vaultOptions.mount.mountPoint.custom=Naudoti pasirinktą katalogą
|
||||
vaultOptions.mount.mountPoint.directoryPickerButton=Pasirinkti…
|
||||
vaultOptions.mount.mountPoint.directoryPickerTitle=Parinkti katalogą
|
||||
vaultOptions.mount.volume.tcp.port=TCP prievadas
|
||||
vaultOptions.mount.volume.type=Tomo tipas
|
||||
## Master Key
|
||||
vaultOptions.masterkey=Slaptažodis
|
||||
vaultOptions.masterkey.changePasswordBtn=Keisti slaptažodį
|
||||
vaultOptions.masterkey.recoverPasswordBtn=Atstatyti slaptažodį
|
||||
## Hub
|
||||
|
||||
# Recovery Key
|
||||
## Display Recovery Key
|
||||
## Reset Password
|
||||
### Enter Recovery Key
|
||||
recoveryKey.recover.title=Atstatyti slaptažodį
|
||||
### Reset Password
|
||||
recoveryKey.recover.resetBtn=Atstatyti
|
||||
### Recovery Key Password Reset Success
|
||||
### Recovery Key Vault Config Reset Success
|
||||
|
||||
# Recover Vault Config File and/or Masterkey
|
||||
##Add Existing Vault without recovery - Dialog
|
||||
|
||||
##Vault Already Exists - Dialog
|
||||
|
||||
##Invalid Selection - Dialog
|
||||
|
||||
## Contact Hub Vault Owner - Dialog
|
||||
|
||||
##Dialog Title
|
||||
|
||||
## OnBoarding
|
||||
recover.onBoarding.intro.ensure=Visi failai yra visiškai sinchronizuoti.
|
||||
|
||||
###Vault Config Missing
|
||||
###Masterkey Missing
|
||||
|
||||
## Expert Settings
|
||||
|
||||
# Convert Vault
|
||||
|
||||
# New Password
|
||||
newPassword.passwordsMatch=Slaptažodžiai sutampa!
|
||||
newPassword.passwordsDoNotMatch=Slaptažodžiai nesutampa
|
||||
passwordStrength.messageLabel.tooShort=Naudokite bent %d simbolius
|
||||
passwordStrength.messageLabel.0=Labai silpnas
|
||||
passwordStrength.messageLabel.1=Silpnas
|
||||
passwordStrength.messageLabel.2=Vidutinis
|
||||
passwordStrength.messageLabel.3=Stiprus
|
||||
passwordStrength.messageLabel.4=Labai stiprus
|
||||
|
||||
# Quit
|
||||
quit.title=Išjungti programą
|
||||
quit.message=Yra neužrakintų slėptuvių
|
||||
quit.lockAndQuitBtn=Užrakinti ir išjungti
|
||||
|
||||
# Forced Quit
|
||||
quit.forced.message=Kai kurių slėptuvių nepavyko užrakinti
|
||||
|
||||
# Update Reminder
|
||||
updateReminder.message=Tikrinti, ar yra atnaujinimų?
|
||||
updateReminder.notNow=Ne dabar
|
||||
updateReminder.yesOnce=Taip, vieną kartą
|
||||
updateReminder.yesAutomatically=Taip, automatiškai
|
||||
|
||||
#Dokany Support End
|
||||
|
||||
#Retry If Readonly
|
||||
|
||||
# Share Vault
|
||||
shareVault.message=Ar norėtumėte bendrinti slėptuvę su kitais?
|
||||
shareVault.docsTooltip=Norėdami daugiau sužinoti apie slėptuvių bendrinimą atverkite dokumentaciją.
|
||||
|
||||
|
||||
# Decrypt File Names
|
||||
decryptNames.filePicker.extensionDescription=Cryptomator šifruotas failas
|
||||
decryptNames.column.encrypted=Šifruotas
|
||||
decryptNames.column.decrypted=Iššifruotas
|
||||
decryptNames.dropZone.error.noDirIdBackup=Pasirinktų failų kataloge nėra dirId.c9r failo
|
||||
decryptNames.dropZone.error.generic=Nepavyko iššifruoti failų pavadinimų
|
||||
|
||||
|
||||
# Event View
|
||||
## event list entries
|
||||
eventView.entry.conflictResolved.showDecrypted=Rodyti iššifruotą failą
|
||||
eventView.entry.decryptionFailed.showEncrypted=Rodyti šifruotą failą
|
||||
eventView.entry.inUse.showDecrypted=Rodyti iššifruotą failą
|
||||
eventView.entry.inUse.showEncrypted=Rodyti šifruotą failą
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=Failas yra naudojamas kitame įrenginyje
|
||||
@@ -161,6 +161,8 @@ unlock.error.title="%s" atslēgšana neizdevās
|
||||
hub.noKeychain.message=Nebija iespējams piekļūt ierīces atslēgai
|
||||
hub.noKeychain.description=Lai atslēgtu Hub glabātavas, ir nepieciešama ierīces atslēga, kas tiek droši uzglabāta atslēgu saišķī. Lai tuprinātu, iestatījumos jāiespējo "%s" un jāatlasa atslēgu saišķis.
|
||||
hub.noKeychain.openBtn=Atvērt iestatījumus
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=Uzticēties
|
||||
### Waiting
|
||||
hub.auth.message=Gaida autentificēšanu…
|
||||
hub.auth.description=Vajadzētu notikt automātiskai pārvirzīšanai uz pieteikšanās lapu.
|
||||
@@ -192,6 +194,7 @@ hub.archived.description=Glabātava tika arhivēta un vairs nav pieejama. Lūgum
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Piekļuve atteikta
|
||||
hub.unauthorized.description=Nav pilnvaras atvērt šo glabātavu. Jāsazinās ar glabātavas īpašnieku, lai pieprasītu piekļuvi.
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Nepieciešama darbība
|
||||
hub.requireAccountInit.description.0=Lai turpinātu, lūgums pabeigt nepieciešamos soļus savā
|
||||
@@ -715,4 +718,4 @@ eventView.entry.inUse.ignoreLock=Neņemt vēra izmantošanas stāvokli
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=Datne tiek izmantota citā ierīcē
|
||||
notification.inUse.description=Datni atvēra %s ierīcē %s. Jāvaicā aizvērt datni un ļaut pabeigties sinhronizēšanai. Stāvokli tagad var neņemt vērā, lai atvērtu datni, bet tas var radīt nesaderības vai pārrakstīt jaunākas izmaiņas.
|
||||
notification.inUse.action=Neņemt vēra izmantošanas stāvokli
|
||||
notification.inUse.action=Neņemt vēra izmantošanas stāvokli
|
||||
|
||||
@@ -77,6 +77,7 @@ unlock.unlockBtn=Отклучи
|
||||
## Success
|
||||
## Failure
|
||||
## Hub
|
||||
### Check Host Authenticity
|
||||
### Waiting
|
||||
### Receive Key
|
||||
### Register Device
|
||||
@@ -86,6 +87,7 @@ hub.registerSuccess.unlockBtn=Отклучи
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
|
||||
@@ -206,4 +208,4 @@ vaultOptions.mount.mountPoint.directoryPickerButton=Избор…
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
## Success
|
||||
## Failure
|
||||
## Hub
|
||||
### Check Host Authenticity
|
||||
### Waiting
|
||||
### Receive Key
|
||||
### Register Device
|
||||
@@ -40,6 +41,7 @@
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
|
||||
@@ -154,4 +156,4 @@
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -159,6 +159,8 @@ unlock.error.title=Lås opp "%s" mislyktes
|
||||
hub.noKeychain.message=Får ikke tilgang til enhetsnøkkel
|
||||
hub.noKeychain.description=For å låse opp Hub-hvelv er det nødvendig med en enhetsnøkkel som er sikret med en nøkkelring. For å fortsette, aktiver "%s" og velg en nøkkelring i innstillingene.
|
||||
hub.noKeychain.openBtn=Åpne innstillinger
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=Stol på
|
||||
### Waiting
|
||||
hub.auth.message=Venter på autentisering…
|
||||
hub.auth.description=Du burde bli automatisk videresendt til innloggingssiden.
|
||||
@@ -188,6 +190,7 @@ hub.registerFailed.description.deviceAlreadyExists=Denne enheten er allerede reg
|
||||
hub.archived.message=Hvelvet er arkivert
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Ingen tilgang
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Påkrevd handling
|
||||
hub.requireAccountInit.description.0=For å fortsette, fullfør trinnene som kreves i din
|
||||
@@ -613,4 +616,4 @@ shareVault.hub.openHub=Åpne Cryptomator hub
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -161,6 +161,12 @@ unlock.error.title=Ontgrendelen "%s" mislukt
|
||||
hub.noKeychain.message=Geen toegang tot de apparaatsleutel
|
||||
hub.noKeychain.description=Om Hub kluizen te ontgrendelen is een apparaatsleutel vereist, die met een sleutelhanger wordt beveiligd. Om verder te gaan, schakel "%s" in en selecteer een sleutelhanger in de voorkeursinstellingen.
|
||||
hub.noKeychain.openBtn=Open Voorkeuren
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.message.check=Configuratie controleren…
|
||||
hub.checkHostTrust.message.ask=Deze hosts vertrouwen?
|
||||
hub.checkHostTrust.message.ask.plural=Deze hosts vertrouwen?
|
||||
hub.checkHostTrust.trustBtn=Vertrouwen
|
||||
hub.checkHostTrust.denyBtn=Weigeren
|
||||
### Waiting
|
||||
hub.auth.message=Wachten op authenticatie…
|
||||
hub.auth.description=U zal automatisch worden doorgestuurd naar de inlogpagina.
|
||||
@@ -192,6 +198,9 @@ hub.archived.description=Deze kluis is gearchiveerd en is niet meer toegankelijk
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Toegang geweigerd
|
||||
hub.unauthorized.description=U bent niet geautoriseerd om deze kluis te openen. Neem contact op met de eigenaar van de kluis om toegang aan te vragen.
|
||||
### Untrusted Host
|
||||
hub.untrustedHost.message=Host niet vertrouwd
|
||||
hub.untrustedHost.description=Verbinding met Hub werd geblokkeerd voor je veiligheid. Als je gelooft dat de Hub host veilig is, neem dan contact op met je Hub administrator of probeer het opnieuw.
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Actie vereist
|
||||
hub.requireAccountInit.description.0=Om verder te gaan, gelieve de stappen te voltooien in uw
|
||||
@@ -305,6 +314,7 @@ preferences.general.debugDirectory=Logboekbestanden bekijken
|
||||
preferences.general.autoStart=Start Cryptomator als het systeem opstart
|
||||
preferences.general.keychainBackend=Bewaar wachtwoorden met
|
||||
preferences.general.quickAccessService=Voeg ontgrendelde kluizen toe aan snelle toegang
|
||||
preferences.general.resetTrustedHosts=Vertrouwde hosts vrijgegeven
|
||||
## Interface
|
||||
preferences.interface=Uiterlijk
|
||||
preferences.interface.theme=Uiterlijk
|
||||
@@ -716,4 +726,4 @@ eventView.entry.inUse.ignoreLock=Gebruiksstatus negeren
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=Bestand is op een ander apparaat in gebruik
|
||||
notification.inUse.description=Het bestand is geopend door %s op %s. Vraag ze om het bestand te sluiten en laat de synchronisatie eindigen. Je kunt de status negeren om het nu te openen, maar dit kan conflicten veroorzaken of nieuwere wijzigingen overschrijven.
|
||||
notification.inUse.action=Gebruiksstatus negeren
|
||||
notification.inUse.action=Gebruiksstatus negeren
|
||||
|
||||
@@ -95,6 +95,7 @@ unlock.success.rememberChoice=Hugs valet - ikkje vis dette igjen
|
||||
unlock.success.revealBtn=Gjer eininga synleg
|
||||
## Failure
|
||||
## Hub
|
||||
### Check Host Authenticity
|
||||
### Waiting
|
||||
### Receive Key
|
||||
### Register Device
|
||||
@@ -104,6 +105,7 @@ hub.registerSuccess.unlockBtn=Låse opp
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
|
||||
@@ -315,4 +317,4 @@ quit.lockAndQuitBtn=Lås og avslutt
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
## Success
|
||||
## Failure
|
||||
## Hub
|
||||
### Check Host Authenticity
|
||||
### Waiting
|
||||
### Receive Key
|
||||
### Register Device
|
||||
@@ -40,6 +41,7 @@
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
|
||||
@@ -154,4 +156,4 @@
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -138,6 +138,8 @@ unlock.error.restartRequired.message=ਵਾਲਟ ਨੂੰ ਅਣ-ਲਾਕ ਕ
|
||||
unlock.error.title="%s" ਨੂੰ ਅਣ-ਲਾਕ ਕਰਨ ਲਈ ਅਸਫ਼ਲ ਹੈ
|
||||
## Hub
|
||||
hub.noKeychain.openBtn=ਪਸੰਦਾਂ ਨੂੰ ਖੋਲ੍ਹੋ
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=ਭਰੋਸਾ ਕਰੋ
|
||||
### Waiting
|
||||
hub.auth.message=ਪਰਮਾਣਕਿਤਾ ਦੀ ਉਡੀਕ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…
|
||||
hub.auth.description=ਤੁਹਾਨੂੰ ਆਪਣੇ-ਆਪ ਲਾਗਇਨ ਸਫ਼ੇ ਲਈ ਰੀ-ਡਿਰੈਕਟ ਕੀਤਾ ਜਾਵੇਗਾ।
|
||||
@@ -157,6 +159,7 @@ hub.registerFailed.message=ਡਿਵਾਈਸ ਰਜਿਸਟਰ ਕਰਨਾ
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=ਪਹੁੰਚ ਤੋਂ ਇਨਾਕਰ
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=ਕਾਰਵਾਈ ਦੀ ਲੋੜ ਹੈ
|
||||
hub.requireAccountInit.description.1=ਹੱਬ ਵਰਤੋਂਕਾਰ ਪਰੋਫਾਇਲ
|
||||
@@ -583,4 +586,4 @@ eventView.entry.inUse.showEncrypted=ਇੰਕ੍ਰਿਪਟ ਕੀਤੀ ਫ਼ਾ
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -161,6 +161,8 @@ unlock.error.title=Błąd odblokowywania "%s"
|
||||
hub.noKeychain.message=Brak dostępu do klucza urządzenia
|
||||
hub.noKeychain.description=Aby odblokować sejfy na Hubie, wymagany jest klucz urządzenia zabezpieczony za pomocą pęku kluczy. Aby kontynuować, włącz "%s" i wybierz Pęk kluczy w ustawieniach.
|
||||
hub.noKeychain.openBtn=Otwórz ustawienia
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=Zaufany
|
||||
### Waiting
|
||||
hub.auth.message=Oczekiwanie na autoryzację…
|
||||
hub.auth.description=Przekierowanie na stronę logowania nastąpi automatycznie.
|
||||
@@ -192,6 +194,7 @@ hub.archived.description=Ten sejf został zarchiwizowany i nie jest już dostęp
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Brak dostępu
|
||||
hub.unauthorized.description=Nie masz uprawnień do otwierania tego sejfu. Skontaktuj się z właścicielem sejfu i poproś o dostęp.
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Wymagane działanie
|
||||
hub.requireAccountInit.description.0=Aby kontynuować, wykonaj wymagane kroki w Twoim
|
||||
@@ -711,4 +714,4 @@ eventView.entry.inUse.copyUserAndDevice=Kopiowanie blokady użytkownika i nazwy
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -161,6 +161,12 @@ unlock.error.title=Desbloqueio "%s" falhou
|
||||
hub.noKeychain.message=Não foi possível aceder à chave do dispositivo
|
||||
hub.noKeychain.description=Para desbloquear os cofres do Hub, é necessária uma chave do dispositivo, que é protegida usando um porta-chaves. Para continuar, ative “%s” e selecione um porta-chaves nas preferências.
|
||||
hub.noKeychain.openBtn=Abrir preferências
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.message.check=Verificando a configuração…
|
||||
hub.checkHostTrust.message.ask=Confiar neste anfitrião?
|
||||
hub.checkHostTrust.message.ask.plural=Confiar nestes anfitriões?
|
||||
hub.checkHostTrust.trustBtn=Confiar
|
||||
hub.checkHostTrust.denyBtn=Negar
|
||||
### Waiting
|
||||
hub.auth.message=A aguardar autenticação…
|
||||
hub.auth.description=Vai ser redirecionado automaticamente para a página de início de sessão.
|
||||
@@ -192,6 +198,9 @@ hub.archived.description=Este cofre foi arquivado e não está mais acessível.
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Acesso negado
|
||||
hub.unauthorized.description=Não está autorizado a abrir este cofre. Contacte o proprietário do cofre para solicitar o acesso.
|
||||
### Untrusted Host
|
||||
hub.untrustedHost.message=Host não fiável
|
||||
hub.untrustedHost.description=A ligação ao Hub foi bloqueada por motivos de segurança. Se acredita que o host do Hub é seguro, contacte o administrador do Hub ou tente novamente.
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Ação requerida
|
||||
hub.requireAccountInit.description.0=Para continuar, conclua as etapas necessárias no seu
|
||||
@@ -305,6 +314,7 @@ preferences.general.debugDirectory=Mostrar ficheiros de registo
|
||||
preferences.general.autoStart=Iniciar o Cryptomator no início do sistema
|
||||
preferences.general.keychainBackend=Guardar palavras-passe com
|
||||
preferences.general.quickAccessService=Adicionar cofres desbloqueados à área de acesso rápido
|
||||
preferences.general.resetTrustedHosts=Redefinir hosts fidedignos
|
||||
## Interface
|
||||
preferences.interface=Interface
|
||||
preferences.interface.theme=Aspecto e Ambiente
|
||||
@@ -716,4 +726,4 @@ eventView.entry.inUse.ignoreLock=Ignorar estado de utilização
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=O ficheiro está em utilização noutro dispositivo
|
||||
notification.inUse.description=O ficheiro está aberto por %s em %s. Peça-lhes que fechem o ficheiro e deixem a sincronização terminar. Pode ignorar o estado para o abrir agora, mas isso pode causar conflitos ou sobrescrever alterações mais recentes.
|
||||
notification.inUse.action=Ignorar estado de utilização
|
||||
notification.inUse.action=Ignorar estado de utilização
|
||||
|
||||
@@ -161,6 +161,12 @@ unlock.error.title=Falha ao desbloquear "%s"
|
||||
hub.noKeychain.message=Não foi possível acessar a chave do dispositivo
|
||||
hub.noKeychain.description=Para desbloquear os cofres do Hub, você precisa de uma chave do dispositivo que fica protegida usando um chaveiro. Para continuar, ative "%s" e escolha um chaveiro nas preferências.
|
||||
hub.noKeychain.openBtn=Abrir preferências
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.message.check=Verificando configuração…
|
||||
hub.checkHostTrust.message.ask=Confiar neste host?
|
||||
hub.checkHostTrust.message.ask.plural=Confiar nestes hosts?
|
||||
hub.checkHostTrust.trustBtn=Confio
|
||||
hub.checkHostTrust.denyBtn=Recusar
|
||||
### Waiting
|
||||
hub.auth.message=Aguardando autenticação…
|
||||
hub.auth.description=Você será redirecionado automaticamente para a página de login.
|
||||
@@ -192,6 +198,9 @@ hub.archived.description=Este cofre foi arquivo e está inacessível. Contate o
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Acesso negado
|
||||
hub.unauthorized.description=Você não tem autorização para abrir este cofre. Entre em contato com o proprietário dele para solicitar acesso.
|
||||
### Untrusted Host
|
||||
hub.untrustedHost.message=Host não confiável
|
||||
hub.untrustedHost.description=A conexão com o Hub foi bloqueada para sua segurança. Caso acredite que o host do Hub está seguro, entre em contato com seu administrador do Hub ou tente novamente.
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Ação necessária
|
||||
hub.requireAccountInit.description.0=Para prosseguir, complete as etapas obrigatórias no seu
|
||||
@@ -305,6 +314,7 @@ preferences.general.debugDirectory=Mostrar arquivos de registro
|
||||
preferences.general.autoStart=Iniciar o Cryptomator com o sistema
|
||||
preferences.general.keychainBackend=Armazenar senhas com
|
||||
preferences.general.quickAccessService=Adicione cofres desbloqueados à área de acesso rápido
|
||||
preferences.general.resetTrustedHosts=Redefinir hosts confiáveis
|
||||
## Interface
|
||||
preferences.interface=Interface
|
||||
preferences.interface.theme=Aparência
|
||||
@@ -488,7 +498,7 @@ wrongFileAlert.link=Para obter assistência, visite
|
||||
## General
|
||||
vaultOptions.general=Geral
|
||||
vaultOptions.general.vaultName=Nome do cofre
|
||||
vaultOptions.general.autoLock.lockAfterTimePart1=Bloquear quando inativo por
|
||||
vaultOptions.general.autoLock.lockAfterTimePart1=Bloquear quando inativo após
|
||||
vaultOptions.general.autoLock.lockAfterTimePart2=minuto(s)
|
||||
vaultOptions.general.autoLock.accessibleText=Bloquear tempo limite em minutos
|
||||
vaultOptions.general.unlockAfterStartup=Desbloquear o cofre ao iniciar o Cryptomator
|
||||
@@ -716,4 +726,4 @@ eventView.entry.inUse.ignoreLock=Ignorar status de uso
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=O arquivo está sendo usado em outro dispositivo
|
||||
notification.inUse.description=O arquivo é aberto por %s em %s. Solicite a eles para fechá-lo e deixar a sincronização finalizar. Você pode ignorar o status para abri-lo agora, mas isso pode causar conflitos ou substituir novas alterações.
|
||||
notification.inUse.action=Ignorar status de uso
|
||||
notification.inUse.action=Ignorar status de uso
|
||||
|
||||
@@ -154,6 +154,8 @@ unlock.error.title=Deblocarea "%s" a eșuat
|
||||
hub.noKeychain.message=Cheia dispozitivului nu a putut fi accesată
|
||||
hub.noKeychain.description=Pentru a debloca seifele de tip Hub, este necesară o cheie a dispozitivului, care este securizată prin intermediul unui keychain. Pentru a continua, activați „%s” și selectați un keychain în preferințe.
|
||||
hub.noKeychain.openBtn=Deschideţi preferinţele
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.trustBtn=De încredere
|
||||
### Waiting
|
||||
hub.auth.message=Se așteaptă autentificarea…
|
||||
hub.auth.description=Ar trebui să fiți redirecționat automat către pagina de autentificare.
|
||||
@@ -182,6 +184,7 @@ hub.registerFailed.description.deviceAlreadyExists=Acest dispozitiv este deja î
|
||||
### Archived
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Acces respins
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Acțiune necesară
|
||||
hub.requireAccountInit.description.0=Pentru a continua, vă rugăm să finalizaţi paşii necesari în
|
||||
@@ -604,4 +607,4 @@ shareVault.hub.openHub=Deschide Cryptomator Hub
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -161,6 +161,12 @@ unlock.error.title=Не удалось разблокировать "%s"
|
||||
hub.noKeychain.message=Нет доступа к ключу устройства
|
||||
hub.noKeychain.description=Для разблокировки хаб-хранилища необходим ключ устройства, который защищён с помощью связки ключей. Чтобы продолжить, включите "%s" и выберите связку ключей в настройках.
|
||||
hub.noKeychain.openBtn=Открыть настройки
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.message.check=Проверка конфигурации…
|
||||
hub.checkHostTrust.message.ask=Доверять этому хосту?
|
||||
hub.checkHostTrust.message.ask.plural=Доверять этим хостам?
|
||||
hub.checkHostTrust.trustBtn=Доверять
|
||||
hub.checkHostTrust.denyBtn=Отклонить
|
||||
### Waiting
|
||||
hub.auth.message=Ожидание аутентификации…
|
||||
hub.auth.description=Вы должны быть автоматически перенаправлены на страницу входа.
|
||||
@@ -192,6 +198,9 @@ hub.archived.description=Это хранилище было заархивиро
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Нет доступа
|
||||
hub.unauthorized.description=Вы не авторизованы для открытия этого хранилища. Свяжитесь с владельцем хранилища, чтобы запросить доступ.
|
||||
### Untrusted Host
|
||||
hub.untrustedHost.message=Хост не доверенный
|
||||
hub.untrustedHost.description=Подключение к хабу заблокировано из соображений безопасности. Если вы считаете, что хост безопасен, обратитесь к администратору хаба или повторите попытку.
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Требуется действие
|
||||
hub.requireAccountInit.description.0=Для продолжения выполните необходимые шаги в
|
||||
@@ -305,6 +314,7 @@ preferences.general.debugDirectory=Показать файлы журнала
|
||||
preferences.general.autoStart=Запускать Cryptomator при старте системы
|
||||
preferences.general.keychainBackend=Хранение паролей
|
||||
preferences.general.quickAccessService=Добавлять открытые хранилища в область быстрого доступа
|
||||
preferences.general.resetTrustedHosts=Сбросить доверенные хосты
|
||||
## Interface
|
||||
preferences.interface=Интерфейс
|
||||
preferences.interface.theme=Тема
|
||||
@@ -716,4 +726,4 @@ eventView.entry.inUse.ignoreLock=Игнорировать статус испо
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=Файл используется на другом устройстве
|
||||
notification.inUse.description=Файл открыт %s на %s. Попросите закрыть файл и завершить синхронизацию. Вы можете проигнорировать статус и открыть его, но есть риск конфликтов или перезаписи новых изменений.
|
||||
notification.inUse.action=Игнорировать статус использования
|
||||
notification.inUse.action=Игнорировать статус использования
|
||||
|
||||
@@ -14,6 +14,7 @@ generic.button.next=ඊළඟ
|
||||
generic.button.print=මුද්රණය කරන්න
|
||||
|
||||
## Vault state
|
||||
vault.state.error=දෝෂය
|
||||
|
||||
# Error
|
||||
error.message=දෝෂය: %s
|
||||
@@ -48,15 +49,18 @@ unlock.unlockBtn=අගුළුහරින්න
|
||||
## Success
|
||||
## Failure
|
||||
## Hub
|
||||
### Check Host Authenticity
|
||||
### Waiting
|
||||
### Receive Key
|
||||
### Register Device
|
||||
hub.register.registerBtn=ලියාපදිංචි වන්න
|
||||
### Register Device Legacy
|
||||
### Registration Success
|
||||
hub.registerSuccess.unlockBtn=අගුළුහරින්න
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
|
||||
@@ -171,4 +175,4 @@ hub.registerSuccess.unlockBtn=අගුළුහරින්න
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -159,6 +159,12 @@ unlock.error.title=Odomknutie "%s" zlyhalo
|
||||
hub.noKeychain.message=Nemôžem pristúpiť ku kľúču zariadenia
|
||||
hub.noKeychain.description=V poradí odomknutia Hub trezorov, je požadovaný kľúč zariadenia ktorý je zabezpečený použitím keychain. K vykonaniu povoľte "%s" a zvoľte keychain v nastaveniach.
|
||||
hub.noKeychain.openBtn=Otvoriť predvoľby
|
||||
### Check Host Authenticity
|
||||
hub.checkHostTrust.message.check=Kontrolovanie konfigurácie…
|
||||
hub.checkHostTrust.message.ask=Veríte tomuto hostovi?
|
||||
hub.checkHostTrust.message.ask.plural=Veríte týmto hostom?
|
||||
hub.checkHostTrust.trustBtn=Veriť
|
||||
hub.checkHostTrust.denyBtn=Odmietnuť
|
||||
### Waiting
|
||||
hub.auth.message=Čakanie na autentifikáciu…
|
||||
hub.auth.description=Môžete byť automaticky presmerovaný na prihlasovaciu stránku.
|
||||
@@ -184,6 +190,8 @@ hub.archived.description=Tento trezor bol archivovaný a nie je viac dostupný.
|
||||
### Unauthorized
|
||||
hub.unauthorized.message=Prístup zamietnutý
|
||||
hub.unauthorized.description=Nie ste autorizovaný na otvorenie tohto trezora. Kontaktujte vlastníka trezora pre vyžiadanie prístupu.
|
||||
### Untrusted Host
|
||||
hub.untrustedHost.message=Nedôveryhodný host
|
||||
### Requires Account Initialization
|
||||
hub.requireAccountInit.message=Vyžadovaná akcia
|
||||
hub.requireAccountInit.description.0=Pre pokračovanie vyplňte potrebné kroky vo vašom
|
||||
@@ -297,6 +305,7 @@ preferences.general.debugDirectory=Ukázať súbory logov
|
||||
preferences.general.autoStart=Spustiť Cryptomator pri štarte systému
|
||||
preferences.general.keychainBackend=Uložiť heslá v
|
||||
preferences.general.quickAccessService=Pridať odomknuté trezory na plochu rýchleho prístupu
|
||||
preferences.general.resetTrustedHosts=Zrušiť dôveryhodné hosty
|
||||
## Interface
|
||||
preferences.interface=Rozhranie
|
||||
preferences.interface.theme=Vzhľad a pocit
|
||||
@@ -665,4 +674,4 @@ eventView.entry.inUse.copyUserAndDevice=Kopírovať zamykaného užívateľa a m
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
notification.inUse.message=Súbor je používaný iným zariadením
|
||||
notification.inUse.message=Súbor je používaný iným zariadením
|
||||
|
||||
@@ -73,6 +73,7 @@ unlock.unlockBtn=Odkleni
|
||||
## Success
|
||||
## Failure
|
||||
## Hub
|
||||
### Check Host Authenticity
|
||||
### Waiting
|
||||
### Receive Key
|
||||
### Register Device
|
||||
@@ -83,6 +84,7 @@ hub.registerSuccess.unlockBtn=Odkleni
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
|
||||
@@ -220,4 +222,4 @@ contactHubVaultOwner.title=Hub trezor
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -103,6 +103,7 @@ unlock.success.rememberChoice=Zapamti izbor, ne prikazuj ovo ponovo
|
||||
unlock.success.revealBtn=Otvori disk
|
||||
## Failure
|
||||
## Hub
|
||||
### Check Host Authenticity
|
||||
### Waiting
|
||||
### Receive Key
|
||||
### Register Device
|
||||
@@ -112,6 +113,7 @@ hub.registerSuccess.unlockBtn=Otključaj
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
|
||||
@@ -359,4 +361,4 @@ quit.lockAndQuitBtn=Zaključaj i Izađi
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
@@ -95,6 +95,7 @@ unlock.chooseMasterkey.filePickerTitle=Izaberi "Masterkey" datoteku
|
||||
unlock.success.revealBtn=Otvori disk
|
||||
## Failure
|
||||
## Hub
|
||||
### Check Host Authenticity
|
||||
### Waiting
|
||||
### Receive Key
|
||||
### Register Device
|
||||
@@ -104,6 +105,7 @@ hub.registerSuccess.unlockBtn=Otključaj
|
||||
### Registration Failed
|
||||
### Archived
|
||||
### Unauthorized
|
||||
### Untrusted Host
|
||||
### Requires Account Initialization
|
||||
### License Exceeded
|
||||
|
||||
@@ -278,4 +280,4 @@ vaultOptions.masterkey.changePasswordBtn=Promena lozinke
|
||||
|
||||
|
||||
# Notifications
|
||||
## FileIsInUse Notification
|
||||
## FileIsInUse Notification
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user