mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-09-21 23:44:42 +00:00
Compare commits
103
Commits
1.16.0
...
1.18.0-beta1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
153f9b485c | ||
|
|
b9e91115b4 | ||
|
|
2d29b1a76f | ||
|
|
f62a5ed74b | ||
|
|
7fe7e1f5bf | ||
|
|
a4d9703cf4 | ||
|
|
c9a3a775cc | ||
|
|
e7cac42d5d | ||
|
|
983e7d973b | ||
|
|
a84ac94701 | ||
|
|
4761c58265 | ||
|
|
682e762a5a | ||
|
|
c3ada43abb | ||
|
|
9a71782fff | ||
|
|
f64455d8fb | ||
|
|
8b1d2101db | ||
|
|
27c10080d6 | ||
|
|
7ad9b10138 | ||
|
|
fb6e4f0c15 | ||
|
|
6c5f3cb72c | ||
|
|
581b16e354 | ||
|
|
d74248ff63 | ||
|
|
698ac639e9 | ||
|
|
5a086f52b5 | ||
|
|
54b7f3c842 | ||
|
|
94b9813c50 | ||
|
|
78cffe2f60 | ||
|
|
9d15a7664d | ||
|
|
5d8457cbdd | ||
|
|
94eb1e365b | ||
|
|
414ccad8fb | ||
|
|
e57e5358c4 | ||
|
|
e24719ed19 | ||
|
|
e21525ce2e | ||
|
|
9a14cfc674 | ||
|
|
9af9362a7b | ||
|
|
4d4a93746d | ||
|
|
cb6b77318d | ||
|
|
feb9fb689e | ||
|
|
0178ca4080 | ||
|
|
79f2863f24 | ||
|
|
f1ef506e2b | ||
|
|
fbeeaa4c93 | ||
|
|
00f5d433da | ||
|
|
115a4216ee | ||
|
|
403d469dff | ||
|
|
ddf112bdfa | ||
|
|
2ade07da75 | ||
|
|
e6a0339878 | ||
|
|
2b0c2cf90a | ||
|
|
2afd8d0988 | ||
|
|
f2bda6b5f9 | ||
|
|
0bb1bf81ec | ||
|
|
bf8d5ed09f | ||
|
|
e9f6854df8 | ||
|
|
354225bf1e | ||
|
|
0d4f373311 | ||
|
|
1da535e89c | ||
|
|
941b4e3652 | ||
|
|
dd1af8cd78 | ||
|
|
27ea29ab9d | ||
|
|
a699a794a9 | ||
|
|
cd6b1cf129 | ||
|
|
7d2c4992af | ||
|
|
6a21d24687 | ||
|
|
cba6ed9875 | ||
|
|
72fdc8f536 | ||
|
|
41336cca13 | ||
|
|
322907bbcd | ||
|
|
1f8df6fead | ||
|
|
6e085b783d | ||
|
|
59dddd3f4c | ||
|
|
d6bbcfbbc1 | ||
|
|
7260d7f9f8 | ||
|
|
c39c4be1cd | ||
|
|
565ab4a09b | ||
|
|
f797491a17 | ||
|
|
cff83b6ac6 | ||
|
|
6f9b3e31e7 | ||
|
|
0a0dde3f47 | ||
|
|
e27e303c01 | ||
|
|
ef54b685f6 | ||
|
|
0370fd5848 | ||
|
|
119d18d699 | ||
|
|
8322633b14 | ||
|
|
2f32fc5c16 | ||
|
|
7c44c4f194 | ||
|
|
bbb663f9d2 | ||
|
|
fdb4a2fb5c | ||
|
|
0a4684133d | ||
|
|
0d5e518af3 | ||
|
|
d47ab43fcf | ||
|
|
19a711d12b | ||
|
|
bf2db55d00 | ||
|
|
885975e099 | ||
|
|
85c2901484 | ||
|
|
434030b139 | ||
|
|
e43bb37758 | ||
|
|
2eb9f0fca8 | ||
|
|
9503feb9c4 | ||
|
|
08e9f130e4 | ||
|
|
79b3274074 | ||
|
|
7c86e5e39a |
@@ -53,6 +53,4 @@ updates:
|
|||||||
groups:
|
groups:
|
||||||
github-actions:
|
github-actions:
|
||||||
patterns:
|
patterns:
|
||||||
- "*"
|
- "*"
|
||||||
labels:
|
|
||||||
- "misc:ci"
|
|
||||||
@@ -8,16 +8,24 @@ on:
|
|||||||
version:
|
version:
|
||||||
description: 'Version'
|
description: 'Version'
|
||||||
required: false
|
required: false
|
||||||
|
push:
|
||||||
|
branches-ignore:
|
||||||
|
- 'dependabot/**'
|
||||||
|
paths:
|
||||||
|
- '.github/workflows/appimage.yml'
|
||||||
|
- 'dist/linux/appimage/**'
|
||||||
|
- 'dist/linux/common/**'
|
||||||
|
- 'dist/linux/resources/**'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_DIST: 'temurin'
|
JAVA_DIST: 'temurin'
|
||||||
JAVA_VERSION: '23.0.2'
|
JAVA_VERSION: '24.0.1+9'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
get-version:
|
get-version:
|
||||||
uses: ./.github/workflows/get-version.yml
|
uses: ./.github/workflows/get-version.yml
|
||||||
with:
|
with:
|
||||||
version: ${{ inputs.version }}
|
version: ${{ inputs.version }} #okay if not defined
|
||||||
|
|
||||||
build:
|
build:
|
||||||
name: Build AppImage
|
name: Build AppImage
|
||||||
@@ -29,22 +37,21 @@ jobs:
|
|||||||
include:
|
include:
|
||||||
- os: ubuntu-latest
|
- os: ubuntu-latest
|
||||||
appimage-suffix: x86_64
|
appimage-suffix: x86_64
|
||||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/23.0.2/openjfx-23.0.2_linux-x64_bin-jmods.zip'
|
openjfx-url: 'https://download2.gluonhq.com/openjfx/24.0.1/openjfx-24.0.1_linux-x64_bin-jmods.zip'
|
||||||
openjfx-sha: '063baebc6922e4a89c94b9dfb7a4f53e59e8d6fec400d4e670b31bc2ab324dec'
|
openjfx-sha: '425fac742b9fbd095b2ce868cff82d1024620f747c94a7144d0a4879e756146c'
|
||||||
- os: ubuntu-24.04-arm
|
- os: ubuntu-24.04-arm
|
||||||
appimage-suffix: aarch64
|
appimage-suffix: aarch64
|
||||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/23.0.2/openjfx-23.0.2_linux-aarch64_bin-jmods.zip'
|
openjfx-url: 'https://download2.gluonhq.com/openjfx/24.0.1/openjfx-24.0.1_linux-aarch64_bin-jmods.zip'
|
||||||
openjfx-sha: '9bbedaeae1590b69e2b22237bda310936df33e344dbc243bea2e86acaab3a0d8'
|
openjfx-sha: '7e02edd0f4ee5527a27c94b0bbba66fcaaff41009119e45d0eca0f96ddfb6e7b'
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: ${{ env.JAVA_DIST }}
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
check-latest: true
|
check-latest: true
|
||||||
cache: 'maven'
|
cache: 'maven'
|
||||||
|
|
||||||
- name: Download OpenJFX jmods
|
- name: Download OpenJFX jmods
|
||||||
id: download-jmods
|
id: download-jmods
|
||||||
run: |
|
run: |
|
||||||
@@ -61,7 +68,7 @@ jobs:
|
|||||||
POM_JFX_VERSION=${POM_JFX_VERSION#*@}
|
POM_JFX_VERSION=${POM_JFX_VERSION#*@}
|
||||||
POM_JFX_VERSION=${POM_JFX_VERSION%%.*}
|
POM_JFX_VERSION=${POM_JFX_VERSION%%.*}
|
||||||
|
|
||||||
if [ $POM_JFX_VERSION -ne $JMOD_VERSION_AMD64 ]; then
|
if [ $POM_JFX_VERSION -ne $JMOD_VERSION ]; then
|
||||||
>&2 echo "Major JavaFX version in pom.xml (${POM_JFX_VERSION}) != amd64 jmod version (${JMOD_VERSION})"
|
>&2 echo "Major JavaFX version in pom.xml (${POM_JFX_VERSION}) != amd64 jmod version (${JMOD_VERSION})"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -73,13 +80,21 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
cp LICENSE.txt target
|
cp LICENSE.txt target
|
||||||
cp target/cryptomator-*.jar target/mods
|
cp target/cryptomator-*.jar target/mods
|
||||||
|
- name: Run jlink with help option
|
||||||
|
id: jep-493-check
|
||||||
|
run: |
|
||||||
|
JMOD_PATHS="openjfx-jmods"
|
||||||
|
if ! ${JAVA_HOME}/bin/jlink --help | grep -q "Linking from run-time image enabled"; then
|
||||||
|
JMOD_PATHS="${JAVA_HOME}/jmods:${JMOD_PATHS}"
|
||||||
|
fi
|
||||||
|
echo "jmod_paths=${JMOD_PATHS}" >> "$GITHUB_OUTPUT"
|
||||||
- name: Run jlink
|
- name: Run jlink
|
||||||
#Remark: no compression is applied for improved build compression later (here appimage)
|
#Remark: no compression is applied for improved build compression later (here appimage)
|
||||||
run: >
|
run: >
|
||||||
${JAVA_HOME}/bin/jlink
|
${JAVA_HOME}/bin/jlink
|
||||||
--verbose
|
--verbose
|
||||||
--output runtime
|
--output runtime
|
||||||
--module-path "${JAVA_HOME}/jmods:openjfx-jmods"
|
--module-path "${{ steps.jep-493-check.outputs.jmod_paths }}"
|
||||||
--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.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net,java.compiler
|
--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.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net,java.compiler
|
||||||
--strip-native-commands
|
--strip-native-commands
|
||||||
--no-header-files
|
--no-header-files
|
||||||
@@ -101,7 +116,8 @@ jobs:
|
|||||||
--copyright "(C) 2016 - 2025 Skymatic GmbH"
|
--copyright "(C) 2016 - 2025 Skymatic GmbH"
|
||||||
--app-version "${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum }}"
|
--app-version "${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum }}"
|
||||||
--java-options "--enable-preview"
|
--java-options "--enable-preview"
|
||||||
--java-options "--enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator"
|
--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 "-Xss5m"
|
||||||
--java-options "-Xmx256m"
|
--java-options "-Xmx256m"
|
||||||
--java-options "-Dcryptomator.appVersion=\"${{ needs.get-version.outputs.semVerStr }}\""
|
--java-options "-Dcryptomator.appVersion=\"${{ needs.get-version.outputs.semVerStr }}\""
|
||||||
@@ -117,6 +133,7 @@ jobs:
|
|||||||
--java-options "-Dcryptomator.integrationsLinux.trayIconsDir=\"@{appdir}/usr/share/icons/hicolor/symbolic/apps\""
|
--java-options "-Dcryptomator.integrationsLinux.trayIconsDir=\"@{appdir}/usr/share/icons/hicolor/symbolic/apps\""
|
||||||
--java-options "-Dcryptomator.buildNumber=\"appimage-${{ needs.get-version.outputs.revNum }}\""
|
--java-options "-Dcryptomator.buildNumber=\"appimage-${{ needs.get-version.outputs.revNum }}\""
|
||||||
--java-options "-Dcryptomator.networking.truststore.p12Path=\"/etc/cryptomator/certs.p12\""
|
--java-options "-Dcryptomator.networking.truststore.p12Path=\"/etc/cryptomator/certs.p12\""
|
||||||
|
--java-options "-XX:ErrorFile=/cryptomator/cryptomator_crash.log"
|
||||||
--resource-dir dist/linux/resources
|
--resource-dir dist/linux/resources
|
||||||
- name: Patch Cryptomator.AppDir
|
- name: Patch Cryptomator.AppDir
|
||||||
run: |
|
run: |
|
||||||
@@ -152,7 +169,7 @@ jobs:
|
|||||||
- name: Build AppImage
|
- name: Build AppImage
|
||||||
run: >
|
run: >
|
||||||
./squashfs-root/AppRun Cryptomator.AppDir cryptomator-${{ needs.get-version.outputs.semVerStr }}-${{ matrix.appimage-suffix }}.AppImage
|
./squashfs-root/AppRun Cryptomator.AppDir cryptomator-${{ needs.get-version.outputs.semVerStr }}-${{ matrix.appimage-suffix }}.AppImage
|
||||||
-u 'gh-releases-zsync|cryptomator|cryptomator|latest|cryptomator-*-${{ matrix.appimage-suffix }}.AppImage.zsync'
|
-u "gh-releases-zsync|cryptomator|cryptomator|latest|cryptomator-*-${{ matrix.appimage-suffix }}.AppImage.zsync"
|
||||||
--sign --sign-key=615D449FE6E6A235
|
--sign --sign-key=615D449FE6E6A235
|
||||||
- name: Create detached GPG signatures
|
- name: Create detached GPG signatures
|
||||||
run: |
|
run: |
|
||||||
@@ -177,3 +194,68 @@ jobs:
|
|||||||
cryptomator-*.AppImage
|
cryptomator-*.AppImage
|
||||||
cryptomator-*.zsync
|
cryptomator-*.zsync
|
||||||
cryptomator-*.asc
|
cryptomator-*.asc
|
||||||
|
|
||||||
|
create-aur-bin-pr:
|
||||||
|
name: Create PR for aur-bin repo
|
||||||
|
needs: [build, get-version]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.event_name == 'release'
|
||||||
|
steps:
|
||||||
|
- name: Download AppImages
|
||||||
|
uses: actions/download-artifact@v5
|
||||||
|
with:
|
||||||
|
path: downloads/
|
||||||
|
merge-multiple: true
|
||||||
|
- name: Compute sha256 hash of AppImages
|
||||||
|
id: checksums
|
||||||
|
run: |
|
||||||
|
X64_SHA256=$(sha256sum downloads/cryptomator-*-x86_64.AppImage | cut -d ' ' -f1)
|
||||||
|
echo "x64-sha256sum=${X64_SHA256}" >> "$GITHUB_OUTPUT"
|
||||||
|
AARCH64_SHA256=$(sha256sum downloads/cryptomator-*-aarch64.AppImage | cut -d ' ' -f1)
|
||||||
|
echo "aarch64-sha256sum=${AARCH64_SHA256}" >> "$GITHUB_OUTPUT"
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
repository: 'cryptomator/aur-bin'
|
||||||
|
token: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get -y install makepkg pacman-package-manager
|
||||||
|
- name: Checkout release branch
|
||||||
|
run: |
|
||||||
|
git checkout -b release/${{ needs.get-version.outputs.semVerStr }}
|
||||||
|
- name: Update build file
|
||||||
|
run: |
|
||||||
|
sed -i -e 's|^pkgver=.*$|pkgver=${{ needs.get-version.outputs.semVerStr }}|' PKGBUILD
|
||||||
|
sed -i -e 's|^pkgrel=.*$|pkgrel=1|' PKGBUILD
|
||||||
|
sed -i -e "s|^sha256sums_x86_64=.*$|sha256sums_x86_64=('${{ steps.checksums.outputs.x64-sha256sum }}'|" PKGBUILD
|
||||||
|
sed -i -e "s|^sha256sums_aarch64=.*$|sha256sums_aarch64=('${{ steps.checksums.outputs.aarch64-sha256sum}}'|" PKGBUILD
|
||||||
|
makepkg --printsrcinfo > .SRCINFO
|
||||||
|
- 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
|
||||||
|
id: create-pr
|
||||||
|
run: |
|
||||||
|
printf "> [!IMPORTANT]\n> Todos:\n> - [ ] Update build instructions\n> - [ ] Check for JDK update\n> - [ ] Check for JFX update" > pr_body.md
|
||||||
|
URL=$(gh pr create --title "Release ${{ needs.get-version.outputs.semVerStr }}" --body-file pr_body.md)
|
||||||
|
echo "PR_URL=$URL" >> "$GITHUB_OUTPUT"
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||||
|
- name: Slack Notification
|
||||||
|
uses: rtCamp/action-slack-notify@v2
|
||||||
|
env:
|
||||||
|
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
|
||||||
|
SLACK_USERNAME: 'Cryptobot'
|
||||||
|
SLACK_ICON: false
|
||||||
|
SLACK_ICON_EMOJI: ':bot:'
|
||||||
|
SLACK_CHANNEL: 'cryptomator-desktop'
|
||||||
|
SLACK_TITLE: "AUR-bin release PR for ${{ github.event.repository.name }} ${{ github.event.release.tag_name }} created."
|
||||||
|
SLACK_MESSAGE: "See <${{ steps.create-pr.outputs.PR_URL }}|PR> on how to proceed."
|
||||||
|
SLACK_FOOTER: false
|
||||||
|
MSG_MINIMAL: true
|
||||||
|
|||||||
@@ -0,0 +1,93 @@
|
|||||||
|
name: Create PR for AUR
|
||||||
|
|
||||||
|
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}}
|
||||||
|
sha256: ${{ steps.sha256.outputs.sha256}}
|
||||||
|
steps:
|
||||||
|
- name: Determine tarball url
|
||||||
|
id: url
|
||||||
|
run: |
|
||||||
|
URL="";
|
||||||
|
if [[ -n "${{ inputs.tag }}" ]]; then
|
||||||
|
URL="https://github.com/cryptomator/cryptomator/archive/refs/tags/${{ inputs.tag }}.tar.gz"
|
||||||
|
else
|
||||||
|
URL="https://github.com/cryptomator/cryptomator/archive/refs/tags/${{ github.event.release.tag_name }}.tar.gz"
|
||||||
|
fi
|
||||||
|
echo "url=${URL}" >> "$GITHUB_OUTPUT"
|
||||||
|
- name: Download source tarball and compute checksum
|
||||||
|
id: sha256
|
||||||
|
run: |
|
||||||
|
curl --silent --fail-with-body -L -H "Accept: application/vnd.github+json" ${{ steps.url.outputs.url }} --output cryptomator.tar.gz
|
||||||
|
TARBALL_SHA256=$(sha256sum cryptomator.tar.gz | cut -d ' ' -f1)
|
||||||
|
echo "sha256=${TARBALL_SHA256}" >> "$GITHUB_OUTPUT"
|
||||||
|
aur:
|
||||||
|
name: Create PR for AUR
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [tarball, get-version]
|
||||||
|
env:
|
||||||
|
AUR_PR_URL: tbd
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
with:
|
||||||
|
repository: 'cryptomator/aur'
|
||||||
|
token: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install makepkg pacman-package-manager
|
||||||
|
- name: Checkout release branch
|
||||||
|
run: |
|
||||||
|
git checkout -b release/${{ needs.get-version.outputs.semVerStr }}
|
||||||
|
- name: Update build file
|
||||||
|
run: |
|
||||||
|
sed -i -e 's|^pkgver=.*$|pkgver=${{ needs.get-version.outputs.semVerStr }}|' PKGBUILD
|
||||||
|
sed -i -e 's|^pkgrel=.*$|pkgrel=1|' PKGBUILD
|
||||||
|
sed -i -e "s|^sha256sums=.*$|sha256sums=('${{ needs.tarball.outputs.sha256 }}'|" PKGBUILD
|
||||||
|
makepkg --printsrcinfo > .SRCINFO
|
||||||
|
- 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 build instructions\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 "AUR_PR_URL=$PR_URL" >> "$GITHUB_ENV"
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||||
|
- name: Slack Notification
|
||||||
|
uses: rtCamp/action-slack-notify@v2
|
||||||
|
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: "AUR release PR created for ${{ github.event.repository.name }} ${{ github.event.release.tag_name }} created."
|
||||||
|
SLACK_MESSAGE: "See <${{ env.AUR_PR_URL }}|PR> on how to proceed."
|
||||||
|
SLACK_FOOTER: false
|
||||||
|
MSG_MINIMAL: true
|
||||||
@@ -51,12 +51,12 @@ jobs:
|
|||||||
if: github.event_name == 'workflow_call' || inputs.kaspersky
|
if: github.event_name == 'workflow_call' || inputs.kaspersky
|
||||||
steps:
|
steps:
|
||||||
- name: Download artifact
|
- name: Download artifact
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: ${{ needs.download-file.outputs.fileName }}
|
name: ${{ needs.download-file.outputs.fileName }}
|
||||||
path: upload
|
path: upload
|
||||||
- name: Upload to Kaspersky
|
- name: Upload to Kaspersky
|
||||||
uses: SamKirkland/FTP-Deploy-Action@v4.3.5
|
uses: SamKirkland/FTP-Deploy-Action@v4.3.6
|
||||||
with:
|
with:
|
||||||
protocol: ftps
|
protocol: ftps
|
||||||
server: allowlist.kaspersky-labs.com
|
server: allowlist.kaspersky-labs.com
|
||||||
@@ -71,12 +71,12 @@ jobs:
|
|||||||
if: github.event_name == 'workflow_call' || inputs.avast
|
if: github.event_name == 'workflow_call' || inputs.avast
|
||||||
steps:
|
steps:
|
||||||
- name: Download artifact
|
- name: Download artifact
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: ${{ needs.download-file.outputs.fileName }}
|
name: ${{ needs.download-file.outputs.fileName }}
|
||||||
path: upload
|
path: upload
|
||||||
- name: Upload to Avast
|
- name: Upload to Avast
|
||||||
uses: wlixcc/SFTP-Deploy-Action@v1.2.5
|
uses: wlixcc/SFTP-Deploy-Action@v1.2.6
|
||||||
with:
|
with:
|
||||||
server: whitelisting.avast.com
|
server: whitelisting.avast.com
|
||||||
port: 22
|
port: 22
|
||||||
|
|||||||
@@ -2,12 +2,16 @@ name: Build
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
paths:
|
||||||
|
- '.github/workflows/build.yml'
|
||||||
|
- 'pom.xml'
|
||||||
|
- 'src/**'
|
||||||
pull_request_target:
|
pull_request_target:
|
||||||
types: [labeled]
|
types: [labeled]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_DIST: 'temurin'
|
JAVA_DIST: 'temurin'
|
||||||
JAVA_VERSION: 23
|
JAVA_VERSION: 24
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
@@ -18,8 +22,8 @@ jobs:
|
|||||||
name: Compile and Test
|
name: Compile and Test
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- uses: actions/setup-java@v4
|
- uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: ${{ env.JAVA_DIST }}
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
JDK_VERSION: '23.0.1+11'
|
JDK_VERSION: '24.0.1+9'
|
||||||
JDK_VENDOR: temurin
|
JDK_VENDOR: temurin
|
||||||
RUNTIME_VERSION_HELPER: >
|
RUNTIME_VERSION_HELPER: >
|
||||||
public class Test {
|
public class Test {
|
||||||
@@ -26,7 +26,7 @@ jobs:
|
|||||||
run: echo 'JDK_MAJOR_VERSION=${{ env.JDK_VERSION }}'.substring(0,20) >> "$env:GITHUB_ENV"
|
run: echo 'JDK_MAJOR_VERSION=${{ env.JDK_VERSION }}'.substring(0,20) >> "$env:GITHUB_ENV"
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
- name: Checkout latest JDK ${{ env.JDK_MAJOR_VERSION }}
|
- name: Checkout latest JDK ${{ env.JDK_MAJOR_VERSION }}
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
java-version: ${{ env.JDK_MAJOR_VERSION}}
|
java-version: ${{ env.JDK_MAJOR_VERSION}}
|
||||||
distribution: ${{ env.JDK_VENDOR }}
|
distribution: ${{ env.JDK_VENDOR }}
|
||||||
|
|||||||
@@ -5,48 +5,59 @@ on:
|
|||||||
inputs:
|
inputs:
|
||||||
semver:
|
semver:
|
||||||
description: 'SemVer String (e.g. 1.7.0-beta1)'
|
description: 'SemVer String (e.g. 1.7.0-beta1)'
|
||||||
required: true
|
|
||||||
ppaver:
|
ppaver:
|
||||||
description: 'Base PPA Version String (e.g. 1.6.16+1.7.0~beta1) without -0ppa1'
|
description: 'Base PPA Version String (e.g. 1.6.16+1.7.0~beta1) without -0ppa1'
|
||||||
required: true
|
|
||||||
dput:
|
dput:
|
||||||
description: 'Upload to PPA'
|
description: 'Upload to PPA'
|
||||||
required: true
|
required: true
|
||||||
default: false
|
default: false
|
||||||
type: boolean
|
type: boolean
|
||||||
|
push:
|
||||||
|
branches-ignore:
|
||||||
|
- 'dependabot/**'
|
||||||
|
paths:
|
||||||
|
- '.github/workflows/debian.yml'
|
||||||
|
- 'dist/linux/debian/**'
|
||||||
|
- 'dist/linux/common/**'
|
||||||
|
- 'dist/linux/resources/**'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_DIST: 'temurin'
|
JAVA_DIST: 'temurin'
|
||||||
JAVA_VERSION: '23.0.2+7'
|
JAVA_VERSION: '24.0.1+9'
|
||||||
COFFEELIBS_JDK: 23
|
COFFEELIBS_JDK: 24
|
||||||
COFFEELIBS_JDK_VERSION: '23.0.2+7-0ppa1'
|
COFFEELIBS_JDK_VERSION: '24.0.1+9-0ppa3'
|
||||||
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/23.0.2/openjfx-23.0.2_linux-x64_bin-jmods.zip'
|
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/24.0.1/openjfx-24.0.1_linux-x64_bin-jmods.zip'
|
||||||
OPENJFX_JMODS_AMD64_HASH: '063baebc6922e4a89c94b9dfb7a4f53e59e8d6fec400d4e670b31bc2ab324dec'
|
OPENJFX_JMODS_AMD64_HASH: '425fac742b9fbd095b2ce868cff82d1024620f747c94a7144d0a4879e756146c'
|
||||||
OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/23.0.2/openjfx-23.0.2_linux-aarch64_bin-jmods.zip'
|
OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/24.0.1/openjfx-24.0.1_linux-aarch64_bin-jmods.zip'
|
||||||
OPENJFX_JMODS_AARCH64_HASH: '9bbedaeae1590b69e2b22237bda310936df33e344dbc243bea2e86acaab3a0d8'
|
OPENJFX_JMODS_AARCH64_HASH: '7e02edd0f4ee5527a27c94b0bbba66fcaaff41009119e45d0eca0f96ddfb6e7b'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
get-version:
|
||||||
|
uses: ./.github/workflows/get-version.yml
|
||||||
|
with:
|
||||||
|
version: ${{ inputs.semver }} #okay if not defined
|
||||||
|
|
||||||
build:
|
build:
|
||||||
name: Build Debian Package
|
name: Build Debian Package
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
|
needs: [get-version]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- id: versions
|
- id: deb-version
|
||||||
name: Get version information
|
name: Determine deb-version
|
||||||
run: |
|
run: |
|
||||||
SEM_VER_STR="${{ inputs.semver }}"
|
if [ -n "${{inputs.ppaver}}" ]; then
|
||||||
SEM_VER_NUM=`echo ${SEM_VER_STR} | sed -E 's/([0-9]+\.[0-9]+\.[0-9]+).*/\1/'`
|
echo "debVersion=${{inputs.ppaver }}" >> "$GITHUB_OUTPUT"
|
||||||
REVCOUNT=`git rev-list --count HEAD`
|
else
|
||||||
echo "semVerStr=${SEM_VER_STR}" >> $GITHUB_OUTPUT
|
echo "debVersion=${{needs.get-version.outputs.semVerStr}}" >> "$GITHUB_OUTPUT"
|
||||||
echo "semVerNum=${SEM_VER_NUM}" >> $GITHUB_OUTPUT
|
fi
|
||||||
echo "revNum=${REVCOUNT}" >> $GITHUB_OUTPUT
|
|
||||||
- name: Install build tools
|
- name: Install build tools
|
||||||
run: |
|
run: |
|
||||||
sudo add-apt-repository ppa:coffeelibs/openjdk
|
sudo add-apt-repository ppa:coffeelibs/openjdk
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install debhelper devscripts dput coffeelibs-jdk-${{ env.COFFEELIBS_JDK }}=${{ env.COFFEELIBS_JDK_VERSION }}
|
sudo apt-get install debhelper devscripts dput coffeelibs-jdk-${{ env.COFFEELIBS_JDK }}=${{ env.COFFEELIBS_JDK_VERSION }}
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: ${{ env.JAVA_DIST }}
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
@@ -94,7 +105,7 @@ jobs:
|
|||||||
cp -r jmods pkgdir
|
cp -r jmods pkgdir
|
||||||
cp -r dist/linux/common/ pkgdir
|
cp -r dist/linux/common/ pkgdir
|
||||||
cp target/cryptomator-*.jar pkgdir/mods
|
cp target/cryptomator-*.jar pkgdir/mods
|
||||||
tar -cJf cryptomator_${{ inputs.ppaver }}.orig.tar.xz -C pkgdir .
|
tar -cJf cryptomator_${{ steps.deb-version.outputs.debVersion }}.orig.tar.xz -C pkgdir .
|
||||||
- name: Patch and rename pkgdir
|
- name: Patch and rename pkgdir
|
||||||
run: |
|
run: |
|
||||||
cp -r dist/linux/debian/ pkgdir
|
cp -r dist/linux/debian/ pkgdir
|
||||||
@@ -103,12 +114,12 @@ jobs:
|
|||||||
envsubst '${SEMVER_STR} ${VERSION_NUM} ${REVISION_NUM} ${DISABLE_UPDATE_CHECK}' < dist/linux/debian/rules > pkgdir/debian/rules
|
envsubst '${SEMVER_STR} ${VERSION_NUM} ${REVISION_NUM} ${DISABLE_UPDATE_CHECK}' < dist/linux/debian/rules > pkgdir/debian/rules
|
||||||
envsubst '${PPA_VERSION} ${RFC2822_TIMESTAMP}' < dist/linux/debian/changelog > pkgdir/debian/changelog
|
envsubst '${PPA_VERSION} ${RFC2822_TIMESTAMP}' < dist/linux/debian/changelog > pkgdir/debian/changelog
|
||||||
find . -name "*.jar" >> pkgdir/debian/source/include-binaries
|
find . -name "*.jar" >> pkgdir/debian/source/include-binaries
|
||||||
mv pkgdir cryptomator_${{ inputs.ppaver }}
|
mv pkgdir cryptomator_${{ steps.deb-version.outputs.debVersion }}
|
||||||
env:
|
env:
|
||||||
SEMVER_STR: ${{ steps.versions.outputs.semVerStr }}
|
SEMVER_STR: ${{ needs.get-version.outputs.semVerStr }}
|
||||||
VERSION_NUM: ${{ steps.versions.outputs.semVerNum }}
|
VERSION_NUM: ${{ needs.get-version.outputs.semVerNum }}
|
||||||
REVISION_NUM: ${{ steps.versions.outputs.revNum }}
|
REVISION_NUM: ${{ needs.get-version.outputs.revNum }}
|
||||||
PPA_VERSION: ${{ inputs.ppaver }}-0ppa1
|
PPA_VERSION: ${{ steps.deb-version.outputs.debVersion }}-0ppa1
|
||||||
- name: Prepare GPG-Agent for signing with key 615D449FE6E6A235
|
- name: Prepare GPG-Agent for signing with key 615D449FE6E6A235
|
||||||
run: |
|
run: |
|
||||||
echo "${GPG_PRIVATE_KEY}" | gpg --batch --quiet --import
|
echo "${GPG_PRIVATE_KEY}" | gpg --batch --quiet --import
|
||||||
@@ -118,12 +129,13 @@ jobs:
|
|||||||
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
|
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
|
||||||
- name: debuild
|
- name: debuild
|
||||||
run: |
|
run: |
|
||||||
|
(sleep 8m; gpg --batch --quiet --pinentry-mode loopback -u 615D449FE6E6A235 --dry-run --sign README.md) &
|
||||||
debuild -S -sa -d
|
debuild -S -sa -d
|
||||||
debuild -b -sa -d
|
debuild -b -sa -d
|
||||||
env:
|
env:
|
||||||
DEBSIGN_PROGRAM: gpg --batch --pinentry-mode loopback
|
DEBSIGN_PROGRAM: gpg --batch --pinentry-mode loopback
|
||||||
DEBSIGN_KEYID: 615D449FE6E6A235
|
DEBSIGN_KEYID: 615D449FE6E6A235
|
||||||
working-directory: cryptomator_${{ inputs.ppaver }}
|
working-directory: cryptomator_${{ steps.deb-version.outputs.debVersion }}
|
||||||
- name: Create detached GPG signatures
|
- name: Create detached GPG signatures
|
||||||
run: |
|
run: |
|
||||||
gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --detach-sign -a cryptomator_*_amd64.deb
|
gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --detach-sign -a cryptomator_*_amd64.deb
|
||||||
@@ -140,7 +152,7 @@ jobs:
|
|||||||
cryptomator_*_amd64.deb
|
cryptomator_*_amd64.deb
|
||||||
cryptomator_*.asc
|
cryptomator_*.asc
|
||||||
- name: Publish on PPA
|
- name: Publish on PPA
|
||||||
if: inputs.dput
|
if: inputs.dput && inputs.ppaver != ''
|
||||||
run: dput ppa:sebastian-stenzel/cryptomator-beta cryptomator_*_source.changes
|
run: dput ppa:sebastian-stenzel/cryptomator-beta cryptomator_*_source.changes
|
||||||
# If ref is a tag, also upload to GitHub Releases:
|
# If ref is a tag, also upload to GitHub Releases:
|
||||||
- name: Publish Debian package on GitHub Releases
|
- name: Publish Debian package on GitHub Releases
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
runner-os: 'ubuntu-latest'
|
runner-os: 'ubuntu-latest'
|
||||||
java-distribution: 'temurin'
|
java-distribution: 'temurin'
|
||||||
java-version: 23
|
java-version: 24
|
||||||
check-command: 'mvn -B validate -Pdependency-check -Djavafx.platform=linux'
|
check-command: 'mvn -B validate -Pdependency-check -Djavafx.platform=linux'
|
||||||
secrets:
|
secrets:
|
||||||
nvd-api-key: ${{ secrets.NVD_API_KEY }}
|
nvd-api-key: ${{ secrets.NVD_API_KEY }}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Get download count of latest releases
|
- name: Get download count of latest releases
|
||||||
id: get-stats
|
id: get-stats
|
||||||
uses: actions/github-script@v7
|
uses: actions/github-script@v8
|
||||||
with:
|
with:
|
||||||
script: |
|
script: |
|
||||||
const query = `query($owner:String!, $name:String!) {
|
const query = `query($owner:String!, $name:String!) {
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
- name: Query Discussion Data
|
- name: Query Discussion Data
|
||||||
if: github.event_name == 'discussion_comment' || github.event_name == 'discussion' && github.event.action != 'deleted'
|
if: github.event_name == 'discussion_comment' || github.event_name == 'discussion' && github.event.action != 'deleted'
|
||||||
id: query-data
|
id: query-data
|
||||||
uses: actions/github-script@v7
|
uses: actions/github-script@v8
|
||||||
with:
|
with:
|
||||||
script: |
|
script: |
|
||||||
const query = `query ($owner: String!, $name: String!, $discussionNumber: Int!) {
|
const query = `query ($owner: String!, $name: String!, $discussionNumber: Int!) {
|
||||||
|
|||||||
@@ -46,10 +46,10 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
FLATHUB_PR_URL: tbd
|
FLATHUB_PR_URL: tbd
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
repository: 'flathub/org.cryptomator.Cryptomator'
|
repository: 'flathub/org.cryptomator.Cryptomator'
|
||||||
token: ${{ secrets.CRYPTOBOT_WINGET_TOKEN }}
|
token: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||||
- name: Checkout release branch
|
- name: Checkout release branch
|
||||||
run: |
|
run: |
|
||||||
git checkout -b release/${{ needs.get-version.outputs.semVerStr }}
|
git checkout -b release/${{ needs.get-version.outputs.semVerStr }}
|
||||||
@@ -72,7 +72,7 @@ jobs:
|
|||||||
PR_URL=$(gh pr create --title "Release ${{ needs.get-version.outputs.semVerStr }}" --body-file 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"
|
echo "FLATHUB_PR_URL=$PR_URL" >> "$GITHUB_ENV"
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.CRYPTOBOT_WINGET_TOKEN }}
|
GH_TOKEN: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||||
- name: Slack Notification
|
- name: Slack Notification
|
||||||
uses: rtCamp/action-slack-notify@v2
|
uses: rtCamp/action-slack-notify@v2
|
||||||
if: github.event_name == 'release'
|
if: github.event_name == 'release'
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ on:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_DIST: 'temurin'
|
JAVA_DIST: 'temurin'
|
||||||
JAVA_VERSION: 23
|
JAVA_VERSION: 24
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
determine-version:
|
determine-version:
|
||||||
@@ -35,11 +35,11 @@ jobs:
|
|||||||
revNum: ${{ steps.versions.outputs.revNum }}
|
revNum: ${{ steps.versions.outputs.revNum }}
|
||||||
type: ${{ steps.versions.outputs.type}}
|
type: ${{ steps.versions.outputs.type}}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: ${{ env.JAVA_DIST }}
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
|
|||||||
@@ -2,20 +2,29 @@ name: Build macOS .dmg for x64
|
|||||||
|
|
||||||
#######################################
|
#######################################
|
||||||
# STOP! DO NOT EDIT THIS FILE!
|
# STOP! DO NOT EDIT THIS FILE!
|
||||||
#
|
#
|
||||||
# It is a copy of mac-dmg.yml with tiny adjustements (mainly lines 42 to 47)
|
# It is a copy of mac-dmg.yml with tiny adjustements (mainly lines 42 to 47)
|
||||||
# It was made necessary, since Github does not offer free macos intel runners for macos 15 and above.
|
# It was made necessary, since Github does not offer free macos intel runners for macos 15 and above.
|
||||||
# This workflow can only be triggered by a release.
|
#
|
||||||
#
|
|
||||||
#######################################
|
#######################################
|
||||||
|
|
||||||
on:
|
on:
|
||||||
release:
|
release:
|
||||||
types: [published]
|
types: [published]
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
description: 'Version'
|
||||||
|
required: false
|
||||||
|
notarize:
|
||||||
|
description: 'Notarize'
|
||||||
|
required: true
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_DIST: 'temurin'
|
JAVA_DIST: 'temurin'
|
||||||
JAVA_VERSION: '23.0.2+7'
|
JAVA_VERSION: '24.0.1+9'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
get-version:
|
get-version:
|
||||||
@@ -35,12 +44,12 @@ jobs:
|
|||||||
architecture: x64
|
architecture: x64
|
||||||
output-suffix: x64
|
output-suffix: x64
|
||||||
fuse-lib: macFUSE
|
fuse-lib: macFUSE
|
||||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/23.0.2/openjfx-23.0.2_osx-x64_bin-jmods.zip'
|
openjfx-url: 'https://download2.gluonhq.com/openjfx/24.0.1/openjfx-24.0.1_osx-x64_bin-jmods.zip'
|
||||||
openjfx-sha: '5e6c65c065eea22430c0eab36f37a5985eb8ad99e19e8772262021740d338f68'
|
openjfx-sha: '6e62a426d43c168a488521f904a523f3dd6ee2cf103e08136f2fd465c828a105'
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: ${{ env.JAVA_DIST }}
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
@@ -75,13 +84,21 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
cp LICENSE.txt target
|
cp LICENSE.txt target
|
||||||
cp target/cryptomator-*.jar target/mods
|
cp target/cryptomator-*.jar target/mods
|
||||||
|
- name: Run jlink with help option
|
||||||
|
id: jep-493-check
|
||||||
|
run: |
|
||||||
|
JMOD_PATHS="openjfx-jmods"
|
||||||
|
if ! ${JAVA_HOME}/bin/jlink --help | grep -q "Linking from run-time image enabled"; then
|
||||||
|
JMOD_PATHS="${JAVA_HOME}/jmods:${JMOD_PATHS}"
|
||||||
|
fi
|
||||||
|
echo "jmod_paths=${JMOD_PATHS}" >> "$GITHUB_OUTPUT"
|
||||||
- name: Run jlink
|
- name: Run jlink
|
||||||
#Remark: no compression is applied for improved build compression later (here dmg)
|
#Remark: no compression is applied for improved build compression later (here dmg)
|
||||||
run: >
|
run: >
|
||||||
${JAVA_HOME}/bin/jlink
|
${JAVA_HOME}/bin/jlink
|
||||||
--verbose
|
--verbose
|
||||||
--output runtime
|
--output runtime
|
||||||
--module-path "${JAVA_HOME}/jmods:openjfx-jmods"
|
--module-path "${{ steps.jep-493-check.outputs.jmod_paths }}"
|
||||||
--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.unsupported,jdk.accessibility,jdk.management.jfr,java.compiler
|
--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.unsupported,jdk.accessibility,jdk.management.jfr,java.compiler
|
||||||
--strip-native-commands
|
--strip-native-commands
|
||||||
--no-header-files
|
--no-header-files
|
||||||
@@ -103,7 +120,8 @@ jobs:
|
|||||||
--copyright "(C) 2016 - 2025 Skymatic GmbH"
|
--copyright "(C) 2016 - 2025 Skymatic GmbH"
|
||||||
--app-version "${{ needs.get-version.outputs.semVerNum }}"
|
--app-version "${{ needs.get-version.outputs.semVerNum }}"
|
||||||
--java-options "--enable-preview"
|
--java-options "--enable-preview"
|
||||||
--java-options "--enable-native-access=org.cryptomator.jfuse.mac"
|
--java-options "--enable-native-access=javafx.graphics,org.cryptomator.jfuse.mac"
|
||||||
|
--java-options "--sun-misc-unsafe-memory-access=allow"
|
||||||
--java-options "-Xss5m"
|
--java-options "-Xss5m"
|
||||||
--java-options "-Xmx256m"
|
--java-options "-Xmx256m"
|
||||||
--java-options "-Dfile.encoding=\"utf-8\""
|
--java-options "-Dfile.encoding=\"utf-8\""
|
||||||
@@ -223,6 +241,11 @@ jobs:
|
|||||||
Cryptomator-${VERSION_NO}-${{ matrix.output-suffix }}.dmg dmg
|
Cryptomator-${VERSION_NO}-${{ matrix.output-suffix }}.dmg dmg
|
||||||
env:
|
env:
|
||||||
VERSION_NO: ${{ needs.get-version.outputs.semVerNum }}
|
VERSION_NO: ${{ needs.get-version.outputs.semVerNum }}
|
||||||
|
- name: Codesign .dmg
|
||||||
|
run: |
|
||||||
|
codesign -s ${CODESIGN_IDENTITY} --timestamp Cryptomator-*.dmg
|
||||||
|
env:
|
||||||
|
CODESIGN_IDENTITY: ${{ secrets.MACOS_CODESIGN_IDENTITY }}
|
||||||
- name: Notarize .dmg
|
- name: Notarize .dmg
|
||||||
if: startsWith(github.ref, 'refs/tags/') || inputs.notarize
|
if: startsWith(github.ref, 'refs/tags/') || inputs.notarize
|
||||||
uses: cocoalibs/xcode-notarization-action@v1
|
uses: cocoalibs/xcode-notarization-action@v1
|
||||||
|
|||||||
@@ -13,10 +13,16 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
default: false
|
default: false
|
||||||
type: boolean
|
type: boolean
|
||||||
|
push:
|
||||||
|
branches-ignore:
|
||||||
|
- 'dependabot/**'
|
||||||
|
paths:
|
||||||
|
- '.github/workflows/mac-dmg.yml'
|
||||||
|
- 'dist/mac/**'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_DIST: 'temurin'
|
JAVA_DIST: 'temurin'
|
||||||
JAVA_VERSION: '23.0.2+7'
|
JAVA_VERSION: '24.0.1+9'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
get-version:
|
get-version:
|
||||||
@@ -36,12 +42,12 @@ jobs:
|
|||||||
architecture: aarch64
|
architecture: aarch64
|
||||||
output-suffix: arm64
|
output-suffix: arm64
|
||||||
fuse-lib: FUSE-T
|
fuse-lib: FUSE-T
|
||||||
openjfx-url: 'https://download2.gluonhq.com/openjfx/23.0.2/openjfx-23.0.2_osx-aarch64_bin-jmods.zip'
|
openjfx-url: 'https://download2.gluonhq.com/openjfx/24.0.1/openjfx-24.0.1_osx-aarch64_bin-jmods.zip'
|
||||||
openjfx-sha: 'c690cc642a3924cf56622951f478ba57aec9ce09063761f800c3319331bed3fc'
|
openjfx-sha: 'b5a94a13077507003fa852512bfa33f4fb680bc8076d8002e4227a84c85171d4'
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: ${{ env.JAVA_DIST }}
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
@@ -76,13 +82,21 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
cp LICENSE.txt target
|
cp LICENSE.txt target
|
||||||
cp target/cryptomator-*.jar target/mods
|
cp target/cryptomator-*.jar target/mods
|
||||||
|
- name: Run jlink with help option
|
||||||
|
id: jep-493-check
|
||||||
|
run: |
|
||||||
|
JMOD_PATHS="openjfx-jmods"
|
||||||
|
if ! ${JAVA_HOME}/bin/jlink --help | grep -q "Linking from run-time image enabled"; then
|
||||||
|
JMOD_PATHS="${JAVA_HOME}/jmods:${JMOD_PATHS}"
|
||||||
|
fi
|
||||||
|
echo "jmod_paths=${JMOD_PATHS}" >> "$GITHUB_OUTPUT"
|
||||||
- name: Run jlink
|
- name: Run jlink
|
||||||
#Remark: no compression is applied for improved build compression later (here dmg)
|
#Remark: no compression is applied for improved build compression later (here dmg)
|
||||||
run: >
|
run: >
|
||||||
${JAVA_HOME}/bin/jlink
|
${JAVA_HOME}/bin/jlink
|
||||||
--verbose
|
--verbose
|
||||||
--output runtime
|
--output runtime
|
||||||
--module-path "${JAVA_HOME}/jmods:openjfx-jmods"
|
--module-path "${{ steps.jep-493-check.outputs.jmod_paths }}"
|
||||||
--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.unsupported,jdk.accessibility,jdk.management.jfr,java.compiler
|
--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.unsupported,jdk.accessibility,jdk.management.jfr,java.compiler
|
||||||
--strip-native-commands
|
--strip-native-commands
|
||||||
--no-header-files
|
--no-header-files
|
||||||
@@ -104,7 +118,8 @@ jobs:
|
|||||||
--copyright "(C) 2016 - 2025 Skymatic GmbH"
|
--copyright "(C) 2016 - 2025 Skymatic GmbH"
|
||||||
--app-version "${{ needs.get-version.outputs.semVerNum }}"
|
--app-version "${{ needs.get-version.outputs.semVerNum }}"
|
||||||
--java-options "--enable-preview"
|
--java-options "--enable-preview"
|
||||||
--java-options "--enable-native-access=org.cryptomator.jfuse.mac"
|
--java-options "--enable-native-access=javafx.graphics,org.cryptomator.jfuse.mac"
|
||||||
|
--java-options "--sun-misc-unsafe-memory-access=allow"
|
||||||
--java-options "-Xss5m"
|
--java-options "-Xss5m"
|
||||||
--java-options "-Xmx256m"
|
--java-options "-Xmx256m"
|
||||||
--java-options "-Dfile.encoding=\"utf-8\""
|
--java-options "-Dfile.encoding=\"utf-8\""
|
||||||
@@ -121,6 +136,7 @@ jobs:
|
|||||||
--java-options "-Dcryptomator.mountPointsDir=\"@{userhome}/Library/Application Support/Cryptomator/mnt\""
|
--java-options "-Dcryptomator.mountPointsDir=\"@{userhome}/Library/Application Support/Cryptomator/mnt\""
|
||||||
--java-options "-Dcryptomator.showTrayIcon=true"
|
--java-options "-Dcryptomator.showTrayIcon=true"
|
||||||
--java-options "-Dcryptomator.buildNumber=\"dmg-${{ needs.get-version.outputs.revNum }}\""
|
--java-options "-Dcryptomator.buildNumber=\"dmg-${{ needs.get-version.outputs.revNum }}\""
|
||||||
|
--java-options "-XX:ErrorFile=/cryptomator/cryptomator_crash.log"
|
||||||
--mac-package-identifier org.cryptomator
|
--mac-package-identifier org.cryptomator
|
||||||
--resource-dir dist/mac/resources
|
--resource-dir dist/mac/resources
|
||||||
- name: Patch Cryptomator.app
|
- name: Patch Cryptomator.app
|
||||||
@@ -224,6 +240,11 @@ jobs:
|
|||||||
Cryptomator-${VERSION_NO}-${{ matrix.output-suffix }}.dmg dmg
|
Cryptomator-${VERSION_NO}-${{ matrix.output-suffix }}.dmg dmg
|
||||||
env:
|
env:
|
||||||
VERSION_NO: ${{ needs.get-version.outputs.semVerNum }}
|
VERSION_NO: ${{ needs.get-version.outputs.semVerNum }}
|
||||||
|
- name: Codesign .dmg
|
||||||
|
run: |
|
||||||
|
codesign -s ${CODESIGN_IDENTITY} --timestamp Cryptomator-*.dmg
|
||||||
|
env:
|
||||||
|
CODESIGN_IDENTITY: ${{ secrets.MACOS_CODESIGN_IDENTITY }}
|
||||||
- name: Notarize .dmg
|
- name: Notarize .dmg
|
||||||
if: startsWith(github.ref, 'refs/tags/') || inputs.notarize
|
if: startsWith(github.ref, 'refs/tags/') || inputs.notarize
|
||||||
uses: cocoalibs/xcode-notarization-action@v1
|
uses: cocoalibs/xcode-notarization-action@v1
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ jobs:
|
|||||||
issues: write
|
issues: write
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v9
|
- uses: actions/stale@v10
|
||||||
with:
|
with:
|
||||||
days-before-stale: 14
|
days-before-stale: 14
|
||||||
days-before-close: 0
|
days-before-close: 0
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ on:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_DIST: 'temurin'
|
JAVA_DIST: 'temurin'
|
||||||
JAVA_VERSION: 23
|
JAVA_VERSION: 24
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
@@ -15,10 +15,9 @@ jobs:
|
|||||||
test:
|
test:
|
||||||
name: Compile and Test
|
name: Compile and Test
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')"
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- uses: actions/setup-java@v4
|
- uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: ${{ env.JAVA_DIST }}
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
|
|||||||
@@ -19,9 +19,9 @@ jobs:
|
|||||||
name: Validate commits pushed to release/hotfix branch to fulfill release requirements
|
name: Validate commits pushed to release/hotfix branch to fulfill release requirements
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: ${{ env.JAVA_DIST }}
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ env.JAVA_VERSION }}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ jobs:
|
|||||||
issues: write
|
issues: write
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v9
|
- uses: actions/stale@v10
|
||||||
with:
|
with:
|
||||||
days-before-stale: 365
|
days-before-stale: 365
|
||||||
days-before-close: 90
|
days-before-close: 90
|
||||||
|
|||||||
+197
-126
@@ -12,14 +12,24 @@ on:
|
|||||||
description: 'Build debug version with console output'
|
description: 'Build debug version with console output'
|
||||||
type: boolean
|
type: boolean
|
||||||
default: false
|
default: false
|
||||||
|
sign:
|
||||||
|
description: 'Sign binaries'
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
push:
|
||||||
|
branches-ignore:
|
||||||
|
- 'dependabot/**'
|
||||||
|
paths:
|
||||||
|
- '.github/workflows/win-exe.yml'
|
||||||
|
- 'dist/win/**'
|
||||||
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_DIST: 'zulu'
|
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/24.0.1/openjfx-24.0.1_windows-x64_bin-jmods.zip'
|
||||||
JAVA_VERSION: '23.0.2+7'
|
OPENJFX_JMODS_AMD64_HASH: 'f13d17c7caf88654fc835f1b4e75a9b0f34a888eb8abef381796c0002e63b03f'
|
||||||
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/23.0.1/openjfx-23.0.1_windows-x64_bin-jmods.zip'
|
WINFSP_MSI: 'https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi'
|
||||||
OPENJFX_JMODS_AMD64_HASH: 'ee176dcee3bd78bde7910735bd67f67c792882f5b89626796ae06f7a1c0119d3'
|
WINFSP_MSI_HASH: '073a70e00f77423e34bed98b86e600def93393ba5822204fac57a29324db9f7a'
|
||||||
WINFSP_MSI: 'https://github.com/winfsp/winfsp/releases/download/v2.0/winfsp-2.0.23075.msi'
|
|
||||||
WINFSP_UNINSTALLER: 'https://github.com/cryptomator/winfsp-uninstaller/releases/latest/download/winfsp-uninstaller.exe'
|
WINFSP_UNINSTALLER: 'https://github.com/cryptomator/winfsp-uninstaller/releases/latest/download/winfsp-uninstaller.exe'
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
@@ -34,33 +44,51 @@ jobs:
|
|||||||
|
|
||||||
build-msi:
|
build-msi:
|
||||||
name: Build .msi Installer
|
name: Build .msi Installer
|
||||||
runs-on: windows-latest
|
runs-on: ${{ matrix.os }}
|
||||||
needs: [get-version]
|
needs: [ get-version ]
|
||||||
env:
|
strategy:
|
||||||
LOOPBACK_ALIAS: 'cryptomator-vault'
|
matrix:
|
||||||
WIN_CONSOLE_FLAG: ''
|
include:
|
||||||
|
- arch: x64
|
||||||
|
os: windows-latest
|
||||||
|
java-dist: 'zulu'
|
||||||
|
java-version: '24.0.1+9'
|
||||||
|
java-package: 'jdk'
|
||||||
|
- arch: arm64
|
||||||
|
os: windows-11-arm
|
||||||
|
java-dist: 'liberica'
|
||||||
|
java-version: '24.0.1+11'
|
||||||
|
java-package: 'jdk+fx' #This is needed, as liberica contains JFX 24 Jmods for Windows ARM64
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: ${{ matrix.java-dist }}
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ matrix.java-version }}
|
||||||
|
java-package: ${{ matrix.java-package }}
|
||||||
check-latest: true
|
check-latest: true
|
||||||
cache: 'maven'
|
cache: 'maven'
|
||||||
|
- name: Install wix and extensions
|
||||||
|
run: |
|
||||||
|
dotnet tool install --global wix --version 6.0.0
|
||||||
|
wix.exe extension add WixToolset.UI.wixext/6.0.0 --global
|
||||||
|
wix.exe extension add WixToolset.Util.wixext/6.0.0 --global
|
||||||
- name: Download and extract JavaFX jmods from Gluon
|
- name: Download and extract JavaFX jmods from Gluon
|
||||||
|
if: matrix.arch == 'x64'
|
||||||
#In the last step we move all jmods files a dir level up because jmods are placed inside a directory in the zip
|
#In the last step we move all jmods files a dir level up because jmods are placed inside a directory in the zip
|
||||||
run: |
|
run: |
|
||||||
curl --output jfxjmods.zip -L "${{ env.OPENJFX_JMODS_AMD64 }}"
|
curl --output openjfx-jmods.zip -L "${{ env.OPENJFX_JMODS_AMD64 }}"
|
||||||
if(!(Get-FileHash -Path jfxjmods.zip -Algorithm SHA256).Hash.ToLower().equals("${{ env.OPENJFX_JMODS_AMD64_HASH }}")) {
|
if(!(Get-FileHash -Path openjfx-jmods.zip -Algorithm SHA256).Hash.ToLower().equals("${{ env.OPENJFX_JMODS_AMD64_HASH }}")) {
|
||||||
throw "Wrong checksum of JMOD archive downloaded from ${{ env.OPENJFX_JMODS_AMD64 }}.";
|
throw "Wrong checksum of JMOD archive downloaded from ${{ env.OPENJFX_JMODS_AMD64 }}.";
|
||||||
}
|
}
|
||||||
Expand-Archive -Path jfxjmods.zip -DestinationPath jfxjmods
|
Expand-Archive -Path openjfx-jmods.zip -DestinationPath openjfx-jmods
|
||||||
Get-ChildItem -Path jfxjmods -Recurse -Filter "*.jmod" | ForEach-Object { Move-Item -Path $_ -Destination $_.Directory.Parent}
|
Get-ChildItem -Path openjfx-jmods -Recurse -Filter "*.jmod" | ForEach-Object { Move-Item -Path $_ -Destination $_.Directory.Parent}
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
- name: Ensure major jfx version in pom and in jmods is the same
|
- name: Ensure major jfx version in pom and in jmods is the same
|
||||||
|
if: matrix.arch == 'x64'
|
||||||
run: |
|
run: |
|
||||||
JMOD_VERSION_AMD64=$(jmod describe jfxjmods/javafx.base.jmod | head -1)
|
JMOD_VERSION_AMD64=$(jmod describe openjfx-jmods/javafx.base.jmod | head -1)
|
||||||
JMOD_VERSION_AMD64=${JMOD_VERSION_AMD64#*@}
|
JMOD_VERSION_AMD64=${JMOD_VERSION_AMD64#*@}
|
||||||
JMOD_VERSION_AMD64=${JMOD_VERSION_AMD64%%.*}
|
JMOD_VERSION_AMD64=${JMOD_VERSION_AMD64%%.*}
|
||||||
POM_JFX_VERSION=$(mvn help:evaluate "-Dexpression=javafx.version" -q -DforceStdout)
|
POM_JFX_VERSION=$(mvn help:evaluate "-Dexpression=javafx.version" -q -DforceStdout)
|
||||||
@@ -72,29 +100,34 @@ jobs:
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
- name: Set version
|
- name: Set version
|
||||||
run : mvn versions:set -DnewVersion=${{ needs.get-version.outputs.semVerStr }}
|
run: mvn versions:set -DnewVersion=${{ needs.get-version.outputs.semVerStr }}
|
||||||
- name: Run maven
|
- name: Run maven
|
||||||
run: mvn -B clean package -Pwin -DskipTests -Djavafx.platform=win
|
run: mvn -B clean package -Pwin -DskipTests -Djavafx.platform=win
|
||||||
- name: Patch target dir
|
- name: Patch target dir
|
||||||
run: |
|
run: |
|
||||||
cp LICENSE.txt target
|
cp LICENSE.txt target
|
||||||
cp target/cryptomator-*.jar target/mods
|
cp target/cryptomator-*.jar target/mods
|
||||||
|
- name: Run jlink with help option
|
||||||
|
id: jep-493-check
|
||||||
|
run: |
|
||||||
|
JMOD_PATHS="openjfx-jmods"
|
||||||
|
if ! $(${JAVA_HOME}/bin/jlink --help | grep -q "Linking from run-time image enabled"); then
|
||||||
|
JMOD_PATHS="${JAVA_HOME}/jmods;${JMOD_PATHS}"
|
||||||
|
fi
|
||||||
|
echo "jmod_paths=${JMOD_PATHS}" >> "$GITHUB_OUTPUT"
|
||||||
- name: Run jlink
|
- name: Run jlink
|
||||||
#Remark: no compression is applied for improved build compression later (here msi)
|
# Remark: no compression is applied for improved build compression later (here msi)
|
||||||
run: >
|
run: >
|
||||||
${JAVA_HOME}/bin/jlink
|
${JAVA_HOME}/bin/jlink
|
||||||
--verbose
|
--verbose
|
||||||
--output runtime
|
--output runtime
|
||||||
--module-path "jfxjmods;${JAVA_HOME}/jmods"
|
--module-path "${{ steps.jep-493-check.outputs.jmod_paths }}"
|
||||||
--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.mscapi,jdk.unsupported,jdk.accessibility,jdk.management.jfr,java.compiler
|
--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.mscapi,jdk.unsupported,jdk.accessibility,jdk.management.jfr,java.compiler
|
||||||
--strip-native-commands
|
--strip-native-commands
|
||||||
--no-header-files
|
--no-header-files
|
||||||
--no-man-pages
|
--no-man-pages
|
||||||
--strip-debug
|
--strip-debug
|
||||||
--compress zip-0
|
--compress zip-0
|
||||||
- name: Change win-console flag if debug is active
|
|
||||||
if: ${{ inputs.isDebug }}
|
|
||||||
run: echo "WIN_CONSOLE_FLAG=--win-console" >> $GITHUB_ENV
|
|
||||||
- name: Run jpackage
|
- name: Run jpackage
|
||||||
run: >
|
run: >
|
||||||
${JAVA_HOME}/bin/jpackage
|
${JAVA_HOME}/bin/jpackage
|
||||||
@@ -110,7 +143,8 @@ jobs:
|
|||||||
--copyright "(C) 2016 - 2025 Skymatic GmbH"
|
--copyright "(C) 2016 - 2025 Skymatic GmbH"
|
||||||
--app-version "${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum }}"
|
--app-version "${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum }}"
|
||||||
--java-options "--enable-preview"
|
--java-options "--enable-preview"
|
||||||
--java-options "--enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win"
|
--java-options "--enable-native-access=javafx.graphics,org.cryptomator.jfuse.win,org.cryptomator.integrations.win"
|
||||||
|
--java-options "--sun-misc-unsafe-memory-access=allow"
|
||||||
--java-options "-Xss5m"
|
--java-options "-Xss5m"
|
||||||
--java-options "-Xmx256m"
|
--java-options "-Xmx256m"
|
||||||
--java-options "-Dcryptomator.appVersion=\"${{ needs.get-version.outputs.semVerStr }}\""
|
--java-options "-Dcryptomator.appVersion=\"${{ needs.get-version.outputs.semVerStr }}\""
|
||||||
@@ -122,30 +156,24 @@ jobs:
|
|||||||
--java-options "-Dcryptomator.p12Path=\"@{appdata}/Cryptomator/key.p12;@{userhome}/AppData/Roaming/Cryptomator/key.p12\""
|
--java-options "-Dcryptomator.p12Path=\"@{appdata}/Cryptomator/key.p12;@{userhome}/AppData/Roaming/Cryptomator/key.p12\""
|
||||||
--java-options "-Dcryptomator.ipcSocketPath=\"@{localappdata}/Cryptomator/ipc.socket\""
|
--java-options "-Dcryptomator.ipcSocketPath=\"@{localappdata}/Cryptomator/ipc.socket\""
|
||||||
--java-options "-Dcryptomator.mountPointsDir=\"@{userhome}/Cryptomator\""
|
--java-options "-Dcryptomator.mountPointsDir=\"@{userhome}/Cryptomator\""
|
||||||
--java-options "-Dcryptomator.loopbackAlias=\"${{ env.LOOPBACK_ALIAS }}\""
|
--java-options "-Dcryptomator.loopbackAlias=\"cryptomator-vault\""
|
||||||
--java-options "-Dcryptomator.showTrayIcon=true"
|
--java-options "-Dcryptomator.showTrayIcon=true"
|
||||||
--java-options "-Dcryptomator.buildNumber=\"msi-${{ needs.get-version.outputs.revNum }}\""
|
--java-options "-Dcryptomator.buildNumber=\"msi-${{ needs.get-version.outputs.revNum }}\""
|
||||||
--java-options "-Dcryptomator.integrationsWin.autoStartShellLinkName=\"Cryptomator\""
|
--java-options "-Dcryptomator.integrationsWin.autoStartShellLinkName=\"Cryptomator\""
|
||||||
--java-options "-Dcryptomator.integrationsWin.keychainPaths=\"@{appdata}/Cryptomator/keychain.json;@{userhome}/AppData/Roaming/Cryptomator/keychain.json\""
|
--java-options "-Dcryptomator.integrationsWin.keychainPaths=\"@{appdata}/Cryptomator/keychain.json;@{userhome}/AppData/Roaming/Cryptomator/keychain.json\""
|
||||||
--java-options "-Djavafx.verbose=${{ inputs.isDebug }}"
|
--java-options "-Dcryptomator.integrationsWin.windowsHelloKeychainPaths=\"@{appdata}/Cryptomator/windowsHelloKeychain.json\""
|
||||||
|
--java-options "-Dcryptomator.disableUpdateCheck=false"
|
||||||
|
--java-options "-XX:ErrorFile=C:/cryptomator/cryptomator_crash.log"
|
||||||
--resource-dir dist/win/resources
|
--resource-dir dist/win/resources
|
||||||
--icon dist/win/resources/Cryptomator.ico
|
--icon dist/win/resources/Cryptomator.ico
|
||||||
${WIN_CONSOLE_FLAG}
|
--add-launcher "Cryptomator (Debug)=dist/win/debug-launcher.properties"
|
||||||
- name: Patch Application Directory
|
- name: Patch Application Directory
|
||||||
run: |
|
run: |
|
||||||
cp dist/win/contrib/* appdir/Cryptomator
|
cp dist/win/contrib/* appdir/Cryptomator
|
||||||
- name: Set LOOPBACK_ALIAS in patchWebDAV.bat
|
|
||||||
shell: pwsh
|
|
||||||
run: |
|
|
||||||
$patchScript = "appdir\Cryptomator\patchWebDAV.bat"
|
|
||||||
try {
|
|
||||||
(Get-Content $patchScript ) -replace '::REPLACE ME', "SET LOOPBACK_ALIAS=`"${{ env.LOOPBACK_ALIAS}}`"" | Set-Content $patchScript
|
|
||||||
} catch {
|
|
||||||
Write-Host "Failed to set LOOPBACK_ALIAS for patchWebDAV.bat"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
- name: Fix permissions
|
- name: Fix permissions
|
||||||
run: attrib -r appdir/Cryptomator/Cryptomator.exe
|
run: |
|
||||||
|
attrib -r appdir/Cryptomator/Cryptomator.exe
|
||||||
|
attrib -r "appdir/Cryptomator/Cryptomator (Debug).exe"
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
- name: Extract jars with DLLs for Codesigning
|
- name: Extract jars with DLLs for Codesigning
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
@@ -170,16 +198,17 @@ jobs:
|
|||||||
New-Item -Path appdir/jpackage-jmod -ItemType Directory
|
New-Item -Path appdir/jpackage-jmod -ItemType Directory
|
||||||
& $env:JAVA_HOME\bin\jmod.exe extract --dir jpackage-jmod "${env:JAVA_HOME}\jmods\jdk.jpackage.jmod"
|
& $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"
|
Get-ChildItem -Recurse -Path "jpackage-jmod" -File wixhelper.dll | Select-Object -Last 1 | Copy-Item -Destination "appdir"
|
||||||
- name: Codesign
|
- name: Sign DLLs with Actalis CodeSigner
|
||||||
uses: skymatic/code-sign-action@v3
|
if: inputs.sign || github.event_name == 'release'
|
||||||
|
uses: skymatic/workflows/.github/actions/win-sign-action@450e322ff2214d0be0b079b63343c894f3ef735f
|
||||||
with:
|
with:
|
||||||
certificate: ${{ secrets.WIN_CODESIGN_P12_BASE64 }}
|
base-dir: 'appdir'
|
||||||
password: ${{ secrets.WIN_CODESIGN_P12_PW }}
|
file-extensions: 'dll,exe,ps1'
|
||||||
certificatesha1: 5FC94CE149E5B511E621F53A060AC67CBD446B3A
|
|
||||||
description: Cryptomator
|
|
||||||
timestampUrl: 'http://timestamp.digicert.com'
|
|
||||||
folder: appdir
|
|
||||||
recursive: true
|
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
|
- name: Replace DLLs inside jars with signed ones
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
@@ -228,17 +257,18 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
JP_WIXWIZARD_RESOURCES: ${{ github.workspace }}/dist/win/resources # requires abs path, used in resources/main.wxs
|
JP_WIXWIZARD_RESOURCES: ${{ github.workspace }}/dist/win/resources # requires abs path, used in resources/main.wxs
|
||||||
JP_WIXHELPER_DIR: ${{ github.workspace }}\appdir
|
JP_WIXHELPER_DIR: ${{ github.workspace }}\appdir
|
||||||
- name: Codesign MSI
|
- name: Sign msi with Actalis CodeSigner
|
||||||
uses: skymatic/code-sign-action@v3
|
if: inputs.sign || github.event_name == 'release'
|
||||||
|
uses: skymatic/workflows/.github/actions/win-sign-action@450e322ff2214d0be0b079b63343c894f3ef735f
|
||||||
with:
|
with:
|
||||||
certificate: ${{ secrets.WIN_CODESIGN_P12_BASE64 }}
|
base-dir: 'installer'
|
||||||
password: ${{ secrets.WIN_CODESIGN_P12_PW }}
|
file-extensions: 'msi'
|
||||||
certificatesha1: 5FC94CE149E5B511E621F53A060AC67CBD446B3A
|
sign-description: 'Cryptomator Installer'
|
||||||
description: Cryptomator Installer
|
sign-url: 'https://cryptomator.org'
|
||||||
timestampUrl: 'http://timestamp.digicert.com'
|
username: ${{ secrets.WIN_CODESIGN_USERNAME }}
|
||||||
folder: installer
|
password: ${{ secrets.WIN_CODESIGN_PW }}
|
||||||
- name: Add possible alpha/beta tags to installer name
|
- name: Add possible alpha/beta tags and architecture to installer name
|
||||||
run: mv installer/Cryptomator-*.msi Cryptomator-${{ needs.get-version.outputs.semVerStr }}-x64.msi
|
run: mv installer/Cryptomator-*.msi Cryptomator-${{ needs.get-version.outputs.semVerStr }}-${{ matrix.arch }}.msi
|
||||||
- name: Create detached GPG signature with key 615D449FE6E6A235
|
- name: Create detached GPG signature with key 615D449FE6E6A235
|
||||||
run: |
|
run: |
|
||||||
echo "${GPG_PRIVATE_KEY}" | gpg --batch --quiet --import
|
echo "${GPG_PRIVATE_KEY}" | gpg --batch --quiet --import
|
||||||
@@ -249,7 +279,7 @@ jobs:
|
|||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: msi
|
name: msi-${{ matrix.arch }}
|
||||||
path: |
|
path: |
|
||||||
Cryptomator-*.msi
|
Cryptomator-*.msi
|
||||||
Cryptomator-*.asc
|
Cryptomator-*.asc
|
||||||
@@ -257,21 +287,43 @@ jobs:
|
|||||||
|
|
||||||
build-exe:
|
build-exe:
|
||||||
name: Build .exe installer
|
name: Build .exe installer
|
||||||
runs-on: windows-latest
|
runs-on: ${{ matrix.os }}
|
||||||
needs: [get-version, build-msi]
|
needs: [ get-version, build-msi ]
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- arch: x64
|
||||||
|
os: windows-latest
|
||||||
|
executable-suffix: x64
|
||||||
|
java-dist: 'zulu'
|
||||||
|
java-version: '24.0.1+9'
|
||||||
|
java-package: 'jdk'
|
||||||
|
- arch: arm64
|
||||||
|
os: windows-11-arm
|
||||||
|
executable-suffix: arm64
|
||||||
|
java-dist: 'liberica'
|
||||||
|
java-version: '24.0.1+11'
|
||||||
|
java-package: 'jdk+fx' #This is needed, as liberica contains JFX 24 Jmods for Windows ARM64
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v5
|
||||||
|
- name: Install wix and extensions
|
||||||
|
run: |
|
||||||
|
dotnet tool install --global wix --version 6.0.0
|
||||||
|
wix.exe extension add WixToolset.BootstrapperApplications.wixext/6.0.0 --global
|
||||||
|
wix.exe extension add WixToolset.Util.wixext/6.0.0 --global
|
||||||
- name: Download .msi
|
- name: Download .msi
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: msi
|
name: msi-${{ matrix.arch }}
|
||||||
path: dist/win/bundle/resources
|
path: dist/win/bundle/resources
|
||||||
- name: Strip version info from msi file name
|
- name: Strip version info from msi file name
|
||||||
run: mv dist/win/bundle/resources/Cryptomator*.msi dist/win/bundle/resources/Cryptomator.msi
|
run: mv dist/win/bundle/resources/Cryptomator*.msi dist/win/bundle/resources/Cryptomator.msi
|
||||||
- uses: actions/setup-java@v4
|
- name: Setup Java
|
||||||
|
uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
distribution: ${{ env.JAVA_DIST }}
|
distribution: ${{ matrix.java-dist }}
|
||||||
java-version: ${{ env.JAVA_VERSION }}
|
java-version: ${{ matrix.java-version }}
|
||||||
|
java-package: ${{ matrix.java-package }}
|
||||||
check-latest: true
|
check-latest: true
|
||||||
cache: 'maven'
|
cache: 'maven'
|
||||||
- name: Generate license for exe
|
- name: Generate license for exe
|
||||||
@@ -287,60 +339,61 @@ jobs:
|
|||||||
shell: pwsh
|
shell: pwsh
|
||||||
- name: Download WinFsp
|
- name: Download WinFsp
|
||||||
run: |
|
run: |
|
||||||
curl --output dist/win/bundle/resources/winfsp.msi -L ${{ env.WINFSP_MSI }}
|
curl --output $env:WINFSP_PATH -L ${{ env.WINFSP_MSI }}
|
||||||
|
$computedHash = (Get-FileHash -Path $env:WINFSP_PATH -Algorithm SHA256).Hash.ToLower()
|
||||||
|
if ($computedHash -ne "${{ env.WINFSP_MSI_HASH }}") {
|
||||||
|
throw "Checksum mismatch for $env:WINFSP_PATH (expected ${{ env.WINFSP_MSI_HASH }}, got $computedHash)."
|
||||||
|
}
|
||||||
|
env:
|
||||||
|
WINFSP_PATH: 'dist/win/bundle/resources/winfsp.msi'
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
- name: Download Legacy-WinFsp uninstaller
|
- name: Download Legacy-WinFsp uninstaller
|
||||||
run: |
|
run: |
|
||||||
curl --output dist/win/bundle/resources/winfsp-uninstaller.exe -L ${{ env.WINFSP_UNINSTALLER }}
|
curl --output dist/win/bundle/resources/winfsp-uninstaller.exe -L ${{ env.WINFSP_UNINSTALLER }}
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
- name: Compile to wixObj file
|
- name: Create Wix Burn bundle
|
||||||
|
working-directory: dist/win
|
||||||
run: >
|
run: >
|
||||||
"${WIX}/bin/candle.exe" dist/win/bundle/bundleWithWinfsp.wxs
|
wix build
|
||||||
-ext WixBalExtension
|
-define BundleName="Cryptomator"
|
||||||
-ext WixUtilExtension
|
-define BundleVersion="${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum}}"
|
||||||
-out dist/win/bundle/
|
-define BundleVendor="Skymatic GmbH"
|
||||||
-dBundleVersion="${{ needs.get-version.outputs.semVerNum }}.${{ needs.get-version.outputs.revNum }}"
|
-define BundleCopyright="(C) 2016 - 2025 Skymatic GmbH"
|
||||||
-dBundleVendor="Skymatic GmbH"
|
-define AboutUrl="https://cryptomator.org"
|
||||||
-dBundleCopyright="(C) 2016 - 2025 Skymatic GmbH"
|
-define HelpUrl="https://cryptomator.org/contact"
|
||||||
-dAboutUrl="https://cryptomator.org"
|
-define UpdateUrl="https://cryptomator.org/downloads/"
|
||||||
-dHelpUrl="https://cryptomator.org/contact"
|
-ext "WixToolset.Util.wixext"
|
||||||
-dUpdateUrl="https://cryptomator.org/downloads/"
|
-ext "WixToolset.BootstrapperApplications.wixext"
|
||||||
- name: Create executable with linker
|
./bundle/bundleWithWinfsp.wxs
|
||||||
run: >
|
-out "../../installer/unsigned/Cryptomator-Installer.exe"
|
||||||
"${WIX}/bin/light.exe" -b dist/win/ dist/win/bundle/bundleWithWinfsp.wixobj
|
|
||||||
-ext WixBalExtension
|
|
||||||
-ext WixUtilExtension
|
|
||||||
-out installer/unsigned/Cryptomator-Installer.exe
|
|
||||||
- name: Detach burn engine in preparation to sign
|
- name: Detach burn engine in preparation to sign
|
||||||
run: >
|
run: >
|
||||||
"${WIX}/bin/insignia.exe"
|
wix burn detach installer/unsigned/Cryptomator-Installer.exe -engine tmp/engine.exe
|
||||||
-ib installer/unsigned/Cryptomator-Installer.exe
|
- name: Sign burn engine with Actalis CodeSigner
|
||||||
-o tmp/engine.exe
|
if: inputs.sign || github.event_name == 'release'
|
||||||
- name: Codesign burn engine
|
uses: skymatic/workflows/.github/actions/win-sign-action@450e322ff2214d0be0b079b63343c894f3ef735f
|
||||||
uses: skymatic/code-sign-action@v3
|
|
||||||
with:
|
with:
|
||||||
certificate: ${{ secrets.WIN_CODESIGN_P12_BASE64 }}
|
base-dir: 'tmp'
|
||||||
password: ${{ secrets.WIN_CODESIGN_P12_PW }}
|
file-extensions: 'exe'
|
||||||
certificatesha1: 5FC94CE149E5B511E621F53A060AC67CBD446B3A
|
sign-description: 'Cryptomator Bundle Installer'
|
||||||
description: Cryptomator Installer
|
sign-url: 'https://cryptomator.org'
|
||||||
timestampUrl: 'http://timestamp.digicert.com'
|
username: ${{ secrets.WIN_CODESIGN_USERNAME }}
|
||||||
folder: tmp
|
password: ${{ secrets.WIN_CODESIGN_PW }}
|
||||||
- name: Reattach signed burn engine to installer
|
- name: Reattach signed burn engine to installer
|
||||||
run : >
|
run: >
|
||||||
"${WIX}/bin/insignia.exe"
|
wix burn reattach installer/unsigned/Cryptomator-Installer.exe -engine tmp/engine.exe -o installer/Cryptomator-Installer.exe
|
||||||
-ab tmp/engine.exe installer/unsigned/Cryptomator-Installer.exe
|
- name: Sign installer with Actalis CodeSigner
|
||||||
-o installer/Cryptomator-Installer.exe
|
if: inputs.sign || github.event_name == 'release'
|
||||||
- name: Codesign EXE
|
uses: skymatic/workflows/.github/actions/win-sign-action@450e322ff2214d0be0b079b63343c894f3ef735f
|
||||||
uses: skymatic/code-sign-action@v3
|
|
||||||
with:
|
with:
|
||||||
certificate: ${{ secrets.WIN_CODESIGN_P12_BASE64 }}
|
base-dir: 'installer'
|
||||||
password: ${{ secrets.WIN_CODESIGN_P12_PW }}
|
file-extensions: 'exe'
|
||||||
certificatesha1: 5FC94CE149E5B511E621F53A060AC67CBD446B3A
|
sign-description: 'Cryptomator Bundle Installer'
|
||||||
description: Cryptomator Installer
|
sign-url: 'https://cryptomator.org'
|
||||||
timestampUrl: 'http://timestamp.digicert.com'
|
username: ${{ secrets.WIN_CODESIGN_USERNAME }}
|
||||||
folder: installer
|
password: ${{ secrets.WIN_CODESIGN_PW }}
|
||||||
- name: Add possible alpha/beta tags to installer name
|
- name: Add possible alpha/beta tags to installer name
|
||||||
run: mv installer/Cryptomator-Installer.exe Cryptomator-${{ needs.get-version.outputs.semVerStr }}-x64.exe
|
run: mv installer/Cryptomator-Installer.exe Cryptomator-${{ needs.get-version.outputs.semVerStr }}-${{ matrix.executable-suffix }}.exe
|
||||||
- name: Create detached GPG signature with key 615D449FE6E6A235
|
- name: Create detached GPG signature with key 615D449FE6E6A235
|
||||||
run: |
|
run: |
|
||||||
echo "${GPG_PRIVATE_KEY}" | gpg --batch --quiet --import
|
echo "${GPG_PRIVATE_KEY}" | gpg --batch --quiet --import
|
||||||
@@ -351,7 +404,7 @@ jobs:
|
|||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: exe
|
name: exe-${{ matrix.executable-suffix }}
|
||||||
path: |
|
path: |
|
||||||
Cryptomator-*.exe
|
Cryptomator-*.exe
|
||||||
Cryptomator-*.asc
|
Cryptomator-*.asc
|
||||||
@@ -361,16 +414,18 @@ jobs:
|
|||||||
name: Publish installers to the github release
|
name: Publish installers to the github release
|
||||||
if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published'
|
if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [build-msi, build-exe]
|
needs: [ build-msi, build-exe ]
|
||||||
outputs:
|
outputs:
|
||||||
download-url-msi: ${{ fromJSON(steps.publish.outputs.assets)[0].browser_download_url }}
|
download-url-msi-x64: ${{ fromJSON(steps.publish.outputs.assets)[0].browser_download_url }}
|
||||||
download-url-exe: ${{ fromJSON(steps.publish.outputs.assets)[1].browser_download_url }}
|
download-url-msi-arm64: ${{ fromJSON(steps.publish.outputs.assets)[1].browser_download_url }}
|
||||||
|
download-url-exe-x64: ${{ fromJSON(steps.publish.outputs.assets)[2].browser_download_url }}
|
||||||
|
download-url-exe-arm64: ${{ fromJSON(steps.publish.outputs.assets)[3].browser_download_url }}
|
||||||
steps:
|
steps:
|
||||||
- name: Download installers
|
- name: Download installers
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v5
|
||||||
with:
|
with:
|
||||||
merge-multiple: true
|
merge-multiple: true
|
||||||
- name: Publish .msi on GitHub Releases
|
- name: Publish installers on GitHub Releases
|
||||||
id: publish
|
id: publish
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
@@ -378,22 +433,38 @@ jobs:
|
|||||||
token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }}
|
token: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }}
|
||||||
# do not change ordering of filelist, required for correct job output
|
# do not change ordering of filelist, required for correct job output
|
||||||
files: |
|
files: |
|
||||||
*.msi
|
*x64.msi
|
||||||
*.exe
|
*arm64.msi
|
||||||
|
*x64.exe
|
||||||
|
*arm64.exe
|
||||||
*.asc
|
*.asc
|
||||||
|
|
||||||
allowlist-msi:
|
allowlist-msi-x64:
|
||||||
uses: ./.github/workflows/av-whitelist.yml
|
uses: ./.github/workflows/av-whitelist.yml
|
||||||
needs: [publish]
|
needs: [ publish ]
|
||||||
with:
|
with:
|
||||||
url: ${{ needs.publish.outputs.download-url-msi }}
|
url: ${{ needs.publish.outputs.download-url-msi-x64 }}
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
allowlist-exe:
|
allowlist-msi-arm64:
|
||||||
uses: ./.github/workflows/av-whitelist.yml
|
uses: ./.github/workflows/av-whitelist.yml
|
||||||
needs: [publish, allowlist-msi]
|
needs: [ publish ]
|
||||||
with:
|
with:
|
||||||
url: ${{ needs.publish.outputs.download-url-exe }}
|
url: ${{ needs.publish.outputs.download-url-msi-arm64 }}
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
allowlist-exe-x64:
|
||||||
|
uses: ./.github/workflows/av-whitelist.yml
|
||||||
|
needs: [ publish, allowlist-msi-x64 ]
|
||||||
|
with:
|
||||||
|
url: ${{ needs.publish.outputs.download-url-exe-x64 }}
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
allowlist-exe-arm64:
|
||||||
|
uses: ./.github/workflows/av-whitelist.yml
|
||||||
|
needs: [ publish, allowlist-msi-arm64 ]
|
||||||
|
with:
|
||||||
|
url: ${{ needs.publish.outputs.download-url-exe-arm64 }}
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
notify-winget:
|
notify-winget:
|
||||||
@@ -410,7 +481,7 @@ jobs:
|
|||||||
SLACK_ICON: false
|
SLACK_ICON: false
|
||||||
SLACK_ICON_EMOJI: ':bot:'
|
SLACK_ICON_EMOJI: ':bot:'
|
||||||
SLACK_CHANNEL: 'cryptomator-desktop'
|
SLACK_CHANNEL: 'cryptomator-desktop'
|
||||||
SLACK_TITLE: "MSI of ${{ github.event.repository.name }} ${{ github.event.release.tag_name }} published."
|
SLACK_TITLE: "MSI packages of ${{ github.event.repository.name }} ${{ github.event.release.tag_name }} published."
|
||||||
SLACK_MESSAGE: "Ready to <https://github.com/${{ github.repository }}/actions/workflows/winget.yml| release to winget>."
|
SLACK_MESSAGE: "Ready to <https://github.com/${{ github.repository }}/actions/workflows/winget.yml| release them to winget>."
|
||||||
SLACK_FOOTER: false
|
SLACK_FOOTER: false
|
||||||
MSG_MINIMAL: true
|
MSG_MINIMAL: true
|
||||||
|
|||||||
@@ -16,12 +16,12 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
gh repo sync cryptomator/winget-pkgs -b master --force
|
gh repo sync cryptomator/winget-pkgs -b master --force
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.CRYPTOBOT_WINGET_TOKEN }}
|
GH_TOKEN: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||||
- name: Submit package
|
- name: Submit package
|
||||||
uses: vedantmgoyal2009/winget-releaser@main
|
uses: vedantmgoyal2009/winget-releaser@main
|
||||||
with:
|
with:
|
||||||
identifier: Cryptomator.Cryptomator
|
identifier: Cryptomator.Cryptomator
|
||||||
version: ${{ inputs.tag }}
|
version: ${{ inputs.tag }}
|
||||||
release-tag: ${{ inputs.tag }}
|
release-tag: ${{ inputs.tag }}
|
||||||
installers-regex: '\.msi$'
|
installers-regex: '-x64\.msi$'
|
||||||
token: ${{ secrets.CRYPTOBOT_WINGET_TOKEN }}
|
token: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
|
||||||
Generated
+1
-1
@@ -8,7 +8,7 @@
|
|||||||
</list>
|
</list>
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_23" project-jdk-name="23" project-jdk-type="JavaSDK">
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_24" project-jdk-name="24" project-jdk-type="JavaSDK">
|
||||||
<output url="file://$PROJECT_DIR$/out" />
|
<output url="file://$PROJECT_DIR$/out" />
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
<configuration default="false" name="Cryptomator Linux" type="Application" factoryName="Application">
|
<configuration default="false" name="Cryptomator Linux" type="Application" factoryName="Application">
|
||||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||||
<module name="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" />
|
<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" />
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
<configuration default="false" name="Cryptomator Linux Dev" type="Application" factoryName="Application">
|
<configuration default="false" name="Cryptomator Linux Dev" type="Application" factoryName="Application">
|
||||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||||
<module name="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" />
|
<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" />
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
<configuration default="false" name="Cryptomator Windows" type="Application" factoryName="Application">
|
<configuration default="false" name="Cryptomator Windows" type="Application" factoryName="Application">
|
||||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||||
<module name="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.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" />
|
<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" />
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
<configuration default="false" name="Cryptomator Windows Dev" type="Application" factoryName="Application">
|
<configuration default="false" name="Cryptomator Windows Dev" type="Application" factoryName="Application">
|
||||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||||
<module name="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.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" />
|
<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" />
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
</envs>
|
</envs>
|
||||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||||
<module name="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 -Xss2m -Xmx512m -ea --enable-preview --enable-native-access=org.cryptomator.jfuse.mac" />
|
<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 -Xss2m -Xmx512m -ea --enable-preview --enable-native-access=org.cryptomator.jfuse.mac,javafx.graphics" />
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
</envs>
|
</envs>
|
||||||
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
<option name="MAIN_CLASS_NAME" value="org.cryptomator.launcher.Cryptomator" />
|
||||||
<module name="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" />
|
<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" />
|
||||||
<method v="2">
|
<method v="2">
|
||||||
<option name="Make" enabled="true" />
|
<option name="Make" enabled="true" />
|
||||||
</method>
|
</method>
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ For more information on the security details visit [cryptomator.org](https://doc
|
|||||||
|
|
||||||
### Dependencies
|
### Dependencies
|
||||||
|
|
||||||
* JDK 23 (e.g. temurin, zulu)
|
* JDK 24 (e.g. temurin, zulu)
|
||||||
* Maven 3
|
* Maven 3
|
||||||
|
|
||||||
### Run Maven
|
### Run Maven
|
||||||
|
|||||||
Vendored
+15
-8
@@ -12,7 +12,7 @@ command -v unzip >/dev/null 2>&1 || { echo >&2 "unzip not found."; exit 1; }
|
|||||||
|
|
||||||
VERSION=$(mvn -f ../../../pom.xml help:evaluate -Dexpression=project.version -q -DforceStdout)
|
VERSION=$(mvn -f ../../../pom.xml help:evaluate -Dexpression=project.version -q -DforceStdout)
|
||||||
SEMVER_STR=${VERSION}
|
SEMVER_STR=${VERSION}
|
||||||
CPU_ARCH=$(uname -p)
|
CPU_ARCH=$(uname -m)
|
||||||
|
|
||||||
if [[ ! "${CPU_ARCH}" =~ x86_64|aarch64 ]]; then echo "Platform ${CPU_ARCH} not supported"; exit 1; fi
|
if [[ ! "${CPU_ARCH}" =~ x86_64|aarch64 ]]; then echo "Platform ${CPU_ARCH} not supported"; exit 1; fi
|
||||||
|
|
||||||
@@ -23,12 +23,12 @@ mvn -B -f ../../../pom.xml clean package -Plinux -DskipTests -Djavafx.platform=l
|
|||||||
cp ../../../LICENSE.txt ../../../target
|
cp ../../../LICENSE.txt ../../../target
|
||||||
cp ../../../target/cryptomator-*.jar ../../../target/mods
|
cp ../../../target/cryptomator-*.jar ../../../target/mods
|
||||||
|
|
||||||
JAVAFX_VERSION=23.0.2
|
JAVAFX_VERSION=24.0.1
|
||||||
JAVAFX_ARCH="x64"
|
JAVAFX_ARCH="x64"
|
||||||
JAVAFX_JMODS_SHA256='063baebc6922e4a89c94b9dfb7a4f53e59e8d6fec400d4e670b31bc2ab324dec'
|
JAVAFX_JMODS_SHA256='425fac742b9fbd095b2ce868cff82d1024620f747c94a7144d0a4879e756146c'
|
||||||
if [ "${CPU_ARCH}" = "aarch64" ]; then
|
if [ "${CPU_ARCH}" = "aarch64" ]; then
|
||||||
JAVAFX_ARCH="aarch64"
|
JAVAFX_ARCH="aarch64"
|
||||||
JAVAFX_JMODS_SHA256='9bbedaeae1590b69e2b22237bda310936df33e344dbc243bea2e86acaab3a0d8'
|
JAVAFX_JMODS_SHA256='7e02edd0f4ee5527a27c94b0bbba66fcaaff41009119e45d0eca0f96ddfb6e7b'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# download javaFX jmods
|
# download javaFX jmods
|
||||||
@@ -51,11 +51,17 @@ if [ $POM_JFX_VERSION -ne $JMOD_VERSION ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# add runtime
|
# create runtime
|
||||||
|
## check for JEP 493
|
||||||
|
JMOD_PATHS="openjfx-jmods"
|
||||||
|
if ! ${JAVA_HOME}/bin/jlink --help | grep -q "Linking from run-time image enabled"; then
|
||||||
|
JMOD_PATHS="${JAVA_HOME}/jmods:${JMOD_PATHS}"
|
||||||
|
fi
|
||||||
|
## create runtime image
|
||||||
${JAVA_HOME}/bin/jlink \
|
${JAVA_HOME}/bin/jlink \
|
||||||
--verbose \
|
--verbose \
|
||||||
--output runtime \
|
--output runtime \
|
||||||
--module-path "${JAVA_HOME}/jmods:openjfx-jmods" \
|
--module-path "${JMOD_PATHS}" \
|
||||||
--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.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net,java.compiler \
|
--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.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr,jdk.net,java.compiler \
|
||||||
--strip-native-commands \
|
--strip-native-commands \
|
||||||
--no-header-files \
|
--no-header-files \
|
||||||
@@ -75,7 +81,7 @@ ${JAVA_HOME}/bin/jpackage \
|
|||||||
--name Cryptomator \
|
--name Cryptomator \
|
||||||
--vendor "Skymatic GmbH" \
|
--vendor "Skymatic GmbH" \
|
||||||
--java-options "--enable-preview" \
|
--java-options "--enable-preview" \
|
||||||
--java-options "--enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator" \
|
--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 - 2025 Skymatic GmbH" \
|
||||||
--java-options "-Xss5m" \
|
--java-options "-Xss5m" \
|
||||||
--java-options "-Xmx256m" \
|
--java-options "-Xmx256m" \
|
||||||
@@ -92,6 +98,7 @@ ${JAVA_HOME}/bin/jpackage \
|
|||||||
--java-options "-Dcryptomator.integrationsLinux.trayIconsDir=\"@{appdir}/usr/share/icons/hicolor/symbolic/apps\"" \
|
--java-options "-Dcryptomator.integrationsLinux.trayIconsDir=\"@{appdir}/usr/share/icons/hicolor/symbolic/apps\"" \
|
||||||
--java-options "-Dcryptomator.buildNumber=\"appimage-${REVISION_NO}\"" \
|
--java-options "-Dcryptomator.buildNumber=\"appimage-${REVISION_NO}\"" \
|
||||||
--java-options "-Dcryptomator.networking.truststore.p12Path=\"/etc/cryptomator/certs.p12\"" \
|
--java-options "-Dcryptomator.networking.truststore.p12Path=\"/etc/cryptomator/certs.p12\"" \
|
||||||
|
--java-options "-XX:ErrorFile=/cryptomator/cryptomator_crash.log" \
|
||||||
--resource-dir ../resources
|
--resource-dir ../resources
|
||||||
|
|
||||||
# transform AppDir
|
# transform AppDir
|
||||||
@@ -122,7 +129,7 @@ chmod +x /tmp/appimagetool.AppImage
|
|||||||
/tmp/appimagetool.AppImage \
|
/tmp/appimagetool.AppImage \
|
||||||
Cryptomator.AppDir \
|
Cryptomator.AppDir \
|
||||||
cryptomator-${SEMVER_STR}-${CPU_ARCH}.AppImage \
|
cryptomator-${SEMVER_STR}-${CPU_ARCH}.AppImage \
|
||||||
-u 'gh-releases-zsync|cryptomator|cryptomator|latest|cryptomator-*-${CPU_ARCH}.AppImage.zsync'
|
-u "gh-releases-zsync|cryptomator|cryptomator|latest|cryptomator-*-${CPU_ARCH}.AppImage.zsync"
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "Done. AppImage successfully created: cryptomator-${SEMVER_STR}-${CPU_ARCH}.AppImage"
|
echo "Done. AppImage successfully created: cryptomator-${SEMVER_STR}-${CPU_ARCH}.AppImage"
|
||||||
|
|||||||
@@ -83,6 +83,18 @@
|
|||||||
</content_rating>
|
</content_rating>
|
||||||
|
|
||||||
<releases>
|
<releases>
|
||||||
|
<release date="2025-07-08" version="1.17.1">
|
||||||
|
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.17.1</url>
|
||||||
|
</release>
|
||||||
|
<release date="2025-06-24" version="1.17.0">
|
||||||
|
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.17.0</url>
|
||||||
|
</release>
|
||||||
|
<release date="2025-05-15" version="1.16.2">
|
||||||
|
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.16.2</url>
|
||||||
|
</release>
|
||||||
|
<release date="2025-04-30" version="1.16.1">
|
||||||
|
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.16.1</url>
|
||||||
|
</release>
|
||||||
<release date="2025-04-29" version="1.16.0">
|
<release date="2025-04-29" version="1.16.0">
|
||||||
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.16.0</url>
|
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.16.0</url>
|
||||||
</release>
|
</release>
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
cryptomator (${PPA_VERSION}) focal; urgency=low
|
cryptomator (${PPA_VERSION}) jammy; urgency=low
|
||||||
|
|
||||||
* Full changelog can be found on https://github.com/cryptomator/cryptomator/releases
|
* Full changelog can be found on https://github.com/cryptomator/cryptomator/releases
|
||||||
|
|
||||||
|
|||||||
Vendored
+1
-1
@@ -2,7 +2,7 @@ Source: cryptomator
|
|||||||
Maintainer: Cryptobot <releases@cryptomator.org>
|
Maintainer: Cryptobot <releases@cryptomator.org>
|
||||||
Section: utils
|
Section: utils
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Build-Depends: debhelper (>=10), coffeelibs-jdk-23 (>= 23.0.2+7-0ppa1), libgtk-3-0, libxxf86vm1, libgl1
|
Build-Depends: debhelper (>=10), coffeelibs-jdk-24 (>= 24.0.1+9-0ppa3), libgtk-3-0, libxxf86vm1, libgl1
|
||||||
Standards-Version: 4.5.0
|
Standards-Version: 4.5.0
|
||||||
Homepage: https://cryptomator.org
|
Homepage: https://cryptomator.org
|
||||||
Vcs-Git: https://github.com/cryptomator/cryptomator.git
|
Vcs-Git: https://github.com/cryptomator/cryptomator.git
|
||||||
|
|||||||
Vendored
+3
-2
@@ -4,7 +4,7 @@
|
|||||||
# Uncomment this to turn on verbose mode.
|
# Uncomment this to turn on verbose mode.
|
||||||
#export DH_VERBOSE=1
|
#export DH_VERBOSE=1
|
||||||
|
|
||||||
JAVA_HOME = /usr/lib/jvm/java-23-coffeelibs
|
JAVA_HOME = /usr/lib/jvm/java-24-coffeelibs
|
||||||
DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH)
|
DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH)
|
||||||
ifeq ($(DEB_BUILD_ARCH),amd64)
|
ifeq ($(DEB_BUILD_ARCH),amd64)
|
||||||
JMODS_PATH = jmods/amd64:${JAVA_HOME}/jmods
|
JMODS_PATH = jmods/amd64:${JAVA_HOME}/jmods
|
||||||
@@ -44,7 +44,8 @@ override_dh_auto_build:
|
|||||||
--name cryptomator \
|
--name cryptomator \
|
||||||
--vendor "Skymatic GmbH" \
|
--vendor "Skymatic GmbH" \
|
||||||
--java-options "--enable-preview" \
|
--java-options "--enable-preview" \
|
||||||
--java-options "--enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator" \
|
--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" \
|
||||||
--copyright "(C) 2016 - 2025 Skymatic GmbH" \
|
--copyright "(C) 2016 - 2025 Skymatic GmbH" \
|
||||||
--java-options "-Xss5m" \
|
--java-options "-Xss5m" \
|
||||||
--java-options "-Xmx256m" \
|
--java-options "-Xmx256m" \
|
||||||
|
|||||||
Vendored
+13
-6
@@ -32,15 +32,15 @@ REVISION_NO=`git rev-list --count HEAD`
|
|||||||
VERSION_NO=`mvn -f../../../pom.xml help:evaluate -Dexpression=project.version -q -DforceStdout | sed -rn 's/.*([0-9]+\.[0-9]+\.[0-9]+).*/\1/p'`
|
VERSION_NO=`mvn -f../../../pom.xml help:evaluate -Dexpression=project.version -q -DforceStdout | sed -rn 's/.*([0-9]+\.[0-9]+\.[0-9]+).*/\1/p'`
|
||||||
FUSE_LIB="FUSE-T"
|
FUSE_LIB="FUSE-T"
|
||||||
|
|
||||||
JAVAFX_VERSION=23.0.2
|
JAVAFX_VERSION=24.0.1
|
||||||
JAVAFX_ARCH="undefined"
|
JAVAFX_ARCH="undefined"
|
||||||
JAVAFX_JMODS_SHA256="undefined"
|
JAVAFX_JMODS_SHA256="undefined"
|
||||||
if [ "$(machine)" = "arm64e" ]; then
|
if [ "$(machine)" = "arm64e" ]; then
|
||||||
JAVAFX_ARCH="aarch64"
|
JAVAFX_ARCH="aarch64"
|
||||||
JAVAFX_JMODS_SHA256="c690cc642a3924cf56622951f478ba57aec9ce09063761f800c3319331bed3fc"
|
JAVAFX_JMODS_SHA256="b5a94a13077507003fa852512bfa33f4fb680bc8076d8002e4227a84c85171d4"
|
||||||
else
|
else
|
||||||
JAVAFX_ARCH="x64"
|
JAVAFX_ARCH="x64"
|
||||||
JAVAFX_JMODS_SHA256="5e6c65c065eea22430c0eab36f37a5985eb8ad99e19e8772262021740d338f68"
|
JAVAFX_JMODS_SHA256="6e62a426d43c168a488521f904a523f3dd6ee2cf103e08136f2fd465c828a105"
|
||||||
fi
|
fi
|
||||||
JAVAFX_JMODS_URL="https://download2.gluonhq.com/openjfx/${JAVAFX_VERSION}/openjfx-${JAVAFX_VERSION}_osx-${JAVAFX_ARCH}_bin-jmods.zip"
|
JAVAFX_JMODS_URL="https://download2.gluonhq.com/openjfx/${JAVAFX_VERSION}/openjfx-${JAVAFX_VERSION}_osx-${JAVAFX_ARCH}_bin-jmods.zip"
|
||||||
|
|
||||||
@@ -75,10 +75,16 @@ mvn -B -Djavafx.platform=mac -f../../../pom.xml clean package -DskipTests -Pmac
|
|||||||
cp ../../../LICENSE.txt ../../../target
|
cp ../../../LICENSE.txt ../../../target
|
||||||
cp ../../../target/${MAIN_JAR_GLOB} ../../../target/mods
|
cp ../../../target/${MAIN_JAR_GLOB} ../../../target/mods
|
||||||
|
|
||||||
# add runtime
|
# create runtime
|
||||||
|
## check for JEP 493
|
||||||
|
JMOD_PATHS="openjfx-jmods"
|
||||||
|
if ! ${JAVA_HOME}/bin/jlink --help | grep -q "Linking from run-time image enabled"; then
|
||||||
|
JMOD_PATHS="${JAVA_HOME}/jmods:${JMOD_PATHS}"
|
||||||
|
fi
|
||||||
|
## create custom runtime
|
||||||
${JAVA_HOME}/bin/jlink \
|
${JAVA_HOME}/bin/jlink \
|
||||||
--output runtime \
|
--output runtime \
|
||||||
--module-path "${JAVA_HOME}/jmods:openjfx-jmods" \
|
--module-path "${JMOD_PATHS}" \
|
||||||
--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.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr,java.compiler \
|
--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.unsupported,jdk.security.auth,jdk.accessibility,jdk.management.jfr,java.compiler \
|
||||||
--strip-native-commands \
|
--strip-native-commands \
|
||||||
--no-header-files \
|
--no-header-files \
|
||||||
@@ -100,7 +106,7 @@ ${JAVA_HOME}/bin/jpackage \
|
|||||||
--copyright "(C) ${COPYRIGHT_YEARS} ${VENDOR}" \
|
--copyright "(C) ${COPYRIGHT_YEARS} ${VENDOR}" \
|
||||||
--app-version "${VERSION_NO}" \
|
--app-version "${VERSION_NO}" \
|
||||||
--java-options "--enable-preview" \
|
--java-options "--enable-preview" \
|
||||||
--java-options "--enable-native-access=org.cryptomator.jfuse.mac" \
|
--java-options "--enable-native-access=javafx.graphics,org.cryptomator.jfuse.mac" \
|
||||||
--java-options "-Xss5m" \
|
--java-options "-Xss5m" \
|
||||||
--java-options "-Xmx256m" \
|
--java-options "-Xmx256m" \
|
||||||
--java-options "-Dfile.encoding=\"utf-8\"" \
|
--java-options "-Dfile.encoding=\"utf-8\"" \
|
||||||
@@ -109,6 +115,7 @@ ${JAVA_HOME}/bin/jpackage \
|
|||||||
--java-options "-Dsun.java2d.metal=true" \
|
--java-options "-Dsun.java2d.metal=true" \
|
||||||
--java-options "-Dcryptomator.appVersion=\"${VERSION_NO}\"" \
|
--java-options "-Dcryptomator.appVersion=\"${VERSION_NO}\"" \
|
||||||
--java-options "-Dcryptomator.logDir=\"@{userhome}/Library/Logs/${APP_NAME}\"" \
|
--java-options "-Dcryptomator.logDir=\"@{userhome}/Library/Logs/${APP_NAME}\"" \
|
||||||
|
--java-options "-XX:ErrorFile=/cryptomator/cryptomator_crash.log" \
|
||||||
--java-options "-Dcryptomator.pluginDir=\"@{userhome}/Library/Application Support/${APP_NAME}/Plugins\"" \
|
--java-options "-Dcryptomator.pluginDir=\"@{userhome}/Library/Application Support/${APP_NAME}/Plugins\"" \
|
||||||
--java-options "-Dcryptomator.settingsPath=\"@{userhome}/Library/Application Support/${APP_NAME}/settings.json\"" \
|
--java-options "-Dcryptomator.settingsPath=\"@{userhome}/Library/Application Support/${APP_NAME}/settings.json\"" \
|
||||||
--java-options "-Dcryptomator.ipcSocketPath=\"@{userhome}/Library/Application Support/${APP_NAME}/ipc.socket\"" \
|
--java-options "-Dcryptomator.ipcSocketPath=\"@{userhome}/Library/Application Support/${APP_NAME}/ipc.socket\"" \
|
||||||
|
|||||||
+2
-1
@@ -4,7 +4,8 @@ installer
|
|||||||
*.wixobj
|
*.wixobj
|
||||||
*.pdb
|
*.pdb
|
||||||
*.msi
|
*.msi
|
||||||
|
*Debug.properties
|
||||||
*.exe
|
*.exe
|
||||||
*.jmod
|
*.jmod
|
||||||
resources/jfxJmods.zip
|
resources/jfxJmods.zip
|
||||||
license.rtf
|
license.rtf
|
||||||
|
|||||||
Vendored
+5
-1
@@ -11,6 +11,10 @@ SET HELP_URL="https://cryptomator.org/contact/"
|
|||||||
SET MODULE_AND_MAIN_CLASS="org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator"
|
SET MODULE_AND_MAIN_CLASS="org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator"
|
||||||
SET LOOPBACK_ALIAS="cryptomator-vault"
|
SET LOOPBACK_ALIAS="cryptomator-vault"
|
||||||
|
|
||||||
|
:: read clean parameter from command line
|
||||||
|
SET CLEAN=0
|
||||||
|
IF "%~1"=="clean" SET CLEAN=1
|
||||||
|
|
||||||
pwsh -NoLogo -NoProfile -ExecutionPolicy Unrestricted -Command .\build.ps1^
|
pwsh -NoLogo -NoProfile -ExecutionPolicy Unrestricted -Command .\build.ps1^
|
||||||
-AppName %APPNAME%^
|
-AppName %APPNAME%^
|
||||||
-MainJarGlob "%MAIN_JAR_GLOB%"^
|
-MainJarGlob "%MAIN_JAR_GLOB%"^
|
||||||
@@ -22,4 +26,4 @@ pwsh -NoLogo -NoProfile -ExecutionPolicy Unrestricted -Command .\build.ps1^
|
|||||||
-HelpUrl "%HELP_URL%"^
|
-HelpUrl "%HELP_URL%"^
|
||||||
-UpdateUrl "%UPDATE_URL%"^
|
-UpdateUrl "%UPDATE_URL%"^
|
||||||
-LoopbackAlias "%LOOPBACK_ALIAS%"^
|
-LoopbackAlias "%LOOPBACK_ALIAS%"^
|
||||||
-Clean 1
|
-Clean %CLEAN%
|
||||||
Vendored
+165
-65
@@ -9,34 +9,58 @@ Param(
|
|||||||
[Parameter(Mandatory, HelpMessage="Please provide an update url")][string] $UpdateUrl,
|
[Parameter(Mandatory, HelpMessage="Please provide an update url")][string] $UpdateUrl,
|
||||||
[Parameter(Mandatory, HelpMessage="Please provide an about url")][string] $AboutUrl,
|
[Parameter(Mandatory, HelpMessage="Please provide an about url")][string] $AboutUrl,
|
||||||
[Parameter(Mandatory, HelpMessage="Please provide an alias for localhost")][string] $LoopbackAlias,
|
[Parameter(Mandatory, HelpMessage="Please provide an alias for localhost")][string] $LoopbackAlias,
|
||||||
[bool] $clean
|
[bool] $clean = $false # if true, cleans up previous build artifacts
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# ============================
|
||||||
|
# Function Definitions Section
|
||||||
|
# ============================
|
||||||
|
|
||||||
|
function Main {
|
||||||
|
|
||||||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||||
$ProgressPreference = 'SilentlyContinue' # disables Invoke-WebRequest's progress bar, which slows down downloads to a few bytes/s
|
$ProgressPreference = 'SilentlyContinue' # disables Invoke-WebRequest's progress bar, which slows down downloads to a few bytes/s
|
||||||
|
|
||||||
# check preconditions
|
# check preconditions
|
||||||
if ((Get-Command "git" -ErrorAction SilentlyContinue) -eq $null)
|
if ((Get-Command "git" -ErrorAction SilentlyContinue) -eq $null)
|
||||||
{
|
{
|
||||||
Write-Host "Unable to find git.exe in your PATH (try: choco install git)"
|
Write-Error "Unable to find git.exe in your PATH (try: choco install git)"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
if ((Get-Command "mvn" -ErrorAction SilentlyContinue) -eq $null)
|
if ((Get-Command "mvn" -ErrorAction SilentlyContinue) -eq $null)
|
||||||
{
|
{
|
||||||
Write-Host "Unable to find mvn.cmd in your PATH (try: choco install maven)"
|
Write-Error "Unable to find mvn.cmd in your PATH (try: choco install maven)"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
if ((Get-Command 'wix' -ErrorAction SilentlyContinue) -eq $null)
|
||||||
|
{
|
||||||
|
Write-Error 'Unable to find wix in your PATH (try: dotnet tool install --global wix --version 6.0.0)'
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
$wixExtensions = & wix.exe extension list --global | Out-String
|
||||||
|
if ($wixExtensions -notmatch 'WixToolset.UI.wixext') {
|
||||||
|
Write-Error 'Wix UI extension missing. Please install it with: wix.exe extension add WixToolset.UI.wixext/6.0.0 --global)'
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
if ($wixExtensions -notmatch 'WixToolset.Util.wixext') {
|
||||||
|
Write-Error 'Wix Util extension missing. Please install it with: wix.exe extension add WixToolset.Util.wixext/6.0.0 --global)'
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
if ($wixExtensions -notmatch 'WixToolset.BootstrapperApplications.wixext') {
|
||||||
|
Write-Error 'Wix Bootstrapper extension missing. Please install it with: wix.exe extension add WixToolset.BootstrapperApplications.wixext/6.0.0 --global)'
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
$buildDir = Split-Path -Parent $PSCommandPath
|
$buildDir = Split-Path -Parent $PSCommandPath
|
||||||
$version = $(mvn -f $buildDir/../../pom.xml help:evaluate -Dexpression="project.version" -q -DforceStdout)
|
$version = $(mvn -f $buildDir/../../pom.xml help:evaluate -Dexpression="project.version" -q -DforceStdout)
|
||||||
$semVerNo = $version -replace '(\d+\.\d+\.\d+).*','$1'
|
$semVerNo = $version -replace '(\d+\.\d+\.\d+).*','$1'
|
||||||
$revisionNo = $(git rev-list --count HEAD)
|
$revisionNo = $(git rev-list --count HEAD)
|
||||||
|
|
||||||
Write-Output "`$version=$version"
|
Write-Host "`$version=$version"
|
||||||
Write-Output "`$semVerNo=$semVerNo"
|
Write-Host "`$semVerNo=$semVerNo"
|
||||||
Write-Output "`$revisionNo=$revisionNo"
|
Write-Host "`$revisionNo=$revisionNo"
|
||||||
Write-Output "`$buildDir=$buildDir"
|
Write-Host "`$buildDir=$buildDir"
|
||||||
Write-Output "`$Env:JAVA_HOME=$Env:JAVA_HOME"
|
Write-Host "`$Env:JAVA_HOME=$Env:JAVA_HOME"
|
||||||
|
|
||||||
$copyright = "(C) $CopyrightStartYear - $((Get-Date).Year) $Vendor"
|
$copyright = "(C) $CopyrightStartYear - $((Get-Date).Year) $Vendor"
|
||||||
|
|
||||||
@@ -50,43 +74,102 @@ if ($clean -and (Test-Path -Path $runtimeImagePath)) {
|
|||||||
Remove-Item -Path $runtimeImagePath -Force -Recurse
|
Remove-Item -Path $runtimeImagePath -Force -Recurse
|
||||||
}
|
}
|
||||||
|
|
||||||
## download jfx jmods
|
## download jfx jmods for X64, while they are part of the Arm64 JDK
|
||||||
$javaFxVersion='23.0.2'
|
$archCode = (Get-CimInstance Win32_Processor).Architecture
|
||||||
$javaFxJmodsUrl = "https://download2.gluonhq.com/openjfx/${javaFxVersion}/openjfx-${javaFxVersion}_windows-x64_bin-jmods.zip"
|
$archName = switch ($archCode) {
|
||||||
$javaFxJmodsSHA256 = 'ee176dcee3bd78bde7910735bd67f67c792882f5b89626796ae06f7a1c0119d3'
|
9 { "x64" }
|
||||||
$javaFxJmods = '.\resources\jfxJmods.zip'
|
12 { "ARM64" }
|
||||||
if( !(Test-Path -Path $javaFxJmods) ) {
|
default { "WMI Win32_Processor.Architecture code ($archCode)" }
|
||||||
Write-Output "Downloading ${javaFxJmodsUrl}..."
|
|
||||||
Invoke-WebRequest $javaFxJmodsUrl -OutFile $javaFxJmods # redirects are followed by default
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$jmodsChecksumActual = $(Get-FileHash -Path $javaFxJmods -Algorithm SHA256).Hash.ToLower()
|
switch ($archName) {
|
||||||
if( $jmodsChecksumActual -ne $javaFxJmodsSHA256 ) {
|
'ARM64' {
|
||||||
Write-Error "Checksum mismatch for jfxJmods.zip. Expected: $javaFxJmodsSHA256
|
$javafxBaseJmod = Join-Path $Env:JAVA_HOME "jmods\javafx.base.jmod"
|
||||||
, actual: $jmodsChecksumActual"
|
if (!(Test-Path $javafxBaseJmod)) {
|
||||||
exit 1;
|
Write-Error "JavaFX module not found in JDK. Please ensure full JDK (including jmods) is installed."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
$jmodPaths = "$Env:JAVA_HOME/jmods"
|
||||||
|
}
|
||||||
|
'x64' {
|
||||||
|
$javaFxVersion='24.0.1'
|
||||||
|
$javaFxJmodsUrl = "https://download2.gluonhq.com/openjfx/${javaFxVersion}/openjfx-${javaFxVersion}_windows-x64_bin-jmods.zip"
|
||||||
|
$javaFxJmodsSHA256 = 'f13d17c7caf88654fc835f1b4e75a9b0f34a888eb8abef381796c0002e63b03f'
|
||||||
|
$javaFxJmods = '.\resources\jfxJmods.zip'
|
||||||
|
|
||||||
|
if( !(Test-Path -Path $javaFxJmods) ) {
|
||||||
|
Write-Host "Downloading ${javaFxJmodsUrl}..."
|
||||||
|
Invoke-WebRequest $javaFxJmodsUrl -OutFile $javaFxJmods # redirects are followed by default
|
||||||
|
}
|
||||||
|
|
||||||
|
$jmodsChecksumActual = $(Get-FileHash -Path $javaFxJmods -Algorithm SHA256).Hash.ToLower()
|
||||||
|
if( $jmodsChecksumActual -ne $javaFxJmodsSHA256 ) {
|
||||||
|
Write-Error "Checksum mismatch for jfxJmods.zip. Expected: $javaFxJmodsSHA256
|
||||||
|
, actual: $jmodsChecksumActual"
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Expand-Archive -Path $javaFxJmods -Force -DestinationPath ".\resources\"
|
||||||
|
Remove-Item -Recurse -Force -Path ".\resources\javafx-jmods" -ErrorAction Ignore
|
||||||
|
Move-Item -Force -Path ".\resources\javafx-jmods-*" -Destination ".\resources\javafx-jmods" -ErrorAction Stop
|
||||||
|
|
||||||
|
$jmodPaths="$buildDir/resources/javafx-jmods";
|
||||||
|
}
|
||||||
|
default {
|
||||||
|
Write-Error "Unsupported architecture: $arch"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Expand-Archive -Path $javaFxJmods -Force -DestinationPath ".\resources\"
|
|
||||||
Remove-Item -Recurse -Force -Path ".\resources\javafx-jmods" -ErrorAction Ignore
|
|
||||||
Move-Item -Force -Path ".\resources\javafx-jmods-*" -Destination ".\resources\javafx-jmods" -ErrorAction Stop
|
|
||||||
|
|
||||||
## create custom runtime
|
## create custom runtime
|
||||||
|
### check for JEP 493
|
||||||
|
if ((& "$Env:JAVA_HOME\bin\jlink" --help | Select-String -Pattern "Linking from run-time image enabled" -SimpleMatch | Measure-Object).Count -eq 0 ) {
|
||||||
|
$jmodPaths="$Env:JAVA_HOME/jmods;" + $jmodPaths;
|
||||||
|
}
|
||||||
|
|
||||||
|
### create runtime
|
||||||
& "$Env:JAVA_HOME\bin\jlink" `
|
& "$Env:JAVA_HOME\bin\jlink" `
|
||||||
--verbose `
|
--verbose `
|
||||||
--output runtime `
|
--output runtime `
|
||||||
--module-path "$Env:JAVA_HOME/jmods;$buildDir/resources/javafx-jmods" `
|
--module-path $jmodPaths `
|
||||||
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,jdk.unsupported,jdk.accessibility,jdk.management.jfr,jdk.crypto.mscapi,java.compiler,javafx.base,javafx.graphics,javafx.controls,javafx.fxml `
|
--add-modules java.base,java.desktop,java.instrument,java.logging,java.naming,java.net.http,java.scripting,java.sql,java.xml,jdk.unsupported,jdk.accessibility,jdk.management.jfr,jdk.crypto.mscapi,java.compiler,javafx.base,javafx.graphics,javafx.controls,javafx.fxml `
|
||||||
--strip-native-commands `
|
--strip-native-commands `
|
||||||
--no-header-files `
|
--no-header-files `
|
||||||
--no-man-pages `
|
--no-man-pages `
|
||||||
--strip-debug `
|
--strip-debug `
|
||||||
--compress "zip-0" #do not compress to have improved msi compression
|
--compress "zip-0" #do not compress and use msi compression
|
||||||
|
|
||||||
$appPath = ".\$AppName"
|
$appPath = ".\$AppName"
|
||||||
if ($clean -and (Test-Path -Path $appPath)) {
|
if ($clean -and (Test-Path -Path $appPath)) {
|
||||||
Remove-Item -Path $appPath -Force -Recurse
|
Remove-Item -Path $appPath -Force -Recurse
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$javaOptions = @(
|
||||||
|
"--java-options", "--enable-native-access=javafx.graphics,org.cryptomator.jfuse.win,org.cryptomator.integrations.win"
|
||||||
|
"--java-options", "-Xss5m"
|
||||||
|
"--java-options", "-Xmx256m"
|
||||||
|
"--java-options", "-Dcryptomator.appVersion=`"$semVerNo`""
|
||||||
|
"--java-options", "-Dfile.encoding=`"utf-8`""
|
||||||
|
"--java-options", "-Djava.net.useSystemProxies=true"
|
||||||
|
"--java-options", "-Dcryptomator.logDir=`"@{localappdata}/$AppName`""
|
||||||
|
"--java-options", "-XX:ErrorFile=`"C:/cryptomator/cryptomator_crash.log`""
|
||||||
|
"--java-options", "-Dcryptomator.pluginDir=`"@{appdata}/$AppName/Plugins`""
|
||||||
|
"--java-options", "-Dcryptomator.settingsPath=`"@{appdata}/$AppName/settings.json;@{userhome}/AppData/Roaming/$AppName/settings.json`""
|
||||||
|
"--java-options", "-Dcryptomator.ipcSocketPath=`"@{localappdata}/$AppName/ipc.socket`""
|
||||||
|
"--java-options", "-Dcryptomator.p12Path=`"@{appdata}/$AppName/key.p12;@{userhome}/AppData/Roaming/$AppName/key.p12`""
|
||||||
|
"--java-options", "-Dcryptomator.mountPointsDir=`"@{userhome}/$AppName`""
|
||||||
|
"--java-options", "-Dcryptomator.loopbackAlias=`"$LoopbackAlias`""
|
||||||
|
"--java-options", "-Dcryptomator.integrationsWin.autoStartShellLinkName=`"$AppName`""
|
||||||
|
"--java-options", "-Dcryptomator.integrationsWin.keychainPaths=`"@{appdata}/$AppName/keychain.json;@{userhome}/AppData/Roaming/$AppName/keychain.json`""
|
||||||
|
"--java-options", "-Dcryptomator.integrationsWin.windowsHelloKeychainPaths=`"@{appdata}/$AppName/windowsHelloKeychain.json`""
|
||||||
|
"--java-options", "-Dcryptomator.showTrayIcon=true"
|
||||||
|
"--java-options", "-Dcryptomator.buildNumber=`"msi-$revisionNo`""
|
||||||
|
"--java-options", "-Dcryptomator.disableUpdateCheck=false"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# create app dir
|
# create app dir
|
||||||
& "$Env:JAVA_HOME\bin\jpackage" `
|
& "$Env:JAVA_HOME\bin\jpackage" `
|
||||||
--verbose `
|
--verbose `
|
||||||
@@ -99,27 +182,16 @@ if ($clean -and (Test-Path -Path $appPath)) {
|
|||||||
--name $AppName `
|
--name $AppName `
|
||||||
--vendor $Vendor `
|
--vendor $Vendor `
|
||||||
--copyright $copyright `
|
--copyright $copyright `
|
||||||
--java-options "--enable-preview" `
|
|
||||||
--java-options "--enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win" `
|
|
||||||
--java-options "-Xss5m" `
|
|
||||||
--java-options "-Xmx256m" `
|
|
||||||
--java-options "-Dcryptomator.appVersion=`"$semVerNo`"" `
|
|
||||||
--app-version "$semVerNo.$revisionNo" `
|
--app-version "$semVerNo.$revisionNo" `
|
||||||
--java-options "-Dfile.encoding=`"utf-8`"" `
|
|
||||||
--java-options "-Djava.net.useSystemProxies=true" `
|
|
||||||
--java-options "-Dcryptomator.logDir=`"@{localappdata}/$AppName`"" `
|
|
||||||
--java-options "-Dcryptomator.pluginDir=`"@{appdata}/$AppName/Plugins`"" `
|
|
||||||
--java-options "-Dcryptomator.settingsPath=`"@{appdata}/$AppName/settings.json;@{userhome}/AppData/Roaming/$AppName/settings.json`"" `
|
|
||||||
--java-options "-Dcryptomator.ipcSocketPath=`"@{localappdata}/$AppName/ipc.socket`"" `
|
|
||||||
--java-options "-Dcryptomator.p12Path=`"@{appdata}/$AppName/key.p12;@{userhome}/AppData/Roaming/$AppName/key.p12`"" `
|
|
||||||
--java-options "-Dcryptomator.mountPointsDir=`"@{userhome}/$AppName`"" `
|
|
||||||
--java-options "-Dcryptomator.loopbackAlias=`"$LoopbackAlias`"" `
|
|
||||||
--java-options "-Dcryptomator.integrationsWin.autoStartShellLinkName=`"$AppName`"" `
|
|
||||||
--java-options "-Dcryptomator.integrationsWin.keychainPaths=`"@{appdata}/$AppName/keychain.json;@{userhome}/AppData/Roaming/$AppName/keychain.json`"" `
|
|
||||||
--java-options "-Dcryptomator.showTrayIcon=true" `
|
|
||||||
--java-options "-Dcryptomator.buildNumber=`"msi-$revisionNo`"" `
|
|
||||||
--resource-dir resources `
|
--resource-dir resources `
|
||||||
--icon resources/$AppName.ico
|
--icon resources/$AppName.ico `
|
||||||
|
--add-launcher "${AppName} (Debug)=$buildDir\debug-launcher.properties" `
|
||||||
|
@javaOptions
|
||||||
|
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Write-Error "jpackage Appimage failed with exit code $LASTEXITCODE"
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
#Create RTF license for msi
|
#Create RTF license for msi
|
||||||
&mvn -B -f $buildDir/../../pom.xml license:add-third-party "-Djavafx.platform=win" `
|
&mvn -B -f $buildDir/../../pom.xml license:add-third-party "-Djavafx.platform=win" `
|
||||||
@@ -134,14 +206,7 @@ if ($clean -and (Test-Path -Path $appPath)) {
|
|||||||
# patch app dir
|
# patch app dir
|
||||||
Copy-Item "contrib\*" -Destination "$AppName"
|
Copy-Item "contrib\*" -Destination "$AppName"
|
||||||
attrib -r "$AppName\$AppName.exe"
|
attrib -r "$AppName\$AppName.exe"
|
||||||
# patch batch script to set hostfile
|
attrib -r "$AppName\${AppName} (Debug).exe"
|
||||||
$webDAVPatcher = "$AppName\patchWebDAV.bat"
|
|
||||||
try {
|
|
||||||
(Get-Content $webDAVPatcher ) -replace '::REPLACE ME', "SET LOOPBACK_ALIAS=`"$LoopbackAlias`"" | Set-Content $webDAVPatcher
|
|
||||||
} catch {
|
|
||||||
Write-Host "Failed to set LOOPBACK_ALIAS for patchWebDAV.bat"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# create .msi
|
# create .msi
|
||||||
$Env:JP_WIXWIZARD_RESOURCES = "$buildDir\resources"
|
$Env:JP_WIXWIZARD_RESOURCES = "$buildDir\resources"
|
||||||
@@ -166,6 +231,11 @@ $Env:JP_WIXHELPER_DIR = "."
|
|||||||
--about-url $AboutUrl `
|
--about-url $AboutUrl `
|
||||||
--file-associations resources/FAvaultFile.properties
|
--file-associations resources/FAvaultFile.properties
|
||||||
|
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Write-Error "jpackage MSI failed with exit code $LASTEXITCODE"
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
#Create RTF license for bundle
|
#Create RTF license for bundle
|
||||||
&mvn -B -f $buildDir/../../pom.xml license:add-third-party "-Djavafx.platform=win" `
|
&mvn -B -f $buildDir/../../pom.xml license:add-third-party "-Djavafx.platform=win" `
|
||||||
"-Dlicense.thirdPartyFilename=license.rtf" `
|
"-Dlicense.thirdPartyFilename=license.rtf" `
|
||||||
@@ -177,24 +247,54 @@ $Env:JP_WIXHELPER_DIR = "."
|
|||||||
"-Dlicense.licenseMergesUrl=file:///$buildDir/../../license/merges"
|
"-Dlicense.licenseMergesUrl=file:///$buildDir/../../license/merges"
|
||||||
|
|
||||||
# download Winfsp
|
# download Winfsp
|
||||||
$winfspMsiUrl= 'https://github.com/winfsp/winfsp/releases/download/v2.0/winfsp-2.0.23075.msi'
|
$winfspMsiUrl= 'https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi'
|
||||||
Write-Output "Downloading ${winfspMsiUrl}..."
|
$winfspMsiHash = '073A70E00F77423E34BED98B86E600DEF93393BA5822204FAC57A29324DB9F7A'
|
||||||
|
Write-Host "Downloading ${winfspMsiUrl}..."
|
||||||
Invoke-WebRequest $winfspMsiUrl -OutFile ".\bundle\resources\winfsp.msi" # redirects are followed by default
|
Invoke-WebRequest $winfspMsiUrl -OutFile ".\bundle\resources\winfsp.msi" # redirects are followed by default
|
||||||
|
$computedHash = $(Get-FileHash -Path '.\bundle\resources\winfsp.msi' -Algorithm SHA256).Hash
|
||||||
|
if (! $computedHash.Equals($winfspMsiHash)) {
|
||||||
|
Write-Error -Category InvalidData -CategoryActivity "Data integrity check failed" -Message @"
|
||||||
|
Downloaded Winfsp Installer does not match stored SHA256 checksum.
|
||||||
|
Expected: $winfspMsiHash
|
||||||
|
Actual: $computedHash
|
||||||
|
"@
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
# download legacy-winfsp uninstaller
|
# download legacy-winfsp uninstaller
|
||||||
$winfspUninstaller= 'https://github.com/cryptomator/winfsp-uninstaller/releases/latest/download/winfsp-uninstaller.exe'
|
$winfspUninstaller= 'https://github.com/cryptomator/winfsp-uninstaller/releases/latest/download/winfsp-uninstaller.exe'
|
||||||
Write-Output "Downloading ${winfspUninstaller}..."
|
Write-Host "Downloading ${winfspUninstaller}..."
|
||||||
Invoke-WebRequest $winfspUninstaller -OutFile ".\bundle\resources\winfsp-uninstaller.exe" # redirects are followed by default
|
Invoke-WebRequest $winfspUninstaller -OutFile ".\bundle\resources\winfsp-uninstaller.exe" # redirects are followed by default
|
||||||
|
|
||||||
# copy MSI to bundle resources
|
# copy MSI to bundle resources
|
||||||
Copy-Item ".\installer\$AppName-*.msi" -Destination ".\bundle\resources\$AppName.msi"
|
Copy-Item ".\installer\$AppName-*.msi" -Destination ".\bundle\resources\$AppName.msi" -Force
|
||||||
|
|
||||||
# create bundle including winfsp
|
# create bundle including winfsp
|
||||||
& "$env:WIX\bin\candle.exe" .\bundle\bundleWithWinfsp.wxs -ext WixBalExtension -ext WixUtilextension -out bundle\ `
|
& wix build `
|
||||||
-dBundleVersion="$semVerNo.$revisionNo" `
|
-define BundleName="$AppName" `
|
||||||
-dBundleVendor="$Vendor" `
|
-define BundleVersion="$semVerNo.$revisionNo" `
|
||||||
-dBundleCopyright="$copyright" `
|
-define BundleVendor="$Vendor" `
|
||||||
-dAboutUrl="$AboutUrl" `
|
-define BundleCopyright="$copyright" `
|
||||||
-dHelpUrl="$HelpUrl" `
|
-define AboutUrl="$AboutUrl" `
|
||||||
-dUpdateUrl="$UpdateUrl"
|
-define HelpUrl="$HelpUrl" `
|
||||||
& "$env:WIX\bin\light.exe" -b . .\bundle\BundlewithWinfsp.wixobj -ext WixBalExtension -ext WixUtilextension -out installer\$AppName-Installer.exe
|
-define UpdateUrl="$UpdateUrl" `
|
||||||
|
-ext "WixToolset.Util.wixext" `
|
||||||
|
-ext "WixToolset.BootstrapperApplications.wixext" `
|
||||||
|
.\bundle\bundleWithWinfsp.wxs `
|
||||||
|
-out "installer\$AppName-Installer.exe"
|
||||||
|
|
||||||
|
Write-Host "Created EXE installer .\installer\$AppName-Installer.exe"
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============================
|
||||||
|
# Script Execution Starts Here
|
||||||
|
# ============================
|
||||||
|
if ($clean) {
|
||||||
|
Write-Host "Cleaning up previous build artifacts..."
|
||||||
|
Remove-Item -Path ".\runtime" -Force -Recurse -ErrorAction Ignore -ProgressAction SilentlyContinue
|
||||||
|
Remove-Item -Path ".\$AppName" -Force -Recurse -ErrorAction Ignore -ProgressAction SilentlyContinue
|
||||||
|
Remove-Item -Path ".\installer" -Force -Recurse -ErrorAction Ignore -ProgressAction SilentlyContinue
|
||||||
|
}
|
||||||
|
return Main
|
||||||
|
|
||||||
|
|||||||
Vendored
+45
-59
@@ -1,66 +1,52 @@
|
|||||||
<?xml version="1.0"?>
|
<!-- For Built in variables, see https://wixtoolset.org/docs/tools/burn/builtin-variables/-->
|
||||||
|
<ns0:Wix xmlns:ns0="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
|
||||||
<!-- For Built in variables, see https://wixtoolset.org/docs/tools/burn/builtin-variables/-->
|
<ns0:Bundle Name="$(var.BundleName)"
|
||||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
|
UpgradeCode="29eea626-2e5b-4449-b5f8-4602925ddf7b"
|
||||||
<!-- see https://wixtoolset.org/documentation/manual/v3/xsd/wix/bundle.html-->
|
Version="$(var.BundleVersion)"
|
||||||
<!-- Attributes explicitly not used:
|
Manufacturer="$(var.BundleVendor)"
|
||||||
Condition - the single msi files have their own install conditions, no need to copy them here
|
AboutUrl="$(var.AboutUrl)"
|
||||||
-->
|
HelpUrl="$(var.HelpUrl)"
|
||||||
|
UpdateUrl="$(var.UpdateUrl)"
|
||||||
<Bundle Name="Cryptomator" UpgradeCode="29eea626-2e5b-4449-b5f8-4602925ddf7b" Version="$(var.BundleVersion)" Manufacturer="$(var.BundleVendor)"
|
Copyright="$(var.BundleCopyright)"
|
||||||
AboutUrl="$(var.AboutUrl)" HelpUrl="$(var.HelpUrl)" UpdateUrl="$(var.UpdateUrl)" Copyright="$(var.BundleCopyright)" IconSourceFile="bundle\resources\Cryptomator.ico">
|
IconSourceFile="bundle\resources\Cryptomator.ico">
|
||||||
|
|
||||||
<!-- detect outdated WinFsp installations -->
|
<!-- detect outdated WinFsp installations -->
|
||||||
<util:ProductSearch
|
<util:ProductSearch Variable="InstalledLegacyWinFspVersion" Result="version" UpgradeCode="82F812D9-4083-4EF1-8BC8-0F1EDA05B46B" />
|
||||||
Variable="InstalledLegacyWinFspVersion"
|
|
||||||
Result="version"
|
|
||||||
UpgradeCode="82F812D9-4083-4EF1-8BC8-0F1EDA05B46B"/>
|
|
||||||
|
|
||||||
<!-- for definition of the standard themes, see https://github.com/wixtoolset/wix3/blob/master/src/ext/BalExtension/wixstdba/Resources/-->
|
<ns0:BootstrapperApplication>
|
||||||
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLargeLicense">
|
<bal:WixStandardBootstrapperApplication LicenseFile="bundle\resources\license.rtf" ShowVersion="yes"
|
||||||
<!-- see https://wixtoolset.org/documentation/manual/v3/xsd/bal/wixstandardbootstrapperapplication.html -->
|
SuppressOptionsUI="yes"
|
||||||
<!-- Possible Attributes: LaunchTarget -->
|
Theme="rtfLargeLicense"
|
||||||
<bal:WixStandardBootstrapperApplication
|
ThemeFile="bundle\resources\customBootstrapperTheme.xml"
|
||||||
LicenseFile="bundle\resources\license.rtf"
|
LocalizationFile="bundle\resources\customBootstrapperTheme.wxl"
|
||||||
ShowVersion="yes"
|
LogoSideFile="bundle\resources\logoSide.png"
|
||||||
SuppressOptionsUI="yes"
|
LogoFile="bundle\resources\logo.png"
|
||||||
ThemeFile="bundle\customBootstrapperTheme.xml"
|
LaunchTarget="[ProgramFiles64Folder]\$(var.BundleName)\$(var.BundleName).exe" />
|
||||||
LocalizationFile="bundle\customBootstrapperTheme.wxl"
|
<ns0:Payload SourceFile="bundle\resources\logoSide.png"/>
|
||||||
LogoFile="bundle\resources\logo.png"/>
|
<!-- Required due to https://github.com/wixtoolset/issues/issues/8104 -->
|
||||||
<Payload SourceFile="bundle\resources\logoSide.png" />
|
<ns0:Payload Name="Cryptobot.ico" SourceFile="bundle\resources\Cryptomator.ico"/>
|
||||||
</BootstrapperApplicationRef>
|
</ns0:BootstrapperApplication>
|
||||||
|
|
||||||
<Chain>
|
<ns0:Variable Name="DISABLEUPDATECHECK" bal:Overridable="yes" Type="string" Value="false"/>
|
||||||
<ExePackage Cache="yes" PerMachine="yes" Permanent="no"
|
|
||||||
SourceFile="resources\winfsp-uninstaller.exe"
|
<ns0:Chain>
|
||||||
DisplayName="Removing outdated WinFsp Driver"
|
<ns0:ExePackage Cache="keep" PerMachine="yes" Permanent="no" SourceFile="bundle\resources\winfsp-uninstaller.exe" DisplayName="Removing outdated WinFsp Driver" Description="Executable to remove old winfsp" DetectCondition="false" InstallCondition="(InstalledLegacyWinFspVersion <> v0.0.0.0) AND ((WixBundleAction = 7) OR (WixBundleAction = 5))" UninstallArguments="">
|
||||||
Description="Executable to remove old winfsp"
|
<ns0:CommandLine Condition="WixBundleUILevel <= 3" InstallArgument="-q -l "[WixBundleLog].winfsp-uninstaller.log"" RepairArgument="-q" UninstallArgument="-s" />
|
||||||
DetectCondition="false"
|
|
||||||
InstallCondition="(InstalledLegacyWinFspVersion <> v0.0.0.0) AND ((WixBundleAction = 7) OR (WixBundleAction = 5))">
|
|
||||||
<CommandLine Condition="WixBundleUILevel <= 3" InstallArgument="-q -l "[WixBundleLog].winfsp-uninstaller.log"" RepairArgument="-q" UninstallArgument="-s" />
|
|
||||||
<!-- XML allows line breaks in attributes, hence keep the line breaks here -->
|
<!-- XML allows line breaks in attributes, hence keep the line breaks here -->
|
||||||
<CommandLine Condition="WixBundleUILevel > 3" InstallArgument="-l "[WixBundleLog].winfsp-uninstaller.log" -t "Cryptomator Installer" -m "Cryptomator requires a newer version of the WinFsp driver. The installer will now uninstall WinFsp, possibly reboot, and afterwards proceed with the installation.
|
<ns0:CommandLine Condition="WixBundleUILevel > 3" InstallArgument="-l "[WixBundleLog].winfsp-uninstaller.log" -t "Cryptomator Installer" -m "Cryptomator requires a newer version of the WinFsp driver. The installer will now uninstall WinFsp, possibly reboot, and afterwards proceed with the installation.
|
||||||
|
|
||||||
Do you want to continue?"" RepairArgument="-q" UninstallArgument="-s" />
|
Do you want to continue?"" RepairArgument="-q" UninstallArgument="-s" />
|
||||||
<ExitCode Behavior="success" Value="0"/>
|
<ns0:ExitCode Behavior="success" Value="0" />
|
||||||
<ExitCode Behavior="success" Value="1"/>
|
<ns0:ExitCode Behavior="success" Value="1" />
|
||||||
<ExitCode Behavior="error" Value="2"/>
|
<ns0:ExitCode Behavior="error" Value="2" />
|
||||||
<ExitCode Behavior="error" Value="3"/>
|
<ns0:ExitCode Behavior="error" Value="3" />
|
||||||
<ExitCode Behavior="forceReboot" Value="4"/>
|
<ns0:ExitCode Behavior="forceReboot" Value="4" />
|
||||||
<ExitCode Behavior="success" Value="5"/>
|
<ns0:ExitCode Behavior="success" Value="5" />
|
||||||
</ExePackage>
|
</ns0:ExePackage>
|
||||||
<!-- see https://wixtoolset.org/documentation/manual/v3/xsd/wix/msipackage.html-->
|
<ns0:MsiPackage SourceFile="bundle\resources\Cryptomator.msi" CacheId="cryptomator-bundle-cryptomator" Visible="no">
|
||||||
<MsiPackage
|
<ns0:MsiProperty Name="DISABLEUPDATECHECK" Value="[DISABLEUPDATECHECK]"/>
|
||||||
SourceFile="resources\Cryptomator.msi"
|
</ns0:MsiPackage>
|
||||||
CacheId="cryptomator-bundle-cryptomator"
|
<ns0:MsiPackage SourceFile="bundle\resources\winfsp.msi" CacheId="cryptomator-bundle-winfsp" Visible="yes" Permanent="yes" />
|
||||||
DisplayInternalUI="no"
|
</ns0:Chain>
|
||||||
Visible="no"/>
|
</ns0:Bundle>
|
||||||
<MsiPackage
|
</ns0:Wix>
|
||||||
SourceFile="resources\winfsp.msi"
|
|
||||||
CacheId="cryptomator-bundle-winfsp"
|
|
||||||
Visible="yes"
|
|
||||||
DisplayInternalUI="no"
|
|
||||||
Permanent="yes"/>
|
|
||||||
</Chain>
|
|
||||||
</Bundle>
|
|
||||||
</Wix>
|
|
||||||
-64
@@ -1,64 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
|
|
||||||
|
|
||||||
|
|
||||||
<WixLocalization Culture="en-us" Language="1033" xmlns="http://schemas.microsoft.com/wix/2006/localization">
|
|
||||||
<String Id="Caption">[WixBundleName] Setup</String>
|
|
||||||
<String Id="Title">[WixBundleName]</String>
|
|
||||||
<String Id="InstallHeader">Welcome</String>
|
|
||||||
<String Id="InstallMessage">This Setup will install [WixBundleName] and additional dependencies on your computer.</String>
|
|
||||||
<String Id="InstallVersion">Version [WixBundleVersion]</String>
|
|
||||||
<String Id="ConfirmCancelMessage">Are you sure you want to cancel?</String>
|
|
||||||
<String Id="ExecuteUpgradeRelatedBundleMessage">Previous version</String>
|
|
||||||
<String Id="HelpHeader">Setup Help</String>
|
|
||||||
<String Id="HelpText">/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or
|
|
||||||
creates a complete local copy of the bundle in directory. Install is the default.
|
|
||||||
|
|
||||||
/passive | /quiet - displays minimal UI with no prompts or displays no UI and
|
|
||||||
no prompts. By default UI and all prompts are displayed.
|
|
||||||
|
|
||||||
/norestart - suppress any attempts to restart. By default UI will prompt before restart.
|
|
||||||
/log log.txt - logs to a specific file. By default a log file is created in %TEMP%.</String>
|
|
||||||
<String Id="HelpCloseButton">&Close</String>
|
|
||||||
<String Id="InstallLicenseLinkText">[WixBundleName] <a href="#">license terms</a>.</String>
|
|
||||||
<String Id="InstallAcceptCheckbox">I &agree to the license terms and conditions</String>
|
|
||||||
<String Id="InstallOptionsButton">&Options</String>
|
|
||||||
<String Id="InstallInstallButton">&Install</String>
|
|
||||||
<String Id="InstallCloseButton">&Close</String>
|
|
||||||
<String Id="OptionsHeader">Setup Options</String>
|
|
||||||
<String Id="OptionsLocationLabel">Install location:</String>
|
|
||||||
<String Id="OptionsBrowseButton">&Browse</String>
|
|
||||||
<String Id="OptionsOkButton">&OK</String>
|
|
||||||
<String Id="OptionsCancelButton">&Cancel</String>
|
|
||||||
<String Id="ProgressHeader">Setup Progress</String>
|
|
||||||
<String Id="ProgressLabel">Processing:</String>
|
|
||||||
<String Id="OverallProgressPackageText">Initializing...</String>
|
|
||||||
<String Id="ProgressCancelButton">&Cancel</String>
|
|
||||||
<String Id="ModifyHeader">Modify Setup</String>
|
|
||||||
<String Id="ModifyRepairButton">&Repair</String>
|
|
||||||
<String Id="ModifyUninstallButton">&Uninstall</String>
|
|
||||||
<String Id="ModifyCloseButton">&Close</String>
|
|
||||||
<String Id="SuccessRepairHeader">Repair Successfully Completed</String>
|
|
||||||
<String Id="SuccessUninstallHeader">Uninstall Successfully Completed</String>
|
|
||||||
<String Id="SuccessInstallHeader">Installation Successfully Completed</String>
|
|
||||||
<String Id="SuccessHeader">Setup Successful</String>
|
|
||||||
<String Id="SuccessLaunchButton">&Launch</String>
|
|
||||||
<String Id="SuccessRestartText">You must restart your computer before you can use the software.</String>
|
|
||||||
<String Id="SuccessRestartButton">&Restart</String>
|
|
||||||
<String Id="SuccessCloseButton">&Close</String>
|
|
||||||
<String Id="FailureHeader">Setup Failed</String>
|
|
||||||
<String Id="FailureInstallHeader">Setup Failed</String>
|
|
||||||
<String Id="FailureUninstallHeader">Uninstall Failed</String>
|
|
||||||
<String Id="FailureRepairHeader">Repair Failed</String>
|
|
||||||
<String Id="FailureHyperlinkLogText">One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>.</String>
|
|
||||||
<String Id="FailureRestartText">You must restart your computer to complete the rollback of the software.</String>
|
|
||||||
<String Id="FailureRestartButton">&Restart</String>
|
|
||||||
<String Id="FailureCloseButton">&Close</String>
|
|
||||||
<String Id="FilesInUseHeader">Files In Use</String>
|
|
||||||
<String Id="FilesInUseLabel">The following applications are using files that need to be updated:</String>
|
|
||||||
<String Id="FilesInUseCloseRadioButton">Close the &applications and attempt to restart them.</String>
|
|
||||||
<String Id="FilesInUseDontCloseRadioButton">&Do not close applications. A reboot will be required.</String>
|
|
||||||
<String Id="FilesInUseOkButton">&OK</String>
|
|
||||||
<String Id="FilesInUseCancelButton">&Cancel</String>
|
|
||||||
<String Id="ErrorFailNoActionReboot">No action was taken as a system reboot is required.</String>
|
|
||||||
</WixLocalization>
|
|
||||||
-91
@@ -1,91 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
|
|
||||||
<!-- adjusted theme based on https://github.com/wixtoolset/wix3/blob/master/src/ext/BalExtension/wixstdba/Resources/HyperlinkSidebarTheme.xml -->
|
|
||||||
|
|
||||||
|
|
||||||
<Theme xmlns="http://wixtoolset.org/schemas/thmutil/2010">
|
|
||||||
<Window Width="600" Height="450" HexStyle="100a0000" FontId="0">#(loc.Caption)</Window>
|
|
||||||
<Font Id="0" Height="-12" Weight="500" Foreground="000000" Background="FFFFFF">Segoe UI</Font>
|
|
||||||
<Font Id="1" Height="-24" Weight="500" Foreground="000000">Segoe UI</Font>
|
|
||||||
<Font Id="2" Height="-22" Weight="500" Foreground="666666">Segoe UI</Font>
|
|
||||||
<Font Id="3" Height="-12" Weight="500" Foreground="000000" Background="FFFFFF">Segoe UI</Font>
|
|
||||||
<Font Id="4" Height="-12" Weight="500" Foreground="ff0000" Background="FFFFFF" Underline="yes">Segoe UI</Font>
|
|
||||||
<Font Id="5" Height="-12" Weight="700" Foreground="000000" Background="FFFFFF">Segoe UI</Font>
|
|
||||||
|
|
||||||
<Image X="11" Y="11" Width="64" Height="64" ImageFile="logo.png" />
|
|
||||||
<Text X="80" Y="11" Width="-11" Height="64" FontId="1" DisablePrefix="yes">#(loc.Title)</Text>
|
|
||||||
|
|
||||||
<Page Name="Help">
|
|
||||||
<Image X="11" Y="11" Width="64" Height="64" ImageFile="logo.png" />
|
|
||||||
<Text X="80" Y="11" Width="-11" Height="64" FontId="1" DisablePrefix="yes">#(loc.Title)</Text>
|
|
||||||
<Text X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.HelpHeader)</Text>
|
|
||||||
<Text X="11" Y="112" Width="-11" Height="-35" FontId="3" DisablePrefix="yes">#(loc.HelpText)</Text>
|
|
||||||
<Button Name="HelpCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.HelpCloseButton)</Button>
|
|
||||||
</Page>
|
|
||||||
<Page Name="Install">
|
|
||||||
<Text X="185" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.Title)</Text>
|
|
||||||
<Image X="11" Y="11" Width="165" Height="400" ImageFile="logoside.png"/>
|
|
||||||
<Text X="185" Y="50" Width="-11" Height="32" FontId="2" DisablePrefix="yes">#(loc.InstallHeader)</Text>
|
|
||||||
<Text X="185" Y="91" Width="-11" Height="64" FontId="3" DisablePrefix="yes">#(loc.InstallMessage)</Text>
|
|
||||||
<Richedit Name="EulaRichedit" X="185" Y="131" Width="-12" Height="-65" HexStyle="0x00800000" TabStop="yes" FontId="0" />
|
|
||||||
<Checkbox Name="EulaAcceptCheckbox" X="185" Y="-46" Width="-11" Height="17" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.InstallAcceptCheckbox)</Checkbox>
|
|
||||||
<Text Name="InstallVersion" X="185" Y="-11" Width="-11" Height="17" FontId="3" DisablePrefix="yes" HideWhenDisabled="yes">#(loc.InstallVersion)</Text>
|
|
||||||
<Button Name="InstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallInstallButton)</Button>
|
|
||||||
<Button Name="WelcomeCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallCloseButton)</Button>
|
|
||||||
</Page>
|
|
||||||
<Page Name="FilesInUse">
|
|
||||||
<Image X="11" Y="11" Width="64" Height="64" ImageFile="logo.png" />
|
|
||||||
<Text X="80" Y="11" Width="-11" Height="64" FontId="1" DisablePrefix="yes">#(loc.Title)</Text>
|
|
||||||
<Text X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.FilesInUseHeader)</Text>
|
|
||||||
<Text X="11" Y="121" Width="-11" Height="34" FontId="3" DisablePrefix="yes">#(loc.FilesInUseLabel)</Text>
|
|
||||||
<Text Name="FilesInUseText" X="11" Y="150" Width="-11" Height="-86" FontId="3" DisablePrefix="yes" HexStyle="0x0000000C">A</Text>
|
|
||||||
|
|
||||||
<Button Name="FilesInUseCloseRadioButton" X="11" Y="-60" Width="-11" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes" HexStyle="0x000009">#(loc.FilesInUseCloseRadioButton)</Button>
|
|
||||||
<Button Name="FilesInUseDontCloseRadioButton" X="11" Y="-40" Width="-11" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes" HexStyle="0x000009">#(loc.FilesInUseDontCloseRadioButton)</Button>
|
|
||||||
|
|
||||||
<Button Name="FilesInUseOkButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.FilesInUseOkButton)</Button>
|
|
||||||
<Button Name="FilesInUseCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.FilesInUseCancelButton)</Button>
|
|
||||||
</Page>
|
|
||||||
<Page Name="Progress">
|
|
||||||
<Text X="80" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.Title)</Text>
|
|
||||||
<Image X="11" Y="11" Width="64" Height="64" ImageFile="logo.png"/>
|
|
||||||
<Text X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ProgressHeader)</Text>
|
|
||||||
<Text X="11" Y="141" Width="70" Height="17" FontId="3" DisablePrefix="yes">#(loc.ProgressLabel)</Text>
|
|
||||||
<Text Name="OverallProgressPackageText" X="85" Y="141" Width="-11" Height="17" FontId="3" DisablePrefix="yes">#(loc.OverallProgressPackageText)</Text>
|
|
||||||
<Progressbar Name="OverallCalculatedProgressbar" X="11" Y="163" Width="-11" Height="20" />
|
|
||||||
<Button Name="ProgressCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ProgressCancelButton)</Button>
|
|
||||||
</Page>
|
|
||||||
<Page Name="Modify">
|
|
||||||
<Image X="11" Y="11" Width="64" Height="64" ImageFile="logo.png" />
|
|
||||||
<Text X="80" Y="11" Width="-11" Height="64" FontId="1" DisablePrefix="yes">#(loc.Title)</Text>
|
|
||||||
<Text X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ModifyHeader)</Text>
|
|
||||||
<Button Name="RepairButton" X="-171" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.ModifyRepairButton)</Button>
|
|
||||||
<Button Name="UninstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ModifyUninstallButton)</Button>
|
|
||||||
<Button Name="ModifyCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ModifyCloseButton)</Button>
|
|
||||||
</Page>
|
|
||||||
<Page Name="Success">
|
|
||||||
<Text X="185" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.Title)</Text>
|
|
||||||
<Image X="11" Y="11" Width="165" Height="400" ImageFile="logoside.png"/>
|
|
||||||
<Text Name="SuccessHeader" X="185" Y="50" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessHeader)</Text>
|
|
||||||
<Text Name="SuccessInstallHeader" X="185" Y="50" Width="-11" Height="100" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessInstallHeader)</Text>
|
|
||||||
<Text Name="SuccessRepairHeader" X="185" Y="50" Width="-11" Height="100" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessRepairHeader)</Text>
|
|
||||||
<Text Name="SuccessUninstallHeader" X="185" Y="50" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessUninstallHeader)</Text>
|
|
||||||
<Button Name="LaunchButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessLaunchButton)</Button>
|
|
||||||
<Text Name="SuccessRestartText" X="185" Y="-51" Width="400" Height="34" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.SuccessRestartText)</Text>
|
|
||||||
<Button Name="SuccessRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessRestartButton)</Button>
|
|
||||||
<Button Name="SuccessCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.SuccessCloseButton)</Button>
|
|
||||||
</Page>
|
|
||||||
<Page Name="Failure">
|
|
||||||
<Text X="185" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.Title)</Text>
|
|
||||||
<Image X="11" Y="11" Width="165" Height="400" ImageFile="logoside.png"/>
|
|
||||||
<Text Name="FailureHeader" X="185" Y="50" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureHeader)</Text>
|
|
||||||
<Text Name="FailureInstallHeader" X="185" Y="50" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureInstallHeader)</Text>
|
|
||||||
<Text Name="FailureUninstallHeader" X="185" Y="50" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureUninstallHeader)</Text>
|
|
||||||
<Text Name="FailureRepairHeader" X="185" Y="50" Width="-11" Height="30" FontId="2" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureRepairHeader)</Text>
|
|
||||||
<Hypertext Name="FailureLogFileLink" X="185" Y="121" Width="-11" Height="68" FontId="3" TabStop="yes" HideWhenDisabled="yes">#(loc.FailureHyperlinkLogText)</Hypertext>
|
|
||||||
<Hypertext Name="FailureMessageText" X="185" Y="-80" Width="-11" Height="140" FontId="5" TabStop="yes" HideWhenDisabled="yes" />
|
|
||||||
<Text Name="FailureRestartText" X="185" Y="-57" Width="-11" Height="80" FontId="3" HideWhenDisabled="yes" DisablePrefix="yes">#(loc.FailureRestartText)</Text>
|
|
||||||
<Button Name="FailureRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.FailureRestartButton)</Button>
|
|
||||||
<Button Name="FailureCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.FailureCloseButton)</Button>
|
|
||||||
</Page>
|
|
||||||
</Theme>
|
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
|
||||||
|
|
||||||
|
|
||||||
|
<WixLocalization Culture="en-us" Language="1033" xmlns="http://wixtoolset.org/schemas/v4/wxl">
|
||||||
|
<String Id="Caption" Value="[WixBundleName] Setup" />
|
||||||
|
<String Id="Title" Value="[WixBundleName]" />
|
||||||
|
<String Id="InstallHeader" Value="Welcome" />
|
||||||
|
<String Id="InstallMessage" Value="Setup will install [WixBundleName] on your computer." />
|
||||||
|
<String Id="InstallVersion" Value="Version [WixBundleVersion]" />
|
||||||
|
<String Id="CheckingForUpdatesLabel" Value="Checking for updates" />
|
||||||
|
<String Id="UpdateButton" Value="&Update to version [WixStdBAUpdateAvailable]" />
|
||||||
|
<String Id="InstallVersion" Value="Version [WixBundleVersion]" />
|
||||||
|
<String Id="ConfirmCancelMessage" Value="Are you sure you want to cancel?" />
|
||||||
|
<String Id="ExecuteUpgradeRelatedBundleMessage" Value="Previous version" />
|
||||||
|
<String Id="HelpHeader" Value="Setup Help" />
|
||||||
|
<String Id="HelpText" Value="/install | /repair | /uninstall | /layout [directory] - installs, repairs, uninstalls or
 creates a complete local copy of the bundle in directory. Install is the default.

/passive | /quiet - displays minimal UI with no prompts or displays no UI and
 no prompts. By default UI and all prompts are displayed.

/norestart - suppress any attempts to restart. By default UI will prompt before restart.
/log log.txt - logs to a specific file. By default a log file is created in %TEMP%." />
|
||||||
|
<String Id="HelpCloseButton" Value="&Close" />
|
||||||
|
<String Id="InstallAcceptCheckbox" Value="I &agree to the license terms and conditions" />
|
||||||
|
<String Id="InstallOptionsButton" Value="&Options" />
|
||||||
|
<String Id="InstallInstallButton" Value="&Install" />
|
||||||
|
<String Id="InstallCancelButton" Value="&Cancel" />
|
||||||
|
<String Id="OptionsHeader" Value="Setup Options" />
|
||||||
|
<String Id="OptionsLocationLabel" Value="Install location:" />
|
||||||
|
<String Id="OptionsBrowseButton" Value="&Browse" />
|
||||||
|
<String Id="OptionsOkButton" Value="&OK" />
|
||||||
|
<String Id="OptionsCancelButton" Value="&Cancel" />
|
||||||
|
<String Id="ProgressHeader" Value="Setup Progress" />
|
||||||
|
<String Id="ProgressLabel" Value="Processing:" />
|
||||||
|
<String Id="OverallProgressPackageText" Value="Initializing..." />
|
||||||
|
<String Id="ProgressCancelButton" Value="&Cancel" />
|
||||||
|
<String Id="ModifyHeader" Value="Modify Setup" />
|
||||||
|
<String Id="ModifyRepairButton" Value="&Repair" />
|
||||||
|
<String Id="ModifyUninstallButton" Value="&Uninstall" />
|
||||||
|
<String Id="ModifyCancelButton" Value="&Cancel" />
|
||||||
|
<String Id="SuccessHeader" Value="Setup Successful" />
|
||||||
|
<String Id="SuccessCacheHeader" Value="Cache Successfully Completed" />
|
||||||
|
<String Id="SuccessInstallHeader" Value="Installation Successfully Completed" />
|
||||||
|
<String Id="SuccessLayoutHeader" Value="Layout Successfully Completed" />
|
||||||
|
<String Id="SuccessModifyHeader" Value="Modify Successfully Completed" />
|
||||||
|
<String Id="SuccessRepairHeader" Value="Repair Successfully Completed" />
|
||||||
|
<String Id="SuccessUninstallHeader" Value="Uninstall Successfully Completed" />
|
||||||
|
<String Id="SuccessUnsafeUninstallHeader" Value="Uninstall Successfully Completed" />
|
||||||
|
<String Id="SuccessLaunchButton" Value="&Launch" />
|
||||||
|
<String Id="SuccessRestartText" Value="You must restart your computer before you can use the software." />
|
||||||
|
<String Id="SuccessUninstallRestartText" Value="You must restart your computer to complete the removal of the software." />
|
||||||
|
<String Id="SuccessRestartButton" Value="&Restart" />
|
||||||
|
<String Id="SuccessCloseButton" Value="&Close" />
|
||||||
|
<String Id="FailureHeader" Value="Setup Failed" />
|
||||||
|
<String Id="FailureCacheHeader" Value="Cache Failed" />
|
||||||
|
<String Id="FailureInstallHeader" Value="Setup Failed" />
|
||||||
|
<String Id="FailureLayoutHeader" Value="Layout Failed" />
|
||||||
|
<String Id="FailureModifyHeader" Value="Modify Failed" />
|
||||||
|
<String Id="FailureRepairHeader" Value="Repair Failed" />
|
||||||
|
<String Id="FailureUninstallHeader" Value="Uninstall Failed" />
|
||||||
|
<String Id="FailureUnsafeUninstallHeader" Value="Uninstall Failed" />
|
||||||
|
<String Id="FailureHyperlinkLogText" Value="One or more issues caused the setup to fail. Please fix the issues and then retry setup. For more information see the <a href="#">log file</a>." />
|
||||||
|
<String Id="FailureRestartText" Value="You must restart your computer to complete the rollback of the software." />
|
||||||
|
<String Id="FailureRestartButton" Value="&Restart" />
|
||||||
|
<String Id="FailureCloseButton" Value="&Close" />
|
||||||
|
<String Id="FilesInUseTitle" Value="Files In Use" />
|
||||||
|
<String Id="FilesInUseLabel" Value="The following applications are using files that need to be updated:" />
|
||||||
|
<String Id="FilesInUseNetfxCloseRadioButton" Value="Close the &applications." />
|
||||||
|
<String Id="FilesInUseCloseRadioButton" Value="Close the &applications and attempt to restart them." />
|
||||||
|
<String Id="FilesInUseDontCloseRadioButton" Value="&Do not close applications. A reboot will be required." />
|
||||||
|
<String Id="FilesInUseRetryButton" Value="&Retry" />
|
||||||
|
<String Id="FilesInUseIgnoreButton" Value="&Ignore" />
|
||||||
|
<String Id="FilesInUseExitButton" Value="E&xit" />
|
||||||
|
</WixLocalization>
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
|
||||||
|
|
||||||
|
|
||||||
|
<Theme xmlns="http://wixtoolset.org/schemas/v4/thmutil">
|
||||||
|
<Font Id="0" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
|
||||||
|
<Font Id="1" Height="-24" Weight="500" Foreground="windowtext">Segoe UI</Font>
|
||||||
|
<Font Id="2" Height="-22" Weight="500" Foreground="graytext">Segoe UI</Font>
|
||||||
|
<Font Id="3" Height="-12" Weight="500" Foreground="windowtext" Background="window">Segoe UI</Font>
|
||||||
|
|
||||||
|
<Window Width="600" Height="450" HexStyle="100a0000" FontId="0" Caption="#(loc.Caption)" IconFile="Cryptobot.ico">
|
||||||
|
<Page Name="Help">
|
||||||
|
<Label X="80" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.Title)</Label>
|
||||||
|
<ImageControl X="11" Y="11" Width="64" Height="64" ImageFile="logo.png"/>
|
||||||
|
<Label X="11" Y="80" Width="-11" Height="32" FontId="2" DisablePrefix="yes">#(loc.HelpHeader)</Label>
|
||||||
|
<Label X="11" Y="121" Width="-11" Height="-35" FontId="3" DisablePrefix="yes">#(loc.HelpText)</Label>
|
||||||
|
<Button Name="HelpCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
|
||||||
|
<Text>#(loc.HelpCloseButton)</Text>
|
||||||
|
<CloseWindowAction />
|
||||||
|
</Button>
|
||||||
|
</Page>
|
||||||
|
<Page Name="Loading">
|
||||||
|
<Label X="185" Y="50" Width="-11" Height="30" FontId="2" DisablePrefix="yes" Visible="no" Name="CheckingForUpdatesLabel" />
|
||||||
|
</Page>
|
||||||
|
<Page Name="Install">
|
||||||
|
<ImageControl X="11" Y="11" Width="165" Height="400" ImageFile="logoside.png"/>
|
||||||
|
<Label X="185" Y="11" Width="-11" Height="32" FontId="2" DisablePrefix="yes">#(loc.InstallHeader)</Label>
|
||||||
|
<Label X="185" Y="50" Width="-11" Height="64" FontId="3" DisablePrefix="yes">
|
||||||
|
<Text Condition="WixStdBASuppressOptionsUI">#(loc.InstallMessage)</Text>
|
||||||
|
<Text Condition="NOT WixStdBASuppressOptionsUI">#(loc.InstallMessageOptions)</Text>
|
||||||
|
</Label>
|
||||||
|
<Richedit Name="EulaRichedit" X="185" Y="91" Width="-12" Height="-64" HexStyle="0x00800000" TabStop="yes" FontId="0" />
|
||||||
|
<Checkbox Name="EulaAcceptCheckbox" X="185" Y="-39" Width="-11" Height="17" TabStop="yes" FontId="3" HideWhenDisabled="yes">#(loc.InstallAcceptCheckbox)</Checkbox>
|
||||||
|
<Label Name="InstallVersion" X="11" Y="-11" Width="165" Height="17" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBAShowVersion">#(loc.InstallVersion)</Label>
|
||||||
|
<Button Name="InstallUpdateButton" X="11" Y="-11" Width="200" Height="23" TabStop="yes" FontId="0" EnableCondition="WixStdBAUpdateAvailable" HideWhenDisabled="yes">#(loc.UpdateButton)</Button>
|
||||||
|
<Button Name="OptionsButton" X="-171" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" VisibleCondition="NOT WixStdBASuppressOptionsUI">
|
||||||
|
<Text>#(loc.InstallOptionsButton)</Text>
|
||||||
|
<ChangePageAction Page="Options" />
|
||||||
|
</Button>
|
||||||
|
<Button Name="InstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.InstallInstallButton)</Button>
|
||||||
|
<Button Name="InstallCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
|
||||||
|
<Text>#(loc.InstallCancelButton)</Text>
|
||||||
|
<CloseWindowAction />
|
||||||
|
</Button>
|
||||||
|
</Page>
|
||||||
|
<Page Name="Options">
|
||||||
|
<Label X="80" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.Title)</Label>
|
||||||
|
<ImageControl X="11" Y="11" Width="64" Height="64" ImageFile="logo.png"/>
|
||||||
|
<Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.OptionsHeader)</Label>
|
||||||
|
<Label X="11" Y="121" Width="-11" Height="17" FontId="3">#(loc.OptionsLocationLabel)</Label>
|
||||||
|
<Editbox Name="InstallFolder" X="11" Y="143" Width="-91" Height="21" TabStop="yes" FontId="3" FileSystemAutoComplete="yes" />
|
||||||
|
<Button Name="BrowseButton" X="-11" Y="142" Width="75" Height="23" TabStop="yes" FontId="3">
|
||||||
|
<Text>#(loc.OptionsBrowseButton)</Text>
|
||||||
|
<BrowseDirectoryAction VariableName="InstallFolder" />
|
||||||
|
</Button>
|
||||||
|
<Button Name="OptionsOkButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
|
||||||
|
<Text>#(loc.OptionsOkButton)</Text>
|
||||||
|
<ChangePageAction Page="Install" />
|
||||||
|
</Button>
|
||||||
|
<Button Name="OptionsCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
|
||||||
|
<Text>#(loc.OptionsCancelButton)</Text>
|
||||||
|
<ChangePageAction Page="Install" Cancel="yes" />
|
||||||
|
</Button>
|
||||||
|
</Page>
|
||||||
|
<Page Name="Progress">
|
||||||
|
<Label X="80" Y="11" Width="-11" Height="32" FontId="1" DisablePrefix="yes">#(loc.Title)</Label>
|
||||||
|
<ImageControl X="11" Y="11" Width="64" Height="64" ImageFile="logo.png"/>
|
||||||
|
<Label X="11" Y="80" Width="-11" Height="30" FontId="2" DisablePrefix="yes">#(loc.ProgressHeader)</Label>
|
||||||
|
<Label X="11" Y="141" Width="70" Height="17" FontId="3" DisablePrefix="yes">#(loc.ProgressLabel)</Label>
|
||||||
|
<Label Name="OverallProgressPackageText" X="85" Y="141" Width="-11" Height="17" FontId="3" DisablePrefix="yes">#(loc.OverallProgressPackageText)</Label>
|
||||||
|
<Progressbar Name="OverallCalculatedProgressbar" X="11" Y="163" Width="-11" Height="20" />
|
||||||
|
<Button Name="ProgressCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ProgressCancelButton)</Button>
|
||||||
|
</Page>
|
||||||
|
<Page Name="Modify">
|
||||||
|
<ImageControl X="11" Y="11" Width="165" Height="400" ImageFile="logoside.png"/>
|
||||||
|
<Label X="185" Y="11" Width="-11" Height="32" FontId="2" DisablePrefix="yes">#(loc.ModifyHeader)</Label>
|
||||||
|
<Label Name="InstallVersion" X="11" Y="-11" Width="-11" Height="17" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBAShowVersion">#(loc.InstallVersion)</Label>
|
||||||
|
<Button Name="ModifyUpdateButton" X="11" Y="-11" Width="200" Height="23" TabStop="yes" FontId="0" EnableCondition="WixStdBAUpdateAvailable" HideWhenDisabled="yes">#(loc.UpdateButton)</Button>
|
||||||
|
<Button Name="RepairButton" X="-171" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.ModifyRepairButton)</Button>
|
||||||
|
<Button Name="UninstallButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">#(loc.ModifyUninstallButton)</Button>
|
||||||
|
<Button Name="ModifyCancelButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
|
||||||
|
<Text>#(loc.ModifyCancelButton)</Text>
|
||||||
|
<CloseWindowAction />
|
||||||
|
</Button>
|
||||||
|
</Page>
|
||||||
|
<Page Name="Success">
|
||||||
|
<ImageControl X="11" Y="11" Width="165" Height="400" ImageFile="logoside.png"/>
|
||||||
|
<Label X="185" Y="11" Width="-11" Height="32" FontId="2" DisablePrefix="yes">
|
||||||
|
<Text>#(loc.SuccessHeader)</Text>
|
||||||
|
<Text Condition="WixBundleAction = 2">#(loc.SuccessLayoutHeader)</Text>
|
||||||
|
<Text Condition="WixBundleAction = 3">#(loc.SuccessUnsafeUninstallHeader)</Text>
|
||||||
|
<Text Condition="WixBundleAction = 4">#(loc.SuccessUninstallHeader)</Text>
|
||||||
|
<Text Condition="WixBundleAction = 5">#(loc.SuccessCacheHeader)</Text>
|
||||||
|
<Text Condition="WixBundleAction = 6">#(loc.SuccessInstallHeader)</Text>
|
||||||
|
<Text Condition="WixBundleAction = 7">#(loc.SuccessModifyHeader)</Text>
|
||||||
|
<Text Condition="WixBundleAction = 8">#(loc.SuccessRepairHeader)</Text>
|
||||||
|
</Label>
|
||||||
|
<Button Name="LaunchButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessLaunchButton)</Button>
|
||||||
|
<Label X="185" Y="-51" Width="400" Height="34" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBARestartRequired">
|
||||||
|
<Text>#(loc.SuccessRestartText)</Text>
|
||||||
|
<Text Condition="WixBundleAction = 3">#(loc.SuccessUninstallRestartText)</Text>
|
||||||
|
</Label>
|
||||||
|
<Label Name="InstallVersion" X="11" Y="-11" Width="165" Height="17" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBAShowVersion">#(loc.InstallVersion)</Label>
|
||||||
|
<Button Name="SuccessRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.SuccessRestartButton)</Button>
|
||||||
|
<Button Name="SuccessCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
|
||||||
|
<Text>#(loc.SuccessCloseButton)</Text>
|
||||||
|
<CloseWindowAction />
|
||||||
|
</Button>
|
||||||
|
</Page>
|
||||||
|
<Page Name="Failure">
|
||||||
|
<ImageControl X="11" Y="11" Width="165" Height="400" ImageFile="logoside.png"/>
|
||||||
|
<Label X="185" Y="11" Width="-11" Height="32" FontId="2" DisablePrefix="yes">
|
||||||
|
<Text>#(loc.FailureHeader)</Text>
|
||||||
|
<Text Condition="WixBundleAction = 2">#(loc.FailureLayoutHeader)</Text>
|
||||||
|
<Text Condition="WixBundleAction = 3">#(loc.FailureUnsafeUninstallHeader)</Text>
|
||||||
|
<Text Condition="WixBundleAction = 4">#(loc.FailureUninstallHeader)</Text>
|
||||||
|
<Text Condition="WixBundleAction = 5">#(loc.FailureCacheHeader)</Text>
|
||||||
|
<Text Condition="WixBundleAction = 6">#(loc.FailureInstallHeader)</Text>
|
||||||
|
<Text Condition="WixBundleAction = 7">#(loc.FailureModifyHeader)</Text>
|
||||||
|
<Text Condition="WixBundleAction = 8">#(loc.FailureRepairHeader)</Text>
|
||||||
|
</Label>
|
||||||
|
<Hypertext Name="FailureLogFileLink" X="185" Y="121" Width="-11" Height="68" FontId="3" TabStop="yes" HideWhenDisabled="yes">#(loc.FailureHyperlinkLogText)</Hypertext>
|
||||||
|
<Hypertext Name="FailureMessageText" X="185" Y="-115" Width="-11" Height="80" FontId="3" TabStop="yes" HideWhenDisabled="yes" />
|
||||||
|
<Label Name="InstallVersion" X="11" Y="-11" Width="165" Height="17" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBAShowVersion">#(loc.InstallVersion)</Label>
|
||||||
|
<Label X="185" Y="-57" Width="-11" Height="80" FontId="3" DisablePrefix="yes" VisibleCondition="WixStdBARestartRequired">#(loc.FailureRestartText)</Label>
|
||||||
|
<Button Name="FailureRestartButton" X="-91" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0" HideWhenDisabled="yes">#(loc.FailureRestartButton)</Button>
|
||||||
|
<Button Name="FailureCloseButton" X="-11" Y="-11" Width="75" Height="23" TabStop="yes" FontId="0">
|
||||||
|
<Text>#(loc.FailureCloseButton)</Text>
|
||||||
|
<CloseWindowAction />
|
||||||
|
</Button>
|
||||||
|
</Page>
|
||||||
|
</Window>
|
||||||
|
</Theme>
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
@echo off
|
||||||
|
:: Batch wrapper for PowerShell script to modify Cryptomator update check settings
|
||||||
|
:: This is executed as a Custom Action during MSI installation
|
||||||
|
:: This file must be located in the INSTALLDIR
|
||||||
|
|
||||||
|
set "DISABLEUPDATECHECK=%~1"
|
||||||
|
|
||||||
|
:: Log for debugging
|
||||||
|
echo DISABLEUPDATECHECK=%DISABLEUPDATECHECK%
|
||||||
|
|
||||||
|
:: Change to INSTALLDIR
|
||||||
|
cd %~dp0
|
||||||
|
:: Execute the PowerShell script
|
||||||
|
powershell.exe -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -File ".\patchUpdateCheck.ps1"^
|
||||||
|
-DisableUpdateCheck "%DISABLEUPDATECHECK%"
|
||||||
|
|
||||||
|
:: Return the exit code from PowerShell
|
||||||
|
exit /b %ERRORLEVEL%
|
||||||
+58
@@ -0,0 +1,58 @@
|
|||||||
|
# PowerShell script to modify Cryptomator.cfg to set disableUpdateCheck property
|
||||||
|
# This script is executed as a Custom Action during MSI installation
|
||||||
|
# If the DisableUpdateCheck parameter is set to true, it disables the update check in Cryptomator by modifying the Cryptomator.cfg file.
|
||||||
|
# NOTE: This file must be located in the same directory as set in the MSI property INSTALLDIR
|
||||||
|
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory)][string]$DisableUpdateCheck
|
||||||
|
)
|
||||||
|
|
||||||
|
try {
|
||||||
|
# Log parameters for debugging (visible in MSI verbose logs)
|
||||||
|
Write-Host "DisableUpdateCheck: $DisableUpdateCheck"
|
||||||
|
|
||||||
|
# Parse DisableUpdateCheck value (handle various input formats)
|
||||||
|
$shouldDisable = $false
|
||||||
|
if ($DisableUpdateCheck) {
|
||||||
|
$DisableUpdateCheck = $DisableUpdateCheck.Trim().ToLower()
|
||||||
|
$shouldDisable = ($DisableUpdateCheck -eq 'true') -or ($DisableUpdateCheck -eq '1') -or ($DisableUpdateCheck -eq 'yes')
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "Setting cryptomator.disableUpdateCheck to: $shouldDisable"
|
||||||
|
if (-not $shouldDisable) {
|
||||||
|
Write-Host 'Disable-Update-Check property is by default "false". Skipping config modification.'
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Determine the .cfg file path
|
||||||
|
$cfgDir = Join-Path $PSScriptRoot 'app'
|
||||||
|
$cfgFiles = Get-ChildItem -Path $cfgDir -Filter '*.cfg' -File
|
||||||
|
|
||||||
|
if ($cfgFiles.Count -eq 0) {
|
||||||
|
Write-Error "No .cfg file found in directory: $cfgDir"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($file in $cfgFiles) {
|
||||||
|
$cfgFile = $file.FullName
|
||||||
|
Write-Host "Modifying configuration file: $cfgFile"
|
||||||
|
# Read the current configuration
|
||||||
|
$content = Get-Content $cfgFile -Raw -ErrorAction Stop
|
||||||
|
|
||||||
|
# Add the new option based on the property value
|
||||||
|
# Use regular expressions substitutions to replace the property
|
||||||
|
$searchExpression = '(?<Prefix>java-options=-Dcryptomator\.disableUpdateCheck)=false'
|
||||||
|
$replacementExpression = '${Prefix}=true'
|
||||||
|
$content = $content -replace $searchExpression,$replacementExpression
|
||||||
|
|
||||||
|
# Write the modified content back
|
||||||
|
Set-Content -Path $cfgFile -Value $content -NoNewline
|
||||||
|
Write-Host "Successfully updated $cfgFile"
|
||||||
|
}
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Error "Error modifying configuration file: $_"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
Vendored
+15
-4
@@ -1,7 +1,18 @@
|
|||||||
@echo off
|
@echo off
|
||||||
:: Default values for Cryptomator builds
|
:: Batch wrapper for PowerShell script to adjust Windows network settings for the Cryptomator WebDAVAdapter
|
||||||
::REPLACE ME
|
:: This is executed as a Custom Action during MSI installation
|
||||||
|
:: This file must be located in the INSTALLDIR
|
||||||
|
|
||||||
|
set "LOOPBACK_ALIAS=%1"
|
||||||
|
|
||||||
|
:: Log for debugging
|
||||||
|
echo LOOPBACK_ALIAS=%LOOPBACK_ALIAS%
|
||||||
|
|
||||||
|
:: Change to INSTALLDIR
|
||||||
cd %~dp0
|
cd %~dp0
|
||||||
powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -Command .\patchWebDAV.ps1^
|
:: Execute the PowerShell script
|
||||||
-LoopbackAlias %LOOPBACK_ALIAS%
|
powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -File .\patchWebDAV.ps1^
|
||||||
|
-LoopbackAlias %LOOPBACK_ALIAS%
|
||||||
|
|
||||||
|
:: Return the exit code from PowerShell
|
||||||
|
exit /b %ERRORLEVEL%
|
||||||
Vendored
+4
@@ -0,0 +1,4 @@
|
|||||||
|
win-console=true
|
||||||
|
win-shortcut=false
|
||||||
|
win-menu=false
|
||||||
|
description=Debug Launcher with Console for Cryptomator
|
||||||
Vendored
-14
@@ -1,14 +0,0 @@
|
|||||||
@echo off
|
|
||||||
java ^
|
|
||||||
-p "mods" ^
|
|
||||||
-cp "libs/*" ^
|
|
||||||
-Dcryptomator.settingsPath="~/AppData/Roaming/Cryptomator/settings.json" ^
|
|
||||||
-Dcryptomator.ipcSocketPath="~/AppData/Roaming/Cryptomator/ipc.socket" ^
|
|
||||||
-Dcryptomator.logDir="~/AppData/Roaming/Cryptomator" ^
|
|
||||||
-Dcryptomator.mountPointsDir="~/Cryptomator" ^
|
|
||||||
-Dcryptomator.keychainPath="~/AppData/Roaming/Cryptomator/keychain.json" ^
|
|
||||||
-Xss20m ^
|
|
||||||
-Xmx512m ^
|
|
||||||
--enable-preview `
|
|
||||||
--enable-native-access=org.cryptomator.jfuse.win `
|
|
||||||
-m org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator
|
|
||||||
Vendored
-109
@@ -1,109 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Include>
|
|
||||||
<Fragment>
|
|
||||||
<!-- copy pasta from https://github.com/wixtoolset/wix3/blob/develop/src/ext/UIExtension/wixlib/WixUI_InstallDir.wxs with custom exit dialog-->
|
|
||||||
<UI Id="CustomWizard">
|
|
||||||
<TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
|
|
||||||
<TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
|
|
||||||
<TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
|
|
||||||
|
|
||||||
<Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
|
|
||||||
<Property Id="WixUI_Mode" Value="InstallDir" />
|
|
||||||
|
|
||||||
<DialogRef Id="BrowseDlg" />
|
|
||||||
<DialogRef Id="DiskCostDlg" />
|
|
||||||
<DialogRef Id="ErrorDlg" />
|
|
||||||
<DialogRef Id="FilesInUse" />
|
|
||||||
<DialogRef Id="MsiRMFilesInUse" />
|
|
||||||
<DialogRef Id="PrepareDlg" />
|
|
||||||
<DialogRef Id="ProgressDlg" />
|
|
||||||
<DialogRef Id="ResumeDlg" />
|
|
||||||
<DialogRef Id="UserExit" />
|
|
||||||
|
|
||||||
<Publish Dialog="BrowseDlg" Control="OK" Event="DoAction" Value="WixUIValidatePath" Order="3">1</Publish>
|
|
||||||
<Publish Dialog="BrowseDlg" Control="OK" Event="SpawnDialog" Value="InvalidDirDlg" Order="4"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
|
|
||||||
|
|
||||||
<!-- custom end dialogs -->
|
|
||||||
<Publish Dialog="MyExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
|
|
||||||
<Publish Dialog="MyFatalErrorDlg" Control="Finish" Event="EndDialog" Value="Return" Order="998">1</Publish>
|
|
||||||
|
|
||||||
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg">NOT Installed</Publish>
|
|
||||||
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish>
|
|
||||||
|
|
||||||
<Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
|
|
||||||
<Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg">LicenseAccepted = "1"</Publish>
|
|
||||||
|
|
||||||
<Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg">1</Publish>
|
|
||||||
<Publish Dialog="InstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
|
|
||||||
<Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="WixUIValidatePath" Order="2">NOT WIXUI_DONTVALIDATEPATH</Publish>
|
|
||||||
<Publish Dialog="InstallDirDlg" Control="Next" Event="SpawnDialog" Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
|
|
||||||
<Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="4">WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"</Publish>
|
|
||||||
<Publish Dialog="InstallDirDlg" Control="ChangeFolder" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
|
|
||||||
<Publish Dialog="InstallDirDlg" Control="ChangeFolder" Event="SpawnDialog" Value="BrowseDlg" Order="2">1</Publish>
|
|
||||||
|
|
||||||
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="InstallDirDlg" Order="1">NOT Installed</Publish>
|
|
||||||
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish>
|
|
||||||
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">Installed AND PATCH</Publish>
|
|
||||||
|
|
||||||
<Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
|
|
||||||
|
|
||||||
<Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
|
|
||||||
<Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
|
|
||||||
<Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
|
|
||||||
|
|
||||||
<Property Id="ARPNOMODIFY" Value="1" />
|
|
||||||
|
|
||||||
<!-- copy pasta from https://github.com/wixtoolset/wix3/blob/develop/src/ext/UIExtension/wixlib/ExitDialog.wxs with adjustments-->
|
|
||||||
<Dialog Id="MyExitDialog" Width="370" Height="270" Title="!(loc.ExitDialog_Title)">
|
|
||||||
<Control Id="Finish" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="!(loc.WixUIFinish)" />
|
|
||||||
<Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUICancel)" />
|
|
||||||
<Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="!(loc.ExitDialogBitmap)" />
|
|
||||||
<Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUIBack)" />
|
|
||||||
<Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
|
|
||||||
<Control Id="Description" Type="Text" X="135" Y="70" Width="220" Height="40" Transparent="yes" NoPrefix="yes" Text="!(loc.ExitDialogDescription)" />
|
|
||||||
|
|
||||||
<Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes" Text="!(loc.ExitDialogTitle)" />
|
|
||||||
<!-- TODO: localize? -->
|
|
||||||
<Control Id="Suggestion" Type="Text" X="135" Y="100" Width="220" Height="60" Transparent="yes" NoPrefix="yes">
|
|
||||||
<Text>We recommend for the best user experience to download and install the following third party Windows driver:</Text>
|
|
||||||
</Control>
|
|
||||||
<Control Id="WinFsp" Type="Hyperlink" X="140" Y="125" Width="220" Height="60" Transparent="yes">
|
|
||||||
<Text><![CDATA[WinFsp (<a href="https://winfsp.dev/">Homepage</a>)]]></Text>
|
|
||||||
</Control>
|
|
||||||
</Dialog>
|
|
||||||
|
|
||||||
<!-- copy pasta from https://github.com/wixtoolset/wix3/blob/develop/src/ext/UIExtension/wixlib/FatalError.wxs with adjustments-->
|
|
||||||
<Dialog Id="MyFatalErrorDlg" Width="370" Height="270" Title="!(loc.FatalError_Title)">
|
|
||||||
<Control Id="Finish" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="!(loc.WixUIFinish)">
|
|
||||||
<Publish Event="EndDialog" Value="Exit">1</Publish>
|
|
||||||
</Control>
|
|
||||||
<Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUICancel)" />
|
|
||||||
<Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="!(loc.FatalErrorBitmap)" />
|
|
||||||
<Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUIBack)" />
|
|
||||||
<Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
|
|
||||||
<Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes" Text="!(loc.FatalErrorTitle)" />
|
|
||||||
<Control Id="Description" Type="Text" X="135" Y="70" Width="220" Height="80" Transparent="yes" NoPrefix="yes" Text="!(loc.FatalErrorDescription1) !(loc.FatalErrorDescription2)" />
|
|
||||||
<Control Id="DescriptionReason1" Type="Text" X="135" Y="160" Width="220" Height="20" Transparent="yes" NoPrefix="yes" Hidden="yes" >
|
|
||||||
<Text>Reason:</Text>
|
|
||||||
<Condition Action="show">FOUNDRUNNINGAPP</Condition>
|
|
||||||
</Control>
|
|
||||||
<Control Id="DescriptionReason2" Type="Text" X="135" Y="170" Width="220" Height="40" Transparent="yes" NoPrefix="yes" Hidden="yes" >
|
|
||||||
<Text>Application to update was still running during installation.</Text>
|
|
||||||
<Condition Action="show">FOUNDRUNNINGAPP</Condition>
|
|
||||||
</Control>
|
|
||||||
</Dialog>
|
|
||||||
|
|
||||||
<InstallUISequence>
|
|
||||||
<Show Dialog="MyExitDialog" Overridable="yes" OnExit="success"/>
|
|
||||||
<Show Dialog="MyFatalErrorDlg" Overridable="yes" OnExit="error"/>
|
|
||||||
</InstallUISequence>
|
|
||||||
<AdminUISequence>
|
|
||||||
<Show Dialog="MyExitDialog" Overridable="yes" OnExit="success"/>
|
|
||||||
<Show Dialog="MyFatalErrorDlg" Overridable="yes" OnExit="error"/>
|
|
||||||
</AdminUISequence>
|
|
||||||
|
|
||||||
</UI>
|
|
||||||
|
|
||||||
<UIRef Id="WixUI_Common" />
|
|
||||||
</Fragment>
|
|
||||||
</Include>
|
|
||||||
Vendored
+116
-115
@@ -1,6 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
|
<ns0:Wix xmlns:ns0="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util" >
|
||||||
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
|
|
||||||
|
|
||||||
<?ifdef JpIsSystemWide ?>
|
<?ifdef JpIsSystemWide ?>
|
||||||
<?define JpInstallScope="perMachine"?>
|
<?define JpInstallScope="perMachine"?>
|
||||||
@@ -27,177 +26,179 @@
|
|||||||
<?define IconFileEncryptedData= "Cryptomator-Vault.ico" ?>
|
<?define IconFileEncryptedData= "Cryptomator-Vault.ico" ?>
|
||||||
<?define ProgIdContentType= "application/vnd.cryptomator.encrypted" ?>
|
<?define ProgIdContentType= "application/vnd.cryptomator.encrypted" ?>
|
||||||
<?define CloseApplicationTarget= "cryptomator.exe" ?>
|
<?define CloseApplicationTarget= "cryptomator.exe" ?>
|
||||||
|
<?define LoopbackAlias= "cryptomator-vault" ?>
|
||||||
|
|
||||||
<?include $(var.JpConfigDir)/overrides.wxi ?>
|
<?include $(var.JpConfigDir)/overrides.wxi ?>
|
||||||
|
|
||||||
<Product
|
<ns0:Package
|
||||||
Id="$(var.JpProductCode)"
|
Name="$(var.JpAppName)"
|
||||||
Name="$(var.JpAppName)"
|
Language="$(var.JpProductLanguage)"
|
||||||
Language="$(var.JpProductLanguage)"
|
Version="$(var.JpAppVersion)"
|
||||||
Version="$(var.JpAppVersion)"
|
Manufacturer="$(var.JpAppVendor)"
|
||||||
Manufacturer="$(var.JpAppVendor)"
|
UpgradeCode="$(var.JpProductUpgradeCode)"
|
||||||
UpgradeCode="$(var.JpProductUpgradeCode)">
|
InstallerVersion="$(var.JpInstallerVersion)"
|
||||||
|
Compressed="$(var.JpCompressedMsi)"
|
||||||
|
ProductCode="$(var.JpProductCode)"
|
||||||
|
Scope="$(var.JpInstallScope)">
|
||||||
|
|
||||||
<Package
|
<ns0:SummaryInformation Manufacturer="$(var.JpAppVendor)" Description="$(var.JpAppDescription)"/>
|
||||||
Description="$(var.JpAppDescription)"
|
<ns0:Media Id="1" Cabinet="Data.cab" EmbedCab="yes" />
|
||||||
Manufacturer="$(var.JpAppVendor)"
|
|
||||||
InstallerVersion="$(var.JpInstallerVersion)"
|
|
||||||
Compressed="$(var.JpCompressedMsi)"
|
|
||||||
InstallScope="$(var.JpInstallScope)" Platform="x64"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<Media Id="1" Cabinet="Data.cab" EmbedCab="yes" />
|
|
||||||
|
|
||||||
<Upgrade Id="$(var.JpProductUpgradeCode)">
|
<ns0:Upgrade Id="$(var.JpProductUpgradeCode)">
|
||||||
<UpgradeVersion
|
<ns0:UpgradeVersion
|
||||||
OnlyDetect="$(var.JpUpgradeVersionOnlyDetectUpgrade)"
|
OnlyDetect="$(var.JpUpgradeVersionOnlyDetectUpgrade)"
|
||||||
Property="JP_UPGRADABLE_FOUND"
|
Property="JP_UPGRADABLE_FOUND"
|
||||||
Maximum="$(var.JpAppVersion)"
|
Maximum="$(var.JpAppVersion)"
|
||||||
MigrateFeatures="yes"
|
MigrateFeatures="yes"
|
||||||
IncludeMaximum="yes" /> <!-- TODO: check if this needs to be set to yes-->
|
IncludeMaximum="$(var.JpUpgradeVersionOnlyDetectUpgrade)"/> <!-- TODO in earlier versions, this was set to yes-->
|
||||||
<UpgradeVersion
|
<ns0:UpgradeVersion
|
||||||
OnlyDetect="$(var.JpUpgradeVersionOnlyDetectDowngrade)"
|
OnlyDetect="$(var.JpUpgradeVersionOnlyDetectDowngrade)"
|
||||||
Property="JP_DOWNGRADABLE_FOUND"
|
Property="JP_DOWNGRADABLE_FOUND"
|
||||||
Minimum="$(var.JpAppVersion)"
|
Minimum="$(var.JpAppVersion)"
|
||||||
MigrateFeatures="yes"
|
MigrateFeatures="yes"
|
||||||
IncludeMinimum="$(var.JpUpgradeVersionOnlyDetectDowngrade)" />
|
IncludeMinimum="$(var.JpUpgradeVersionOnlyDetectDowngrade)" />
|
||||||
</Upgrade>
|
</ns0:Upgrade>
|
||||||
|
|
||||||
<?ifndef JpAllowUpgrades ?>
|
<?ifndef JpAllowUpgrades ?>
|
||||||
<CustomAction Id="JpDisallowUpgrade" Error="!(loc.DisallowUpgradeErrorMessage)" />
|
<ns0:CustomAction Id="JpDisallowUpgrade" Error="!(loc.DisallowUpgradeErrorMessage)" />
|
||||||
<?endif?>
|
<?endif?>
|
||||||
<?ifndef JpAllowDowngrades ?>
|
<?ifndef JpAllowDowngrades ?>
|
||||||
<CustomAction Id="JpDisallowDowngrade" Error="!(loc.DowngradeErrorMessage)" />
|
<ns0:CustomAction Id="JpDisallowDowngrade" Error="!(loc.DowngradeErrorMessage)" />
|
||||||
<?endif?>
|
<?endif?>
|
||||||
|
|
||||||
<Binary Id="JpCaDll" SourceFile="$(env.JP_WIXHELPER_DIR)\wixhelper.dll"/>
|
<!-- TODO: how does this work again? -->
|
||||||
<CustomAction Id="JpFindRelatedProducts" BinaryKey="JpCaDll" DllEntry="FindRelatedProductsEx" />
|
<ns0:Binary Id="JpCaDll" SourceFile="$(env.JP_WIXHELPER_DIR)\wixhelper.dll" />
|
||||||
|
<ns0:CustomAction Id="JpFindRelatedProducts" BinaryRef="JpCaDll" DllEntry="FindRelatedProductsEx" />
|
||||||
|
|
||||||
<?ifndef SkipCryptomatorLegacyCheck ?>
|
<?ifndef SkipCryptomatorLegacyCheck ?>
|
||||||
<!-- Block installation if innosetup entry of Cryptomator is found -->
|
<!-- Block installation if innosetup entry of Cryptomator is found -->
|
||||||
<Property Id="OLDEXEINSTALLER">
|
<ns0:Property Id="OLDEXEINSTALLER">
|
||||||
<RegistrySearch Id="InnoSetupInstallation" Root="HKLM" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\Cryptomator_is1" Type="raw" Name="DisplayName" />
|
<ns0:RegistrySearch Id="InnoSetupInstallation" Root="HKLM" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\Cryptomator_is1" Type="raw" Name="DisplayName" />
|
||||||
</Property>
|
</ns0:Property>
|
||||||
<!-- TODO: localize -->
|
<!-- TODO: localize -->
|
||||||
<Condition Message="A lower version of [ProductName] is already installed. Uninstall it first and then start the setup again. Setup will now exit.">
|
<ns0:Launch Message="A lower version of [ProductName] is already installed. Uninstall it first and then start the setup again. Setup will now exit." Condition="Installed OR NOT OLDEXEINSTALLER" />
|
||||||
<![CDATA[Installed OR NOT OLDEXEINSTALLER]]>
|
|
||||||
</Condition>
|
|
||||||
<?endif?>
|
<?endif?>
|
||||||
<!-- Cryptomator uses UNIX Sockets, which are supported starting with Windows 10 v1803-->
|
<!-- Cryptomator uses UNIX Sockets, which are supported starting with Windows 10 v1803-->
|
||||||
<Property Id="WINDOWSBUILDNUMBER" Secure="yes">
|
<ns0:Property Id="WINDOWSBUILDNUMBER" Secure="yes">
|
||||||
<RegistrySearch Id="BuildNumberSearch" Root="HKLM" Key="SOFTWARE\Microsoft\Windows NT\CurrentVersion" Name="CurrentBuildNumber" Type="raw" />
|
<ns0:RegistrySearch Id="BuildNumberSearch" Root="HKLM" Key="SOFTWARE\Microsoft\Windows NT\CurrentVersion" Name="CurrentBuildNumber" Type="raw" />
|
||||||
</Property>
|
</ns0:Property>
|
||||||
<Condition Message="This application requires Windows 10 version 1803 (build 17134) or newer.">
|
<ns0:Launch Message="This application requires Windows 10 version 1803 (build 17134) or newer." Condition="Installed OR (WINDOWSBUILDNUMBER >= 17134)" />
|
||||||
<![CDATA[Installed OR (WINDOWSBUILDNUMBER >= 17134)]]>
|
|
||||||
</Condition>
|
|
||||||
|
|
||||||
<!-- Non-Opening ProgID -->
|
<!-- Non-Opening ProgID -->
|
||||||
<DirectoryRef Id="INSTALLDIR">
|
<ns0:DirectoryRef Id="INSTALLDIR">
|
||||||
<Component Win64="yes" Id="nonStartingProgID" >
|
<ns0:Component Bitness="always64" Id="nonStartingProgID" >
|
||||||
<File Id="IconFileForEncryptedData" KeyPath="yes" Source="$(env.JP_WIXWIZARD_RESOURCES)\$(var.IconFileEncryptedData)" Name="$(var.IconFileEncryptedData)"></File>
|
<ns0:File Id="IconFileForEncryptedData" KeyPath="yes" Source="$(env.JP_WIXWIZARD_RESOURCES)\$(var.IconFileEncryptedData)" Name="$(var.IconFileEncryptedData)"/>
|
||||||
<ProgId Id="$(var.JpAppName).Encrypted.1" Description="$(var.JpAppName) Encrypted Data" Icon="IconFileForEncryptedData" IconIndex="0">
|
<ns0:ProgId Id="$(var.JpAppName).Encrypted.1" Description="$(var.JpAppName) Encrypted Data" Icon="IconFileForEncryptedData" IconIndex="0">
|
||||||
<Extension Id="c9r" Advertise="no" ContentType="$(var.ProgIdContentType)">
|
<ns0:Extension Id="c9r" Advertise="no" ContentType="$(var.ProgIdContentType)">
|
||||||
<MIME ContentType="$(var.ProgIdContentType)" Default="yes"></MIME>
|
<ns0:MIME ContentType="$(var.ProgIdContentType)" Default="yes"/>
|
||||||
</Extension>
|
</ns0:Extension>
|
||||||
<Extension Id="c9s" Advertise="no" ContentType="$(var.ProgIdContentType)"/>
|
<ns0:Extension Id="c9s" Advertise="no" ContentType="$(var.ProgIdContentType)"/>
|
||||||
</ProgId>
|
</ns0:ProgId>
|
||||||
</Component>
|
</ns0:Component>
|
||||||
</DirectoryRef>
|
</ns0:DirectoryRef>
|
||||||
|
|
||||||
<!-- Standard required root -->
|
<!-- Standard required root -->
|
||||||
<Directory Id="TARGETDIR" Name="SourceDir"/>
|
|
||||||
|
|
||||||
<Feature Id="DefaultFeature" Title="!(loc.MainFeatureTitle)" Level="1">
|
<ns0:Feature Id="DefaultFeature" Title="!(loc.MainFeatureTitle)" Level="1">
|
||||||
<ComponentGroupRef Id="Shortcuts"/>
|
<ns0:ComponentGroupRef Id="Shortcuts"/>
|
||||||
<ComponentGroupRef Id="Files"/>
|
<ns0:ComponentGroupRef Id="Files"/>
|
||||||
<ComponentGroupRef Id="FileAssociations"/>
|
<ns0:ComponentGroupRef Id="FileAssociations"/>
|
||||||
<!-- Ref to additional ProgIDs -->
|
<!-- Ref to additional ProgIDs -->
|
||||||
<ComponentRef Id="nonStartingProgID" />
|
<ns0:ComponentRef Id="nonStartingProgID" />
|
||||||
</Feature>
|
</ns0:Feature>
|
||||||
|
|
||||||
<CustomAction Id="JpSetARPINSTALLLOCATION" Property="ARPINSTALLLOCATION" Value="[INSTALLDIR]" />
|
<ns0:CustomAction Id="JpSetARPINSTALLLOCATION" Property="ARPINSTALLLOCATION" Value="[INSTALLDIR]" />
|
||||||
<CustomAction Id="JpSetARPCOMMENTS" Property="ARPCOMMENTS" Value="$(var.JpAppDescription)" />
|
<ns0:CustomAction Id="JpSetARPCOMMENTS" Property="ARPCOMMENTS" Value="$(var.JpAppDescription)" />
|
||||||
<CustomAction Id="JpSetARPCONTACT" Property="ARPCONTACT" Value="$(var.JpAppVendor)" />
|
<ns0:CustomAction Id="JpSetARPCONTACT" Property="ARPCONTACT" Value="$(var.JpAppVendor)" />
|
||||||
<CustomAction Id="JpSetARPSIZE" Property="ARPSIZE" Value="$(var.JpAppSizeKb)" />
|
<ns0:CustomAction Id="JpSetARPSIZE" Property="ARPSIZE" Value="$(var.JpAppSizeKb)" />
|
||||||
|
|
||||||
<?ifdef JpHelpURL ?>
|
<?ifdef JpHelpURL ?>
|
||||||
<CustomAction Id="JpSetARPHELPLINK" Property="ARPHELPLINK" Value="$(var.JpHelpURL)" />
|
<ns0:CustomAction Id="JpSetARPHELPLINK" Property="ARPHELPLINK" Value="$(var.JpHelpURL)" />
|
||||||
<?endif?>
|
<?endif?>
|
||||||
|
|
||||||
<?ifdef JpAboutURL ?>
|
<?ifdef JpAboutURL ?>
|
||||||
<CustomAction Id="JpSetARPURLINFOABOUT" Property="ARPURLINFOABOUT" Value="$(var.JpAboutURL)" />
|
<ns0:CustomAction Id="JpSetARPURLINFOABOUT" Property="ARPURLINFOABOUT" Value="$(var.JpAboutURL)" />
|
||||||
<?endif?>
|
<?endif?>
|
||||||
|
|
||||||
<?ifdef JpUpdateURL ?>
|
<?ifdef JpUpdateURL ?>
|
||||||
<CustomAction Id="JpSetARPURLUPDATEINFO" Property="ARPURLUPDATEINFO" Value="$(var.JpUpdateURL)" />
|
<ns0:CustomAction Id="JpSetARPURLUPDATEINFO" Property="ARPURLUPDATEINFO" Value="$(var.JpUpdateURL)" />
|
||||||
<?endif?>
|
<?endif?>
|
||||||
|
|
||||||
<Property Id="WixQuietExec64CmdTimeout" Value="20" />
|
<ns0:Property Id="WixQuietExec64CmdTimeout" Value="20" />
|
||||||
<!-- Note for custom actions: Immediate CAs run BEFORE the files are installed, hence if you depend on installed files, the CAs must be deferred.-->
|
<!-- Note for custom actions: Immediate CAs run BEFORE the files are installed, hence if you depend on installed files, the CAs must be deferred.-->
|
||||||
|
|
||||||
|
<!-- Property for controlling update check behavior (can be set via command line) -->
|
||||||
|
<ns0:Property Id="DISABLEUPDATECHECK" Secure="yes" />
|
||||||
|
|
||||||
<!-- WebDAV patches -->
|
<!-- WebDAV patches -->
|
||||||
<SetProperty Id="PatchWebDAV" Value=""[INSTALLDIR]patchWebDAV.bat""
|
<ns0:SetProperty Id="PatchWebDAV" Value=""[INSTALLDIR]patchWebDAV.bat" "$(var.LoopbackAlias)"" Sequence="execute" Before="PatchWebDAV" />
|
||||||
Sequence="execute" Before="PatchWebDAV" />
|
<ns0:CustomAction Id="PatchWebDAV" BinaryRef="Wix4UtilCA_$(sys.BUILDARCHSHORT)" DllEntry="WixQuietExec" Execute="deferred" Return="ignore" Impersonate="no"/>
|
||||||
<CustomAction Id="PatchWebDAV" BinaryKey="WixCA" DllEntry="WixQuietExec64" Execute="deferred" Return="ignore" Impersonate="no"/>
|
|
||||||
|
<!-- Update check configuration -->
|
||||||
|
<ns0:SetProperty Id="PatchUpdateCheck" Value=""[INSTALLDIR]patchUpdateCheck.bat" "[DISABLEUPDATECHECK]"" Sequence="execute" Before="PatchUpdateCheck" />
|
||||||
|
<ns0:CustomAction Id="PatchUpdateCheck" BinaryRef="Wix4UtilCA_$(sys.BUILDARCHSHORT)" DllEntry="WixQuietExec64" Execute="deferred" Return="ignore" Impersonate="no"/>
|
||||||
|
|
||||||
<!-- Running App detection and exit -->
|
<!-- Running App detection and exit -->
|
||||||
<Property Id="FOUNDRUNNINGAPP" Admin="yes"/>
|
<ns0:Property Id="FOUNDRUNNINGAPP" Admin="yes"/>
|
||||||
<util:CloseApplication
|
<util:CloseApplication
|
||||||
Target="$(var.CloseApplicationTarget)"
|
Target="$(var.CloseApplicationTarget)"
|
||||||
Id="Close$(var.JpAppName)"
|
Id="Close$(var.JpAppName)"
|
||||||
CloseMessage="no"
|
CloseMessage="no"
|
||||||
RebootPrompt="no"
|
RebootPrompt="no"
|
||||||
PromptToContinue="yes"
|
PromptToContinue="yes"
|
||||||
Description="A running instance of $(var.JpAppName) is found, using files marked for update. Please close it to continue."
|
Description="A running instance of $(var.JpAppName) is found, using files marked for update. Please close it to continue."
|
||||||
Property="FOUNDRUNNINGAPP"
|
Property="FOUNDRUNNINGAPP"
|
||||||
>
|
/>
|
||||||
</util:CloseApplication>
|
<ns0:CustomAction Id="FailOnRunningApp" Error="Installation aborted, because files marked for update are used by a running instance of $(var.JpAppName)."/>
|
||||||
<CustomAction Id="FailOnRunningApp" Error="Installation aborted, because files marked for update are used by a running instance of $(var.JpAppName)."/>
|
|
||||||
|
|
||||||
<?ifdef JpIcon ?>
|
<?ifdef JpIcon ?>
|
||||||
<Property Id="ARPPRODUCTICON" Value="JpARPPRODUCTICON"/>
|
<ns0:Property Id="ARPPRODUCTICON" Value="JpARPPRODUCTICON"/>
|
||||||
<Icon Id="JpARPPRODUCTICON" SourceFile="$(var.JpIcon)"/>
|
<ns0:Icon Id="JpARPPRODUCTICON" SourceFile="$(var.JpIcon)"/>
|
||||||
<?endif?>
|
<?endif?>
|
||||||
|
|
||||||
<UIRef Id="JpUI"/>
|
<ns0:UIRef Id="JpUI"/>
|
||||||
|
|
||||||
<InstallExecuteSequence>
|
<ns0:InstallExecuteSequence>
|
||||||
<Custom Action="JpSetARPINSTALLLOCATION" After="CostFinalize">Not Installed</Custom>
|
<ns0:Custom Action="JpSetARPINSTALLLOCATION" After="CostFinalize" Condition="Not Installed" />
|
||||||
<Custom Action="JpSetARPCOMMENTS" After="CostFinalize">Not Installed</Custom>
|
<ns0:Custom Action="JpSetARPCOMMENTS" After="CostFinalize" Condition="Not Installed" />
|
||||||
<Custom Action="JpSetARPCONTACT" After="CostFinalize">Not Installed</Custom>
|
<ns0:Custom Action="JpSetARPCONTACT" After="CostFinalize" Condition="Not Installed" />
|
||||||
<Custom Action="JpSetARPSIZE" After="CostFinalize">Not Installed</Custom>
|
<ns0:Custom Action="JpSetARPSIZE" After="CostFinalize" Condition="Not Installed" />
|
||||||
<?ifdef JpHelpURL ?>
|
<?ifdef JpHelpURL ?>
|
||||||
<Custom Action="JpSetARPHELPLINK" After="CostFinalize">Not Installed</Custom>
|
<ns0:Custom Action="JpSetARPHELPLINK" After="CostFinalize" Condition="Not Installed" />
|
||||||
<?endif?>
|
<?endif?>
|
||||||
<?ifdef JpAboutURL ?>
|
<?ifdef JpAboutURL ?>
|
||||||
<Custom Action="JpSetARPURLINFOABOUT" After="CostFinalize">Not Installed</Custom>
|
<ns0:Custom Action="JpSetARPURLINFOABOUT" After="CostFinalize" Condition="Not Installed" />
|
||||||
<?endif?>
|
<?endif?>
|
||||||
<?ifdef JpUpdateURL ?>
|
<?ifdef JpUpdateURL ?>
|
||||||
<Custom Action="JpSetARPURLUPDATEINFO" After="CostFinalize">Not Installed</Custom>
|
<ns0:Custom Action="JpSetARPURLUPDATEINFO" After="CostFinalize" Condition="Not Installed" />
|
||||||
<?endif?>
|
<?endif?>
|
||||||
|
|
||||||
<?ifndef JpAllowUpgrades ?>
|
<?ifndef JpAllowUpgrades ?>
|
||||||
<Custom Action="JpDisallowUpgrade" After="JpFindRelatedProducts">JP_UPGRADABLE_FOUND</Custom>
|
<ns0:Custom Action="JpDisallowUpgrade" After="JpFindRelatedProducts" Condition="JP_UPGRADABLE_FOUND"/>
|
||||||
<?endif?>
|
<?endif?>
|
||||||
<?ifndef JpAllowDowngrades ?>
|
<?ifndef JpAllowDowngrades ?>
|
||||||
<Custom Action="JpDisallowDowngrade" After="JpFindRelatedProducts">JP_DOWNGRADABLE_FOUND</Custom>
|
<ns0:Custom Action="JpDisallowDowngrade" After="JpFindRelatedProducts" Condition="JP_DOWNGRADABLE_FOUND" />
|
||||||
<?endif?>
|
<?endif?>
|
||||||
<Custom Action="JpFindRelatedProducts" After="FindRelatedProducts"/>
|
<ns0:Custom Action="JpFindRelatedProducts" After="FindRelatedProducts"/>
|
||||||
|
|
||||||
<!-- Check and fail if Cryptomator is running -->
|
<!-- Check and fail if Cryptomator is running -->
|
||||||
<Custom Action="WixCloseApplications" Before="InstallValidate"></Custom>
|
<ns0:Custom Action="override Wix4CloseApplications_$(sys.BUILDARCHSHORT)" Before="InstallValidate" />
|
||||||
<Custom Action="FailOnRunningApp" After="WixCloseApplications" >FOUNDRUNNINGAPP</Custom>
|
<ns0:Custom Action="FailOnRunningApp" After="Wix4CloseApplications_$(sys.BUILDARCHSHORT)" Condition="FOUNDRUNNINGAPP" />
|
||||||
|
|
||||||
<RemoveExistingProducts After="InstallValidate"/> <!-- Moved from CostInitialize, due to WixCloseApplications -->
|
<ns0:RemoveExistingProducts After="InstallValidate"/> <!-- Moved from CostInitialize, due to Wix4CloseApplications_* -->
|
||||||
|
<!-- Skip action on uninstall -->
|
||||||
|
<!-- TODO: don't skip action, but remove cryptomator alias from hosts file -->
|
||||||
|
<ns0:Custom Action="PatchWebDAV" After="InstallFiles" Condition="NOT (Installed AND (NOT REINSTALL) AND (NOT UPGRADINGPRODUCTCODE) AND REMOVE)"/>
|
||||||
|
<!-- Configure update check setting if property is provided -->
|
||||||
|
<ns0:Custom Action="PatchUpdateCheck" After="PatchWebDAV" Condition="DISABLEUPDATECHECK AND NOT (Installed AND (NOT REINSTALL) AND (NOT UPGRADINGPRODUCTCODE) AND REMOVE)"/>
|
||||||
|
</ns0:InstallExecuteSequence>
|
||||||
|
|
||||||
<Custom Action="PatchWebDAV" After="InstallFiles">NOT Installed OR REINSTALL</Custom>
|
<ns0:InstallUISequence>
|
||||||
</InstallExecuteSequence>
|
<ns0:Custom Action="JpFindRelatedProducts" After="FindRelatedProducts"/>
|
||||||
|
</ns0:InstallUISequence>
|
||||||
|
|
||||||
<InstallUISequence>
|
<ns0:WixVariable Id="WixUIBannerBmp" Value="$(env.JP_WIXWIZARD_RESOURCES)\banner.bmp" />
|
||||||
<Custom Action="JpFindRelatedProducts" After="FindRelatedProducts"/>
|
<ns0:WixVariable Id="WixUIDialogBmp" Value="$(env.JP_WIXWIZARD_RESOURCES)\background.bmp" />
|
||||||
</InstallUISequence>
|
</ns0:Package>
|
||||||
|
</ns0:Wix>
|
||||||
<WixVariable Id="WixUIBannerBmp" Value="$(env.JP_WIXWIZARD_RESOURCES)\banner.bmp" />
|
|
||||||
<WixVariable Id="WixUIDialogBmp" Value="$(env.JP_WIXWIZARD_RESOURCES)\background.bmp" />
|
|
||||||
</Product>
|
|
||||||
|
|
||||||
</Wix>
|
|
||||||
|
|||||||
Vendored
+2
-2
@@ -41,10 +41,10 @@ Media Type of the encrypted data files. Default is "application/vnd.cryptomator.
|
|||||||
|
|
||||||
Close Application settings:
|
Close Application settings:
|
||||||
- CloseApplicationTarget
|
- CloseApplicationTarget
|
||||||
Full name of executable to be checkd in the close application util. Default is "cryptomator.exe"
|
Full name of executable to be checked in the close application util. Default is "cryptomator.exe"
|
||||||
|
|
||||||
Legacy Installation settings:
|
Legacy Installation settings:
|
||||||
- SkipCryptomatorLegacyCheck
|
- SkipCryptomatorLegacyCheck
|
||||||
Should be defined to disable checking for the inno setup installation of Cryptomator and undefined, to enable it.
|
Should be defined to disable checking for the inno setup installation of Cryptomator and undefined, to enable it.
|
||||||
-->
|
-->
|
||||||
<Include/>
|
<ns0:Include xmlns:ns0="http://wixtoolset.org/schemas/v4/wxs"></ns0:Include>
|
||||||
|
|||||||
Vendored
-16
@@ -1,16 +0,0 @@
|
|||||||
<?xml version="1.0" ?>
|
|
||||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
|
|
||||||
<Fragment>
|
|
||||||
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR"></Property>
|
|
||||||
<WixVariable Id="WixUILicenseRtf" Value="$(var.JpLicenseRtf)"></WixVariable>
|
|
||||||
<UI Id="JpUI">
|
|
||||||
<UIRef Id="CustomWizard" />
|
|
||||||
<DialogRef Id="InstallDirNotEmptyDlg"></DialogRef>
|
|
||||||
<Publish Dialog="ShortcutPromptDlg" Control="Back" Event="NewDialog" Value="InstallDirDlg">1</Publish>
|
|
||||||
<Publish Dialog="ShortcutPromptDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
|
|
||||||
<Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="ShortcutPromptDlg" Order="6">NOT Installed</Publish>
|
|
||||||
<UIRef Id="CustomWizard" />
|
|
||||||
</UI>
|
|
||||||
</Fragment>
|
|
||||||
<?include $(env.JP_WIXWIZARD_RESOURCES)\customWizard.wxi ?>
|
|
||||||
</Wix>
|
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>org.cryptomator</groupId>
|
<groupId>org.cryptomator</groupId>
|
||||||
<artifactId>cryptomator</artifactId>
|
<artifactId>cryptomator</artifactId>
|
||||||
<version>1.16.0</version>
|
<version>1.18.0</version>
|
||||||
<name>Cryptomator Desktop App</name>
|
<name>Cryptomator Desktop App</name>
|
||||||
|
|
||||||
<organization>
|
<organization>
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<project.jdk.version>23</project.jdk.version>
|
<project.jdk.version>24</project.jdk.version>
|
||||||
|
|
||||||
<!-- Group IDs of jars that need to stay on the class path for now -->
|
<!-- Group IDs of jars that need to stay on the class path for now -->
|
||||||
<!-- remove them, as soon they got modularized or support is dropped (i.e., WebDAV) -->
|
<!-- remove them, as soon they got modularized or support is dropped (i.e., WebDAV) -->
|
||||||
@@ -34,19 +34,19 @@
|
|||||||
|
|
||||||
<!-- cryptomator dependencies -->
|
<!-- cryptomator dependencies -->
|
||||||
<cryptomator.cryptofs.version>2.9.0</cryptomator.cryptofs.version>
|
<cryptomator.cryptofs.version>2.9.0</cryptomator.cryptofs.version>
|
||||||
<cryptomator.integrations.version>1.5.1</cryptomator.integrations.version>
|
<cryptomator.integrations.version>1.7.0</cryptomator.integrations.version>
|
||||||
<cryptomator.integrations.win.version>1.3.0</cryptomator.integrations.win.version>
|
<cryptomator.integrations.win.version>1.5.1</cryptomator.integrations.win.version>
|
||||||
<cryptomator.integrations.mac.version>1.3.0</cryptomator.integrations.mac.version>
|
<cryptomator.integrations.mac.version>1.4.1</cryptomator.integrations.mac.version>
|
||||||
<cryptomator.integrations.linux.version>1.5.3</cryptomator.integrations.linux.version>
|
<cryptomator.integrations.linux.version>1.6.1</cryptomator.integrations.linux.version>
|
||||||
<cryptomator.fuse.version>5.0.5</cryptomator.fuse.version>
|
<cryptomator.fuse.version>5.1.0</cryptomator.fuse.version>
|
||||||
<cryptomator.webdav.version>2.0.10</cryptomator.webdav.version>
|
<cryptomator.webdav.version>3.0.0</cryptomator.webdav.version>
|
||||||
|
|
||||||
<!-- 3rd party dependencies -->
|
<!-- 3rd party dependencies -->
|
||||||
<commons-lang3.version>3.17.0</commons-lang3.version>
|
<commons-lang3.version>3.18.0</commons-lang3.version>
|
||||||
<dagger.version>2.56.1</dagger.version>
|
<dagger.version>2.57.1</dagger.version>
|
||||||
<easybind.version>2.2</easybind.version>
|
<easybind.version>2.2</easybind.version>
|
||||||
<jackson.version>2.18.3</jackson.version>
|
<jackson.version>2.20.0</jackson.version>
|
||||||
<javafx.version>23.0.2</javafx.version>
|
<javafx.version>24.0.1</javafx.version>
|
||||||
<jwt.version>4.5.0</jwt.version>
|
<jwt.version>4.5.0</jwt.version>
|
||||||
<nimbus-jose.version>9.37.3</nimbus-jose.version>
|
<nimbus-jose.version>9.37.3</nimbus-jose.version>
|
||||||
<logback.version>1.5.18</logback.version>
|
<logback.version>1.5.18</logback.version>
|
||||||
@@ -55,20 +55,20 @@
|
|||||||
<zxcvbn.version>1.9.0</zxcvbn.version>
|
<zxcvbn.version>1.9.0</zxcvbn.version>
|
||||||
|
|
||||||
<!-- test dependencies -->
|
<!-- test dependencies -->
|
||||||
<junit.jupiter.version>5.12.2</junit.jupiter.version>
|
<junit.jupiter.version>5.13.4</junit.jupiter.version>
|
||||||
<mockito.version>5.17.0</mockito.version>
|
<mockito.version>5.20.0</mockito.version>
|
||||||
<hamcrest.version>3.0</hamcrest.version>
|
<hamcrest.version>3.0</hamcrest.version>
|
||||||
|
|
||||||
<!-- build-time dependencies -->
|
<!-- build-time dependencies -->
|
||||||
<jetbrains.annotations.version>26.0.2</jetbrains.annotations.version>
|
<jetbrains.annotations.version>26.0.2-1</jetbrains.annotations.version>
|
||||||
<dependency-check.version>12.1.1</dependency-check.version>
|
<dependency-check.version>12.1.5</dependency-check.version>
|
||||||
<jacoco.version>0.8.13</jacoco.version>
|
<jacoco.version>0.8.13</jacoco.version>
|
||||||
<license-generator.version>2.5.0</license-generator.version>
|
<license-generator.version>2.7.0</license-generator.version>
|
||||||
<junit-tree-reporter.version>1.4.0</junit-tree-reporter.version>
|
<junit-tree-reporter.version>1.4.0</junit-tree-reporter.version>
|
||||||
<mvn-compiler.version>3.14.0</mvn-compiler.version>
|
<mvn-compiler.version>3.14.1</mvn-compiler.version>
|
||||||
<mvn-resources.version>3.3.1</mvn-resources.version>
|
<mvn-resources.version>3.3.1</mvn-resources.version>
|
||||||
<mvn-dependency.version>3.8.1</mvn-dependency.version>
|
<mvn-dependency.version>3.8.1</mvn-dependency.version>
|
||||||
<mvn-surefire.version>3.5.3</mvn-surefire.version>
|
<mvn-surefire.version>3.5.4</mvn-surefire.version>
|
||||||
<mvn-jar.version>3.4.2</mvn-jar.version>
|
<mvn-jar.version>3.4.2</mvn-jar.version>
|
||||||
|
|
||||||
<!-- Property used by surefire to determine jacoco engine -->
|
<!-- Property used by surefire to determine jacoco engine -->
|
||||||
@@ -214,7 +214,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.ben-manes.caffeine</groupId>
|
<groupId>com.github.ben-manes.caffeine</groupId>
|
||||||
<artifactId>caffeine</artifactId>
|
<artifactId>caffeine</artifactId>
|
||||||
<version>3.2.0</version>
|
<version>3.2.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- JUnit / Mockito / Hamcrest -->
|
<!-- JUnit / Mockito / Hamcrest -->
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -244,7 +244,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.jimfs</groupId>
|
<groupId>com.google.jimfs</groupId>
|
||||||
<artifactId>jimfs</artifactId>
|
<artifactId>jimfs</artifactId>
|
||||||
<version>1.3.0</version>
|
<version>1.3.1</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
@@ -347,7 +347,7 @@
|
|||||||
<consoleOutputReporter>
|
<consoleOutputReporter>
|
||||||
<disable>true</disable>
|
<disable>true</disable>
|
||||||
</consoleOutputReporter>
|
</consoleOutputReporter>
|
||||||
<argLine>@{surefire.jacoco.args} -javaagent:${org.mockito:mockito-core:jar}</argLine>
|
<argLine>@{surefire.jacoco.args} -javaagent:${org.mockito:mockito-core:jar} --enable-native-access=javafx.graphics</argLine>
|
||||||
<statelessTestsetInfoReporter
|
<statelessTestsetInfoReporter
|
||||||
implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoTreeReporter">
|
implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoTreeReporter">
|
||||||
</statelessTestsetInfoReporter>
|
</statelessTestsetInfoReporter>
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ public class Environment {
|
|||||||
private static final String SETTINGS_PATH_PROP_NAME = "cryptomator.settingsPath";
|
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 IPC_SOCKET_PATH_PROP_NAME = "cryptomator.ipcSocketPath";
|
||||||
private static final String KEYCHAIN_PATHS_PROP_NAME = "cryptomator.integrationsWin.keychainPaths";
|
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 P12_PATH_PROP_NAME = "cryptomator.p12Path";
|
||||||
private static final String LOG_DIR_PROP_NAME = "cryptomator.logDir";
|
private static final String LOG_DIR_PROP_NAME = "cryptomator.logDir";
|
||||||
private static final String LOOPBACK_ALIAS_PROP_NAME = "cryptomator.loopbackAlias";
|
private static final String LOOPBACK_ALIAS_PROP_NAME = "cryptomator.loopbackAlias";
|
||||||
@@ -45,6 +46,7 @@ public class Environment {
|
|||||||
logCryptomatorSystemProperty(SETTINGS_PATH_PROP_NAME);
|
logCryptomatorSystemProperty(SETTINGS_PATH_PROP_NAME);
|
||||||
logCryptomatorSystemProperty(IPC_SOCKET_PATH_PROP_NAME);
|
logCryptomatorSystemProperty(IPC_SOCKET_PATH_PROP_NAME);
|
||||||
logCryptomatorSystemProperty(KEYCHAIN_PATHS_PROP_NAME);
|
logCryptomatorSystemProperty(KEYCHAIN_PATHS_PROP_NAME);
|
||||||
|
logCryptomatorSystemProperty(WINDOWS_HELLO_KEYCHAIN_PATHS_PROP_NAME);
|
||||||
logCryptomatorSystemProperty(P12_PATH_PROP_NAME);
|
logCryptomatorSystemProperty(P12_PATH_PROP_NAME);
|
||||||
logCryptomatorSystemProperty(LOG_DIR_PROP_NAME);
|
logCryptomatorSystemProperty(LOG_DIR_PROP_NAME);
|
||||||
logCryptomatorSystemProperty(LOOPBACK_ALIAS_PROP_NAME);
|
logCryptomatorSystemProperty(LOOPBACK_ALIAS_PROP_NAME);
|
||||||
@@ -85,6 +87,10 @@ public class Environment {
|
|||||||
return getPaths(KEYCHAIN_PATHS_PROP_NAME);
|
return getPaths(KEYCHAIN_PATHS_PROP_NAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Stream<Path> getWindowsHelloKeychainPath() {
|
||||||
|
return getPaths(WINDOWS_HELLO_KEYCHAIN_PATHS_PROP_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
public Stream<Path> getP12Path() {
|
public Stream<Path> getP12Path() {
|
||||||
return getPaths(P12_PATH_PROP_NAME);
|
return getPaths(P12_PATH_PROP_NAME);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,25 +42,11 @@ public class KeychainManager implements KeychainAccessProvider {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String displayName() {
|
|
||||||
return getClass().getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void storePassphrase(String key, String displayName, CharSequence passphrase) throws KeychainAccessException {
|
public void storePassphrase(String key, String displayName, CharSequence passphrase) throws KeychainAccessException {
|
||||||
storePassphrase(key, displayName, passphrase, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO: remove ignored parameter once the API is fixed
|
|
||||||
@Override
|
|
||||||
public void storePassphrase(String key, String displayName, CharSequence passphrase, boolean ignored) throws KeychainAccessException {
|
|
||||||
try {
|
try {
|
||||||
lock.writeLock().lock();
|
lock.writeLock().lock();
|
||||||
var kc = getKeychainOrFail();
|
getKeychainOrFail().storePassphrase(key, displayName, passphrase);
|
||||||
//this is the only keychain actually using the parameter
|
|
||||||
var usesOSAuth = (kc.getClass().getName().equals("org.cryptomator.macos.keychain.TouchIdKeychainAccess"));
|
|
||||||
kc.storePassphrase(key, displayName, passphrase, usesOSAuth);
|
|
||||||
} finally {
|
} finally {
|
||||||
lock.writeLock().unlock();
|
lock.writeLock().unlock();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ import javafx.beans.property.StringProperty;
|
|||||||
import javafx.collections.FXCollections;
|
import javafx.collections.FXCollections;
|
||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
import javafx.geometry.NodeOrientation;
|
import javafx.geometry.NodeOrientation;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
@@ -44,7 +46,7 @@ public class Settings {
|
|||||||
@Deprecated // to be changed to "whatever is available" eventually
|
@Deprecated // to be changed to "whatever is available" eventually
|
||||||
static final String DEFAULT_KEYCHAIN_PROVIDER = SystemUtils.IS_OS_WINDOWS ? "org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess" : //
|
static final String DEFAULT_KEYCHAIN_PROVIDER = SystemUtils.IS_OS_WINDOWS ? "org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess" : //
|
||||||
SystemUtils.IS_OS_MAC ? "org.cryptomator.macos.keychain.MacSystemKeychainAccess" : //
|
SystemUtils.IS_OS_MAC ? "org.cryptomator.macos.keychain.MacSystemKeychainAccess" : //
|
||||||
"org.cryptomator.linux.keychain.SecretServiceKeychainAccess";
|
"org.cryptomator.linux.keychain.GnomeKeyringKeychainAccess";
|
||||||
static final String DEFAULT_QUICKACCESS_SERVICE = SystemUtils.IS_OS_WINDOWS ? "org.cryptomator.windows.quickaccess.ExplorerQuickAccessService" : //
|
static final String DEFAULT_QUICKACCESS_SERVICE = SystemUtils.IS_OS_WINDOWS ? "org.cryptomator.windows.quickaccess.ExplorerQuickAccessService" : //
|
||||||
SystemUtils.IS_OS_LINUX ? "org.cryptomator.linux.quickaccess.NautilusBookmarks" : null;
|
SystemUtils.IS_OS_LINUX ? "org.cryptomator.linux.quickaccess.NautilusBookmarks" : null;
|
||||||
|
|
||||||
@@ -75,6 +77,7 @@ public class Settings {
|
|||||||
public final BooleanProperty checkForUpdates;
|
public final BooleanProperty checkForUpdates;
|
||||||
public final ObjectProperty<Instant> lastUpdateCheckReminder;
|
public final ObjectProperty<Instant> lastUpdateCheckReminder;
|
||||||
public final ObjectProperty<Instant> lastSuccessfulUpdateCheck;
|
public final ObjectProperty<Instant> lastSuccessfulUpdateCheck;
|
||||||
|
public final ObjectProperty<Path> previouslyUsedVaultDirectory;
|
||||||
|
|
||||||
private Consumer<Settings> saveCmd;
|
private Consumer<Settings> saveCmd;
|
||||||
|
|
||||||
@@ -114,6 +117,7 @@ public class Settings {
|
|||||||
this.checkForUpdates = new SimpleBooleanProperty(this, "checkForUpdates", json.checkForUpdatesEnabled);
|
this.checkForUpdates = new SimpleBooleanProperty(this, "checkForUpdates", json.checkForUpdatesEnabled);
|
||||||
this.lastUpdateCheckReminder = new SimpleObjectProperty<>(this, "lastUpdateCheckReminder", json.lastReminderForUpdateCheck);
|
this.lastUpdateCheckReminder = new SimpleObjectProperty<>(this, "lastUpdateCheckReminder", json.lastReminderForUpdateCheck);
|
||||||
this.lastSuccessfulUpdateCheck = new SimpleObjectProperty<>(this, "lastSuccessfulUpdateCheck", json.lastSuccessfulUpdateCheck);
|
this.lastSuccessfulUpdateCheck = new SimpleObjectProperty<>(this, "lastSuccessfulUpdateCheck", json.lastSuccessfulUpdateCheck);
|
||||||
|
this.previouslyUsedVaultDirectory = new SimpleObjectProperty<>(this, "previouslyUsedVaultDirectory", json.previouslyUsedVaultDirectory);
|
||||||
|
|
||||||
this.directories.addAll(json.directories.stream().map(VaultSettings::new).toList());
|
this.directories.addAll(json.directories.stream().map(VaultSettings::new).toList());
|
||||||
|
|
||||||
@@ -143,10 +147,16 @@ public class Settings {
|
|||||||
checkForUpdates.addListener(this::somethingChanged);
|
checkForUpdates.addListener(this::somethingChanged);
|
||||||
lastUpdateCheckReminder.addListener(this::somethingChanged);
|
lastUpdateCheckReminder.addListener(this::somethingChanged);
|
||||||
lastSuccessfulUpdateCheck.addListener(this::somethingChanged);
|
lastSuccessfulUpdateCheck.addListener(this::somethingChanged);
|
||||||
|
previouslyUsedVaultDirectory.addListener(this::somethingChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
private void migrateLegacySettings(SettingsJson json) {
|
private void migrateLegacySettings(SettingsJson json) {
|
||||||
|
// migrate renamed keychainAccess
|
||||||
|
if(this.keychainProvider.getValueSafe().equals("org.cryptomator.linux.keychain.SecretServiceKeychainAccess")) {
|
||||||
|
this.keychainProvider.setValue("org.cryptomator.linux.keychain.GnomeKeyringKeychainAccess");
|
||||||
|
}
|
||||||
|
|
||||||
// implicit migration of 1.6.x legacy setting "preferredVolumeImpl":
|
// implicit migration of 1.6.x legacy setting "preferredVolumeImpl":
|
||||||
if (this.mountService.get() == null && json.preferredVolumeImpl != null) {
|
if (this.mountService.get() == null && json.preferredVolumeImpl != null) {
|
||||||
this.mountService.set(switch (json.preferredVolumeImpl) {
|
this.mountService.set(switch (json.preferredVolumeImpl) {
|
||||||
@@ -199,6 +209,7 @@ public class Settings {
|
|||||||
json.checkForUpdatesEnabled = checkForUpdates.get();
|
json.checkForUpdatesEnabled = checkForUpdates.get();
|
||||||
json.lastReminderForUpdateCheck = lastUpdateCheckReminder.get();
|
json.lastReminderForUpdateCheck = lastUpdateCheckReminder.get();
|
||||||
json.lastSuccessfulUpdateCheck = lastSuccessfulUpdateCheck.get();
|
json.lastSuccessfulUpdateCheck = lastSuccessfulUpdateCheck.get();
|
||||||
|
json.previouslyUsedVaultDirectory = previouslyUsedVaultDirectory.get();
|
||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
|||||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -92,4 +93,7 @@ class SettingsJson {
|
|||||||
|
|
||||||
@JsonProperty("quickAccessService")
|
@JsonProperty("quickAccessService")
|
||||||
String quickAccessService = Settings.DEFAULT_QUICKACCESS_SERVICE;
|
String quickAccessService = Settings.DEFAULT_QUICKACCESS_SERVICE;
|
||||||
|
|
||||||
|
@JsonProperty("previouslyUsedVaultDirectory")
|
||||||
|
Path previouslyUsedVaultDirectory;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import org.cryptomator.cryptofs.CryptoFileSystemProvider;
|
|||||||
import org.cryptomator.cryptofs.DirStructure;
|
import org.cryptomator.cryptofs.DirStructure;
|
||||||
import org.cryptomator.cryptofs.migration.Migrators;
|
import org.cryptomator.cryptofs.migration.Migrators;
|
||||||
import org.cryptomator.integrations.mount.MountService;
|
import org.cryptomator.integrations.mount.MountService;
|
||||||
|
import org.cryptomator.ui.keyloading.masterkeyfile.MasterkeyFileLoadingStrategy;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -35,6 +36,7 @@ import static org.cryptomator.common.Constants.MASTERKEY_FILENAME;
|
|||||||
import static org.cryptomator.common.Constants.VAULTCONFIG_FILENAME;
|
import static org.cryptomator.common.Constants.VAULTCONFIG_FILENAME;
|
||||||
import static org.cryptomator.common.vaults.VaultState.Value.ERROR;
|
import static org.cryptomator.common.vaults.VaultState.Value.ERROR;
|
||||||
import static org.cryptomator.common.vaults.VaultState.Value.LOCKED;
|
import static org.cryptomator.common.vaults.VaultState.Value.LOCKED;
|
||||||
|
import static org.cryptomator.common.vaults.VaultState.Value.NEEDS_MIGRATION;
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
public class VaultListManager {
|
public class VaultListManager {
|
||||||
@@ -104,7 +106,7 @@ public class VaultListManager {
|
|||||||
vaultList.addAll(vaults);
|
vaultList.addAll(vaults);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Optional<Vault> get(Path vaultPath) {
|
public Optional<Vault> get(Path vaultPath) {
|
||||||
assert vaultPath.isAbsolute();
|
assert vaultPath.isAbsolute();
|
||||||
assert vaultPath.normalize().equals(vaultPath);
|
assert vaultPath.normalize().equals(vaultPath);
|
||||||
return vaultList.stream() //
|
return vaultList.stream() //
|
||||||
@@ -115,13 +117,15 @@ public class VaultListManager {
|
|||||||
private Vault create(VaultSettings vaultSettings) {
|
private Vault create(VaultSettings vaultSettings) {
|
||||||
var wrapper = new VaultConfigCache(vaultSettings);
|
var wrapper = new VaultConfigCache(vaultSettings);
|
||||||
try {
|
try {
|
||||||
if (Objects.isNull(vaultSettings.lastKnownKeyLoader.get())) {
|
|
||||||
var keyIdScheme = wrapper.get().getKeyId().getScheme();
|
|
||||||
vaultSettings.lastKnownKeyLoader.set(keyIdScheme);
|
|
||||||
}
|
|
||||||
var vaultState = determineVaultState(vaultSettings.path.get());
|
var vaultState = determineVaultState(vaultSettings.path.get());
|
||||||
if (vaultState == LOCKED) { //for legacy reasons: pre v8 vault do not have a config, but they are in the NEEDS_MIGRATION state
|
if (vaultState == LOCKED) { //for legacy reasons: pre v8 vault do not have a config, but they are in the NEEDS_MIGRATION state
|
||||||
wrapper.reloadConfig();
|
wrapper.reloadConfig();
|
||||||
|
if (Objects.isNull(vaultSettings.lastKnownKeyLoader.get())) {
|
||||||
|
var keyIdScheme = wrapper.get().getKeyId().getScheme();
|
||||||
|
vaultSettings.lastKnownKeyLoader.set(keyIdScheme);
|
||||||
|
}
|
||||||
|
} else if (vaultState == NEEDS_MIGRATION) {
|
||||||
|
vaultSettings.lastKnownKeyLoader.set(MasterkeyFileLoadingStrategy.SCHEME);
|
||||||
}
|
}
|
||||||
return vaultComponentFactory.create(vaultSettings, wrapper, vaultState, null).vault();
|
return vaultComponentFactory.create(vaultSettings, wrapper, vaultState, null).vault();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
|||||||
@@ -53,18 +53,26 @@ class Server implements IpcCommunicator {
|
|||||||
@Override
|
@Override
|
||||||
public void listen(IpcMessageListener listener, Executor executor) {
|
public void listen(IpcMessageListener listener, Executor executor) {
|
||||||
executor.execute(() -> {
|
executor.execute(() -> {
|
||||||
|
int errorCount = 0;
|
||||||
while (serverSocketChannel.isOpen()) {
|
while (serverSocketChannel.isOpen()) {
|
||||||
try (var ch = serverSocketChannel.accept()) {
|
try (var ch = serverSocketChannel.accept()) {
|
||||||
while (ch.isConnected()) {
|
while (ch.isConnected()) {
|
||||||
var msg = IpcMessage.receive(ch);
|
var msg = IpcMessage.receive(ch);
|
||||||
listener.handleMessage(msg);
|
listener.handleMessage(msg);
|
||||||
}
|
}
|
||||||
|
errorCount = 0;
|
||||||
} catch (AsynchronousCloseException e) {
|
} catch (AsynchronousCloseException e) {
|
||||||
|
LOG.info("Closing server socket due to closed channel.");
|
||||||
return; // serverSocketChannel closed or listener interrupted
|
return; // serverSocketChannel closed or listener interrupted
|
||||||
} catch (EOFException | ClosedChannelException e) {
|
} catch (EOFException | ClosedChannelException e) {
|
||||||
// continue with next connected client
|
// continue with next connected client
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
errorCount++;
|
||||||
LOG.error("Failed to read IPC message", e);
|
LOG.error("Failed to read IPC message", e);
|
||||||
|
if(errorCount > 100) { //apparently something is broken, prevent log spam
|
||||||
|
LOG.info("Closing server socket due to too many failed requests.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -90,6 +90,9 @@ public class LogbackConfigurator extends ContextAwareBase implements Configurato
|
|||||||
// configure fuse file locking logger:
|
// configure fuse file locking logger:
|
||||||
Logger fuseLocking = context.getLogger("org.cryptomator.frontend.fuse.locks");
|
Logger fuseLocking = context.getLogger("org.cryptomator.frontend.fuse.locks");
|
||||||
fuseLocking.setLevel(Level.OFF);
|
fuseLocking.setLevel(Level.OFF);
|
||||||
|
//deactivate kwallet unsettling message
|
||||||
|
Logger kdeWallet = context.getLogger("org.purejava.kwallet.freedesktop.dbus.handlers");
|
||||||
|
kdeWallet.setLevel(Level.OFF);
|
||||||
}
|
}
|
||||||
return ExecutionStatus.DO_NOT_INVOKE_NEXT_IF_ANY;
|
return ExecutionStatus.DO_NOT_INVOKE_NEXT_IF_ANY;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,185 @@
|
|||||||
|
package org.cryptomator.networking;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.security.Key;
|
||||||
|
import java.security.KeyStore;
|
||||||
|
import java.security.KeyStoreException;
|
||||||
|
import java.security.KeyStoreSpi;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.UnrecoverableKeyException;
|
||||||
|
import java.security.cert.Certificate;
|
||||||
|
import java.security.cert.CertificateException;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
public class CombinedKeyStoreSpi extends KeyStoreSpi {
|
||||||
|
|
||||||
|
private final KeyStore primary;
|
||||||
|
private final KeyStore fallback;
|
||||||
|
|
||||||
|
public static CombinedKeyStoreSpi create(KeyStore primary, KeyStore fallback) {
|
||||||
|
checkIfLoaded(primary);
|
||||||
|
checkIfLoaded(fallback);
|
||||||
|
return new CombinedKeyStoreSpi(primary, fallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void checkIfLoaded(KeyStore s) {
|
||||||
|
try {
|
||||||
|
s.aliases();
|
||||||
|
} catch (KeyStoreException e) {
|
||||||
|
throw new IllegalArgumentException("Keystore %s is not loaded.".formatted(s.getType()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private CombinedKeyStoreSpi(KeyStore primary, KeyStore fallback) {
|
||||||
|
this.primary = primary;
|
||||||
|
this.fallback = fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Key engineGetKey(String alias, char[] password) throws NoSuchAlgorithmException, UnrecoverableKeyException {
|
||||||
|
try {
|
||||||
|
Key key = primary.getKey(alias, password);
|
||||||
|
if (key == null) {
|
||||||
|
key = fallback.getKey(alias, password);
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
} catch (KeyStoreException e) {
|
||||||
|
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Certificate[] engineGetCertificateChain(String alias) {
|
||||||
|
try {
|
||||||
|
Certificate[] chain = primary.getCertificateChain(alias);
|
||||||
|
if (chain == null) {
|
||||||
|
chain = fallback.getCertificateChain(alias);
|
||||||
|
}
|
||||||
|
return chain;
|
||||||
|
} catch (KeyStoreException e) {
|
||||||
|
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Certificate engineGetCertificate(String alias) {
|
||||||
|
try {
|
||||||
|
Certificate cert = primary.getCertificate(alias);
|
||||||
|
if (cert == null) {
|
||||||
|
cert = fallback.getCertificate(alias);
|
||||||
|
}
|
||||||
|
return cert;
|
||||||
|
} catch (KeyStoreException e) {
|
||||||
|
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Date engineGetCreationDate(String alias) {
|
||||||
|
try {
|
||||||
|
Date date = primary.getCreationDate(alias);
|
||||||
|
if (date == null) {
|
||||||
|
date = fallback.getCreationDate(alias);
|
||||||
|
}
|
||||||
|
return date;
|
||||||
|
} catch (KeyStoreException e) {
|
||||||
|
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void engineSetKeyEntry(String alias, Key key, char[] password, Certificate[] chain) throws KeyStoreException {
|
||||||
|
throw new UnsupportedOperationException("Read-only KeyStore");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void engineSetKeyEntry(String alias, byte[] key, Certificate[] chain) throws KeyStoreException {
|
||||||
|
throw new UnsupportedOperationException("Read-only KeyStore");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void engineSetCertificateEntry(String alias, Certificate cert) throws KeyStoreException {
|
||||||
|
throw new UnsupportedOperationException("Read-only KeyStore");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void engineDeleteEntry(String alias) throws KeyStoreException {
|
||||||
|
throw new UnsupportedOperationException("Read-only KeyStore");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Enumeration<String> engineAliases() {
|
||||||
|
var aliases = new LinkedHashSet<String>();
|
||||||
|
try {
|
||||||
|
primary.aliases().asIterator().forEachRemaining(aliases::add);
|
||||||
|
fallback.aliases().asIterator().forEachRemaining(aliases::add);
|
||||||
|
return Collections.enumeration(aliases);
|
||||||
|
} catch (KeyStoreException e) {
|
||||||
|
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean engineContainsAlias(String alias) {
|
||||||
|
try {
|
||||||
|
return primary.containsAlias(alias) || fallback.containsAlias(alias);
|
||||||
|
} catch (KeyStoreException e) {
|
||||||
|
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int engineSize() {
|
||||||
|
var aliases = engineAliases();
|
||||||
|
var i = new AtomicInteger(0);
|
||||||
|
aliases.asIterator().forEachRemaining(_ -> i.incrementAndGet());
|
||||||
|
return i.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean engineIsKeyEntry(String alias) {
|
||||||
|
try {
|
||||||
|
return primary.isKeyEntry(alias) || fallback.isKeyEntry(alias);
|
||||||
|
} catch (KeyStoreException e) {
|
||||||
|
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean engineIsCertificateEntry(String alias) {
|
||||||
|
try {
|
||||||
|
return primary.isCertificateEntry(alias) || fallback.isCertificateEntry(alias);
|
||||||
|
} catch (KeyStoreException e) {
|
||||||
|
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String engineGetCertificateAlias(Certificate cert) {
|
||||||
|
try {
|
||||||
|
String alias = primary.getCertificateAlias(cert);
|
||||||
|
if (alias == null) {
|
||||||
|
alias = fallback.getCertificateAlias(cert);
|
||||||
|
}
|
||||||
|
return alias;
|
||||||
|
} catch (KeyStoreException e) {
|
||||||
|
throw new IllegalStateException("At least one keystore of [%s, %s] is not initialized.".formatted(primary.getType(), fallback.getType()), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void engineStore(OutputStream stream, char[] password) throws IOException, NoSuchAlgorithmException, CertificateException {
|
||||||
|
throw new UnsupportedOperationException("Read-only KeyStore");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void engineLoad(InputStream stream, char[] password) throws IOException, NoSuchAlgorithmException, CertificateException {
|
||||||
|
// Nothing to do; the real keystores are already loaded.
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ import java.io.IOException;
|
|||||||
import java.security.KeyStore;
|
import java.security.KeyStore;
|
||||||
import java.security.KeyStoreException;
|
import java.security.KeyStoreException;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.Provider;
|
||||||
import java.security.cert.CertificateException;
|
import java.security.cert.CertificateException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -16,6 +17,16 @@ public class SSLContextWithMacKeychain extends SSLContextDifferentTrustStoreBase
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
KeyStore getTruststore() throws KeyStoreException, CertificateException, IOException, NoSuchAlgorithmException {
|
KeyStore getTruststore() throws KeyStoreException, CertificateException, IOException, NoSuchAlgorithmException {
|
||||||
return KeyStore.getInstance("KeychainStore-ROOT");
|
var userKeyStore = KeyStore.getInstance("KeychainStore");
|
||||||
|
var systemRootKeyStore = KeyStore.getInstance("KeychainStore-ROOT");
|
||||||
|
userKeyStore.load(null);
|
||||||
|
systemRootKeyStore.load(null);
|
||||||
|
try {
|
||||||
|
CombinedKeyStoreSpi spi = CombinedKeyStoreSpi.create(userKeyStore, systemRootKeyStore);
|
||||||
|
Provider dummyProvider = new Provider("CombinedKeyStoreProvider", "1.0", "Provides a combined, read-only KeyStore") {};
|
||||||
|
return new KeyStore(spi, dummyProvider, "CombinedKeyStoreProvider") {};
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
throw new KeyStoreException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -26,7 +26,7 @@ public class CreateNewVaultExpertSettingsController implements FxController {
|
|||||||
|
|
||||||
public static final int MAX_SHORTENING_THRESHOLD = 220;
|
public static final int MAX_SHORTENING_THRESHOLD = 220;
|
||||||
public static final int MIN_SHORTENING_THRESHOLD = 36;
|
public static final int MIN_SHORTENING_THRESHOLD = 36;
|
||||||
private static final String DOCS_NAME_SHORTENING_URL = "https://docs.cryptomator.org/security/architecture/#name-shortening";
|
private static final String DOCS_NAME_SHORTENING_URL = "https://docs.cryptomator.org/security/vault/#name-shortening";
|
||||||
|
|
||||||
private final Stage window;
|
private final Stage window;
|
||||||
private final Lazy<Application> application;
|
private final Lazy<Application> application;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import dagger.Lazy;
|
|||||||
import org.cryptomator.common.ObservableUtil;
|
import org.cryptomator.common.ObservableUtil;
|
||||||
import org.cryptomator.common.locationpresets.LocationPreset;
|
import org.cryptomator.common.locationpresets.LocationPreset;
|
||||||
import org.cryptomator.common.locationpresets.LocationPresetsProvider;
|
import org.cryptomator.common.locationpresets.LocationPresetsProvider;
|
||||||
|
import org.cryptomator.common.settings.Settings;
|
||||||
import org.cryptomator.ui.common.FxController;
|
import org.cryptomator.ui.common.FxController;
|
||||||
import org.cryptomator.ui.common.FxmlFile;
|
import org.cryptomator.ui.common.FxmlFile;
|
||||||
import org.cryptomator.ui.common.FxmlScene;
|
import org.cryptomator.ui.common.FxmlScene;
|
||||||
@@ -38,6 +39,7 @@ import javafx.stage.WindowEvent;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.InvalidPathException;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -64,6 +66,7 @@ public class CreateNewVaultLocationController implements FxController {
|
|||||||
private final BooleanProperty loadingPresetLocations = new SimpleBooleanProperty(false);
|
private final BooleanProperty loadingPresetLocations = new SimpleBooleanProperty(false);
|
||||||
private final ObservableList<Node> radioButtons;
|
private final ObservableList<Node> radioButtons;
|
||||||
private final ObservableList<Node> sortedRadioButtons;
|
private final ObservableList<Node> sortedRadioButtons;
|
||||||
|
private final Settings settings;
|
||||||
|
|
||||||
private Path customVaultPath = DEFAULT_CUSTOM_VAULT_PATH;
|
private Path customVaultPath = DEFAULT_CUSTOM_VAULT_PATH;
|
||||||
|
|
||||||
@@ -82,6 +85,7 @@ public class CreateNewVaultLocationController implements FxController {
|
|||||||
@FxmlScene(FxmlFile.ADDVAULT_NEW_EXPERT_SETTINGS) Lazy<Scene> chooseExpertSettingsScene, //
|
@FxmlScene(FxmlFile.ADDVAULT_NEW_EXPERT_SETTINGS) Lazy<Scene> chooseExpertSettingsScene, //
|
||||||
ObjectProperty<Path> vaultPath, //
|
ObjectProperty<Path> vaultPath, //
|
||||||
@Named("vaultName") StringProperty vaultName, //
|
@Named("vaultName") StringProperty vaultName, //
|
||||||
|
Settings settings, //
|
||||||
ExecutorService backgroundExecutor, ResourceBundle resourceBundle) {
|
ExecutorService backgroundExecutor, ResourceBundle resourceBundle) {
|
||||||
this.window = window;
|
this.window = window;
|
||||||
this.chooseNameScene = chooseNameScene;
|
this.chooseNameScene = chooseNameScene;
|
||||||
@@ -96,6 +100,18 @@ public class CreateNewVaultLocationController implements FxController {
|
|||||||
this.usePresetPath = new SimpleBooleanProperty();
|
this.usePresetPath = new SimpleBooleanProperty();
|
||||||
this.radioButtons = FXCollections.observableArrayList();
|
this.radioButtons = FXCollections.observableArrayList();
|
||||||
this.sortedRadioButtons = radioButtons.sorted(this::compareLocationPresets);
|
this.sortedRadioButtons = radioButtons.sorted(this::compareLocationPresets);
|
||||||
|
this.settings = settings;
|
||||||
|
|
||||||
|
Path previouslyUsedDirectory = settings.previouslyUsedVaultDirectory.get();
|
||||||
|
if (previouslyUsedDirectory != null) {
|
||||||
|
try {
|
||||||
|
if (Files.exists(previouslyUsedDirectory) && Files.isDirectory(previouslyUsedDirectory) && isActuallyWritable(previouslyUsedDirectory)) {
|
||||||
|
this.customVaultPath = previouslyUsedDirectory;
|
||||||
|
}
|
||||||
|
} catch (InvalidPathException | NullPointerException e) {
|
||||||
|
LOG.warn("Invalid previously used vault directory path: {}", previouslyUsedDirectory, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private VaultPathStatus validatePath(Path p) throws NullPointerException {
|
private VaultPathStatus validatePath(Path p) throws NullPointerException {
|
||||||
@@ -196,6 +212,12 @@ public class CreateNewVaultLocationController implements FxController {
|
|||||||
@FXML
|
@FXML
|
||||||
public void next() {
|
public void next() {
|
||||||
if (validVaultPath.getValue()) {
|
if (validVaultPath.getValue()) {
|
||||||
|
if (this.getVaultPath() != null) {
|
||||||
|
Path parentPath = this.getVaultPath().getParent();
|
||||||
|
if (parentPath != null) {
|
||||||
|
this.settings.previouslyUsedVaultDirectory.setValue(parentPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
window.setScene(chooseExpertSettingsScene.get());
|
window.setScene(chooseExpertSettingsScene.get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ public class ReadmeGenerator {
|
|||||||
} else if (c <= 0xFF) {
|
} else if (c <= 0xFF) {
|
||||||
sb.append("\\'").append(String.format("%02X", c));
|
sb.append("\\'").append(String.format("%02X", c));
|
||||||
} else if (c < 0xFFFF) {
|
} else if (c < 0xFFFF) {
|
||||||
sb.append("\\uc1\\u").append(c);
|
sb.append("\\u").append(c);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ public interface ErrorComponent {
|
|||||||
default Stage show() {
|
default Stage show() {
|
||||||
Stage stage = window();
|
Stage stage = window();
|
||||||
stage.setScene(scene());
|
stage.setScene(scene());
|
||||||
stage.setMinWidth(420);
|
stage.setMinWidth(450);
|
||||||
stage.setMinHeight(300);
|
stage.setMinHeight(450);
|
||||||
stage.show();
|
stage.show();
|
||||||
return stage;
|
return stage;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -133,9 +133,9 @@ public class EventListCellController implements FxController {
|
|||||||
eventMessage.setValue(resourceBundle.getString("eventView.entry.brokenFileNode.message"));
|
eventMessage.setValue(resourceBundle.getString("eventView.entry.brokenFileNode.message"));
|
||||||
eventDescription.setValue(bfe.ciphertextPath().getFileName().toString());
|
eventDescription.setValue(bfe.ciphertextPath().getFileName().toString());
|
||||||
if (revealService != null) {
|
if (revealService != null) {
|
||||||
addAction("eventView.entry.brokenFileNode.showEncrypted", () -> reveal(revealService, convertVaultPathToSystemPath(bfe.ciphertextPath())));
|
addAction("eventView.entry.brokenFileNode.showEncrypted", () -> reveal(revealService, bfe.ciphertextPath()));
|
||||||
} else {
|
} else {
|
||||||
addAction("eventView.entry.brokenFileNode.copyEncrypted", () -> copyToClipboard(convertVaultPathToSystemPath(bfe.ciphertextPath()).toString()));
|
addAction("eventView.entry.brokenFileNode.copyEncrypted", () -> copyToClipboard(bfe.ciphertextPath().toString()));
|
||||||
}
|
}
|
||||||
addAction("eventView.entry.brokenFileNode.copyDecrypted", () -> copyToClipboard(convertVaultPathToSystemPath(bfe.cleartextPath()).toString()));
|
addAction("eventView.entry.brokenFileNode.copyDecrypted", () -> copyToClipboard(convertVaultPathToSystemPath(bfe.cleartextPath()).toString()));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ public class EventViewController implements FxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Comparison method for the lru cache. During comparsion the map is accessed.
|
* Comparison method for the lru cache. During comparison the map is accessed.
|
||||||
* First the entries are compared by the event timestamp, then vaultId, then identifying path and lastly by class name.
|
* First the entries are compared by the event timestamp, then vaultId, then identifying path and lastly by class name.
|
||||||
*
|
*
|
||||||
* @param left an entry of a {@link FSEventBucket} and its content
|
* @param left an entry of a {@link FSEventBucket} and its content
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import javax.inject.Named;
|
|||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.concurrent.BlockingQueue;
|
import java.util.concurrent.BlockingQueue;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
|
||||||
@@ -58,29 +59,30 @@ class AppLaunchEventHandler {
|
|||||||
switch (event.type()) {
|
switch (event.type()) {
|
||||||
case REVEAL_APP -> appWindows.showMainWindow();
|
case REVEAL_APP -> appWindows.showMainWindow();
|
||||||
case OPEN_FILE -> Platform.runLater(() -> {
|
case OPEN_FILE -> Platform.runLater(() -> {
|
||||||
event.pathsToOpen().forEach(this::addOrRevealVault);
|
event.pathsToOpen().forEach(this::openPotentialVault);
|
||||||
});
|
});
|
||||||
default -> LOG.warn("Unsupported event type: {}", event.type());
|
default -> LOG.warn("Unsupported event type: {}", event.type());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO deduplicate MainWindowController...
|
// TODO deduplicate MainWindowController...
|
||||||
private void addOrRevealVault(Path potentialVaultPath) {
|
private void openPotentialVault(Path path) {
|
||||||
assert Platform.isFxApplicationThread();
|
assert Platform.isFxApplicationThread();
|
||||||
try {
|
try {
|
||||||
final Vault v;
|
Path potentialVaultPath = path.getFileName().toString().endsWith(CRYPTOMATOR_FILENAME_EXT) ? path.getParent() : path;
|
||||||
if (potentialVaultPath.getFileName().toString().endsWith(CRYPTOMATOR_FILENAME_EXT)) {
|
final Optional<Vault> v = vaultListManager.get(potentialVaultPath);
|
||||||
v = vaultListManager.add(potentialVaultPath.getParent());
|
if (v.isPresent()) {
|
||||||
|
if (v.get().isUnlocked()) {
|
||||||
|
vaultService.reveal(v.get());
|
||||||
|
} else if (v.get().isLocked()) {
|
||||||
|
appWindows.startUnlockWorkflow(v.get(), null);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
v = vaultListManager.add(potentialVaultPath);
|
vaultListManager.add(potentialVaultPath);
|
||||||
|
LOG.debug("Added vault {}", potentialVaultPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v.isUnlocked()) {
|
|
||||||
vaultService.reveal(v);
|
|
||||||
}
|
|
||||||
LOG.debug("Added vault {}", potentialVaultPath);
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
LOG.error("Failed to add vault " + potentialVaultPath, e);
|
LOG.error("Failed to add vault " + path, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ public class FxApplicationTerminator {
|
|||||||
} else if (settings.autoCloseVaults.get() && !preventQuitWithGracefulLock.get()) {
|
} else if (settings.autoCloseVaults.get() && !preventQuitWithGracefulLock.get()) {
|
||||||
var lockAllTask = vaultService.createLockAllTask(vaults.filtered(Vault::isUnlocked), false);
|
var lockAllTask = vaultService.createLockAllTask(vaults.filtered(Vault::isUnlocked), false);
|
||||||
lockAllTask.setOnSucceeded(event -> {
|
lockAllTask.setOnSucceeded(event -> {
|
||||||
LOG.info("Locked remaining vaults was succesful.");
|
LOG.info("Locked remaining vaults was successful.");
|
||||||
exitingResponse.performQuit();
|
exitingResponse.performQuit();
|
||||||
});
|
});
|
||||||
lockAllTask.setOnFailed(event -> {
|
lockAllTask.setOnFailed(event -> {
|
||||||
|
|||||||
@@ -46,15 +46,16 @@ public interface KeyLoadingStrategy extends MasterkeyLoader {
|
|||||||
/**
|
/**
|
||||||
* Determines whether the provided key loader scheme corresponds to a Masterkey File Vault.
|
* Determines whether the provided key loader scheme corresponds to a Masterkey File Vault.
|
||||||
* <p>
|
* <p>
|
||||||
* This method checks if the {@code keyLoader} parameter matches the known Masterkey File Vault scheme
|
* This method checks if the {@code keyLoader} parameter starts with the known Masterkey File Vault scheme
|
||||||
* {@link MasterkeyFileLoadingStrategy#SCHEME}.
|
* {@link MasterkeyFileLoadingStrategy#SCHEME}.
|
||||||
|
* This allows identifying not only exact matches but also variants or extended schemes based on the Masterkey scheme.
|
||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @param keyLoader A string representing the key loader scheme to be checked.
|
* @param keyLoader A string representing the key loader scheme to be checked.
|
||||||
* @return {@code true} if the given key loader scheme represents a Masterkey File Vault; {@code false} otherwise.
|
* @return {@code true} if the given key loader scheme starts with the Masterkey File Vault scheme; {@code false} otherwise.
|
||||||
*/
|
*/
|
||||||
static boolean isMasterkeyFileVault(String keyLoader) {
|
static boolean isMasterkeyFileVault(String keyLoader) {
|
||||||
return MasterkeyFileLoadingStrategy.SCHEME.equals(keyLoader);
|
return keyLoader.startsWith(MasterkeyFileLoadingStrategy.SCHEME);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ public class GeneralPreferencesController implements FxController {
|
|||||||
var keychainSettingsConverter = new ServiceToSettingsConverter<>(keychainAccessProviders);
|
var keychainSettingsConverter = new ServiceToSettingsConverter<>(keychainAccessProviders);
|
||||||
keychainBackendChoiceBox.getItems().addAll(keychainAccessProviders);
|
keychainBackendChoiceBox.getItems().addAll(keychainAccessProviders);
|
||||||
keychainBackendChoiceBox.setValue(keychainSettingsConverter.fromString(settings.keychainProvider.get()));
|
keychainBackendChoiceBox.setValue(keychainSettingsConverter.fromString(settings.keychainProvider.get()));
|
||||||
keychainBackendChoiceBox.setConverter(new KeychainProviderDisplayNameConverter());
|
keychainBackendChoiceBox.setConverter(new NamedServiceConverter<>());
|
||||||
Bindings.bindBidirectional(settings.keychainProvider, keychainBackendChoiceBox.valueProperty(), keychainSettingsConverter);
|
Bindings.bindBidirectional(settings.keychainProvider, keychainBackendChoiceBox.valueProperty(), keychainSettingsConverter);
|
||||||
useKeychainCheckbox.selectedProperty().bindBidirectional(settings.useKeychain);
|
useKeychainCheckbox.selectedProperty().bindBidirectional(settings.useKeychain);
|
||||||
keychainBackendChoiceBox.disableProperty().bind(useKeychainCheckbox.selectedProperty().not());
|
keychainBackendChoiceBox.disableProperty().bind(useKeychainCheckbox.selectedProperty().not());
|
||||||
@@ -106,13 +106,13 @@ public class GeneralPreferencesController implements FxController {
|
|||||||
var idsAndNames = settings.directories.stream().collect(Collectors.toMap(vs -> vs.id, vs -> vs.displayName.getValue()));
|
var idsAndNames = settings.directories.stream().collect(Collectors.toMap(vs -> vs.id, vs -> vs.displayName.getValue()));
|
||||||
if (!idsAndNames.isEmpty()) {
|
if (!idsAndNames.isEmpty()) {
|
||||||
if (LOG.isDebugEnabled()) {
|
if (LOG.isDebugEnabled()) {
|
||||||
LOG.debug("Migrating keychain entries {} from {} to {}", idsAndNames.keySet(), oldProvider.displayName(), newProvider.displayName());
|
LOG.debug("Migrating keychain entries {} from {} to {}", idsAndNames.keySet(), oldProvider.getName(), newProvider.getName());
|
||||||
}
|
}
|
||||||
keychainMigrations = keychainMigrations.thenRunAsync(() -> {
|
keychainMigrations = keychainMigrations.thenRunAsync(() -> {
|
||||||
try {
|
try {
|
||||||
KeychainManager.migrate(oldProvider, newProvider, idsAndNames);
|
KeychainManager.migrate(oldProvider, newProvider, idsAndNames);
|
||||||
} catch (KeychainAccessException e) {
|
} catch (KeychainAccessException e) {
|
||||||
LOG.warn("Failed to migrate all entries from {} to {}", oldProvider.displayName(), newProvider.displayName(), e);
|
LOG.warn("Failed to migrate all entries from {} to {}", oldProvider.getName(), newProvider.getName(), e);
|
||||||
}
|
}
|
||||||
}, backgroundExecutor);
|
}, backgroundExecutor);
|
||||||
}
|
}
|
||||||
@@ -151,25 +151,6 @@ public class GeneralPreferencesController implements FxController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Helper classes */
|
/* Helper classes */
|
||||||
|
|
||||||
private static class KeychainProviderDisplayNameConverter extends StringConverter<KeychainAccessProvider> {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString(KeychainAccessProvider provider) {
|
|
||||||
if (provider == null) {
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
return provider.displayName();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public KeychainAccessProvider fromString(String string) {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class NamedServiceConverter<T extends NamedServiceProvider> extends StringConverter<T> {
|
private static class NamedServiceConverter<T extends NamedServiceProvider> extends StringConverter<T> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ public class ShareVaultController implements FxController {
|
|||||||
|
|
||||||
private static final String SCHEME_PREFIX = "hub+";
|
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/";
|
||||||
private static final String BEST_PRACTICES_URL = "https://docs.cryptomator.org/en/latest/security/best-practices/#sharing-of-vaults";
|
private static final String BEST_PRACTICES_URL = "https://docs.cryptomator.org/security/best-practices/#sharing-of-vaults";
|
||||||
|
|
||||||
private final Stage window;
|
private final Stage window;
|
||||||
private final Lazy<Application> application;
|
private final Lazy<Application> application;
|
||||||
|
|||||||
@@ -62,9 +62,9 @@ addvaultwizard.new.locationIsOk=الموقع المناسب للمخزن الخ
|
|||||||
addvaultwizard.new.invalidName=اسم المخزن غير صالح
|
addvaultwizard.new.invalidName=اسم المخزن غير صالح
|
||||||
addvaultwizard.new.validName=اسم المخزن صالح
|
addvaultwizard.new.validName=اسم المخزن صالح
|
||||||
addvaultwizard.new.validCharacters.message=قد يحتوي اسم المخزن على الأحرف التالية:
|
addvaultwizard.new.validCharacters.message=قد يحتوي اسم المخزن على الأحرف التالية:
|
||||||
addvaultwizard.new.validCharacters.chars=أحرف الكلمات (أمثلة: a, ж, 수)
|
addvaultwizard.new.validCharacters.chars=أحرف لكن دون علامات (#, $, !, @...)
|
||||||
addvaultwizard.new.validCharacters.numbers=الأعداد
|
addvaultwizard.new.validCharacters.numbers=الأرقام
|
||||||
addvaultwizard.new.validCharacters.dashes=الشرطة (%s) أو الشرطة السفلية (%s)
|
addvaultwizard.new.validCharacters.dashes=ناقص (%s) أو شِرْطَةٌ سفلية (%s)
|
||||||
### Expert Settings
|
### Expert Settings
|
||||||
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=تمكين إعدادات الخبراء
|
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=تمكين إعدادات الخبراء
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=أدخل قيمة بين 36 و 220 (الافتراضي 220)
|
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=أدخل قيمة بين 36 و 220 (الافتراضي 220)
|
||||||
@@ -319,7 +319,7 @@ preferences.volume.feature.readOnly=تحميل للقراءة فقط
|
|||||||
## Updates
|
## Updates
|
||||||
preferences.updates=تحديثات
|
preferences.updates=تحديثات
|
||||||
preferences.updates.currentVersion=الإصدار الحالي: %s
|
preferences.updates.currentVersion=الإصدار الحالي: %s
|
||||||
preferences.updates.autoUpdateCheck=تحقق من التحديثات اوتوماتيكيا
|
preferences.updates.autoUpdateCheck=التحقق من وجود تحديثات تلقائياً
|
||||||
preferences.updates.checkNowBtn=تحقق الان
|
preferences.updates.checkNowBtn=تحقق الان
|
||||||
preferences.updates.updateAvailable=التحديث إلى الإصدار %s متاح.
|
preferences.updates.updateAvailable=التحديث إلى الإصدار %s متاح.
|
||||||
preferences.updates.lastUpdateCheck=آخر فحص: %s
|
preferences.updates.lastUpdateCheck=آخر فحص: %s
|
||||||
@@ -395,6 +395,7 @@ main.vaultlist.contextMenu.vaultoptions=إظهار خيارات المخزن
|
|||||||
main.vaultlist.contextMenu.reveal=اظهار القرص
|
main.vaultlist.contextMenu.reveal=اظهار القرص
|
||||||
main.vaultlist.addVaultBtn.menuItemNew=إنشاء مخزن جديد...
|
main.vaultlist.addVaultBtn.menuItemNew=إنشاء مخزن جديد...
|
||||||
main.vaultlist.addVaultBtn.menuItemExisting=افتح مخزن موجود...
|
main.vaultlist.addVaultBtn.menuItemExisting=افتح مخزن موجود...
|
||||||
|
main.vaultlist.showEventsButton.tooltip=عرض الإشعارات
|
||||||
##Notificaition
|
##Notificaition
|
||||||
main.notification.updateAvailable=هناك تحديث متاح.
|
main.notification.updateAvailable=هناك تحديث متاح.
|
||||||
main.notification.support=دعم Cryptomator.
|
main.notification.support=دعم Cryptomator.
|
||||||
@@ -423,6 +424,9 @@ main.vaultDetail.stats=إحصائيات الخزنة
|
|||||||
main.vaultDetail.locateEncryptedFileBtn=تحديد موقع الملف المشفر
|
main.vaultDetail.locateEncryptedFileBtn=تحديد موقع الملف المشفر
|
||||||
main.vaultDetail.locateEncryptedFileBtn.tooltip=اختر ملف من خزانتك لتحديد مكان نظيره المشفر
|
main.vaultDetail.locateEncryptedFileBtn.tooltip=اختر ملف من خزانتك لتحديد مكان نظيره المشفر
|
||||||
main.vaultDetail.encryptedPathsCopied=تم نسخ مسارات الملفات إلى الحافظة!
|
main.vaultDetail.encryptedPathsCopied=تم نسخ مسارات الملفات إلى الحافظة!
|
||||||
|
main.vaultDetail.locateEncrypted.filePickerTitle=اختر الملَف من الخزنة
|
||||||
|
main.vaultDetail.decryptName.buttonLabel=فك تشفير اسم الملف
|
||||||
|
main.vaultDetail.decryptName.tooltip=اختر ملَف مشفر لفك تشفير اسمه
|
||||||
### Missing
|
### Missing
|
||||||
main.vaultDetail.missing.info=لم يتمكن Cryptomator من العثور على خزنة في هذا المسار.
|
main.vaultDetail.missing.info=لم يتمكن Cryptomator من العثور على خزنة في هذا المسار.
|
||||||
main.vaultDetail.missing.recheck=إعادة الفحص
|
main.vaultDetail.missing.recheck=إعادة الفحص
|
||||||
@@ -472,7 +476,7 @@ vaultOptions.mount.mountPoint.custom=استخدام المجلد المختار
|
|||||||
vaultOptions.mount.mountPoint.directoryPickerButton=اختر…
|
vaultOptions.mount.mountPoint.directoryPickerButton=اختر…
|
||||||
vaultOptions.mount.mountPoint.directoryPickerTitle=إختر مجلد
|
vaultOptions.mount.mountPoint.directoryPickerTitle=إختر مجلد
|
||||||
vaultOptions.mount.volumeType.default=الافتراضي (%s)
|
vaultOptions.mount.volumeType.default=الافتراضي (%s)
|
||||||
vaultOptions.mount.volumeType.restartRequired=لاستخدام هذا النوع من وحدة التخزين يحتاج Cryptomator إلى إعادة تشغيله.
|
vaultOptions.mount.volumeType.restartRequired=لاستخدام هذا النوع من وحدة التخزين يحتاج Cryptomator إلى إعادة تشغيل.
|
||||||
vaultOptions.mount.volume.tcp.port=منفذ TCP
|
vaultOptions.mount.volume.tcp.port=منفذ TCP
|
||||||
vaultOptions.mount.volume.type=نوع وحدة التخزين
|
vaultOptions.mount.volume.type=نوع وحدة التخزين
|
||||||
## Master Key
|
## Master Key
|
||||||
@@ -579,7 +583,40 @@ shareVault.hub.instruction.2=2. امنح الوصول لعضو الفريق في
|
|||||||
shareVault.hub.openHub=زيارة Cryptomator Hub
|
shareVault.hub.openHub=زيارة Cryptomator Hub
|
||||||
|
|
||||||
# Decrypt File Names
|
# Decrypt File Names
|
||||||
|
decryptNames.title=فك تشفير اسم الملَف
|
||||||
|
decryptNames.filePicker.title=اختر ملَف مشفر
|
||||||
|
decryptNames.filePicker.extensionDescription=ملف مشفر
|
||||||
|
decryptNames.copyTable.tooltip=نسخ الجدول
|
||||||
|
decryptNames.clearTable.tooltip=مسح الجدول
|
||||||
|
decryptNames.copyHint=نسخ محتوى الخلية مع %s
|
||||||
|
decryptNames.dropZone.message=إسقاط الملفات أو انقر لتحديد
|
||||||
|
decryptNames.dropZone.error.vaultInternalFiles=مخزن الملفات الداخلية مع عدم تحديد اسم قابل للتشفير
|
||||||
|
decryptNames.dropZone.error.foreignFiles=الملفات لا تنتمي إلى مخزن "%s"
|
||||||
|
decryptNames.dropZone.error.noDirIdBackup=مسار الملفات المحددة لا يحتوي على ملَف dirId.c9r
|
||||||
|
decryptNames.dropZone.error.generic=فشل فك تشفير أسماء الملفات
|
||||||
|
|
||||||
|
|
||||||
# Event View
|
# Event View
|
||||||
|
eventView.title=أحداث
|
||||||
|
eventView.filter.allVaults=الكل
|
||||||
|
eventView.clearListButton.tooltip=تفريغ القائمة
|
||||||
## event list entries
|
## event list entries
|
||||||
|
eventView.entry.vaultLocked.description=فتح "%s" للحصول على التفاصيل
|
||||||
|
eventView.entry.conflictResolved.message=تم حل التضارب
|
||||||
|
eventView.entry.conflictResolved.showDecrypted=إظهار الملف غير المشفر
|
||||||
|
eventView.entry.conflictResolved.copyDecrypted=نسخ المسار غير المشفر
|
||||||
|
eventView.entry.conflict.message=فشل حل التضارب
|
||||||
|
eventView.entry.conflict.showDecrypted=إظهار الملَف غير المشفر الأصلي
|
||||||
|
eventView.entry.conflict.copyDecrypted=نسخ المسار غير المشفر والأصلي
|
||||||
|
eventView.entry.conflict.showEncrypted=إظهار ملف متضارب ومشفر
|
||||||
|
eventView.entry.conflict.copyEncrypted=نسخ مسار التشفير المتعارض
|
||||||
|
eventView.entry.decryptionFailed.message=فشل فك التشفير
|
||||||
|
eventView.entry.decryptionFailed.showEncrypted=عرض ملَف المشفر
|
||||||
|
eventView.entry.decryptionFailed.copyEncrypted=نسخ مسار المشفر
|
||||||
|
eventView.entry.brokenDirFile.message=رابط الدليل المكسور
|
||||||
|
eventView.entry.brokenDirFile.showEncrypted=إظهار الرابط المكسور، المشفر
|
||||||
|
eventView.entry.brokenDirFile.copyEncrypted=نسخ مسار الرابط المكسور
|
||||||
|
eventView.entry.brokenFileNode.message=عقدة ملفات النظام التافلة
|
||||||
|
eventView.entry.brokenFileNode.showEncrypted=عرض العقدة المشفّرة التافلة
|
||||||
|
eventView.entry.brokenFileNode.copyEncrypted=نسخ مسار العقدة المشفّرة التافلة
|
||||||
|
eventView.entry.brokenFileNode.copyDecrypted=نسخ المسار غير المشفر
|
||||||
|
|||||||
@@ -283,6 +283,7 @@ preferences.title=Præferencer
|
|||||||
## General
|
## General
|
||||||
preferences.general=Generelt
|
preferences.general=Generelt
|
||||||
preferences.general.startHidden=Skjul vinduet når Cryptomator starter
|
preferences.general.startHidden=Skjul vinduet når Cryptomator starter
|
||||||
|
preferences.general.autoCloseVaults=Lås bokse uden at spørge ved afslutning af applikationen
|
||||||
preferences.general.debugLogging=Aktivér fejllogning
|
preferences.general.debugLogging=Aktivér fejllogning
|
||||||
preferences.general.debugDirectory=Vis logfiler
|
preferences.general.debugDirectory=Vis logfiler
|
||||||
preferences.general.autoStart=Start Cryptomator automatisk ved opstart
|
preferences.general.autoStart=Start Cryptomator automatisk ved opstart
|
||||||
@@ -301,6 +302,7 @@ preferences.interface.interfaceOrientation=Brugerflade retning
|
|||||||
preferences.interface.interfaceOrientation.ltr=Venstre til højre
|
preferences.interface.interfaceOrientation.ltr=Venstre til højre
|
||||||
preferences.interface.interfaceOrientation.rtl=Højre til venstre
|
preferences.interface.interfaceOrientation.rtl=Højre til venstre
|
||||||
preferences.interface.showTrayIcon=Vis ikon i system-bakken (kræver genstart)
|
preferences.interface.showTrayIcon=Vis ikon i system-bakken (kræver genstart)
|
||||||
|
preferences.interface.compactMode=Aktivér kompakt bokse-liste
|
||||||
## Volume
|
## Volume
|
||||||
preferences.volume=Virtuelt drev
|
preferences.volume=Virtuelt drev
|
||||||
preferences.volume.type=Standard Drev Type
|
preferences.volume.type=Standard Drev Type
|
||||||
@@ -320,7 +322,13 @@ preferences.updates.currentVersion=Nuværende version: %s
|
|||||||
preferences.updates.autoUpdateCheck=Søg automatisk efter opdateringer
|
preferences.updates.autoUpdateCheck=Søg automatisk efter opdateringer
|
||||||
preferences.updates.checkNowBtn=Kontrollér nu
|
preferences.updates.checkNowBtn=Kontrollér nu
|
||||||
preferences.updates.updateAvailable=Opdatering til version %s er tilgængelig.
|
preferences.updates.updateAvailable=Opdatering til version %s er tilgængelig.
|
||||||
|
preferences.updates.lastUpdateCheck=Seneste tjek: %s
|
||||||
|
preferences.updates.lastUpdateCheck.never=aldrig
|
||||||
|
preferences.updates.lastUpdateCheck.recently=for nylig
|
||||||
|
preferences.updates.lastUpdateCheck.daysAgo=%s dage siden
|
||||||
|
preferences.updates.lastUpdateCheck.hoursAgo=%s timer siden
|
||||||
preferences.updates.checkFailed=Søgning efter opdateringer fejlede. Tjek din internetforbindelse eller forsøg igen senere.
|
preferences.updates.checkFailed=Søgning efter opdateringer fejlede. Tjek din internetforbindelse eller forsøg igen senere.
|
||||||
|
preferences.updates.upToDate=Cryptomator er opdateret.
|
||||||
|
|
||||||
## Contribution
|
## Contribution
|
||||||
preferences.contribute=Støt os
|
preferences.contribute=Støt os
|
||||||
@@ -328,8 +336,14 @@ preferences.contribute.registeredFor=Registreret supporter-certifikat for %s
|
|||||||
preferences.contribute.noCertificate=Hjælp Cryptomator, og modtag et supporter-certifikat. Det er ligesom en license-nøgle, men til fantastiske mennesker som bruger fri software. ;-)
|
preferences.contribute.noCertificate=Hjælp Cryptomator, og modtag et supporter-certifikat. Det er ligesom en license-nøgle, men til fantastiske mennesker som bruger fri software. ;-)
|
||||||
preferences.contribute.getCertificate=Har du ikke et allerede? Se her hvordan du kan få et.
|
preferences.contribute.getCertificate=Har du ikke et allerede? Se her hvordan du kan få et.
|
||||||
preferences.contribute.promptText=Indsæt koden for supporter-certifikatet her
|
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
|
||||||
|
|
||||||
### Remove License Key Dialog
|
### Remove License Key Dialog
|
||||||
|
removeCert.title=Fjern certifikat
|
||||||
|
removeCert.message=Fjern supporter-certifikat?
|
||||||
|
removeCert.description=Cryptomators kernefunktioner påvirkes ikke af dette. Hverken adgangen er begrænset, eller sikkerhedsniveauet sænket til dine bokse.
|
||||||
#<-- Add entries for donations and code/translation/documentation contribution -->
|
#<-- Add entries for donations and code/translation/documentation contribution -->
|
||||||
|
|
||||||
## About
|
## About
|
||||||
@@ -379,6 +393,9 @@ main.vaultlist.contextMenu.unlock=Lås op…
|
|||||||
main.vaultlist.contextMenu.unlockNow=Lås op nu
|
main.vaultlist.contextMenu.unlockNow=Lås op nu
|
||||||
main.vaultlist.contextMenu.vaultoptions=Vis boksindstillinger
|
main.vaultlist.contextMenu.vaultoptions=Vis boksindstillinger
|
||||||
main.vaultlist.contextMenu.reveal=Vis drev
|
main.vaultlist.contextMenu.reveal=Vis drev
|
||||||
|
main.vaultlist.addVaultBtn.menuItemNew=Opret ny boks...
|
||||||
|
main.vaultlist.addVaultBtn.menuItemExisting=Åbn eksisterende boks...
|
||||||
|
main.vaultlist.showEventsButton.tooltip=Åbn begivenhedsvisning
|
||||||
##Notificaition
|
##Notificaition
|
||||||
main.notification.updateAvailable=Opdatering er tilgængelig.
|
main.notification.updateAvailable=Opdatering er tilgængelig.
|
||||||
main.notification.support=Støt Cryptomator.
|
main.notification.support=Støt Cryptomator.
|
||||||
@@ -404,9 +421,12 @@ main.vaultDetail.throughput.idle=afventer
|
|||||||
main.vaultDetail.throughput.kbps=%.1f KiB/s
|
main.vaultDetail.throughput.kbps=%.1f KiB/s
|
||||||
main.vaultDetail.throughput.mbps=%.1f MiB/s
|
main.vaultDetail.throughput.mbps=%.1f MiB/s
|
||||||
main.vaultDetail.stats=Boks statistik
|
main.vaultDetail.stats=Boks statistik
|
||||||
main.vaultDetail.locateEncryptedFileBtn=Find Krypteret Fil
|
main.vaultDetail.locateEncryptedFileBtn=Find krypteret fil
|
||||||
main.vaultDetail.locateEncryptedFileBtn.tooltip=Vælg en fil fra din boks for at finde dens krypterede modpart
|
main.vaultDetail.locateEncryptedFileBtn.tooltip=Vælg en fil fra din boks for at finde dens krypterede modpart
|
||||||
main.vaultDetail.encryptedPathsCopied=Stier kopieret!
|
main.vaultDetail.encryptedPathsCopied=Stier kopieret!
|
||||||
|
main.vaultDetail.locateEncrypted.filePickerTitle=Vælg fil inde i boks
|
||||||
|
main.vaultDetail.decryptName.buttonLabel=Dekryptér filnavn
|
||||||
|
main.vaultDetail.decryptName.tooltip=Vælg en krypteret fil i boks for at dekryptere dets navn
|
||||||
### Missing
|
### Missing
|
||||||
main.vaultDetail.missing.info=Cryptomator kunne ikke finde en boks på denne sti.
|
main.vaultDetail.missing.info=Cryptomator kunne ikke finde en boks på denne sti.
|
||||||
main.vaultDetail.missing.recheck=Kontrollér igen
|
main.vaultDetail.missing.recheck=Kontrollér igen
|
||||||
@@ -531,9 +551,15 @@ updateReminder.yesOnce=Ja, én gang
|
|||||||
updateReminder.yesAutomatically=Ja, automatisk
|
updateReminder.yesAutomatically=Ja, automatisk
|
||||||
|
|
||||||
#Dokany Support End
|
#Dokany Support End
|
||||||
|
dokanySupportEnd.title=Meddelelse om udfasning
|
||||||
|
dokanySupportEnd.message=Understøttelse slutter for Dokany
|
||||||
|
dokanySupportEnd.description=Drevtypen Dokany understøttes ikke længere af Cryptomator. Dine indstillinger er justeret for at bruge standard drevtypen nu. Du kan se standardtypen i indstillingerne.
|
||||||
dokanySupportEnd.preferencesBtn=Åbn Indstillinger
|
dokanySupportEnd.preferencesBtn=Åbn Indstillinger
|
||||||
|
|
||||||
#Retry If Readonly
|
#Retry If Readonly
|
||||||
|
retryIfReadonly.title=Begrænset boksadgang
|
||||||
|
retryIfReadonly.message=Ingen skriveadgang til boksens mappe
|
||||||
|
retryIfReadonly.description=Cryptomator kan ikke skrive til boksens mappe. Du kan ændre boksen til at være skrivebeskyttet og prøve igen. Denne indstilling kan være deaktiveret i boksens indstillinger.
|
||||||
|
|
||||||
# Share Vault
|
# Share Vault
|
||||||
shareVault.title=Del Boks
|
shareVault.title=Del Boks
|
||||||
@@ -556,7 +582,11 @@ shareVault.hub.instruction.2=2. Giv adgang til holdmedlem i Cryptomator Hub.
|
|||||||
shareVault.hub.openHub=Åben Cryptomator Hub
|
shareVault.hub.openHub=Åben Cryptomator Hub
|
||||||
|
|
||||||
# Decrypt File Names
|
# Decrypt File Names
|
||||||
|
decryptNames.title=Dekryptér Filnavne
|
||||||
|
decryptNames.copyHint=Kopiér celleindhold med %s
|
||||||
|
decryptNames.dropZone.message=Slip filer eller klik for at vælge
|
||||||
|
|
||||||
|
|
||||||
# Event View
|
# Event View
|
||||||
|
eventView.title=Begivenheder
|
||||||
## event list entries
|
## event list entries
|
||||||
|
|||||||
@@ -616,7 +616,7 @@ eventView.entry.decryptionFailed.copyEncrypted=Pfad der verschlüsselten Datei k
|
|||||||
eventView.entry.brokenDirFile.message=Ungültiger Verzeichnislink
|
eventView.entry.brokenDirFile.message=Ungültiger Verzeichnislink
|
||||||
eventView.entry.brokenDirFile.showEncrypted=Defekten, verschlüsselten Link anzeigen
|
eventView.entry.brokenDirFile.showEncrypted=Defekten, verschlüsselten Link anzeigen
|
||||||
eventView.entry.brokenDirFile.copyEncrypted=Pfad des ungültigen Links kopieren
|
eventView.entry.brokenDirFile.copyEncrypted=Pfad des ungültigen Links kopieren
|
||||||
eventView.entry.brokenFileNode.message=Fehlender Dateisystemknoten
|
eventView.entry.brokenFileNode.message=Beschädigter Dateisystemknoten
|
||||||
eventView.entry.brokenFileNode.showEncrypted=Beschädigten, verschlüsselten Knoten anzeigen
|
eventView.entry.brokenFileNode.showEncrypted=Beschädigten, verschlüsselten Knoten anzeigen
|
||||||
eventView.entry.brokenFileNode.copyEncrypted=Pfad des kaputten, verschlüsselten Knotens kopieren
|
eventView.entry.brokenFileNode.copyEncrypted=Pfad des beschädigten, verschlüsselten Knotens kopieren
|
||||||
eventView.entry.brokenFileNode.copyDecrypted=Pfad der entschlüsselten Datei kopieren
|
eventView.entry.brokenFileNode.copyDecrypted=Pfad der entschlüsselten Datei kopieren
|
||||||
|
|||||||
@@ -395,6 +395,7 @@ main.vaultlist.contextMenu.vaultoptions=Εμφάνιση επιλογών Vault
|
|||||||
main.vaultlist.contextMenu.reveal=Αποκάλυψη εικονικού δίσκου
|
main.vaultlist.contextMenu.reveal=Αποκάλυψη εικονικού δίσκου
|
||||||
main.vaultlist.addVaultBtn.menuItemNew=Δημιουργία Νέας Κρύπτης...
|
main.vaultlist.addVaultBtn.menuItemNew=Δημιουργία Νέας Κρύπτης...
|
||||||
main.vaultlist.addVaultBtn.menuItemExisting=Άνοιγμα Υπάρχοντος Κρύπτης...
|
main.vaultlist.addVaultBtn.menuItemExisting=Άνοιγμα Υπάρχοντος Κρύπτης...
|
||||||
|
main.vaultlist.showEventsButton.tooltip=Άνοιγμα προβολής συμβάντων
|
||||||
##Notificaition
|
##Notificaition
|
||||||
main.notification.updateAvailable=Η ενημέρωση είναι διαθέσιμη.
|
main.notification.updateAvailable=Η ενημέρωση είναι διαθέσιμη.
|
||||||
main.notification.support=Υποστήριξη Cryptomator.
|
main.notification.support=Υποστήριξη Cryptomator.
|
||||||
@@ -423,6 +424,9 @@ main.vaultDetail.stats=Στατιστικά Vault
|
|||||||
main.vaultDetail.locateEncryptedFileBtn=Εντοπισμός Κρυπτογραφημένου Αρχείου
|
main.vaultDetail.locateEncryptedFileBtn=Εντοπισμός Κρυπτογραφημένου Αρχείου
|
||||||
main.vaultDetail.locateEncryptedFileBtn.tooltip=Επιλέξτε ένα αρχείο από την κρύπτη σας για να εντοπίσετε το κρυπτογραφημένο αντίστοιχο
|
main.vaultDetail.locateEncryptedFileBtn.tooltip=Επιλέξτε ένα αρχείο από την κρύπτη σας για να εντοπίσετε το κρυπτογραφημένο αντίστοιχο
|
||||||
main.vaultDetail.encryptedPathsCopied=Οι Διαδρομές Αντιγράφηκαν στο Πρόχειρο!
|
main.vaultDetail.encryptedPathsCopied=Οι Διαδρομές Αντιγράφηκαν στο Πρόχειρο!
|
||||||
|
main.vaultDetail.locateEncrypted.filePickerTitle=Επιλογή Αρχείου Μέσα Στην Κρύπτη
|
||||||
|
main.vaultDetail.decryptName.buttonLabel=Αποκρυπτογράφηση Ονόματος Αρχείου
|
||||||
|
main.vaultDetail.decryptName.tooltip=Επιλέξτε ένα κρυπτογραφημένο αρχείο κρύπτης για να αποκρυπτογραφήσετε το όνομά του
|
||||||
### Missing
|
### Missing
|
||||||
main.vaultDetail.missing.info=Cryptomator δεν βρήκε vault σε αυτόν τον κατάλογο.
|
main.vaultDetail.missing.info=Cryptomator δεν βρήκε vault σε αυτόν τον κατάλογο.
|
||||||
main.vaultDetail.missing.recheck=Επανέλεγχος
|
main.vaultDetail.missing.recheck=Επανέλεγχος
|
||||||
@@ -579,8 +583,40 @@ shareVault.hub.instruction.2=2. Παραχωρήστε πρόσβαση σε μ
|
|||||||
shareVault.hub.openHub=Ανοίξτε το Cryptomator Hub
|
shareVault.hub.openHub=Ανοίξτε το Cryptomator Hub
|
||||||
|
|
||||||
# Decrypt File Names
|
# Decrypt File Names
|
||||||
|
decryptNames.title=Αποκρυπτογράφηση Ονομάτων Αρχείων
|
||||||
|
decryptNames.filePicker.title=Επιλογή κρυπτογραφημένου αρχείου
|
||||||
|
decryptNames.filePicker.extensionDescription=Κρυπτογραφημένο κρυπτογραφημένου αρχείο Cryptomator
|
||||||
|
decryptNames.copyTable.tooltip=Αντιγραφή πίνακα
|
||||||
|
decryptNames.clearTable.tooltip=Εκκαθάριση πίνακα
|
||||||
|
decryptNames.copyHint=Αντιγραφή περιεχομένου κελιού με %s
|
||||||
|
decryptNames.dropZone.message=Απόθεση αρχείων ή κλικ για επιλογή
|
||||||
|
decryptNames.dropZone.error.vaultInternalFiles=Εσωτερικά αρχεία κρύπτης χωρίς να επιλεχθεί όνομα αποκρυπτογράφησης
|
||||||
|
decryptNames.dropZone.error.foreignFiles=Τα αρχεία δεν ανήκουν στην κρύπτη "%s"
|
||||||
|
decryptNames.dropZone.error.noDirIdBackup=Ο κατάλογος των επιλεγμένων αρχείων δεν περιέχει αρχείο dirId.c9r
|
||||||
|
decryptNames.dropZone.error.generic=Αποτυχία αποκρυπτογράφησης ονομάτων αρχείων
|
||||||
|
|
||||||
|
|
||||||
# Event View
|
# Event View
|
||||||
|
eventView.title=Συμβάντα
|
||||||
eventView.filter.allVaults=Όλες
|
eventView.filter.allVaults=Όλες
|
||||||
|
eventView.clearListButton.tooltip=Εκκαθάριση λίστας
|
||||||
## event list entries
|
## event list entries
|
||||||
|
eventView.entry.vaultLocked.description=Ξεκλείδωμα "%s" για λεπτομέρειες
|
||||||
|
eventView.entry.conflictResolved.message=Επίλυση σύγκρουσης
|
||||||
|
eventView.entry.conflictResolved.showDecrypted=Εμφάνιση αποκρυπτογραφημένου αρχείου
|
||||||
|
eventView.entry.conflictResolved.copyDecrypted=Αντιγραφή αποκρυπτογραφημένης διαδρομής
|
||||||
|
eventView.entry.conflict.message=Η επίλυση συγκρούσεων απέτυχε
|
||||||
|
eventView.entry.conflict.showDecrypted=Εμφάνιση αποκρυπτογραφημένων, αρχικό αρχείο
|
||||||
|
eventView.entry.conflict.copyDecrypted=Αντιγραφή αποκρυπτογραφημένων, αρχική διαδρομή
|
||||||
|
eventView.entry.conflict.showEncrypted=Εμφάνιση αντικρουόμενου, κρυπτογραφημένο αρχείο
|
||||||
|
eventView.entry.conflict.copyEncrypted=Αντιγραφή σύγκρουσης, κρυπτογραφημένη διαδρομή
|
||||||
|
eventView.entry.decryptionFailed.message=Η αποκρυπτογράφηση απέτυχε
|
||||||
|
eventView.entry.decryptionFailed.showEncrypted=Εμφάνιση κρυπτογραφημένου αρχείου
|
||||||
|
eventView.entry.decryptionFailed.copyEncrypted=Αντιγραφή κρυπτογραφημένης διαδρομής
|
||||||
|
eventView.entry.brokenDirFile.message=Μη λειτουργικός σύνδεσμος καταλόγου
|
||||||
|
eventView.entry.brokenDirFile.showEncrypted=Εμφάνιση μη λειτουργικού, κρυπτογραφημένου συνδέσμου
|
||||||
|
eventView.entry.brokenDirFile.copyEncrypted=Αντιγραφή διαδρομής του μη λειτουργικού συνδέσμου
|
||||||
|
eventView.entry.brokenFileNode.message=Μη λειτουργικός κόμβος συστήματος αρχείων
|
||||||
|
eventView.entry.brokenFileNode.showEncrypted=Εμφάνιση μη λειτουργικού, κρυπτογραφημένου κόμβου
|
||||||
|
eventView.entry.brokenFileNode.copyEncrypted=Αντιγραφή διαδρομής του μη λειτουργικού, κρυπτογραφημένου κόμβου
|
||||||
|
eventView.entry.brokenFileNode.copyDecrypted=Αντιγραφή αποκρυπτογραφημένης διαδρομής
|
||||||
|
|||||||
@@ -177,6 +177,7 @@ hub.registerFailed.description.generic=Rekisteröinnissä tapahtui virhe. Löyd
|
|||||||
hub.registerFailed.description.deviceAlreadyExists=Tämä laite on jo rekisteröity toiselle käyttäjälle. Yritä vaihtaa käyttäjätiliä tai käytää toista laitetta.
|
hub.registerFailed.description.deviceAlreadyExists=Tämä laite on jo rekisteröity toiselle käyttäjälle. Yritä vaihtaa käyttäjätiliä tai käytää toista laitetta.
|
||||||
### Unauthorized
|
### Unauthorized
|
||||||
hub.unauthorized.message=Pääsy estetty
|
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ä.
|
||||||
### Requires Account Initialization
|
### Requires Account Initialization
|
||||||
hub.requireAccountInit.message=Toimia vaaditaan
|
hub.requireAccountInit.message=Toimia vaaditaan
|
||||||
hub.requireAccountInit.description.0=Jatkaaksesi, ole hyvä ja suorita tarvittavat toimenpiteet
|
hub.requireAccountInit.description.0=Jatkaaksesi, ole hyvä ja suorita tarvittavat toimenpiteet
|
||||||
@@ -282,6 +283,7 @@ preferences.title=Asetukset
|
|||||||
## General
|
## General
|
||||||
preferences.general=Yleiset
|
preferences.general=Yleiset
|
||||||
preferences.general.startHidden=Piilota ikkuna kun Cryptomator käynnistyy
|
preferences.general.startHidden=Piilota ikkuna kun Cryptomator käynnistyy
|
||||||
|
preferences.general.autoCloseVaults=Lukitse holvit kysymättä, kun ohjelma suljetaan
|
||||||
preferences.general.debugLogging=Ota virheloki käyttöön
|
preferences.general.debugLogging=Ota virheloki käyttöön
|
||||||
preferences.general.debugDirectory=Näytä lokitiedostot
|
preferences.general.debugDirectory=Näytä lokitiedostot
|
||||||
preferences.general.autoStart=Käynnistä Cryptomator järjestelmän käynnistyessä
|
preferences.general.autoStart=Käynnistä Cryptomator järjestelmän käynnistyessä
|
||||||
@@ -330,6 +332,7 @@ preferences.updates.upToDate=Cryptomator on ajan tasalla.
|
|||||||
|
|
||||||
## Contribution
|
## Contribution
|
||||||
preferences.contribute=Tue meitä
|
preferences.contribute=Tue meitä
|
||||||
|
preferences.contribute.registeredFor=Tukijan sertifikaatti rekisteröity %s
|
||||||
preferences.contribute.noCertificate=Tue Cryptomatoria ja saa tukijasertifikaatti. Se on kuin lisenssiavain, mutta mahtaville ihmisille, jotka käyttävät vapaata ohjelmistoa. ;-)
|
preferences.contribute.noCertificate=Tue Cryptomatoria ja saa tukijasertifikaatti. Se on kuin lisenssiavain, mutta mahtaville ihmisille, jotka käyttävät vapaata ohjelmistoa. ;-)
|
||||||
preferences.contribute.getCertificate=Eikö sinulla ole sellaista? Lue lisää miten voit hankkia sellaisen.
|
preferences.contribute.getCertificate=Eikö sinulla ole sellaista? Lue lisää miten voit hankkia sellaisen.
|
||||||
preferences.contribute.promptText=Liitä tukijasertifikaatin koodi tähän
|
preferences.contribute.promptText=Liitä tukijasertifikaatin koodi tähän
|
||||||
@@ -391,6 +394,7 @@ main.vaultlist.contextMenu.vaultoptions=Näytä holvin asetukset
|
|||||||
main.vaultlist.contextMenu.reveal=Paljasta Asema
|
main.vaultlist.contextMenu.reveal=Paljasta Asema
|
||||||
main.vaultlist.addVaultBtn.menuItemNew=Luo uusi holvi...
|
main.vaultlist.addVaultBtn.menuItemNew=Luo uusi holvi...
|
||||||
main.vaultlist.addVaultBtn.menuItemExisting=Avaa olemassa oleva holvi...
|
main.vaultlist.addVaultBtn.menuItemExisting=Avaa olemassa oleva holvi...
|
||||||
|
main.vaultlist.showEventsButton.tooltip=Avaa tapahtumanäkymä
|
||||||
##Notificaition
|
##Notificaition
|
||||||
main.notification.updateAvailable=Päivitys on saatavilla.
|
main.notification.updateAvailable=Päivitys on saatavilla.
|
||||||
main.notification.support=Tue Cryptomatoria.
|
main.notification.support=Tue Cryptomatoria.
|
||||||
@@ -419,6 +423,9 @@ main.vaultDetail.stats=Holvin tilastot
|
|||||||
main.vaultDetail.locateEncryptedFileBtn=Etsi salattu tiedosto
|
main.vaultDetail.locateEncryptedFileBtn=Etsi salattu tiedosto
|
||||||
main.vaultDetail.locateEncryptedFileBtn.tooltip=Valitse tiedosto holvistasi löytääksesi sen salatun vastineen
|
main.vaultDetail.locateEncryptedFileBtn.tooltip=Valitse tiedosto holvistasi löytääksesi sen salatun vastineen
|
||||||
main.vaultDetail.encryptedPathsCopied=Polut kopioitu leikepöydälle!
|
main.vaultDetail.encryptedPathsCopied=Polut kopioitu leikepöydälle!
|
||||||
|
main.vaultDetail.locateEncrypted.filePickerTitle=Valitse tiedosto holvin sisältä
|
||||||
|
main.vaultDetail.decryptName.buttonLabel=Pura tiedoston nimen salaus
|
||||||
|
main.vaultDetail.decryptName.tooltip=Valitse salattu tiedosto purkaaksesi nimen salauksen
|
||||||
### Missing
|
### Missing
|
||||||
main.vaultDetail.missing.info=Cryptomator ei löytänyt täältä holvia.
|
main.vaultDetail.missing.info=Cryptomator ei löytänyt täältä holvia.
|
||||||
main.vaultDetail.missing.recheck=Tarkista uudelleen
|
main.vaultDetail.missing.recheck=Tarkista uudelleen
|
||||||
@@ -435,6 +442,7 @@ main.vaultDetail.error.windowTitle=Virhe ladatessa holvia
|
|||||||
# Wrong File Alert
|
# Wrong File Alert
|
||||||
wrongFileAlert.title=Kuinka tiedostoja salataan
|
wrongFileAlert.title=Kuinka tiedostoja salataan
|
||||||
wrongFileAlert.message=Yritkö salata nämä tiedostot?
|
wrongFileAlert.message=Yritkö salata nämä tiedostot?
|
||||||
|
wrongFileAlert.description=Tätä varten Cryptomator luo levyn järjestelmäsi tiedostonhallintaan.
|
||||||
wrongFileAlert.instruction.0=Salaa tiedostot seuraavasti:
|
wrongFileAlert.instruction.0=Salaa tiedostot seuraavasti:
|
||||||
wrongFileAlert.instruction.1=1. Avaa holvisi.
|
wrongFileAlert.instruction.1=1. Avaa holvisi.
|
||||||
wrongFileAlert.instruction.2=2. Klikkaa "Paljasta" avataksesi aseman tiedostoselaimessasi.
|
wrongFileAlert.instruction.2=2. Klikkaa "Paljasta" avataksesi aseman tiedostoselaimessasi.
|
||||||
@@ -545,6 +553,10 @@ updateReminder.yesAutomatically=Kyllä, automaattisesti
|
|||||||
dokanySupportEnd.preferencesBtn=Avaa asetukset
|
dokanySupportEnd.preferencesBtn=Avaa asetukset
|
||||||
|
|
||||||
#Retry If Readonly
|
#Retry If Readonly
|
||||||
|
retryIfReadonly.title=Rajoitettu holvin pääsy
|
||||||
|
retryIfReadonly.message=Ei kirjoitusoikeuksia holvihakemistoon
|
||||||
|
retryIfReadonly.description=Cryptomator ei voi kirjoittaa holvihakemistoon. Voit vaihtaa holvin lukutilaan ja yrittää uudelleen. Tämä vaihtoehto voidaan poistaa käytöstä holvin asetuksissa.
|
||||||
|
retryIfReadonly.retry=Vaihda ja yritä uudelleen
|
||||||
|
|
||||||
# Share Vault
|
# Share Vault
|
||||||
shareVault.title=Jaa holvi
|
shareVault.title=Jaa holvi
|
||||||
@@ -554,14 +566,46 @@ shareVault.instruction.1=1. Jaa käyttöoikeus salattuun holvikansioon pilvipalv
|
|||||||
shareVault.instruction.2=2. Jaa holvin salasana turvallisella tavalla.
|
shareVault.instruction.2=2. Jaa holvin salasana turvallisella tavalla.
|
||||||
shareVault.remarkBestPractices=Lisätietoja varten tutustu hyvien käytäntöjen suosituksiin dokumentaatiossamme.
|
shareVault.remarkBestPractices=Lisätietoja varten tutustu hyvien käytäntöjen suosituksiin dokumentaatiossamme.
|
||||||
shareVault.docsTooltip=Avaa dokumentaatio lukeaksesi lisää holvein jakamisesta.
|
shareVault.docsTooltip=Avaa dokumentaatio lukeaksesi lisää holvein jakamisesta.
|
||||||
|
shareVault.hubAd.description=Turvallinen tapa työskennellä tiimeissä
|
||||||
|
shareVault.hubAd.keyManagement=• Nollatieto avainten hallinta
|
||||||
|
shareVault.hubAd.authentication=• Vahva todennus
|
||||||
|
shareVault.hubAd.encryption=• Päästä päähän salaus
|
||||||
shareVault.visitHub=Käy Cryptomator Hubissa
|
shareVault.visitHub=Käy Cryptomator Hubissa
|
||||||
|
|
||||||
shareVault.hub.message=Kuinka jakaa Hub -holvi
|
shareVault.hub.message=Kuinka jakaa Hub -holvi
|
||||||
|
shareVault.hub.description=Jotta holvin sisältö voitaisiin jakaa toisen tiimin jäsenen kanssa, sinun on suoritettava kaksi vaihetta:
|
||||||
shareVault.hub.instruction.1=1. Jaa käyttöoikeus salattuun holvikansioon pilvipalvelun kautta.
|
shareVault.hub.instruction.1=1. Jaa käyttöoikeus salattuun holvikansioon pilvipalvelun kautta.
|
||||||
|
shareVault.hub.instruction.2=2. Myönnä käyttöoikeus tiimin jäsenelle Cryptomator Hubissa.
|
||||||
shareVault.hub.openHub=Avaa Cryptomator Hub
|
shareVault.hub.openHub=Avaa Cryptomator Hub
|
||||||
|
|
||||||
# Decrypt File Names
|
# Decrypt File Names
|
||||||
|
decryptNames.title=Pura tiedostonimien salaus
|
||||||
|
decryptNames.filePicker.title=Valitse salattu tiedosto
|
||||||
|
decryptNames.dropZone.message=Pudota tiedostoja tai napsauta valitaksesi
|
||||||
|
decryptNames.dropZone.error.generic=Tiedostonimien salauksen purku epäonnistui
|
||||||
|
|
||||||
|
|
||||||
# Event View
|
# Event View
|
||||||
|
eventView.title=Tapahtumat
|
||||||
|
eventView.filter.allVaults=Kaikki
|
||||||
|
eventView.clearListButton.tooltip=Tyhjennä luettelo
|
||||||
## event list entries
|
## event list entries
|
||||||
|
eventView.entry.vaultLocked.description=Avaa "%s" lisätietoja varten
|
||||||
|
eventView.entry.conflictResolved.message=Ratkaistu ristiriita
|
||||||
|
eventView.entry.conflictResolved.showDecrypted=Näytä purettu tiedosto
|
||||||
|
eventView.entry.conflictResolved.copyDecrypted=Kopioi purettu polku
|
||||||
|
eventView.entry.conflict.message=Ristiriidan ratkaisu epäonnistui
|
||||||
|
eventView.entry.conflict.showDecrypted=Näytä purettu, alkuperäinen tiedosto
|
||||||
|
eventView.entry.conflict.copyDecrypted=Näytä purettu, alkuperäinen polku
|
||||||
|
eventView.entry.conflict.showEncrypted=Näytä ristiriitainen, salattu tiedosto
|
||||||
|
eventView.entry.conflict.copyEncrypted=Kopioi ristiriitainen, salattu polku
|
||||||
|
eventView.entry.decryptionFailed.message=Salauksen purku epäonnistui
|
||||||
|
eventView.entry.decryptionFailed.showEncrypted=Näytä salattu tiedosto
|
||||||
|
eventView.entry.decryptionFailed.copyEncrypted=Kopioi salattu polku
|
||||||
|
eventView.entry.brokenDirFile.message=Virheellinen hakemiston linkki
|
||||||
|
eventView.entry.brokenDirFile.showEncrypted=Näytä virheellinen, salattu linkki
|
||||||
|
eventView.entry.brokenDirFile.copyEncrypted=Kopioi virheellisen polun linkki
|
||||||
|
eventView.entry.brokenFileNode.message=Virheellinen tiedostojärjestelmän solmu
|
||||||
|
eventView.entry.brokenFileNode.showEncrypted=Näytä virheellinen, salattu solmu
|
||||||
|
eventView.entry.brokenFileNode.copyEncrypted=Kopioi virheellisen, salatun solmun polku
|
||||||
|
eventView.entry.brokenFileNode.copyDecrypted=Kopioi purettu polku
|
||||||
|
|||||||
@@ -590,6 +590,7 @@ decryptNames.copyTable.tooltip=Copier le tableau
|
|||||||
decryptNames.clearTable.tooltip=Effacer le tableau
|
decryptNames.clearTable.tooltip=Effacer le tableau
|
||||||
decryptNames.copyHint=Copier le contenu de la cellule avec %s
|
decryptNames.copyHint=Copier le contenu de la cellule avec %s
|
||||||
decryptNames.dropZone.message=Déposer des fichiers ou cliquer pour en sélectionner
|
decryptNames.dropZone.message=Déposer des fichiers ou cliquer pour en sélectionner
|
||||||
|
decryptNames.dropZone.error.vaultInternalFiles=Fichiers internes du coffre sans nom déchiffrable sélectionnés
|
||||||
decryptNames.dropZone.error.foreignFiles=Les fichiers n'appartiennent pas au coffre « %s »
|
decryptNames.dropZone.error.foreignFiles=Les fichiers n'appartiennent pas au coffre « %s »
|
||||||
decryptNames.dropZone.error.noDirIdBackup=Le répertoire des fichiers sélectionnés ne contient pas de fichier dirId.c9r
|
decryptNames.dropZone.error.noDirIdBackup=Le répertoire des fichiers sélectionnés ne contient pas de fichier dirId.c9r
|
||||||
decryptNames.dropZone.error.generic=Impossible de déchiffrer les noms de fichiers
|
decryptNames.dropZone.error.generic=Impossible de déchiffrer les noms de fichiers
|
||||||
|
|||||||
@@ -424,6 +424,9 @@ main.vaultDetail.stats=Vault 통계
|
|||||||
main.vaultDetail.locateEncryptedFileBtn=암호화된 파일 위치
|
main.vaultDetail.locateEncryptedFileBtn=암호화된 파일 위치
|
||||||
main.vaultDetail.locateEncryptedFileBtn.tooltip=암호화된 파일을 보기 위해 Vault에서 파일을 선택하십시오.
|
main.vaultDetail.locateEncryptedFileBtn.tooltip=암호화된 파일을 보기 위해 Vault에서 파일을 선택하십시오.
|
||||||
main.vaultDetail.encryptedPathsCopied=클립보드에 복사됨!
|
main.vaultDetail.encryptedPathsCopied=클립보드에 복사됨!
|
||||||
|
main.vaultDetail.locateEncrypted.filePickerTitle=Vault 내부에서 파일 선택
|
||||||
|
main.vaultDetail.decryptName.buttonLabel=파일명 복호화
|
||||||
|
main.vaultDetail.decryptName.tooltip=암호화된 볼트 파일을 선택해 파일 이름을 복호화
|
||||||
### Missing
|
### Missing
|
||||||
main.vaultDetail.missing.info=Cryptomator가 이 경로에 있는 Vault를 찾지 못했습니다.
|
main.vaultDetail.missing.info=Cryptomator가 이 경로에 있는 Vault를 찾지 못했습니다.
|
||||||
main.vaultDetail.missing.recheck=다시 시도
|
main.vaultDetail.missing.recheck=다시 시도
|
||||||
@@ -580,11 +583,23 @@ shareVault.hub.instruction.2=2. Cryptomator Hub에서 팀 구성원에 접근을
|
|||||||
shareVault.hub.openHub=Cryptomator Hub 열기
|
shareVault.hub.openHub=Cryptomator Hub 열기
|
||||||
|
|
||||||
# Decrypt File Names
|
# Decrypt File Names
|
||||||
|
decryptNames.title=파일명 복호화
|
||||||
|
decryptNames.filePicker.title=암호화된 파일 선택
|
||||||
|
decryptNames.filePicker.extensionDescription=Cryptomator로 암호화된 파일
|
||||||
|
decryptNames.copyTable.tooltip=테이블 복사
|
||||||
|
decryptNames.clearTable.tooltip=테이블 비우기
|
||||||
|
decryptNames.copyHint=%s로 셀 내용 복사하기
|
||||||
|
decryptNames.dropZone.message=파일을 여기에 드롭하거나 클릭하세요
|
||||||
|
decryptNames.dropZone.error.vaultInternalFiles=복호화 가능한 이름이 선택되지 않은 Vailt 내부 파일
|
||||||
|
decryptNames.dropZone.error.foreignFiles=Vault "%s"에 포함되지 않은 파일
|
||||||
|
decryptNames.dropZone.error.noDirIdBackup=선택된 파일 폴더에 dirId.c9r 파일이 포함되어 있지 않습니다
|
||||||
|
decryptNames.dropZone.error.generic=파일 이름 복호화 실패
|
||||||
|
|
||||||
|
|
||||||
# Event View
|
# Event View
|
||||||
eventView.title=이벤트
|
eventView.title=이벤트
|
||||||
eventView.filter.allVaults=전체
|
eventView.filter.allVaults=전체
|
||||||
|
eventView.clearListButton.tooltip=목록 지우기
|
||||||
## event list entries
|
## event list entries
|
||||||
eventView.entry.vaultLocked.description="%s"를 잠금 해제하여 세부정보 보기
|
eventView.entry.vaultLocked.description="%s"를 잠금 해제하여 세부정보 보기
|
||||||
eventView.entry.conflictResolved.message=해결된 충돌
|
eventView.entry.conflictResolved.message=해결된 충돌
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# Locale Specific CSS files such as CJK, RTL,...
|
# Locale Specific CSS files such as CJK, RTL,...
|
||||||
|
|
||||||
# Generics
|
# Generics
|
||||||
|
generic.action.dismiss=Откажи
|
||||||
## Button
|
## Button
|
||||||
generic.button.apply=Примени
|
generic.button.apply=Примени
|
||||||
generic.button.back=Назад
|
generic.button.back=Назад
|
||||||
@@ -13,6 +14,7 @@ generic.button.copied=Копирано!
|
|||||||
generic.button.done=Прифати
|
generic.button.done=Прифати
|
||||||
generic.button.next=Продолжи
|
generic.button.next=Продолжи
|
||||||
generic.button.print=Печати
|
generic.button.print=Печати
|
||||||
|
generic.button.remove=Отстрани
|
||||||
|
|
||||||
# Error
|
# Error
|
||||||
error.message=Грешка
|
error.message=Грешка
|
||||||
@@ -22,6 +24,8 @@ error.hyperlink.report=Пријави ја оваа грешка
|
|||||||
error.technicalDetails=Детали:
|
error.technicalDetails=Детали:
|
||||||
error.existingSolutionDescription=Не очекуваше да се случи ова. Но најдовме постоечко решение за оваа грешка. Ве молиме погледнете го следниот линк.
|
error.existingSolutionDescription=Не очекуваше да се случи ова. Но најдовме постоечко решение за оваа грешка. Ве молиме погледнете го следниот линк.
|
||||||
error.hyperlink.solution=Пребарај решение
|
error.hyperlink.solution=Пребарај решение
|
||||||
|
error.dismiss=Откажи
|
||||||
|
error.lookUpSolution=Пребарај решение
|
||||||
|
|
||||||
# Defaults
|
# Defaults
|
||||||
defaults.vault.vaultName=Сеф
|
defaults.vault.vaultName=Сеф
|
||||||
|
|||||||
@@ -395,6 +395,7 @@ main.vaultlist.contextMenu.vaultoptions=Pokaż opcje sejfu
|
|||||||
main.vaultlist.contextMenu.reveal=Otwórz lokalizację
|
main.vaultlist.contextMenu.reveal=Otwórz lokalizację
|
||||||
main.vaultlist.addVaultBtn.menuItemNew=Utwórz Nowy Sejf...
|
main.vaultlist.addVaultBtn.menuItemNew=Utwórz Nowy Sejf...
|
||||||
main.vaultlist.addVaultBtn.menuItemExisting=Otwórz Istniejący Sejf...
|
main.vaultlist.addVaultBtn.menuItemExisting=Otwórz Istniejący Sejf...
|
||||||
|
main.vaultlist.showEventsButton.tooltip=Otwórz widok wydarzeń
|
||||||
##Notificaition
|
##Notificaition
|
||||||
main.notification.updateAvailable=Dostępna aktualizacja.
|
main.notification.updateAvailable=Dostępna aktualizacja.
|
||||||
main.notification.support=Wspomóż Cryptomatora.
|
main.notification.support=Wspomóż Cryptomatora.
|
||||||
@@ -423,6 +424,9 @@ main.vaultDetail.stats=Statystyki sejfu
|
|||||||
main.vaultDetail.locateEncryptedFileBtn=Zlokalizuj zaszyfrowany plik
|
main.vaultDetail.locateEncryptedFileBtn=Zlokalizuj zaszyfrowany plik
|
||||||
main.vaultDetail.locateEncryptedFileBtn.tooltip=Wybierz plik z sejfu, aby zlokalizować jego zaszyfrowany odpowiednik
|
main.vaultDetail.locateEncryptedFileBtn.tooltip=Wybierz plik z sejfu, aby zlokalizować jego zaszyfrowany odpowiednik
|
||||||
main.vaultDetail.encryptedPathsCopied=Ścieżki skopiowane do schowka!
|
main.vaultDetail.encryptedPathsCopied=Ścieżki skopiowane do schowka!
|
||||||
|
main.vaultDetail.locateEncrypted.filePickerTitle=Wybierz plik wewnątrz sejfu
|
||||||
|
main.vaultDetail.decryptName.buttonLabel=Odszyfruj nazwę pliku
|
||||||
|
main.vaultDetail.decryptName.tooltip=Wybierz zaszyfrowany plik sejfu do odszyfrowania jego nazwy
|
||||||
### Missing
|
### Missing
|
||||||
main.vaultDetail.missing.info=Cryptomator nie mógł znaleźć sejfu w tej lokalizacji.
|
main.vaultDetail.missing.info=Cryptomator nie mógł znaleźć sejfu w tej lokalizacji.
|
||||||
main.vaultDetail.missing.recheck=Ponów próbę
|
main.vaultDetail.missing.recheck=Ponów próbę
|
||||||
@@ -579,7 +583,40 @@ shareVault.hub.instruction.2=2. Udziel dostępu członkowi zespołu w Cryptomato
|
|||||||
shareVault.hub.openHub=Otwórz Cryptomator Hub
|
shareVault.hub.openHub=Otwórz Cryptomator Hub
|
||||||
|
|
||||||
# Decrypt File Names
|
# Decrypt File Names
|
||||||
|
decryptNames.title=Odszyfruj nazwy plików
|
||||||
|
decryptNames.filePicker.title=Wybierz zaszyfrowany plik
|
||||||
|
decryptNames.filePicker.extensionDescription=Zaszyfrowany plik Cryptomator
|
||||||
|
decryptNames.copyTable.tooltip=Kopiuj tabelę
|
||||||
|
decryptNames.clearTable.tooltip=Wyczyść tabelę
|
||||||
|
decryptNames.copyHint=Kopiuj zawartość komórki z %s
|
||||||
|
decryptNames.dropZone.message=Upuść pliki lub kliknij, aby wybrać
|
||||||
|
decryptNames.dropZone.error.vaultInternalFiles=Wybrano wewnętrzne pliki sejfu z nazwami niemożliwymi do odszyfrowania
|
||||||
|
decryptNames.dropZone.error.foreignFiles=Pliki nie należą do sejfu "%s"
|
||||||
|
decryptNames.dropZone.error.noDirIdBackup=Katalog wybranych plików nie zawiera pliku dirId.c9r
|
||||||
|
decryptNames.dropZone.error.generic=Nie udało się odszyfrować nazw plików
|
||||||
|
|
||||||
|
|
||||||
# Event View
|
# Event View
|
||||||
|
eventView.title=Zdarzenia
|
||||||
|
eventView.filter.allVaults=Wszystkie
|
||||||
|
eventView.clearListButton.tooltip=Wyczyść listę
|
||||||
## event list entries
|
## event list entries
|
||||||
|
eventView.entry.vaultLocked.description=Odblokuj "%s" po szczegóły
|
||||||
|
eventView.entry.conflictResolved.message=Konflikt rozwiązany
|
||||||
|
eventView.entry.conflictResolved.showDecrypted=Pokaż odszyfrowany plik
|
||||||
|
eventView.entry.conflictResolved.copyDecrypted=Kopiuj odszyfrowaną ścieżkę
|
||||||
|
eventView.entry.conflict.message=Rozwiązywanie konfliktu nie powiodło się
|
||||||
|
eventView.entry.conflict.showDecrypted=Pokaż odszyfrowany, oryginalny plik
|
||||||
|
eventView.entry.conflict.copyDecrypted=Kopiuj odszyfrowaną, oryginalną ścieżkę
|
||||||
|
eventView.entry.conflict.showEncrypted=Pokaż sprzeczny, zaszyfrowany plik
|
||||||
|
eventView.entry.conflict.copyEncrypted=Kopiuj sprzeczną, zaszyfrowaną ścieżkę
|
||||||
|
eventView.entry.decryptionFailed.message=Odszyfrowywanie nie powiodło się
|
||||||
|
eventView.entry.decryptionFailed.showEncrypted=Pokaż zaszyfrowany plik
|
||||||
|
eventView.entry.decryptionFailed.copyEncrypted=Kopiuj zaszyfrowaną ścieżkę
|
||||||
|
eventView.entry.brokenDirFile.message=Uszkodzony link do katalogu
|
||||||
|
eventView.entry.brokenDirFile.showEncrypted=Pokaż uszkodzony, zaszyfrowany link
|
||||||
|
eventView.entry.brokenDirFile.copyEncrypted=Kopiuj ścieżkę uszkodzonego linku
|
||||||
|
eventView.entry.brokenFileNode.message=Uszkodzony węzeł systemu plików
|
||||||
|
eventView.entry.brokenFileNode.showEncrypted=Pokaż uszkodzony, zaszyfrowany węzeł
|
||||||
|
eventView.entry.brokenFileNode.copyEncrypted=Kopiuj ścieżkę uszkodzonego, zaszyfrowanego węzła
|
||||||
|
eventView.entry.brokenFileNode.copyDecrypted=Kopiuj odszyfrowaną ścieżkę
|
||||||
|
|||||||
@@ -424,9 +424,9 @@ main.vaultDetail.stats=Estatísticas do Cofre
|
|||||||
main.vaultDetail.locateEncryptedFileBtn=Localizar Ficheiro Encriptado
|
main.vaultDetail.locateEncryptedFileBtn=Localizar Ficheiro Encriptado
|
||||||
main.vaultDetail.locateEncryptedFileBtn.tooltip=Escolha um ficheiro do seu cofre para localizar a sua contraparte encriptada
|
main.vaultDetail.locateEncryptedFileBtn.tooltip=Escolha um ficheiro do seu cofre para localizar a sua contraparte encriptada
|
||||||
main.vaultDetail.encryptedPathsCopied=Caminhos copiados para a área de transferência!
|
main.vaultDetail.encryptedPathsCopied=Caminhos copiados para a área de transferência!
|
||||||
main.vaultDetail.locateEncrypted.filePickerTitle=Selecionar ficheiro dentro do cofre
|
main.vaultDetail.locateEncrypted.filePickerTitle=Selecione o ficheiro no cofre
|
||||||
main.vaultDetail.decryptName.buttonLabel=Desencriptar nome do ficheiro
|
main.vaultDetail.decryptName.buttonLabel=Descriptografar o nome do ficheiro
|
||||||
main.vaultDetail.decryptName.tooltip=Escolha um ficheiro de cofre encriptado para desencriptar o seu nome
|
main.vaultDetail.decryptName.tooltip=Escolha um ficheiro encriptado do cofre para desencriptar o seu nome
|
||||||
### Missing
|
### Missing
|
||||||
main.vaultDetail.missing.info=O Cryptomator não conseguiu encontrar um cofre neste diretório.
|
main.vaultDetail.missing.info=O Cryptomator não conseguiu encontrar um cofre neste diretório.
|
||||||
main.vaultDetail.missing.recheck=Verificar novamente
|
main.vaultDetail.missing.recheck=Verificar novamente
|
||||||
@@ -583,17 +583,17 @@ shareVault.hub.instruction.2=2. Conceder acesso ao membro da equipe no Hub Crypt
|
|||||||
shareVault.hub.openHub=Abrir Hub do Cryptomator
|
shareVault.hub.openHub=Abrir Hub do Cryptomator
|
||||||
|
|
||||||
# Decrypt File Names
|
# Decrypt File Names
|
||||||
decryptNames.title=Desencriptar nomes de ficheiros
|
decryptNames.title=Desencriptar os nomes dos ficheiros
|
||||||
decryptNames.filePicker.title=Selecione o ficheiro encriptado
|
decryptNames.filePicker.title=Selecione o ficheiro encriptado
|
||||||
decryptNames.filePicker.extensionDescription=Ficheiro encriptado do Cryptomator
|
decryptNames.filePicker.extensionDescription=Ficheiro encriptado pelo Criptomator
|
||||||
decryptNames.copyTable.tooltip=Copiar tabela
|
decryptNames.copyTable.tooltip=Copiar a tabela
|
||||||
decryptNames.clearTable.tooltip=Limpar tabela
|
decryptNames.clearTable.tooltip=Limpar a tabela
|
||||||
decryptNames.copyHint=Copiar conteúdo da célula com %s
|
decryptNames.copyHint=Copiar o conteúdo da célula com %s
|
||||||
decryptNames.dropZone.message=Solte os ficheiros ou clique para selecionar
|
decryptNames.dropZone.message=Largue os ficheiros ou clique para selecionar
|
||||||
decryptNames.dropZone.error.vaultInternalFiles=Ficheiros internos do cofre sem nome decifrável selecionado
|
decryptNames.dropZone.error.vaultInternalFiles=Ficheiros internos do coftre sem nome desencriptável selecionado
|
||||||
decryptNames.dropZone.error.foreignFiles=Ficheiros não pertencem ao cofre "%s"
|
decryptNames.dropZone.error.foreignFiles=Os ficheiros não pertencem ao cofre "%s"
|
||||||
decryptNames.dropZone.error.noDirIdBackup=O diretório dos ficheiros selecionados não contém o ficheiro dirId.c9r
|
decryptNames.dropZone.error.noDirIdBackup=O diretório dos ficheiros selecionados não contém o ficheiro dirId.c9r
|
||||||
decryptNames.dropZone.error.generic=Falha ao desencriptar nomes de ficheiros
|
decryptNames.dropZone.error.generic=Falha ao desencriptar os nomes dos ficheiros
|
||||||
|
|
||||||
|
|
||||||
# Event View
|
# Event View
|
||||||
@@ -603,20 +603,20 @@ eventView.clearListButton.tooltip=Limpar lista
|
|||||||
## event list entries
|
## event list entries
|
||||||
eventView.entry.vaultLocked.description=Desbloquear "%s" para detalhes
|
eventView.entry.vaultLocked.description=Desbloquear "%s" para detalhes
|
||||||
eventView.entry.conflictResolved.message=Conflito resolvido
|
eventView.entry.conflictResolved.message=Conflito resolvido
|
||||||
eventView.entry.conflictResolved.showDecrypted=Mostrar ficheiro desencriptado
|
eventView.entry.conflictResolved.showDecrypted=Mostrar o ficheiro desencriptado
|
||||||
eventView.entry.conflictResolved.copyDecrypted=Copiar caminho desencriptado
|
eventView.entry.conflictResolved.copyDecrypted=Copiar o caminho desencriptado
|
||||||
eventView.entry.conflict.message=Resolução de conflito falhou
|
eventView.entry.conflict.message=A resolução do conflito falhou
|
||||||
eventView.entry.conflict.showDecrypted=Mostrar ficheiro original desencriptado
|
eventView.entry.conflict.showDecrypted=Mostrar o ficheiro original desencriptado
|
||||||
eventView.entry.conflict.copyDecrypted=Copie caminho original desencriptado
|
eventView.entry.conflict.copyDecrypted=Copie o caminho original desencriptado
|
||||||
eventView.entry.conflict.showEncrypted=Mostrar ficheiro encriptado conflitante
|
eventView.entry.conflict.showEncrypted=Mostrar o ficheiro encriptado em conflito
|
||||||
eventView.entry.conflict.copyEncrypted=Copiar caminho encriptado conflituante
|
eventView.entry.conflict.copyEncrypted=Copiar o caminho encriptado em conflito
|
||||||
eventView.entry.decryptionFailed.message=Falha na desencriptação
|
eventView.entry.decryptionFailed.message=A desencriptação falhou
|
||||||
eventView.entry.decryptionFailed.showEncrypted=Mostrar ficheiro encriptado
|
eventView.entry.decryptionFailed.showEncrypted=Mostrar ficheiro encriptado
|
||||||
eventView.entry.decryptionFailed.copyEncrypted=Copiar caminho de encriptação
|
eventView.entry.decryptionFailed.copyEncrypted=Copiar o caminho encriptado
|
||||||
eventView.entry.brokenDirFile.message=Link de diretório quebrado
|
eventView.entry.brokenDirFile.message=Link de diretório quebrado
|
||||||
eventView.entry.brokenDirFile.showEncrypted=Mostrar link quebrado e encriptado
|
eventView.entry.brokenDirFile.showEncrypted=Mostrar o link quebrado e encriptado
|
||||||
eventView.entry.brokenDirFile.copyEncrypted=Copiar caminho do link quebrado
|
eventView.entry.brokenDirFile.copyEncrypted=Copiar caminho do link quebrado
|
||||||
eventView.entry.brokenFileNode.message=Nó do sistema de ficheiros avariado
|
eventView.entry.brokenFileNode.message=Nó do sistema de ficheiros avariado
|
||||||
eventView.entry.brokenFileNode.showEncrypted=Mostrar nó encriptado quebrado
|
eventView.entry.brokenFileNode.showEncrypted=Mostrar nó encriptado e danificado
|
||||||
eventView.entry.brokenFileNode.copyEncrypted=Copiar o caminho do nó encriptado e danificado
|
eventView.entry.brokenFileNode.copyEncrypted=Copiar o caminho do nó encriptado e danificado
|
||||||
eventView.entry.brokenFileNode.copyDecrypted=Copiar caminho desencriptado
|
eventView.entry.brokenFileNode.copyDecrypted=Copiar o caminho desencriptado
|
||||||
|
|||||||
@@ -283,6 +283,7 @@ preferences.title=Inställningar
|
|||||||
## General
|
## General
|
||||||
preferences.general=Allmänt
|
preferences.general=Allmänt
|
||||||
preferences.general.startHidden=Dölj fönster när Cryptomator startar
|
preferences.general.startHidden=Dölj fönster när Cryptomator startar
|
||||||
|
preferences.general.autoCloseVaults=Lås valv utan att fråga när du avslutar applikationen
|
||||||
preferences.general.debugLogging=Aktivera loggning för felsökning
|
preferences.general.debugLogging=Aktivera loggning för felsökning
|
||||||
preferences.general.debugDirectory=Visa loggfiler
|
preferences.general.debugDirectory=Visa loggfiler
|
||||||
preferences.general.autoStart=Starta Cryptomator vid systemstart
|
preferences.general.autoStart=Starta Cryptomator vid systemstart
|
||||||
|
|||||||
@@ -15,17 +15,17 @@ generic.button.copied=Скопійовано!
|
|||||||
generic.button.done=Завершити
|
generic.button.done=Завершити
|
||||||
generic.button.next=Далі
|
generic.button.next=Далі
|
||||||
generic.button.print=Друкувати
|
generic.button.print=Друкувати
|
||||||
generic.button.remove=Прибрати
|
generic.button.remove=Вилучити
|
||||||
|
|
||||||
# Error
|
# Error
|
||||||
error.message=Сталася помилка
|
error.message=Виникла помилка
|
||||||
error.description=Ой! Cryptomator не очікував, що таке трапиться. Ви можете знайти існуючі рішення цієї помилки. Або, якщо про це ще не повідомили, то не соромтеся зробити це.
|
error.description=Ой! Cryptomator не очікував, що це станеться. Ви можете спробувати знайти рішення для цієї помилки. Або, якщо про неї ще не повідомляли, не соромтеся зробити це.
|
||||||
error.hyperlink.lookup=Дізнатися більше про цю помилку
|
error.hyperlink.lookup=Дізнатися більше про цю помилку
|
||||||
error.hyperlink.report=Повідомити про цю помилку
|
error.hyperlink.report=Повідомити про цю помилку
|
||||||
error.technicalDetails=Докладно:
|
error.technicalDetails=Докладно:
|
||||||
error.existingSolutionDescription=Cryptomator не очікував, що це станеться. Але ми знайшли спосіб розв'язання цієї проблеми. Ознайомтесь з ним, будь ласка, далі.
|
error.existingSolutionDescription=Cryptomator не очікував, що це станеться. Однак ми знайшли рішення для цієї помилки. Будь ласка, перегляньте наступне посилання.
|
||||||
error.hyperlink.solution=Ознайомтесь із рішенням
|
error.hyperlink.solution=Ознайомтесь із рішенням
|
||||||
error.lookupPermissionMessage=Cryptomator може спробувати знайти спосіб розв'язання цієї проблеми онлайн. Це передбачає відправку запиту до нашої бази даних проблем з вашої ІР.
|
error.lookupPermissionMessage=Cryptomator може спробувати знайти рішення для цієї проблеми онлайн. Це передбачає відправку запиту до нашої бази даних проблем з вашої IP-адреси.
|
||||||
error.dismiss=Відхилити
|
error.dismiss=Відхилити
|
||||||
error.lookUpSolution=Пошук рішення
|
error.lookUpSolution=Пошук рішення
|
||||||
|
|
||||||
@@ -35,14 +35,14 @@ defaults.vault.vaultName=Сховище
|
|||||||
# Tray Menu
|
# Tray Menu
|
||||||
traymenu.showMainWindow=Показати
|
traymenu.showMainWindow=Показати
|
||||||
traymenu.showPreferencesWindow=Налаштування
|
traymenu.showPreferencesWindow=Налаштування
|
||||||
traymenu.lockAllVaults=Заблокувати все
|
traymenu.lockAllVaults=Заблокувати всі
|
||||||
traymenu.quitApplication=Вийти
|
traymenu.quitApplication=Вийти
|
||||||
traymenu.vault.unlock=Розблокувати
|
traymenu.vault.unlock=Розблокувати
|
||||||
traymenu.vault.lock=Заблокувати
|
traymenu.vault.lock=Заблокувати
|
||||||
traymenu.vault.reveal=Розгорнути вікно
|
traymenu.vault.reveal=Відкрити диск
|
||||||
|
|
||||||
# Add Vault Wizard
|
# Add Vault Wizard
|
||||||
addvaultwizard.title=Додавання сховища
|
addvaultwizard.title=Додати сховище
|
||||||
## New
|
## New
|
||||||
addvaultwizard.new.title=Додавання нового сховища
|
addvaultwizard.new.title=Додавання нового сховища
|
||||||
### Name
|
### Name
|
||||||
@@ -50,68 +50,68 @@ addvaultwizard.new.nameInstruction=Оберіть назву для сховищ
|
|||||||
addvaultwizard.new.namePrompt=Назва сховища
|
addvaultwizard.new.namePrompt=Назва сховища
|
||||||
### Location
|
### Location
|
||||||
addvaultwizard.new.locationInstruction=Де Cryptomator має зберігати зашифровані файли вашого сховища?
|
addvaultwizard.new.locationInstruction=Де Cryptomator має зберігати зашифровані файли вашого сховища?
|
||||||
addvaultwizard.new.locationLoading=Перевірка локальної файлової системи на предмет наявності папок клієнтів хмарних сховищ…
|
addvaultwizard.new.locationLoading=Перевірка локальної файлової системи на наявність каталогів хмарних сховищ…
|
||||||
addvaultwizard.new.locationLabel=Розташування сховища
|
addvaultwizard.new.locationLabel=Розташування сховища
|
||||||
addvaultwizard.new.locationPrompt=…
|
addvaultwizard.new.locationPrompt=…
|
||||||
addvaultwizard.new.directoryPickerLabel=Власне розташування
|
addvaultwizard.new.directoryPickerLabel=Власне розташування
|
||||||
addvaultwizard.new.directoryPickerButton=Обрати…
|
addvaultwizard.new.directoryPickerButton=Обрати…
|
||||||
addvaultwizard.new.directoryPickerTitle=Обрати папку
|
addvaultwizard.new.directoryPickerTitle=Обрати каталог
|
||||||
addvaultwizard.new.fileAlreadyExists=Файл чи папка з вказаним іменем сховища вже існує
|
addvaultwizard.new.fileAlreadyExists=Файл або каталог з такою назвою сховища вже існує
|
||||||
addvaultwizard.new.locationDoesNotExist=Папка недоступна за вказаною адресою або не існує
|
addvaultwizard.new.locationDoesNotExist=Каталог за вказаним шляхом не існує або недоступний
|
||||||
addvaultwizard.new.locationIsNotWritable=Вказана адреса доступна лише для читання
|
addvaultwizard.new.locationIsNotWritable=Немає дозволу на запис за вказаним шляхом
|
||||||
addvaultwizard.new.locationIsOk=Це місце підходить для сховища
|
addvaultwizard.new.locationIsOk=Це місце підходить для сховища
|
||||||
addvaultwizard.new.invalidName=Недопустима назва сховища
|
addvaultwizard.new.invalidName=Недійсна назва сховища
|
||||||
addvaultwizard.new.validName=Допустима назва сховища
|
addvaultwizard.new.validName=Дійсна назва сховища
|
||||||
addvaultwizard.new.validCharacters.message=Назва сховища може містити такі символи:
|
addvaultwizard.new.validCharacters.message=Назва сховища може містити такі символи:
|
||||||
addvaultwizard.new.validCharacters.chars=Літери (напр. a, ж or 수)
|
addvaultwizard.new.validCharacters.chars=Літери (напр. a, ж або 수)
|
||||||
addvaultwizard.new.validCharacters.numbers=Цифри
|
addvaultwizard.new.validCharacters.numbers=Цифри
|
||||||
addvaultwizard.new.validCharacters.dashes=Дефіс (%s) або підкреслення (%s)
|
addvaultwizard.new.validCharacters.dashes=Дефіс (%s) або підкреслення (%s)
|
||||||
### Expert Settings
|
### Expert Settings
|
||||||
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Увімкнути експертні налаштування
|
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Увімкнути експертні налаштування
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Введіть значення від 36 до 220 (типово 220)
|
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Введіть значення від 36 до 220 (за замовчуванням 220)
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=Відкрийте документацію, щоб дізнатися більше.
|
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=Відкрийте документацію, щоб дізнатися більше.
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.title=Максимальна довжина зашифрованих імен файлів
|
addvaultwizard.new.expertSettings.shorteningThreshold.title=Максимальна довжина зашифрованих назв файлів
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.valid=Вірний
|
addvaultwizard.new.expertSettings.shorteningThreshold.valid=Вірний
|
||||||
### Password
|
### Password
|
||||||
addvaultwizard.new.createVaultBtn=Створити сховище
|
addvaultwizard.new.createVaultBtn=Створити сховище
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice=Ви не зможете отримати доступ до своїх даних без пароля. Хочете створити ключ відновлення на випадок втрати паролю?
|
addvaultwizard.new.generateRecoveryKeyChoice=Ви не зможете отримати доступ до своїх даних без пароля. Хочете створити ключ відновлення на випадок втрати паролю?
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice.yes=Так, будь ласка, береженого Бог береже
|
addvaultwizard.new.generateRecoveryKeyChoice.yes=Так, будь ласка, краще перестрахуватися
|
||||||
addvaultwizard.new.generateRecoveryKeyChoice.no=Ні, дякую, я не втрачу свій пароль
|
addvaultwizard.new.generateRecoveryKeyChoice.no=Ні, дякую, я не втрачу свій пароль
|
||||||
### Information
|
### Information
|
||||||
addvault.new.readme.storageLocation.fileName=ВАЖЛИВО.rtf
|
addvault.new.readme.storageLocation.fileName=ВАЖЛИВО.rtf
|
||||||
addvault.new.readme.storageLocation.1=⚠️ ФАЙЛИ СХОВИЩА ⚠️
|
addvault.new.readme.storageLocation.1=⚠️ ФАЙЛИ СХОВИЩА ⚠️
|
||||||
addvault.new.readme.storageLocation.2=Це місце, де зберігається ваше сховище.
|
addvault.new.readme.storageLocation.2=Це місце, де зберігається ваше сховище.
|
||||||
addvault.new.readme.storageLocation.3=НЕ
|
addvault.new.readme.storageLocation.3=НЕ РОБІТЬ ЦЬОГО
|
||||||
addvault.new.readme.storageLocation.4=• змінюйте будь-які файли в цій папці, або
|
addvault.new.readme.storageLocation.4=• не змінюйте будь-які файли в цьому каталозі, та
|
||||||
addvault.new.readme.storageLocation.5=• додавайте безпосередньо до цієї папки будь-які файли для їх шифрування.
|
addvault.new.readme.storageLocation.5=• не додавайте безпосередньо до цього каталогу будь-які файли для їх шифрування.
|
||||||
addvault.new.readme.storageLocation.6=Якщо ви хочете зашифрувати файли та переглянути вміст сховища, зробіть так:
|
addvault.new.readme.storageLocation.6=Якщо ви хочете зашифрувати файли та переглянути вміст сховища, зробіть так:
|
||||||
addvault.new.readme.storageLocation.7=1. Додайте це сховище (папку) у Cryptomator.
|
addvault.new.readme.storageLocation.7=1. Додайте це сховище у Cryptomator.
|
||||||
addvault.new.readme.storageLocation.8=2. Розблокуйте його через Cryptomator.
|
addvault.new.readme.storageLocation.8=2. Розблокуйте його через Cryptomator.
|
||||||
addvault.new.readme.storageLocation.9=3. Отримайте доступ до вмісту сховища, натиснувши кнопку "Розгорнути".
|
addvault.new.readme.storageLocation.9=3. Натисніть кнопку «Відкрити диск», щоб отримати доступ до вмісту сховища.
|
||||||
addvault.new.readme.storageLocation.10=Якщо вам потрібна допомога, почитайте документацію: %s
|
addvault.new.readme.storageLocation.10=Якщо вам потрібна допомога, відвідайте документацію: %s
|
||||||
addvault.new.readme.accessLocation.fileName=ПРОЧИТАЙ_МЕНЕ.rtf
|
addvault.new.readme.accessLocation.fileName=ПРИВІТ.rtf
|
||||||
addvault.new.readme.accessLocation.1=🔐️ ЗАШИФРОВАНИЙ ТОМ 🔐️
|
addvault.new.readme.accessLocation.1=🔐️ ЗАШИФРОВАНИЙ ТОМ 🔐️
|
||||||
addvault.new.readme.accessLocation.2=Це місце розташування вашого сховища.
|
addvault.new.readme.accessLocation.2=Це розташування для доступу до вашого сховища.
|
||||||
addvault.new.readme.accessLocation.3=Будь-які файли, додані до цього тому, будуть зашифровані за допомогою Cryptomator. Ви можете працювати із ним як із будь-якою іншою директорією або накопичувачем. Це лише розшифрований вигляд вмісту сховища, ваші файли завжди знаходяться в зашифрованому вигляді на диску.
|
addvault.new.readme.accessLocation.3=Будь-які файли, додані до цього тому, будуть зашифровані за допомогою Cryptomator. Ви можете працювати із ним як із будь-якою іншою директорією або накопичувачем. Це лише розшифрований вигляд вмісту сховища, ваші файли завжди знаходяться в зашифрованому вигляді на диску.
|
||||||
addvault.new.readme.accessLocation.4=Цей файл можна видалити, якщо бажаєте.
|
addvault.new.readme.accessLocation.4=Цей файл можна видалити, якщо бажаєте.
|
||||||
## Existing
|
## Existing
|
||||||
addvaultwizard.existing.title=Додати наявне сховище
|
addvaultwizard.existing.title=Додати наявне сховище
|
||||||
addvaultwizard.existing.instruction=Виберіть файл "vault.cryptomator" вашого наявного сховища. Якщо існує лише файл з назвою "masterkey.cryptomator", виберіть його.
|
addvaultwizard.existing.instruction=Оберіть файл «vault.cryptomator» свого наявного сховища. Якщо існує лише файл з назвою «masterkey.cryptomator», оберіть його.
|
||||||
addvaultwizard.existing.chooseBtn=Обрати…
|
addvaultwizard.existing.chooseBtn=Обрати…
|
||||||
addvaultwizard.existing.filePickerTitle=Виберіть файл сховища
|
addvaultwizard.existing.filePickerTitle=Виберіть файл сховища
|
||||||
addvaultwizard.existing.filePickerMimeDesc=Сховище Cryptomator
|
addvaultwizard.existing.filePickerMimeDesc=Сховище Cryptomator
|
||||||
## Success
|
## Success
|
||||||
addvaultwizard.success.nextStepsInstructions=Додано сховище "%s".\nЦе сховище необхідно розблокувати для доступу або додавання вмісту. Але ви можете розблокувати його пізніше.
|
addvaultwizard.success.nextStepsInstructions=Сховище «%s» додано.\nЩоб отримати доступ або додати вміст, вам потрібно розблокувати це сховище. Також ви можете розблокувати його пізніше в будь-який час.
|
||||||
addvaultwizard.success.unlockNow=Розблокувати
|
addvaultwizard.success.unlockNow=Розблокувати
|
||||||
|
|
||||||
# Remove Vault
|
# Remove Vault
|
||||||
removeVault.title=Видалити "%s"
|
removeVault.title=Вилучити «%s»
|
||||||
removeVault.message=Видалити сховище?
|
removeVault.message=Вилучити сховище?
|
||||||
removeVault.description=Це лише змусить Cryptomator забути про це сховище. Його можна буде додати знову пізніше. Зашифровані файли на вашому жорсткому диску не буде втрачено.
|
removeVault.description=Це лише змусить Cryptomator забути про сховище. Ви зможете додати його знову. Зашифровані файли не будуть видалені з вашого накопичувача.
|
||||||
|
|
||||||
# Change Password
|
# Change Password
|
||||||
changepassword.title=Зміна паролю
|
changepassword.title=Зміна паролю
|
||||||
changepassword.enterOldPassword=Введіть поточний пароль для "%s"
|
changepassword.enterOldPassword=Введіть поточний пароль для «%s»
|
||||||
changepassword.finalConfirmation=Я розумію, що не зможу отримати доступ до даних, якщо забуду свій пароль
|
changepassword.finalConfirmation=Я розумію, що не зможу отримати доступ до даних, якщо забуду свій пароль
|
||||||
|
|
||||||
# Forget Password
|
# Forget Password
|
||||||
@@ -121,201 +121,202 @@ forgetPassword.description=Ця дія видалить збережений п
|
|||||||
forgetPassword.confirmBtn=Забути пароль
|
forgetPassword.confirmBtn=Забути пароль
|
||||||
|
|
||||||
# Unlock
|
# Unlock
|
||||||
unlock.title=Розблокування "%s"
|
unlock.title=Розблокування «%s»
|
||||||
unlock.passwordPrompt=Введіть пароль для "%s":
|
unlock.passwordPrompt=Введіть пароль для «%s»:
|
||||||
unlock.savePassword=Запам'ятати пароль
|
unlock.savePassword=Запам'ятати пароль
|
||||||
unlock.unlockBtn=Розблокувати
|
unlock.unlockBtn=Розблокувати
|
||||||
## Select
|
## Select
|
||||||
unlock.chooseMasterkey.message=Файл майстер-ключа не знайдено
|
unlock.chooseMasterkey.message=Файл майстер-ключа не знайдено
|
||||||
unlock.chooseMasterkey.description=Cryptomator не зміг знайти файл майстер-ключа для сховища "%s". Будь ласка, виберіть ключ вручну.
|
unlock.chooseMasterkey.description=Cryptomator не зміг знайти файл майстер-ключа для сховища «%s». Будь ласка, виберіть файл ключа вручну.
|
||||||
unlock.chooseMasterkey.filePickerTitle=Виберіть файл майстер-ключа
|
unlock.chooseMasterkey.filePickerTitle=Виберіть файл майстер-ключа
|
||||||
unlock.chooseMasterkey.filePickerMimeDesc=Майстер-ключ Cryptomator
|
unlock.chooseMasterkey.filePickerMimeDesc=Майстер-ключ Cryptomator
|
||||||
## Success
|
## Success
|
||||||
unlock.success.message=Успішно розблоковано
|
unlock.success.message=Успішно розблоковано
|
||||||
unlock.success.description=Вміст сховища "%s" тепер доступний через точку монтування.
|
unlock.success.description=Вміст сховища «%s» тепер доступний через точку монтування.
|
||||||
unlock.success.rememberChoice=Запам'ятайте мій вибір та більше не запитуйте
|
unlock.success.rememberChoice=Запам'ятайте мій вибір та більше не запитуйте
|
||||||
unlock.success.revealBtn=Розгорнути диск
|
unlock.success.revealBtn=Відкрити диск
|
||||||
## Failure
|
## Failure
|
||||||
unlock.error.customPath.message=Не вдалося змонтувати сховище за вказаним шляхом
|
unlock.error.customPath.message=Не вдалося змонтувати сховище за вказаним шляхом
|
||||||
unlock.error.customPath.description.notSupported=Якщо ви хочете надалі використовувати власний шлях, будь ласка, перейдіть до налаштувань та виберіть тип тому, що його підтримує. В іншому випадку перейдіть до параметрів сховища та оберіть точку монтування, що підтримується.
|
unlock.error.customPath.description.notSupported=Якщо ви хочете надалі використовувати власний шлях, будь ласка, перейдіть до налаштувань та виберіть тип тому, що його підтримує. В іншому випадку перейдіть до параметрів сховища та оберіть точку монтування, що підтримується.
|
||||||
unlock.error.customPath.description.notExists=Вказаний шлях монтування не існує. Створіть його в локальній файловій системі або змініть його в параметрах сховища.
|
unlock.error.customPath.description.notExists=Вказаний шлях монтування не існує. Створіть його в локальній файловій системі або змініть його в параметрах сховища.
|
||||||
unlock.error.customPath.description.inUse=Зараз використовується літера або користувацький шлях монтування "%s".
|
unlock.error.customPath.description.inUse=Літера диска або власний шлях монтування «%s» уже використовується.
|
||||||
unlock.error.customPath.description.hideawayNotDir=Цей тимчасовий прихований файл "%3$s" використовується для розблокування і не може бути видалений. Будь ласка, перевірте файл та видаліть його вручну.
|
unlock.error.customPath.description.hideawayNotDir=Тимчасовий прихований файл «%3$s», що використовувався для розблокування, не вдалося видалити. Будь ласка, перевірте файл, а потім видаліть його вручну.
|
||||||
unlock.error.customPath.description.couldNotBeCleaned=Ваше сховище неможливо змонтувати за шляхом "%s". Будь ласка, спробуйте знову або оберіть інший шлях.
|
unlock.error.customPath.description.couldNotBeCleaned=Ваше сховище неможливо змонтувати за шляхом «%s». Будь ласка, спробуйте знову або оберіть інший шлях.
|
||||||
unlock.error.customPath.description.notEmptyDir=Користувацький шлях монтування "%s" не є порожньою папкою. Будь ласка, оберіть порожню папку і спробуйте ще раз.
|
unlock.error.customPath.description.notEmptyDir=Власний шлях монтування «%s» не є порожньою папкою. Будь ласка, оберіть порожню папку та спробуйте ще раз.
|
||||||
unlock.error.customPath.description.generic=Ви вибрали користувацький шлях монтування для цього сховища, але його використання призвело до помилки з текстом: %2$s
|
unlock.error.customPath.description.generic=Ви обрали власний шлях монтування для цього сховища, але його використання не вдалося з таким повідомленням: %2$s
|
||||||
unlock.error.restartRequired.message=Не вдалося розблокувати сховище
|
unlock.error.restartRequired.message=Не вдалося розблокувати сховище
|
||||||
unlock.error.restartRequired.description=Змініть тип носія в налаштуваннях сховища або перезапустіть Cryptomator.
|
unlock.error.restartRequired.description=Змініть тип тому в параметрах сховища або перезапустіть Cryptomator.
|
||||||
unlock.error.title=Розблокувати "%s" не вдалося
|
unlock.error.title=Розблокувати «%s» не вдалося
|
||||||
## Hub
|
## Hub
|
||||||
hub.noKeychain.message=Не вдалося отримати доступ до ключа пристрою
|
hub.noKeychain.message=Не вдалося отримати доступ до ключа пристрою
|
||||||
hub.noKeychain.description=Щоб розблокувати сховища Hub, необхідний ключ пристрою, який захищено за допомогою зв'язки ключів. Щоб продовжити, увімкніть “%s” та виберіть зв'язку ключів у налаштуваннях.
|
hub.noKeychain.description=Щоб розблокувати сховища Hub, необхідний ключ пристрою, який захищено за допомогою зв'язки ключів. Щоб продовжити, увімкніть «%s» та виберіть зв'язку ключів у налаштуваннях.
|
||||||
hub.noKeychain.openBtn=Відкрити налаштування
|
hub.noKeychain.openBtn=Відкрити налаштування
|
||||||
### Waiting
|
### Waiting
|
||||||
hub.auth.message=Очікування завершення автентифікації…
|
hub.auth.message=Очікування завершення автентифікації…
|
||||||
hub.auth.description=Вас буде автоматично переспрямовано на сторінку входу.
|
hub.auth.description=Вас буде автоматично перенаправлено на сторінку входу.
|
||||||
hub.auth.loginLink=Не переспрямовано? Натисніть тут, щоб відкрити її.
|
hub.auth.loginLink=Не перенаправлено? Натисніть тут, щоб відкрити її.
|
||||||
### Receive Key
|
### Receive Key
|
||||||
hub.receive.message=Обробка відповіді…
|
hub.receive.message=Обробка відповіді…
|
||||||
hub.receive.description=Cryptomator отримує та опрацьовує відповідь від Hub. Будь ласка, зачекайте.
|
hub.receive.description=Cryptomator отримує та опрацьовує відповідь від Hub. Будь ласка, зачекайте.
|
||||||
### Register Device
|
### Register Device
|
||||||
hub.register.message=Новий пристрій
|
hub.register.message=Новий пристрій
|
||||||
hub.register.description=Це перший доступ до Хабу Cryptomator з цього пристрою. Будь ласка, зареєструйтесь за допомогою вашого ключа облікового запису.
|
hub.register.description=Це перший доступ до Hub з цього пристрою. Будь ласка, зареєструйтесь за допомогою вашого ключа облікового запису.
|
||||||
hub.register.nameLabel=Назва пристрою
|
hub.register.nameLabel=Назва пристрою
|
||||||
hub.register.invalidAccountKeyLabel=Недійсний ключ облікового запису
|
hub.register.invalidAccountKeyLabel=Недійсний ключ облікового запису
|
||||||
hub.register.registerBtn=Зареєструватись
|
hub.register.registerBtn=Зареєструватись
|
||||||
### Register Device Legacy
|
### Register Device Legacy
|
||||||
hub.register.legacy.occupiedMsg=Таке ім’я уже існує
|
hub.register.legacy.occupiedMsg=Таке ім’я уже існує
|
||||||
hub.register.legacy.description=Це перший доступ до Хабу Cryptomator з цього пристрою. Будь ласка, зареєструйте його.
|
hub.register.legacy.description=Це перший доступ до Hub з цього пристрою. Будь ласка, зареєструйте його.
|
||||||
### Registration Success
|
### Registration Success
|
||||||
hub.registerSuccess.message=Пристрій зареєстровано
|
hub.registerSuccess.message=Пристрій зареєстровано
|
||||||
hub.registerSuccess.description=Ваш пристрій успішно зареєстровано. Тепер ви можете продовжити розблокування сховища.
|
hub.registerSuccess.description=Ваш пристрій успішно зареєстровано. Тепер ви можете продовжити розблокування сховища.
|
||||||
hub.registerSuccess.unlockBtn=Розблокувати
|
hub.registerSuccess.unlockBtn=Розблокувати
|
||||||
hub.registerSuccess.legacy.description=Щоб отримати доступ до сховища, ваш пристрій повинен бути додатково авторизованим власником сховища.
|
hub.registerSuccess.legacy.description=Щоб отримати доступ до сховища, ваш пристрій має бути додатково авторизованим власником сховища.
|
||||||
### Registration Failed
|
### Registration Failed
|
||||||
hub.registerFailed.message=Помилка реєстрації пристрою
|
hub.registerFailed.message=Не вдалося зареєструвати пристрій
|
||||||
hub.registerFailed.description.generic=Помилка виникла у процесі реєстрації. Для більш докладної інформації перегляньте журнал додатка.
|
hub.registerFailed.description.generic=Під час реєстрації виникла помилка. Для отримання додаткової інформації перегляньте журнал програми.
|
||||||
hub.registerFailed.description.deviceAlreadyExists=Цей пристрій вже зареєстровано для іншого користувача. Спробуйте змінити обліковий запис користувача або скористайтеся іншим пристроєм.
|
hub.registerFailed.description.deviceAlreadyExists=Цей пристрій вже зареєстровано для іншого користувача. Спробуйте змінити обліковий запис або скористайтеся іншим пристроєм.
|
||||||
### Unauthorized
|
### Unauthorized
|
||||||
hub.unauthorized.message=У доступі відмовлено
|
hub.unauthorized.message=У доступі відмовлено
|
||||||
hub.unauthorized.description=Ви не маєте права для відкриття цього сховища. Зверніться до власника сховища, щоб запитати доступ.
|
hub.unauthorized.description=Ви не авторизовані для відкриття цього сховища. Зв'яжіться з його власником, щоб отримати доступ.
|
||||||
### Requires Account Initialization
|
### Requires Account Initialization
|
||||||
hub.requireAccountInit.message=Необхідна дія
|
hub.requireAccountInit.message=Необхідна дія
|
||||||
hub.requireAccountInit.description.0=Для продовження, будь ласка, завершіть виконання обов'язкових кроків
|
hub.requireAccountInit.description.0=Щоб продовжити, будь ласка, виконайте необхідні кроки у вашому
|
||||||
hub.requireAccountInit.description.1=Профіль користувача Хабу
|
hub.requireAccountInit.description.1=профілі користувача Hub
|
||||||
hub.requireAccountInit.description.2=.
|
hub.requireAccountInit.description.2=.
|
||||||
### License Exceeded
|
### License Exceeded
|
||||||
hub.invalidLicense.message=Недійсна ліцензія Hub
|
hub.invalidLicense.message=Недійсна ліцензія Hub
|
||||||
hub.invalidLicense.description=У вашого Cryptomator Hub недійсна ліцензія. Будь ласка, зв'яжіться з адміністратором Hub, щоб оновити або продовжити дію ліцензії.
|
hub.invalidLicense.description=Ваш екземпляр Cryptomator Hub має недійсну ліцензію. Будь ласка, повідомте адміністратора Hub для оновлення або поновлення ліцензії.
|
||||||
|
|
||||||
# Lock
|
# Lock
|
||||||
## Force
|
## Force
|
||||||
lock.forced.message=Помилка блокування
|
lock.forced.message=Помилка блокування
|
||||||
lock.forced.description=Блокуванню "%s" заважає виконання операцій або відкриті файли. Ви можете примусово заблокувати це сховище, однак переривання операцій чинання/запису може призвести до втрати незбережених даних.
|
lock.forced.description=Блокуванню «%s» заважає виконання операцій або відкриті файли. Ви можете примусово заблокувати це сховище, однак переривання операцій читання/запису може призвести до втрати незбережених даних.
|
||||||
lock.forced.retryBtn=Повторити
|
lock.forced.retryBtn=Повторити спробу
|
||||||
lock.forced.forceBtn=Примусове блокування
|
lock.forced.forceBtn=Примусово заблокувати
|
||||||
## Failure
|
## Failure
|
||||||
lock.fail.message=Не вдалося заблокувати сховище
|
lock.fail.message=Не вдалося заблокувати сховище
|
||||||
lock.fail.description=Сховище "%s" не можна заблокувати. Переконайтеся, що незавершену роботу збережено в іншому місці, а також важливі операції читання/запису закінчені. Щоб закрити сховище, завершіть процес Cryptomator.
|
lock.fail.description=Не вдалося заблокувати сховище «%s». Переконайтеся, що незбережена робота збережена в іншому місці, а важливі операції читання/запису завершені. Щоб закрити сховище, завершіть процес Cryptomator.
|
||||||
|
|
||||||
# Migration
|
# Migration
|
||||||
migration.title=Покращення сховища
|
migration.title=Покращення сховища
|
||||||
## Start
|
## Start
|
||||||
migration.start.header=Покращення сховища до наступної версії
|
migration.start.header=Покращення сховища до наступної версії
|
||||||
migration.start.text=Для того, щоб відкрити сховище "%s" у новій версії Cryptomator, воно має бути оновлене до новішого формату. Перед тим, як це зробити, ви повинні знати таке:
|
migration.start.text=Для того, щоб відкрити сховище «%s» у новій версії Cryptomator, воно має бути оновлене до новішого формату. Перед тим, як це зробити, ви повинні знати таке:
|
||||||
migration.start.remarkUndone=Це оновлення не може бути скасовано.
|
migration.start.remarkUndone=Це оновлення не може бути скасовано.
|
||||||
migration.start.remarkVersions=Старіші версії Cryptomator не зможуть відкрити оновлене сховище.
|
migration.start.remarkVersions=Старіші версії Cryptomator не зможуть відкрити оновлене сховище.
|
||||||
migration.start.remarkCanRun=Ви повинні бути впевнені, що кожен пристрій, з якого ви маєте доступ до сховища, підтримує цю версію Cryptomator.
|
migration.start.remarkCanRun=Ви повинні бути впевнені, що кожен пристрій, з якого ви маєте доступ до сховища, підтримує цю версію Cryptomator.
|
||||||
migration.start.remarkSynced=Ви маєте бути впевнені, що ваше сховище повністю синхронізовано на цьому пристрої та на інших ваших пристроях, перш ніж оновити його.
|
migration.start.remarkSynced=Ви маєте бути впевнені, що ваше сховище повністю синхронізовано на цьому пристрої та на інших ваших пристроях, перш ніж оновити його.
|
||||||
migration.start.confirm=Я прочитав та зрозумів вищевказану інформацію
|
migration.start.confirm=Я прочитав(ла) і зрозумів(ла) наведену вище інформацію
|
||||||
## Run
|
## Run
|
||||||
migration.run.enterPassword=Введіть пароль для "%s"
|
migration.run.enterPassword=Введіть пароль для «%s»
|
||||||
migration.run.startMigrationBtn=Розпочати міграцію
|
migration.run.startMigrationBtn=Розпочати оновлення
|
||||||
migration.run.progressHint=Це може зайняти деякий час…
|
migration.run.progressHint=Це може зайняти деякий час…
|
||||||
## Success
|
## Success
|
||||||
migration.success.nextStepsInstructions=Міграцію "%s" успішно завершено.\nТепер ви можете розблокувати ваше сховище.
|
migration.success.nextStepsInstructions=Оновлення «%s» успішно завершено.\nТепер ви можете розблокувати ваше сховище.
|
||||||
migration.success.unlockNow=Розблокувати
|
migration.success.unlockNow=Розблокувати
|
||||||
## Missing file system capabilities
|
## Missing file system capabilities
|
||||||
migration.error.missingFileSystemCapabilities.title=Файлова система не підтримується
|
migration.error.missingFileSystemCapabilities.title=Файлова система не підтримується
|
||||||
migration.error.missingFileSystemCapabilities.description=Перенесення не було розпочато, оскільки ваше сховище знаходиться в несумісній файловій системі.
|
migration.error.missingFileSystemCapabilities.description=Оновлення не було розпочато, оскільки ваше сховище знаходиться в несумісній файловій системі.
|
||||||
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Файлова система не підтримує довгі назви файлів.
|
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=Файлова система не підтримує довгі назви файлів.
|
||||||
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Файлова система не підтримує довгі шляхи.
|
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=Файлова система не підтримує довгі шляхи.
|
||||||
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Файлова система не дозволяє зчитувати дані.
|
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=Файлова система не дозволяє зчитувати дані.
|
||||||
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Файлова система не дозволяє записувати дані.
|
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=Файлова система не дозволяє записувати дані.
|
||||||
## Impossible
|
## Impossible
|
||||||
migration.impossible.heading=Не вдалося перенести сховище
|
migration.impossible.heading=Не вдалося оновити сховище
|
||||||
migration.impossible.reason=Сховище не можливо автоматично перенести через його розташуванням на диску або несумісність точки доступу.
|
migration.impossible.reason=Сховище не можливо автоматично оновити через його розташування на диску або несумісність точки доступу.
|
||||||
migration.impossible.moreInfo=Сховище все ще може бути відкрите старішою версією. Для інструкцій, як вручну перенести сховище, перейдіть
|
migration.impossible.moreInfo=Сховище все ще можна відкрити старішою версією. Для інструкцій, як вручну оновити сховище, відвідайте
|
||||||
|
|
||||||
# Health Check
|
# Health Check
|
||||||
## Start
|
## Start
|
||||||
health.title=Перевірка працездатності "%s"
|
health.title=Перевірка стану «%s»
|
||||||
health.intro.header=Перевірка працездатності
|
health.intro.header=Перевірка стану
|
||||||
health.intro.text=Перевірка працездатності передбачає ряд тестів для виявлення та за можливості виправлення проблем у внутрішній структурі вашого сховища. Будь ласка, пам'ятайте:
|
health.intro.text=«Перевірка стану» — це набір перевірок для виявлення та, можливо, виправлення проблем у внутрішній структурі вашого сховища. Будь ласка, врахуйте:
|
||||||
health.intro.remarkSync=Переконайтеся, що всі пристрої повністю синхронізовані, це вирішує більшість проблем.
|
health.intro.remarkSync=Переконайтеся, що всі пристрої повністю синхронізовані, це вирішує більшість проблем.
|
||||||
health.intro.remarkFix=Не всі проблеми можна виправити.
|
health.intro.remarkFix=Не всі проблеми можна виправити.
|
||||||
health.intro.remarkBackup=Якщо дані пошкоджено, то може допомогти тільки резервна копія.
|
health.intro.remarkBackup=Якщо дані пошкоджено, допоможе лише резервна копія.
|
||||||
health.intro.affirmation=Я прочитав та зрозумів вищевказану інформацію
|
health.intro.affirmation=Я прочитав(ла) і зрозумів(ла) наведену вище інформацію
|
||||||
## Start Failure
|
## Start Failure
|
||||||
health.fail.header=Помилка при завантаженні конфігурації сховища
|
health.fail.header=Помилка при завантаженні конфігурації сховища
|
||||||
health.fail.ioError=Сталася помилка під час спроби доступу до файлу конфігурації.
|
health.fail.ioError=Під час доступу та читання файлу конфігурації сталася помилка.
|
||||||
health.fail.parseError=Сталася помилка під час опрацювання конфігурації сховища.
|
health.fail.parseError=Під час аналізу конфігурації сховища сталася помилка.
|
||||||
health.fail.moreInfo=Більше інформації
|
health.fail.moreInfo=Більше інформації
|
||||||
## Check Selection
|
## Check Selection
|
||||||
health.checkList.description=Оберіть прапорець зі списку ліворуч або використовуйте кнопки нижче.
|
health.checkList.description=Виберіть перевірки зі списку ліворуч або скористайтеся кнопками нижче.
|
||||||
health.checkList.selectAllButton=Вибрати всі перевірки
|
health.checkList.selectAllButton=Вибрати всі перевірки
|
||||||
health.checkList.deselectAllButton=Зняти вибір з усіх перевірок
|
health.checkList.deselectAllButton=Зняти вибір з усіх перевірок
|
||||||
health.check.runBatchBtn=Розпочати обрані перевірки
|
health.check.runBatchBtn=Розпочати обрані перевірки
|
||||||
## Detail view
|
## Detail view
|
||||||
health.check.detail.noSelectedCheck=Для перегляду результатів оберіть завершену перевірку працездатності зі списку ліворуч.
|
health.check.detail.noSelectedCheck=Щоб переглянути результати, виберіть завершену перевірку стану зі списку ліворуч.
|
||||||
health.check.detail.checkScheduled=Перевірку заплановано.
|
health.check.detail.checkScheduled=Перевірку заплановано.
|
||||||
health.check.detail.checkRunning=Перевірка триває…
|
health.check.detail.checkRunning=Перевірка триває…
|
||||||
health.check.detail.checkSkipped=Перевірку не вибрано для запуску.
|
health.check.detail.checkSkipped=Цю перевірку не було обрано для запуску.
|
||||||
health.check.detail.checkFinished=Перевірку завершено успішно.
|
health.check.detail.checkFinished=Перевірку завершено успішно.
|
||||||
health.check.detail.checkFinishedAndFound=Перевірку завершено. Будь ласка, ознайомтесь з результатами.
|
health.check.detail.checkFinishedAndFound=Перевірку завершено. Будь ласка, ознайомтесь з результатами.
|
||||||
health.check.detail.checkFailed=Перевірка завершилась через помилку.
|
health.check.detail.checkFailed=Перевірку перервано через помилку.
|
||||||
health.check.detail.checkCancelled=Перевірку було скасовано.
|
health.check.detail.checkCancelled=Перевірку було скасовано.
|
||||||
health.check.detail.listFilters.label=Фільтр
|
health.check.detail.listFilters.label=Фільтр
|
||||||
health.check.detail.fixAllSpecificBtn=Виправити все
|
health.check.detail.fixAllSpecificBtn=Виправити всі цього типу
|
||||||
health.check.exportBtn=Експортувати звіт
|
health.check.exportBtn=Експортувати звіт
|
||||||
## Result view
|
## Result view
|
||||||
health.result.severityFilter.all=Рівень критичності - Усі
|
health.result.severityFilter.all=Ступінь серйозності — Усі
|
||||||
health.result.severityFilter.good=В нормі
|
health.result.severityFilter.good=В нормі
|
||||||
health.result.severityFilter.info=Інформація
|
health.result.severityFilter.info=Інформація
|
||||||
health.result.severityFilter.warn=Попередження
|
health.result.severityFilter.warn=Попередження
|
||||||
health.result.severityFilter.crit=Критично
|
health.result.severityFilter.crit=Критично
|
||||||
health.result.severityTip.good=Рівень критичності: в нормі\nЗвичайна структура сховища.
|
health.result.severityTip.good=Ступінь серйозності: В нормі.\nЗвичайна структура сховища.
|
||||||
health.result.severityTip.info=Рівень критичності: інформація\nСтруктура сховища цілісна, виправлення рекомендовані.
|
health.result.severityTip.info=Ступінь серйозності: Інформація.\nСтруктура сховища ціла, запропоновано виправлення.
|
||||||
health.result.severityTip.warn=Рівень критичності: попередження\nСтруктуру сховища пошкоджено, це слід виправити.
|
health.result.severityTip.warn=Ступінь серйозності: Попередження.\nСтруктура сховища пошкоджена, наполегливо рекомендуємо виправити.
|
||||||
health.result.severityTip.crit=Рівень критичності: критичний\nСтруктуру сховища пошкоджено, виявлено втрату даних.
|
health.result.severityTip.crit=Ступінь серйозності: Критичний.\nСтруктура сховища пошкоджена, виявлено втрату даних.
|
||||||
health.result.fixStateFilter.all=Статус виправлення - Всі
|
health.result.fixStateFilter.all=Стан виправлення — Усі
|
||||||
health.result.fixStateFilter.fixable=Поправні
|
health.result.fixStateFilter.fixable=Можна виправити
|
||||||
health.result.fixStateFilter.notFixable=Не поправні
|
health.result.fixStateFilter.notFixable=Неможливо виправити
|
||||||
health.result.fixStateFilter.fixing=Виправляються…
|
health.result.fixStateFilter.fixing=Виправляються…
|
||||||
health.result.fixStateFilter.fixed=Виправлені
|
health.result.fixStateFilter.fixed=Виправлено
|
||||||
health.result.fixStateFilter.fixFailed=Невдале виправлення
|
health.result.fixStateFilter.fixFailed=Не вдалося виправити
|
||||||
## Fix Application
|
## Fix Application
|
||||||
health.fix.fixBtn=Виправити
|
health.fix.fixBtn=Виправити
|
||||||
health.fix.successTip=Виправлення успішне
|
health.fix.successTip=Успішно виправлено
|
||||||
health.fix.failTip=Виправити не вдалось, перегляньте журнал для ознайомлення з подробицями
|
health.fix.failTip=Не вдалося виправити, перегляньте журнал для отримання подробиць
|
||||||
|
|
||||||
# Preferences
|
# Preferences
|
||||||
preferences.title=Налаштування
|
preferences.title=Налаштування
|
||||||
## General
|
## General
|
||||||
preferences.general=Загальні
|
preferences.general=Загальні
|
||||||
preferences.general.startHidden=Приховати вікно під час запуску Cryptomator
|
preferences.general.startHidden=Приховувати вікно під час запуску Cryptomator
|
||||||
|
preferences.general.autoCloseVaults=Блокувати сховища без запиту при виході з програми
|
||||||
preferences.general.debugLogging=Увімкнути ведення журналу налагодження
|
preferences.general.debugLogging=Увімкнути ведення журналу налагодження
|
||||||
preferences.general.debugDirectory=Показати файли журналу
|
preferences.general.debugDirectory=Показати файли журналу
|
||||||
preferences.general.autoStart=Запускати Cryptomator під час запуску системи
|
preferences.general.autoStart=Запускати Cryptomator під час запуску системи
|
||||||
preferences.general.keychainBackend=Зберігати паролі за допомогою
|
preferences.general.keychainBackend=Зберігати паролі за допомогою
|
||||||
preferences.general.quickAccessService=Додати до області швидкого доступу розблоковані сховища
|
preferences.general.quickAccessService=Додавати розблоковані сховища до області швидкого доступу
|
||||||
## Interface
|
## Interface
|
||||||
preferences.interface=Вигляд
|
preferences.interface=Вигляд
|
||||||
preferences.interface.theme=Колір і стиль
|
preferences.interface.theme=Вигляд і поведінка
|
||||||
preferences.interface.theme.automatic=Автоматично
|
preferences.interface.theme.automatic=Автоматично
|
||||||
preferences.interface.theme.dark=Темний
|
preferences.interface.theme.dark=Темний
|
||||||
preferences.interface.theme.light=Світлий
|
preferences.interface.theme.light=Світлий
|
||||||
preferences.interface.unlockThemes=Розблокувати темний режим
|
preferences.interface.unlockThemes=Розблокувати темний режим
|
||||||
preferences.interface.language=Мова (потребує перезавантаження)
|
preferences.interface.language=Мова (потрібен перезапуск)
|
||||||
preferences.interface.language.auto=Мова системи
|
preferences.interface.language.auto=Мова системи
|
||||||
preferences.interface.interfaceOrientation=Відображення елементів
|
preferences.interface.interfaceOrientation=Орієнтація інтерфейсу
|
||||||
preferences.interface.interfaceOrientation.ltr=Зліва направо
|
preferences.interface.interfaceOrientation.ltr=Зліва направо
|
||||||
preferences.interface.interfaceOrientation.rtl=Справа наліво
|
preferences.interface.interfaceOrientation.rtl=Справа наліво
|
||||||
preferences.interface.showTrayIcon=Показувати піктограму на панелі завдань (потрібен перезапуск)
|
preferences.interface.showTrayIcon=Показувати іконку в треї (потрібен перезапуск)
|
||||||
preferences.interface.compactMode=Активувати компактний список сховищ
|
preferences.interface.compactMode=Активувати компактний список сховищ
|
||||||
## Volume
|
## Volume
|
||||||
preferences.volume=Віртуальний диск
|
preferences.volume=Віртуальний диск
|
||||||
preferences.volume.type=Тип тому за замовчуванням
|
preferences.volume.type=Тип тому за замовчуванням
|
||||||
preferences.volume.type.automatic=Автоматично
|
preferences.volume.type.automatic=Автоматично
|
||||||
preferences.volume.docsTooltip=Відкрийте документацію, щоб дізнатися більше про різні типи томів.
|
preferences.volume.docsTooltip=Відкрийте документацію, щоб дізнатися більше про різні типи томів.
|
||||||
preferences.volume.fuseRestartRequired=Слід перезапустити Cryptomator, щоб зміни набули чинності.
|
preferences.volume.fuseRestartRequired=Щоб застосувати зміни, Cryptomator потрібно перезапустити.
|
||||||
preferences.volume.tcp.port=TCP порт за замовчуванням
|
preferences.volume.tcp.port=TCP порт за замовчуванням
|
||||||
preferences.volume.supportedFeatures=Обраний тип тому підтримує такі функції:
|
preferences.volume.supportedFeatures=Обраний тип тому підтримує такі можливості:
|
||||||
preferences.volume.feature.mountAuto=Автоматичний вибір точки монтування
|
preferences.volume.feature.mountAuto=Автоматичний вибір точки монтування
|
||||||
preferences.volume.feature.mountToDir=Користувацька папка як точка монтування
|
preferences.volume.feature.mountToDir=Власний каталог як точка монтування
|
||||||
preferences.volume.feature.mountToDriveLetter=Точка монтування у вигляді букви диска
|
preferences.volume.feature.mountToDriveLetter=Літера диска як точка монтування
|
||||||
preferences.volume.feature.mountFlags=Користувацькі параметри монтування
|
preferences.volume.feature.mountFlags=Власні параметри монтування
|
||||||
preferences.volume.feature.readOnly=Монтування в режимі "лише для читання"
|
preferences.volume.feature.readOnly=Монтування лише для читання
|
||||||
## Updates
|
## Updates
|
||||||
preferences.updates=Оновлення
|
preferences.updates=Оновлення
|
||||||
preferences.updates.currentVersion=Поточна версія: %s
|
preferences.updates.currentVersion=Поточна версія: %s
|
||||||
@@ -326,24 +327,24 @@ preferences.updates.lastUpdateCheck=Остання перевірка: %s
|
|||||||
preferences.updates.lastUpdateCheck.never=ніколи
|
preferences.updates.lastUpdateCheck.never=ніколи
|
||||||
preferences.updates.lastUpdateCheck.recently=нещодавно
|
preferences.updates.lastUpdateCheck.recently=нещодавно
|
||||||
preferences.updates.lastUpdateCheck.daysAgo=%s дні(в) тому
|
preferences.updates.lastUpdateCheck.daysAgo=%s дні(в) тому
|
||||||
preferences.updates.lastUpdateCheck.hoursAgo=%s годин тому
|
preferences.updates.lastUpdateCheck.hoursAgo=%s годин(и) тому
|
||||||
preferences.updates.checkFailed=Не вдалось перевірити наявність оновлень. Будь ласка, перевірте підключення до Інтернету або спробуйте ще раз пізніше.
|
preferences.updates.checkFailed=Не вдалось перевірити наявність оновлень. Будь ласка, перевірте підключення до Інтернету або спробуйте ще раз пізніше.
|
||||||
preferences.updates.upToDate=Ваш Cryptomator не потребує оновлення.
|
preferences.updates.upToDate=Ваш Cryptomator не потребує оновлення.
|
||||||
|
|
||||||
## Contribution
|
## Contribution
|
||||||
preferences.contribute=Підтримайте нас
|
preferences.contribute=Підтримайте нас
|
||||||
preferences.contribute.registeredFor=Сертифікат помічника зареєстровано для %s
|
preferences.contribute.registeredFor=Сертифікат помічника зареєстровано для %s
|
||||||
preferences.contribute.noCertificate=Підтримайте Cryptomator та отримайте сертифікат помічника - це як ліцензійний ключ, але для чудових людей, які користуються безкоштовним програмним забезпеченням. ;-)
|
preferences.contribute.noCertificate=Підтримайте Cryptomator та отримайте сертифікат помічника. Це як ліцензійний ключ, але для чудових людей, які користуються безплатним програмним забезпеченням. ;-)
|
||||||
preferences.contribute.getCertificate=Ще немає такого? Дізнайтеся, як його отримати.
|
preferences.contribute.getCertificate=Ще немає такого? Дізнайтеся, як його отримати.
|
||||||
preferences.contribute.promptText=Вставте код сертифікату помічника тут
|
preferences.contribute.promptText=Вставте код сертифікату помічника тут
|
||||||
preferences.contribute.thankYou=Дякуємо, що підтримуєте розробку Cryptomator з відкритим вихідним кодом!
|
preferences.contribute.thankYou=Дякуємо, що підтримуєте розробку Cryptomator з відкритим вихідним кодом!
|
||||||
preferences.contribute.donate=Підтримати
|
preferences.contribute.donate=Зробити пожертву
|
||||||
preferences.contribute.sponsor=Спонсор
|
preferences.contribute.sponsor=Спонсори
|
||||||
|
|
||||||
### Remove License Key Dialog
|
### Remove License Key Dialog
|
||||||
removeCert.title=Видалити сертифікат
|
removeCert.title=Вилучити сертифікат
|
||||||
removeCert.message=Видалити сертифікат помічника?
|
removeCert.message=Вилучити сертифікат помічника?
|
||||||
removeCert.description=Основний функціонал Cryptomator не змінюється. Ні доступ до вашого сховища, а ні рівень безпеки не буде понижено/обмежено.
|
removeCert.description=Основні функції Cryptomator не будуть зачеплені. Ані доступ до ваших сховищ не буде обмежено, ані рівень безпеки не буде знижено.
|
||||||
#<-- Add entries for donations and code/translation/documentation contribution -->
|
#<-- Add entries for donations and code/translation/documentation contribution -->
|
||||||
|
|
||||||
## About
|
## About
|
||||||
@@ -351,33 +352,33 @@ preferences.about=Про додаток
|
|||||||
|
|
||||||
# Vault Statistics
|
# Vault Statistics
|
||||||
stats.title=Статистика %s
|
stats.title=Статистика %s
|
||||||
stats.cacheHitRate=Відсоток потрапляння до кешу
|
stats.cacheHitRate=Коефіцієнт влучань кеша
|
||||||
## Read
|
## Read
|
||||||
stats.read.throughput.idle=Читання: очікування
|
stats.read.throughput.idle=Читання: простоює
|
||||||
stats.read.throughput.kibs=Зчитування: %.2f КіБ/с
|
stats.read.throughput.kibs=Читання: %.2f КіБ/с
|
||||||
stats.read.throughput.mibs=Зчитування: %.2f МіБ/с
|
stats.read.throughput.mibs=Читання: %.2f МіБ/с
|
||||||
stats.read.total.data.none=Зчитано даних: -
|
stats.read.total.data.none=Прочитано даних: —
|
||||||
stats.read.total.data.kib=Зчитано даних: %.1f Кб
|
stats.read.total.data.kib=Прочитано даних: %.1f КіБ
|
||||||
stats.read.total.data.mib=Зчитано даних: %.1f Мб
|
stats.read.total.data.mib=Прочитано даних: %.1f МіБ
|
||||||
stats.read.total.data.gib=Зчитано даних: %.1f Гб
|
stats.read.total.data.gib=Прочитано даних: %.1f ГіБ
|
||||||
stats.decr.total.data.none=Розшифровано даних: -
|
stats.decr.total.data.none=Розшифровано даних: —
|
||||||
stats.decr.total.data.kib=Розшифровано даних: %.1f Кб
|
stats.decr.total.data.kib=Розшифровано даних: %.1f КіБ
|
||||||
stats.decr.total.data.mib=Розшифровано даних: %.1f Мб
|
stats.decr.total.data.mib=Розшифровано даних: %.1f МіБ
|
||||||
stats.decr.total.data.gib=Розшифровано даних: %.1f Гб
|
stats.decr.total.data.gib=Розшифровано даних: %.1f ГіБ
|
||||||
stats.read.accessCount=Всього зчитувань: %d
|
stats.read.accessCount=Усього прочитань: %d
|
||||||
## Write
|
## Write
|
||||||
stats.write.throughput.idle=Запис: очікування
|
stats.write.throughput.idle=Запис: простоює
|
||||||
stats.write.throughput.kibs=Запис: %.2f KіБ/с
|
stats.write.throughput.kibs=Запис: %.2f KіБ/с
|
||||||
stats.write.throughput.mibs=Запис: %.2f MіБ/с
|
stats.write.throughput.mibs=Запис: %.2f MіБ/с
|
||||||
stats.write.total.data.none=Записано даних: -
|
stats.write.total.data.none=Записано даних: —
|
||||||
stats.write.total.data.kib=Записано даних: %.1f Кб
|
stats.write.total.data.kib=Записано даних: %.1f КіБ
|
||||||
stats.write.total.data.mib=Записано даних: %.1f Мб
|
stats.write.total.data.mib=Записано даних: %.1f МіБ
|
||||||
stats.write.total.data.gib=Записано даних: %.1f Гб
|
stats.write.total.data.gib=Записано даних: %.1f ГіБ
|
||||||
stats.encr.total.data.none=Зашифровано даних: -
|
stats.encr.total.data.none=Зашифровано даних: —
|
||||||
stats.encr.total.data.kib=Зашифровано даних: %.1f Кб
|
stats.encr.total.data.kib=Зашифровано даних: %.1f КіБ
|
||||||
stats.encr.total.data.mib=Зашифровано даних: %.1f Мб
|
stats.encr.total.data.mib=Зашифровано даних: %.1f МіБ
|
||||||
stats.encr.total.data.gib=Зашифровано даних: %.1f Гб
|
stats.encr.total.data.gib=Зашифровано даних: %.1f ГіБ
|
||||||
stats.write.accessCount=Всього записувань: %d
|
stats.write.accessCount=Усього записів: %d
|
||||||
|
|
||||||
## Accesses
|
## Accesses
|
||||||
stats.access.current=Отримано доступ: %d
|
stats.access.current=Отримано доступ: %d
|
||||||
@@ -387,42 +388,46 @@ stats.access.total=Усього отримано доступ: %d
|
|||||||
# Main Window
|
# Main Window
|
||||||
## Vault List
|
## Vault List
|
||||||
main.vaultlist.emptyList.onboardingInstruction=Натисніть тут, щоб додати сховище
|
main.vaultlist.emptyList.onboardingInstruction=Натисніть тут, щоб додати сховище
|
||||||
main.vaultlist.contextMenu.remove=Видалити…
|
main.vaultlist.contextMenu.remove=Вилучити…
|
||||||
main.vaultlist.contextMenu.lock=Заблокувати
|
main.vaultlist.contextMenu.lock=Заблокувати
|
||||||
main.vaultlist.contextMenu.unlock=Розблокувати…
|
main.vaultlist.contextMenu.unlock=Розблокувати…
|
||||||
main.vaultlist.contextMenu.unlockNow=Розблокувати
|
main.vaultlist.contextMenu.unlockNow=Розблокувати
|
||||||
main.vaultlist.contextMenu.vaultoptions=Показати параметри сховища
|
main.vaultlist.contextMenu.vaultoptions=Показати параметри сховища
|
||||||
main.vaultlist.contextMenu.reveal=Розгорнути диск
|
main.vaultlist.contextMenu.reveal=Відкрити диск
|
||||||
main.vaultlist.addVaultBtn.menuItemNew=Створити нове сховище...
|
main.vaultlist.addVaultBtn.menuItemNew=Створити нове сховище...
|
||||||
main.vaultlist.addVaultBtn.menuItemExisting=Відкрити наявне сховище...
|
main.vaultlist.addVaultBtn.menuItemExisting=Відкрити наявне сховище...
|
||||||
|
main.vaultlist.showEventsButton.tooltip=Відкрити журнал подій
|
||||||
##Notificaition
|
##Notificaition
|
||||||
main.notification.updateAvailable=Оновлення доступне.
|
main.notification.updateAvailable=Доступне оновлення.
|
||||||
main.notification.support=Підтримайте Cryptomator.
|
main.notification.support=Підтримайте Cryptomator.
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
main.vaultDetail.welcomeOnboarding=Дякуємо, що обрали Cryptomator для захисту ваших файлів. Якщо вам потрібна допомога, перегляньте наші інструкції з роботи:
|
main.vaultDetail.welcomeOnboarding=Дякуємо, що обрали Cryptomator для захисту ваших файлів. Якщо вам потрібна допомога, ознайомтеся з нашими посібниками для початку роботи:
|
||||||
### Locked
|
### Locked
|
||||||
main.vaultDetail.lockedStatus=ЗАБЛОКОВАНО
|
main.vaultDetail.lockedStatus=ЗАБЛОКОВАНО
|
||||||
main.vaultDetail.unlockBtn=Розблокувати…
|
main.vaultDetail.unlockBtn=Розблокувати…
|
||||||
main.vaultDetail.unlockNowBtn=Розблокувати
|
main.vaultDetail.unlockNowBtn=Розблокувати
|
||||||
main.vaultDetail.optionsBtn=Налаштування сховища
|
main.vaultDetail.optionsBtn=Параметри сховища
|
||||||
main.vaultDetail.passwordSavedInKeychain=Пароль збережено
|
main.vaultDetail.passwordSavedInKeychain=Пароль збережено
|
||||||
main.vaultDetail.share=Поділитися…
|
main.vaultDetail.share=Поділитися…
|
||||||
### Unlocked
|
### Unlocked
|
||||||
main.vaultDetail.unlockedStatus=РОЗБЛОКОВАНО
|
main.vaultDetail.unlockedStatus=РОЗБЛОКОВАНО
|
||||||
main.vaultDetail.accessLocation=Щоб отримати доступ до вмісту сховища - натисніть кнопку:
|
main.vaultDetail.accessLocation=Вміст вашого сховища доступний тут:
|
||||||
main.vaultDetail.revealBtn=Розгорнути диск
|
main.vaultDetail.revealBtn=Відкрити диск
|
||||||
main.vaultDetail.copyUri=Скопіювати адресу
|
main.vaultDetail.copyUri=Копіювати URI
|
||||||
main.vaultDetail.lockBtn=Заблокувати
|
main.vaultDetail.lockBtn=Заблокувати
|
||||||
main.vaultDetail.bytesPerSecondRead=Зчитування:
|
main.vaultDetail.bytesPerSecondRead=Читання:
|
||||||
main.vaultDetail.bytesPerSecondWritten=Запис:
|
main.vaultDetail.bytesPerSecondWritten=Запис:
|
||||||
main.vaultDetail.throughput.idle=простоювання
|
main.vaultDetail.throughput.idle=простоює
|
||||||
main.vaultDetail.throughput.kbps=%.1f КіБ/c
|
main.vaultDetail.throughput.kbps=%.1f КіБ/c
|
||||||
main.vaultDetail.throughput.mbps=%.1f МіБ/c
|
main.vaultDetail.throughput.mbps=%.1f МіБ/c
|
||||||
main.vaultDetail.stats=Статистика сховища
|
main.vaultDetail.stats=Статистика сховища
|
||||||
main.vaultDetail.locateEncryptedFileBtn=Знайти зашифрований файл
|
main.vaultDetail.locateEncryptedFileBtn=Знайти зашифрований файл
|
||||||
main.vaultDetail.locateEncryptedFileBtn.tooltip=Виберіть файл із вашого сховища, щоб знайти розташування його зашифрованого відповідника
|
main.vaultDetail.locateEncryptedFileBtn.tooltip=Виберіть файл зі сховища, щоб знайти його зашифрований відповідник
|
||||||
main.vaultDetail.encryptedPathsCopied=Шляхи скопійовано в буфер обміну!
|
main.vaultDetail.encryptedPathsCopied=Шляхи скопійовано в буфер обміну!
|
||||||
|
main.vaultDetail.locateEncrypted.filePickerTitle=Виберіть файл у сховищі
|
||||||
|
main.vaultDetail.decryptName.buttonLabel=Розшифрувати назву файлу
|
||||||
|
main.vaultDetail.decryptName.tooltip=Виберіть зашифрований файл сховища, щоб розшифрувати його назву
|
||||||
### Missing
|
### Missing
|
||||||
main.vaultDetail.missing.info=Cryptomator не зміг знайти сховище за цим шляхом.
|
main.vaultDetail.missing.info=Cryptomator не зміг знайти сховище за цим шляхом.
|
||||||
main.vaultDetail.missing.recheck=Перевірити знову
|
main.vaultDetail.missing.recheck=Перевірити знову
|
||||||
@@ -430,7 +435,7 @@ main.vaultDetail.missing.remove=Вилучити зі списку сховищ
|
|||||||
main.vaultDetail.missing.changeLocation=Змінити розташування сховища…
|
main.vaultDetail.missing.changeLocation=Змінити розташування сховища…
|
||||||
### Needs Migration
|
### Needs Migration
|
||||||
main.vaultDetail.migrateButton=Покращити сховище
|
main.vaultDetail.migrateButton=Покращити сховище
|
||||||
main.vaultDetail.migratePrompt=Ваше сховище слід покращити (перетворити) у новий формат, перш ніж ви зможете отримати до нього доступ
|
main.vaultDetail.migratePrompt=Ваше сховище потрібно оновити до нового формату, перш ніж ви зможете отримати до нього доступ
|
||||||
### Error
|
### Error
|
||||||
main.vaultDetail.error.info=Виникла помилка під час завантаження сховища з диска.
|
main.vaultDetail.error.info=Виникла помилка під час завантаження сховища з диска.
|
||||||
main.vaultDetail.error.reload=Перезавантажити
|
main.vaultDetail.error.reload=Перезавантажити
|
||||||
@@ -439,10 +444,10 @@ main.vaultDetail.error.windowTitle=Помилка завантаження сх
|
|||||||
# Wrong File Alert
|
# Wrong File Alert
|
||||||
wrongFileAlert.title=Як зашифрувати файли
|
wrongFileAlert.title=Як зашифрувати файли
|
||||||
wrongFileAlert.message=Ви намагалися зашифрувати ці файли?
|
wrongFileAlert.message=Ви намагалися зашифрувати ці файли?
|
||||||
wrongFileAlert.description=Для цього Cryptomator додає том у ваш системний файловий менеджер.
|
wrongFileAlert.description=Для цього Cryptomator надає том у системному файловому менеджері.
|
||||||
wrongFileAlert.instruction.0=Щоб зашифрувати файли, виконайте такі кроки:
|
wrongFileAlert.instruction.0=Щоб зашифрувати файли, виконайте такі кроки:
|
||||||
wrongFileAlert.instruction.1=1. Розблокуйте ваше сховище.
|
wrongFileAlert.instruction.1=1. Розблокуйте ваше сховище.
|
||||||
wrongFileAlert.instruction.2=2. Натисніть "Розгорнути", щоб відкрити том у вашому файловому менеджері.
|
wrongFileAlert.instruction.2=2. Натисніть «Відкрити диск», щоб відкрити том у вашому файловому менеджері.
|
||||||
wrongFileAlert.instruction.3=3. Додайте ваші файли до цього тому.
|
wrongFileAlert.instruction.3=3. Додайте ваші файли до цього тому.
|
||||||
wrongFileAlert.link=Для отримання подальшої допомоги, відвідайте
|
wrongFileAlert.link=Для отримання подальшої допомоги, відвідайте
|
||||||
|
|
||||||
@@ -450,27 +455,27 @@ wrongFileAlert.link=Для отримання подальшої допомог
|
|||||||
## General
|
## General
|
||||||
vaultOptions.general=Загальні
|
vaultOptions.general=Загальні
|
||||||
vaultOptions.general.vaultName=Назва сховища
|
vaultOptions.general.vaultName=Назва сховища
|
||||||
vaultOptions.general.autoLock.lockAfterTimePart1=Заблокувати коли не використовується протягом
|
vaultOptions.general.autoLock.lockAfterTimePart1=Блокувати після простою протягом
|
||||||
vaultOptions.general.autoLock.lockAfterTimePart2=хвилин
|
vaultOptions.general.autoLock.lockAfterTimePart2=хвилин
|
||||||
vaultOptions.general.unlockAfterStartup=Розблоковувати сховище під час запуску Cryptomator
|
vaultOptions.general.unlockAfterStartup=Розблоковувати сховище під час запуску Cryptomator
|
||||||
vaultOptions.general.actionAfterUnlock=Після успішного розблокування
|
vaultOptions.general.actionAfterUnlock=Після успішного розблокування
|
||||||
vaultOptions.general.actionAfterUnlock.ignore=Нічого не робити
|
vaultOptions.general.actionAfterUnlock.ignore=Нічого не робити
|
||||||
vaultOptions.general.actionAfterUnlock.reveal=Розгорнути диск
|
vaultOptions.general.actionAfterUnlock.reveal=Відкривати диск
|
||||||
vaultOptions.general.actionAfterUnlock.ask=Запитати
|
vaultOptions.general.actionAfterUnlock.ask=Запитувати
|
||||||
vaultOptions.general.startHealthCheckBtn=Розпочати перевірку працездатності
|
vaultOptions.general.startHealthCheckBtn=Розпочати перевірку стану
|
||||||
|
|
||||||
## Mount
|
## Mount
|
||||||
vaultOptions.mount=Монтування
|
vaultOptions.mount=Монтування
|
||||||
vaultOptions.mount.info=Відкрийте вибір віртуального носія, щоб змінити налаштування за замовчуванням.
|
vaultOptions.mount.info=Відкрийте налаштування віртуального диска, щоб змінити параметри за замовчуванням.
|
||||||
vaultOptions.mount.readonly=Тільки для перегляду
|
vaultOptions.mount.readonly=Тільки для перегляду
|
||||||
vaultOptions.mount.customMountFlags=Користувацькі опції монтування
|
vaultOptions.mount.customMountFlags=Власні прапори монтування
|
||||||
vaultOptions.mount.winDriveLetterOccupied=зайнято
|
vaultOptions.mount.winDriveLetterOccupied=зайнято
|
||||||
vaultOptions.mount.mountPoint=Точка монтування
|
vaultOptions.mount.mountPoint=Точка монтування
|
||||||
vaultOptions.mount.mountPoint.auto=Автоматично підбирати зручне розташування
|
vaultOptions.mount.mountPoint.auto=Автоматично вибрати відповідне розташування
|
||||||
vaultOptions.mount.mountPoint.driveLetter=Використовувати призначену літеру для диска
|
vaultOptions.mount.mountPoint.driveLetter=Використовувати призначену літеру диска
|
||||||
vaultOptions.mount.mountPoint.custom=Використовувати обрану папку
|
vaultOptions.mount.mountPoint.custom=Використовувати обраний каталог
|
||||||
vaultOptions.mount.mountPoint.directoryPickerButton=Обрати…
|
vaultOptions.mount.mountPoint.directoryPickerButton=Обрати…
|
||||||
vaultOptions.mount.mountPoint.directoryPickerTitle=Виберіть папку
|
vaultOptions.mount.mountPoint.directoryPickerTitle=Виберіть каталог
|
||||||
vaultOptions.mount.volumeType.default=За замовчуванням (%s)
|
vaultOptions.mount.volumeType.default=За замовчуванням (%s)
|
||||||
vaultOptions.mount.volumeType.restartRequired=Щоб використовувати цей тип тому, необхідно перезапустити Cryptomator.
|
vaultOptions.mount.volumeType.restartRequired=Щоб використовувати цей тип тому, необхідно перезапустити Cryptomator.
|
||||||
vaultOptions.mount.volume.tcp.port=TCP порт
|
vaultOptions.mount.volume.tcp.port=TCP порт
|
||||||
@@ -479,107 +484,140 @@ vaultOptions.mount.volume.type=Тип тому
|
|||||||
vaultOptions.masterkey=Пароль
|
vaultOptions.masterkey=Пароль
|
||||||
vaultOptions.masterkey.changePasswordBtn=Змінити пароль
|
vaultOptions.masterkey.changePasswordBtn=Змінити пароль
|
||||||
vaultOptions.masterkey.forgetSavedPasswordBtn=Забути збережений пароль
|
vaultOptions.masterkey.forgetSavedPasswordBtn=Забути збережений пароль
|
||||||
vaultOptions.masterkey.recoveryKeyExplanation=У разі втрати пароля, лише ключ відновлення залишиться єдиним способом отримання доступу до сховища.
|
vaultOptions.masterkey.recoveryKeyExplanation=Ключ відновлення — це ваш єдиний спосіб відновити доступ до сховища, якщо ви втратите пароль.
|
||||||
vaultOptions.masterkey.showRecoveryKeyBtn=Показати ключ відновлення
|
vaultOptions.masterkey.showRecoveryKeyBtn=Показати ключ відновлення
|
||||||
vaultOptions.masterkey.recoverPasswordBtn=Скинути пароль
|
vaultOptions.masterkey.recoverPasswordBtn=Скинути пароль
|
||||||
## Hub
|
## Hub
|
||||||
vaultOptions.hub=Відновлення
|
vaultOptions.hub=Відновлення
|
||||||
vaultOptions.hub.convertInfo=Ви можете використати ключ відновлення, щоб перетворити це сховище Hub у сховище на основі пароля в разі крайньої потреби.
|
vaultOptions.hub.convertInfo=Ви можете використати ключ відновлення, щоб у надзвичайній ситуації перетворити це Hub-сховище на сховище, захищене паролем.
|
||||||
vaultOptions.hub.convertBtn=Перетворити на сховище з паролем
|
vaultOptions.hub.convertBtn=Перетворити на сховище, захищене паролем
|
||||||
|
|
||||||
# Recovery Key
|
# Recovery Key
|
||||||
## Display Recovery Key
|
## Display Recovery Key
|
||||||
recoveryKey.display.title=Показати ключ відновлення
|
recoveryKey.display.title=Показати ключ відновлення
|
||||||
recoveryKey.create.message=Потрібен пароль
|
recoveryKey.create.message=Потрібен пароль
|
||||||
recoveryKey.create.description=Введіть пароль для "%s", щоб показати його ключ відновлення.
|
recoveryKey.create.description=Введіть пароль для «%s», щоб показати його ключ відновлення.
|
||||||
recoveryKey.display.description=Цей ключ можна використати для відновлення доступу до "%s":
|
recoveryKey.display.description=Зазначений ключ відновлення можна використовувати для відновлення доступу до «%s»:
|
||||||
recoveryKey.display.StorageHints=Зберігайте його у дуже безпечному місці, наприклад:\n • в менеджері паролів\n • на захищеному USB-носії\n • роздрукуйте на папері та зберігайте у недоступному для інших місці
|
recoveryKey.display.StorageHints=Зберігайте його в дуже надійному місці, наприклад:\n • Збережіть його за допомогою менеджера паролів\n • Збережіть його на USB-накопичувачі\n • Роздрукуйте його на папері
|
||||||
## Reset Password
|
## Reset Password
|
||||||
### Enter Recovery Key
|
### Enter Recovery Key
|
||||||
recoveryKey.recover.title=Скинути пароль
|
recoveryKey.recover.title=Скинути пароль
|
||||||
recoveryKey.recover.prompt=Введіть ключ відновлення для "%s:
|
recoveryKey.recover.prompt=Введіть ключ відновлення для «%s»:
|
||||||
recoveryKey.recover.correctKey=Цей ключ відновлення є правильним
|
recoveryKey.recover.correctKey=Цей ключ відновлення правильний
|
||||||
recoveryKey.recover.wrongKey=Цей ключ відновлення належить до іншого сховища
|
recoveryKey.recover.wrongKey=Цей ключ відновлення належить іншому сховищу
|
||||||
recoveryKey.recover.invalidKey=Невірний ключ відновлення
|
recoveryKey.recover.invalidKey=Невірний ключ відновлення
|
||||||
recoveryKey.printout.heading=Ключ відновлення Cryptomator\n"%s"\n
|
recoveryKey.printout.heading=Ключ відновлення Cryptomator\n«%s»\n
|
||||||
### Reset Password
|
### Reset Password
|
||||||
recoveryKey.recover.resetBtn=Скинути
|
recoveryKey.recover.resetBtn=Скинути
|
||||||
### Recovery Key Password Reset Success
|
### Recovery Key Password Reset Success
|
||||||
recoveryKey.recover.resetSuccess.message=Пароль скинуто успішно
|
recoveryKey.recover.resetSuccess.message=Пароль успішно скинуто
|
||||||
recoveryKey.recover.resetSuccess.description=Ви можете розблокувати своє сховище за допомогою нового пароля.
|
recoveryKey.recover.resetSuccess.description=Ви можете розблокувати своє сховище за допомогою нового пароля.
|
||||||
|
|
||||||
# Convert Vault
|
# Convert Vault
|
||||||
convertVault.title=Перетворити сховище
|
convertVault.title=Перетворити сховище
|
||||||
convertVault.convert.convertBtn.before=Перетворити
|
convertVault.convert.convertBtn.before=Перетворити
|
||||||
convertVault.convert.convertBtn.processing=Перетворення…
|
convertVault.convert.convertBtn.processing=Перетворення…
|
||||||
convertVault.success.message=Перетворення виконано успішно
|
convertVault.success.message=Перетворення успішно виконано
|
||||||
convertVault.hubToPassword.success.description=Тепер ви можете розблокувати сховище за допомогою обраного пароля без необхідності доступу до Hub.
|
convertVault.hubToPassword.success.description=Тепер ви можете розблокувати сховище за допомогою обраного пароля, не вимагаючи доступу до Hub.
|
||||||
|
|
||||||
# New Password
|
# New Password
|
||||||
newPassword.promptText=Введіть новий пароль
|
newPassword.promptText=Введіть новий пароль
|
||||||
newPassword.reenterPassword=Підтвердіть новий пароль
|
newPassword.reenterPassword=Підтвердіть новий пароль
|
||||||
newPassword.passwordsMatch=Паролі збігаються!
|
newPassword.passwordsMatch=Паролі збігаються!
|
||||||
newPassword.passwordsDoNotMatch=Паролі не збігаються
|
newPassword.passwordsDoNotMatch=Паролі не збігаються
|
||||||
passwordStrength.messageLabel.tooShort=Введіть принаймні %d символів
|
passwordStrength.messageLabel.tooShort=Використайте щонайменше %d символів
|
||||||
passwordStrength.messageLabel.0=Дуже слабкий
|
passwordStrength.messageLabel.0=Дуже слабкий
|
||||||
passwordStrength.messageLabel.1=Слабкий
|
passwordStrength.messageLabel.1=Слабкий
|
||||||
passwordStrength.messageLabel.2=Посередній
|
passwordStrength.messageLabel.2=Задовільний
|
||||||
passwordStrength.messageLabel.3=Надійний
|
passwordStrength.messageLabel.3=Надійний
|
||||||
passwordStrength.messageLabel.4=Дуже надiйний
|
passwordStrength.messageLabel.4=Дуже надiйний
|
||||||
|
|
||||||
# Quit
|
# Quit
|
||||||
quit.title=Вийти з додатка
|
quit.title=Вийти з додатка
|
||||||
quit.message=Є розблоковані сховища
|
quit.message=Є розблоковані сховища
|
||||||
quit.description=Будь ласка, підтвердіть що ви хочете вийти. Cryptomator правильно заблокує всі розблоковані сховища, щоб запобігти втраті даних.
|
quit.description=Ви дійсно хочете вийти? Cryptomator коректно заблокує всі розблоковані сховища, щоб запобігти втраті даних.
|
||||||
quit.lockAndQuitBtn=Заблокувати і вийти
|
quit.lockAndQuitBtn=Заблокувати та вийти
|
||||||
|
|
||||||
# Forced Quit
|
# Forced Quit
|
||||||
quit.forced.message=Деякі сховища неможливо заблокувати
|
quit.forced.message=Деякі сховища не вдалося заблокувати
|
||||||
quit.forced.description=Блокування сховищ було перерване через операції з ними або відкриті файли. Ви можете примусово заблокувати сховища, проте переривання операцій зчитування-запису може призвести до втрати незбережених даних.
|
quit.forced.description=Блокування сховищ було заблоковано через незавершені операції або відкриті файли. Ви можете примусово заблокувати сховища, що залишилися, однак переривання операцій читання/запису може призвести до втрати незбережених даних.
|
||||||
quit.forced.forceAndQuitBtn=Завершити роботу примусово
|
quit.forced.forceAndQuitBtn=Примусово заблокувати та вийти
|
||||||
|
|
||||||
# Update Reminder
|
# Update Reminder
|
||||||
updateReminder.title=Перевірити наявність оновлень
|
updateReminder.title=Перевірити наявність оновлень
|
||||||
updateReminder.message=Перевірити наявність оновлень?
|
updateReminder.message=Перевірити наявність оновлень?
|
||||||
updateReminder.description=Будьте в курсі нових функцій, виправлення помилок і вдосконалення безпеки. Ми рекомендуємо автоматично перевіряти наявність оновлень.
|
updateReminder.description=Залишайтеся в курсі нових функцій, виправлень помилок та вдосконалень безпеки. Ми рекомендуємо автоматично перевіряти наявність оновлень.
|
||||||
updateReminder.notNow=Не зараз
|
updateReminder.notNow=Не зараз
|
||||||
updateReminder.yesOnce=Так, лише раз
|
updateReminder.yesOnce=Так, лише раз
|
||||||
updateReminder.yesAutomatically=Так, автоматично
|
updateReminder.yesAutomatically=Так, автоматично
|
||||||
|
|
||||||
#Dokany Support End
|
#Dokany Support End
|
||||||
dokanySupportEnd.title=Застаріле повідомлення
|
dokanySupportEnd.title=Повідомлення про припинення підтримки
|
||||||
dokanySupportEnd.message=Закінчення підтримки Dokany
|
dokanySupportEnd.message=Закінчення підтримки Dokany
|
||||||
dokanySupportEnd.description=Тип сховища Dokany більше не підтримується в Cryptomator. Тепер ваші налаштування змінено для використання типового типу сховища. Ви можете переглянути тип сховища за замовчуванням в налаштуваннях.
|
dokanySupportEnd.description=Тип тому Dokany більше не підтримується Cryptomator. Ваші налаштування змінено на використання типу тому за замовчуванням. Переглянути стандартний тип можна в налаштуваннях.
|
||||||
dokanySupportEnd.preferencesBtn=Відкрити налаштування
|
dokanySupportEnd.preferencesBtn=Відкрити налаштування
|
||||||
|
|
||||||
#Retry If Readonly
|
#Retry If Readonly
|
||||||
retryIfReadonly.title=Обмежений доступ до сховища
|
retryIfReadonly.title=Обмежений доступ до сховища
|
||||||
retryIfReadonly.message=Немає прав на запис до папки сховища
|
retryIfReadonly.message=Немає доступу для запису до каталогу сховища
|
||||||
retryIfReadonly.description=Cryptomator не може записувати в папку сховища. Ви можете змінити режим доступу до сховища на "лише для читання" і повторити спробу. Цей параметр можна вимкнути у налаштуваннях сховища.
|
retryIfReadonly.description=Cryptomator не може здійснити запис до каталогу сховища. Ви можете перевести сховище в режим «лише для читання» і спробувати знову. Цю опцію можна вимкнути в параметрах сховища.
|
||||||
retryIfReadonly.retry=Змінити і повторити спробу
|
retryIfReadonly.retry=Змінити та повторити спробу
|
||||||
|
|
||||||
# Share Vault
|
# Share Vault
|
||||||
shareVault.title=Поділитися сховищем
|
shareVault.title=Поділитися сховищем
|
||||||
shareVault.message=Ви хочете поділитися своїм сховищем з іншими?
|
shareVault.message=Хочете поділитися сховищем з іншими?
|
||||||
shareVault.description=Завжди будьте обережні, коли ділитесь своїм сховищем з іншими людьми. Якщо коротко, виконайте ці кроки:
|
shareVault.description=Завжди будьте обережні, коли ділитесь своїм сховищем з іншими людьми. Якщо коротко, дотримуйтеся таких кроків:
|
||||||
shareVault.instruction.1=1. Діліться доступом до зашифрованої папки сховища через хмарне сховище.
|
shareVault.instruction.1=1. Надайте спільний доступ до зашифрованої папки сховища через хмарне сховище.
|
||||||
shareVault.instruction.2=2. Передавайте пароль сховища безпечним способом.
|
shareVault.instruction.2=2. Передайте пароль сховища безпечним способом.
|
||||||
shareVault.remarkBestPractices=Для отримання додаткової інформації - ознайомтесь з кращим досвідом з наших документів.
|
shareVault.remarkBestPractices=Для отримання додаткової інформації перегляньте поради щодо найкращих практик у нашій документації.
|
||||||
shareVault.docsTooltip=Відкрийте документацію, щоб дізнатися більше про надання доступу до сховищ.
|
shareVault.docsTooltip=Відкрийте документацію, щоб дізнатися більше про спільний доступ до сховищ.
|
||||||
shareVault.hubAd.description=Безпечний спосіб роботи в командах
|
shareVault.hubAd.description=Надійний спосіб для командної роботи
|
||||||
shareVault.hubAd.keyManagement=• Управління ключами без інформації про їх значення
|
shareVault.hubAd.keyManagement=• Управління ключами за принципом «zero-knowledge»
|
||||||
shareVault.hubAd.authentication=• Сильні механізми перевірки особи (автентифікації)
|
shareVault.hubAd.authentication=• Надійна автентифікація
|
||||||
shareVault.hubAd.encryption=• Наскрізне шифрування
|
shareVault.hubAd.encryption=• Наскрізне шифрування
|
||||||
shareVault.visitHub=Відвідати Cryptomator Hub
|
shareVault.visitHub=Відвідати Cryptomator Hub
|
||||||
|
|
||||||
shareVault.hub.message=Як поділитись сховищем у хабі (Hub)
|
shareVault.hub.message=Як надати спільний доступ до сховища Hub
|
||||||
shareVault.hub.description=Щоб поділитися вмістом сховища з іншим членом команди, ви повинні виконати два кроки:
|
shareVault.hub.description=Щоб надати спільний доступ до вмісту сховища іншому учаснику команди, потрібно виконати два кроки:
|
||||||
shareVault.hub.instruction.1=1. Поділіться доступом до зашифрованої папки сховища через хмарне сховище.
|
shareVault.hub.instruction.1=1. Надайте спільний доступ до зашифрованої папки сховища через хмарне сховище.
|
||||||
shareVault.hub.instruction.2=2. Надайте доступ учаснику команди у Cryptomator Hub.
|
shareVault.hub.instruction.2=2. Надайте доступ учаснику команди у Cryptomator Hub.
|
||||||
shareVault.hub.openHub=Відкрити Cryptomator Hub
|
shareVault.hub.openHub=Відкрити Cryptomator Hub
|
||||||
|
|
||||||
# Decrypt File Names
|
# Decrypt File Names
|
||||||
|
decryptNames.title=Розшифрування назв файлів
|
||||||
|
decryptNames.filePicker.title=Виберіть зашифрований файл
|
||||||
|
decryptNames.filePicker.extensionDescription=Зашифрований файл Cryptomator
|
||||||
|
decryptNames.copyTable.tooltip=Копіювати таблицю
|
||||||
|
decryptNames.clearTable.tooltip=Очистити таблицю
|
||||||
|
decryptNames.copyHint=Скопіювати вміст комірки за допомогою %s
|
||||||
|
decryptNames.dropZone.message=Перетягніть файли або натисніть, щоб вибрати
|
||||||
|
decryptNames.dropZone.error.vaultInternalFiles=Вибрано службові файли сховища, які не можна розшифрувати
|
||||||
|
decryptNames.dropZone.error.foreignFiles=Файли не належать до сховища «%s»
|
||||||
|
decryptNames.dropZone.error.noDirIdBackup=Каталог вибраних файлів не містить файл dirId.c9r
|
||||||
|
decryptNames.dropZone.error.generic=Не вдалося розшифрувати назви файлів
|
||||||
|
|
||||||
|
|
||||||
# Event View
|
# Event View
|
||||||
|
eventView.title=Події
|
||||||
|
eventView.filter.allVaults=Усі
|
||||||
|
eventView.clearListButton.tooltip=Очистити список
|
||||||
## event list entries
|
## event list entries
|
||||||
|
eventView.entry.vaultLocked.description=Розблокуйте «%s» для отримання деталей
|
||||||
|
eventView.entry.conflictResolved.message=Конфлікт вирішено
|
||||||
|
eventView.entry.conflictResolved.showDecrypted=Показати розшифрований файл
|
||||||
|
eventView.entry.conflictResolved.copyDecrypted=Копіювати розшифрований шлях
|
||||||
|
eventView.entry.conflict.message=Не вдалося вирішити конфлікт
|
||||||
|
eventView.entry.conflict.showDecrypted=Показати розшифрований оригінальний файл
|
||||||
|
eventView.entry.conflict.copyDecrypted=Скопіювати розшифрований оригінальний шлях
|
||||||
|
eventView.entry.conflict.showEncrypted=Показати конфліктуючий зашифрований файл
|
||||||
|
eventView.entry.conflict.copyEncrypted=Скопіювати конфліктуючий зашифрований шлях
|
||||||
|
eventView.entry.decryptionFailed.message=Не вдалося розшифрувати
|
||||||
|
eventView.entry.decryptionFailed.showEncrypted=Показати зашифрований файл
|
||||||
|
eventView.entry.decryptionFailed.copyEncrypted=Копіювати зашифрований шлях
|
||||||
|
eventView.entry.brokenDirFile.message=Пошкоджене посилання на каталог
|
||||||
|
eventView.entry.brokenDirFile.showEncrypted=Показати пошкоджене зашифроване посилання
|
||||||
|
eventView.entry.brokenDirFile.copyEncrypted=Копіювати шлях пошкодженого посилання
|
||||||
|
eventView.entry.brokenFileNode.message=Пошкоджений вузол файлової системи
|
||||||
|
eventView.entry.brokenFileNode.showEncrypted=Показати пошкоджений зашифрований вузол
|
||||||
|
eventView.entry.brokenFileNode.copyEncrypted=Скопіювати шлях до пошкодженого зашифрованого вузла
|
||||||
|
eventView.entry.brokenFileNode.copyDecrypted=Копіювати розшифрований шлях
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ addvaultwizard.new.validCharacters.dashes=Dấu gạch ngang (%s) hoặc dấu g
|
|||||||
### Expert Settings
|
### Expert Settings
|
||||||
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox="Bật các cài đặt chuyên gia"
|
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox="Bật các cài đặt chuyên gia"
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Nhập giá trị từ 36 đến 220 (mặc định 220)
|
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Nhập giá trị từ 36 đến 220 (mặc định 220)
|
||||||
|
addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=Mở tài liệu để tìm hiểu thêm.
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.title="Chiều dài tối đa của tên các file được mã hóa"
|
addvaultwizard.new.expertSettings.shorteningThreshold.title="Chiều dài tối đa của tên các file được mã hóa"
|
||||||
addvaultwizard.new.expertSettings.shorteningThreshold.valid="Hợp lệ"
|
addvaultwizard.new.expertSettings.shorteningThreshold.valid="Hợp lệ"
|
||||||
### Password
|
### Password
|
||||||
@@ -138,7 +139,12 @@ unlock.error.customPath.message=Không thể gắn vault vào đường dẫn t
|
|||||||
unlock.error.customPath.description.notSupported=Nếu bạn muốn tiếp tục sử dụng đường dẫn tuỳ chỉnh, vui lòng chuyển đến tuỳ chọn và chọn loại ổ đĩa hỗ trợ nó. Nếu không, hãy chuyển đến tuỳ chọn vault và chọn điểm gắn kết được hỗ trợ.
|
unlock.error.customPath.description.notSupported=Nếu bạn muốn tiếp tục sử dụng đường dẫn tuỳ chỉnh, vui lòng chuyển đến tuỳ chọn và chọn loại ổ đĩa hỗ trợ nó. Nếu không, hãy chuyển đến tuỳ chọn vault và chọn điểm gắn kết được hỗ trợ.
|
||||||
unlock.error.customPath.description.notExists=Đường dẫn gắn kết tuỳ chỉnh không tồn tại. Tạo nó trong hệ thống tệp cục bộ của bạn hoặc thay đổi nó trong các tuỳ chọn vault.
|
unlock.error.customPath.description.notExists=Đường dẫn gắn kết tuỳ chỉnh không tồn tại. Tạo nó trong hệ thống tệp cục bộ của bạn hoặc thay đổi nó trong các tuỳ chọn vault.
|
||||||
unlock.error.customPath.description.inUse="Ký hiệu ổ cứng hoặc đường dẫn tự gán "%s" đã bị chiếm dụng".
|
unlock.error.customPath.description.inUse="Ký hiệu ổ cứng hoặc đường dẫn tự gán "%s" đã bị chiếm dụng".
|
||||||
|
unlock.error.customPath.description.hideawayNotDir=Không thể xóa tệp tạm thời, tệp ẩn "%3$s" dùng để mở khóa. Vui lòng kiểm tra tệp này và xóa nó bằng tay.
|
||||||
|
unlock.error.customPath.description.couldNotBeCleaned=Vault của bạn không gắn được vào đường dẫn "%s". Vui lòng thử lại hoặc chọn một đường dẫn khác.
|
||||||
|
unlock.error.customPath.description.notEmptyDir=Đường dẫn tùy chỉnh "%s" không phải là một thư mục trống. Vui lòng chọn một thư mục trống và thử lại.
|
||||||
|
unlock.error.customPath.description.generic=Bạn đã chọn một đường dẫn gắn tùy chỉnh cho vault này, nhưng việc sử dụng nó đã thất bại với thông báo: %2$s
|
||||||
unlock.error.restartRequired.message=Không thể mở vault
|
unlock.error.restartRequired.message=Không thể mở vault
|
||||||
|
unlock.error.restartRequired.description=Thay đổi loại ổ đĩa trong tùy chọn vault hoặc khởi động lại Cryptomator.
|
||||||
unlock.error.title=Mở khóa "%s" không thành công
|
unlock.error.title=Mở khóa "%s" không thành công
|
||||||
## Hub
|
## Hub
|
||||||
hub.noKeychain.message=Không thể truy cập khoá thiết bị
|
hub.noKeychain.message=Không thể truy cập khoá thiết bị
|
||||||
@@ -153,18 +159,30 @@ hub.receive.message=Đang xử lý phản hồi…
|
|||||||
hub.receive.description=Cryptomator đang nhận và xử lý phản hồi từ Hub. Vui lòng chờ.
|
hub.receive.description=Cryptomator đang nhận và xử lý phản hồi từ Hub. Vui lòng chờ.
|
||||||
### Register Device
|
### Register Device
|
||||||
hub.register.message=Thiết bị mới
|
hub.register.message=Thiết bị mới
|
||||||
|
hub.register.description=Đây là lần đầu tiên truy cập Hub từ thiết bị này. Vui lòng đăng ký bằng Khóa Tài Khoản của bạn.
|
||||||
hub.register.nameLabel=Tên thiết bị
|
hub.register.nameLabel=Tên thiết bị
|
||||||
|
hub.register.invalidAccountKeyLabel=Khóa Tài Khoản không đúng
|
||||||
hub.register.registerBtn=Đăng ký
|
hub.register.registerBtn=Đăng ký
|
||||||
### Register Device Legacy
|
### Register Device Legacy
|
||||||
hub.register.legacy.occupiedMsg=Tên đã sử dụng
|
hub.register.legacy.occupiedMsg=Tên đã sử dụng
|
||||||
|
hub.register.legacy.description=Đây là lần đầu tiên truy cập Hub từ thiết bị này. Vui lòng đăng ký.
|
||||||
### Registration Success
|
### Registration Success
|
||||||
hub.registerSuccess.message=Đã đăng ký thiết bị
|
hub.registerSuccess.message=Đã đăng ký thiết bị
|
||||||
|
hub.registerSuccess.description=Thiết bị của bạn đã được đăng ký thành công. Bạn có thể tiếp tục mở khóa vault.
|
||||||
hub.registerSuccess.unlockBtn=Mở khoá
|
hub.registerSuccess.unlockBtn=Mở khoá
|
||||||
|
hub.registerSuccess.legacy.description=Để truy cập vault, thiết bị của bạn cần được chủ sở hữu vault cấp phép.
|
||||||
### Registration Failed
|
### Registration Failed
|
||||||
hub.registerFailed.message=Đăng ký thiết bị thất bại
|
hub.registerFailed.message=Đăng ký thiết bị thất bại
|
||||||
|
hub.registerFailed.description.generic=Đã xảy ra lỗi trong quá trình đăng ký. Để biết thêm chi tiết, vui lòng kiểm tra nhật ký ứng dụng.
|
||||||
|
hub.registerFailed.description.deviceAlreadyExists=Thiết bị này đã được đăng ký cho người dùng khác. Hãy thử tài khoản khác hoặc sử dụng một thiết bị khác.
|
||||||
### Unauthorized
|
### Unauthorized
|
||||||
hub.unauthorized.message=Truy cập bị từ chối
|
hub.unauthorized.message=Truy cập bị từ chối
|
||||||
|
hub.unauthorized.description=Bạn không được phép mở vault này. Vui lòng liên hệ với chủ sở hữu vault để yêu cầu quyền truy cập.
|
||||||
### Requires Account Initialization
|
### Requires Account Initialization
|
||||||
|
hub.requireAccountInit.message=Cần thực hiện hành động
|
||||||
|
hub.requireAccountInit.description.0=Để tiếp tục, vui lòng hoàn thành các bước yêu cầu trong
|
||||||
|
hub.requireAccountInit.description.1=Hồ sơ người dùng
|
||||||
|
hub.requireAccountInit.description.2=.
|
||||||
### License Exceeded
|
### License Exceeded
|
||||||
hub.invalidLicense.message=Giấy phép Hub không hợp lệ
|
hub.invalidLicense.message=Giấy phép Hub không hợp lệ
|
||||||
hub.invalidLicense.description=Phiên bản Cryptomator Hub của bạn có giấy phép không hợp lệ. Vui lòng thông báo cho quản trị viên Hub để nâng cấp hoặc gia hạn giấy phép.
|
hub.invalidLicense.description=Phiên bản Cryptomator Hub của bạn có giấy phép không hợp lệ. Vui lòng thông báo cho quản trị viên Hub để nâng cấp hoặc gia hạn giấy phép.
|
||||||
@@ -265,13 +283,15 @@ preferences.title=Tùy chỉnh
|
|||||||
## General
|
## General
|
||||||
preferences.general=Chung
|
preferences.general=Chung
|
||||||
preferences.general.startHidden=Ẩn cửa sổ khi khởi động Cryptomator
|
preferences.general.startHidden=Ẩn cửa sổ khi khởi động Cryptomator
|
||||||
|
preferences.general.autoCloseVaults=Tự động khóa vaults khi thoát ứng dụng mà không cần xác nhận
|
||||||
preferences.general.debugLogging=Bật nhật kí gỡ lỗi
|
preferences.general.debugLogging=Bật nhật kí gỡ lỗi
|
||||||
preferences.general.debugDirectory=Mở tệp nhật ký
|
preferences.general.debugDirectory=Mở tệp nhật ký
|
||||||
preferences.general.autoStart=Khởi chạy Cryptomator khi khởi động hệ thống
|
preferences.general.autoStart=Khởi chạy Cryptomator khi khởi động hệ thống
|
||||||
preferences.general.keychainBackend=Lưu mật khẩu với
|
preferences.general.keychainBackend=Lưu mật khẩu với
|
||||||
|
preferences.general.quickAccessService=Thêm các vault đã mở khóa vào khu vực truy cập nhanh
|
||||||
## Interface
|
## Interface
|
||||||
preferences.interface=Giao diện
|
preferences.interface=Giao diện
|
||||||
preferences.interface.theme=Cái nhìn và cảm nhận
|
preferences.interface.theme=Chủ đề giao diện
|
||||||
preferences.interface.theme.automatic=Tự động
|
preferences.interface.theme.automatic=Tự động
|
||||||
preferences.interface.theme.dark=Tối
|
preferences.interface.theme.dark=Tối
|
||||||
preferences.interface.theme.light=Sáng
|
preferences.interface.theme.light=Sáng
|
||||||
@@ -282,8 +302,10 @@ preferences.interface.interfaceOrientation=Định hướng giao diện
|
|||||||
preferences.interface.interfaceOrientation.ltr=Trái sang phải
|
preferences.interface.interfaceOrientation.ltr=Trái sang phải
|
||||||
preferences.interface.interfaceOrientation.rtl=Phải sang trái
|
preferences.interface.interfaceOrientation.rtl=Phải sang trái
|
||||||
preferences.interface.showTrayIcon=Hiển thị biểu tượng khay (yêu cầu khởi động lại)
|
preferences.interface.showTrayIcon=Hiển thị biểu tượng khay (yêu cầu khởi động lại)
|
||||||
|
preferences.interface.compactMode=Bật danh sách vault thu gọn
|
||||||
## Volume
|
## Volume
|
||||||
preferences.volume=Ổ lưu trữ ảo
|
preferences.volume=Ổ lưu trữ ảo
|
||||||
|
preferences.volume.type=Loại ổ đĩa mặc định
|
||||||
preferences.volume.type.automatic=Tự động
|
preferences.volume.type.automatic=Tự động
|
||||||
preferences.volume.docsTooltip=Mở tài liệu để tìm hiểu thêm về các loại ổ đĩa khác nhau.
|
preferences.volume.docsTooltip=Mở tài liệu để tìm hiểu thêm về các loại ổ đĩa khác nhau.
|
||||||
preferences.volume.fuseRestartRequired=Để áp dụng các thay đổi, Cryptomator cần được khởi động lại.
|
preferences.volume.fuseRestartRequired=Để áp dụng các thay đổi, Cryptomator cần được khởi động lại.
|
||||||
@@ -300,10 +322,13 @@ preferences.updates.currentVersion=Phiên bản hiện tại: %s
|
|||||||
preferences.updates.autoUpdateCheck=Tự động kiểm tra phiên bản mới
|
preferences.updates.autoUpdateCheck=Tự động kiểm tra phiên bản mới
|
||||||
preferences.updates.checkNowBtn=Kiểm tra ngay
|
preferences.updates.checkNowBtn=Kiểm tra ngay
|
||||||
preferences.updates.updateAvailable=Có bản cập nhật lên phiên bản %s.
|
preferences.updates.updateAvailable=Có bản cập nhật lên phiên bản %s.
|
||||||
|
preferences.updates.lastUpdateCheck=Lần kiểm tra cuối: %s
|
||||||
preferences.updates.lastUpdateCheck.never=không bao giờ
|
preferences.updates.lastUpdateCheck.never=không bao giờ
|
||||||
preferences.updates.lastUpdateCheck.recently=gần đây
|
preferences.updates.lastUpdateCheck.recently=gần đây
|
||||||
preferences.updates.lastUpdateCheck.daysAgo=%s ngày trước
|
preferences.updates.lastUpdateCheck.daysAgo=%s ngày trước
|
||||||
preferences.updates.lastUpdateCheck.hoursAgo=%s giờ trước
|
preferences.updates.lastUpdateCheck.hoursAgo=%s giờ trước
|
||||||
|
preferences.updates.checkFailed=Không thể kiểm tra cập nhật. Vui lòng kiểm tra kết nối internet hoặc thử lại sau.
|
||||||
|
preferences.updates.upToDate=Cryptomator đã được cập nhật mới nhất.
|
||||||
|
|
||||||
## Contribution
|
## Contribution
|
||||||
preferences.contribute=Hỗ trợ chúng tôi
|
preferences.contribute=Hỗ trợ chúng tôi
|
||||||
@@ -311,8 +336,14 @@ preferences.contribute.registeredFor=Chứng nhận Người Hỗ Trợ được
|
|||||||
preferences.contribute.noCertificate=Hỗ trợ Cryptomator và lấy về cho bạn chứng nhận người hỗ trợ. Chứng nhận này giống như giấy phép sử dụng phần mềm, nhưng chỉ dành cho những con người tuyệt vời đang dùng phần mềm tự do. ;-)
|
preferences.contribute.noCertificate=Hỗ trợ Cryptomator và lấy về cho bạn chứng nhận người hỗ trợ. Chứng nhận này giống như giấy phép sử dụng phần mềm, nhưng chỉ dành cho những con người tuyệt vời đang dùng phần mềm tự do. ;-)
|
||||||
preferences.contribute.getCertificate=Bạn chưa có? Tìm hiểu cách bạn có thể lấy được nó.
|
preferences.contribute.getCertificate=Bạn chưa có? Tìm hiểu cách bạn có thể lấy được nó.
|
||||||
preferences.contribute.promptText=Vui lòng dán mã chứng nhận người hỗ trợ vào đây
|
preferences.contribute.promptText=Vui lòng dán mã chứng nhận người hỗ trợ vào đây
|
||||||
|
preferences.contribute.thankYou=Cảm ơn bạn đã hỗ trợ phát triển mã nguồn mở của Cryptomator!
|
||||||
|
preferences.contribute.donate=Ủng Hộ
|
||||||
|
preferences.contribute.sponsor=Nhà tài trợ
|
||||||
|
|
||||||
### Remove License Key Dialog
|
### Remove License Key Dialog
|
||||||
|
removeCert.title=Xoá Chứng chỉ
|
||||||
|
removeCert.message=Xóa chứng chỉ người ủng hộ?
|
||||||
|
removeCert.description=Các tính năng chính của Cryptomator không bị ảnh hưởng bởi điều này. Việc truy cập vào các vault của bạn không bị hạn chế và mức độ bảo mật cũng không bị giảm.
|
||||||
#<-- Add entries for donations and code/translation/documentation contribution -->
|
#<-- Add entries for donations and code/translation/documentation contribution -->
|
||||||
|
|
||||||
## About
|
## About
|
||||||
@@ -362,7 +393,12 @@ main.vaultlist.contextMenu.unlock=Mở khoá…
|
|||||||
main.vaultlist.contextMenu.unlockNow=Mở khóa bây giờ
|
main.vaultlist.contextMenu.unlockNow=Mở khóa bây giờ
|
||||||
main.vaultlist.contextMenu.vaultoptions=Hiện tùy chọn vault
|
main.vaultlist.contextMenu.vaultoptions=Hiện tùy chọn vault
|
||||||
main.vaultlist.contextMenu.reveal=Hiển thị Ổ đĩa
|
main.vaultlist.contextMenu.reveal=Hiển thị Ổ đĩa
|
||||||
|
main.vaultlist.addVaultBtn.menuItemNew=Tạo Vault Mới...
|
||||||
|
main.vaultlist.addVaultBtn.menuItemExisting=Mở Vault Hiện Có...
|
||||||
|
main.vaultlist.showEventsButton.tooltip=Mở xem sự kiện
|
||||||
##Notificaition
|
##Notificaition
|
||||||
|
main.notification.updateAvailable=Có bản cập nhật mới.
|
||||||
|
main.notification.support=Hỗ trợ Cryptomator.
|
||||||
## Vault Detail
|
## Vault Detail
|
||||||
### Welcome
|
### Welcome
|
||||||
main.vaultDetail.welcomeOnboarding=Cảm ơn bạn đã chọn Cryptomator để bảo vệ tệp của bạn. Nếu bạn cần bất kỳ hỗ trợ nào, hãy xem hướng dẫn bắt đầu của chúng tôi:
|
main.vaultDetail.welcomeOnboarding=Cảm ơn bạn đã chọn Cryptomator để bảo vệ tệp của bạn. Nếu bạn cần bất kỳ hỗ trợ nào, hãy xem hướng dẫn bắt đầu của chúng tôi:
|
||||||
@@ -388,6 +424,9 @@ main.vaultDetail.stats=Thống kê Vault
|
|||||||
main.vaultDetail.locateEncryptedFileBtn=Định vị Tệp Đã mã hoá
|
main.vaultDetail.locateEncryptedFileBtn=Định vị Tệp Đã mã hoá
|
||||||
main.vaultDetail.locateEncryptedFileBtn.tooltip=Chọn một tệp từ vaule của bạn để xác định vị trí đối tác được mã hoá của nó
|
main.vaultDetail.locateEncryptedFileBtn.tooltip=Chọn một tệp từ vaule của bạn để xác định vị trí đối tác được mã hoá của nó
|
||||||
main.vaultDetail.encryptedPathsCopied=Đường dẫn Đã sao chép vào Bảng tạm!
|
main.vaultDetail.encryptedPathsCopied=Đường dẫn Đã sao chép vào Bảng tạm!
|
||||||
|
main.vaultDetail.locateEncrypted.filePickerTitle=Chọn tệp bên trong Vault
|
||||||
|
main.vaultDetail.decryptName.buttonLabel=Giải mã tên tệp
|
||||||
|
main.vaultDetail.decryptName.tooltip=Chọn một tệp vault đã được mã hóa để giải mã tên của nó
|
||||||
### Missing
|
### Missing
|
||||||
main.vaultDetail.missing.info=Cryptomator không thể tìm thấy vault tại đường dẫn này.
|
main.vaultDetail.missing.info=Cryptomator không thể tìm thấy vault tại đường dẫn này.
|
||||||
main.vaultDetail.missing.recheck=Kiểm tra lại
|
main.vaultDetail.missing.recheck=Kiểm tra lại
|
||||||
@@ -426,6 +465,7 @@ vaultOptions.general.startHealthCheckBtn=Bắt đầu Kiểm tra sức khỏe
|
|||||||
|
|
||||||
## Mount
|
## Mount
|
||||||
vaultOptions.mount=Gắn kết
|
vaultOptions.mount=Gắn kết
|
||||||
|
vaultOptions.mount.info=Mở phần tùy chọn ổ đĩa ảo để thay đổi các cài đặt mặc định.
|
||||||
vaultOptions.mount.readonly=Chỉ đọc
|
vaultOptions.mount.readonly=Chỉ đọc
|
||||||
vaultOptions.mount.customMountFlags=Cờ gắn kết tuỳ chỉnh
|
vaultOptions.mount.customMountFlags=Cờ gắn kết tuỳ chỉnh
|
||||||
vaultOptions.mount.winDriveLetterOccupied=đã bị chiếm
|
vaultOptions.mount.winDriveLetterOccupied=đã bị chiếm
|
||||||
@@ -436,6 +476,7 @@ vaultOptions.mount.mountPoint.custom=Sử dụng thư mục đã chọn
|
|||||||
vaultOptions.mount.mountPoint.directoryPickerButton=Chọn…
|
vaultOptions.mount.mountPoint.directoryPickerButton=Chọn…
|
||||||
vaultOptions.mount.mountPoint.directoryPickerTitle=Chọn một thư mục
|
vaultOptions.mount.mountPoint.directoryPickerTitle=Chọn một thư mục
|
||||||
vaultOptions.mount.volumeType.default=Mặc định (%s)
|
vaultOptions.mount.volumeType.default=Mặc định (%s)
|
||||||
|
vaultOptions.mount.volumeType.restartRequired=Để sử dụng loại ổ đĩa này, Cryptomator cần được khởi động lại.
|
||||||
vaultOptions.mount.volume.tcp.port=Cổng TCP
|
vaultOptions.mount.volume.tcp.port=Cổng TCP
|
||||||
vaultOptions.mount.volume.type=Loại Ổ đĩa
|
vaultOptions.mount.volume.type=Loại Ổ đĩa
|
||||||
## Master Key
|
## Master Key
|
||||||
@@ -504,25 +545,78 @@ quit.forced.forceAndQuitBtn=Bắt buộc và Thoát
|
|||||||
# Update Reminder
|
# Update Reminder
|
||||||
updateReminder.title=Kiểm tra cập nhật
|
updateReminder.title=Kiểm tra cập nhật
|
||||||
updateReminder.message=Kiểm tra cập nhật?
|
updateReminder.message=Kiểm tra cập nhật?
|
||||||
|
updateReminder.description=Luôn cập nhật các tính năng mới, sửa lỗi và cải tiến bảo mật. Chúng tôi khuyến nghị để tự động kiểm tra cập nhật.
|
||||||
updateReminder.notNow=Không phải bây giờ
|
updateReminder.notNow=Không phải bây giờ
|
||||||
|
updateReminder.yesOnce=Có, chỉ một lần
|
||||||
|
updateReminder.yesAutomatically=Có, tự động
|
||||||
|
|
||||||
#Dokany Support End
|
#Dokany Support End
|
||||||
dokanySupportEnd.title=Thông báo ngừng phát triển
|
dokanySupportEnd.title=Thông báo ngừng phát triển
|
||||||
dokanySupportEnd.message=Kết thúc hỗ trợ cho Dokany
|
dokanySupportEnd.message=Kết thúc hỗ trợ cho Dokany
|
||||||
|
dokanySupportEnd.description=Loại ổ đĩa Dokany không còn được Cryptomator hỗ trợ. Cài đặt của bạn đã được điều chỉnh để sử dụng loại ổ đĩa mặc định. Bạn có thể xem loại mặc định trong phần tùy chọn.
|
||||||
dokanySupportEnd.preferencesBtn=Mở Tuỳ chọn
|
dokanySupportEnd.preferencesBtn=Mở Tuỳ chọn
|
||||||
|
|
||||||
#Retry If Readonly
|
#Retry If Readonly
|
||||||
|
retryIfReadonly.title=Truy cập Vault bị giới hạn
|
||||||
|
retryIfReadonly.message=Không có quyền ghi vào thư mục vault
|
||||||
|
retryIfReadonly.description=Cryptomator không thể ghi vào thư mục vault. Bạn có thể chuyển vault sang chế độ chỉ đọc và thử lại. Tùy chọn này có thể được tắt trong phần tùy chọn vault.
|
||||||
|
retryIfReadonly.retry=Thay đổi và Thử lại
|
||||||
|
|
||||||
# Share Vault
|
# Share Vault
|
||||||
shareVault.title=Chia sẻ Vault
|
shareVault.title=Chia sẻ Vault
|
||||||
|
shareVault.message=Bạn muốn chia sẻ vault của mình với người khác không?
|
||||||
|
shareVault.description=Luôn cẩn trọng khi chia sẻ vault của bạn với người khác. Tóm lại, hãy làm theo các bước sau:
|
||||||
|
shareVault.instruction.1=1. Chia sẻ quyền truy cập thư mục vault đã mã hóa qua dịch vụ lưu trữ đám mây.
|
||||||
|
shareVault.instruction.2=2. Chia sẻ mật khẩu vault một cách an toàn.
|
||||||
|
shareVault.remarkBestPractices=Để biết thêm thông tin, hãy tham khảo các gợi ý về phương pháp tốt nhất trong tài liệu của chúng tôi.
|
||||||
|
shareVault.docsTooltip=Mở tài liệu hướng dẫn để tìm hiểu thêm về việc chia sẻ vault.
|
||||||
shareVault.hubAd.description=Cách an toàn để làm việc theo nhóm
|
shareVault.hubAd.description=Cách an toàn để làm việc theo nhóm
|
||||||
shareVault.hubAd.keyManagement=• Quản lý khóa Zero-knowledge
|
shareVault.hubAd.keyManagement=• Quản lý khóa Zero-knowledge
|
||||||
|
shareVault.hubAd.authentication=• Xác thực bảo mật cao
|
||||||
shareVault.hubAd.encryption=• Mã hóa đầu cuối
|
shareVault.hubAd.encryption=• Mã hóa đầu cuối
|
||||||
shareVault.visitHub=Truy cập Cryptomator Hub
|
shareVault.visitHub=Truy cập Cryptomator Hub
|
||||||
|
|
||||||
|
shareVault.hub.message=Hướng dẫn chia sẻ vault trên Hub
|
||||||
|
shareVault.hub.description=Để chia sẻ nội dung vault với thành viên nhóm khác, bạn cần thực hiện hai bước sau:
|
||||||
|
shareVault.hub.instruction.1=1. Chia sẻ quyền truy cập thư mục vault đã mã hóa qua dịch vụ lưu trữ đám mây.
|
||||||
|
shareVault.hub.instruction.2=2. Cấp quyền truy cập cho thành viên nhóm trong Cryptomator Hub.
|
||||||
|
shareVault.hub.openHub=Mở Cryptomator Hub
|
||||||
|
|
||||||
# Decrypt File Names
|
# Decrypt File Names
|
||||||
|
decryptNames.title=Giải mã tên tệp
|
||||||
|
decryptNames.filePicker.title=Chọn tệp được mã hóa
|
||||||
|
decryptNames.filePicker.extensionDescription=Tệp mã hóa Cryptomator
|
||||||
|
decryptNames.copyTable.tooltip=Sao chép bảng
|
||||||
|
decryptNames.clearTable.tooltip=Xóa bảng
|
||||||
|
decryptNames.copyHint=Sao chép nội dung ô với %s
|
||||||
|
decryptNames.dropZone.message=Kéo thả tệp hoặc nhấp để chọn
|
||||||
|
decryptNames.dropZone.error.vaultInternalFiles=Đã chọn các tệp bên trong vault không có tên giải mã được
|
||||||
|
decryptNames.dropZone.error.foreignFiles=Các tệp không thuộc vault "%s"
|
||||||
|
decryptNames.dropZone.error.noDirIdBackup=Thư mục của các tệp đã chọn không chứa tệp dirId.c9r
|
||||||
|
decryptNames.dropZone.error.generic=Không thể giải mã tên tệp
|
||||||
|
|
||||||
|
|
||||||
# Event View
|
# Event View
|
||||||
|
eventView.title=Sự kiện
|
||||||
|
eventView.filter.allVaults=Tất cả
|
||||||
|
eventView.clearListButton.tooltip=Xóa danh sách
|
||||||
## event list entries
|
## event list entries
|
||||||
|
eventView.entry.vaultLocked.description=Mở khóa "%s" để xem chi tiết
|
||||||
|
eventView.entry.conflictResolved.message=Đã xử lý xung đột
|
||||||
|
eventView.entry.conflictResolved.showDecrypted=Xem tệp đã giải mã
|
||||||
|
eventView.entry.conflictResolved.copyDecrypted=Sao chép đường dẫn giải mã
|
||||||
|
eventView.entry.conflict.message=Giải quyết xung đột thất bại
|
||||||
|
eventView.entry.conflict.showDecrypted=Xem tệp gốc đã giải mã
|
||||||
|
eventView.entry.conflict.copyDecrypted=Sao chép đường dẫn gốc đã giải mã
|
||||||
|
eventView.entry.conflict.showEncrypted=Hiển thị tệp bị xung đột, đã mã hóa
|
||||||
|
eventView.entry.conflict.copyEncrypted=Sao chép đường dẫn mã hóa bị xung đột
|
||||||
|
eventView.entry.decryptionFailed.message=Giải mã thất bại
|
||||||
|
eventView.entry.decryptionFailed.showEncrypted=Hiển thị tệp đã mã hóa
|
||||||
|
eventView.entry.decryptionFailed.copyEncrypted=Sao chép đường dẫn tệp đã mã hóa
|
||||||
|
eventView.entry.brokenDirFile.message=Liên kết thư mục hỏng
|
||||||
|
eventView.entry.brokenDirFile.showEncrypted=Hiển thị liên kết mã hóa bị hỏng
|
||||||
|
eventView.entry.brokenDirFile.copyEncrypted=Sao chép đường dẫn liên kết bị hỏng
|
||||||
|
eventView.entry.brokenFileNode.message=Nút tập tin bị hỏng
|
||||||
|
eventView.entry.brokenFileNode.showEncrypted=Hiển thị nút mã hóa bị hỏng
|
||||||
|
eventView.entry.brokenFileNode.copyEncrypted=Sao chép đường dẫn nút mã hóa bị hỏng
|
||||||
|
eventView.entry.brokenFileNode.copyDecrypted=Sao chép đường dẫn giải mã
|
||||||
|
|||||||
@@ -583,21 +583,39 @@ shareVault.hub.instruction.2=2. 在Cryptomator Hub中允許團隊成員對加密
|
|||||||
shareVault.hub.openHub=打開 Cryptomator Hub
|
shareVault.hub.openHub=打開 Cryptomator Hub
|
||||||
|
|
||||||
# Decrypt File Names
|
# Decrypt File Names
|
||||||
|
decryptNames.title=解密檔案名稱
|
||||||
decryptNames.filePicker.title=選擇已加密的檔案
|
decryptNames.filePicker.title=選擇已加密的檔案
|
||||||
decryptNames.filePicker.extensionDescription=Cryptomator 加密檔案
|
decryptNames.filePicker.extensionDescription=Cryptomator 加密檔案
|
||||||
decryptNames.copyTable.tooltip=複製表格
|
decryptNames.copyTable.tooltip=複製表格
|
||||||
decryptNames.clearTable.tooltip=清除表格
|
decryptNames.clearTable.tooltip=清除表格
|
||||||
|
decryptNames.dropZone.message=拖放檔案或點擊選取
|
||||||
|
decryptNames.dropZone.error.vaultInternalFiles=所選取的加密檔案庫內部檔案並沒有可解密的檔名
|
||||||
decryptNames.dropZone.error.foreignFiles=檔案不屬於加密檔案庫「%s」
|
decryptNames.dropZone.error.foreignFiles=檔案不屬於加密檔案庫「%s」
|
||||||
|
decryptNames.dropZone.error.noDirIdBackup=選取的檔案的資料夾並不包含dirId.c9r檔案
|
||||||
decryptNames.dropZone.error.generic=解密檔案名稱失敗
|
decryptNames.dropZone.error.generic=解密檔案名稱失敗
|
||||||
|
|
||||||
|
|
||||||
# Event View
|
# Event View
|
||||||
eventView.title=事件
|
eventView.title=事件
|
||||||
eventView.filter.allVaults=全部
|
eventView.filter.allVaults=全部
|
||||||
|
eventView.clearListButton.tooltip=清空列表
|
||||||
## event list entries
|
## event list entries
|
||||||
|
eventView.entry.vaultLocked.description=解鎖「%s」以顯示詳細資訊
|
||||||
|
eventView.entry.conflictResolved.message=以解決的衝突
|
||||||
|
eventView.entry.conflictResolved.showDecrypted=顯示解密的檔案
|
||||||
|
eventView.entry.conflictResolved.copyDecrypted=複製解密路徑
|
||||||
|
eventView.entry.conflict.message=解決衝突失敗
|
||||||
|
eventView.entry.conflict.showDecrypted=顯示解密、原始的檔案
|
||||||
|
eventView.entry.conflict.copyDecrypted=複製解密、原始的路徑
|
||||||
|
eventView.entry.conflict.showEncrypted=顯示衝突的加密檔案
|
||||||
|
eventView.entry.conflict.copyEncrypted=複製衝突的加密檔案
|
||||||
eventView.entry.decryptionFailed.message=解密失敗
|
eventView.entry.decryptionFailed.message=解密失敗
|
||||||
eventView.entry.decryptionFailed.showEncrypted=顯示加密的檔案
|
eventView.entry.decryptionFailed.showEncrypted=顯示加密的檔案
|
||||||
eventView.entry.decryptionFailed.copyEncrypted=複製加密路徑
|
eventView.entry.decryptionFailed.copyEncrypted=複製加密路徑
|
||||||
eventView.entry.brokenDirFile.message=損壞的目錄連結
|
eventView.entry.brokenDirFile.message=損壞的目錄連結
|
||||||
eventView.entry.brokenDirFile.showEncrypted=顯示損壞的加密路徑
|
eventView.entry.brokenDirFile.showEncrypted=顯示損壞的加密路徑
|
||||||
eventView.entry.brokenDirFile.copyEncrypted=複製損壞的路徑連結
|
eventView.entry.brokenDirFile.copyEncrypted=複製損壞的路徑連結
|
||||||
|
eventView.entry.brokenFileNode.message=損壞的檔案系統節點
|
||||||
|
eventView.entry.brokenFileNode.showEncrypted=顯示損壞的加密節點
|
||||||
|
eventView.entry.brokenFileNode.copyEncrypted=複製損壞的加密節點路徑
|
||||||
|
eventView.entry.brokenFileNode.copyDecrypted=複製解密路徑
|
||||||
|
|||||||
@@ -16,12 +16,7 @@ class MapKeychainAccess implements KeychainAccessProvider {
|
|||||||
private final Map<String, char[]> map = new HashMap<>();
|
private final Map<String, char[]> map = new HashMap<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String displayName() {
|
public void storePassphrase(String key, String displayName,CharSequence passphrase) {
|
||||||
return getClass().getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void storePassphrase(String key, String displayName,CharSequence passphrase, boolean ignored) {
|
|
||||||
char[] pw = new char[passphrase.length()];
|
char[] pw = new char[passphrase.length()];
|
||||||
for (int i = 0; i < passphrase.length(); i++) {
|
for (int i = 0; i < passphrase.length(); i++) {
|
||||||
pw[i] = passphrase.charAt(i);
|
pw[i] = passphrase.charAt(i);
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ public class ReadMeGeneratorTest {
|
|||||||
@CsvSource({ //
|
@CsvSource({ //
|
||||||
"test,test", //
|
"test,test", //
|
||||||
"t\u00E4st,t\\'E4st", //
|
"t\u00E4st,t\\'E4st", //
|
||||||
"t\uD83D\uDE09st,t\\uc1\\u55357\\uc1\\u56841st", //
|
"t\uD83D\uDE09st,t\\u55357\\u56841st", //
|
||||||
})
|
})
|
||||||
public void testEscapeNonAsciiChars(String input, String expectedResult) {
|
public void testEscapeNonAsciiChars(String input, String expectedResult) {
|
||||||
ReadmeGenerator readmeGenerator = new ReadmeGenerator(null);
|
ReadmeGenerator readmeGenerator = new ReadmeGenerator(null);
|
||||||
@@ -40,7 +40,7 @@ public class ReadMeGeneratorTest {
|
|||||||
MatcherAssert.assertThat(result, CoreMatchers.startsWith("{\\rtf1\\fbidis\\ansi\\uc0\\fs32"));
|
MatcherAssert.assertThat(result, CoreMatchers.startsWith("{\\rtf1\\fbidis\\ansi\\uc0\\fs32"));
|
||||||
MatcherAssert.assertThat(result, CoreMatchers.containsString("{\\sa80 Dear User,}\\par"));
|
MatcherAssert.assertThat(result, CoreMatchers.containsString("{\\sa80 Dear User,}\\par"));
|
||||||
MatcherAssert.assertThat(result, CoreMatchers.containsString("{\\sa80 \\b please don't touch the \"d\" directory.}\\par "));
|
MatcherAssert.assertThat(result, CoreMatchers.containsString("{\\sa80 \\b please don't touch the \"d\" directory.}\\par "));
|
||||||
MatcherAssert.assertThat(result, CoreMatchers.containsString("{\\sa80 Thank you for your cooperation \\uc1\\u55357\\uc1\\u56841}\\par"));
|
MatcherAssert.assertThat(result, CoreMatchers.containsString("{\\sa80 Thank you for your cooperation \\u55357\\u56841}\\par"));
|
||||||
MatcherAssert.assertThat(result, CoreMatchers.endsWith("}"));
|
MatcherAssert.assertThat(result, CoreMatchers.endsWith("}"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user