Compare commits

..
Author SHA1 Message Date
Armin Schrenk 1b9f847fd4 [skip ci] update changelog 2026-09-16 17:57:35 +02:00
Tobias Hagemann 1712d31a5c Scope draft release permissions 2026-09-15 21:26:02 +02:00
Tobias Hagemann 8d732e19ce Harden workflow permissions 2026-09-15 21:20:31 +02:00
Armin Schrenk 264e1590c2 fix license generation plugin 2026-09-15 18:44:48 +02:00
Armin SchrenkandGitHub 3e8d8a9c76 Add maven run config (#4317)
to run app with maven
2026-09-15 14:08:53 +02:00
Tobias Hagemann 5bcecf2976 Fix dead docs link in admin config template 2026-09-08 10:55:03 +02:00
Tobias Hagemann af99135172 Remove Uruky as gold sponsor [ci skip] 2026-09-01 11:21:33 +02:00
Armin SchrenkandGitHub a02224640b Merge pull request #4295 from cryptomator/feature/improve-tofu-dialog
Increase usablity of TOFU dialog
2026-08-27 15:00:55 +02:00
Armin Schrenk 04fe64b9e0 fix grammar 2026-08-25 17:31:55 +02:00
Armin Schrenk 44434aa404 Improve phrasing 2026-08-25 16:27:03 +02:00
Armin Schrenk 35ac351541 Increase usablity of TOFU dialog
* Add description
* display URLs in legible font
* add copy button for URLs
2026-08-25 14:12:00 +02:00
Armin Schrenk 1eb70aeea7 migrate code to common JDK 25 apis and constructs 2026-08-24 11:14:34 +02:00
Armin Schrenk abcbefdd2c Update org.fasterxml:jackson-* to version 2.21.6 2026-08-18 17:39:07 +02:00
Tobias Hagemann 7af6c79b80 Add Uruky as gold sponsor [ci skip] 2026-07-30 17:11:43 +02:00
Armin SchrenkandGitHub 193aa1887d Merge pull request #4274 from cryptomator/feature/4272-fix-locate-encrypted
Feature: Fix locate encrypted file on Linux
2026-07-17 17:51:53 +02:00
Armin Schrenk 0ce6008576 ensure path is always absolute
Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-07-17 17:45:17 +02:00
Armin Schrenk 0bf3e0a071 [skip ci] use maven wrapper in build script
Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-07-17 17:43:26 +02:00
Armin Schrenk 3d82e9a97f Fix JfxRevealPathService opens the file instead of revealing
also set priority to "Fallback"

Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-07-16 12:03:46 +02:00
Armin Schrenk bdab18b7c3 update integrations-linux
Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-07-16 12:00:06 +02:00
Andreas OpferkuchandGitHub 688d1a4a24 README: Update JDK version from 25 to 26 (#4269)
[ci skip]
2026-07-02 21:05:18 +02:00
Tobias Hagemann 56e655c5a9 Add ApiVoid as silver sponsor [ci skip] 2026-07-01 12:15:15 +02:00
Armin Schrenk 4c9dbb60fe fix b681c26d72
Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-06-29 14:44:13 +02:00
Armin Schrenk 7ddedea5c2 [skip ci] Merge branch 'main' into develop
Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-06-29 13:54:55 +02:00
Armin Schrenk fc76f5f83f Merge branch 'release/1.19.3' 2026-06-29 13:52:10 +02:00
Armin Schrenk bfc8542551 remove dependency-check from release-check workflow
Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-06-29 13:50:24 +02:00
Armin Schrenk 24a20911f1 finalize 1.19.3
Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-06-29 13:39:27 +02:00
Armin Schrenk b681c26d72 Replace some slim runners by regular ones
Slim ubuntu runners don't have docker, thus failing executing certain actions. (i.e. https://github.com/rtCamp/action-slack-notify/issues/240)

Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-06-25 13:16:17 +02:00
Armin Schrenk 34f5c06795 [skip ci] Update changelog
Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-06-25 13:11:11 +02:00
Armin Schrenk f4928fd981 prepare 1.19.3
Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-06-25 11:23:48 +02:00
Armin SchrenkandGitHub f748bfd953 replace zulu by temurin (#4263)
Closes #4242

Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-06-25 11:13:18 +02:00
Armin SchrenkandGitHub cb689946ed Merge pull request #4262 from cryptomator/feature/4260-fix-unsigned-ps1
Sign Powershell scripts (again)
2026-06-25 10:21:47 +02:00
Armin Schrenk 38bdf6d0e4 cleanup workflow
Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-06-25 10:14:42 +02:00
Armin Schrenk 409209fd89 [skip ci] update changelog
Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-06-25 10:09:48 +02:00
Armin Schrenk 1fd44ff651 for scripts, do not append signature
Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-06-25 01:10:10 +02:00
Armin Schrenk 9bb19b0130 extra sign steps for ps1
Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-06-25 00:51:46 +02:00
Armin Schrenk 1b5319f706 check ps1 scripts after signing
Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-06-25 00:31:19 +02:00
Armin Schrenk 33b4aa5ba3 Revert "Revert #4169 and fix ps1 files not signed"
This reverts commit 1879c6fa77.
2026-06-25 00:23:58 +02:00
Armin Schrenk 1879c6fa77 Revert #4169 and fix ps1 files not signed 2026-06-24 17:31:42 +02:00
Armin Schrenk 8b4c4dca8e Ensure also exe build uses JDK 26.0.1+8 2026-06-24 17:22:18 +02:00
Armin Schrenk 32c0327058 Update code-signing action to version 2.0.0 2026-06-24 17:22:04 +02:00
Armin SchrenkandGitHub 3be6b6eceb [skip ci] Update changelog 2026-06-24 15:51:39 +02:00
Armin Schrenk 1ff01e17f4 [skip ci] Update changelog 2026-06-24 15:43:43 +02:00
CryptobotandGitHub c932810bd8 New Crowdin updates (#4223)
New translations strings.properties

Afrikaans; Arabic; Bashkir; Belarusian; Bengali; Bosnian; Bulgarian; Catalan; Chinese Simplified; Chinese Traditional; Chinese Traditional, Hong Kong; Croatian; Czech; Danish; Dutch; Filipino; Finnish; French; Galician; German; Greek; Hebrew; Hindi; Hungarian; Indonesian; Italian; Japanese; Korean; Latvian; Lithuanian; Macedonian; Marathi; Norwegian; Norwegian Bokmal; Norwegian Nynorsk; Persian; Polish; Portuguese; Portuguese, Brazilian; Punjabi; Romanian; Russian; Serbian (Cyrillic); Serbian (Latin); Sinhala; Slovak; Slovenian; Spanish; Swahili, Tanzania; Swedish; Tamil; Telugu; Thai; Turkish; Ukrainian; Urdu (Pakistan); Uyghur; Vietnamese; 

[ci skip]
2026-06-24 15:09:58 +02:00
Armin SchrenkandGitHub 4b6c4d1ce4 Merge pull request #4258 from cryptomator/feature/automatic-maven-profile
Automatically activate os specific maven profiles
2026-06-24 15:08:01 +02:00
Armin Schrenk 3d76ed5048 [skip ci] update readme 2026-06-24 15:04:48 +02:00
Armin Schrenk 47d2900f37 automatically activate os specific maven profiles 2026-06-24 14:55:38 +02:00
Armin SchrenkandGitHub 95f5c7aecd Merge pull request #4255 from cryptomator/feature/javafx25.0.3
Update to openjfx 25.0.3
2026-06-24 13:24:41 +02:00
Armin SchrenkandGitHub bda019f0b4 Merge branch 'develop' into feature/javafx25.0.3 2026-06-24 08:55:33 +02:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
69e87c067e Bump the maven-dependencies group across 1 directory with 16 updates (#4257)
Bumps the maven-dependencies group with 16 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [org.cryptomator:webdav-nio-adapter](https://github.com/cryptomator/webdav-nio-adapter) | `3.0.1` | `3.0.2` |
| [org.cryptomator:integrations-api](https://github.com/cryptomator/integrations-api) | `1.8.0` | `1.9.0` |
| org.slf4j:slf4j-api | `2.0.17` | `2.0.18` |
| [ch.qos.logback:logback-core](https://github.com/qos-ch/logback) | `1.5.32` | `1.5.35` |
| [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) | `1.5.32` | `1.5.35` |
| [com.auth0:java-jwt](https://github.com/auth0/java-jwt) | `4.5.1` | `4.5.2` |
| [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) | `2.21.1` | `2.21.4` |
| com.fasterxml.jackson.datatype:jackson-datatype-jsr310 | `2.21.1` | `2.21.4` |
| [com.github.ben-manes.caffeine:caffeine](https://github.com/ben-manes/caffeine) | `3.2.3` | `3.2.4` |
| [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework) | `6.0.3` | `6.1.0` |
| [org.mockito:mockito-core](https://github.com/mockito/mockito) | `5.22.0` | `5.23.0` |
| [org.cryptomator:integrations-win](https://github.com/cryptomator/integrations-win) | `1.6.0` | `1.6.1` |
| [org.apache.maven.plugins:maven-dependency-plugin](https://github.com/apache/maven-dependency-plugin) | `3.10.0` | `3.11.0` |
| [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) | `3.5.3` | `3.5.6` |
| [org.jacoco:jacoco-maven-plugin](https://github.com/jacoco/jacoco) | `0.8.14` | `0.8.15` |
| [org.owasp:dependency-check-maven](https://github.com/dependency-check/DependencyCheck) | `12.2.0` | `12.2.2` |



Updates `org.cryptomator:webdav-nio-adapter` from 3.0.1 to 3.0.2
- [Release notes](https://github.com/cryptomator/webdav-nio-adapter/releases)
- [Changelog](https://github.com/cryptomator/webdav-nio-adapter/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/cryptomator/webdav-nio-adapter/compare/3.0.1...3.0.2)

Updates `org.cryptomator:integrations-api` from 1.8.0 to 1.9.0
- [Release notes](https://github.com/cryptomator/integrations-api/releases)
- [Changelog](https://github.com/cryptomator/integrations-api/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/cryptomator/integrations-api/compare/1.8.0...1.9.0)

Updates `org.slf4j:slf4j-api` from 2.0.17 to 2.0.18

Updates `ch.qos.logback:logback-core` from 1.5.32 to 1.5.35
- [Release notes](https://github.com/qos-ch/logback/releases)
- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.32...v_1.5.35)

Updates `ch.qos.logback:logback-classic` from 1.5.32 to 1.5.35
- [Release notes](https://github.com/qos-ch/logback/releases)
- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.32...v_1.5.35)

Updates `ch.qos.logback:logback-classic` from 1.5.32 to 1.5.35
- [Release notes](https://github.com/qos-ch/logback/releases)
- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.32...v_1.5.35)

Updates `com.auth0:java-jwt` from 4.5.1 to 4.5.2
- [Release notes](https://github.com/auth0/java-jwt/releases)
- [Changelog](https://github.com/auth0/java-jwt/blob/master/CHANGELOG.md)
- [Commits](https://github.com/auth0/java-jwt/compare/4.5.1...4.5.2)

Updates `com.fasterxml.jackson.core:jackson-databind` from 2.21.1 to 2.21.4
- [Commits](https://github.com/FasterXML/jackson/commits)

Updates `com.fasterxml.jackson.datatype:jackson-datatype-jsr310` from 2.21.1 to 2.21.4

Updates `com.fasterxml.jackson.datatype:jackson-datatype-jsr310` from 2.21.1 to 2.21.4

Updates `com.github.ben-manes.caffeine:caffeine` from 3.2.3 to 3.2.4
- [Release notes](https://github.com/ben-manes/caffeine/releases)
- [Commits](https://github.com/ben-manes/caffeine/compare/v3.2.3...v3.2.4)

Updates `org.junit.jupiter:junit-jupiter` from 6.0.3 to 6.1.0
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r6.0.3...r6.1.0)

Updates `org.mockito:mockito-core` from 5.22.0 to 5.23.0
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.22.0...v5.23.0)

Updates `org.cryptomator:integrations-win` from 1.6.0 to 1.6.1
- [Release notes](https://github.com/cryptomator/integrations-win/releases)
- [Changelog](https://github.com/cryptomator/integrations-win/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/cryptomator/integrations-win/compare/1.6.0...1.6.1)

Updates `org.apache.maven.plugins:maven-dependency-plugin` from 3.10.0 to 3.11.0
- [Release notes](https://github.com/apache/maven-dependency-plugin/releases)
- [Commits](https://github.com/apache/maven-dependency-plugin/compare/maven-dependency-plugin-3.10.0...maven-dependency-plugin-3.11.0)

Updates `org.apache.maven.plugins:maven-surefire-plugin` from 3.5.3 to 3.5.6
- [Release notes](https://github.com/apache/maven-surefire/releases)
- [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.5.3...surefire-3.5.6)

Updates `org.jacoco:jacoco-maven-plugin` from 0.8.14 to 0.8.15
- [Release notes](https://github.com/jacoco/jacoco/releases)
- [Commits](https://github.com/jacoco/jacoco/compare/v0.8.14...v0.8.15)

Updates `org.owasp:dependency-check-maven` from 12.2.0 to 12.2.2
- [Release notes](https://github.com/dependency-check/DependencyCheck/releases)
- [Changelog](https://github.com/dependency-check/DependencyCheck/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dependency-check/DependencyCheck/compare/v12.2.0...v12.2.2)

---
updated-dependencies:
- dependency-name: org.cryptomator:webdav-nio-adapter
  dependency-version: 3.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: org.cryptomator:integrations-api
  dependency-version: 1.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven-dependencies
- dependency-name: org.slf4j:slf4j-api
  dependency-version: 2.0.18
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: ch.qos.logback:logback-core
  dependency-version: 1.5.35
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: ch.qos.logback:logback-classic
  dependency-version: 1.5.35
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: ch.qos.logback:logback-classic
  dependency-version: 1.5.35
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: com.auth0:java-jwt
  dependency-version: 4.5.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: com.fasterxml.jackson.core:jackson-databind
  dependency-version: 2.21.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: com.fasterxml.jackson.datatype:jackson-datatype-jsr310
  dependency-version: 2.21.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: com.fasterxml.jackson.datatype:jackson-datatype-jsr310
  dependency-version: 2.21.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: com.github.ben-manes.caffeine:caffeine
  dependency-version: 3.2.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: org.junit.jupiter:junit-jupiter
  dependency-version: 6.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: maven-dependencies
- dependency-name: org.mockito:mockito-core
  dependency-version: 5.23.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: maven-dependencies
- dependency-name: org.cryptomator:integrations-win
  dependency-version: 1.6.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: org.apache.maven.plugins:maven-dependency-plugin
  dependency-version: 3.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven-dependencies
- dependency-name: org.apache.maven.plugins:maven-surefire-plugin
  dependency-version: 3.5.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: org.jacoco:jacoco-maven-plugin
  dependency-version: 0.8.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: org.owasp:dependency-check-maven
  dependency-version: 12.2.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 17:25:42 +02:00
Armin Schrenk fc7cf0da2d manually update javafx
Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-06-23 16:38:32 +02:00
Armin SchrenkandGitHub c3de54f256 Merge pull request #4254 from cryptomator/dependabot/github_actions/github-actions-0c3dbf5312
Bump the github-actions group across 1 directory with 11 updates
2026-06-23 16:31:21 +02:00
Armin Schrenk 40f0a363c9 Update to openjfx 25.0.3 2026-06-23 11:55:42 +02:00
dependabot[bot]andGitHub 09e8cc7fdf Bump the github-actions group across 1 directory with 11 updates
Bumps the github-actions group with 11 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [actions/checkout](https://github.com/actions/checkout) | `6.0.2` | `7.0.0` |
| [actions/setup-java](https://github.com/actions/setup-java) | `5.2.0` | `5.3.0` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `7.0.0` | `7.0.1` |
| [softprops/action-gh-release](https://github.com/softprops/action-gh-release) | `2.5.0` | `3.0.1` |
| [actions/download-artifact](https://github.com/actions/download-artifact) | `8.0.0` | `8.0.1` |
| [rtCamp/action-slack-notify](https://github.com/rtcamp/action-slack-notify) | `2.3.3` | `2.4.0` |
| [SamKirkland/FTP-Deploy-Action](https://github.com/samkirkland/ftp-deploy-action) | `4.3.6` | `4.4.0` |
| [actions/cache](https://github.com/actions/cache) | `5.0.4` | `5.0.5` |
| [skymatic/workflows/.github/workflows/run-dependency-check.yml](https://github.com/skymatic/workflows) | `3.0.3` | `3.1.0` |
| [actions/github-script](https://github.com/actions/github-script) | `8.0.0` | `9.0.0` |
| [actions/stale](https://github.com/actions/stale) | `10.2.0` | `10.3.0` |



Updates `actions/checkout` from 6.0.2 to 7.0.0
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/de0fac2e4500dabe0009e67214ff5f5447ce83dd...9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0)

Updates `actions/setup-java` from 5.2.0 to 5.3.0
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/be666c2fcd27ec809703dec50e508c2fdc7f6654...ad2b38190b15e4d6bdf0c97fb4fca8412226d287)

Updates `actions/upload-artifact` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/bbbca2ddaa5d8feaa63e36b76fdaad77386f024f...043fb46d1a93c77aae656e7c1c64a875d1fc6a0a)

Updates `softprops/action-gh-release` from 2.5.0 to 3.0.1
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v2.5.0...718ea10b132b3b2eba29c1007bb80653f286566b)

Updates `actions/download-artifact` from 8.0.0 to 8.0.1
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v8...3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c)

Updates `rtCamp/action-slack-notify` from 2.3.3 to 2.4.0
- [Release notes](https://github.com/rtcamp/action-slack-notify/releases)
- [Commits](https://github.com/rtcamp/action-slack-notify/compare/e31e87e03dd19038e411e38ae27cbad084a90661...33ca3be66c6f378fe1610fd1d5258632dbed5e58)

Updates `SamKirkland/FTP-Deploy-Action` from 4.3.6 to 4.4.0
- [Release notes](https://github.com/samkirkland/ftp-deploy-action/releases)
- [Commits](https://github.com/samkirkland/ftp-deploy-action/compare/a51268f67f6605236975928ae28b0f7e9971d50a...110f9186c050f71550953127052e77650219c287)

Updates `actions/cache` from 5.0.4 to 5.0.5
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/668228422ae6a00e4ad889ee87cd7109ec5666a7...27d5ce7f107fe9357f9df03efb73ab90386fccae)

Updates `skymatic/workflows/.github/workflows/run-dependency-check.yml` from 3.0.3 to 3.1.0
- [Release notes](https://github.com/skymatic/workflows/releases)
- [Commits](https://github.com/skymatic/workflows/compare/957d3c2c08c56855fdac41e5afb9a7aca8c30dd9...8356563bf7b8d1c8d693f75ca487e8f57573cec9)

Updates `actions/github-script` from 8.0.0 to 9.0.0
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/ed597411d8f924073f98dfc5c65a23a2325f34cd...3a2844b7e9c422d3c10d287c895573f7108da1b3)

Updates `actions/stale` from 10.2.0 to 10.3.0
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/b5d41d4e1d5dceea10e7104786b73624c18a190f...eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/setup-java
  dependency-version: 5.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: softprops/action-gh-release
  dependency-version: 3.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/download-artifact
  dependency-version: 8.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: rtCamp/action-slack-notify
  dependency-version: 2.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: SamKirkland/FTP-Deploy-Action
  dependency-version: 4.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: actions/cache
  dependency-version: 5.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: skymatic/workflows/.github/workflows/run-dependency-check.yml
  dependency-version: 3.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: actions/github-script
  dependency-version: 9.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/stale
  dependency-version: 10.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-23 09:54:10 +00:00
Armin Schrenk b4ea03a7cd remove maven-surefire-junit5-tree-reporter
incompatible with surefire 3.5.4 and above
2026-06-23 11:50:15 +02:00
Armin Schrenk a30e887177 Stay on Jackson 2.21.x
LTS release supported until 2028
2026-06-23 11:47:58 +02:00
Armin SchrenkandGitHub 331f66db0c Merge pull request #4243 from cryptomator/feature/not-a-vault-dir
Feature: Improve UX when importing vaults with invalid structure
2026-06-10 11:24:00 +02:00
CopilotGitHubcopilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
dd5827204c Bump Maven Wrapper distribution to Apache Maven 3.9.16 (#4247)
* Add Maven Wrapper and migrate Maven invocations

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2026-06-03 18:03:47 +02:00
Armin Schrenk 8bee60975e Merge branch 'develop' into feature/not-a-vault-dir 2026-06-03 16:59:19 +02:00
Armin SchrenkandGitHub f96a03ae30 Upgrade project JDK version from 25 to 26
references #4244
2026-06-03 16:35:03 +02:00
Armin SchrenkandGitHub 41ce350b61 Merge pull request #4244 from cryptomator/feature/jdk26
Feature: JDK 26
2026-06-03 10:44:40 +02:00
Armin Schrenk 64b0e63b21 cleaner errro report for invalid vaults 2026-06-03 10:41:45 +02:00
Armin Schrenk 6c62b4d293 prevent duplicates when adding same vault several times
do checking and adding on the fx thread.
2026-06-03 10:41:23 +02:00
Armin Schrenk 3f312b183e Prevent any blocking questions
when adding coffeelibs repo
2026-06-03 09:13:26 +02:00
Armin Schrenk 719a91692a cleanup 2026-06-02 20:21:16 +02:00
Armin Schrenk 85b7265b95 Place vault storage location check in separate functions 2026-06-02 20:21:02 +02:00
Armin Schrenk fbdf1b1bdb Replace openjdk by coffeelibs-jdk again
Signed-off-by: Armin Schrenk <armin.schrenk@skymatic.de>
2026-06-02 18:27:39 +02:00
Armin Schrenk ae2fd74411 Revert "test if signing issue is fixed with temurin"
This reverts commit 602c206dae.
2026-06-01 11:52:41 +02:00
Armin Schrenk 49ca7f4891 Bump jdk to 26 (or 26.0.1+8) 2026-06-01 09:52:57 +02:00
CopilotGitHubcopilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>infeo
d5d992b1c2 Add dependency-check suppressions for new Jetty CVEs (#4241)
Agent-Logs-Url: https://github.com/cryptomator/cryptomator/sessions/7fec8174-cf7f-4860-9a62-1299e45a5ca6

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: infeo <9036915+infeo@users.noreply.github.com>
2026-05-18 11:23:09 +02:00
Armin Schrenk 01b30b173e enhance message 2026-05-12 12:09:50 +02:00
Armin Schrenk be4a39c628 Run validation on non-fx thread
old code can still run it on fx thread
2026-05-12 09:39:07 +02:00
Armin Schrenk e63a0e8ee8 Show user improved error message 2026-05-12 08:30:34 +02:00
Armin Schrenk 6c925d6a1f Throw more specific error about vault directory 2026-05-11 12:12:58 +02:00
Armin Schrenk 602c206dae test if signing issue is fixed with temurin 2026-05-05 11:23:14 +02:00
Armin Schrenk 426b33ae1a fix win-update-url 2026-05-04 11:55:40 +02:00
Armin Schrenk 8e52161fa4 Use JDK 26.0.1+8 2026-04-29 12:01:03 +02:00
Armin Schrenk f1540e13eb Also use new template properties file in CI 2026-04-29 11:58:45 +02:00
Armin Schrenk 2c2165cb22 Fix wixhelper.dll not found
file is named now msica.dll
2026-04-29 11:58:07 +02:00
Armin Schrenk 03cb5f6be9 Closes #4219 2026-04-28 18:23:44 +02:00
Armin Schrenk 8a98048835 update windows build script to stop on errors 2026-04-28 16:14:39 +02:00
137 changed files with 2593 additions and 615 deletions
+1 -1
View File
@@ -48,7 +48,7 @@ runs:
echo "client-secret=${{ inputs.client-secret }}" >> "$GITHUB_OUTPUT" echo "client-secret=${{ inputs.client-secret }}" >> "$GITHUB_OUTPUT"
shell: bash shell: bash
- name: Sign DLLs with Azure Trusted Signing - name: Sign DLLs with Azure Trusted Signing
uses: azure/artifact-signing-action@87c2e83e6868da99d3380aa309851b32ed9a8346 # v1.1.0 uses: azure/artifact-signing-action@c7ab2a863ab5f9a846ddb8265964877ef296ee82 # v2.0.0
with: with:
files-folder: ${{ inputs.base-dir }} files-folder: ${{ inputs.base-dir }}
files-folder-filter: ${{ inputs.file-extensions }} files-folder-filter: ${{ inputs.file-extensions }}
+2 -4
View File
@@ -10,10 +10,8 @@ updates:
- dependency-name: "jakarta.inject:jakarta.inject-api" - dependency-name: "jakarta.inject:jakarta.inject-api"
versions: ["2.0.1.MR"] versions: ["2.0.1.MR"]
- dependency-name: "org.openjfx:*" - dependency-name: "org.openjfx:*"
update-types: ["version-update:semver-major"] - dependency-name: "com.fasterxml.jackson.*"
# due to https://github.com/fabriciorby/maven-surefire-junit5-tree-reporter/issues/68 versions: [ "[2.22,)" ] # 2.21.x is LTS, see https://github.com/FasterXML/jackson/wiki/Jackson-Release-2.21
- dependency-name: "org.apache.maven.plugins:maven-surefire-plugin"
versions: [ "3.5.4", "3.5.5" ]
groups: groups:
maven-dependencies: maven-dependencies:
patterns: patterns:
+1 -1
View File
@@ -123,7 +123,7 @@ flowchart TD
| Job | Runs on | Description | | Job | Runs on | Description |
|-----|---------|-------------| |-----|---------|-------------|
| **get-version** | ubuntu | Parses the tag into semver components (`semVerNum`, `semVerSuffix`, `revNum`, `versionType`). The release is aborted if not an alpha, beta, rc or 'stable' release. | | **get-version** | ubuntu | Parses the tag into semver components (`semVerNum`, `semVerSuffix`, `revNum`, `versionType`). The release is aborted if not an alpha, beta, rc or 'stable' release. |
| **create-release-draft** | ubuntu | Checks out the repo, verifies the tag is **signed** and lives on a `main` or `release/*` branch. Runs `mvn verify` (with `xvfb-run`). Creates a GitHub Release **draft** using the [release body template](../release-body.md.template). Downloads and GPG-signs the source tarball. | | **create-release-draft** | ubuntu | Checks out the repo, verifies the tag is **signed** and lives on a `main` or `release/*` branch. Runs `./mvnw verify` (with `xvfb-run`). Creates a GitHub Release **draft** using the [release body template](../release-body.md.template). Downloads and GPG-signs the source tarball. |
| **build-exe-and-msi** | windows | Calls [`win-exe.yml`](win-exe.yml). Builds the MSI and EXE bundle installer for x64 Windows. Code-signed via Azure Trusted Signing, GPG-signed, and uploaded to the draft release. Outputs SHA-256 checksums. | | **build-exe-and-msi** | windows | Calls [`win-exe.yml`](win-exe.yml). Builds the MSI and EXE bundle installer for x64 Windows. Code-signed via Azure Trusted Signing, GPG-signed, and uploaded to the draft release. Outputs SHA-256 checksums. |
| **build-dmg-arm64** | macos-15 | Calls [`mac-dmg.yml`](mac-dmg.yml). Builds the DMG for Apple Silicon. Code-signed, notarized with Apple, GPG-signed, and uploaded. Outputs SHA-256 checksum. | | **build-dmg-arm64** | macos-15 | Calls [`mac-dmg.yml`](mac-dmg.yml). Builds the DMG for Apple Silicon. Code-signed, notarized with Apple, GPG-signed, and uploaded. Outputs SHA-256 checksum. |
| **build-dmg-x64** | macos-15-large | Calls [`mac-dmg-x64.yml`](mac-dmg-x64.yml). Same as above but for Intel Macs. Uses macFUSE instead of FUSE-T. | | **build-dmg-x64** | macos-15-large | Calls [`mac-dmg-x64.yml`](mac-dmg-x64.yml). Same as above but for Intel Macs. Uses macFUSE instead of FUSE-T. |
+16 -13
View File
@@ -48,9 +48,12 @@ on:
- 'dist/linux/common/**' - 'dist/linux/common/**'
- 'dist/linux/resources/**' - 'dist/linux/resources/**'
permissions:
contents: read
env: env:
JAVA_DIST: 'temurin' JAVA_DIST: 'temurin'
JAVA_VERSION: '25.0.2+10.0.LTS' JAVA_VERSION: '26.0.1+8'
VERSION_NUM: ${{ inputs.semVerNum || '99.99.99'}} VERSION_NUM: ${{ inputs.semVerNum || '99.99.99'}}
REVISION_NUM: ${{ inputs.revisionNum || '0' }} REVISION_NUM: ${{ inputs.revisionNum || '0' }}
VERSION_SUFFIX: ${{ inputs.semVerSuffix || ''}} VERSION_SUFFIX: ${{ inputs.semVerSuffix || ''}}
@@ -66,18 +69,18 @@ jobs:
include: include:
- os: ubuntu-latest - os: ubuntu-latest
arch: x86_64 arch: x86_64
openjfx-url: 'https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_linux-x64_bin-jmods.zip' openjfx-url: 'https://download2.gluonhq.com/openjfx/25.0.3/openjfx-25.0.3_linux-x64_bin-jmods.zip'
openjfx-sha: 'e0a9c29d8cf3af9b8b48848b43f87b5785bc107c53a951b19668ce05842bba1b' openjfx-sha: '47035c653863a8e4be3dc6f142b8dbd84b4bb1efc9a8cbc68413e6a5ff5e9f50'
appimagetool-sha: 'ed4ce84f0d9caff66f50bcca6ff6f35aae54ce8135408b3fa33abfc3cb384eb0' appimagetool-sha: 'ed4ce84f0d9caff66f50bcca6ff6f35aae54ce8135408b3fa33abfc3cb384eb0'
- os: ubuntu-24.04-arm - os: ubuntu-24.04-arm
arch: aarch64 arch: aarch64
openjfx-url: 'https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_linux-aarch64_bin-jmods.zip' openjfx-url: 'https://download2.gluonhq.com/openjfx/25.0.3/openjfx-25.0.3_linux-aarch64_bin-jmods.zip'
openjfx-sha: 'c3408f818693cce09e59829a8e862a82c7695fdfcd585c41cfd527f5fc3fe646' openjfx-sha: 'e3fd682354346845d2944a2da2b1ff2b6cb9259d92027f2f9c121b9b93c5e42f'
appimagetool-sha: 'f0837e7448a0c1e4e650a93bb3e85802546e60654ef287576f46c71c126a9158' appimagetool-sha: 'f0837e7448a0c1e4e650a93bb3e85802546e60654ef287576f46c71c126a9158'
steps: steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Setup Java - name: Setup Java
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
with: with:
distribution: ${{ env.JAVA_DIST }} distribution: ${{ env.JAVA_DIST }}
java-version: ${{ env.JAVA_VERSION }} java-version: ${{ env.JAVA_VERSION }}
@@ -95,7 +98,7 @@ jobs:
JMOD_VERSION=$(jmod describe openjfx-jmods/javafx.base.jmod | head -1) JMOD_VERSION=$(jmod describe openjfx-jmods/javafx.base.jmod | head -1)
JMOD_VERSION=${JMOD_VERSION#*@} JMOD_VERSION=${JMOD_VERSION#*@}
JMOD_VERSION=${JMOD_VERSION%%.*} JMOD_VERSION=${JMOD_VERSION%%.*}
POM_JFX_VERSION=$(mvn help:evaluate "-Dexpression=javafx.version" -q -DforceStdout) POM_JFX_VERSION=$(./mvnw help:evaluate "-Dexpression=javafx.version" -q -DforceStdout)
POM_JFX_VERSION=${POM_JFX_VERSION#*@} POM_JFX_VERSION=${POM_JFX_VERSION#*@}
POM_JFX_VERSION=${POM_JFX_VERSION%%.*} POM_JFX_VERSION=${POM_JFX_VERSION%%.*}
@@ -104,9 +107,9 @@ jobs:
exit 1 exit 1
fi fi
- name: Set version - name: Set version
run : mvn versions:set -DnewVersion="${VERSION_NUM}${VERSION_SUFFIX}" run : ./mvnw versions:set -DnewVersion="${VERSION_NUM}${VERSION_SUFFIX}"
- name: Run maven - name: Run maven
run: mvn -B clean package -Plinux -DskipTests run: ./mvnw -B clean package -DskipTests
- name: Patch target dir - name: Patch target dir
run: | run: |
cp LICENSE.txt target cp LICENSE.txt target
@@ -210,7 +213,7 @@ jobs:
gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --detach-sign -a cryptomator-*.AppImage gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --detach-sign -a cryptomator-*.AppImage
gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --detach-sign -a cryptomator-*.AppImage.zsync gpg --batch --quiet --passphrase-fd 0 --pinentry-mode loopback -u 615D449FE6E6A235 --detach-sign -a cryptomator-*.AppImage.zsync
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with: with:
name: appimage-${{ matrix.arch }} name: appimage-${{ matrix.arch }}
path: | path: |
@@ -220,7 +223,7 @@ jobs:
if-no-files-found: error if-no-files-found: error
- name: Publish AppImage on GitHub Releases - name: Publish AppImage on GitHub Releases
if: inputs.upload-to-draft if: inputs.upload-to-draft
uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1 uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3.0.1
with: with:
draft: true draft: true
fail_on_unmatched_files: true fail_on_unmatched_files: true
@@ -240,7 +243,7 @@ jobs:
aarch64-sha256sum: ${{ steps.sha256sum.outputs.aarch64-sha256sum }} aarch64-sha256sum: ${{ steps.sha256sum.outputs.aarch64-sha256sum }}
steps: steps:
- name: Download AppImage artifacts - name: Download AppImage artifacts
uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0 uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with: with:
pattern: appimage-* pattern: appimage-*
path: appimage-artifacts path: appimage-artifacts
+5 -2
View File
@@ -9,6 +9,9 @@ on:
description: 'Source or Release tag' description: 'Source or Release tag'
required: false required: false
permissions:
contents: read
jobs: jobs:
get-version: get-version:
uses: ./.github/workflows/get-version.yml uses: ./.github/workflows/get-version.yml
@@ -33,7 +36,7 @@ jobs:
pacman-key --populate archlinux pacman-key --populate archlinux
pacman -Syu --noconfirm --needed git base-devel sudo gnupg maven unzip github-cli curl pacman-contrib pacman -Syu --noconfirm --needed git base-devel sudo gnupg maven unzip github-cli curl pacman-contrib
- name: Checkout cryptomator/aur-bin - name: Checkout cryptomator/aur-bin
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
repository: 'cryptomator/aur-bin' repository: 'cryptomator/aur-bin'
token: ${{ secrets.CRYPTOBOT_PR_TOKEN }} token: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
@@ -102,7 +105,7 @@ jobs:
DIST_VERSION: ${{ steps.pkgrel.outputs.dist-version }} DIST_VERSION: ${{ steps.pkgrel.outputs.dist-version }}
GH_TOKEN: ${{ secrets.CRYPTOBOT_PR_TOKEN }} GH_TOKEN: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
- name: Slack Notification - name: Slack Notification
uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # v2.3.3 uses: rtCamp/action-slack-notify@33ca3be66c6f378fe1610fd1d5258632dbed5e58 # v2.4.0
env: env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }} SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }}
SLACK_USERNAME: 'Cryptobot' SLACK_USERNAME: 'Cryptobot'
+5 -3
View File
@@ -34,6 +34,8 @@ on:
type: boolean type: boolean
default: false default: false
permissions: {}
jobs: jobs:
download-file: download-file:
name: Downloads the file into the VM name: Downloads the file into the VM
@@ -51,7 +53,7 @@ jobs:
- name: Download file - name: Download file
run: curl --silent --fail-with-body --proto "=https" -L "${INPUT_URL}" -o "${{steps.extractName.outputs.fileName}}" run: curl --silent --fail-with-body --proto "=https" -L "${INPUT_URL}" -o "${{steps.extractName.outputs.fileName}}"
- name: Upload artifact - name: Upload artifact
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with: with:
name: ${{ steps.extractName.outputs.fileName }} name: ${{ steps.extractName.outputs.fileName }}
path: ${{ steps.extractName.outputs.fileName }} path: ${{ steps.extractName.outputs.fileName }}
@@ -68,7 +70,7 @@ jobs:
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@a51268f67f6605236975928ae28b0f7e9971d50a # v4.6.3 uses: SamKirkland/FTP-Deploy-Action@110f9186c050f71550953127052e77650219c287 # v4.6.3
with: with:
protocol: ftps protocol: ftps
server: allowlist.kaspersky-labs.com server: allowlist.kaspersky-labs.com
@@ -78,7 +80,7 @@ jobs:
local-dir: ./upload/ local-dir: ./upload/
allowlist-avast: allowlist-avast:
name: Anti Virus Allowlisting Avast name: Anti Virus Allowlisting Avast
runs-on: ubuntu-slim runs-on: ubuntu-latest
needs: download-file needs: download-file
if: inputs.avast if: inputs.avast
steps: steps:
+9 -5
View File
@@ -11,25 +11,29 @@ on:
env: env:
JAVA_DIST: 'temurin' JAVA_DIST: 'temurin'
JAVA_VERSION: 25 JAVA_VERSION: 26
defaults: defaults:
run: run:
shell: bash shell: bash
permissions:
contents: read
pull-requests: read
jobs: jobs:
test: test:
name: Compile and Test name: Compile and Test
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
with: with:
distribution: ${{ env.JAVA_DIST }} distribution: ${{ env.JAVA_DIST }}
java-version: ${{ env.JAVA_VERSION }} java-version: ${{ env.JAVA_VERSION }}
cache: 'maven' cache: 'maven'
- name: Cache SonarCloud packages - name: Cache SonarCloud packages
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with: with:
path: ~/.sonar/cache path: ~/.sonar/cache
key: ${{ runner.os }}-sonar key: ${{ runner.os }}-sonar
@@ -37,7 +41,7 @@ jobs:
- name: Build and Test - name: Build and Test
run: > run: >
xvfb-run xvfb-run
mvn -B verify ./mvnw -B verify
jacoco:report jacoco:report
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar org.sonarsource.scanner.maven:sonar-maven-plugin:sonar
-Pcoverage -Pcoverage
+4 -2
View File
@@ -15,6 +15,8 @@ env:
} }
} }
permissions: {}
jobs: jobs:
check-version: check-version:
name: Checkout latest jdk version name: Checkout latest jdk version
@@ -26,7 +28,7 @@ jobs:
run: echo 'JDK_MAJOR_VERSION=${{ env.JDK_VERSION }}'.substring(0,2) >> "$env:GITHUB_ENV" run: echo 'JDK_MAJOR_VERSION=${{ env.JDK_VERSION }}'.substring(0,2) >> "$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@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
with: with:
java-version: ${{ env.JDK_MAJOR_VERSION}} java-version: ${{ env.JDK_MAJOR_VERSION}}
distribution: ${{ env.JDK_VENDOR }} distribution: ${{ env.JDK_VENDOR }}
@@ -70,7 +72,7 @@ jobs:
} }
- name: Notify - name: Notify
if: steps.determine.outputs.UPDATE_AVAILABLE == 'true' if: steps.determine.outputs.UPDATE_AVAILABLE == 'true'
uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # v2.3.3 uses: rtCamp/action-slack-notify@33ca3be66c6f378fe1610fd1d5258632dbed5e58 # v2.4.0
env: env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
SLACK_USERNAME: 'Cryptobot' SLACK_USERNAME: 'Cryptobot'
+15 -11
View File
@@ -25,12 +25,15 @@ on:
env: env:
JAVA_DIST: 'temurin' JAVA_DIST: 'temurin'
JAVA_VERSION: '25.0.2+10.0.LTS' JAVA_VERSION: '26.0.1+8'
DEB_BUILD_DEPENDS: 'debhelper (>=10), openjdk-25-jdk (>= 25+36), libgtk-3-0 (>= 3.20.0), libxxf86vm1, libgl1' DEB_BUILD_DEPENDS: 'debhelper (>=10), coffeelibs-jdk-26 (>= 26.0.1+8-0ppa1), libgtk-3-0 (>= 3.20.0), libxxf86vm1, libgl1'
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_linux-x64_bin-jmods.zip' OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/25.0.3/openjfx-25.0.3_linux-x64_bin-jmods.zip'
OPENJFX_JMODS_AMD64_HASH: 'e0a9c29d8cf3af9b8b48848b43f87b5785bc107c53a951b19668ce05842bba1b' OPENJFX_JMODS_AMD64_HASH: '47035c653863a8e4be3dc6f142b8dbd84b4bb1efc9a8cbc68413e6a5ff5e9f50'
OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_linux-aarch64_bin-jmods.zip' OPENJFX_JMODS_AARCH64: 'https://download2.gluonhq.com/openjfx/25.0.3/openjfx-25.0.3_linux-aarch64_bin-jmods.zip'
OPENJFX_JMODS_AARCH64_HASH: 'c3408f818693cce09e59829a8e862a82c7695fdfcd585c41cfd527f5fc3fe646' OPENJFX_JMODS_AARCH64_HASH: 'e3fd682354346845d2944a2da2b1ff2b6cb9259d92027f2f9c121b9b93c5e42f'
permissions:
contents: read
jobs: jobs:
get-version: get-version:
@@ -45,7 +48,7 @@ jobs:
env: env:
INPUT_PPAVER: ${{ inputs.ppaver }} INPUT_PPAVER: ${{ inputs.ppaver }}
steps: steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- id: deb-version - id: deb-version
name: Determine deb-version name: Determine deb-version
run: | run: |
@@ -56,20 +59,21 @@ jobs:
fi fi
- name: Install build tools - name: Install build tools
run: | run: |
sudo add-apt-repository -y ppa:coffeelibs/openjdk
sudo apt-get update sudo apt-get update
sudo apt-get install devscripts dput sudo apt-get install devscripts dput
sudo apt-get satisfy "${DEB_BUILD_DEPENDS}" sudo apt-get satisfy "${DEB_BUILD_DEPENDS}"
env: env:
DEB_BUILD_DEPENDS: ${{ env.DEB_BUILD_DEPENDS }} DEB_BUILD_DEPENDS: ${{ env.DEB_BUILD_DEPENDS }}
- name: Setup Java - name: Setup Java
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
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: Run maven - name: Run maven
run: mvn -B clean package -Plinux -DskipTests run: ./mvnw -B clean package -DskipTests
- name: Download OpenJFX jmods - name: Download OpenJFX jmods
id: download-jmods id: download-jmods
run: | run: |
@@ -89,7 +93,7 @@ jobs:
JMOD_VERSION_AARCH64=$(jmod describe jmods/aarch64/javafx.base.jmod | head -1) JMOD_VERSION_AARCH64=$(jmod describe jmods/aarch64/javafx.base.jmod | head -1)
JMOD_VERSION_AARCH64=${JMOD_VERSION_AARCH64#*@} JMOD_VERSION_AARCH64=${JMOD_VERSION_AARCH64#*@}
JMOD_VERSION_AARCH64=${JMOD_VERSION_AARCH64%%.*} JMOD_VERSION_AARCH64=${JMOD_VERSION_AARCH64%%.*}
POM_JFX_VERSION=$(mvn help:evaluate "-Dexpression=javafx.version" -q -DforceStdout) POM_JFX_VERSION=$(./mvnw help:evaluate "-Dexpression=javafx.version" -q -DforceStdout)
POM_JFX_VERSION=${POM_JFX_VERSION#*@} POM_JFX_VERSION=${POM_JFX_VERSION#*@}
POM_JFX_VERSION=${POM_JFX_VERSION%%.*} POM_JFX_VERSION=${POM_JFX_VERSION%%.*}
@@ -145,7 +149,7 @@ jobs:
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
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with: with:
name: linux-deb-package name: linux-deb-package
path: | path: |
+5 -2
View File
@@ -5,13 +5,16 @@ on:
workflow_dispatch: workflow_dispatch:
permissions:
contents: read
jobs: jobs:
check-dependencies: check-dependencies:
uses: skymatic/workflows/.github/workflows/run-dependency-check.yml@957d3c2c08c56855fdac41e5afb9a7aca8c30dd9 # v3.0.3 uses: skymatic/workflows/.github/workflows/run-dependency-check.yml@8356563bf7b8d1c8d693f75ca487e8f57573cec9 # v3.1.0
with: with:
runner-os: 'ubuntu-latest' runner-os: 'ubuntu-latest'
java-distribution: 'temurin' java-distribution: 'temurin'
java-version: 25 java-version: 26
secrets: secrets:
nvd-api-key: ${{ secrets.NVD_API_KEY }} nvd-api-key: ${{ secrets.NVD_API_KEY }}
ossindex-username: ${{ secrets.OSSINDEX_USERNAME }} ossindex-username: ${{ secrets.OSSINDEX_USERNAME }}
+4 -1
View File
@@ -4,13 +4,16 @@ on:
schedule: schedule:
- cron: '0/15 * * * *' # run every 15 min - don't forget to adjust the "interval" in the json sent to the metrics endpoint - cron: '0/15 * * * *' # run every 15 min - don't forget to adjust the "interval" in the json sent to the metrics endpoint
permissions:
contents: read
jobs: jobs:
report-download-stats: report-download-stats:
runs-on: ubuntu-latest runs-on: ubuntu-latest
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@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with: with:
script: | script: |
const query = `query($owner:String!, $name:String!) { const query = `query($owner:String!, $name:String!) {
+22 -7
View File
@@ -7,7 +7,7 @@ on:
env: env:
JAVA_DIST: 'temurin' JAVA_DIST: 'temurin'
JAVA_VERSION: '25.0.2+10.0.LTS' JAVA_VERSION: '26.0.1+8'
defaults: defaults:
run: run:
@@ -16,6 +16,8 @@ defaults:
jobs: jobs:
get-version: get-version:
uses: ./.github/workflows/get-version.yml uses: ./.github/workflows/get-version.yml
permissions:
contents: read
with: with:
version: '' version: ''
@@ -23,26 +25,29 @@ jobs:
name: Compile and Test name: Compile and Test
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: get-version needs: get-version
permissions:
contents: read
pull-requests: read
if: needs.get-version.outputs.versionType != 'unknown' if: needs.get-version.outputs.versionType != 'unknown'
steps: steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Check the git tag is signed - name: Check the git tag is signed
run: git cat-file -p "${GITHUB_REF_NAME}" | grep "BEGIN SSH SIGNATURE" run: git cat-file -p "${GITHUB_REF_NAME}" | grep "BEGIN SSH SIGNATURE"
- name: Check the git tag is on release or main branch - name: Check the git tag is on release or main branch
run: git branch -r --contains "${GITHUB_REF_NAME}" | grep -E '^\s*origin/(main|release/.*)\s*$' run: git branch -r --contains "${GITHUB_REF_NAME}" | grep -E '^\s*origin/(main|release/.*)\s*$'
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
with: with:
distribution: ${{ env.JAVA_DIST }} distribution: ${{ env.JAVA_DIST }}
java-version: ${{ env.JAVA_VERSION }} java-version: ${{ env.JAVA_VERSION }}
cache: 'maven' cache: 'maven'
- name: Build and Test - name: Build and Test
run: xvfb-run mvn -B verify -Plinux run: xvfb-run ./mvnw -B verify
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
- name: Draft a release - name: Draft a release
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0 uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3.0.1
with: with:
draft: true draft: true
discussion_category_name: releases discussion_category_name: releases
@@ -60,7 +65,7 @@ jobs:
GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }} GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }} GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
- name: Publish asc on GitHub Releases - name: Publish asc on GitHub Releases
uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0 uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3.0.1
with: with:
draft: true draft: true
fail_on_unmatched_files: true fail_on_unmatched_files: true
@@ -71,6 +76,8 @@ jobs:
build-exe-and-msi: build-exe-and-msi:
needs: [get-version, create-release-draft] needs: [get-version, create-release-draft]
uses: ./.github/workflows/win-exe.yml uses: ./.github/workflows/win-exe.yml
permissions:
contents: read
with: with:
semVerNum: ${{needs.get-version.outputs.semVerNum}} semVerNum: ${{needs.get-version.outputs.semVerNum}}
revisionNum: ${{needs.get-version.outputs.revNum}} revisionNum: ${{needs.get-version.outputs.revNum}}
@@ -80,6 +87,8 @@ jobs:
build-dmg-arm64: build-dmg-arm64:
needs: [get-version, create-release-draft] needs: [get-version, create-release-draft]
uses: ./.github/workflows/mac-dmg.yml uses: ./.github/workflows/mac-dmg.yml
permissions:
contents: read
with: with:
semVerNum: ${{needs.get-version.outputs.semVerNum}} semVerNum: ${{needs.get-version.outputs.semVerNum}}
revisionNum: ${{needs.get-version.outputs.revNum}} revisionNum: ${{needs.get-version.outputs.revNum}}
@@ -89,6 +98,8 @@ jobs:
build-dmg-x64: build-dmg-x64:
needs: [get-version, create-release-draft] needs: [get-version, create-release-draft]
uses: ./.github/workflows/mac-dmg-x64.yml uses: ./.github/workflows/mac-dmg-x64.yml
permissions:
contents: read
with: with:
semVerNum: ${{needs.get-version.outputs.semVerNum}} semVerNum: ${{needs.get-version.outputs.semVerNum}}
revisionNum: ${{needs.get-version.outputs.revNum}} revisionNum: ${{needs.get-version.outputs.revNum}}
@@ -98,6 +109,8 @@ jobs:
build-appimages: build-appimages:
needs: [get-version, create-release-draft] needs: [get-version, create-release-draft]
uses: ./.github/workflows/appimage.yml uses: ./.github/workflows/appimage.yml
permissions:
contents: read
with: with:
semVerNum: ${{needs.get-version.outputs.semVerNum}} semVerNum: ${{needs.get-version.outputs.semVerNum}}
revisionNum: ${{needs.get-version.outputs.revNum}} revisionNum: ${{needs.get-version.outputs.revNum}}
@@ -107,12 +120,14 @@ jobs:
update-sha256sums: update-sha256sums:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [get-version, build-exe-and-msi, build-dmg-arm64, build-dmg-x64, build-appimages] needs: [get-version, build-exe-and-msi, build-dmg-arm64, build-dmg-x64, build-appimages]
permissions:
contents: read
env: env:
TAG: ${{ github.ref_name }} TAG: ${{ github.ref_name }}
SEMVER: ${{ needs.get-version.outputs.semVerStr }} SEMVER: ${{ needs.get-version.outputs.semVerStr }}
GH_TOKEN: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }} GH_TOKEN: ${{ secrets.CRYPTOBOT_RELEASE_TOKEN }}
steps: steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Compute source tarball SHA256 - name: Compute source tarball SHA256
id: src-sha256 id: src-sha256
run: | run: |
+4 -1
View File
@@ -6,6 +6,9 @@ on:
discussion_comment: discussion_comment:
types: [created, edited, deleted] types: [created, edited, deleted]
permissions:
discussions: read
jobs: jobs:
update-error-db: update-error-db:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -14,7 +17,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@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with: with:
script: | script: |
const query = `query ($owner: String!, $name: String!, $discussionNumber: Int!) { const query = `query ($owner: String!, $name: String!, $discussionNumber: Int!) {
+7 -4
View File
@@ -26,7 +26,10 @@ on:
env: env:
JAVA_DIST: 'temurin' JAVA_DIST: 'temurin'
JAVA_VERSION: 25 JAVA_VERSION: 26
permissions:
contents: read
jobs: jobs:
determine-version: determine-version:
@@ -39,11 +42,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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Setup Java - name: Setup Java
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
with: with:
distribution: ${{ env.JAVA_DIST }} distribution: ${{ env.JAVA_DIST }}
java-version: ${{ env.JAVA_VERSION }} java-version: ${{ env.JAVA_VERSION }}
@@ -56,7 +59,7 @@ jobs:
elif [[ "${VERSION_STRING}" =~ [0-9]+\.[0-9]+\.[0-9]+.* ]]; then elif [[ "${VERSION_STRING}" =~ [0-9]+\.[0-9]+\.[0-9]+.* ]]; then
SEM_VER_STR="${VERSION_STRING}" SEM_VER_STR="${VERSION_STRING}"
else else
SEM_VER_STR=`mvn help:evaluate -Dexpression=project.version -q -DforceStdout` SEM_VER_STR=`./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout`
fi fi
SEM_VER_NUM=$(echo ${SEM_VER_STR} | sed -E 's/([0-9]+\.[0-9]+\.[0-9]+).*/\1/') SEM_VER_NUM=$(echo ${SEM_VER_STR} | sed -E 's/([0-9]+\.[0-9]+\.[0-9]+).*/\1/')
+11 -8
View File
@@ -23,6 +23,9 @@ on:
- 'dist/linux/common/**' - 'dist/linux/common/**'
- 'dist/linux/resources/**' - 'dist/linux/resources/**'
permissions:
contents: read
jobs: jobs:
get-version: get-version:
uses: ./.github/workflows/get-version.yml uses: ./.github/workflows/get-version.yml
@@ -49,16 +52,16 @@ jobs:
env: env:
SRC_GIT_SHA: ${{ inputs.src-tag || github.sha}} SRC_GIT_SHA: ${{ inputs.src-tag || github.sha}}
steps: steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
repository: flathub/org.cryptomator.Cryptomator repository: flathub/org.cryptomator.Cryptomator
submodules: true submodules: true
- name: Checkout build script - name: Checkout build script
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
path: build-scripts path: build-scripts
- name: Checkout app source - name: Checkout app source
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
path: cryptomator path: cryptomator
ref: ${{ env.SRC_GIT_SHA }} ref: ${{ env.SRC_GIT_SHA }}
@@ -77,7 +80,7 @@ jobs:
commit: ${{ env.SRC_GIT_SHA }} commit: ${{ env.SRC_GIT_SHA }}
- name: Copy build script for upload - name: Copy build script for upload
run: cp org.cryptomator.Cryptomator.yaml org.cryptomator.Cryptomator.${{matrix.variant.arch}}.yaml run: cp org.cryptomator.Cryptomator.yaml org.cryptomator.Cryptomator.${{matrix.variant.arch}}.yaml
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with: with:
archive: false archive: false
if-no-files-found: error if-no-files-found: error
@@ -129,7 +132,7 @@ jobs:
EOF EOF
done < maven-dependency-files-javafx.txt done < maven-dependency-files-javafx.txt
) > javafx-maven-dependencies-${{ matrix.variant.arch }}.yaml ) > javafx-maven-dependencies-${{ matrix.variant.arch }}.yaml
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with: with:
name: maven-sources-${{ matrix.variant.arch }} name: maven-sources-${{ matrix.variant.arch }}
if-no-files-found: error if-no-files-found: error
@@ -176,7 +179,7 @@ jobs:
fi fi
env: env:
SRC_TAG: ${{ inputs.src-tag }} SRC_TAG: ${{ inputs.src-tag }}
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
repository: flathub/org.cryptomator.Cryptomator repository: flathub/org.cryptomator.Cryptomator
submodules: true #TODO: Update submodule! submodules: true #TODO: Update submodule!
@@ -184,7 +187,7 @@ jobs:
- 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 }}
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
path: cryptomator path: cryptomator
- name: Download source tarball and compute checksum - name: Download source tarball and compute checksum
@@ -250,7 +253,7 @@ jobs:
env: env:
GH_TOKEN: ${{ secrets.CRYPTOBOT_PR_TOKEN }} GH_TOKEN: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
- name: Slack Notification - name: Slack Notification
uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # v2.3.3 uses: rtCamp/action-slack-notify@33ca3be66c6f378fe1610fd1d5258632dbed5e58 # v2.4.0
if: github.event_name == 'release' if: github.event_name == 'release'
env: env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }} SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }}
+8 -5
View File
@@ -23,6 +23,9 @@ on:
- 'dist/linux/common/**' - 'dist/linux/common/**'
- 'dist/linux/resources/**' - 'dist/linux/resources/**'
permissions:
contents: read
jobs: jobs:
get-version: get-version:
uses: ./.github/workflows/get-version.yml uses: ./.github/workflows/get-version.yml
@@ -44,7 +47,7 @@ jobs:
pacman-key --init pacman-key --init
pacman-key --populate archlinux pacman-key --populate archlinux
pacman -Syu --noconfirm --needed git base-devel sudo gnupg maven unzip pacman -Syu --noconfirm --needed git base-devel sudo gnupg maven unzip
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
path: cryptomator path: cryptomator
- name: Create build user - name: Create build user
@@ -69,13 +72,13 @@ jobs:
sudo -u builder sudo -u builder
env PKGDEST="$PKGDEST" SRCDEST="$SRCDEST" env PKGDEST="$PKGDEST" SRCDEST="$SRCDEST"
makepkg --syncdeps --cleanbuild --noconfirm --log makepkg --syncdeps --cleanbuild --noconfirm --log
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with: with:
name: arch-package name: arch-package
if-no-files-found: error if-no-files-found: error
path: | path: |
${{ env.PKGDEST }}/*.pkg.tar.zst ${{ env.PKGDEST }}/*.pkg.tar.zst
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with: with:
name: pkgbuild-file name: pkgbuild-file
if-no-files-found: error if-no-files-found: error
@@ -108,7 +111,7 @@ jobs:
env: env:
TAG: ${{ needs.get-version.outputs.semVerStr || github.event.release.tag_name }} TAG: ${{ needs.get-version.outputs.semVerStr || github.event.release.tag_name }}
- name: Checkout cryptomator/aur repo - name: Checkout cryptomator/aur repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with: with:
repository: 'cryptomator/aur' repository: 'cryptomator/aur'
token: ${{ secrets.CRYPTOBOT_PR_TOKEN }} token: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
@@ -188,7 +191,7 @@ jobs:
GH_TOKEN: ${{ secrets.CRYPTOBOT_PR_TOKEN }} GH_TOKEN: ${{ secrets.CRYPTOBOT_PR_TOKEN }}
- name: Slack Notification - name: Slack Notification
if: github.event_name == 'release' if: github.event_name == 'release'
uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # v2.3.3 uses: rtCamp/action-slack-notify@33ca3be66c6f378fe1610fd1d5258632dbed5e58 # v2.4.0
env: env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }} SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }}
SLACK_USERNAME: 'Cryptobot' SLACK_USERNAME: 'Cryptobot'
+14 -12
View File
@@ -56,12 +56,15 @@ on:
env: env:
JAVA_DIST: 'temurin' JAVA_DIST: 'temurin'
JAVA_VERSION: '25.0.2+10.0.LTS' JAVA_VERSION: '26.0.1+8'
VERSION_NUM: ${{ inputs.semVerNum || '99.99.99'}} VERSION_NUM: ${{ inputs.semVerNum || '99.99.99'}}
REVISION_NUM: ${{ inputs.revisionNum || '0' }} REVISION_NUM: ${{ inputs.revisionNum || '0' }}
VERSION_SUFFIX: ${{ inputs.semVerSuffix || ''}} VERSION_SUFFIX: ${{ inputs.semVerSuffix || ''}}
permissions:
contents: read
jobs: jobs:
build: build:
name: Build Cryptomator.app for ${{ matrix.output-suffix }} name: Build Cryptomator.app for ${{ matrix.output-suffix }}
@@ -76,12 +79,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/25.0.2/openjfx-25.0.2_osx-x64_bin-jmods.zip' openjfx-url: 'https://download2.gluonhq.com/openjfx/25.0.3/openjfx-25.0.3_osx-x64_bin-jmods.zip'
openjfx-sha: '0b4d8463f03901b7425d94628e4116b7078abb8dd540fbec415266fac20bda5c' openjfx-sha: '3512fabe43aee467538d329cfbbaab3c53dff2a810f0d54e381f461d5e0fac43'
steps: steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Setup Java - name: Setup Java
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
with: with:
distribution: ${{ env.JAVA_DIST }} distribution: ${{ env.JAVA_DIST }}
java-version: ${{ env.JAVA_VERSION }} java-version: ${{ env.JAVA_VERSION }}
@@ -100,7 +103,7 @@ jobs:
JMOD_VERSION=$(jmod describe openjfx-jmods/javafx.base.jmod | head -1) JMOD_VERSION=$(jmod describe openjfx-jmods/javafx.base.jmod | head -1)
JMOD_VERSION=${JMOD_VERSION#*@} JMOD_VERSION=${JMOD_VERSION#*@}
JMOD_VERSION=${JMOD_VERSION%%.*} JMOD_VERSION=${JMOD_VERSION%%.*}
POM_JFX_VERSION=$(mvn help:evaluate "-Dexpression=javafx.version" -q -DforceStdout) POM_JFX_VERSION=$(./mvnw help:evaluate "-Dexpression=javafx.version" -q -DforceStdout)
POM_JFX_VERSION=${POM_JFX_VERSION#*@} POM_JFX_VERSION=${POM_JFX_VERSION#*@}
POM_JFX_VERSION=${POM_JFX_VERSION%%.*} POM_JFX_VERSION=${POM_JFX_VERSION%%.*}
@@ -109,9 +112,9 @@ jobs:
exit 1 exit 1
fi fi
- name: Set version - name: Set version
run : mvn versions:set -DnewVersion="${VERSION_NUM}${VERSION_SUFFIX}" run : ./mvnw versions:set -DnewVersion="${VERSION_NUM}${VERSION_SUFFIX}"
- name: Run maven - name: Run maven
run: mvn -B clean package -Pmac -DskipTests run: ./mvnw -B clean package -Pmac -DskipTests
- name: Patch target dir - name: Patch target dir
run: | run: |
cp LICENSE.txt target cp LICENSE.txt target
@@ -185,14 +188,13 @@ jobs:
PROVISIONING_PROFILE_BASE64: ${{ secrets.MACOS_PROVISIONING_PROFILE_BASE64 }} PROVISIONING_PROFILE_BASE64: ${{ secrets.MACOS_PROVISIONING_PROFILE_BASE64 }}
- name: Generate license for dmg - name: Generate license for dmg
run: > run: >
mvn -B license:add-third-party ./mvnw -B license:add-third-party
-Dlicense.thirdPartyFilename=license.rtf -Dlicense.thirdPartyFilename=license.rtf
-Dlicense.outputDirectory=dist/mac/dmg/resources -Dlicense.outputDirectory=dist/mac/dmg/resources
-Dlicense.fileTemplate=dist/mac/dmg/resources/licenseTemplate.ftl -Dlicense.fileTemplate=dist/mac/dmg/resources/licenseTemplate.ftl
-Dlicense.includedScopes=compile -Dlicense.includedScopes=compile
-Dlicense.excludedGroups=^org\.cryptomator -Dlicense.excludedGroups=^org\.cryptomator
-Dlicense.failOnMissing=true -Dlicense.failOnMissing=true
-Dlicense.licenseMergesUrl=file://${{ github.workspace }}/license/merges
- name: Install codesign certificate - name: Install codesign certificate
run: | run: |
# create variables # create variables
@@ -303,7 +305,7 @@ jobs:
run: security delete-keychain $RUNNER_TEMP/codesign.keychain-db run: security delete-keychain $RUNNER_TEMP/codesign.keychain-db
continue-on-error: true continue-on-error: true
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with: with:
name: dmg-${{ matrix.output-suffix }} name: dmg-${{ matrix.output-suffix }}
path: | path: |
@@ -312,7 +314,7 @@ jobs:
if-no-files-found: error if-no-files-found: error
- name: Publish dmg on GitHub Releases - name: Publish dmg on GitHub Releases
if: inputs.upload-to-draft if: inputs.upload-to-draft
uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1 uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3.0.1
with: with:
draft: true draft: true
fail_on_unmatched_files: true fail_on_unmatched_files: true
+14 -12
View File
@@ -54,12 +54,15 @@ on:
env: env:
JAVA_DIST: 'temurin' JAVA_DIST: 'temurin'
JAVA_VERSION: '25.0.2+10.0.LTS' JAVA_VERSION: '26.0.1+8'
VERSION_NUM: ${{ inputs.semVerNum || '99.99.99'}} VERSION_NUM: ${{ inputs.semVerNum || '99.99.99'}}
REVISION_NUM: ${{ inputs.revisionNum || '0' }} REVISION_NUM: ${{ inputs.revisionNum || '0' }}
VERSION_SUFFIX: ${{ inputs.semVerSuffix || ''}} VERSION_SUFFIX: ${{ inputs.semVerSuffix || ''}}
permissions:
contents: read
jobs: jobs:
build: build:
name: Build Cryptomator.app for ${{ matrix.output-suffix }} name: Build Cryptomator.app for ${{ matrix.output-suffix }}
@@ -74,12 +77,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/25.0.2/openjfx-25.0.2_osx-aarch64_bin-jmods.zip' openjfx-url: 'https://download2.gluonhq.com/openjfx/25.0.3/openjfx-25.0.3_osx-aarch64_bin-jmods.zip'
openjfx-sha: '4cd258001c75af7047005c5c891e2400ed11d24fbb09412324c0cbaf8b503c5a' openjfx-sha: 'a52014d625b8b04e57fd71650f881c1397542b4018e1b04f1b4e66c8800a1f34'
steps: steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Setup Java - name: Setup Java
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
with: with:
distribution: ${{ env.JAVA_DIST }} distribution: ${{ env.JAVA_DIST }}
java-version: ${{ env.JAVA_VERSION }} java-version: ${{ env.JAVA_VERSION }}
@@ -98,7 +101,7 @@ jobs:
JMOD_VERSION=$(jmod describe openjfx-jmods/javafx.base.jmod | head -1) JMOD_VERSION=$(jmod describe openjfx-jmods/javafx.base.jmod | head -1)
JMOD_VERSION=${JMOD_VERSION#*@} JMOD_VERSION=${JMOD_VERSION#*@}
JMOD_VERSION=${JMOD_VERSION%%.*} JMOD_VERSION=${JMOD_VERSION%%.*}
POM_JFX_VERSION=$(mvn help:evaluate "-Dexpression=javafx.version" -q -DforceStdout) POM_JFX_VERSION=$(./mvnw help:evaluate "-Dexpression=javafx.version" -q -DforceStdout)
POM_JFX_VERSION=${POM_JFX_VERSION#*@} POM_JFX_VERSION=${POM_JFX_VERSION#*@}
POM_JFX_VERSION=${POM_JFX_VERSION%%.*} POM_JFX_VERSION=${POM_JFX_VERSION%%.*}
@@ -107,9 +110,9 @@ jobs:
exit 1 exit 1
fi fi
- name: Set version - name: Set version
run : mvn versions:set -DnewVersion="${VERSION_NUM}${VERSION_SUFFIX}" run : ./mvnw versions:set -DnewVersion="${VERSION_NUM}${VERSION_SUFFIX}"
- name: Run maven - name: Run maven
run: mvn -B clean package -Pmac -DskipTests run: ./mvnw -B clean package -Pmac -DskipTests
- name: Patch target dir - name: Patch target dir
run: | run: |
cp LICENSE.txt target cp LICENSE.txt target
@@ -184,14 +187,13 @@ jobs:
PROVISIONING_PROFILE_BASE64: ${{ secrets.MACOS_PROVISIONING_PROFILE_BASE64 }} PROVISIONING_PROFILE_BASE64: ${{ secrets.MACOS_PROVISIONING_PROFILE_BASE64 }}
- name: Generate license for dmg - name: Generate license for dmg
run: > run: >
mvn -B license:add-third-party ./mvnw -B license:add-third-party
-Dlicense.thirdPartyFilename=license.rtf -Dlicense.thirdPartyFilename=license.rtf
-Dlicense.outputDirectory=dist/mac/dmg/resources -Dlicense.outputDirectory=dist/mac/dmg/resources
-Dlicense.fileTemplate=dist/mac/dmg/resources/licenseTemplate.ftl -Dlicense.fileTemplate=dist/mac/dmg/resources/licenseTemplate.ftl
-Dlicense.includedScopes=compile -Dlicense.includedScopes=compile
-Dlicense.excludedGroups=^org\.cryptomator -Dlicense.excludedGroups=^org\.cryptomator
-Dlicense.failOnMissing=true -Dlicense.failOnMissing=true
-Dlicense.licenseMergesUrl=file://${{ github.workspace }}/license/merges
- name: Install codesign certificate - name: Install codesign certificate
run: | run: |
# create variables # create variables
@@ -302,7 +304,7 @@ jobs:
run: security delete-keychain $RUNNER_TEMP/codesign.keychain-db run: security delete-keychain $RUNNER_TEMP/codesign.keychain-db
continue-on-error: true continue-on-error: true
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with: with:
name: dmg-${{ matrix.output-suffix }} name: dmg-${{ matrix.output-suffix }}
path: | path: |
@@ -311,7 +313,7 @@ jobs:
if-no-files-found: error if-no-files-found: error
- name: Publish dmg on GitHub Releases - name: Publish dmg on GitHub Releases
if: inputs.upload-to-draft if: inputs.upload-to-draft
uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1 uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3.0.1
with: with:
draft: true draft: true
fail_on_unmatched_files: true fail_on_unmatched_files: true
+1 -1
View File
@@ -12,7 +12,7 @@ jobs:
issues: write issues: write
pull-requests: write pull-requests: write
steps: steps:
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0 - uses: actions/stale@eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899 # v10.3.0
with: with:
days-before-stale: 14 days-before-stale: 14
days-before-close: 0 days-before-close: 0
+7 -6
View File
@@ -4,12 +4,14 @@ on:
release: release:
types: [published] types: [published]
permissions: {}
jobs: jobs:
notify: notify:
runs-on: ubuntu-slim runs-on: ubuntu-latest
steps: steps:
- name: Notify about DEB build - name: Notify about DEB build
uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # v2.3.3 uses: rtCamp/action-slack-notify@33ca3be66c6f378fe1610fd1d5258632dbed5e58 # v2.4.0
env: env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }} SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }}
SLACK_USERNAME: 'Cryptobot' SLACK_USERNAME: 'Cryptobot'
@@ -21,7 +23,7 @@ jobs:
SLACK_FOOTER: '' SLACK_FOOTER: ''
MSG_MINIMAL: true MSG_MINIMAL: true
- name: Notify about latest-version update - name: Notify about latest-version update
uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # v2.3.3 uses: rtCamp/action-slack-notify@33ca3be66c6f378fe1610fd1d5258632dbed5e58 # v2.4.0
env: env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }} SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }}
SLACK_USERNAME: 'Cryptobot' SLACK_USERNAME: 'Cryptobot'
@@ -102,10 +104,10 @@ jobs:
name: Notify for winget-release name: Notify for winget-release
if: needs.get-asset-urls.outputs.is-windows-release == 'true' && needs.check-release.outputs.release-kind == 'stable' if: needs.get-asset-urls.outputs.is-windows-release == 'true' && needs.check-release.outputs.release-kind == 'stable'
needs: [check-release, get-asset-urls] needs: [check-release, get-asset-urls]
runs-on: ubuntu-slim runs-on: ubuntu-latest
steps: steps:
- name: Slack Notification - name: Slack Notification
uses: rtCamp/action-slack-notify@e31e87e03dd19038e411e38ae27cbad084a90661 # v2.3.3 uses: rtCamp/action-slack-notify@33ca3be66c6f378fe1610fd1d5258632dbed5e58 # v2.4.0
env: env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }} SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_CRYPTOMATOR_DESKTOP }}
SLACK_USERNAME: 'Cryptobot' SLACK_USERNAME: 'Cryptobot'
@@ -142,4 +144,3 @@ jobs:
token: ${{ secrets.CRYPTOBOT_WORKFLOW_DISPATCH_TOKEN }} token: ${{ secrets.CRYPTOBOT_WORKFLOW_DISPATCH_TOKEN }}
repository: cryptomator/docs repository: cryptomator/docs
client-payload: '{ "version": "${{ github.event.release.tag_name }}", "release": ${{ toJson(github.event.release.assets) }} }' client-payload: '{ "version": "${{ github.event.release.tag_name }}", "release": ${{ toJson(github.event.release.assets) }} }'
+7 -4
View File
@@ -5,22 +5,25 @@ on:
env: env:
JAVA_DIST: 'temurin' JAVA_DIST: 'temurin'
JAVA_VERSION: 25 JAVA_VERSION: 26
defaults: defaults:
run: run:
shell: bash shell: bash
permissions:
contents: read
jobs: jobs:
test: test:
name: Compile and Test name: Compile and Test
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 - uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
with: with:
distribution: ${{ env.JAVA_DIST }} distribution: ${{ env.JAVA_DIST }}
java-version: ${{ env.JAVA_VERSION }} java-version: ${{ env.JAVA_VERSION }}
cache: 'maven' cache: 'maven'
- name: Build and Test - name: Build and Test
run: xvfb-run mvn -B clean install jacoco:report -Pcoverage run: xvfb-run ./mvnw -B clean install jacoco:report -Pcoverage
+8 -20
View File
@@ -12,16 +12,19 @@ defaults:
env: env:
JAVA_DIST: 'temurin' JAVA_DIST: 'temurin'
JAVA_VERSION: 25 JAVA_VERSION: 26
permissions:
contents: read
jobs: jobs:
check-preconditions: check-preconditions:
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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Setup Java - name: Setup Java
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
with: with:
distribution: ${{ env.JAVA_DIST }} distribution: ${{ env.JAVA_DIST }}
java-version: ${{ env.JAVA_VERSION }} java-version: ${{ env.JAVA_VERSION }}
@@ -36,7 +39,7 @@ jobs:
exit 1 exit 1
fi fi
if [[ ${SEM_VER_STR} == `mvn help:evaluate -Dexpression=project.version -q -DforceStdout` ]]; then if [[ ${SEM_VER_STR} == `./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout` ]]; then
echo "semVerStr=${SEM_VER_STR}" >> $GITHUB_OUTPUT echo "semVerStr=${SEM_VER_STR}" >> $GITHUB_OUTPUT
else else
echo "Version not set in POM" echo "Version not set in POM"
@@ -48,19 +51,4 @@ jobs:
if ! grep -q "<release date=\".*\" version=\"${{ steps.validate-pom-version.outputs.semVerStr }}\">" dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml; then if ! grep -q "<release date=\".*\" version=\"${{ steps.validate-pom-version.outputs.semVerStr }}\">" dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml; then
echo "Release not set in dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml" echo "Release not set in dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml"
exit 1 exit 1
fi fi
- name: Cache NVD DB
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/.m2/repository/org/owasp/dependency-check-data/
key: dependency-check-${{ github.run_id }}
restore-keys: |
dependency-check
env:
SEGMENT_DOWNLOAD_TIMEOUT_MINS: 5
- name: Run org.owasp:dependency-check plugin
id: dependency-check
continue-on-error: true
run: mvn -B verify -Pdependency-check -DskipTests
env:
NVD_API_KEY: ${{ secrets.NVD_API_KEY }}
+1 -1
View File
@@ -12,7 +12,7 @@ jobs:
issues: write issues: write
pull-requests: write pull-requests: write
steps: steps:
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0 - uses: actions/stale@eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899 # v10.3.0
with: with:
days-before-stale: 365 days-before-stale: 365
days-before-close: 90 days-before-close: 90
+49 -28
View File
@@ -60,8 +60,8 @@ env:
VERSION_NUM: ${{ inputs.semVerNum || '99.99.99'}} VERSION_NUM: ${{ inputs.semVerNum || '99.99.99'}}
REVISION_NUM: ${{ inputs.revisionNum || '0' }} REVISION_NUM: ${{ inputs.revisionNum || '0' }}
VERSION_SUFFIX: ${{ inputs.semVerSuffix || ''}} VERSION_SUFFIX: ${{ inputs.semVerSuffix || ''}}
OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_windows-x64_bin-jmods.zip' OPENJFX_JMODS_AMD64: 'https://download2.gluonhq.com/openjfx/25.0.3/openjfx-25.0.3_windows-x64_bin-jmods.zip'
OPENJFX_JMODS_AMD64_HASH: '33d878dfac85590c4d77c518ed413e512d34a8479d90132b230a7ddd173576b3' OPENJFX_JMODS_AMD64_HASH: '0bf9b83260b85607a9ba200124debabd9cdb013cbc0d659e62a20192a7137907'
WINFSP_MSI: 'https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi' WINFSP_MSI: 'https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi'
WINFSP_MSI_HASH: '073a70e00f77423e34bed98b86e600def93393ba5822204fac57a29324db9f7a' WINFSP_MSI_HASH: '073a70e00f77423e34bed98b86e600def93393ba5822204fac57a29324db9f7a'
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'
@@ -71,6 +71,9 @@ defaults:
run: run:
shell: bash shell: bash
permissions:
contents: read
jobs: jobs:
build-msi: build-msi:
name: Build .msi Installer name: Build .msi Installer
@@ -82,13 +85,13 @@ jobs:
include: include:
- arch: x64 - arch: x64
os: windows-latest os: windows-latest
java-dist: 'zulu' #cannot use temurin, see https://github.com/cryptomator/cryptomator/issues/3824#issuecomment-2829827427 java-dist: 'temurin'
java-version: '25.0.1+8' java-version: '26.0.1+8'
java-package: 'jdk' java-package: 'jdk'
steps: steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Setup Java - name: Setup Java
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
with: with:
distribution: ${{ matrix.java-dist }} distribution: ${{ matrix.java-dist }}
java-version: ${{ matrix.java-version }} java-version: ${{ matrix.java-version }}
@@ -119,7 +122,7 @@ jobs:
JMOD_VERSION_AMD64=$(jmod describe openjfx-jmods/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=$(./mvnw help:evaluate "-Dexpression=javafx.version" -q -DforceStdout)
POM_JFX_VERSION=${POM_JFX_VERSION#*@} POM_JFX_VERSION=${POM_JFX_VERSION#*@}
POM_JFX_VERSION=${POM_JFX_VERSION%%.*} POM_JFX_VERSION=${POM_JFX_VERSION%%.*}
@@ -128,9 +131,9 @@ jobs:
exit 1 exit 1
fi fi
- name: Set version - name: Set version
run: mvn versions:set -DnewVersion="${VERSION_NUM}${VERSION_SUFFIX}" run: ./mvnw versions:set -DnewVersion="${VERSION_NUM}${VERSION_SUFFIX}"
- name: Run maven - name: Run maven
run: mvn -B clean package -Pwin -DskipTests run: ./mvnw -B clean package -Pwin -DskipTests
- name: Patch target dir - name: Patch target dir
run: | run: |
cp LICENSE.txt target cp LICENSE.txt target
@@ -220,22 +223,32 @@ jobs:
} }
$jar.Dispose() $jar.Dispose()
} }
- name: Extract wixhelper.dll for Codesigning #see https://github.com/cryptomator/cryptomator/issues/3130 - name: Get msi helper dll for code signing
shell: pwsh
run: | run: |
New-Item -Path appdir/jpackage-jmod -ItemType Directory ${JAVA_HOME}/bin/jpackage --type msi --win-upgrade-uuid bda45523-42b1-4cae-9354-a45475ed4775 --app-image appdir/Cryptomator --dest /tmp/ --name Test --vendor Test --copyright "None" --app-version "1.0" --temp msi-helper
& $env:JAVA_HOME\bin\jmod.exe extract --dir jpackage-jmod "${env:JAVA_HOME}\jmods\jdk.jpackage.jmod" find ./msi-helper/ -type f -name msica.dll -exec mv {} ./appdir \;
Get-ChildItem -Recurse -Path "jpackage-jmod" -File wixhelper.dll | Select-Object -Last 1 | Copy-Item -Destination "appdir"
- name: Sign DLLs with Azure Trusted Signing - name: Sign DLLs with Azure Trusted Signing
if: inputs.sign || github.event_name == 'schedule' if: inputs.sign || github.event_name == 'schedule'
uses: ./.github/actions/win-sign-action uses: ./.github/actions/win-sign-action
with: with:
base-dir: ${{ github.workspace }}\appdir base-dir: ${{ github.workspace }}\appdir
file-extensions: 'exe,dll'
recursive: true recursive: true
append-signature: true append-signature: true
tenant-id: ${{ secrets.AZURE_TENANT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }}
client-id: ${{ secrets.AZURE_CLIENT_ID }} client-id: ${{ secrets.AZURE_CLIENT_ID }}
client-secret: ${{ secrets.AZURE_CLIENT_SECRET }} client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
- name: Sign Scripts with Azure Trusted Signing
if: inputs.sign || github.event_name == 'schedule'
uses: ./.github/actions/win-sign-action
with:
base-dir: ${{ github.workspace }}\appdir\Cryptomator
file-extensions: 'ps1'
recursive: false
append-signature: false # Powershell scripts cannot be signed in append mode, see #4260
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
client-id: ${{ secrets.AZURE_CLIENT_ID }}
client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
- name: Replace DLLs inside jars with signed ones - name: Replace DLLs inside jars with signed ones
shell: pwsh shell: pwsh
run: | run: |
@@ -252,14 +265,23 @@ jobs:
} }
- name: Generate license for MSI - name: Generate license for MSI
run: > run: >
mvn -B license:add-third-party ./mvnw -B license:add-third-party
"-Dlicense.thirdPartyFilename=license.rtf" "-Dlicense.thirdPartyFilename=license.rtf"
"-Dlicense.outputDirectory=dist/win/resources" "-Dlicense.outputDirectory=dist/win/resources"
"-Dlicense.fileTemplate=dist/win/resources/licenseTemplate.ftl" "-Dlicense.fileTemplate=dist/win/resources/licenseTemplate.ftl"
"-Dlicense.includedScopes=compile" "-Dlicense.includedScopes=compile"
"-Dlicense.excludedGroups=^org\.cryptomator" "-Dlicense.excludedGroups=^org\.cryptomator"
"-Dlicense.failOnMissing=true" "-Dlicense.failOnMissing=true"
"-Dlicense.licenseMergesUrl=file:///${{ github.workspace }}/license/merges" shell: pwsh
- name: Create file association file from template
working-directory: dist/win
run: |
$Env:JP_WIXWIZARD_RESOURCES_PROPERTIES_FORMAT = "${Env:JP_WIXWIZARD_RESOURCES}".Replace('\', '\\');
Get-Content .\resources\FAvaultFile.template.properties `
| ForEach-Object { $ExecutionContext.InvokeCommand.ExpandString($_) } `
| Out-File -FilePath .\resources\FAvaultFile.properties
env:
JP_WIXWIZARD_RESOURCES: ${{ github.workspace }}/dist/win/resources/ # requires abs path, used in resources/main.wxs
shell: pwsh shell: pwsh
- name: Create MSI - name: Create MSI
run: > run: >
@@ -276,14 +298,14 @@ jobs:
--win-menu --win-menu
--win-dir-chooser --win-dir-chooser
--win-shortcut-prompt --win-shortcut-prompt
--win-update-url "https:\\cryptomator.org\downloads" --win-update-url "https://cryptomator.org/downloads"
--win-menu-group Cryptomator --win-menu-group Cryptomator
--resource-dir dist/win/resources --resource-dir dist/win/resources
--license-file dist/win/resources/license.rtf --license-file dist/win/resources/license.rtf
--file-associations dist/win/resources/FAvaultFile.properties --file-associations dist/win/resources/FAvaultFile.properties
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: Sign MSI with Azure Trusted Signing - name: Sign MSI with Azure Trusted Signing
if: inputs.sign || github.event_name == 'schedule' if: inputs.sign || github.event_name == 'schedule'
uses: ./.github/actions/win-sign-action uses: ./.github/actions/win-sign-action
@@ -308,7 +330,7 @@ jobs:
GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }} GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }} GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with: with:
name: msi-${{ matrix.arch }} name: msi-${{ matrix.arch }}
path: | path: |
@@ -328,11 +350,11 @@ jobs:
- arch: x64 - arch: x64
os: windows-latest os: windows-latest
executable-suffix: x64 executable-suffix: x64
java-dist: 'zulu' java-dist: 'temurin'
java-version: '24.0.1+9' java-version: '26.0.1+8'
java-package: 'jdk' java-package: 'jdk'
steps: steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Install wix and extensions - name: Install wix and extensions
run: | run: |
dotnet tool install --global wix --version ${WIX_VERSION} dotnet tool install --global wix --version ${WIX_VERSION}
@@ -348,7 +370,7 @@ jobs:
- 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
- name: Setup Java - name: Setup Java
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 uses: actions/setup-java@ad2b38190b15e4d6bdf0c97fb4fca8412226d287 # v5.3.0
with: with:
distribution: ${{ matrix.java-dist }} distribution: ${{ matrix.java-dist }}
java-version: ${{ matrix.java-version }} java-version: ${{ matrix.java-version }}
@@ -357,14 +379,13 @@ jobs:
cache: 'maven' cache: 'maven'
- name: Generate license for exe - name: Generate license for exe
run: > run: >
mvn -B license:add-third-party ./mvnw -B license:add-third-party
"-Dlicense.thirdPartyFilename=license.rtf" "-Dlicense.thirdPartyFilename=license.rtf"
"-Dlicense.fileTemplate=dist/win/bundle/resources/licenseTemplate.ftl" "-Dlicense.fileTemplate=dist/win/bundle/resources/licenseTemplate.ftl"
"-Dlicense.outputDirectory=dist/win/bundle/resources" "-Dlicense.outputDirectory=dist/win/bundle/resources"
"-Dlicense.includedScopes=compile" "-Dlicense.includedScopes=compile"
"-Dlicense.excludedGroups=^org\.cryptomator" "-Dlicense.excludedGroups=^org\.cryptomator"
"-Dlicense.failOnMissing=true" "-Dlicense.failOnMissing=true"
"-Dlicense.licenseMergesUrl=file:///${{ github.workspace }}/license/merges"
shell: pwsh shell: pwsh
- name: Download WinFsp - name: Download WinFsp
run: | run: |
@@ -441,7 +462,7 @@ jobs:
GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }} GPG_PRIVATE_KEY: ${{ secrets.RELEASES_GPG_PRIVATE_KEY }}
GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }} GPG_PASSPHRASE: ${{ secrets.RELEASES_GPG_PASSPHRASE }}
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with: with:
name: exe-${{ matrix.executable-suffix }} name: exe-${{ matrix.executable-suffix }}
path: | path: |
@@ -461,7 +482,7 @@ jobs:
merge-multiple: true merge-multiple: true
- name: Publish installers on GitHub Releases - name: Publish installers on GitHub Releases
id: publish id: publish
uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1 uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3.0.1
with: with:
draft: true draft: true
fail_on_unmatched_files: true fail_on_unmatched_files: true
+2
View File
@@ -7,6 +7,8 @@ on:
description: 'Release tag' description: 'Release tag'
required: true required: true
permissions: {}
jobs: jobs:
winget: winget:
name: Publish winget package name: Publish winget package
+4
View File
@@ -0,0 +1,4 @@
wrapperVersion=3.3.4
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.16/apache-maven-3.9.16-bin.zip
distributionSha256Sum=5af3b743dd8b876b5c45da33b676251e5f1687712644abb4ee519ca56e1d89ce
+43 -1
View File
@@ -8,10 +8,52 @@ The changelog starts with version 1.19.0.
Changes to prior versions can be found on the [Github release page](https://github.com/cryptomator/cryptomator/releases). Changes to prior versions can be found on the [Github release page](https://github.com/cryptomator/cryptomator/releases).
## [Unreleased](https://github.com/cryptomator/cryptomator/compare/1.19.2...HEAD) ## [Unreleased](https://github.com/cryptomator/cryptomator/compare/1.19.3...HEAD)
### Fixed
* Fixed "Locate encrypted file" opening the file instead of revealing it in the file manager on Linux ([#4272](https://github.com/cryptomator/cryptomator/issues/4272))
### Changed
* Improved usability of the trust on first use dialog ([#4295](https://github.com/cryptomator/cryptomator/pull/4295))
* Migrated code to common JDK 25 APIs and constructs
* Added Maven profile to run the app from the command line ([#4317](https://github.com/cryptomator/cryptomator/pull/4317))
* Updated dependencies:
- `org.cryptomator:integrations-linux` from 1.7.0 to 1.8.0-beta1
- `com.fasterxml.jackson.core:jackson-databind` from 2.21.4 to 2.21.6
- `com.fasterxml.jackson.datatype:jackson-datatype-jsr310` from 2.21.4 to 2.21.6
## [1.19.3](https://github.com/cryptomator/cryptomator/releases/1.19.3) - 2026-06-29
### Added
* New error dialog if importing a vault fails ([#4243](https://github.com/cryptomator/cryptomator/pull/4243))
### Fixed
* Fixed Cryptomator file extensions were not registered on Windows ([#4219](https://github.com/cryptomator/cryptomator/issues/4219))
* Fixed warning was displayed when accessing update tab in settings even though an update check did not ran ([#4194](https://github.com/cryptomator/cryptomator/pull/4194))
* Fixed the same vault could be added several times to the vault list ([#4243](https://github.com/cryptomator/cryptomator/pull/4243))
* Fixed several Decrypt Name dialogs could be opened on the same vault ([#4164](https://github.com/cryptomator/cryptomator/pull/4164))
* Fixed not all mount options in vault specific settings could be displayed ([#4227](https://github.com/cryptomator/cryptomator/pull/4227))
* Fixed localhost alias on Windows was not removed on uninstall ([#3993](https://github.com/cryptomator/cryptomator/issues/3993))
### Changed ### Changed
* Refactored release pipeline to allow immutable releases ([#4205](https://github.com/cryptomator/cryptomator/pull/4205)) * Refactored release pipeline to allow immutable releases ([#4205](https://github.com/cryptomator/cryptomator/pull/4205))
* Updated to JDK 26.0.1 ([#4244](https://github.com/cryptomator/cryptomator/pull/4244))
* Updated to JavaFX 25.0.3 ([#4255](https://github.com/cryptomator/cryptomator/pull/4255))
* Drop signing with Actalis issued certificate ([#4169](https://github.com/cryptomator/cryptomator/pull/4169), [#4262](https://github.com/cryptomator/cryptomator/pull/4262))
* Fix dagger binding graph issues ([#4147](https://github.com/cryptomator/cryptomator/pull/4147))
* Added flatpak build to CI ([#4199](https://github.com/cryptomator/cryptomator/pull/4199))
* Added monthly distribution builds to CI ([#4187](https://github.com/cryptomator/cryptomator/pull/4187))
* Replaced Guava cache with Caffeine
* Updated translations ([#4223](https://github.com/cryptomator/cryptomator/pull/4223))
* Updated dependencies:
- `org.cryptomator:webdav-nio-adapter` from 3.0.1 to 3.0.2
- `org.cryptomator:integrations-api` from 1.8.0 to 1.9.0
- `org.slf4j:slf4j-api` from 2.0.17 to 2.0.18
- `ch.qos.logback:logback-core` from 1.5.32 to 1.5.35
- `ch.qos.logback:logback-classic` from 1.5.32 to 1.5.35
- `com.auth0:java-jwt` from 4.5.1 4.5.2
- `com.fasterxml.jackson.core:jackson-databind` from 2.21.1 to 2.21.4
- `com.fasterxml.jackson.datatype:jackson-datatype-jsr310` from 2.21.1 to 2.21.4
- `com.github.ben-manes.caffeine:caffeine` from 3.2.3 to 3.2.4
## [1.19.2](https://github.com/cryptomator/cryptomator/releases/1.19.2) - 2026-03-20 ## [1.19.2](https://github.com/cryptomator/cryptomator/releases/1.19.2) - 2026-03-20
+17 -6
View File
@@ -26,6 +26,7 @@ Become our Gold Sponsor and showcase your brand to a targeted audience! Please c
<tr> <tr>
<td><a href="https://www.gee-whiz.de/"><img src="https://cryptomator.org/img/sponsors/geewhiz.svg" alt="gee-whiz" height="56"></a></td> <td><a href="https://www.gee-whiz.de/"><img src="https://cryptomator.org/img/sponsors/geewhiz.svg" alt="gee-whiz" height="56"></a></td>
<td><a href="https://www.route4me.com/"><img src="https://cryptomator.org/img/sponsors/route4me.svg" alt="Route4Me" height="56"></a></td> <td><a href="https://www.route4me.com/"><img src="https://cryptomator.org/img/sponsors/route4me.svg" alt="Route4Me" height="56"></a></td>
<td><a href="https://www.apivoid.com/"><img src="https://cryptomator.org/img/sponsors/apivoid.svg" alt="ApiVoid" height="56"></a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@@ -78,20 +79,30 @@ For more information on the security details visit [cryptomator.org](https://doc
### Dependencies ### Dependencies
* JDK 25 (e.g. temurin, zulu) * JDK 26 (e.g. temurin, zulu)
* Maven 3
### Run Maven ### Run Maven
``` ```
mvn clean install ./mvnw clean install
# or mvn clean install -Pwin
# or mvn clean install -Pmac
# or mvn clean install -Plinux
``` ```
This will build all the jars and bundle them together with their OS-specific dependencies under `target`. This can now be used to build native packages. This will build all the jars and bundle them together with their OS-specific dependencies under `target`. This can now be used to build native packages.
### Running the app
```
./mvnw -Prun compile exec:exec
```
This starts the app with the defaults defined in `pom.xml`. The OS-specific parameters are picked automatically.
Add the `dev` profile to use the `Cryptomator-Dev` settings, log and mount directories instead, so a development run does not interfere with an installed Cryptomator:
```
./mvnw -Prun,dev compile exec:exec
```
## License ## License
This project is dual-licensed under the GPLv3 for FOSS projects as well as a commercial license for independent software vendors and resellers. If you want to modify this application under different conditions, feel free to contact our support team. This project is dual-licensed under the GPLv3 for FOSS projects as well as a commercial license for independent software vendors and resellers. If you want to modify this application under different conditions, feel free to contact our support team.
+1 -1
View File
@@ -1,7 +1,7 @@
# This is the Cryptomator administrative configuration file. # This is the Cryptomator administrative configuration file.
# It is a simple key-value pair file. # It is a simple key-value pair file.
# Lines starting with '#' are comments and will be ignored. # Lines starting with '#' are comments and will be ignored.
# For more info, read the docs at https://docs.cryptomator.org/desktop/advanced-settings/ # For more info, read the docs at https://docs.cryptomator.org/desktop/admin-config/
# #
# Example: # Example:
# Sets the plugin directory and enables plugin loading # Sets the plugin directory and enables plugin loading
+8 -8
View File
@@ -6,29 +6,29 @@ REVISION_NO=`git rev-list --count HEAD`
# check preconditions # check preconditions
if [ -z "${JAVA_HOME}" ]; then echo "JAVA_HOME not set. Run using JAVA_HOME=/path/to/jdk ./build.sh"; exit 1; fi if [ -z "${JAVA_HOME}" ]; then echo "JAVA_HOME not set. Run using JAVA_HOME=/path/to/jdk ./build.sh"; exit 1; fi
command -v mvn >/dev/null 2>&1 || { echo >&2 "mvn not found."; exit 1; } [ -x ../../../mvnw ] || { echo >&2 "mvnw not found at ../../../mvnw."; exit 1; }
command -v curl >/dev/null 2>&1 || { echo >&2 "curl not found."; exit 1; } command -v curl >/dev/null 2>&1 || { echo >&2 "curl not found."; exit 1; }
command -v unzip >/dev/null 2>&1 || { echo >&2 "unzip not found."; exit 1; } 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=$(../../../mvnw -f ../../../pom.xml help:evaluate -Dexpression=project.version -q -DforceStdout)
SEMVER_STR=${VERSION} SEMVER_STR=${VERSION}
CPU_ARCH=$(uname -m) 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
mvn -f ../../../pom.xml versions:set -DnewVersion=${SEMVER_STR} ../../../mvnw -f ../../../pom.xml versions:set -DnewVersion=${SEMVER_STR}
# compile # compile
mvn -B -f ../../../pom.xml clean package -Plinux -DskipTests ../../../mvnw -B -f ../../../pom.xml clean package -DskipTests
cp ../../../LICENSE.txt ../../../target cp ../../../LICENSE.txt ../../../target
cp ../../../target/cryptomator-*.jar ../../../target/mods cp ../../../target/cryptomator-*.jar ../../../target/mods
JAVAFX_VERSION=25.0.2 JAVAFX_VERSION=25.0.3
JAVAFX_ARCH="x64" JAVAFX_ARCH="x64"
JAVAFX_JMODS_SHA256='e0a9c29d8cf3af9b8b48848b43f87b5785bc107c53a951b19668ce05842bba1b' JAVAFX_JMODS_SHA256='47035c653863a8e4be3dc6f142b8dbd84b4bb1efc9a8cbc68413e6a5ff5e9f50'
if [ "${CPU_ARCH}" = "aarch64" ]; then if [ "${CPU_ARCH}" = "aarch64" ]; then
JAVAFX_ARCH="aarch64" JAVAFX_ARCH="aarch64"
JAVAFX_JMODS_SHA256='c3408f818693cce09e59829a8e862a82c7695fdfcd585c41cfd527f5fc3fe646' JAVAFX_JMODS_SHA256='e3fd682354346845d2944a2da2b1ff2b6cb9259d92027f2f9c121b9b93c5e42f'
fi fi
# download javaFX jmods # download javaFX jmods
@@ -42,7 +42,7 @@ unzip -o -j openjfx-jmods.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/jav
JMOD_VERSION=$(jmod describe ./openjfx-jmods/javafx.base.jmod | head -1) JMOD_VERSION=$(jmod describe ./openjfx-jmods/javafx.base.jmod | head -1)
JMOD_VERSION=${JMOD_VERSION#*@} JMOD_VERSION=${JMOD_VERSION#*@}
JMOD_VERSION=${JMOD_VERSION%%.*} JMOD_VERSION=${JMOD_VERSION%%.*}
POM_JFX_VERSION=$(mvn help:evaluate "-Dexpression=javafx.version" -q -DforceStdout -B -f ../../../pom.xml) POM_JFX_VERSION=$(../../../mvnw help:evaluate "-Dexpression=javafx.version" -q -DforceStdout -B -f ../../../pom.xml)
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 ]; then if [ $POM_JFX_VERSION -ne $JMOD_VERSION ]; then
@@ -84,6 +84,9 @@
</content_rating> </content_rating>
<releases> <releases>
<release date="2026-06-29" version="1.19.3">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.19.3</url>
</release>
<release date="2026-03-20" version="1.19.2"> <release date="2026-03-20" version="1.19.2">
<url type="details">https://github.com/cryptomator/cryptomator/releases/1.19.2</url> <url type="details">https://github.com/cryptomator/cryptomator/releases/1.19.2</url>
</release> </release>
+1 -1
View File
@@ -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), openjdk-25-jdk (>= 25+36), libgtk-3-0 (>= 3.20.0), libxxf86vm1, libgl1 Build-Depends: debhelper (>=10), coffeelibs-jdk-26 (>= 26.0.1+8-0ppa1), libgtk-3-0 (>= 3.20.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
+1 -2
View File
@@ -4,12 +4,11 @@
# 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-26-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)
JAVA_HOME = /usr/lib/jvm/java-25-openjdk-amd64
JMODS_PATH = jmods/amd64:${JAVA_HOME}/jmods JMODS_PATH = jmods/amd64:${JAVA_HOME}/jmods
else ifeq ($(DEB_BUILD_ARCH),arm64) else ifeq ($(DEB_BUILD_ARCH),arm64)
JAVA_HOME = /usr/lib/jvm/java-25-openjdk-arm64
JMODS_PATH = jmods/aarch64:${JAVA_HOME}/jmods JMODS_PATH = jmods/aarch64:${JAVA_HOME}/jmods
endif endif
+13 -9
View File
@@ -1,11 +1,15 @@
#!/bin/sh #!/bin/sh
# based on https://gitlab.gnome.org/GNOME/gnome-builder/-/blob/main/build-aux/flatpak/fusermount-wrapper.sh # From: https://gitlab.gnome.org/GNOME/gnome-builder/-/blob/main/build-aux/flatpak/fusermount-wrapper.sh
#
# Sandbox escape hatch to call fusermount3 on the host system if [ -z "$_FUSE_COMMFD" ]; then
# FD_ARGS=
# * fusermount3 is required for mount and unmount else
# * FUSE3 requires for mounting a socket for communication, its file descriptor id is given in the _FUSE_COMMFD variable FD_ARGS="--env=_FUSE_COMMFD=${_FUSE_COMMFD} --forward-fd=${_FUSE_COMMFD}"
# * Forwarding fd 1 and fd 2 ensures to catch process output of the fuse process fi
# * watch-bus ensures when the flatpak exits, also this process is killed
exec flatpak-spawn --host --watch-bus --forward-fd=1 --forward-fd=2 --env=_FUSE_COMMFD=${_FUSE_COMMFD} --forward-fd=${_FUSE_COMMFD} fusermount3 "$@" if [ -e /proc/self/fd/3 ] && [ 3 != "$_FUSE_COMMFD" ]; then
FD_ARGS="$FD_ARGS --forward-fd=3"
fi
exec flatpak-spawn --host --forward-fd=1 --forward-fd=2 $FD_ARGS fusermount3 "$@"
@@ -94,7 +94,7 @@ modules:
- mkdir maven - mkdir maven
- tar xf maven.tar.gz --strip-components=1 --exclude=jansi-native --directory=maven - tar xf maven.tar.gz --strip-components=1 --exclude=jansi-native --directory=maven
# Build project # Build project
- maven/bin/mvn clean package -DskipTests -P"linux-$(uname -m)" - maven/bin/mvn clean package -DskipTests
- cp target/cryptomator-*.jar target/mods - cp target/cryptomator-*.jar target/mods
- cd target - cd target
- $JAVA_HOME/bin/jlink - $JAVA_HOME/bin/jlink
@@ -150,26 +150,26 @@ modules:
dest-filename: jdk.tar.gz dest-filename: jdk.tar.gz
only-arches: only-arches:
- x86_64 - x86_64
url: https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.2%2B10/OpenJDK25U-jdk_x64_linux_hotspot_25.0.2_10.tar.gz url: https://github.com/adoptium/temurin26-binaries/releases/download/jdk-26.0.1%2B8/OpenJDK26U-jdk_x64_linux_hotspot_26.0.1_8.tar.gz
sha512: 29043fde119a031c2ca8d57aed445fedd9e7f74608fcdc7a809076ba84cfd1c31f08de2ecccf352e159fdcd1cae172395ed46363007552ff242057826c81ab3a sha512: eb46cda97ffd46e2e0c1f6f977dc204d9cc969b958946287b7e7d0bfe859fd92faccb2f6ef79995421a963c6de140c436af559403e0a2cd27c90b06c20260d5c
- type: file - type: file
dest-filename: jdk.tar.gz dest-filename: jdk.tar.gz
only-arches: only-arches:
- aarch64 - aarch64
url: https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25.0.2%2B10/OpenJDK25U-jdk_aarch64_linux_hotspot_25.0.2_10.tar.gz url: https://github.com/adoptium/temurin26-binaries/releases/download/jdk-26.0.1%2B8/OpenJDK26U-jdk_aarch64_linux_hotspot_26.0.1_8.tar.gz
sha512: f1d3ccec3e1f1bed9d632f14b9223709d6e5c2e0d922125d068870dd3016492a2ca8f08924d4a9d0dc5eb2159fa09efee366a748fd0093475baf29e5c70c781a sha512: 3c31671552712a8f0df96df2eeae7e9ad5156c0e98ebd5bf4fa04c14bba58bd5e19ff567ddcdc7aa478f6f4b0a852762a09bd88d3132acb121e667cfe0397034
- type: file - type: file
dest-filename: openjfx.zip dest-filename: openjfx.zip
only-arches: only-arches:
- x86_64 - x86_64
url: https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_linux-x64_bin-jmods.zip url: https://download2.gluonhq.com/openjfx/25.0.3/openjfx-25.0.3_linux-x64_bin-jmods.zip
sha512: 21f550217101c513f9eb1d7947eba30cb79618238e6539ce770e54e84b01574cdaeba40af602391145f163dd8e43e3794395467413152f13ffffeff948b0ca1b sha512: 75605440f13d0337e70ada1220f77d0d9780fb4602e676f1f07674d8b2e296b25080549d07edcca8f66733e15388860e3472d4ff6d51fd72b0452ed8bbe78022
- type: file - type: file
dest-filename: openjfx.zip dest-filename: openjfx.zip
only-arches: only-arches:
- aarch64 - aarch64
url: https://download2.gluonhq.com/openjfx/25.0.2/openjfx-25.0.2_linux-aarch64_bin-jmods.zip url: https://download2.gluonhq.com/openjfx/25.0.3/openjfx-25.0.3_linux-aarch64_bin-jmods.zip
sha512: a9268409b3803e386490bf1319d0f0a14173cebe862c12254cd51b430ee0a297437d9e38d5ebeae0da8899be898b312b103330d09dcfd3e63c1e7d15f2f14311 sha512: 30c509b880ced1b29e0fafa41073d2350a16296d9439124b9a0e3bb391bf7f27e34d5abcfb338df11e5e898175699bceac40574bc9ad123ff071a5964f8fb14d
- type: file - type: file
dest-filename: maven.tar.gz dest-filename: maven.tar.gz
url: https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.9.13/apache-maven-3.9.13-bin.tar.gz url: https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.9.13/apache-maven-3.9.13-bin.tar.gz
+7 -7
View File
@@ -14,8 +14,8 @@ license=('GPL3')
depends=('fuse3' 'alsa-lib' 'hicolor-icon-theme' 'libxtst' 'libnet' 'libxrender') depends=('fuse3' 'alsa-lib' 'hicolor-icon-theme' 'libxtst' 'libnet' 'libxrender')
makedepends=('maven' 'unzip') makedepends=('maven' 'unzip')
optdepends=('keepassxc-cryptomator: Use KeePassXC to store vault passwords' 'ttf-hanazono: Install this font when using Japanese system language') optdepends=('keepassxc-cryptomator: Use KeePassXC to store vault passwords' 'ttf-hanazono: Install this font when using Japanese system language')
_jdkver=25.0.2+10 _jdkver=26.0.1+8
_jfxver=25.0.2 _jfxver=25.0.3
_src_app_dir=cryptomator-${pkgver//_/-} _src_app_dir=cryptomator-${pkgver//_/-}
source=($SOURCES); source=($SOURCES);
source_x86_64=("jdk-${_jdkver}.tar.gz::https://github.com/adoptium/temurin${_jdkver:0:2}-binaries/releases/download/jdk-${_jdkver//\+/%2B}/OpenJDK${_jdkver:0:2}U-jdk_x64_linux_hotspot_${_jdkver//\+/_}.tar.gz" source_x86_64=("jdk-${_jdkver}.tar.gz::https://github.com/adoptium/temurin${_jdkver:0:2}-binaries/releases/download/jdk-${_jdkver//\+/%2B}/OpenJDK${_jdkver:0:2}U-jdk_x64_linux_hotspot_${_jdkver//\+/_}.tar.gz"
@@ -24,10 +24,10 @@ source_aarch64=("jdk-${_jdkver}.tar.gz::https://github.com/adoptium/temurin${_jd
"openjfx-${_jfxver}.zip::https://download2.gluonhq.com/openjfx/${_jfxver}/openjfx-${_jfxver}_linux-aarch64_bin-jmods.zip") "openjfx-${_jfxver}.zip::https://download2.gluonhq.com/openjfx/${_jfxver}/openjfx-${_jfxver}_linux-aarch64_bin-jmods.zip")
noextract=("jdk-${_jdkver}.tar.gz" "openjfx-${_jfxver}.zip") noextract=("jdk-${_jdkver}.tar.gz" "openjfx-${_jfxver}.zip")
sha256sums=($SOURCES_SHA) sha256sums=($SOURCES_SHA)
sha256sums_x86_64=('987387933b64b9833846dee373b640440d3e1fd48a04804ec01a6dbf718e8ab8' sha256sums_x86_64=('8e512f13e575a43655fc92319436c94890c137b9035cc6bd6f9cf24239704d3a'
'e0a9c29d8cf3af9b8b48848b43f87b5785bc107c53a951b19668ce05842bba1b') '47035c653863a8e4be3dc6f142b8dbd84b4bb1efc9a8cbc68413e6a5ff5e9f50')
sha256sums_aarch64=('a9d73e711d967dc44896d4f430f73a68fd33590dabc29a7f2fb9f593425b854c' sha256sums_aarch64=('613f9b2861dea937b24d5eca745ef8567733b377d0bb612195acaad0e3f61360'
'c3408f818693cce09e59829a8e862a82c7695fdfcd585c41cfd527f5fc3fe646') 'e3fd682354346845d2944a2da2b1ff2b6cb9259d92027f2f9c121b9b93c5e42f')
options=('!strip') options=('!strip')
validpgpkeys=('58117AFA1F85B3EEC154677D615D449FE6E6A235') validpgpkeys=('58117AFA1F85B3EEC154677D615D449FE6E6A235')
@@ -47,7 +47,7 @@ build() {
cd "${srcdir}/${_src_app_dir}" cd "${srcdir}/${_src_app_dir}"
mvn -B clean package -DskipTests -Plinux mvn -B clean package -DskipTests
cp LICENSE.txt target cp LICENSE.txt target
cp target/cryptomator-*.jar target/mods cp target/cryptomator-*.jar target/mods
+9 -10
View File
@@ -29,24 +29,24 @@ PACKAGE_IDENTIFIER="org.cryptomator"
MAIN_JAR_GLOB="cryptomator-*.jar" MAIN_JAR_GLOB="cryptomator-*.jar"
MODULE_AND_MAIN_CLASS="org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator" MODULE_AND_MAIN_CLASS="org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator"
REVISION_NO=`git rev-list --count HEAD` 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=`../../../mvnw -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=25.0.2 JAVAFX_VERSION=25.0.3
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="4cd258001c75af7047005c5c891e2400ed11d24fbb09412324c0cbaf8b503c5a" JAVAFX_JMODS_SHA256="a52014d625b8b04e57fd71650f881c1397542b4018e1b04f1b4e66c8800a1f34"
else else
JAVAFX_ARCH="x64" JAVAFX_ARCH="x64"
JAVAFX_JMODS_SHA256="0b4d8463f03901b7425d94628e4116b7078abb8dd540fbec415266fac20bda5c" JAVAFX_JMODS_SHA256="3512fabe43aee467538d329cfbbaab3c53dff2a810f0d54e381f461d5e0fac43"
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"
# check preconditions # check preconditions
if [ -z "${JAVA_HOME}" ]; then echo "JAVA_HOME not set. Run using JAVA_HOME=/path/to/jdk ./build.sh"; exit 1; fi if [ -z "${JAVA_HOME}" ]; then echo "JAVA_HOME not set. Run using JAVA_HOME=/path/to/jdk ./build.sh"; exit 1; fi
command -v mvn >/dev/null 2>&1 || { echo >&2 "mvn not found. Fix by 'brew install maven'."; exit 1; } [ -x ../../../mvnw ] || { echo >&2 "mvnw not found at ../../../mvnw."; exit 1; }
command -v create-dmg >/dev/null 2>&1 || { echo >&2 "create-dmg not found. Fix by 'brew install create-dmg'."; exit 1; } command -v create-dmg >/dev/null 2>&1 || { echo >&2 "create-dmg not found. Fix by 'brew install create-dmg'."; exit 1; }
if [ -n "${CODESIGN_IDENTITY}" ]; then if [ -n "${CODESIGN_IDENTITY}" ]; then
command -v codesign >/dev/null 2>&1 || { echo >&2 "codesign not found. Fix by 'xcode-select --install'."; exit 1; } command -v codesign >/dev/null 2>&1 || { echo >&2 "codesign not found. Fix by 'xcode-select --install'."; exit 1; }
@@ -61,7 +61,7 @@ unzip -jo openjfx-jmods.zip \*/javafx.base.jmod \*/javafx.controls.jmod \*/javaf
JMOD_VERSION=$(jmod describe openjfx-jmods/javafx.base.jmod | head -1) JMOD_VERSION=$(jmod describe openjfx-jmods/javafx.base.jmod | head -1)
JMOD_VERSION=${JMOD_VERSION#*@} JMOD_VERSION=${JMOD_VERSION#*@}
JMOD_VERSION=${JMOD_VERSION%%.*} JMOD_VERSION=${JMOD_VERSION%%.*}
POM_JFX_VERSION=$(mvn -f../../../pom.xml help:evaluate "-Dexpression=javafx.version" -q -DforceStdout) POM_JFX_VERSION=$(../../../mvnw -f../../../pom.xml help:evaluate "-Dexpression=javafx.version" -q -DforceStdout)
POM_JFX_VERSION=${POM_JFX_VERSION#*@} POM_JFX_VERSION=${POM_JFX_VERSION#*@}
POM_JFX_VERSION=${POM_JFX_VERSION%%.*} POM_JFX_VERSION=${POM_JFX_VERSION%%.*}
@@ -71,7 +71,7 @@ if [ "${POM_JFX_VERSION}" -ne "${JMOD_VERSION}" ]; then
fi fi
# compile # compile
mvn -B -f../../../pom.xml clean package -DskipTests -Pmac ../../../mvnw -B -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
@@ -137,14 +137,13 @@ sed -i '' "s|###BUNDLE_VERSION###|${REVISION_NO}|g" ${APP_NAME}.app/Contents/Inf
cp ../embedded.provisionprofile ${APP_NAME}.app/Contents/ cp ../embedded.provisionprofile ${APP_NAME}.app/Contents/
# generate license # generate license
mvn -B -f../../../pom.xml license:add-third-party \ ../../../mvnw -B -f../../../pom.xml license:add-third-party \
-Dlicense.thirdPartyFilename=license.rtf \ -Dlicense.thirdPartyFilename=license.rtf \
-Dlicense.outputDirectory=dist/mac/dmg/resources \ -Dlicense.outputDirectory=dist/mac/dmg/resources \
-Dlicense.fileTemplate=resources/licenseTemplate.ftl \ -Dlicense.fileTemplate=resources/licenseTemplate.ftl \
-Dlicense.includedScopes=compile \ -Dlicense.includedScopes=compile \
-Dlicense.excludedGroups=^org\.cryptomator \ -Dlicense.excludedGroups=^org\.cryptomator \
-Dlicense.failOnMissing=true \ -Dlicense.failOnMissing=true
-Dlicense.licenseMergesUrl=file://$(pwd)/../../../license/merges
# codesign # codesign
if [ -n "${CODESIGN_IDENTITY}" ] && [ -n "${TEAM_IDENTIFIER}" ]; then if [ -n "${CODESIGN_IDENTITY}" ] && [ -n "${TEAM_IDENTIFIER}" ]; then
+89 -72
View File
@@ -16,6 +16,19 @@ Param(
# Function Definitions Section # Function Definitions Section
# ============================ # ============================
function Invoke-CommandWithExitCheck {
param (
[string]$Command,
[string[]]$Arguments
)
& $Command @Arguments
if ($LASTEXITCODE -ne 0) {
Write-Error "Command '$Command' failed with exit code $LASTEXITCODE"
exit $LASTEXITCODE
}
}
function Main { function Main {
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
@@ -27,11 +40,6 @@ if ((Get-Command "git" -ErrorAction SilentlyContinue) -eq $null)
Write-Error "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)
{
Write-Error "Unable to find mvn.cmd in your PATH (try: choco install maven)"
exit 1
}
if ((Get-Command 'wix' -ErrorAction SilentlyContinue) -eq $null) 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.2)' Write-Error 'Unable to find wix in your PATH (try: dotnet tool install --global wix --version 6.0.2)'
@@ -52,7 +60,7 @@ if ($wixExtensions -notmatch 'WixToolset.BootstrapperApplications.wixext') {
} }
$buildDir = Split-Path -Parent $PSCommandPath $buildDir = Split-Path -Parent $PSCommandPath
$version = $(mvn -f $buildDir/../../pom.xml help:evaluate -Dexpression="project.version" -q -DforceStdout) $version = $(../../mvnw.cmd -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)
@@ -65,7 +73,8 @@ Write-Host "`$Env:JAVA_HOME=$Env:JAVA_HOME"
$copyright = "(C) $CopyrightStartYear - $((Get-Date).Year) $Vendor" $copyright = "(C) $CopyrightStartYear - $((Get-Date).Year) $Vendor"
# compile # compile
&mvn -B -f $buildDir/../../pom.xml clean package -DskipTests -Pwin Invoke-CommandWithExitCheck -Command `
"../../mvnw.cmd" -Arguments @("-B", "-f", "$buildDir/../../pom.xml", "clean", "package", "-DskipTests", "-Pwin")
Copy-Item "$buildDir\..\..\target\$MainJarGlob.jar" -Destination "$buildDir\..\..\target\mods" Copy-Item "$buildDir\..\..\target\$MainJarGlob.jar" -Destination "$buildDir\..\..\target\mods"
# add runtime # add runtime
@@ -93,9 +102,9 @@ switch ($archName) {
$jmodPaths = "$Env:JAVA_HOME/jmods" $jmodPaths = "$Env:JAVA_HOME/jmods"
} }
'x64' { 'x64' {
$javaFxVersion='25.0.2' $javaFxVersion='25.0.3'
$javaFxJmodsUrl = "https://download2.gluonhq.com/openjfx/${javaFxVersion}/openjfx-${javaFxVersion}_windows-x64_bin-jmods.zip" $javaFxJmodsUrl = "https://download2.gluonhq.com/openjfx/${javaFxVersion}/openjfx-${javaFxVersion}_windows-x64_bin-jmods.zip"
$javaFxJmodsSHA256 = '33d878dfac85590c4d77c518ed413e512d34a8479d90132b230a7ddd173576b3' $javaFxJmodsSHA256 = '0bf9b83260b85607a9ba200124debabd9cdb013cbc0d659e62a20192a7137907'
$javaFxJmods = '.\resources\jfxJmods.zip' $javaFxJmods = '.\resources\jfxJmods.zip'
if( !(Test-Path -Path $javaFxJmods) ) { if( !(Test-Path -Path $javaFxJmods) ) {
@@ -129,16 +138,18 @@ if ((& "$Env:JAVA_HOME\bin\jlink" --help | Select-String -Pattern "Linking from
} }
### create runtime ### create runtime
& "$Env:JAVA_HOME\bin\jlink" ` Invoke-CommandWithExitCheck -Command `
--verbose ` "$Env:JAVA_HOME\bin\jlink" -Arguments @(
--output runtime ` "--verbose",
--module-path $jmodPaths ` "--output", "runtime",
--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.cryptoki,jdk.crypto.ec,jdk.crypto.mscapi,java.compiler,javafx.base,javafx.graphics,javafx.controls,javafx.fxml ` "--module-path", $jmodPaths,
--strip-native-commands ` "--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.cryptoki,jdk.crypto.ec,jdk.crypto.mscapi,java.compiler,javafx.base,javafx.graphics,javafx.controls,javafx.fxml",
--no-header-files ` "--strip-native-commands",
--no-man-pages ` "--no-header-files",
--strip-debug ` "--no-man-pages",
--compress "zip-0" #do not compress and use msi compression "--strip-debug",
"--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)) {
@@ -195,14 +206,14 @@ if ($LASTEXITCODE -ne 0) {
} }
#Create RTF license for msi #Create RTF license for msi
&mvn -B -f $buildDir/../../pom.xml license:add-third-party ` Invoke-CommandWithExitCheck -Command `
"-Dlicense.thirdPartyFilename=license.rtf" ` "../../mvnw.cmd" -Arguments @("-B", "-f", "$buildDir/../../pom.xml", "license:add-third-party", `
"-Dlicense.fileTemplate=$buildDir\resources\licenseTemplate.ftl" ` "-Dlicense.thirdPartyFilename=license.rtf", `
"-Dlicense.outputDirectory=$buildDir\resources\" ` "-Dlicense.fileTemplate=$buildDir\resources\licenseTemplate.ftl", `
"-Dlicense.includedScopes=compile" ` "-Dlicense.outputDirectory=$buildDir\resources\", `
"-Dlicense.excludedGroups=^org\.cryptomator" ` "-Dlicense.includedScopes=compile", `
"-Dlicense.failOnMissing=true" ` "-Dlicense.excludedGroups=^org\.cryptomator", `
"-Dlicense.licenseMergesUrl=file:///$buildDir/../../license/merges" "-Dlicense.failOnMissing=true")
# patch app dir # patch app dir
Copy-Item "contrib\*" -Destination "$AppName" Copy-Item "contrib\*" -Destination "$AppName"
@@ -210,42 +221,45 @@ attrib -r "$AppName\$AppName.exe"
attrib -r "$AppName\${AppName} (Debug).exe" attrib -r "$AppName\${AppName} (Debug).exe"
# create .msi # create .msi
$Env:JP_WIXWIZARD_RESOURCES = "$buildDir\resources" $Env:JP_WIXWIZARD_RESOURCES = "$buildDir\resources\"
$Env:JP_WIXHELPER_DIR = "." $Env:JP_WIXWIZARD_RESOURCES_PROPERTIES_FORMAT = "${Env:JP_WIXWIZARD_RESOURCES}".Replace('\', '\\');
& "$Env:JAVA_HOME\bin\jpackage" ` $Env:JP_WIXHELPER_DIR = ""
--verbose `
--type msi `
--win-upgrade-uuid $UpgradeUUID `
--app-image $AppName `
--dest installer `
--name $AppName `
--vendor $Vendor `
--copyright $copyright `
--app-version "$semVerNo.$revisionNo" `
--win-menu `
--win-dir-chooser `
--win-shortcut-prompt `
--win-menu-group $AppName `
--resource-dir resources `
--license-file resources/license.rtf `
--win-update-url $UpdateUrl `
--about-url $AboutUrl `
--file-associations resources/FAvaultFile.properties
if ($LASTEXITCODE -ne 0) { Get-Content .\resources\FAvaultFile.template.properties ` # Similar to envsubst
Write-Error "jpackage MSI failed with exit code $LASTEXITCODE" | ForEach-Object { $ExecutionContext.InvokeCommand.ExpandString($_) } `
return 1; | Out-File -FilePath .\resources\FAvaultFile.properties
}
Invoke-CommandWithExitCheck -Command `
"$Env:JAVA_HOME\bin\jpackage" -Arguments @(
"--verbose",
"--type", "msi",
"--win-upgrade-uuid", $UpgradeUUID,
"--app-image", $AppName,
"--dest", "installer",
"--name", $AppName,
"--vendor", $Vendor,
"--copyright", $copyright,
"--app-version", "$semVerNo.$revisionNo",
"--win-menu",
"--win-dir-chooser",
"--win-shortcut-prompt",
"--win-menu-group", $AppName,
"--resource-dir", "resources",
"--license-file", "resources/license.rtf",
"--win-update-url", $UpdateUrl,
"--about-url", $AboutUrl,
"--file-associations", "resources/FAvaultFile.properties"
)
#Create RTF license for bundle #Create RTF license for bundle
&mvn -B -f $buildDir/../../pom.xml license:add-third-party ` Invoke-CommandWithExitCheck -Command `
"-Dlicense.thirdPartyFilename=license.rtf" ` "../../mvnw.cmd" -Arguments @("-B", "-f", "$buildDir/../../pom.xml", "license:add-third-party", `
"-Dlicense.fileTemplate=$buildDir\bundle\resources\licenseTemplate.ftl" ` "-Dlicense.thirdPartyFilename=license.rtf", `
"-Dlicense.outputDirectory=$buildDir\bundle\resources\" ` "-Dlicense.fileTemplate=$buildDir\bundle\resources\licenseTemplate.ftl", `
"-Dlicense.includedScopes=compile" ` "-Dlicense.outputDirectory=$buildDir\bundle\resources\", `
"-Dlicense.excludedGroups=^org\.cryptomator" ` "-Dlicense.includedScopes=compile", `
"-Dlicense.failOnMissing=true" ` "-Dlicense.excludedGroups=^org\.cryptomator", `
"-Dlicense.licenseMergesUrl=file:///$buildDir/../../license/merges" "-Dlicense.failOnMissing=true")
# download Winfsp # download Winfsp
$winfspMsiUrl= 'https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi' $winfspMsiUrl= 'https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi'
@@ -271,18 +285,21 @@ Invoke-WebRequest $winfspUninstaller -OutFile ".\bundle\resources\winfsp-uninsta
Copy-Item ".\installer\$AppName-*.msi" -Destination ".\bundle\resources\$AppName.msi" -Force Copy-Item ".\installer\$AppName-*.msi" -Destination ".\bundle\resources\$AppName.msi" -Force
# create bundle including winfsp # create bundle including winfsp
& wix build ` Invoke-CommandWithExitCheck -Command `
-define BundleName="$AppName" ` "wix" -Arguments @(
-define BundleVersion="$semVerNo.$revisionNo" ` "build",
-define BundleVendor="$Vendor" ` "-define", "BundleName=$AppName",
-define BundleCopyright="$copyright" ` "-define", "BundleVersion=$semVerNo.$revisionNo",
-define AboutUrl="$AboutUrl" ` "-define", "BundleVendor=$Vendor",
-define HelpUrl="$HelpUrl" ` "-define", "BundleCopyright=$copyright",
-define UpdateUrl="$UpdateUrl" ` "-define", "AboutUrl=$AboutUrl",
-ext "WixToolset.Util.wixext" ` "-define", "HelpUrl=$HelpUrl",
-ext "WixToolset.BootstrapperApplications.wixext" ` "-define", "UpdateUrl=$UpdateUrl",
.\bundle\bundleWithWinfsp.wxs ` "-ext", "WixToolset.Util.wixext",
-out "installer\$AppName-Installer.exe" "-ext", "WixToolset.BootstrapperApplications.wixext",
".\bundle\bundleWithWinfsp.wxs",
"-out", ".\installer\$AppName-Installer.exe"
)
Write-Host "Created EXE installer .\installer\$AppName-Installer.exe" Write-Host "Created EXE installer .\installer\$AppName-Installer.exe"
return 0; return 0;
+1 -1
View File
@@ -1,4 +1,4 @@
mime-type=application/vnd.cryptomator.vault mime-type=application/vnd.cryptomator.vault
extension=cryptomator extension=cryptomator
description=Cryptomator Vault File description=Cryptomator Vault File
icon=resources/Cryptomator-Vault.ico icon=C:\\Users\\Arbeit\\Skymatic\\cryptomator-jdk26-jpackage\\dist\\win\\resources\\Cryptomator-Vault.ico
+4
View File
@@ -0,0 +1,4 @@
mime-type=application/vnd.cryptomator.vault
extension=cryptomator
description=Cryptomator Vault File
icon=${env:JP_WIXWIZARD_RESOURCES_PROPERTIES_FORMAT}Cryptomator-Vault.ico
+3 -3
View File
@@ -68,7 +68,7 @@
<?endif?> <?endif?>
<!-- TODO: how does this work again? --> <!-- TODO: how does this work again? -->
<ns0:Binary Id="JpCaDll" SourceFile="$(env.JP_WIXHELPER_DIR)\wixhelper.dll" /> <ns0:Binary Id="JpCaDll" SourceFile="$(env.JP_WIXHELPER_DIR)msica.dll"></ns0:Binary>
<ns0:CustomAction Id="JpFindRelatedProducts" BinaryRef="JpCaDll" DllEntry="FindRelatedProductsEx" /> <ns0:CustomAction Id="JpFindRelatedProducts" BinaryRef="JpCaDll" DllEntry="FindRelatedProductsEx" />
<?ifndef SkipCryptomatorLegacyCheck ?> <?ifndef SkipCryptomatorLegacyCheck ?>
@@ -228,7 +228,7 @@
<ns0:Custom Action="JpFindRelatedProducts" After="FindRelatedProducts"/> <ns0:Custom Action="JpFindRelatedProducts" After="FindRelatedProducts"/>
</ns0:InstallUISequence> </ns0:InstallUISequence>
<ns0:WixVariable Id="WixUIBannerBmp" Value="$(env.JP_WIXWIZARD_RESOURCES)\banner.bmp" /> <ns0:WixVariable Id="WixUIBannerBmp" Value="$(env.JP_WIXWIZARD_RESOURCES)banner.bmp" />
<ns0:WixVariable Id="WixUIDialogBmp" Value="$(env.JP_WIXWIZARD_RESOURCES)\background.bmp" /> <ns0:WixVariable Id="WixUIDialogBmp" Value="$(env.JP_WIXWIZARD_RESOURCES)background.bmp" />
</ns0:Package> </ns0:Package>
</ns0:Wix> </ns0:Wix>
+2 -2
View File
@@ -1,7 +1,7 @@
Apache License v2.0|Apache License, Version 2.0|The Apache License, Version 2.0|The Apache Software License, Version 2.0|Apache 2.0|Apache Software License - Version 2.0|Apache-2.0 Apache License v2.0|Apache License, Version 2.0|The Apache License, Version 2.0|The Apache Software License, Version 2.0|Apache 2.0|Apache Software License - Version 2.0|Apache-2.0
MIT License|MIT|The MIT License (MIT)|The MIT License|MIT license MIT License|MIT|The MIT License (MIT)|The MIT License|MIT license
LGPL 2.1|LGPL, version 2.1|GNU Lesser/Library General Public License version 2|GNU Lesser General Public License Version 2.1|GNU Lesser General Public License LGPL 2.1|LGPL, version 2.1|GNU Lesser/Library General Public License version 2|GNU Lesser General Public License Version 2.1|GNU Lesser General Public License|LGPL-2.1-only
GPLv2|GNU General Public License Version 2 GPLv2|GNU General Public License Version 2
GPLv2+CE|CDDL + GPLv2 with classpath exception GPLv2+CE|CDDL + GPLv2 with classpath exception
Eclipse Public License - Version 1.0|Eclipse Public License - v 1.0 Eclipse Public License - Version 1.0|Eclipse Public License - v 1.0
Eclipse Public License - Version 2.0|Eclipse Public License - v 2.0 Eclipse Public License - Version 2.0|Eclipse Public License - v 2.0|EPL-2.0
Vendored Executable
+295
View File
@@ -0,0 +1,295 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.3.4
#
# Optional ENV vars
# -----------------
# JAVA_HOME - location of a JDK home dir, required when download maven via java source
# MVNW_REPOURL - repo url base for downloading maven distribution
# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
# ----------------------------------------------------------------------------
set -euf
[ "${MVNW_VERBOSE-}" != debug ] || set -x
# OS specific support.
native_path() { printf %s\\n "$1"; }
case "$(uname)" in
CYGWIN* | MINGW*)
[ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
native_path() { cygpath --path --windows "$1"; }
;;
esac
# set JAVACMD and JAVACCMD
set_java_home() {
# For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
if [ -n "${JAVA_HOME-}" ]; then
if [ -x "$JAVA_HOME/jre/sh/java" ]; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACCMD="$JAVA_HOME/jre/sh/javac"
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACCMD="$JAVA_HOME/bin/javac"
if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
return 1
fi
fi
else
JAVACMD="$(
'set' +e
'unset' -f command 2>/dev/null
'command' -v java
)" || :
JAVACCMD="$(
'set' +e
'unset' -f command 2>/dev/null
'command' -v javac
)" || :
if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
return 1
fi
fi
}
# hash string like Java String::hashCode
hash_string() {
str="${1:-}" h=0
while [ -n "$str" ]; do
char="${str%"${str#?}"}"
h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
str="${str#?}"
done
printf %x\\n $h
}
verbose() { :; }
[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
die() {
printf %s\\n "$1" >&2
exit 1
}
trim() {
# MWRAPPER-139:
# Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds.
# Needed for removing poorly interpreted newline sequences when running in more
# exotic environments such as mingw bash on Windows.
printf "%s" "${1}" | tr -d '[:space:]'
}
scriptDir="$(dirname "$0")"
scriptName="$(basename "$0")"
# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
while IFS="=" read -r key value; do
case "${key-}" in
distributionUrl) distributionUrl=$(trim "${value-}") ;;
distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;;
esac
done <"$scriptDir/.mvn/wrapper/maven-wrapper.properties"
[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
case "${distributionUrl##*/}" in
maven-mvnd-*bin.*)
MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
*AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
:Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
:Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
:Linux*x86_64*) distributionPlatform=linux-amd64 ;;
*)
echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
distributionPlatform=linux-amd64
;;
esac
distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
;;
maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
*) MVN_CMD="mvn${scriptName#mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
esac
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
distributionUrlName="${distributionUrl##*/}"
distributionUrlNameMain="${distributionUrlName%.*}"
distributionUrlNameMain="${distributionUrlNameMain%-bin}"
MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}"
MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
exec_maven() {
unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
}
if [ -d "$MAVEN_HOME" ]; then
verbose "found existing MAVEN_HOME at $MAVEN_HOME"
exec_maven "$@"
fi
case "${distributionUrl-}" in
*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
esac
# prepare tmp dir
if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
trap clean HUP INT TERM EXIT
else
die "cannot create temp dir"
fi
mkdir -p -- "${MAVEN_HOME%/*}"
# Download and Install Apache Maven
verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
verbose "Downloading from: $distributionUrl"
verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
# select .zip or .tar.gz
if ! command -v unzip >/dev/null; then
distributionUrl="${distributionUrl%.zip}.tar.gz"
distributionUrlName="${distributionUrl##*/}"
fi
# verbose opt
__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
# normalize http auth
case "${MVNW_PASSWORD:+has-password}" in
'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
esac
if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
verbose "Found wget ... using wget"
wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
verbose "Found curl ... using curl"
curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
elif set_java_home; then
verbose "Falling back to use Java to download"
javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
cat >"$javaSource" <<-END
public class Downloader extends java.net.Authenticator
{
protected java.net.PasswordAuthentication getPasswordAuthentication()
{
return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
}
public static void main( String[] args ) throws Exception
{
setDefault( new Downloader() );
java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
}
}
END
# For Cygwin/MinGW, switch paths to Windows format before running javac and java
verbose " - Compiling Downloader.java ..."
"$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
verbose " - Running Downloader.java ..."
"$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
fi
# If specified, validate the SHA-256 sum of the Maven distribution zip file
if [ -n "${distributionSha256Sum-}" ]; then
distributionSha256Result=false
if [ "$MVN_CMD" = mvnd.sh ]; then
echo "Checksum validation is not supported for maven-mvnd." >&2
echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
exit 1
elif command -v sha256sum >/dev/null; then
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c - >/dev/null 2>&1; then
distributionSha256Result=true
fi
elif command -v shasum >/dev/null; then
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
distributionSha256Result=true
fi
else
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
exit 1
fi
if [ $distributionSha256Result = false ]; then
echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
exit 1
fi
fi
# unzip and move
if command -v unzip >/dev/null; then
unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
else
tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
fi
# Find the actual extracted directory name (handles snapshots where filename != directory name)
actualDistributionDir=""
# First try the expected directory name (for regular distributions)
if [ -d "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" ]; then
if [ -f "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/bin/$MVN_CMD" ]; then
actualDistributionDir="$distributionUrlNameMain"
fi
fi
# If not found, search for any directory with the Maven executable (for snapshots)
if [ -z "$actualDistributionDir" ]; then
# enable globbing to iterate over items
set +f
for dir in "$TMP_DOWNLOAD_DIR"/*; do
if [ -d "$dir" ]; then
if [ -f "$dir/bin/$MVN_CMD" ]; then
actualDistributionDir="$(basename "$dir")"
break
fi
fi
done
set -f
fi
if [ -z "$actualDistributionDir" ]; then
verbose "Contents of $TMP_DOWNLOAD_DIR:"
verbose "$(ls -la "$TMP_DOWNLOAD_DIR")"
die "Could not find Maven distribution directory in extracted archive"
fi
verbose "Found extracted Maven distribution directory: $actualDistributionDir"
printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$actualDistributionDir/mvnw.url"
mv -- "$TMP_DOWNLOAD_DIR/$actualDistributionDir" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
clean || :
exec_maven "$@"
Vendored
+189
View File
@@ -0,0 +1,189 @@
<# : batch portion
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Apache Maven Wrapper startup batch script, version 3.3.4
@REM
@REM Optional ENV vars
@REM MVNW_REPOURL - repo url base for downloading maven distribution
@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output
@REM ----------------------------------------------------------------------------
@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
@SET __MVNW_CMD__=
@SET __MVNW_ERROR__=
@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
@SET PSModulePath=
@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
)
@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
@SET __MVNW_PSMODULEP_SAVE=
@SET __MVNW_ARG0_NAME__=
@SET MVNW_USERNAME=
@SET MVNW_PASSWORD=
@IF NOT "%__MVNW_CMD__%"=="" ("%__MVNW_CMD__%" %*)
@echo Cannot start maven from wrapper >&2 && exit /b 1
@GOTO :EOF
: end batch / begin powershell #>
$ErrorActionPreference = "Stop"
if ($env:MVNW_VERBOSE -eq "true") {
$VerbosePreference = "Continue"
}
# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
if (!$distributionUrl) {
Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
}
switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
"maven-mvnd-*" {
$USE_MVND = $true
$distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
$MVN_CMD = "mvnd.cmd"
break
}
default {
$USE_MVND = $false
$MVN_CMD = $script -replace '^mvnw','mvn'
break
}
}
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
if ($env:MVNW_REPOURL) {
$MVNW_REPO_PATTERN = if ($USE_MVND -eq $False) { "/org/apache/maven/" } else { "/maven/mvnd/" }
$distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace "^.*$MVNW_REPO_PATTERN",'')"
}
$distributionUrlName = $distributionUrl -replace '^.*/',''
$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
$MAVEN_M2_PATH = "$HOME/.m2"
if ($env:MAVEN_USER_HOME) {
$MAVEN_M2_PATH = "$env:MAVEN_USER_HOME"
}
if (-not (Test-Path -Path $MAVEN_M2_PATH)) {
New-Item -Path $MAVEN_M2_PATH -ItemType Directory | Out-Null
}
$MAVEN_WRAPPER_DISTS = $null
if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) {
$MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists"
} else {
$MAVEN_WRAPPER_DISTS = (Get-Item $MAVEN_M2_PATH).Target[0] + "/wrapper/dists"
}
$MAVEN_HOME_PARENT = "$MAVEN_WRAPPER_DISTS/$distributionUrlNameMain"
$MAVEN_HOME_NAME = ([System.Security.Cryptography.SHA256]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
exit $?
}
if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
}
# prepare tmp dir
$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
trap {
if ($TMP_DOWNLOAD_DIR.Exists) {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
}
New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
# Download and Install Apache Maven
Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
Write-Verbose "Downloading from: $distributionUrl"
Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
$webclient = New-Object System.Net.WebClient
if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
$webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
}
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
# If specified, validate the SHA-256 sum of the Maven distribution zip file
$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
if ($distributionSha256Sum) {
if ($USE_MVND) {
Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
}
Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
}
}
# unzip and move
Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
# Find the actual extracted directory name (handles snapshots where filename != directory name)
$actualDistributionDir = ""
# First try the expected directory name (for regular distributions)
$expectedPath = Join-Path "$TMP_DOWNLOAD_DIR" "$distributionUrlNameMain"
$expectedMvnPath = Join-Path "$expectedPath" "bin/$MVN_CMD"
if ((Test-Path -Path $expectedPath -PathType Container) -and (Test-Path -Path $expectedMvnPath -PathType Leaf)) {
$actualDistributionDir = $distributionUrlNameMain
}
# If not found, search for any directory with the Maven executable (for snapshots)
if (!$actualDistributionDir) {
Get-ChildItem -Path "$TMP_DOWNLOAD_DIR" -Directory | ForEach-Object {
$testPath = Join-Path $_.FullName "bin/$MVN_CMD"
if (Test-Path -Path $testPath -PathType Leaf) {
$actualDistributionDir = $_.Name
}
}
}
if (!$actualDistributionDir) {
Write-Error "Could not find Maven distribution directory in extracted archive"
}
Write-Verbose "Found extracted Maven distribution directory: $actualDistributionDir"
Rename-Item -Path "$TMP_DOWNLOAD_DIR/$actualDistributionDir" -NewName $MAVEN_HOME_NAME | Out-Null
try {
Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
} catch {
if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
Write-Error "fail to move MAVEN_HOME"
}
} finally {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
+140 -43
View File
@@ -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>25</project.jdk.version> <project.jdk.version>26</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) -->
@@ -35,47 +35,53 @@
<!-- cryptomator dependencies --> <!-- cryptomator dependencies -->
<cryptomator.cryptofs.version>2.10.0</cryptomator.cryptofs.version> <cryptomator.cryptofs.version>2.10.0</cryptomator.cryptofs.version>
<cryptomator.cryptolib.version>2.2.2</cryptomator.cryptolib.version> <cryptomator.cryptolib.version>2.2.2</cryptomator.cryptolib.version>
<cryptomator.integrations.version>1.8.0</cryptomator.integrations.version> <cryptomator.integrations.version>1.9.0</cryptomator.integrations.version>
<cryptomator.integrations.win.version>1.6.0</cryptomator.integrations.win.version> <cryptomator.integrations.win.version>1.6.1</cryptomator.integrations.win.version>
<cryptomator.integrations.mac.version>1.5.0</cryptomator.integrations.mac.version> <cryptomator.integrations.mac.version>1.5.0</cryptomator.integrations.mac.version>
<cryptomator.integrations.linux.version>1.7.0</cryptomator.integrations.linux.version> <cryptomator.integrations.linux.version>1.8.0-beta1</cryptomator.integrations.linux.version>
<cryptomator.fuse.version>6.0.1</cryptomator.fuse.version> <cryptomator.fuse.version>6.0.1</cryptomator.fuse.version>
<cryptomator.webdav.version>3.0.1</cryptomator.webdav.version> <cryptomator.webdav.version>3.0.2</cryptomator.webdav.version>
<cryptomator.webdav-servlet.version>1.2.12</cryptomator.webdav-servlet.version> <cryptomator.webdav-servlet.version>1.2.12</cryptomator.webdav-servlet.version>
<!-- 3rd party dependencies --> <!-- 3rd party dependencies -->
<caffeine.version>3.2.3</caffeine.version> <caffeine.version>3.2.4</caffeine.version>
<commons-lang3.version>3.20.0</commons-lang3.version> <commons-lang3.version>3.20.0</commons-lang3.version>
<dagger.version>2.59.2</dagger.version> <dagger.version>2.59.2</dagger.version>
<easybind.version>2.2</easybind.version> <easybind.version>2.2</easybind.version>
<jackson.version>2.21.1</jackson.version> <jackson.version>2.21.6</jackson.version>
<javafx.version>25.0.2</javafx.version> <javafx.version>25.0.3</javafx.version>
<jwt.version>4.5.1</jwt.version> <jwt.version>4.5.2</jwt.version>
<nimbus-jose.version>10.5</nimbus-jose.version> <nimbus-jose.version>10.5</nimbus-jose.version>
<logback.version>1.5.32</logback.version> <logback.version>1.5.35</logback.version>
<slf4j.version>2.0.17</slf4j.version> <slf4j.version>2.0.18</slf4j.version>
<tinyoauth2.version>0.8.1</tinyoauth2.version> <tinyoauth2.version>0.8.1</tinyoauth2.version>
<zxcvbn.version>1.9.0</zxcvbn.version> <zxcvbn.version>1.9.0</zxcvbn.version>
<!-- test dependencies --> <!-- test dependencies -->
<junit.jupiter.version>6.0.3</junit.jupiter.version> <junit.jupiter.version>6.1.0</junit.jupiter.version>
<mockito.version>5.22.0</mockito.version> <mockito.version>5.23.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.1.0</jetbrains.annotations.version> <jetbrains.annotations.version>26.1.0</jetbrains.annotations.version>
<dependency-check.version>12.2.0</dependency-check.version> <dependency-check.version>12.2.2</dependency-check.version>
<jacoco.version>0.8.14</jacoco.version> <jacoco.version>0.8.15</jacoco.version>
<license-generator.version>2.7.1</license-generator.version> <license-generator.version>2.7.1</license-generator.version>
<junit-tree-reporter.version>1.5.1</junit-tree-reporter.version>
<mvn-compiler.version>3.15.0</mvn-compiler.version> <mvn-compiler.version>3.15.0</mvn-compiler.version>
<mvn-resources.version>3.5.0</mvn-resources.version> <mvn-resources.version>3.5.0</mvn-resources.version>
<mvn-dependency.version>3.10.0</mvn-dependency.version> <mvn-dependency.version>3.11.0</mvn-dependency.version>
<mvn-surefire.version>3.5.3</mvn-surefire.version> <mvn-surefire.version>3.5.6</mvn-surefire.version>
<mvn-jar.version>3.5.0</mvn-jar.version> <mvn-jar.version>3.5.0</mvn-jar.version>
<mvn-exec.version>3.5.1</mvn-exec.version>
<!-- Property used by surefire to determine jacoco engine --> <!-- Property used by surefire to determine jacoco engine -->
<surefire.jacoco.args></surefire.jacoco.args> <surefire.jacoco.args></surefire.jacoco.args>
<!-- App runtime config used by the 'run' profile, mirroring .idea/runConfigurations. The 'dev' profile switches these to the Cryptomator-Dev variants. -->
<run.appDir>Cryptomator</run.appDir>
<run.linuxFuseArgs></run.linuxFuseArgs>
<run.macMountPointsDir>@{userhome}/Cryptomator</run.macMountPointsDir>
<run.macUpdateArgs>-Dcryptomator.updateMechanism=org.cryptomator.macos.update.DmgUpdateMechanism</run.macUpdateArgs>
</properties> </properties>
<repositories> <repositories>
@@ -300,6 +306,10 @@
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
<version>${mvn-surefire.version}</version> <version>${mvn-surefire.version}</version>
<configuration>
<!--suppress MavenModelInspection -->
<argLine>@{argLine} -javaagent:${org.mockito:mockito-core:jar}</argLine>
</configuration>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.codehaus.mojo</groupId> <groupId>org.codehaus.mojo</groupId>
@@ -321,6 +331,11 @@
<artifactId>dependency-check-maven</artifactId> <artifactId>dependency-check-maven</artifactId>
<version>${dependency-check.version}</version> <version>${dependency-check.version}</version>
</plugin> </plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>${mvn-exec.version}</version>
</plugin>
</plugins> </plugins>
</pluginManagement> </pluginManagement>
<plugins> <plugins>
@@ -356,22 +371,12 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
<dependencies>
<dependency>
<groupId>me.fabriciorby</groupId>
<artifactId>maven-surefire-junit5-tree-reporter</artifactId>
<version>${junit-tree-reporter.version}</version>
</dependency>
</dependencies>
<configuration> <configuration>
<reportFormat>plain</reportFormat> <reportFormat>plain</reportFormat>
<consoleOutputReporter> <consoleOutputReporter>
<disable>true</disable> <disable>true</disable>
</consoleOutputReporter> </consoleOutputReporter>
<argLine>@{surefire.jacoco.args} -javaagent:${org.mockito:mockito-core:jar} --enable-native-access=javafx.graphics</argLine> <argLine>@{surefire.jacoco.args} -javaagent:${org.mockito:mockito-core:jar} --enable-native-access=javafx.graphics</argLine>
<statelessTestsetInfoReporter
implementation="org.apache.maven.plugin.surefire.extensions.junit5.JUnit5StatelessTestsetInfoTreeReporter">
</statelessTestsetInfoReporter>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>
@@ -410,11 +415,20 @@
<includeGroupIds>${nonModularGroupIds}</includeGroupIds> <includeGroupIds>${nonModularGroupIds}</includeGroupIds>
</configuration> </configuration>
</execution> </execution>
<execution>
<id>get-mockito-agent-path</id>
<goals>
<goal>properties</goal>
</goals>
</execution>
</executions> </executions>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.codehaus.mojo</groupId> <groupId>org.codehaus.mojo</groupId>
<artifactId>license-maven-plugin</artifactId> <artifactId>license-maven-plugin</artifactId>
<configuration>
<licenseMergesUrl>${project.baseUri}license/merges</licenseMergesUrl>
</configuration>
<executions> <executions>
<execution> <execution>
<id>add-third-party</id> <id>add-third-party</id>
@@ -426,7 +440,6 @@
<thirdPartyFilename>THIRD-PARTY.txt</thirdPartyFilename> <thirdPartyFilename>THIRD-PARTY.txt</thirdPartyFilename>
<includedScopes>compile</includedScopes> <includedScopes>compile</includedScopes>
<excludedGroups>org\.cryptomator</excludedGroups> <excludedGroups>org\.cryptomator</excludedGroups>
<licenseMergesUrl>file:///${project.basedir}/license/merges</licenseMergesUrl>
<fileTemplate>${project.basedir}/src/main/resources/license/template.ftl</fileTemplate> <fileTemplate>${project.basedir}/src/main/resources/license/template.ftl</fileTemplate>
</configuration> </configuration>
</execution> </execution>
@@ -513,9 +526,6 @@
<os> <os>
<family>mac</family> <family>mac</family>
</os> </os>
<property>
<name>idea.version</name>
</property>
</activation> </activation>
<dependencies> <dependencies>
<dependency> <dependency>
@@ -531,12 +541,9 @@
<activation> <activation>
<os> <os>
<family>unix</family> <family>unix</family>
<name>Linux</name> <name>linux</name>
<arch>aarch64</arch> <arch>aarch64</arch>
</os> </os>
<property>
<name>idea.version</name>
</property>
</activation> </activation>
<dependencies> <dependencies>
<dependency> <dependency>
@@ -576,12 +583,9 @@
<activation> <activation>
<os> <os>
<family>unix</family> <family>unix</family>
<name>Linux</name> <name>linux</name>
<arch>amd64</arch> <arch>amd64</arch>
</os> </os>
<property>
<name>idea.version</name>
</property>
</activation> </activation>
<dependencies> <dependencies>
<dependency> <dependency>
@@ -598,9 +602,6 @@
<os> <os>
<family>windows</family> <family>windows</family>
</os> </os>
<property>
<name>idea.version</name>
</property>
</activation> </activation>
<dependencies> <dependencies>
<dependency> <dependency>
@@ -610,6 +611,102 @@
</dependency> </dependency>
</dependencies> </dependencies>
</profile> </profile>
<!-- Launches the app from the command line: ./mvnw -Prun compile exec:exec (append ,dev for the Cryptomator-Dev variant) -->
<profile>
<id>run</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<!-- same split into module path and class path as the copy-mods/copy-libs executions used for packaging -->
<execution>
<id>build-run-modulepath</id>
<phase>validate</phase>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<includeScope>runtime</includeScope>
<excludeGroupIds>${nonModularGroupIds}</excludeGroupIds>
<outputProperty>run.modulePath</outputProperty>
</configuration>
</execution>
<execution>
<id>build-run-classpath</id>
<phase>validate</phase>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<includeScope>runtime</includeScope>
<includeGroupIds>${nonModularGroupIds}</includeGroupIds>
<outputProperty>run.classPath</outputProperty>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<configuration>
<executable>${java.home}/bin/java</executable>
<commandlineArgs>--module-path "${project.build.outputDirectory}${path.separator}${run.modulePath}" --class-path "${run.classPath}" ${run.jvmArgs} --module org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator</commandlineArgs>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<!-- Switches the 'run' profile to the Cryptomator-Dev variants, so a dev run does not touch the settings of an installed Cryptomator -->
<profile>
<id>dev</id>
<properties>
<run.appDir>Cryptomator-Dev</run.appDir>
<run.linuxFuseArgs>-Dfuse.experimental="true"</run.linuxFuseArgs>
<run.macMountPointsDir>@{userhome}/Library/Application Support/Cryptomator-Dev/mnt</run.macMountPointsDir>
<run.macUpdateArgs></run.macUpdateArgs>
</properties>
</profile>
<profile>
<id>run-win</id>
<activation>
<os>
<family>windows</family>
</os>
</activation>
<properties>
<run.jvmArgs>-Dcryptomator.settingsPath="@{appdata}/${run.appDir}/settings.json;@{userhome}/AppData/Roaming/${run.appDir}/settings.json" -Dcryptomator.ipcSocketPath="@{localappdata}/${run.appDir}/ipc.socket" -Dcryptomator.logDir="@{localappdata}/${run.appDir}" -Dcryptomator.pluginDir="@{appdata}/${run.appDir}/Plugins" -Dcryptomator.integrationsWin.keychainPaths="@{appdata}/${run.appDir}/keychain.json;@{userhome}/AppData/Roaming/${run.appDir}/keychain.json" -Dcryptomator.integrationsWin.windowsHelloKeychainPaths="@{appdata}/${run.appDir}/windowsHelloKeychain.json;@{userhome}/AppData/Roaming/${run.appDir}/windowsHelloKeychain.json" -Dcryptomator.p12Path="@{appdata}/${run.appDir}/key.p12;@{userhome}/AppData/Roaming/${run.appDir}/key.p12" -Dcryptomator.mountPointsDir="@{userhome}/${run.appDir}" -Dcryptomator.showTrayIcon=true -Dcryptomator.hub.enableTrustOnFirstUse=true -Xss2m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.win,org.cryptomator.integrations.win,javafx.graphics</run.jvmArgs>
</properties>
</profile>
<profile>
<id>run-mac</id>
<activation>
<os>
<family>mac</family>
</os>
</activation>
<properties>
<run.jvmArgs>-Dapple.awt.enableTemplateImages=true -Dcryptomator.settingsPath="@{userhome}/Library/Application Support/${run.appDir}/settings.json" -Dcryptomator.p12Path="@{userhome}/Library/Application Support/${run.appDir}/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/Library/Application Support/${run.appDir}/ipc.socket" -Dcryptomator.logDir="@{userhome}/Library/Logs/${run.appDir}" -Dcryptomator.pluginDir="@{userhome}/Library/Application Support/${run.appDir}/Plugins" -Dcryptomator.mountPointsDir="${run.macMountPointsDir}" -Dcryptomator.showTrayIcon=true -Dcryptomator.integrationsMac.keychainServiceName=Cryptomator ${run.macUpdateArgs} -Dcryptomator.hub.enableTrustOnFirstUse=true -Xss2m -Xmx512m -ea --enable-preview --enable-native-access=org.cryptomator.jfuse.mac,javafx.graphics</run.jvmArgs>
</properties>
</profile>
<profile>
<id>run-linux</id>
<activation>
<os>
<family>unix</family>
<name>linux</name>
</os>
</activation>
<properties>
<run.jvmArgs>-Dcryptomator.settingsPath="@{userhome}/.config/${run.appDir}/settings.json" -Dcryptomator.p12Path="@{userhome}/.config/${run.appDir}/key.p12" -Dcryptomator.ipcSocketPath="@{userhome}/.config/${run.appDir}/ipc.socket" -Dcryptomator.logDir="@{userhome}/.local/share/${run.appDir}/logs" -Dcryptomator.pluginDir="@{userhome}/.local/share/${run.appDir}/plugins" -Dcryptomator.mountPointsDir="@{userhome}/.local/share/${run.appDir}/mnt" -Dcryptomator.showTrayIcon=true -Dcryptomator.hub.enableTrustOnFirstUse=true ${run.linuxFuseArgs} -Xss20m -Xmx512m --enable-preview --enable-native-access=org.cryptomator.jfuse.linux.amd64,org.cryptomator.jfuse.linux.aarch64,org.purejava.appindicator,javafx.graphics</run.jvmArgs>
</properties>
</profile>
</profiles> </profiles>
</project> </project>
@@ -8,7 +8,6 @@ import org.slf4j.LoggerFactory;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays; import java.util.Arrays;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
@@ -166,7 +165,7 @@ public class Environment {
private Optional<Path> getPath(String propertyName) { private Optional<Path> getPath(String propertyName) {
String value = System.getProperty(propertyName); String value = System.getProperty(propertyName);
return Optional.ofNullable(value).map(Paths::get); return Optional.ofNullable(value).map(Path::of);
} }
@VisibleForTesting @VisibleForTesting
@@ -77,7 +77,7 @@ public class ErrorCode {
public static ErrorCode of(Throwable throwable) { public static ErrorCode of(Throwable throwable) {
var causalChain = Throwables.getCausalChain(throwable); var causalChain = Throwables.getCausalChain(throwable);
if (causalChain.size() > 1) { if (causalChain.size() > 1) {
var rootCause = causalChain.get(causalChain.size() - 1); var rootCause = causalChain.getLast();
var parentOfRootCause = causalChain.get(causalChain.size() - 2); var parentOfRootCause = causalChain.get(causalChain.size() - 2);
var rootSpecificFrames = countTopmostFrames(rootCause.getStackTrace(), parentOfRootCause.getStackTrace()); var rootSpecificFrames = countTopmostFrames(rootCause.getStackTrace(), parentOfRootCause.getStackTrace());
return new ErrorCode(throwable, rootCause, rootSpecificFrames); return new ErrorCode(throwable, rootCause, rootSpecificFrames);
@@ -67,7 +67,7 @@ public class SubstitutingProperties extends PropertiesDecorator {
private enum Source { private enum Source {
ENV, ENV,
PROPS; PROPS
} }
} }
@@ -8,9 +8,9 @@ import org.slf4j.LoggerFactory;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Path; import java.nio.file.Path;
import java.time.Duration;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -78,7 +78,7 @@ public final class OneDriveWindowsLocationPresetsProvider implements LocationPre
*/ */
@Blocking @Blocking
private static void waitForSuccess(Process process, int timeoutSeconds, String cmdDescription) throws TimeoutException, InterruptedException, CommandFailedException { private static void waitForSuccess(Process process, int timeoutSeconds, String cmdDescription) throws TimeoutException, InterruptedException, CommandFailedException {
boolean exited = process.waitFor(timeoutSeconds, TimeUnit.SECONDS); boolean exited = process.waitFor(Duration.ofSeconds(timeoutSeconds));
if (!exited) { if (!exited) {
throw new TimeoutException(cmdDescription + " timed out after " + timeoutSeconds + "s"); throw new TimeoutException(cmdDescription + " timed out after " + timeoutSeconds + "s");
} }
@@ -90,7 +90,7 @@ public final class MountWithinParentUtil {
EMPTY_DIR, EMPTY_DIR,
BROKEN_JUNCTION; BROKEN_JUNCTION
} }
@@ -22,7 +22,6 @@ import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty; import javafx.beans.property.StringProperty;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Objects; import java.util.Objects;
import java.util.Random; import java.util.Random;
@@ -62,7 +61,7 @@ public class VaultSettings {
VaultSettings(VaultSettingsJson json) { VaultSettings(VaultSettingsJson json) {
this.id = json.id; this.id = json.id;
this.path = new SimpleObjectProperty<>(this, "path", json.path == null ? null : Paths.get(json.path)); this.path = new SimpleObjectProperty<>(this, "path", json.path == null ? null : Path.of(json.path));
this.displayName = new SimpleStringProperty(this, "displayName", json.displayName); this.displayName = new SimpleStringProperty(this, "displayName", json.displayName);
this.unlockAfterStartup = new SimpleBooleanProperty(this, "unlockAfterStartup", json.unlockAfterStartup); this.unlockAfterStartup = new SimpleBooleanProperty(this, "unlockAfterStartup", json.unlockAfterStartup);
this.revealAfterMount = new SimpleBooleanProperty(this, "revealAfterMount", json.revealAfterMount); this.revealAfterMount = new SimpleBooleanProperty(this, "revealAfterMount", json.revealAfterMount);
@@ -0,0 +1,32 @@
package org.cryptomator.common.vaults;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
public class NotAVaultDirectoryException extends NoSuchFileException {
public enum Reason {
MISSING_DATA_DIR,
DATA_NOT_A_DIRECTORY,
MISSING_VAULT_CONFIG,
VAULT_CONFIG_ACCESS_DENIED,
UNSUPPORTED_STRUCTURE
}
private final transient Path path;
private final Reason reason;
public NotAVaultDirectoryException(Path path, Reason reason) {
super(path.toString(), null, "Not a vault directory: " + reason);
this.path = path;
this.reason = reason;
}
public Path path() {
return path;
}
public Reason notAVaultReason() {
return reason;
}
}
@@ -47,7 +47,6 @@ import javafx.beans.property.ReadOnlyStringProperty;
import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleBooleanProperty;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.ReadOnlyFileSystemException; import java.nio.file.ReadOnlyFileSystemException;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.Objects; import java.util.Objects;
@@ -58,7 +57,7 @@ import java.util.concurrent.atomic.AtomicReference;
public class Vault { public class Vault {
private static final Logger LOG = LoggerFactory.getLogger(Vault.class); private static final Logger LOG = LoggerFactory.getLogger(Vault.class);
private static final Path HOME_DIR = Paths.get(SystemUtils.USER_HOME); private static final Path HOME_DIR = Path.of(SystemUtils.USER_HOME);
private static final int UNLIMITED_FILENAME_LENGTH = Integer.MAX_VALUE; private static final int UNLIMITED_FILENAME_LENGTH = Integer.MAX_VALUE;
private final VaultSettings vaultSettings; private final VaultSettings vaultSettings;
@@ -22,20 +22,31 @@ import org.slf4j.LoggerFactory;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import javafx.application.Platform;
import javafx.collections.ObservableList; import javafx.collections.ObservableList;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.file.AccessDeniedException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.NoSuchFileException; import java.nio.file.NoSuchFileException;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import static org.cryptomator.common.Constants.MASTERKEY_FILENAME; 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.*; import static org.cryptomator.common.vaults.VaultState.Value.ALL_MISSING;
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.MISSING;
import static org.cryptomator.common.vaults.VaultState.Value.NEEDS_MIGRATION;
import static org.cryptomator.common.vaults.VaultState.Value.PROCESSING;
import static org.cryptomator.common.vaults.VaultState.Value.UNLOCKED;
import static org.cryptomator.common.vaults.VaultState.Value.VAULT_CONFIG_MISSING;
import static org.cryptomator.cryptofs.common.Constants.DATA_DIR_NAME;
@Singleton @Singleton
public class VaultListManager { public class VaultListManager {
@@ -72,18 +83,57 @@ public class VaultListManager {
return vaultList.stream().anyMatch(v -> vaultPath.equals(v.getPath())); return vaultList.stream().anyMatch(v -> vaultPath.equals(v.getPath()));
} }
/**
* Safe to call from any thread: the IO work runs on the calling thread, but the
* {@code ObservableList} mutation is marshaled to the JavaFX application thread.
*/
public Vault add(Path pathToVault) throws IOException { public Vault add(Path pathToVault) throws IOException {
Path normalizedPathToVault = pathToVault.normalize().toAbsolutePath(); Path normalizedPathToVault = pathToVault.normalize().toAbsolutePath();
if (CryptoFileSystemProvider.checkDirStructureForVault(normalizedPathToVault, VAULTCONFIG_FILENAME, MASTERKEY_FILENAME) == DirStructure.UNRELATED) { assertIsVaultDirectory(normalizedPathToVault);
throw new NoSuchFileException(normalizedPathToVault.toString(), null, "Not a vault directory");
}
return get(normalizedPathToVault) // return get(normalizedPathToVault).orElseGet(() -> {
.orElseGet(() -> { Vault newVault = create(newVaultSettings(normalizedPathToVault));
Vault newVault = create(newVaultSettings(normalizedPathToVault)); if (Platform.isFxApplicationThread()) {
vaultList.add(newVault); addVault(newVault);
return newVault; } else {
}); Platform.runLater(() -> addVault(newVault));
}
return newVault;
});
}
public static void assertIsVaultDirectory(Path pathToVault) throws IOException {
if (CryptoFileSystemProvider.checkDirStructureForVault(pathToVault, VAULTCONFIG_FILENAME, MASTERKEY_FILENAME) == DirStructure.UNRELATED) {
checkDataDir(pathToVault);
checkConfigFile(pathToVault);
//if vault is legacy _and_ not readable, just say unsupported
throw new NotAVaultDirectoryException(pathToVault, NotAVaultDirectoryException.Reason.UNSUPPORTED_STRUCTURE);
}
}
static void checkDataDir(Path pathToVault) throws NotAVaultDirectoryException {
Path dataDir = pathToVault.resolve(DATA_DIR_NAME);
if (!Files.exists(dataDir)) {
throw new NotAVaultDirectoryException(pathToVault, NotAVaultDirectoryException.Reason.MISSING_DATA_DIR);
}
if (!Files.isDirectory(dataDir)) {
throw new NotAVaultDirectoryException(pathToVault, NotAVaultDirectoryException.Reason.DATA_NOT_A_DIRECTORY);
}
}
static void checkConfigFile(Path pathToVault) throws NotAVaultDirectoryException {
Path vaultConfig = pathToVault.resolve(VAULTCONFIG_FILENAME);
try (var ch = Files.newByteChannel(vaultConfig, StandardOpenOption.READ)) {
ch.read(ByteBuffer.allocate(1));
} catch (AccessDeniedException e) {
throw new NotAVaultDirectoryException(pathToVault, NotAVaultDirectoryException.Reason.VAULT_CONFIG_ACCESS_DENIED);
} catch (NoSuchFileException e) {
throw new NotAVaultDirectoryException(pathToVault, NotAVaultDirectoryException.Reason.MISSING_VAULT_CONFIG);
} catch (IOException e) {
LOG.warn("Failed to read vault config: {}", e.getMessage());
throw new NotAVaultDirectoryException(pathToVault, NotAVaultDirectoryException.Reason.UNSUPPORTED_STRUCTURE);
}
} }
private VaultSettings newVaultSettings(Path path) { private VaultSettings newVaultSettings(Path path) {
@@ -153,7 +203,7 @@ public class VaultListManager {
//for legacy reasons: pre v8 vault do not have a config, but they are in the NEEDS_MIGRATION state //for legacy reasons: pre v8 vault do not have a config, but they are in the NEEDS_MIGRATION state
vaultSettings.lastKnownKeyLoader.set(MasterkeyFileLoadingStrategy.SCHEME); vaultSettings.lastKnownKeyLoader.set(MasterkeyFileLoadingStrategy.SCHEME);
} }
case VAULT_CONFIG_MISSING -> { case VAULT_CONFIG_MISSING -> {
//Nothing to do here, since there is no config to read //Nothing to do here, since there is no config to read
} }
case MISSING, ALL_MISSING, ERROR, PROCESSING -> { case MISSING, ALL_MISSING, ERROR, PROCESSING -> {
@@ -58,7 +58,7 @@ public class VaultState extends ObservableValueBase<VaultState.Value> implements
/** /**
* Unknown state due to preceding unrecoverable exceptions. * Unknown state due to preceding unrecoverable exceptions.
*/ */
ERROR; ERROR
} }
private final AtomicReference<Value> value; private final AtomicReference<Value> value;
@@ -34,7 +34,7 @@ public class SupportedLanguages {
var collator = Collator.getInstance(preferredLocale); var collator = Collator.getInstance(preferredLocale);
collator.setStrength(Collator.PRIMARY); collator.setStrength(Collator.PRIMARY);
var sorted = new ArrayList<String>(); var sorted = new ArrayList<String>();
sorted.add(0, null); sorted.addFirst(null);
sorted.add(1, ENGLISH); sorted.add(1, ENGLISH);
LANGUAGE_TAGS.stream() // LANGUAGE_TAGS.stream() //
.sorted((a, b) -> collator.compare(Locale.forLanguageTag(a).getDisplayName(), Locale.forLanguageTag(b).getDisplayName())) // .sorted((a, b) -> collator.compare(Locale.forLanguageTag(a).getDisplayName(), Locale.forLanguageTag(b).getDisplayName())) //
@@ -2,12 +2,14 @@ package org.cryptomator.ui.addvaultwizard;
import dagger.Lazy; import dagger.Lazy;
import org.apache.commons.lang3.SystemUtils; import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.vaults.NotAVaultDirectoryException;
import org.cryptomator.common.vaults.Vault; import org.cryptomator.common.vaults.Vault;
import org.cryptomator.common.vaults.VaultListManager; import org.cryptomator.common.vaults.VaultListManager;
import org.cryptomator.integrations.uiappearance.Theme; import org.cryptomator.integrations.uiappearance.Theme;
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;
import org.cryptomator.ui.dialogs.Dialogs;
import org.cryptomator.ui.fxapp.FxApplicationStyle; import org.cryptomator.ui.fxapp.FxApplicationStyle;
import org.cryptomator.ui.fxapp.FxApplicationWindows; import org.cryptomator.ui.fxapp.FxApplicationWindows;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -41,6 +43,7 @@ public class ChooseExistingVaultController implements FxController {
private final ObjectProperty<Vault> vault; private final ObjectProperty<Vault> vault;
private final VaultListManager vaultListManager; private final VaultListManager vaultListManager;
private final ResourceBundle resourceBundle; private final ResourceBundle resourceBundle;
private final Dialogs dialogs;
private final ObservableValue<Image> screenshot; private final ObservableValue<Image> screenshot;
@Inject @Inject
@@ -51,6 +54,7 @@ public class ChooseExistingVaultController implements FxController {
@AddVaultWizardWindow ObjectProperty<Vault> vault, // @AddVaultWizardWindow ObjectProperty<Vault> vault, //
VaultListManager vaultListManager, // VaultListManager vaultListManager, //
ResourceBundle resourceBundle, // ResourceBundle resourceBundle, //
Dialogs dialogs, //
FxApplicationStyle applicationStyle) { FxApplicationStyle applicationStyle) {
this.window = window; this.window = window;
this.successScene = successScene; this.successScene = successScene;
@@ -59,6 +63,7 @@ public class ChooseExistingVaultController implements FxController {
this.vault = vault; this.vault = vault;
this.vaultListManager = vaultListManager; this.vaultListManager = vaultListManager;
this.resourceBundle = resourceBundle; this.resourceBundle = resourceBundle;
this.dialogs = dialogs;
this.screenshot = applicationStyle.appliedAppThemeProperty().map(this::selectScreenshot); this.screenshot = applicationStyle.appliedAppThemeProperty().map(this::selectScreenshot);
} }
@@ -87,6 +92,9 @@ public class ChooseExistingVaultController implements FxController {
Vault newVault = vaultListManager.add(vaultPath.get()); Vault newVault = vaultListManager.add(vaultPath.get());
vault.set(newVault); vault.set(newVault);
window.setScene(successScene.get()); window.setScene(successScene.get());
} catch (NotAVaultDirectoryException e) {
LOG.warn("Selected folder is not a vault directory: {}", e.getMessage());
dialogs.prepareNotAVaultDirectoryDialog(window, e).build().showAndWait();
} catch (IOException e) { } catch (IOException e) {
LOG.error("Failed to open existing vault.", e); LOG.error("Failed to open existing vault.", e);
appWindows.showErrorWindow(e, window, window.getScene()); appWindows.showErrorWindow(e, window, window.getScene());
@@ -41,7 +41,6 @@ import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.InvalidPathException; import java.nio.file.InvalidPathException;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional; import java.util.Optional;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
@@ -50,7 +49,7 @@ import java.util.concurrent.ExecutorService;
public class CreateNewVaultLocationController implements FxController { public class CreateNewVaultLocationController implements FxController {
private static final Logger LOG = LoggerFactory.getLogger(CreateNewVaultLocationController.class); private static final Logger LOG = LoggerFactory.getLogger(CreateNewVaultLocationController.class);
private static final Path DEFAULT_CUSTOM_VAULT_PATH = Paths.get(System.getProperty("user.home")); private static final Path DEFAULT_CUSTOM_VAULT_PATH = Path.of(System.getProperty("user.home"));
private static final String TEMP_FILE_PREFIX = ".locationTest.cryptomator"; private static final String TEMP_FILE_PREFIX = ".locationTest.cryptomator";
private final Stage window; private final Stage window;
@@ -23,7 +23,7 @@ public class SystemBarUtil {
/** /**
* OS Bar placed at the bottom screen edge * OS Bar placed at the bottom screen edge
*/ */
BOTTOM; BOTTOM
} }
/** /**
@@ -1,6 +1,7 @@
package org.cryptomator.ui.dialogs; package org.cryptomator.ui.dialogs;
import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.vaults.NotAVaultDirectoryException;
import org.cryptomator.common.vaults.Vault; import org.cryptomator.common.vaults.Vault;
import org.cryptomator.ui.common.DefaultSceneFactory; import org.cryptomator.ui.common.DefaultSceneFactory;
import org.cryptomator.ui.common.StageFactory; import org.cryptomator.ui.common.StageFactory;
@@ -139,6 +140,24 @@ public class Dialogs {
.setCancelAction(Stage::close); .setCancelAction(Stage::close);
} }
public SimpleDialog.Builder prepareNotAVaultDirectoryDialog(Stage window, NotAVaultDirectoryException e) {
String descriptionKey = switch (e.notAVaultReason()) {
case MISSING_DATA_DIR -> "addvaultwizard.existing.notAVault.description.missingDataDir";
case DATA_NOT_A_DIRECTORY -> "addvaultwizard.existing.notAVault.description.dataNotADirectory";
case MISSING_VAULT_CONFIG -> "addvaultwizard.existing.notAVault.description.missingVaultConfig";
case VAULT_CONFIG_ACCESS_DENIED -> "addvaultwizard.existing.notAVault.description.vaultConfigAccessDenied";
case UNSUPPORTED_STRUCTURE -> "addvaultwizard.existing.notAVault.description.unsupportedStructure";
};
return createDialogBuilder() //
.setOwner(window) //
.setTitleKey("addvaultwizard.existing.notAVault.title") //
.setMessageKey("addvaultwizard.existing.notAVault.message") //
.setDescriptionKey(descriptionKey, e.path().getFileName() != null ? e.path().getFileName().toString() : e.path().toString()) //
.setIcon(FontAwesome5Icon.EXCLAMATION) //
.setOkButtonKey(BUTTON_KEY_CLOSE) //
.setOkAction(Stage::close);
}
public SimpleDialog.Builder prepareNoDDirectorySelectedDialog(Stage window) { public SimpleDialog.Builder prepareNoDDirectorySelectedDialog(Stage window) {
return createDialogBuilder() // return createDialogBuilder() //
.setOwner(window) // .setOwner(window) //
@@ -1,15 +1,18 @@
package org.cryptomator.ui.fxapp; package org.cryptomator.ui.fxapp;
import org.cryptomator.common.vaults.NotAVaultDirectoryException;
import org.cryptomator.common.vaults.Vault; import org.cryptomator.common.vaults.Vault;
import org.cryptomator.common.vaults.VaultListManager; import org.cryptomator.common.vaults.VaultListManager;
import org.cryptomator.launcher.AppLaunchEvent; import org.cryptomator.launcher.AppLaunchEvent;
import org.cryptomator.ui.common.VaultService; import org.cryptomator.ui.common.VaultService;
import org.cryptomator.ui.dialogs.Dialogs;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.stage.Stage;
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.Optional;
@@ -29,14 +32,18 @@ class AppLaunchEventHandler {
private final FxApplicationWindows appWindows; private final FxApplicationWindows appWindows;
private final VaultListManager vaultListManager; private final VaultListManager vaultListManager;
private final VaultService vaultService; private final VaultService vaultService;
private final Stage primaryStage;
private final Dialogs dialogs;
@Inject @Inject
public AppLaunchEventHandler(@Named("launchEventQueue") BlockingQueue<AppLaunchEvent> launchEventQueue, ExecutorService executorService, FxApplicationWindows appWindows, VaultListManager vaultListManager, VaultService vaultService) { public AppLaunchEventHandler(@Named("launchEventQueue") BlockingQueue<AppLaunchEvent> launchEventQueue, ExecutorService executorService, FxApplicationWindows appWindows, VaultListManager vaultListManager, VaultService vaultService, @PrimaryStage Stage primaryStage, Dialogs dialogs) {
this.launchEventQueue = launchEventQueue; this.launchEventQueue = launchEventQueue;
this.executorService = executorService; this.executorService = executorService;
this.appWindows = appWindows; this.appWindows = appWindows;
this.vaultListManager = vaultListManager; this.vaultListManager = vaultListManager;
this.vaultService = vaultService; this.vaultService = vaultService;
this.primaryStage = primaryStage;
this.dialogs = dialogs;
} }
public void startHandlingLaunchEvents() { public void startHandlingLaunchEvents() {
@@ -58,31 +65,33 @@ class AppLaunchEventHandler {
private void handleLaunchEvent(AppLaunchEvent event) { private void handleLaunchEvent(AppLaunchEvent event) {
switch (event.type()) { switch (event.type()) {
case REVEAL_APP -> appWindows.showMainWindow(); case REVEAL_APP -> appWindows.showMainWindow();
case OPEN_FILE -> Platform.runLater(() -> { case OPEN_FILE -> event.pathsToOpen().forEach(this::openPotentialVault);
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 openPotentialVault(Path path) { private void openPotentialVault(Path path) {
assert Platform.isFxApplicationThread(); Path potentialVaultPath = path.getFileName().toString().endsWith(CRYPTOMATOR_FILENAME_EXT) ? path.getParent() : path;
try { Optional<Vault> existing = vaultListManager.get(potentialVaultPath.normalize().toAbsolutePath());
Path potentialVaultPath = path.getFileName().toString().endsWith(CRYPTOMATOR_FILENAME_EXT) ? path.getParent() : path; if (existing.isPresent()) {
final Optional<Vault> v = vaultListManager.get(potentialVaultPath); Platform.runLater(() -> {
if (v.isPresent()) { if (existing.get().isUnlocked()) {
if (v.get().isUnlocked()) { vaultService.reveal(existing.get());
vaultService.reveal(v.get()); } else if (existing.get().isLocked()) {
} else if (v.get().isLocked()) { appWindows.startUnlockWorkflow(existing.get(), null);
appWindows.startUnlockWorkflow(v.get(), null);
} }
} else { });
vaultListManager.add(potentialVaultPath); return;
LOG.debug("Added vault {}", potentialVaultPath); }
} try {
vaultListManager.add(potentialVaultPath);
LOG.debug("Added vault {}", potentialVaultPath);
} catch (NotAVaultDirectoryException e) {
LOG.warn("Cannot add {}: {}", potentialVaultPath, e.getMessage());
Platform.runLater(() -> dialogs.prepareNotAVaultDirectoryDialog(primaryStage, e).build().showAndWait());
} catch (IOException e) { } catch (IOException e) {
LOG.error("Failed to add vault " + path, e); LOG.error("Failed to add vault {}", potentialVaultPath, e);
} }
} }
@@ -6,6 +6,7 @@ import org.cryptomator.integrations.common.Priority;
import org.cryptomator.integrations.revealpath.RevealFailedException; import org.cryptomator.integrations.revealpath.RevealFailedException;
import org.cryptomator.integrations.revealpath.RevealPathService; import org.cryptomator.integrations.revealpath.RevealPathService;
import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
/** /**
@@ -17,14 +18,17 @@ import java.nio.file.Path;
*/ */
@DisplayName("JavaFX HostServices (GTK)") @DisplayName("JavaFX HostServices (GTK)")
@OperatingSystem(OperatingSystem.Value.LINUX) @OperatingSystem(OperatingSystem.Value.LINUX)
@Priority(10) @Priority(Priority.FALLBACK)
public class JfxRevealPathService implements RevealPathService { public class JfxRevealPathService implements RevealPathService {
@Override @Override
public void reveal(Path p) throws RevealFailedException { public void reveal(Path p) throws RevealFailedException {
var absPath = p.toAbsolutePath();
var fxApp = FxApplication.INSTANCE.get(); var fxApp = FxApplication.INSTANCE.get();
if (fxApp != null) { if (fxApp != null) {
fxApp.getHostServices().showDocument(p.toUri().toString()); // showDocument() launches the default app for a regular file, so reveal its parent directory instead
var target = Files.isRegularFile(absPath) ? absPath.getParent() : absPath;
fxApp.getHostServices().showDocument(target.toUri().toString());
} else { } else {
throw new RevealFailedException("JavaFX Application not initialized"); throw new RevealFailedException("JavaFX Application not initialized");
} }
@@ -90,7 +90,7 @@ public class Check {
SUCCEEDED, SUCCEEDED,
SKIPPED, SKIPPED,
ERROR, ERROR,
CANCELLED; CANCELLED
} }
ObservableList<Result> getResults() { ObservableList<Result> getResults() {
@@ -84,7 +84,7 @@ public class CheckListController implements FxController {
checks.filtered(c -> !c.isChosenForExecution()).forEach(c -> c.setState(Check.CheckState.SKIPPED)); checks.filtered(c -> !c.isChosenForExecution()).forEach(c -> c.setState(Check.CheckState.SKIPPED));
checkExecutor.executeBatch(chosenChecks); checkExecutor.executeBatch(chosenChecks);
checksListView.getSelectionModel().select(chosenChecks.get(0)); checksListView.getSelectionModel().select(chosenChecks.getFirst());
checksListView.refresh(); checksListView.refresh();
window.sizeToScene(); window.sizeToScene();
} }
@@ -6,6 +6,8 @@ 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;
import org.cryptomator.ui.controls.FontAwesome5Icon;
import org.cryptomator.ui.controls.FontAwesome5IconView;
import org.cryptomator.ui.keyloading.KeyLoading; import org.cryptomator.ui.keyloading.KeyLoading;
import org.cryptomator.ui.keyloading.KeyLoadingScoped; import org.cryptomator.ui.keyloading.KeyLoadingScoped;
import org.jetbrains.annotations.VisibleForTesting; import org.jetbrains.annotations.VisibleForTesting;
@@ -13,14 +15,24 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import javax.inject.Inject; import javax.inject.Inject;
import javafx.animation.PauseTransition;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty; import javafx.beans.property.StringProperty;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.scene.text.Text; import javafx.scene.control.Hyperlink;
import javafx.scene.text.TextFlow; import javafx.scene.control.Label;
import javafx.scene.control.Tooltip;
import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage; import javafx.stage.Stage;
import javafx.util.Duration;
import java.net.URI; import java.net.URI;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.Set; import java.util.Set;
@@ -35,7 +47,11 @@ public class CheckHostTrustController implements FxController {
private static final String CHECK_KEY = "hub.checkHostTrust.message.check"; private static final String CHECK_KEY = "hub.checkHostTrust.message.check";
private static final String ASK_SINGULAR_KEY = "hub.checkHostTrust.message.ask"; private static final String ASK_SINGULAR_KEY = "hub.checkHostTrust.message.ask";
private static final String ASK_PLURAL_KEY = "hub.checkHostTrust.message.ask.plural"; private static final String ASK_PLURAL_KEY = "hub.checkHostTrust.message.ask.plural";
private static final String DESCRIPTION_SINGULAR_KEY = "hub.checkHostTrust.description.ask";
private static final String DESCRIPTION_PLURAL_KEY = "hub.checkHostTrust.description.ask.plural";
private static final String COPY_TOOLTIP_KEY = "hub.checkHostTrust.copyBtn.tooltip";
private static final String TRUSTED_CRYPTOMATOR_CLOUD_DOMAIN = ".cryptomator.cloud"; private static final String TRUSTED_CRYPTOMATOR_CLOUD_DOMAIN = ".cryptomator.cloud";
private static final Duration COPIED_INDICATION_DURATION = Duration.seconds(2);
private final Stage window; private final Stage window;
private final HubConfig hubConfig; private final HubConfig hubConfig;
@@ -49,9 +65,10 @@ public class CheckHostTrustController implements FxController {
private final ResourceBundle resourceBundle; private final ResourceBundle resourceBundle;
private final SortedSet<String> hostnames; private final SortedSet<String> hostnames;
private final StringProperty messageLabel; private final StringProperty messageLabel;
private final StringProperty descriptionLabel;
@FXML @FXML
private TextFlow hostnamesFlow; private VBox hostnamesBox;
@Inject @Inject
public CheckHostTrustController(@KeyLoading Stage window, // public CheckHostTrustController(@KeyLoading Stage window, //
@@ -74,6 +91,7 @@ public class CheckHostTrustController implements FxController {
this.resourceBundle = resourceBundle; this.resourceBundle = resourceBundle;
this.hostnames = new TreeSet<>(); this.hostnames = new TreeSet<>();
this.messageLabel = new SimpleStringProperty(resourceBundle.getString(CHECK_KEY)); this.messageLabel = new SimpleStringProperty(resourceBundle.getString(CHECK_KEY));
this.descriptionLabel = new SimpleStringProperty("");
} }
@FXML @FXML
@@ -117,12 +135,41 @@ public class CheckHostTrustController implements FxController {
} }
private void renderHostnames() { private void renderHostnames() {
hostnamesFlow.getChildren().clear(); hostnamesBox.getChildren().clear();
for (var hostname : hostnames) { for (var hostname : hostnames) {
hostnamesFlow.getChildren().add(new Text(hostname + System.lineSeparator())); hostnamesBox.getChildren().add(createHostnameRow(hostname));
} }
var messageKey = hostnames.size() > 1 ? ASK_PLURAL_KEY : ASK_SINGULAR_KEY; var plural = hostnames.size() > 1;
messageLabel.set(resourceBundle.getString(messageKey)); messageLabel.set(resourceBundle.getString(plural ? ASK_PLURAL_KEY : ASK_SINGULAR_KEY));
descriptionLabel.set(resourceBundle.getString(plural ? DESCRIPTION_PLURAL_KEY : DESCRIPTION_SINGULAR_KEY));
}
private Node createHostnameRow(String hostname) {
var label = new Label(hostname);
label.setWrapText(true);
HBox.setHgrow(label, Priority.ALWAYS);
var icon = new FontAwesome5IconView();
icon.setGlyph(FontAwesome5Icon.COPY);
var copyLink = new Hyperlink(null, icon);
copyLink.setTooltip(new Tooltip(resourceBundle.getString(COPY_TOOLTIP_KEY)));
copyLink.setAccessibleText(resourceBundle.getString(COPY_TOOLTIP_KEY));
copyLink.setOnAction(_ -> copyToClipboard(hostname, icon));
var row = new HBox(6, label, copyLink);
row.setAlignment(Pos.CENTER_LEFT);
return row;
}
private void copyToClipboard(String hostname, FontAwesome5IconView icon) {
var clipboardContent = new ClipboardContent();
clipboardContent.putString(hostname);
Clipboard.getSystemClipboard().setContent(clipboardContent);
icon.setGlyph(FontAwesome5Icon.CHECK);
var resetIcon = new PauseTransition(COPIED_INDICATION_DURATION);
resetIcon.setOnFinished(_ -> icon.setGlyph(FontAwesome5Icon.COPY));
resetIcon.play();
} }
private boolean isConsistentHubConfig() { private boolean isConsistentHubConfig() {
@@ -176,4 +223,12 @@ public class CheckHostTrustController implements FxController {
return messageLabel.get(); return messageLabel.get();
} }
public StringProperty descriptionLabelProperty() {
return descriptionLabel;
}
public String getDescriptionLabel() {
return descriptionLabel.get();
}
} }
@@ -4,6 +4,7 @@ import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.recovery.RecoveryActionType; import org.cryptomator.common.recovery.RecoveryActionType;
import org.cryptomator.common.recovery.VaultPreparator; import org.cryptomator.common.recovery.VaultPreparator;
import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.vaults.NotAVaultDirectoryException;
import org.cryptomator.common.vaults.Vault; import org.cryptomator.common.vaults.Vault;
import org.cryptomator.common.vaults.VaultComponent; import org.cryptomator.common.vaults.VaultComponent;
import org.cryptomator.common.vaults.VaultListManager; import org.cryptomator.common.vaults.VaultListManager;
@@ -23,6 +24,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import javax.inject.Inject; import javax.inject.Inject;
import javafx.application.Platform;
import javafx.beans.binding.Bindings; import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding; import javafx.beans.binding.BooleanBinding;
import javafx.beans.property.BooleanProperty; import javafx.beans.property.BooleanProperty;
@@ -55,6 +57,7 @@ import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static org.cryptomator.common.Constants.CRYPTOMATOR_FILENAME_EXT; import static org.cryptomator.common.Constants.CRYPTOMATOR_FILENAME_EXT;
@@ -90,6 +93,7 @@ public class VaultListController implements FxController {
private final VaultComponent.Factory vaultComponentFactory; private final VaultComponent.Factory vaultComponentFactory;
private final RecoveryKeyComponent.Factory recoveryKeyWindow; private final RecoveryKeyComponent.Factory recoveryKeyWindow;
private final List<MountService> mountServices; private final List<MountService> mountServices;
private final ExecutorService executor;
public ListView<Vault> vaultList; public ListView<Vault> vaultList;
public StackPane root; public StackPane root;
@@ -113,7 +117,8 @@ public class VaultListController implements FxController {
RecoveryKeyComponent.Factory recoveryKeyWindow, // RecoveryKeyComponent.Factory recoveryKeyWindow, //
VaultComponent.Factory vaultComponentFactory, // VaultComponent.Factory vaultComponentFactory, //
List<MountService> mountServices, // List<MountService> mountServices, //
FxFSEventList fxFSEventList) { FxFSEventList fxFSEventList, //
ExecutorService executor) {
this.mainWindow = mainWindow; this.mainWindow = mainWindow;
this.vaults = vaults; this.vaults = vaults;
this.selectedVault = selectedVault; this.selectedVault = selectedVault;
@@ -127,6 +132,7 @@ public class VaultListController implements FxController {
this.recoveryKeyWindow = recoveryKeyWindow; this.recoveryKeyWindow = recoveryKeyWindow;
this.vaultComponentFactory = vaultComponentFactory; this.vaultComponentFactory = vaultComponentFactory;
this.mountServices = mountServices; this.mountServices = mountServices;
this.executor = executor;
this.emptyVaultList = Bindings.isEmpty(vaults); this.emptyVaultList = Bindings.isEmpty(vaults);
this.unreadEvents = fxFSEventList.unreadEventsProperty(); this.unreadEvents = fxFSEventList.unreadEventsProperty();
@@ -147,7 +153,7 @@ public class VaultListController implements FxController {
vaults.addListener((ListChangeListener.Change<? extends Vault> c) -> { vaults.addListener((ListChangeListener.Change<? extends Vault> c) -> {
while (c.next()) { while (c.next()) {
if (c.wasAdded()) { if (c.wasAdded()) {
Vault anyAddedVault = c.getAddedSubList().get(0); Vault anyAddedVault = c.getAddedSubList().getFirst();
vaultList.getSelectionModel().select(anyAddedVault); vaultList.getSelectionModel().select(anyAddedVault);
} }
} }
@@ -324,15 +330,18 @@ public class VaultListController implements FxController {
} }
private void addVault(Path pathToVault) { private void addVault(Path pathToVault) {
try { Path target = pathToVault.getFileName().toString().endsWith(CRYPTOMATOR_FILENAME_EXT) ? pathToVault.getParent() : pathToVault;
if (pathToVault.getFileName().toString().endsWith(CRYPTOMATOR_FILENAME_EXT)) { executor.execute(() -> {
vaultListManager.add(pathToVault.getParent()); try {
} else { vaultListManager.add(target);
vaultListManager.add(pathToVault); } catch (NotAVaultDirectoryException e) {
LOG.warn("Cannot add {}: {}", target, e.getMessage());
Platform.runLater(() -> dialogs.prepareNotAVaultDirectoryDialog(mainWindow, e).build().showAndWait());
} catch (IOException e) {
LOG.warn("Failed to add vault {}", target, e);
Platform.runLater(() -> appWindows.showErrorWindow(e, mainWindow, null));
} }
} catch (IOException e) { });
LOG.debug("Not a vault: {}", pathToVault);
}
} }
@FXML @FXML
@@ -217,7 +217,7 @@ public class RecoveryKeyValidateController implements FxController {
/** /**
* Recovery key is not a valid key. * Recovery key is not a valid key.
*/ */
INVALID; INVALID
} }
} }
@@ -140,9 +140,9 @@ public class VaultStatisticsController implements FxController {
long allTimeMaxAccessedFiles = Arrays.stream(maxAccessBuf).max().orElse(0L); long allTimeMaxAccessedFiles = Arrays.stream(maxAccessBuf).max().orElse(0L);
// remove oldest value: // remove oldest value:
decryptedBytesRead.getData().remove(0); decryptedBytesRead.getData().removeFirst();
encryptedBytesWrite.getData().remove(0); encryptedBytesWrite.getData().removeFirst();
accessedFiles.getData().remove(0); accessedFiles.getData().removeFirst();
// add latest value: // add latest value:
decryptedBytesRead.getData().add(new Data<>(currentStep, decBytes)); decryptedBytesRead.getData().add(new Data<>(currentStep, decBytes));
@@ -110,7 +110,7 @@ public class UnlockInvalidMountPointController implements FxController {
//TODO Add option to show filesystem, e.g. for ExceptionType.HIDEAWAY_EXISTS //TODO Add option to show filesystem, e.g. for ExceptionType.HIDEAWAY_EXISTS
SHOW_PREFERENCES, SHOW_PREFERENCES,
SHOW_VAULT_OPTIONS; SHOW_VAULT_OPTIONS
} }
+15
View File
@@ -20,6 +20,10 @@
src: url('firacode_regular.ttf'); src: url('firacode_regular.ttf');
} }
@font-face {
src: url('AtkinsonHyperlegibleMono-Regular.ttf');
}
/******************************************************************************* /*******************************************************************************
* * * *
* Root Styling & Colors * * Root Styling & Colors *
@@ -141,6 +145,17 @@
-fx-font-size: 1.1em; -fx-font-size: 1.1em;
} }
.hostname-list {
-fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BG_NORMAL;
-fx-background-insets: 0, 1px;
-fx-background-radius: 4px;
-fx-padding: 6px 8px 6px 8px;
}
.hostname-list .label {
-fx-font-family: 'Atkinson Hyperlegible Mono';
}
/******************************************************************************* /*******************************************************************************
* * * *
* Glyph Icons * * Glyph Icons *
+15
View File
@@ -20,6 +20,10 @@
src: url('firacode_regular.ttf'); src: url('firacode_regular.ttf');
} }
@font-face {
src: url('AtkinsonHyperlegibleMono-Regular.ttf');
}
/******************************************************************************* /*******************************************************************************
* * * *
* Root Styling & Colors * * Root Styling & Colors *
@@ -141,6 +145,17 @@
-fx-font-size: 1.1em; -fx-font-size: 1.1em;
} }
.hostname-list {
-fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BG_NORMAL;
-fx-background-insets: 0, 1px;
-fx-background-radius: 4px;
-fx-padding: 6px 8px 6px 8px;
}
.hostname-list .label {
-fx-font-family: 'Atkinson Hyperlegible Mono';
}
/******************************************************************************* /*******************************************************************************
* * * *
* Glyph Icons * * Glyph Icons *
@@ -11,12 +11,11 @@
<?import javafx.scene.layout.StackPane?> <?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.Circle?> <?import javafx.scene.shape.Circle?>
<?import javafx.scene.text.TextFlow?>
<HBox xmlns:fx="http://javafx.com/fxml" <HBox xmlns:fx="http://javafx.com/fxml"
xmlns="http://javafx.com/javafx" xmlns="http://javafx.com/javafx"
fx:controller="org.cryptomator.ui.keyloading.hub.CheckHostTrustController" fx:controller="org.cryptomator.ui.keyloading.hub.CheckHostTrustController"
minWidth="400" minWidth="450"
maxWidth="400" maxWidth="450"
minHeight="145" minHeight="145"
spacing="12" spacing="12"
alignment="TOP_LEFT" alignment="TOP_LEFT"
@@ -34,13 +33,15 @@
<FontAwesome5IconView styleClass="glyph-icon-white" glyph="QUESTION" glyphSize="24"/> <FontAwesome5IconView styleClass="glyph-icon-white" glyph="QUESTION" glyphSize="24"/>
</StackPane> </StackPane>
</Group> </Group>
<VBox HBox.hgrow="ALWAYS"> <VBox HBox.hgrow="ALWAYS" spacing="6">
<Label styleClass="label-large" text="${controller.messageLabel}" wrapText="true" textAlignment="LEFT"> <Label styleClass="label-large" text="${controller.messageLabel}" wrapText="true" textAlignment="LEFT">
<padding> <padding>
<Insets bottom="6" top="6"/> <Insets bottom="6" top="6"/>
</padding> </padding>
</Label> </Label>
<TextFlow fx:id="hostnamesFlow" styleClass="text-flow" minHeight="60"/> <Label text="${controller.descriptionLabel}" wrapText="true" textAlignment="LEFT" visible="${!controller.descriptionLabel.empty}" managed="${!controller.descriptionLabel.empty}"/>
<!-- The box is filled in the controller, see createHostNamesRow() -->
<VBox fx:id="hostnamesBox" styleClass="hostname-list" spacing="4" visible="${!controller.descriptionLabel.empty}" managed="${!controller.descriptionLabel.empty}"/>
<Region VBox.vgrow="ALWAYS" minHeight="18"/> <Region VBox.vgrow="ALWAYS" minHeight="18"/>
<ButtonBar buttonMinWidth="120" buttonOrder="+CX"> <ButtonBar buttonMinWidth="120" buttonOrder="+CX">
<buttons> <buttons>
@@ -110,6 +110,13 @@ addvaultwizard.existing.restore=Restore…
addvaultwizard.existing.chooseBtn=Choose… addvaultwizard.existing.chooseBtn=Choose…
addvaultwizard.existing.filePickerTitle=Select Vault File addvaultwizard.existing.filePickerTitle=Select Vault File
addvaultwizard.existing.filePickerMimeDesc=Cryptomator Vault addvaultwizard.existing.filePickerMimeDesc=Cryptomator Vault
addvaultwizard.existing.notAVault.title=Not a Vault
addvaultwizard.existing.notAVault.message=The selected folder is not a Cryptomator vault
addvaultwizard.existing.notAVault.description.missingDataDir=The required "d" subdirectory is missing inside "%s".
addvaultwizard.existing.notAVault.description.dataNotADirectory=The "d" entry inside "%s" is not a directory.
addvaultwizard.existing.notAVault.description.missingVaultConfig=The required "vault.cryptomator" file is missing inside "%s".
addvaultwizard.existing.notAVault.description.vaultConfigAccessDenied=File "vault.cryptomator" inside "%s" cannot be read due to insufficient access rights.
addvaultwizard.existing.notAVault.description.unsupportedStructure=The directory structure of "%s" is not supported.
## Success ## Success
addvaultwizard.success.nextStepsInstructions=Added vault "%s".\nYou need to unlock this vault to access or add contents. Alternatively you can unlock it at any later point in time. addvaultwizard.success.nextStepsInstructions=Added vault "%s".\nYou need to unlock this vault to access or add contents. Alternatively you can unlock it at any later point in time.
addvaultwizard.success.unlockNow=Unlock Now addvaultwizard.success.unlockNow=Unlock Now
@@ -166,6 +173,9 @@ hub.noKeychain.openBtn=Open Preferences
hub.checkHostTrust.message.check=Checking Configuration… hub.checkHostTrust.message.check=Checking Configuration…
hub.checkHostTrust.message.ask=Trust this host? hub.checkHostTrust.message.ask=Trust this host?
hub.checkHostTrust.message.ask.plural=Trust these hosts? hub.checkHostTrust.message.ask.plural=Trust these hosts?
hub.checkHostTrust.description.ask=Cryptomator does not recognize this host. To unlock the vault, it needs to be trusted. Only trust it if you recognize the address below.
hub.checkHostTrust.description.ask.plural=Cryptomator does not recognize these hosts. To unlock the vault, they need to be trusted. Only trust them if you recognize the addresses below.
hub.checkHostTrust.copyBtn.tooltip=Copy address to clipboard
hub.checkHostTrust.trustBtn=Trust hub.checkHostTrust.trustBtn=Trust
hub.checkHostTrust.denyBtn=Deny hub.checkHostTrust.denyBtn=Deny
### Waiting ### Waiting
@@ -32,6 +32,7 @@
## Success ## Success
## Failure ## Failure
## Hub ## Hub
### Check Host Authenticity
### Waiting ### Waiting
### Receive Key ### Receive Key
### Register Device ### Register Device
@@ -40,6 +41,7 @@
### Registration Failed ### Registration Failed
### Archived ### Archived
### Unauthorized ### Unauthorized
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
### License Exceeded ### License Exceeded
@@ -154,4 +156,4 @@
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
@@ -154,6 +154,8 @@ unlock.error.title=فشل فتح "%s"
hub.noKeychain.message=غير قادر على الوصول إلى مفتاح الجهاز hub.noKeychain.message=غير قادر على الوصول إلى مفتاح الجهاز
hub.noKeychain.description=من أجل فتح مركز مخازن، مطلوب مفتاح جهاز، يتم تأمينه باستخدام سلسلة مفاتيح. للمضي قدما، قم بتمكين "%s" واختر سلسلة مفاتيح في التفضيلات. hub.noKeychain.description=من أجل فتح مركز مخازن، مطلوب مفتاح جهاز، يتم تأمينه باستخدام سلسلة مفاتيح. للمضي قدما، قم بتمكين "%s" واختر سلسلة مفاتيح في التفضيلات.
hub.noKeychain.openBtn=فتح التفضيلات hub.noKeychain.openBtn=فتح التفضيلات
### Check Host Authenticity
hub.checkHostTrust.trustBtn=ثق
### Waiting ### Waiting
hub.auth.message=جاري الانتظار للمصادقة… hub.auth.message=جاري الانتظار للمصادقة…
hub.auth.description=يجب أن يتم إعادة توجيهك تلقائياً إلى صفحة تسجيل الدخول. hub.auth.description=يجب أن يتم إعادة توجيهك تلقائياً إلى صفحة تسجيل الدخول.
@@ -183,6 +185,7 @@ hub.registerFailed.description.deviceAlreadyExists=هذا الجهاز مسجل
### Unauthorized ### Unauthorized
hub.unauthorized.message=تم رفض الوصول hub.unauthorized.message=تم رفض الوصول
hub.unauthorized.description=غير مسموح لك بفتح هذا المستودع. اتصل بمالك المستودع لطلب الوصول. hub.unauthorized.description=غير مسموح لك بفتح هذا المستودع. اتصل بمالك المستودع لطلب الوصول.
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=مطلوب اتخاذ إجراء hub.requireAccountInit.message=مطلوب اتخاذ إجراء
hub.requireAccountInit.description.0=للمتابعة، يرجى إكمال الخطوات المطلوبة في hub.requireAccountInit.description.0=للمتابعة، يرجى إكمال الخطوات المطلوبة في
@@ -645,4 +648,4 @@ eventView.entry.inUse.showEncrypted=عرض ملَف المشفر
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
@@ -151,6 +151,8 @@ unlock.error.title="%s" биге асылманы
hub.noKeychain.message=Йыһаз асҡысына инеү рөхсәте юҡ hub.noKeychain.message=Йыһаз асҡысына инеү рөхсәте юҡ
hub.noKeychain.description=Хаб һаҡлағыстарын асыу өсөн йыһаз асҡысы кәрәк, ул иһә асҡыс сылбырында һаҡлана. Артабан “%s” мөмкинлеге бирегеҙ һәм көйләүҙәрҙә асҡыс сылбырын һайлағыҙ. hub.noKeychain.description=Хаб һаҡлағыстарын асыу өсөн йыһаз асҡысы кәрәк, ул иһә асҡыс сылбырында һаҡлана. Артабан “%s” мөмкинлеге бирегеҙ һәм көйләүҙәрҙә асҡыс сылбырын һайлағыҙ.
hub.noKeychain.openBtn=Көйләүҙәрҙе ас hub.noKeychain.openBtn=Көйләүҙәрҙе ас
### Check Host Authenticity
hub.checkHostTrust.trustBtn=Ышан
### Waiting ### Waiting
hub.auth.message=Аутентиклау көтөлә… hub.auth.message=Аутентиклау көтөлә…
hub.auth.description=Автоматик рәүештә инеү битенә йүнәлтелергә тейешһегеҙ. hub.auth.description=Автоматик рәүештә инеү битенә йүнәлтелергә тейешһегеҙ.
@@ -170,6 +172,7 @@ hub.registerSuccess.unlockBtn=Биген ас
### Archived ### Archived
### Unauthorized ### Unauthorized
hub.unauthorized.message=Инеү кире ҡағылды hub.unauthorized.message=Инеү кире ҡағылды
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Эш-хәрәкәт кәрәкле hub.requireAccountInit.message=Эш-хәрәкәт кәрәкле
hub.requireAccountInit.description.0=Дауам итер өсөн, кәрәкле аҙымдар тамамланырға тейеш урын: hub.requireAccountInit.description.0=Дауам итер өсөн, кәрәкле аҙымдар тамамланырға тейеш урын:
@@ -555,4 +558,4 @@ dokanySupportEnd.preferencesBtn=Көйләүҙәрҙе ас
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
@@ -145,6 +145,7 @@ unlock.error.customPath.description.inUse=Дыскавая літара або
hub.noKeychain.message=Няма доступу да ключа прылады hub.noKeychain.message=Няма доступу да ключа прылады
hub.noKeychain.description=Каб разамкнуць скарбніцы Hub, патрэбны ключ прылады, які захаваны ў звязку ключоў. Каб працягнуць, уключы "%s" ды абяры звязак ключоў у наладах. hub.noKeychain.description=Каб разамкнуць скарбніцы Hub, патрэбны ключ прылады, які захаваны ў звязку ключоў. Каб працягнуць, уключы "%s" ды абяры звязак ключоў у наладах.
hub.noKeychain.openBtn=Адчыніць налады hub.noKeychain.openBtn=Адчыніць налады
### Check Host Authenticity
### Waiting ### Waiting
hub.auth.message=Чаканне спраўджання… hub.auth.message=Чаканне спраўджання…
hub.auth.description=Ты мусіш аўтаматычна перанакіравацца на старонку ўваходу. hub.auth.description=Ты мусіш аўтаматычна перанакіравацца на старонку ўваходу.
@@ -162,6 +163,7 @@ hub.registerSuccess.unlockBtn=Адамкнуць
### Archived ### Archived
### Unauthorized ### Unauthorized
hub.unauthorized.message=Адмова ў доступе hub.unauthorized.message=Адмова ў доступе
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
### License Exceeded ### License Exceeded
hub.invalidLicense.message=Несапраўдная ліцэнзія Hub hub.invalidLicense.message=Несапраўдная ліцэнзія Hub
@@ -532,4 +534,4 @@ dokanySupportEnd.preferencesBtn=Адчыніць налады
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
@@ -158,6 +158,7 @@ unlock.error.title=Неуспешно отключване на „%s“
hub.noKeychain.message=Няма достъп до ключа на устройството hub.noKeychain.message=Няма достъп до ключа на устройството
hub.noKeychain.description=За да отключите хранилищата в Hub е необходим ключ за устройството, който се защитава с помощта на ключодържател. За да продължите, разрешете „%s“ и изберете ключодържателя в настройките. hub.noKeychain.description=За да отключите хранилищата в Hub е необходим ключ за устройството, който се защитава с помощта на ключодържател. За да продължите, разрешете „%s“ и изберете ключодържателя в настройките.
hub.noKeychain.openBtn=Към настройките hub.noKeychain.openBtn=Към настройките
### Check Host Authenticity
### Waiting ### Waiting
hub.auth.message=Изчакване на удостоверяване… hub.auth.message=Изчакване на удостоверяване…
hub.auth.description=Автоматично ще бъдете пренасочени към страницата за вход. hub.auth.description=Автоматично ще бъдете пренасочени към страницата за вход.
@@ -177,6 +178,7 @@ hub.registerSuccess.unlockBtn=Отключване
### Archived ### Archived
### Unauthorized ### Unauthorized
hub.unauthorized.message=Отказан достъп hub.unauthorized.message=Отказан достъп
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Необходимо е действие hub.requireAccountInit.message=Необходимо е действие
hub.requireAccountInit.description.0=За да продължите завършете необходимите стъпки в hub.requireAccountInit.description.0=За да продължите завършете необходимите стъпки в
@@ -563,4 +565,4 @@ dokanySupportEnd.preferencesBtn=Към настройките
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
@@ -92,6 +92,7 @@ unlock.unlockBtn=আনলক করুন
## Success ## Success
## Failure ## Failure
## Hub ## Hub
### Check Host Authenticity
### Waiting ### Waiting
### Receive Key ### Receive Key
### Register Device ### Register Device
@@ -101,6 +102,7 @@ hub.registerSuccess.unlockBtn=আনলক করুন
### Registration Failed ### Registration Failed
### Archived ### Archived
### Unauthorized ### Unauthorized
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
### License Exceeded ### License Exceeded
@@ -221,4 +223,4 @@ vaultOptions.mount.mountPoint.directoryPickerButton=নির্বাচন ক
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
@@ -104,6 +104,8 @@ unlock.success.rememberChoice=Zapamtite izbor, ne pokazujte ovo ponovo
unlock.success.revealBtn=Otkrij pogon unlock.success.revealBtn=Otkrij pogon
## Failure ## Failure
## Hub ## Hub
### Check Host Authenticity
hub.checkHostTrust.trustBtn=Povjerenje
### Waiting ### Waiting
### Receive Key ### Receive Key
### Register Device ### Register Device
@@ -113,6 +115,7 @@ hub.registerSuccess.unlockBtn=Otključaj
### Registration Failed ### Registration Failed
### Archived ### Archived
### Unauthorized ### Unauthorized
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
### License Exceeded ### License Exceeded
@@ -356,4 +359,4 @@ quit.lockAndQuitBtn=Zaključaj i zatvori
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
@@ -155,6 +155,8 @@ unlock.error.title=El desblocatge de "%s" ha fallat
hub.noKeychain.message=No es pot accedir a la clau del dispositiu hub.noKeychain.message=No es pot accedir a la clau del dispositiu
hub.noKeychain.description=Per poder desblocar caixes fortes del Hub es requereix la clau d'un dispositiu, que s'emmagatzema de forma segura en un clauer. Per continuar, habiliti "%s" i seleccioni un clauer en les Preferències. hub.noKeychain.description=Per poder desblocar caixes fortes del Hub es requereix la clau d'un dispositiu, que s'emmagatzema de forma segura en un clauer. Per continuar, habiliti "%s" i seleccioni un clauer en les Preferències.
hub.noKeychain.openBtn=Obrir les Preferències hub.noKeychain.openBtn=Obrir les Preferències
### Check Host Authenticity
hub.checkHostTrust.trustBtn=Confia-hi
### Waiting ### Waiting
hub.auth.message=Sestà esperant lautenticació… hub.auth.message=Sestà esperant lautenticació…
hub.auth.description=Hauríeu de ser redirigits a la pàgina d'accés. hub.auth.description=Hauríeu de ser redirigits a la pàgina d'accés.
@@ -184,6 +186,7 @@ hub.registerFailed.description.deviceAlreadyExists=El dispositiu ja ha estat reg
### Unauthorized ### Unauthorized
hub.unauthorized.message=Accés denegat hub.unauthorized.message=Accés denegat
hub.unauthorized.description=No estàs autoritzat a obrir aquesta caixa forta. Contacta amb el seu propietari per obtenir accés. hub.unauthorized.description=No estàs autoritzat a obrir aquesta caixa forta. Contacta amb el seu propietari per obtenir accés.
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Acció necessària hub.requireAccountInit.message=Acció necessària
hub.requireAccountInit.description.0=Per a continuar, si us plau, seguiu els passos necessaris en el vostre hub.requireAccountInit.description.0=Per a continuar, si us plau, seguiu els passos necessaris en el vostre
@@ -611,4 +614,4 @@ shareVault.hub.openHub=Obre Cryptomator Hub
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
@@ -150,6 +150,8 @@ unlock.error.title=Odemknutí "%s" selhalo
hub.noKeychain.message=Nelze získat přístup ke klíči zařízení hub.noKeychain.message=Nelze získat přístup ke klíči zařízení
hub.noKeychain.description=Chcete-li odemknout Hub trezory, je potřeba použít klíč zařízení, který je zabezpečen pomocí klíčenky. Chcete-li pokračovat, povolte „%s“ a vyberte klíčenku v nastavení. hub.noKeychain.description=Chcete-li odemknout Hub trezory, je potřeba použít klíč zařízení, který je zabezpečen pomocí klíčenky. Chcete-li pokračovat, povolte „%s“ a vyberte klíčenku v nastavení.
hub.noKeychain.openBtn=Otevřít předvolby hub.noKeychain.openBtn=Otevřít předvolby
### Check Host Authenticity
hub.checkHostTrust.trustBtn=Důvěřovat
### Waiting ### Waiting
hub.auth.message=Čekání na ověření… hub.auth.message=Čekání na ověření…
hub.auth.description=Měli byste být automaticky přesměrováni na přihlašovací stránku. hub.auth.description=Měli byste být automaticky přesměrováni na přihlašovací stránku.
@@ -178,6 +180,7 @@ hub.registerFailed.description.deviceAlreadyExists=Toto zařízení je již regi
### Archived ### Archived
### Unauthorized ### Unauthorized
hub.unauthorized.message=Přístup odepřen hub.unauthorized.message=Přístup odepřen
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Požadována akce hub.requireAccountInit.message=Požadována akce
hub.requireAccountInit.description.0=Chcete-li pokračovat, vyplňte prosím požadované kroky ve vašem hub.requireAccountInit.description.0=Chcete-li pokračovat, vyplňte prosím požadované kroky ve vašem
@@ -572,4 +575,4 @@ shareVault.hub.openHub=Otevřít Cryptomator Hub
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
+18 -1
View File
@@ -109,6 +109,13 @@ addvaultwizard.existing.restore=Gendan…
addvaultwizard.existing.chooseBtn=Vælg… addvaultwizard.existing.chooseBtn=Vælg…
addvaultwizard.existing.filePickerTitle=Vælg boks-fil addvaultwizard.existing.filePickerTitle=Vælg boks-fil
addvaultwizard.existing.filePickerMimeDesc=Cryptomator boks addvaultwizard.existing.filePickerMimeDesc=Cryptomator boks
addvaultwizard.existing.notAVault.title=Ikke en boks
addvaultwizard.existing.notAVault.message=Den valgte mappe skal være en gyldig Cryptomator boks
addvaultwizard.existing.notAVault.description.missingDataDir=Den krævede "d" undermappe mangler inde i "%s".
addvaultwizard.existing.notAVault.description.dataNotADirectory=Indgangen "d" inde i "%s" er ikke en mappe.
addvaultwizard.existing.notAVault.description.missingVaultConfig=Den påkrævede "vault.cryptomator"-fil mangler inde i "%s".
addvaultwizard.existing.notAVault.description.vaultConfigAccessDenied=Filen "vault.cryptomator" inde i "%s" kan ikke læses på grund af utilstrækkelige adgangsrettigheder.
addvaultwizard.existing.notAVault.description.unsupportedStructure=Mappestrukturen for "%s" understøttes ikke.
## Success ## Success
addvaultwizard.success.nextStepsInstructions=Tilføjede boks "%s".\nDu skal låse op for denne boks for at tilgå indholdet. Alternativt kan du låse den op på et senere tidspunkt. addvaultwizard.success.nextStepsInstructions=Tilføjede boks "%s".\nDu skal låse op for denne boks for at tilgå indholdet. Alternativt kan du låse den op på et senere tidspunkt.
addvaultwizard.success.unlockNow=Lås op nu addvaultwizard.success.unlockNow=Lås op nu
@@ -161,6 +168,12 @@ unlock.error.title=Oplåsning af "%s" mislykkedes
hub.noKeychain.message=Kan ikke tilgå enhedsnøgle hub.noKeychain.message=Kan ikke tilgå enhedsnøgle
hub.noKeychain.description=En enhedsnøgle er påkrævet for at låse Hub bokse op. Enhedsnøglen er sikret i en nøglering. For at fortsætte, aktivér “%s” og vælg en nøglering i indstillingerne. hub.noKeychain.description=En enhedsnøgle er påkrævet for at låse Hub bokse op. Enhedsnøglen er sikret i en nøglering. For at fortsætte, aktivér “%s” og vælg en nøglering i indstillingerne.
hub.noKeychain.openBtn=Åbn Indstillinger hub.noKeychain.openBtn=Åbn Indstillinger
### Check Host Authenticity
hub.checkHostTrust.message.check=Kontrollerer konfiguration…
hub.checkHostTrust.message.ask=Stol på denne vært?
hub.checkHostTrust.message.ask.plural=Stol på disse værter?
hub.checkHostTrust.trustBtn=Hav tillid
hub.checkHostTrust.denyBtn=Afvis
### Waiting ### Waiting
hub.auth.message=Afventer godkendelse… hub.auth.message=Afventer godkendelse…
hub.auth.description=Du burde automatisk blive omdirigeret til login-siden. hub.auth.description=Du burde automatisk blive omdirigeret til login-siden.
@@ -192,6 +205,9 @@ hub.archived.description=Denne boks er blevet arkiveret og er ikke længere tilg
### Unauthorized ### Unauthorized
hub.unauthorized.message=Adgang nægtet hub.unauthorized.message=Adgang nægtet
hub.unauthorized.description=Du har ikke tilladelse til at åbne denne boks. Kontant ejeren af boksen for at anmode om adgang. hub.unauthorized.description=Du har ikke tilladelse til at åbne denne boks. Kontant ejeren af boksen for at anmode om adgang.
### Untrusted Host
hub.untrustedHost.message=Vært Ikke pålidelig
hub.untrustedHost.description=Forbindelsen til Hub blev blokeret for din sikkerhed. Hvis du mener, at Hub-værten er sikker, så kontakt din Hub-administrator eller prøv igen.
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Handling påkrævet hub.requireAccountInit.message=Handling påkrævet
hub.requireAccountInit.description.0=For at fortsætte, skal du fuldføre de nødvendige trin i din hub.requireAccountInit.description.0=For at fortsætte, skal du fuldføre de nødvendige trin i din
@@ -305,6 +321,7 @@ preferences.general.debugDirectory=Vis logfiler
preferences.general.autoStart=Start Cryptomator automatisk ved opstart preferences.general.autoStart=Start Cryptomator automatisk ved opstart
preferences.general.keychainBackend=Gem adgangskoder med preferences.general.keychainBackend=Gem adgangskoder med
preferences.general.quickAccessService=Tilføj oplåste bokse til området hurtig adgang preferences.general.quickAccessService=Tilføj oplåste bokse til området hurtig adgang
preferences.general.resetTrustedHosts=Nulstil betroede værter
## Interface ## Interface
preferences.interface=Brugerflade preferences.interface=Brugerflade
preferences.interface.theme=Udseende preferences.interface.theme=Udseende
@@ -716,4 +733,4 @@ eventView.entry.inUse.ignoreLock=Ignorér anvendelsesstatus
## FileIsInUse Notification ## FileIsInUse Notification
notification.inUse.message=Filen er i brug på en anden enhed notification.inUse.message=Filen er i brug på en anden enhed
notification.inUse.description=Filen er åbnet af %s på %s. Bed dem om at lukke filen og lade synkroniseringen afslutte. Du kan ignorere status for at åbne den nu, men det kan forårsage konflikter eller overskrive nyere ændringer. notification.inUse.description=Filen er åbnet af %s på %s. Bed dem om at lukke filen og lade synkroniseringen afslutte. Du kan ignorere status for at åbne den nu, men det kan forårsage konflikter eller overskrive nyere ændringer.
notification.inUse.action=Ignorér anvendelsesstatus notification.inUse.action=Ignorér anvendelsesstatus
@@ -104,6 +104,7 @@ addvaultwizard.existing.restore=Wiederherstellen…
addvaultwizard.existing.chooseBtn=Durchsuchen … addvaultwizard.existing.chooseBtn=Durchsuchen …
addvaultwizard.existing.filePickerTitle=Tresordatei auswählen addvaultwizard.existing.filePickerTitle=Tresordatei auswählen
addvaultwizard.existing.filePickerMimeDesc=Cryptomator-Tresor addvaultwizard.existing.filePickerMimeDesc=Cryptomator-Tresor
addvaultwizard.existing.notAVault.description.unsupportedStructure=Die Verzeichnisstruktur von "%s" wird nicht unterstützt.
## Success ## Success
addvaultwizard.success.nextStepsInstructions=Tresor „%s“ wurde hinzugefügt.\nUm auf Inhalte zuzugreifen oder welche hinzuzufügen, musst du den Tresor entsperren. Du kannst ihn aber auch zu jedem späteren Zeitpunkt entsperren. addvaultwizard.success.nextStepsInstructions=Tresor „%s“ wurde hinzugefügt.\nUm auf Inhalte zuzugreifen oder welche hinzuzufügen, musst du den Tresor entsperren. Du kannst ihn aber auch zu jedem späteren Zeitpunkt entsperren.
addvaultwizard.success.unlockNow=Jetzt entsperren addvaultwizard.success.unlockNow=Jetzt entsperren
@@ -156,6 +157,8 @@ unlock.error.title=„%s“ konnte nicht entsperrt werden
hub.noKeychain.message=Zugriff auf Geräteschlüssel nicht möglich hub.noKeychain.message=Zugriff auf Geräteschlüssel nicht möglich
hub.noKeychain.description=Zum Entsperren von Hub-Tresoren wird ein Geräteschlüssel benötigt, der in einem Schlüsselbund gesichert ist. Um fortzufahren, aktiviere „%s“ und wähle in den Einstellungen einen Schlüsselbund. hub.noKeychain.description=Zum Entsperren von Hub-Tresoren wird ein Geräteschlüssel benötigt, der in einem Schlüsselbund gesichert ist. Um fortzufahren, aktiviere „%s“ und wähle in den Einstellungen einen Schlüsselbund.
hub.noKeychain.openBtn=Einstellungen öffnen hub.noKeychain.openBtn=Einstellungen öffnen
### Check Host Authenticity
hub.checkHostTrust.trustBtn=Vertrauen
### Waiting ### Waiting
hub.auth.message=Warten auf Authentifizierung … hub.auth.message=Warten auf Authentifizierung …
hub.auth.description=Du solltest automatisch zur Anmeldeseite weitergeleitet werden. hub.auth.description=Du solltest automatisch zur Anmeldeseite weitergeleitet werden.
@@ -187,6 +190,7 @@ hub.archived.description=Dieser Tresor wurde archiviert, daher ist ein Zugriff d
### Unauthorized ### Unauthorized
hub.unauthorized.message=Zugriff verweigert hub.unauthorized.message=Zugriff verweigert
hub.unauthorized.description=Du bist nicht berechtigt, diesen Tresor zu öffnen. Wende dich an den Tresoreigentümer, um Zugriff zu erhalten. hub.unauthorized.description=Du bist nicht berechtigt, diesen Tresor zu öffnen. Wende dich an den Tresoreigentümer, um Zugriff zu erhalten.
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Aktion erforderlich hub.requireAccountInit.message=Aktion erforderlich
hub.requireAccountInit.description.0=Um fortzufahren, führe bitte die erforderlichen Schritte in deinem hub.requireAccountInit.description.0=Um fortzufahren, führe bitte die erforderlichen Schritte in deinem
@@ -298,6 +302,7 @@ preferences.general.debugDirectory=Protokolldateien anzeigen
preferences.general.autoStart=Cryptomator beim Systemstart starten preferences.general.autoStart=Cryptomator beim Systemstart starten
preferences.general.keychainBackend=Passwörter speichern mit preferences.general.keychainBackend=Passwörter speichern mit
preferences.general.quickAccessService=Entsperrte Tresore zum Schnellzugriff hinzufügen preferences.general.quickAccessService=Entsperrte Tresore zum Schnellzugriff hinzufügen
preferences.general.resetTrustedHosts=Vertrauenswürdige Hosts zurücksetzen
## Interface ## Interface
preferences.interface=Benutzeroberfläche preferences.interface=Benutzeroberfläche
preferences.interface.theme=Erscheinungsbild preferences.interface.theme=Erscheinungsbild
@@ -701,4 +706,4 @@ eventView.entry.inUse.copyUserAndDevice=Benutzer- und Gerätenamen der Sperre ko
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
notification.inUse.action=Verwendungsstatus ignorieren notification.inUse.action=Verwendungsstatus ignorieren
@@ -154,6 +154,8 @@ unlock.error.title=Ξεκλείδωμα "%s" απέτυχε
hub.noKeychain.message=Δεν είναι δυνατή η πρόσβαση στο κλειδί της συσκευής hub.noKeychain.message=Δεν είναι δυνατή η πρόσβαση στο κλειδί της συσκευής
hub.noKeychain.description=Για να ξεκλειδώσετε τις κρύπτες Hub, απαιτείται ένα κλειδί συσκευής, το οποίο ασφαλίζεται με χρήση μπρελόκ. Για να συνεχίσετε, ενεργοποιήστε το "%s" και επιλέξτε ένα keychain στις προτιμήσεις. hub.noKeychain.description=Για να ξεκλειδώσετε τις κρύπτες Hub, απαιτείται ένα κλειδί συσκευής, το οποίο ασφαλίζεται με χρήση μπρελόκ. Για να συνεχίσετε, ενεργοποιήστε το "%s" και επιλέξτε ένα keychain στις προτιμήσεις.
hub.noKeychain.openBtn=Άνοιγμα Προτιμήσεων hub.noKeychain.openBtn=Άνοιγμα Προτιμήσεων
### Check Host Authenticity
hub.checkHostTrust.trustBtn=Εμπιστευτείτε
### Waiting ### Waiting
hub.auth.message=Αναμονή για επαλήθευση… hub.auth.message=Αναμονή για επαλήθευση…
hub.auth.description=Θα πρέπει να ανακατευθυνθείτε αυτόματα στη σελίδα σύνδεσης. hub.auth.description=Θα πρέπει να ανακατευθυνθείτε αυτόματα στη σελίδα σύνδεσης.
@@ -183,6 +185,7 @@ hub.registerFailed.description.deviceAlreadyExists=Αυτή η συσκευή ε
### Unauthorized ### Unauthorized
hub.unauthorized.message=Δεν επιτρέπεται η πρόσβαση hub.unauthorized.message=Δεν επιτρέπεται η πρόσβαση
hub.unauthorized.description=Δεν είστε εξουσιοδοτημένοι να ανοίξετε αυτή την κρύπτη. Επικοινωνήστε με τον ιδιοκτήτη τς κρύπτης για να ζητήσετε πρόσβαση. hub.unauthorized.description=Δεν είστε εξουσιοδοτημένοι να ανοίξετε αυτή την κρύπτη. Επικοινωνήστε με τον ιδιοκτήτη τς κρύπτης για να ζητήσετε πρόσβαση.
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Απαιτείται ενέργεια hub.requireAccountInit.message=Απαιτείται ενέργεια
hub.requireAccountInit.description.0=Για να συνεχίσετε, παρακαλούμε ολοκληρώστε τα βήματα που απαιτούνται στο δικό σας hub.requireAccountInit.description.0=Για να συνεχίσετε, παρακαλούμε ολοκληρώστε τα βήματα που απαιτούνται στο δικό σας
@@ -645,4 +648,4 @@ eventView.entry.inUse.showEncrypted=Εμφάνιση κρυπτογραφημέ
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
+30 -1
View File
@@ -18,6 +18,11 @@ generic.button.print=Imprimir
generic.button.remove=Eliminar generic.button.remove=Eliminar
## Vault state ## Vault state
vault.state.locked=Bloqueada
vault.state.unlocked=Desbloqueada
vault.state.missing=Faltante
vault.state.migrationNeeded=Migración obligatoria
vault.state.processing=Procesando
vault.state.error=Error vault.state.error=Error
# Error # Error
@@ -104,6 +109,13 @@ addvaultwizard.existing.restore=…
addvaultwizard.existing.chooseBtn=Elegir… addvaultwizard.existing.chooseBtn=Elegir…
addvaultwizard.existing.filePickerTitle=Seleccionar archivo de bóveda addvaultwizard.existing.filePickerTitle=Seleccionar archivo de bóveda
addvaultwizard.existing.filePickerMimeDesc=Bóveda de Cryptomator addvaultwizard.existing.filePickerMimeDesc=Bóveda de Cryptomator
addvaultwizard.existing.notAVault.title=No es una bóveda
addvaultwizard.existing.notAVault.message=La carpeta seleccionada no es una bóveda de Cryptomator
addvaultwizard.existing.notAVault.description.missingDataDir=Falta el subdirectorio "d" necesario dentro de "%s".
addvaultwizard.existing.notAVault.description.dataNotADirectory=La entrada "d" dentro de "%s" no es un directorio.
addvaultwizard.existing.notAVault.description.missingVaultConfig=Falta el archivo "vault.cryptomator" necesario dentro de "%s".
addvaultwizard.existing.notAVault.description.vaultConfigAccessDenied=El archivo "vault.cryptomator" dentro de "%s" no se puede leer debido a la falta de permisos de acceso.
addvaultwizard.existing.notAVault.description.unsupportedStructure=La estructura de directorios de "%s" no está soportada.
## Success ## Success
addvaultwizard.success.nextStepsInstructions=Bóveda "%s" añadida.\nSe necesita desbloquear esta bóveda para acceder o añadir contenido. Alternativamente se \n puede desbloquear en otro momento. addvaultwizard.success.nextStepsInstructions=Bóveda "%s" añadida.\nSe necesita desbloquear esta bóveda para acceder o añadir contenido. Alternativamente se \n puede desbloquear en otro momento.
addvaultwizard.success.unlockNow=Desbloquear ahora addvaultwizard.success.unlockNow=Desbloquear ahora
@@ -156,6 +168,12 @@ unlock.error.title=Error al desbloquear "%s"
hub.noKeychain.message=No se puede acceder a la clave del dispositivo hub.noKeychain.message=No se puede acceder a la clave del dispositivo
hub.noKeychain.description=Para desbloquear las bóvedas de Hub, se requiere una clave de dispositivo que se asegura con un llavero. Para continuar, habilite "%s" y seleccione un llavero en las preferencias. hub.noKeychain.description=Para desbloquear las bóvedas de Hub, se requiere una clave de dispositivo que se asegura con un llavero. Para continuar, habilite "%s" y seleccione un llavero en las preferencias.
hub.noKeychain.openBtn=Abrir preferencias hub.noKeychain.openBtn=Abrir preferencias
### Check Host Authenticity
hub.checkHostTrust.message.check=Comprobando configuración…
hub.checkHostTrust.message.ask=¿Confiar en este host?
hub.checkHostTrust.message.ask.plural=¿Confiar en estos hosts?
hub.checkHostTrust.trustBtn=Confiar
hub.checkHostTrust.denyBtn=Denegar
### Waiting ### Waiting
hub.auth.message=Esperando la autenticación… hub.auth.message=Esperando la autenticación…
hub.auth.description=Debería ser redirigido automáticamente a la página de inicio de sesión. hub.auth.description=Debería ser redirigido automáticamente a la página de inicio de sesión.
@@ -182,9 +200,14 @@ hub.registerFailed.message=El registro del dispositivo ha fallado
hub.registerFailed.description.generic=Ha ocurrido un error al intentar registrarse. Para más detalles, consulte el registro de la aplicación. hub.registerFailed.description.generic=Ha ocurrido un error al intentar registrarse. Para más detalles, consulte el registro de la aplicación.
hub.registerFailed.description.deviceAlreadyExists=Este dispositivo ya se ha registrado para otro usuario. Intente cambiar la cuenta de usuario o utilice un dispositivo diferente. hub.registerFailed.description.deviceAlreadyExists=Este dispositivo ya se ha registrado para otro usuario. Intente cambiar la cuenta de usuario o utilice un dispositivo diferente.
### Archived ### Archived
hub.archived.message=Bóveda archivada
hub.archived.description=Esta bóveda ha sido archivada y ya no es accesible. Póngase en contacto con el propietario de la bóveda.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Acceso denegado hub.unauthorized.message=Acceso denegado
hub.unauthorized.description=No tiene autorización para abrir esta bóveda. Contacta al propietario de la bóveda para solicitar acceso. hub.unauthorized.description=No tiene autorización para abrir esta bóveda. Contacta al propietario de la bóveda para solicitar acceso.
### Untrusted Host
hub.untrustedHost.message=Host no confiable
hub.untrustedHost.description=La conexión al Hub fue bloqueada por su seguridad. Si cree que el Hub es seguro, póngase en contacto con la administración de Hub o vuelva a intentarlo.
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Acción requerida hub.requireAccountInit.message=Acción requerida
hub.requireAccountInit.description.0=Para continuar, por favor complete los pasos necesarios en su hub.requireAccountInit.description.0=Para continuar, por favor complete los pasos necesarios en su
@@ -298,6 +321,7 @@ preferences.general.debugDirectory=Revelar archivos de registro
preferences.general.autoStart=Cargar Cryptomator al iniciar el sistema preferences.general.autoStart=Cargar Cryptomator al iniciar el sistema
preferences.general.keychainBackend=Guardar contraseñas con preferences.general.keychainBackend=Guardar contraseñas con
preferences.general.quickAccessService=Añadir bóvedas desbloqueadas al área de acceso rápido preferences.general.quickAccessService=Añadir bóvedas desbloqueadas al área de acceso rápido
preferences.general.resetTrustedHosts=Restablecer hosts de confianza
## Interface ## Interface
preferences.interface=Interfaz preferences.interface=Interfaz
preferences.interface.theme=Apariencia preferences.interface.theme=Apariencia
@@ -403,6 +427,7 @@ stats.access.total=Accesos totales: %d
# Main Window # Main Window
## Vault List ## Vault List
main.vaultlist=Bóvedas main.vaultlist=Bóvedas
main.vaultlist.listEntry=Bóveda %s (%s)
main.vaultlist.emptyList.onboardingInstruction=Haga clic aquí para añadir una bóveda main.vaultlist.emptyList.onboardingInstruction=Haga clic aquí para añadir una bóveda
main.vaultlist.contextMenu.remove=Eliminar… main.vaultlist.contextMenu.remove=Eliminar…
main.vaultlist.contextMenu.lock=Bloquear main.vaultlist.contextMenu.lock=Bloquear
@@ -420,9 +445,11 @@ main.vaultlist.showPreferencesButton.tooltip=Mostrar preferencias
##Notification ##Notification
main.notification.updateAvailable=Existen actualizaciones disponibles. main.notification.updateAvailable=Existen actualizaciones disponibles.
main.notification.support=Soporte de Cryptomator. main.notification.support=Soporte de Cryptomator.
main.notification.closeButton.tooltip=Cerrar barra de información
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Gracias por elegir Cryptomator para proteger sus archivos. En caso de necesitar ayuda, revise nuestras guías: main.vaultDetail.welcomeOnboarding=Gracias por elegir Cryptomator para proteger sus archivos. En caso de necesitar ayuda, revise nuestras guías:
main.vaultDetail.storageLocation=Ubicación de almacenamiento en bóveda
### Locked ### Locked
main.vaultDetail.lockedStatus=BLOQUEADA main.vaultDetail.lockedStatus=BLOQUEADA
main.vaultDetail.unlockBtn=Desbloquear… main.vaultDetail.unlockBtn=Desbloquear…
@@ -511,6 +538,7 @@ vaultOptions.masterkey.forgetSavedPasswordBtn=Olvidar contraseña guardada
vaultOptions.masterkey.recoveryKeyExplanation=Una clave de recuperación es el único medio para restaurar el acceso a una bóveda si pierde su contraseña. vaultOptions.masterkey.recoveryKeyExplanation=Una clave de recuperación es el único medio para restaurar el acceso a una bóveda si pierde su contraseña.
vaultOptions.masterkey.showRecoveryKeyBtn=Mostrar clave de recuperación vaultOptions.masterkey.showRecoveryKeyBtn=Mostrar clave de recuperación
vaultOptions.masterkey.recoverPasswordBtn=Restablecer contraseña vaultOptions.masterkey.recoverPasswordBtn=Restablecer contraseña
vaultOptions.masterkey.missingMasterkeyFile=Estas opciones sólo están disponibles si el archivo masterkey está presente en el directorio de la bóveda.
## Hub ## Hub
vaultOptions.hub=Recuperación vaultOptions.hub=Recuperación
vaultOptions.hub.convertInfo=Puede utilizar la clave de recuperación para convertir esta bóveda de Hub en una bóveda con contraseña en una emergencia. vaultOptions.hub.convertInfo=Puede utilizar la clave de recuperación para convertir esta bóveda de Hub en una bóveda con contraseña en una emergencia.
@@ -697,6 +725,7 @@ eventView.entry.brokenFileNode.copyDecrypted=Copiar ruta descifrada
eventView.entry.inUse.message=Fichero en uso eventView.entry.inUse.message=Fichero en uso
eventView.entry.inUse.showDecrypted=Mostrar archivo descifrado eventView.entry.inUse.showDecrypted=Mostrar archivo descifrado
eventView.entry.inUse.showEncrypted=Mostrar archivo cifrado eventView.entry.inUse.showEncrypted=Mostrar archivo cifrado
eventView.entry.inUse.copyUserAndDevice=Copiar nombre de usuario y dispositivo de bloqueo
eventView.entry.inUse.ignoreLock=Ignorar el estado de uso eventView.entry.inUse.ignoreLock=Ignorar el estado de uso
@@ -704,4 +733,4 @@ eventView.entry.inUse.ignoreLock=Ignorar el estado de uso
## FileIsInUse Notification ## FileIsInUse Notification
notification.inUse.message=El archivo está en uso en otro dispositivo notification.inUse.message=El archivo está en uso en otro dispositivo
notification.inUse.description=El archivo está abierto por %s en %s. Solicítale que cierre el archivo y deje que finalice la sincronización. Puede ignorar el estado para abrirlo ahora, pero esto puede causar conflictos o sobrescribir cambios más recientes. notification.inUse.description=El archivo está abierto por %s en %s. Solicítale que cierre el archivo y deje que finalice la sincronización. Puede ignorar el estado para abrirlo ahora, pero esto puede causar conflictos o sobrescribir cambios más recientes.
notification.inUse.action=Ignorar el Estado de Uso notification.inUse.action=Ignorar el Estado de Uso
@@ -114,6 +114,7 @@ unlock.success.revealBtn=نمایش درایو
## Failure ## Failure
## Hub ## Hub
hub.noKeychain.openBtn=باز کردن تنظیمات hub.noKeychain.openBtn=باز کردن تنظیمات
### Check Host Authenticity
### Waiting ### Waiting
### Receive Key ### Receive Key
### Register Device ### Register Device
@@ -124,6 +125,7 @@ hub.registerSuccess.unlockBtn=بازکردن قفل
### Registration Failed ### Registration Failed
### Archived ### Archived
### Unauthorized ### Unauthorized
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
### License Exceeded ### License Exceeded
@@ -256,4 +258,4 @@ dokanySupportEnd.preferencesBtn=باز کردن تنظیمات
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
@@ -156,6 +156,7 @@ unlock.error.title="%s" avaaminen epäonnistui
hub.noKeychain.message=Laitteen avainta ei löytynyt hub.noKeychain.message=Laitteen avainta ei löytynyt
hub.noKeychain.description=Hub-holvien purkamiseksi tarvitaan laiteavain joka on suojattu avainrenkaalla. Jatkaaksesi, kytke “%s” päälle ja valitse avainrengas asetuksista. hub.noKeychain.description=Hub-holvien purkamiseksi tarvitaan laiteavain joka on suojattu avainrenkaalla. Jatkaaksesi, kytke “%s” päälle ja valitse avainrengas asetuksista.
hub.noKeychain.openBtn=Avaa asetukset hub.noKeychain.openBtn=Avaa asetukset
### Check Host Authenticity
### Waiting ### Waiting
hub.auth.message=Odotetaan todennusta… hub.auth.message=Odotetaan todennusta…
hub.auth.description=Pitäisi ohjata sinut automaattisesti uudelleen kirjautumissivulle. hub.auth.description=Pitäisi ohjata sinut automaattisesti uudelleen kirjautumissivulle.
@@ -185,6 +186,7 @@ hub.registerFailed.description.deviceAlreadyExists=Tämä laite on jo rekisterö
### Unauthorized ### 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ä. hub.unauthorized.description=Sinulla ei ole oikeutta avata tätä holvia. Ota yhteyttä holvin omistajaan pyytääksesi pääsyä.
### Untrusted Host
### 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
@@ -698,4 +700,4 @@ eventView.entry.inUse.showEncrypted=Näytä salattu tiedosto
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
@@ -154,6 +154,8 @@ unlock.error.title=Hindi mabuksan ang "%s"
hub.noKeychain.message=Hindi ma-access ang key ng device hub.noKeychain.message=Hindi ma-access ang key ng device
hub.noKeychain.description=Para ma-unlock ang mga Hub vault, kailangan ng device key, na sini-secure gamit ang keychain. Upang magpatuloy, paganahin ang “%s” at pumili ng keychain sa mga kagustuhan. hub.noKeychain.description=Para ma-unlock ang mga Hub vault, kailangan ng device key, na sini-secure gamit ang keychain. Upang magpatuloy, paganahin ang “%s” at pumili ng keychain sa mga kagustuhan.
hub.noKeychain.openBtn=Buksan ang Mga Kagustuhan hub.noKeychain.openBtn=Buksan ang Mga Kagustuhan
### Check Host Authenticity
hub.checkHostTrust.trustBtn=Magtiwala
### Waiting ### Waiting
hub.auth.message=Naghihintay para sa pagpapatunay… hub.auth.message=Naghihintay para sa pagpapatunay…
hub.auth.description=Dapat kang awtomatikong mai-redirect sa pahina ng pag-login. hub.auth.description=Dapat kang awtomatikong mai-redirect sa pahina ng pag-login.
@@ -182,6 +184,7 @@ hub.registerFailed.description.deviceAlreadyExists=Ang device na ito ay registra
### Archived ### Archived
### Unauthorized ### Unauthorized
hub.unauthorized.message=Walang pahintulot hub.unauthorized.message=Walang pahintulot
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Kinakailangan ang pagkilos hub.requireAccountInit.message=Kinakailangan ang pagkilos
hub.requireAccountInit.description.0=Upang magpatuloy, mangyaring kumpletuhin ang mga hakbang na kinakailangan sa iyong hub.requireAccountInit.description.0=Upang magpatuloy, mangyaring kumpletuhin ang mga hakbang na kinakailangan sa iyong
@@ -598,4 +601,4 @@ shareVault.hub.openHub=Buksan ang Cryptomator Hub
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
+22 -5
View File
@@ -109,6 +109,13 @@ addvaultwizard.existing.restore=Restaurer…
addvaultwizard.existing.chooseBtn=Choisir… addvaultwizard.existing.chooseBtn=Choisir…
addvaultwizard.existing.filePickerTitle=Sélectionnez le fichier correspondant au volume chiffré addvaultwizard.existing.filePickerTitle=Sélectionnez le fichier correspondant au volume chiffré
addvaultwizard.existing.filePickerMimeDesc=Coffre-fort Cryptomator addvaultwizard.existing.filePickerMimeDesc=Coffre-fort Cryptomator
addvaultwizard.existing.notAVault.title=Pas un coffre
addvaultwizard.existing.notAVault.message=Le dossier sélectionné nest pas un coffre Cryptomator
addvaultwizard.existing.notAVault.description.missingDataDir=Le sous-répertoire « d » requis est manquant dans «%s».
addvaultwizard.existing.notAVault.description.dataNotADirectory=L'entrée « d » dans « %s » n'est pas un répertoire.
addvaultwizard.existing.notAVault.description.missingVaultConfig=Le fichier « vault.cryptomator » requis est manquant dans « %s ».
addvaultwizard.existing.notAVault.description.vaultConfigAccessDenied=Le fichier « vault.cryptomator » dans « %s » ne peut pas être lu en raison de droits daccès insuffisants.
addvaultwizard.existing.notAVault.description.unsupportedStructure=La structure de répertoire de « %s » n'est pas prise en charge.
## Success ## Success
addvaultwizard.success.nextStepsInstructions=Coffre “%s” ajouté.\nIl faudra déverrouiller ce coffre afin dy accéder ou dy ajouter du contenu. Cette action peut être réalisée ultérieurement. addvaultwizard.success.nextStepsInstructions=Coffre “%s” ajouté.\nIl faudra déverrouiller ce coffre afin dy accéder ou dy ajouter du contenu. Cette action peut être réalisée ultérieurement.
addvaultwizard.success.unlockNow=Déverrouiller addvaultwizard.success.unlockNow=Déverrouiller
@@ -161,6 +168,12 @@ unlock.error.title=Échec du déverrouillage de "%s"
hub.noKeychain.message=Impossible d'accéder à la clé du périphérique hub.noKeychain.message=Impossible d'accéder à la clé du périphérique
hub.noKeychain.description=Le déverrouillage des coffres Hub nécessite une clé de périphérique sécurisée à l'aide d'un trousseau. Pour continuer, activez « %s » et sélectionnez un trousseau dans les préférences. hub.noKeychain.description=Le déverrouillage des coffres Hub nécessite une clé de périphérique sécurisée à l'aide d'un trousseau. Pour continuer, activez « %s » et sélectionnez un trousseau dans les préférences.
hub.noKeychain.openBtn=Ouvrir les préférences hub.noKeychain.openBtn=Ouvrir les préférences
### Check Host Authenticity
hub.checkHostTrust.message.check=Vérification de configuration…
hub.checkHostTrust.message.ask=Faire confiance à cet hôte ?
hub.checkHostTrust.message.ask.plural=Faire confiance à ces hôtes ?
hub.checkHostTrust.trustBtn=Approuver
hub.checkHostTrust.denyBtn=Refuser
### Waiting ### Waiting
hub.auth.message=Authentification en cours… hub.auth.message=Authentification en cours…
hub.auth.description=Vous devriez automatiquement être redirigé vers la page de connexion. hub.auth.description=Vous devriez automatiquement être redirigé vers la page de connexion.
@@ -192,6 +205,9 @@ hub.archived.description=Ce coffre a été archivé et n'est plus accessible. Ve
### Unauthorized ### Unauthorized
hub.unauthorized.message=Accès refusé hub.unauthorized.message=Accès refusé
hub.unauthorized.description=Vous n'êtes pas autorisé à ouvrir ce coffre. Contactez le propriétaire du coffre pour en demander l'accès. hub.unauthorized.description=Vous n'êtes pas autorisé à ouvrir ce coffre. Contactez le propriétaire du coffre pour en demander l'accès.
### Untrusted Host
hub.untrustedHost.message=Hôte non fiable
hub.untrustedHost.description=La connexion à Hub a été bloquée pour votre sécurité. Si vous pensez que l'hôte Hub est en sécurité, contactez son administrateur ou réessayez.
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Action requise hub.requireAccountInit.message=Action requise
hub.requireAccountInit.description.0=Pour continuer, veuillez compléter les étapes requises hub.requireAccountInit.description.0=Pour continuer, veuillez compléter les étapes requises
@@ -300,11 +316,12 @@ preferences.title=Préférences
preferences.general=Général preferences.general=Général
preferences.general.startHidden=Démarrer Cryptomator en mode caché preferences.general.startHidden=Démarrer Cryptomator en mode caché
preferences.general.autoCloseVaults=Verrouiller les coffres sans confirmation lors de la fermeture de l'application preferences.general.autoCloseVaults=Verrouiller les coffres sans confirmation lors de la fermeture de l'application
preferences.general.debugLogging=Activer les logs debug preferences.general.debugLogging=Activer les logs de débogage
preferences.general.debugDirectory=Afficher le journal preferences.general.debugDirectory=Afficher les logs
preferences.general.autoStart=Lancer Cryptomator au démarrage du système preferences.general.autoStart=Lancer Cryptomator au démarrage du système
preferences.general.keychainBackend=Stocker les mots de passe avec preferences.general.keychainBackend=Stocker les mots de passe avec
preferences.general.quickAccessService=Ajouter les coffres déverrouillés à la zone d'accès rapide preferences.general.quickAccessService=Ajouter les coffres déverrouillés à la zone d'accès rapide
preferences.general.resetTrustedHosts=Réinitialiser les hôtes de confiance
## Interface ## Interface
preferences.interface=Interface preferences.interface=Interface
preferences.interface.theme=Apparence preferences.interface.theme=Apparence
@@ -369,7 +386,7 @@ removeCert.description=Les fonctionnalités principales de Cryptomator ne sont p
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
preferences.about=A propos preferences.about=À propos
preferences.about.thirdPartyLicenses=Licences tierces preferences.about.thirdPartyLicenses=Licences tierces
# Vault Statistics # Vault Statistics
@@ -428,7 +445,7 @@ main.vaultlist.showPreferencesButton.tooltip=Afficher les préférences
##Notification ##Notification
main.notification.updateAvailable=Mise à jour disponible. main.notification.updateAvailable=Mise à jour disponible.
main.notification.support=Soutenir Cryptomator. main.notification.support=Soutenir Cryptomator.
main.notification.closeButton.tooltip="Fermer la barre d'information" main.notification.closeButton.tooltip=Fermer la barre d'information
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Merci d'avoir choisi Cryptomator pour protéger vos fichiers. Si vous avez besoin d'aide, consultez nos guides de démarrage : main.vaultDetail.welcomeOnboarding=Merci d'avoir choisi Cryptomator pour protéger vos fichiers. Si vous avez besoin d'aide, consultez nos guides de démarrage :
@@ -716,4 +733,4 @@ eventView.entry.inUse.ignoreLock=Ignorer le statut dutilisation
## FileIsInUse Notification ## FileIsInUse Notification
notification.inUse.message=Le fichier est utilisé sur un autre appareil notification.inUse.message=Le fichier est utilisé sur un autre appareil
notification.inUse.description=Le fichier est ouvert par %s sur %s. Demandez-lui à fermer le fichier et laissez la synchronisation se terminer. Vous pouvez ignorer le statut pour louvrir maintenant, mais cela pourrait entraîner des conflits ou écraser des modifications récentes. notification.inUse.description=Le fichier est ouvert par %s sur %s. Demandez-lui à fermer le fichier et laissez la synchronisation se terminer. Vous pouvez ignorer le statut pour louvrir maintenant, mais cela pourrait entraîner des conflits ou écraser des modifications récentes.
notification.inUse.action=Ignorer le statut dutilisation notification.inUse.action=Ignorer le statut dutilisation
@@ -46,6 +46,7 @@ error.message=Produciuse un erro
## Success ## Success
## Failure ## Failure
## Hub ## Hub
### Check Host Authenticity
### Waiting ### Waiting
### Receive Key ### Receive Key
### Register Device ### Register Device
@@ -54,6 +55,7 @@ error.message=Produciuse un erro
### Registration Failed ### Registration Failed
### Archived ### Archived
### Unauthorized ### Unauthorized
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
### License Exceeded ### License Exceeded
@@ -169,4 +171,4 @@ lock.forced.retryBtn=Tentar de novo
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
@@ -150,6 +150,8 @@ unlock.error.customPath.description.notEmptyDir=הנתיב המותאם "%s" א
hub.noKeychain.message=לא ניתן לגשת למפתח המכשיר hub.noKeychain.message=לא ניתן לגשת למפתח המכשיר
hub.noKeychain.description=כדאי לשחרר כספות האב נדרש מפתח מכשיר שיאובטח בצרור מפתחות. כדאי להמשיך, אפשר ״%s״ ובחר את צרור המפתחות בהעדפות. hub.noKeychain.description=כדאי לשחרר כספות האב נדרש מפתח מכשיר שיאובטח בצרור מפתחות. כדאי להמשיך, אפשר ״%s״ ובחר את צרור המפתחות בהעדפות.
hub.noKeychain.openBtn=פתח העדפות hub.noKeychain.openBtn=פתח העדפות
### Check Host Authenticity
hub.checkHostTrust.trustBtn=סמוך
### Waiting ### Waiting
hub.auth.message=ממתין לאימות… hub.auth.message=ממתין לאימות…
hub.auth.description=אתה אמור להיות מופנה אוטומטית למסך ההזדהות. hub.auth.description=אתה אמור להיות מופנה אוטומטית למסך ההזדהות.
@@ -166,6 +168,7 @@ hub.registerSuccess.unlockBtn=בטל נעילה
### Archived ### Archived
### Unauthorized ### Unauthorized
hub.unauthorized.message=הגישה נדחתה hub.unauthorized.message=הגישה נדחתה
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
### License Exceeded ### License Exceeded
hub.invalidLicense.message=רישיון האב לא תקף hub.invalidLicense.message=רישיון האב לא תקף
@@ -531,4 +534,4 @@ dokanySupportEnd.preferencesBtn=פתח העדפות
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
@@ -142,6 +142,8 @@ unlock.error.title="%s" तिजोरी खोलना विफल रह
## Hub ## Hub
hub.noKeychain.message=उपकरण के कुंजी तक पहुंचने में असमर्थ hub.noKeychain.message=उपकरण के कुंजी तक पहुंचने में असमर्थ
hub.noKeychain.openBtn=प्राथमिकताएँ खोलें hub.noKeychain.openBtn=प्राथमिकताएँ खोलें
### Check Host Authenticity
hub.checkHostTrust.trustBtn=भरोसा करे
### Waiting ### Waiting
hub.auth.message=प्रमाणन के लिए इंतज़ार कर रहे... hub.auth.message=प्रमाणन के लिए इंतज़ार कर रहे...
hub.auth.description=आपको स्वचालित रूप से लॉगिन पृष्ठ पर पुनः निर्देशित किया जाना चाहिए। hub.auth.description=आपको स्वचालित रूप से लॉगिन पृष्ठ पर पुनः निर्देशित किया जाना चाहिए।
@@ -158,6 +160,7 @@ hub.registerSuccess.unlockBtn=अनलॉक करें
### Archived ### Archived
### Unauthorized ### Unauthorized
hub.unauthorized.message=प्रवेश अस्वीकृत hub.unauthorized.message=प्रवेश अस्वीकृत
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=कार्रवाई आवश्यक है hub.requireAccountInit.message=कार्रवाई आवश्यक है
hub.requireAccountInit.description.0=आगे बढ़ने के लिए, कृपया अपने आवश्यक चरणों को पूरा करें hub.requireAccountInit.description.0=आगे बढ़ने के लिए, कृपया अपने आवश्यक चरणों को पूरा करें
@@ -354,4 +357,4 @@ dokanySupportEnd.preferencesBtn=प्राथमिकताएँ खोल
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
@@ -116,6 +116,8 @@ unlock.success.rememberChoice=Zapamti izbor, ne prikazuj ovo više
unlock.success.revealBtn=Otkrij pogon unlock.success.revealBtn=Otkrij pogon
## Failure ## Failure
## Hub ## Hub
### Check Host Authenticity
hub.checkHostTrust.trustBtn=Vjeruj
### Waiting ### Waiting
### Receive Key ### Receive Key
### Register Device ### Register Device
@@ -125,6 +127,7 @@ hub.registerSuccess.unlockBtn=Otključaj
### Registration Failed ### Registration Failed
### Archived ### Archived
### Unauthorized ### Unauthorized
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
### License Exceeded ### License Exceeded
@@ -421,4 +424,4 @@ quit.lockAndQuitBtn=Zaključaj i napusti
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
+234 -114
View File
@@ -18,11 +18,16 @@ generic.button.print=Nyomtatás
generic.button.remove=Eltávolítás generic.button.remove=Eltávolítás
## Vault state ## Vault state
vault.state.locked=Zárolva
vault.state.unlocked=Feloldva
vault.state.missing=Hiányzó
vault.state.migrationNeeded=Migráció szükséges
vault.state.processing=Feldolgozás
vault.state.error=Hiba vault.state.error=Hiba
# Error # Error
error.message=Hiba: %s error.message=Hiba: %s
error.description=Upsz! A Cryptomator nem számított rá, hogy ez megtörténik. Keressen meglévő megoldást erre a hibára. Vagy ha még nem jelentették, bátran tegye ezt meg. error.description=A Cryptomator nem számított rá, hogy ez megtörténik. Keressen meglévő megoldást erre a hibára. Vagy ha még nem jelentették, bátran tegye ezt meg.
error.hyperlink.lookup=Hiba okának keresése error.hyperlink.lookup=Hiba okának keresése
error.hyperlink.report=Hiba jelentése error.hyperlink.report=Hiba jelentése
error.technicalDetails=Részletek: error.technicalDetails=Részletek:
@@ -33,7 +38,7 @@ error.dismiss=Elvet
error.lookUpSolution=Megoldás keresése error.lookUpSolution=Megoldás keresése
# Defaults # Defaults
defaults.vault.vaultName=Széf defaults.vault.vaultName=Titkosított tároló
# Tray Menu # Tray Menu
traymenu.showMainWindow=Megmutatás traymenu.showMainWindow=Megmutatás
@@ -45,30 +50,30 @@ traymenu.vault.lock=Zárolás
traymenu.vault.reveal=Megmutatás traymenu.vault.reveal=Megmutatás
# Add Vault Wizard # Add Vault Wizard
addvaultwizard.title=Széf hozzáadása addvaultwizard.title=Titkosított tároló hozzáadása
## New ## New
addvaultwizard.new.title=Széf hozzáadása addvaultwizard.new.title=Titkosított tároló hozzáadása
### Name ### Name
addvaultwizard.new.nameInstruction=Válasszon egy nevet az új széf számára addvaultwizard.new.nameInstruction=Válasszon egy nevet a tároló számára
addvaultwizard.new.namePrompt=A széf neve addvaultwizard.new.namePrompt=Titkosított tároló neve
### Location ### Location
addvaultwizard.new.locationInstruction=Hova mentse a Cryptomator a széf titkosított fájljait? addvaultwizard.new.locationInstruction=Hova mentse a tároló titkosított fájljait?
addvaultwizard.new.locationLoading=Helyi fájlrendszer ellenőrzése alapértelmezett felhő tárolási könyvtárakra… addvaultwizard.new.locationLoading=Helyi fájlrendszer ellenőrzése alapértelmezett felhő tárolási könyvtárakra…
addvaultwizard.new.locationLabel=Tárolási hely addvaultwizard.new.locationLabel=Tárolási hely
addvaultwizard.new.locationPrompt= addvaultwizard.new.locationPrompt=
addvaultwizard.new.directoryPickerLabel=Egyedi hely addvaultwizard.new.directoryPickerLabel=Egyedi hely
addvaultwizard.new.directoryPickerButton=Választás… addvaultwizard.new.directoryPickerButton=Választás…
addvaultwizard.new.directoryPickerTitle=Könyvtár kiválasztása addvaultwizard.new.directoryPickerTitle=Könyvtár kiválasztása
addvaultwizard.new.fileAlreadyExists=Már létezik fájl/könyvtár ezzel a trezornévvel addvaultwizard.new.fileAlreadyExists=Már létezik fájl/könyvtár ezzel a tárolónévvel
addvaultwizard.new.locationDoesNotExist=A megadott elérési úton lévő könyvtár nem létezik, vagy nem érhető el addvaultwizard.new.locationDoesNotExist=A megadott elérési úton lévő könyvtár nem létezik, vagy nem érhető el
addvaultwizard.new.locationIsNotWritable=Nincs írási hozzáférés a megadott elérési úthoz addvaultwizard.new.locationIsNotWritable=Nincs írási hozzáférés a megadott elérési úthoz
addvaultwizard.new.locationIsOk=Megfelelő hely a trezornak addvaultwizard.new.locationIsOk=Megfelelő hely a titkosított tárolónak
addvaultwizard.new.invalidName=Érvénytelen vault név addvaultwizard.new.invalidName=Érvénytelen tárolónév
addvaultwizard.new.validName=Érvényes vault név addvaultwizard.new.validName=Érvényes tárolónév
addvaultwizard.new.validCharacters.message=A vault neve a következő karaktereket tartalmazhatja: addvaultwizard.new.validCharacters.message=A titkosított tároló neve a következő karaktereket tartalmazhatja:
addvaultwizard.new.validCharacters.chars=Szókarakterek (pl. a, ж vagy 수) addvaultwizard.new.validCharacters.chars=Szókarakterek (pl. a, ж vagy 수)
addvaultwizard.new.validCharacters.numbers=Számok addvaultwizard.new.validCharacters.numbers=Számok
addvaultwizard.new.validCharacters.dashes=Kötőjel (%s) vagy alulvonás (%s) addvaultwizard.new.validCharacters.dashes=Kötőjel (%s) vagy alvonás (%s)
### Expert Settings ### Expert Settings
addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Haladó beállítások engedélyezése addvaultwizard.new.expertSettings.enableExpertSettingsCheckbox=Haladó beállítások engedélyezése
addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Írjon be egy értéket 36 és 220 között (alapértelmezett: 220) addvaultwizard.new.expertSettings.shorteningThreshold.invalid=Írjon be egy értéket 36 és 220 között (alapértelmezett: 220)
@@ -76,41 +81,49 @@ addvaultwizard.new.expertSettings.shorteningThreshold.tooltip=További informác
addvaultwizard.new.expertSettings.shorteningThreshold.title=A kódolt fájlnevek maximális hosszúsága addvaultwizard.new.expertSettings.shorteningThreshold.title=A kódolt fájlnevek maximális hosszúsága
addvaultwizard.new.expertSettings.shorteningThreshold.valid=Érvényes addvaultwizard.new.expertSettings.shorteningThreshold.valid=Érvényes
### Password ### Password
addvaultwizard.new.createVaultBtn=Új széf létrehozása addvaultwizard.new.createVaultBtn=Új titkosított tároló létrehozása
addvaultwizard.new.generateRecoveryKeyChoice=Nem fog tudni hozzáférni az adataihoz a jelszó nélkül. Akar egy visszaállítási kulcsot arra az esetre, ha elveszíti a jelszavát? addvaultwizard.new.generateRecoveryKeyChoice=Nem fog tudni hozzáférni az adataihoz a jelszó nélkül. Akar egy visszaállítási kulcsot arra az esetre, ha elveszíti a jelszavát?
addvaultwizard.new.generateRecoveryKeyChoice.yes=Igen kérem, jobb félni, mint megijedni. addvaultwizard.new.generateRecoveryKeyChoice.yes=Igen kérem, jobb félni, mint megijedni
addvaultwizard.new.generateRecoveryKeyChoice.no=Nem köszönöm, nem fogom elveszíteni a jelszavam. addvaultwizard.new.generateRecoveryKeyChoice.no=Nem köszönöm, nem fogom elveszíteni a jelszavam
### Information ### Information
addvault.new.readme.storageLocation.fileName=FONTOS.rtf addvault.new.readme.storageLocation.fileName=FONTOS.rtf
addvault.new.readme.storageLocation.1=⚠️ SZÉF FÁJLOK ⚠️ addvault.new.readme.storageLocation.1=⚠️ TITKOSÍTOTT FÁJLOK ⚠️
addvault.new.readme.storageLocation.2=Ez a széfjének a tárolási helye. addvault.new.readme.storageLocation.2=Ez a titkosított tárolójának helye.
addvault.new.readme.storageLocation.3=NE addvault.new.readme.storageLocation.3=NE
addvault.new.readme.storageLocation.4=• ne módosítson semmilyen fájlt ebbe a könyvtárba addvault.new.readme.storageLocation.4=• ne módosítson semmilyen fájlt ebben a könyvtárba
addvault.new.readme.storageLocation.5=• ne tegyen titkosítani való fájlokat ebbe a könyvtárba addvault.new.readme.storageLocation.5=• ne tegyen titkosítani való fájlokat ebbe a könyvtárba.
addvault.new.readme.storageLocation.6=Ha fájlokat akr titkosítani és a széf tartalmát akarja szerkeszteni akkor tegye a következőt: addvault.new.readme.storageLocation.6=Ha fájlokat akar titkosítani és a tároló tartalmát akarja szerkeszteni akkor tegye a következőt:
addvault.new.readme.storageLocation.7=1. Adja hozzá a széfet a Cryptomator-hoz. addvault.new.readme.storageLocation.7=1. Adja hozzá a tárolót a Cryptomator felületén.
addvault.new.readme.storageLocation.8=2. Nyissa meg a széfet a Cryptomator-ban. addvault.new.readme.storageLocation.8=2. Nyissa meg a tárolót a Cryptomator felületén.
addvault.new.readme.storageLocation.9=3. Nyissa meg a hozzáférési helyet a "Megjelenítés" gombra való kattintással. addvault.new.readme.storageLocation.9=3. Nyissa meg a hozzáférési helyet a "Megjelenítés" gombra való kattintással.
addvault.new.readme.storageLocation.10=Ha segítségre van szüksége, akkor látogasson el a dokumentáció oldalára: %s addvault.new.readme.storageLocation.10=Ha segítségre van szüksége, akkor látogasson el a dokumentáció oldalára: %s
addvault.new.readme.accessLocation.fileName=ÜDVÖZÖLJÜK.rtf addvault.new.readme.accessLocation.fileName=ÜDVÖZÖLJÜK.rtf
addvault.new.readme.accessLocation.1=🔐️ TITKOSÍTOTT KÖTET 🔐️ addvault.new.readme.accessLocation.1=🔐️ TITKOSÍTOTT KÖTET 🔐️
addvault.new.readme.accessLocation.2=Ez a széf hozzáférési helye. addvault.new.readme.accessLocation.2=Ez a tároló hozzáférési helye.
addvault.new.readme.accessLocation.3=Bármilyen, a kötethez hozzáadott fájl titkosításra kerül a Cryptomator által. Úgy dolgozhat vele, mint minden más meghajtóval/mappával. Ez az egyetlen dekódolt tartalmi nézet. A fájlai folyamatosan titkosítva maradnak a merevlemezén. addvault.new.readme.accessLocation.3=Bármilyen, a kötethez hozzáadott fájl titkosításra kerül a Cryptomator által. Úgy dolgozhat vele, mint minden más meghajtóval/mappával. Ez az egyetlen dekódolt tartalmi nézet. A fájljai folyamatosan titkosítva maradnak a merevlemezén.
addvault.new.readme.accessLocation.4=Bátran eltávolíthatja ezt a fájlt. addvault.new.readme.accessLocation.4=Bátran eltávolíthatja ezt a fájlt.
## Existing ## Existing
addvaultwizard.existing.title=Meglévő széf hozzáadása addvaultwizard.existing.title=Meglévő tároló hozzáadása
addvaultwizard.existing.instruction=Válassza ki a "vault.cryptomatotor" fájlt a meglévő tárolóhoz. Ha csak egy "masterkey.cryptomatotor" nevű fájl létezik, válassza azt. addvaultwizard.existing.instruction=Válassza ki a "vault.cryptomator" fájlt a meglévő tárolóban. Ha csak egy "masterkey.cryptomator" nevű fájl létezik, válassza azt.
addvaultwizard.existing.restore=Visszaállítás…
addvaultwizard.existing.chooseBtn=Kiválaszt… addvaultwizard.existing.chooseBtn=Kiválaszt…
addvaultwizard.existing.filePickerTitle=Trezor fájl kiválasztása addvaultwizard.existing.filePickerTitle=Titkosított tároló fájl kiválasztása
addvaultwizard.existing.filePickerMimeDesc=Cryptomator széf addvaultwizard.existing.filePickerMimeDesc=Cryptomator tároló
addvaultwizard.existing.notAVault.title=Nem titkosított tároló
addvaultwizard.existing.notAVault.message=A kiválasztott könyvtár nem Cryptomator titkosított tároló
addvaultwizard.existing.notAVault.description.missingDataDir=A következő mappában hiányzik a szükséges "d" almappa: "%s".
addvaultwizard.existing.notAVault.description.dataNotADirectory=A következő mappában található "d" bejegyzés nem könyvtár: "%s".
addvaultwizard.existing.notAVault.description.missingVaultConfig=A szükséges "vault.cryptomator" fájl hiányzik a következő mappából: "%s".
addvaultwizard.existing.notAVault.description.vaultConfigAccessDenied=A "%s" mappában található "vault.cryptomator" fájl nem olvasható el, mert nincs megfelelő hozzáférési jogosultság.
addvaultwizard.existing.notAVault.description.unsupportedStructure=A következő mappa könyvtárstruktúrája nem támogatott: "%s".
## Success ## Success
addvaultwizard.success.nextStepsInstructions=Széf létrehozva "%s".\nA tartalom eléréséhez, vagy hozzáadásához fel kell oldania a széfet. Alternatív megoldásként később bármikor feloldhatja. addvaultwizard.success.nextStepsInstructions=Titkosított tároló létrehozva "%s".\nA tartalom eléréséhez, vagy hozzáadásához fel kell oldania a tárolót. Alternatív megoldásként később is bármikor feloldhatja.
addvaultwizard.success.unlockNow=Azonnali feloldás addvaultwizard.success.unlockNow=Azonnali feloldás
# Remove Vault # Remove Vault
removeVault.title=Széf eltávolitása removeVault.title="%s" tároló eltávolítása
removeVault.message=Vault eltávolitása? removeVault.message=Titkosított tároló eltávolítása?
removeVault.description=Ez kizárolag a Cryptomator-ból távolitja el ezt a széfet. Később hozzáadhatja újra. A titkosított fájlokat nem törli a merevlemezről. removeVault.description=Ez kizárólag a Cryptomator listájából távolítja el a tárolót. Később hozzáadhatja újra. A titkosított fájlokat nem törli a merevlemezről.
# Change Password # Change Password
changepassword.title=Jelszó megváltoztatása changepassword.title=Jelszó megváltoztatása
@@ -120,7 +133,7 @@ changepassword.finalConfirmation=Megértettem, hogy nem fogok hozzáférni az ad
# Forget Password # Forget Password
forgetPassword.title=Jelszó elfelejtése forgetPassword.title=Jelszó elfelejtése
forgetPassword.message=Elfelejtette az elmentett jelszót? forgetPassword.message=Elfelejtette az elmentett jelszót?
forgetPassword.description=Eltávolítja a széf mentett jelszavát a rendszere kulcstartójából. forgetPassword.description=Eltávolítja a tároló mentett jelszavát a rendszere kulcstartójából.
forgetPassword.confirmBtn=Jelszó elfelejtése forgetPassword.confirmBtn=Jelszó elfelejtése
# Unlock # Unlock
@@ -130,30 +143,37 @@ unlock.savePassword=Jelszó megjegyzése
unlock.unlockBtn=Feloldás unlock.unlockBtn=Feloldás
## Select ## Select
unlock.chooseMasterkey.message=Mesterkulcs fájl nem található unlock.chooseMasterkey.message=Mesterkulcs fájl nem található
unlock.chooseMasterkey.description=Nem található a tároló kulcsfájlja a várt helyen. Kérjük válassza ki a kulcsfájlt manuálisan. unlock.chooseMasterkey.description=Nem található kulcsfájl ehhez a titkosított tárolóhoz: "%s". Kérjük válassza ki a kulcsfájlt manuálisan.
unlock.chooseMasterkey.restoreInstead=Inkább mesterkulcs fájl helyreállítása
unlock.chooseMasterkey.filePickerTitle=Mesterkulcs fájl kiválasztása unlock.chooseMasterkey.filePickerTitle=Mesterkulcs fájl kiválasztása
unlock.chooseMasterkey.filePickerMimeDesc=Cryptomator Mesterkulcs unlock.chooseMasterkey.filePickerMimeDesc=Cryptomator Mesterkulcs
## Success ## Success
unlock.success.message=Sikeres feloldás unlock.success.message=Sikeres feloldás
unlock.success.description="%s" sikreresen feloldásra került! Mostmár hozzáférhet a virtuális trezorhoz. unlock.success.description=Mostantól elérhető a csatolási pontján keresztül a következő tároló tartalma: "%s".
unlock.success.rememberChoice=Jegyezze meg a választást és ne mutassa többet unlock.success.rememberChoice=Jegyezze meg a választást és ne mutassa többet
unlock.success.revealBtn=Széf megjelenítése unlock.success.revealBtn=Széf megjelenítése
## Failure ## Failure
unlock.error.customPath.message=Nem lehet csatolni a széfet az egyéni útvonalhoz unlock.error.customPath.message=Nem lehet csatolni a tárolót az egyéni útvonalhoz
unlock.error.customPath.description.notSupported=Ha szeretné továbbra is az egyéni útvonalat használni, kérem, menjen a beállításokba és válasszon egy kötet típust, amely támogatja azt. Máskülönben, menjen a széf opciókhoz és válasszon egy támogatott csatoláspontot. unlock.error.customPath.description.notSupported=Ha szeretné továbbra is az egyéni útvonalat használni, kérem, menjen a beállításokba és válasszon egy kötet típust, amely támogatja azt. Máskülönben, menjen a tároló beállításaihoz és válasszon egy támogatott csatoláspontot.
unlock.error.customPath.description.notExists=Az egyéni csatolás útvonal nem létezik. Hozza létre a helyi fájlrendszerében vagy változtassa meg a széf opciókban. unlock.error.customPath.description.notExists=Az egyéni csatolás útvonal nem létezik. Hozza létre a helyi fájlrendszerében vagy változtassa meg a tároló beállításaiban.
unlock.error.customPath.description.inUse=A meghajtó betűjele vagy a csatolási útvonal: "%s" már foglalt. unlock.error.customPath.description.inUse=A meghajtó betűjele vagy a csatolási útvonal: "%s" már foglalt.
unlock.error.customPath.description.hideawayNotDir=A feloldáshoz használt, "%3$s" nevű ideiglenes, rejtett fájlt nem lehet eltávolítani. Kérjük, ellenőrizze a fájlt, majd törölje manuálisan. unlock.error.customPath.description.hideawayNotDir=A feloldáshoz használt, "%3$s" nevű ideiglenes, rejtett fájlt nem lehet eltávolítani. Kérjük, ellenőrizze a fájlt, majd törölje manuálisan.
unlock.error.customPath.description.couldNotBeCleaned=A széfet nem lehetett a "%s" elérési útvonalra csatlakoztatni. Kérjük, próbálja meg újra, vagy válasszon másik elérési útvonalat. unlock.error.customPath.description.couldNotBeCleaned=A tárolót nem lehetett a "%s" elérési útvonalra csatlakoztatni. Kérjük, próbálja meg újra, vagy válasszon másik elérési útvonalat.
unlock.error.customPath.description.notEmptyDir=A megadott "%s" elérési útvonal nem egy üres mappa. Kérjük, válasszon egy üres mappát, és próbálja meg újra. unlock.error.customPath.description.notEmptyDir=A megadott "%s" elérési útvonal nem egy üres mappa. Kérjük, válasszon egy üres mappát, és próbálja meg újra.
unlock.error.customPath.description.generic=Egyéni csatolási útvonalat választott ehhez a széfhez, de használatakor ez a hibaüzenet érkezett: %2$s unlock.error.customPath.description.generic=Egyéni csatolási útvonalat választott ehhez a tárolóhoz, de használatakor ez a hibaüzenet érkezett: %2$s
unlock.error.restartRequired.message=Nem lehet feloldani a széfet unlock.error.restartRequired.message=Nem lehet feloldani a titkosított tárolót
unlock.error.restartRequired.description=Módosítsa a kötet típusát a széf beállításaiban, vagy indítsa újra a Cryptomator-t. unlock.error.restartRequired.description=Módosítsa a kötet típusát a tároló beállításaiban, vagy indítsa újra a Cryptomator-t.
unlock.error.title=A(z) „%s” feloldása sikertelen unlock.error.title=A(z) „%s” feloldása sikertelen
## Hub ## Hub
hub.noKeychain.message=Nem lehet az eszközkulcshoz hozzáférni hub.noKeychain.message=Nem lehet az eszközkulcshoz hozzáférni
hub.noKeychain.description=Hogy feloldja a Hub széfeket, egy eszközkulcs szükséges, mely egy kulcslánccal van biztosítva. A folytatáshoz engedélyezze a következőt: “%s” és válasszon egy kulcsláncot a beállításokban. hub.noKeychain.description=Hogy feloldja a Hub-tárolókat, egy eszközkulcs szükséges, mely egy kulcslánccal van biztosítva. A folytatáshoz engedélyezze a következőt: “%s” és válasszon egy kulcsláncot a beállításokban.
hub.noKeychain.openBtn=Beállítások megnyitása hub.noKeychain.openBtn=Beállítások megnyitása
### Check Host Authenticity
hub.checkHostTrust.message.check=Konfiguráció ellenőrzése…
hub.checkHostTrust.message.ask=Megbízik ebben a gépben?
hub.checkHostTrust.message.ask.plural=Megbízik ezekben a gépben?
hub.checkHostTrust.trustBtn=Megbízható
hub.checkHostTrust.denyBtn=Elutasít
### Waiting ### Waiting
hub.auth.message=Várakozás a hitelesítésre… hub.auth.message=Várakozás a hitelesítésre…
hub.auth.description=Automatikusan átirányítjuk a bejelentkezési oldalra. hub.auth.description=Automatikusan átirányítjuk a bejelentkezési oldalra.
@@ -172,17 +192,22 @@ hub.register.legacy.occupiedMsg=Név már használatban van
hub.register.legacy.description=Ez az első Hub hozzáférés erről az eszközről. Kérem, regisztrálja. hub.register.legacy.description=Ez az első Hub hozzáférés erről az eszközről. Kérem, regisztrálja.
### Registration Success ### Registration Success
hub.registerSuccess.message=Az eszköz regisztrálva hub.registerSuccess.message=Az eszköz regisztrálva
hub.registerSuccess.description=Az eszköze sikeresen regisztrálva. Most már folytathatja a széf feloldását. hub.registerSuccess.description=Az eszköze sikeresen regisztrálva. Most már folytathatja a titkosított tároló feloldását.
hub.registerSuccess.unlockBtn=Feloldás hub.registerSuccess.unlockBtn=Feloldás
hub.registerSuccess.legacy.description=A széfhez való hozzáféréshez az eszközének a széf tulajdonosától további engedélyt kell kapnia. hub.registerSuccess.legacy.description=A titkosított tárolóhoz való hozzáféréshez az eszközének a tároló tulajdonosától további engedélyt kell kapnia.
### Registration Failed ### Registration Failed
hub.registerFailed.message=Az eszköz regisztrációja sikertelen hub.registerFailed.message=Az eszköz regisztrációja sikertelen
hub.registerFailed.description.generic=Hiba történt a regisztrációs folyamat során. További részletekért nézze meg az alkalmazás naplóját. hub.registerFailed.description.generic=Hiba történt a regisztrációs folyamat során. További részletekért nézze meg az alkalmazás naplóját.
hub.registerFailed.description.deviceAlreadyExists=Ez az eszköz már egy másik felhasználóhoz van regisztrálva. Próbáljon meg felhasználói fiókot váltani, vagy használjon egy másik eszközt. hub.registerFailed.description.deviceAlreadyExists=Ez az eszköz már egy másik felhasználóhoz van regisztrálva. Próbáljon meg felhasználói fiókot váltani, vagy használjon egy másik eszközt.
### Archived ### Archived
hub.archived.message=Titkosított tároló archiválva
hub.archived.description=Ez a tároló archivált és már nem érhető el. Kérjük, vegye fel a kapcsolatot a tárhely tulajdonosával.
### Unauthorized ### Unauthorized
hub.unauthorized.message=Hozzáférés megtagadva hub.unauthorized.message=Hozzáférés megtagadva
hub.unauthorized.description=Nincs hozzáférésed a széf megnyitásához. Vedd fel a kapcsolatot a széf tulajdonosával és kérj hozzáférést. hub.unauthorized.description=Nincs hozzáférésed a titkosított tároló megnyitásához. Vedd fel a kapcsolatot a tároló tulajdonosával és kérj hozzáférést.
### Untrusted Host
hub.untrustedHost.message=A kiszolgáló nem megbízható
hub.untrustedHost.description=A Hubhoz való csatlakozás biztonsági okokból blokkolva lett. Ha úgy gondolja, hogy a Hub-szerver biztonságos, lépjen kapcsolatba a Hub rendszergazdájával, vagy próbálja meg újra.
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Beavatkozás szükséges hub.requireAccountInit.message=Beavatkozás szükséges
hub.requireAccountInit.description.0=A folytatáshoz kérlek töltsd ki a szükséges lépéseket a te hub.requireAccountInit.description.0=A folytatáshoz kérlek töltsd ki a szükséges lépéseket a te
@@ -199,49 +224,49 @@ lock.forced.description=A „%s” zárolását függőben lévő műveletek vag
lock.forced.retryBtn=Újra lock.forced.retryBtn=Újra
lock.forced.forceBtn=Lezárás kényszerítése lock.forced.forceBtn=Lezárás kényszerítése
## Failure ## Failure
lock.fail.message=Zárolás sikertelen. lock.fail.message=Zárolás sikertelen
lock.fail.description=A "%s" tárolót nem lehetett zárolni. Győződjön meg arról, hogy a nem mentett munkát máshová menti, és a fontos olvasási/írási műveletek befejeződtek. A trezor bezárásához szakítsa meg a Cryptomator folyamatot. lock.fail.description=A "%s" tárolót nem lehetett zárolni. Győződjön meg arról, hogy a nem mentett munkát máshová menti, és a fontos olvasási/írási műveletek befejeződtek. A tároló bezárásához szakítsa meg a Cryptomator folyamatot.
# Migration # Migration
migration.title=Széf frissítése migration.title=Titkosított tároló frissítése
## Start ## Start
migration.start.header=Széf frissítése migration.start.header=Titkosított tároló frissítése
migration.start.text=Hogy megnyissa a "%s" nevű széfét a Cryptomator ezen új verziójában, a széfet frissíteni kell egy újabb formátumra. Mielőtt ezt megteszi, az alábbiakat érdemes figyelembe vennie: migration.start.text=Hogy megnyissa a "%s" nevű titkosított tárolót a Cryptomator ezen új verziójában, a tárolót frissíteni kell egy újabb formátumra. Mielőtt ezt megteszi, az alábbiakat érdemes figyelembe vennie:
migration.start.remarkUndone=Ezt a módosítást nem lehet visszafordítani. migration.start.remarkUndone=Ezt a módosítást nem lehet visszafordítani.
migration.start.remarkVersions=A Cryptomator régebbi verziói nem fogják tudni megnyitni a frissített széfet. migration.start.remarkVersions=A Cryptomator régebbi verziói nem fogják tudni megnyitni a frissített tárolót.
migration.start.remarkCanRun=Meg kell győződnie arról, hogy minden eszköz, amelyről eléri ezt a széfet képes futtatni a Cryptomator ezen verzióját. migration.start.remarkCanRun=Meg kell győződnie arról, hogy minden eszköz, amelyről eléri ezt a titkosított tárolót, képes futtatni a Cryptomator ezen verzióját.
migration.start.remarkSynced=Meg kell győződnie arról, hogy a széfe teljesen szinkronizálva van ezen és az összes többi eszközön a frissítés előtt. migration.start.remarkSynced=Meg kell győződnie arról, hogy a tároló teljesen szinkronizálva van ezen és az összes többi eszközön a frissítés előtt.
migration.start.confirm=Elolvastam és megértettem a fenti információkat migration.start.confirm=Elolvastam és megértettem a fenti információkat
## Run ## Run
migration.run.enterPassword=Írja be a jelszót a következőhöz Enter the password for "%s" migration.run.enterPassword=Írja be a jelszót a következőhöz Enter the password for "%s"
migration.run.startMigrationBtn=Széf frissítése migration.run.startMigrationBtn=Tároló frissítése
migration.run.progressHint=Ez eltarthat egy darabig… migration.run.progressHint=Ez eltarthat egy darabig…
## Success ## Success
migration.success.nextStepsInstructions=A "%s" sikeresen migrálva. \nMost már feloldhatja a széfet. migration.success.nextStepsInstructions=A "%s" sikeresen migrálva. \nMost már feloldhatja a titkosított tárolót.
migration.success.unlockNow=Azonnali feloldás migration.success.unlockNow=Azonnali feloldás
## Missing file system capabilities ## Missing file system capabilities
migration.error.missingFileSystemCapabilities.title=Nem támogatott fájlrendszer migration.error.missingFileSystemCapabilities.title=Nem támogatott fájlrendszer
migration.error.missingFileSystemCapabilities.description=A migráció nem kezdődött el, mert a széf nem megfelelő fájlrendszeren található. migration.error.missingFileSystemCapabilities.description=A migráció nem kezdődött el, mert a tároló nem megfelelő fájlrendszeren található.
migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=A fájlrendszer nem támogatja a hosszú fájlneveket. migration.error.missingFileSystemCapabilities.reason.LONG_FILENAMES=A fájlrendszer nem támogatja a hosszú fájlneveket.
migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=A fájlrendszer nem támogatja a hosszú útvonalakat. migration.error.missingFileSystemCapabilities.reason.LONG_PATHS=A fájlrendszer nem támogatja a hosszú útvonalakat.
migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=A fájlrendszer nem teszi lehetővé az olvasást. migration.error.missingFileSystemCapabilities.reason.READ_ACCESS=A fájlrendszer nem teszi lehetővé az olvasást.
migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=A fájlrendszer nem teszi lehetővé az írást. migration.error.missingFileSystemCapabilities.reason.WRITE_ACCESS=A fájlrendszer nem teszi lehetővé az írást.
## Impossible ## Impossible
migration.impossible.heading=A széf frissítése sikertelen migration.impossible.heading=A titkosított tároló frissítése sikertelen
migration.impossible.reason=A széfet nem lehet automatikusan frissíteni, mert a tárolási helye vagy a hozzáférési pontja nem kompatibilis. migration.impossible.reason=A tárolót nem lehet automatikusan frissíteni, mert a tárolási helye vagy a hozzáférési pontja nem kompatibilis.
migration.impossible.moreInfo=A széf továbbra is megnyitható marad egy régebbi verzióval. A széf kézi frissítésével kapcsolatos utasításokért keresse fel a következő címet: migration.impossible.moreInfo=A tároló továbbra is megnyitható marad egy régebbi verzióval. A titkosított tároló kézi frissítésével kapcsolatos utasításokért keresse fel a következő címet
# Health Check # Health Check
## Start ## Start
health.title="%s" állapotellenőrzése health.title="%s" állapotellenőrzése
health.intro.header=Állapotfelmérés health.intro.header=Állapotfelmérés
health.intro.text=Az állapotfelmérés olyan ellenőrzéscsomag, amely felderíti és esetlegesen kijavítja a trezor belső szerkezetében fellépő problémákat. Kérjük, ne feledje: health.intro.text=Az állapotfelmérés olyan ellenőrzéscsomag, amely felderíti és esetlegesen kijavítja a titkosított tároló belső szerkezetében fellépő problémákat. Kérjük, ne feledje:
health.intro.remarkSync=Győződjön meg arról, hogy minden eszköz teljesen szinkronizálva van, ez megoldja a legtöbb problémát. health.intro.remarkSync=Győződjön meg arról, hogy minden eszköz teljesen szinkronizálva van, ez megoldja a legtöbb problémát.
health.intro.remarkFix=Nem minden probléma javítható. health.intro.remarkFix=Nem minden probléma javítható.
health.intro.remarkBackup=Ha az adatok sérültek, csak a biztonsági mentés segíthet. health.intro.remarkBackup=Ha az adatok sérültek, csak a biztonsági mentés segíthet.
health.intro.affirmation=Elolvastam és megértettem a fenti információkat health.intro.affirmation=Elolvastam és megértettem a fenti információkat
## Start Failure ## Start Failure
health.fail.header=Hiba a Trezor konfiguráció betöltésekor health.fail.header=Hiba a tároló konfigurációjának betöltésekor
health.fail.ioError=Hiba történt a konfigurációs fájl elérése és olvasása közben. health.fail.ioError=Hiba történt a konfigurációs fájl elérése és olvasása közben.
health.fail.parseError=Hiba történt a tároló konfigurációjának elemzése közben. health.fail.parseError=Hiba történt a tároló konfigurációjának elemzése közben.
health.fail.moreInfo=További infó health.fail.moreInfo=További infó
@@ -260,6 +285,8 @@ health.check.detail.checkFinishedAndFound=Az ellenőrzés véget ért. Kérem el
health.check.detail.checkFailed=Az ellenőrzés egy hiba miatt megszakadt. health.check.detail.checkFailed=Az ellenőrzés egy hiba miatt megszakadt.
health.check.detail.checkCancelled=Az ellenőrzés meg lett szakítva. health.check.detail.checkCancelled=Az ellenőrzés meg lett szakítva.
health.check.detail.listFilters.label=Szűrő health.check.detail.listFilters.label=Szűrő
health.check.detail.filterSeverity=Szűrés súlyosság szerint
health.check.detail.filterFixState=Szűrés állapot szerint
health.check.detail.fixAllSpecificBtn=Az összes ilyen javítása health.check.detail.fixAllSpecificBtn=Az összes ilyen javítása
health.check.exportBtn=Jelentés exportálása health.check.exportBtn=Jelentés exportálása
## Result view ## Result view
@@ -268,10 +295,10 @@ health.result.severityFilter.good=Rendben
health.result.severityFilter.info=Infó health.result.severityFilter.info=Infó
health.result.severityFilter.warn=Figyelmeztetés health.result.severityFilter.warn=Figyelmeztetés
health.result.severityFilter.crit=Kritikus health.result.severityFilter.crit=Kritikus
health.result.severityTip.good=Súlyosság: Jó\nNormális séf struktúra. health.result.severityTip.good=Súlyosság: Jó\nNormális tároló struktúra.
health.result.severityTip.info=Súlyosság: Info\nA széf struktúrája ép, javítás ajánlott. health.result.severityTip.info=Súlyosság: Infó\nA tároló struktúrája ép, javítás ajánlott.
health.result.severityTip.warn=Súlyosság: Figyelmeztetés\nA széf struktúrája sérült, javítás erősen ajánlott. health.result.severityTip.warn=Súlyosság: Figyelmeztetés\nA tároló struktúrája sérült, javítás erősen ajánlott.
health.result.severityTip.crit=Súlyosság: Kritikus\nA széf struktúrája sérült, adatvesztés áll fönt. health.result.severityTip.crit=Súlyosság: Kritikus\nA tároló struktúrája sérült, adatvesztés veszélye áll fenn.
health.result.fixStateFilter.all=Javítás státusz - Mind health.result.fixStateFilter.all=Javítás státusz - Mind
health.result.fixStateFilter.fixable=Javítható health.result.fixStateFilter.fixable=Javítható
health.result.fixStateFilter.notFixable=Nem javítható health.result.fixStateFilter.notFixable=Nem javítható
@@ -288,12 +315,13 @@ preferences.title=Beállítások
## General ## General
preferences.general=Általános preferences.general=Általános
preferences.general.startHidden=Az ablak elrejtése a Cryptomator indítása után preferences.general.startHidden=Az ablak elrejtése a Cryptomator indítása után
preferences.general.autoCloseVaults=Széfek lezárása megerősítés nélkül az alkalmazás bezárásakor preferences.general.autoCloseVaults=Titkosított tárolók lezárása megerősítés nélkül az alkalmazás bezárásakor
preferences.general.debugLogging=Hibakeresési naplózás engedélyezése preferences.general.debugLogging=Hibakeresési naplózás engedélyezése
preferences.general.debugDirectory=Naplófájlok megjelenítése preferences.general.debugDirectory=Naplófájlok megjelenítése
preferences.general.autoStart=Cryptomator indítása a rendszerrel együtt preferences.general.autoStart=Cryptomator indítása a rendszerrel együtt
preferences.general.keychainBackend=Itt tárolja a jelszavakat preferences.general.keychainBackend=Itt tárolja a jelszavakat
preferences.general.quickAccessService=Adja a feloldott széfeket a gyors elérési területhez preferences.general.quickAccessService=A feloldott tárolókat a Gyors elérési területhez adja
preferences.general.resetTrustedHosts=A megbízható kiszolgálók visszaállítása
## Interface ## Interface
preferences.interface=Kezelőfelület preferences.interface=Kezelőfelület
preferences.interface.theme=Megjelenés preferences.interface.theme=Megjelenés
@@ -307,7 +335,7 @@ preferences.interface.interfaceOrientation=Felhasználói felület tájolása
preferences.interface.interfaceOrientation.ltr=Balról jobbra preferences.interface.interfaceOrientation.ltr=Balról jobbra
preferences.interface.interfaceOrientation.rtl=Jobbról balra preferences.interface.interfaceOrientation.rtl=Jobbról balra
preferences.interface.showTrayIcon=Tálca ikon megjelenítése (újraindítás szükséges) preferences.interface.showTrayIcon=Tálca ikon megjelenítése (újraindítás szükséges)
preferences.interface.compactMode=Kompakt széflista engedélyezése preferences.interface.compactMode=Kompakt tárolólista engedélyezése
## Volume ## Volume
preferences.volume=Virtuális meghajtó preferences.volume=Virtuális meghajtó
preferences.volume.type=Alapértelmezett kötet típus preferences.volume.type=Alapértelmezett kötet típus
@@ -332,8 +360,13 @@ preferences.updates.lastUpdateCheck.never=soha
preferences.updates.lastUpdateCheck.recently=mostanában preferences.updates.lastUpdateCheck.recently=mostanában
preferences.updates.lastUpdateCheck.daysAgo=%s nappal ezelőtt preferences.updates.lastUpdateCheck.daysAgo=%s nappal ezelőtt
preferences.updates.lastUpdateCheck.hoursAgo=%s órával ezelőtt preferences.updates.lastUpdateCheck.hoursAgo=%s órával ezelőtt
preferences.updates.prohibitedDueToUnlockedVaults.1=Kérem
preferences.updates.prohibitedDueToUnlockedVaults.2=zárolja tárolóit
preferences.updates.prohibitedDueToUnlockedVaults.3=a frissítés telepítéséhez.
preferences.updates.checkFailed=A frissítések keresése sikertelen. Kérem, ellenőrizze az internetkapcsolatát, vagy próbálja meg később újra. preferences.updates.checkFailed=A frissítések keresése sikertelen. Kérem, ellenőrizze az internetkapcsolatát, vagy próbálja meg később újra.
preferences.updates.updateFailed=A frissítés nem sikerült. Kérjük, telepítse a frissítést manuálisan.
preferences.updates.upToDate=A Cryptomator naprakész. preferences.updates.upToDate=A Cryptomator naprakész.
preferences.updates.visitDownloadPage=Látogasson el a letöltési oldalra
## Contribution ## Contribution
preferences.contribute=Támogasson bennünket preferences.contribute=Támogasson bennünket
@@ -344,15 +377,17 @@ preferences.contribute.promptText=Ide illessze be támogatói igazolása kódjá
preferences.contribute.thankYou=Köszönjük, hogy támogatja a Cryptomator nyílt forráskódú fejlesztését! preferences.contribute.thankYou=Köszönjük, hogy támogatja a Cryptomator nyílt forráskódú fejlesztését!
preferences.contribute.donate=Támogatás preferences.contribute.donate=Támogatás
preferences.contribute.sponsor=Szponzor preferences.contribute.sponsor=Szponzor
preferences.contribute.removeCert.tooltip=Tanúsítvány eltávolítása
### Remove License Key Dialog ### Remove License Key Dialog
removeCert.title=Tanúsítvány eltávolítása removeCert.title=Tanúsítvány eltávolítása
removeCert.message=Eltávolítja a támogatói tanúsítványt? removeCert.message=Eltávolítja a támogatói tanúsítványt?
removeCert.description=A Cryptomator alapvető funkcióit ez nem érinti. Sem a széfekhez való hozzáférés nem korlátozott, sem a biztonsági szint nem csökken. removeCert.description=A Cryptomator alapvető funkcióit ez nem érinti. Sem a titkosított tárolókhoz való hozzáférés nem korlátozott, sem a biztonsági szint nem csökken.
#<-- Add entries for donations and code/translation/documentation contribution --> #<-- Add entries for donations and code/translation/documentation contribution -->
## About ## About
preferences.about=Rólunk preferences.about=Rólunk
preferences.about.thirdPartyLicenses=Harmadik felek által kiadott licencek
# Vault Statistics # Vault Statistics
stats.title=Statisztika ehhez %s stats.title=Statisztika ehhez %s
@@ -392,32 +427,40 @@ stats.access.total=Összes hozzáférés: %d
# Main Window # Main Window
## Vault List ## Vault List
main.vaultlist=Széfek main.vaultlist=Széfek
main.vaultlist.emptyList.onboardingInstruction=Kattintson ide egy széf hozzáadásához main.vaultlist.listEntry=Titkosított tároló %s (%s)
main.vaultlist.emptyList.onboardingInstruction=Kattintson ide egy titkosított tároló hozzáadásához
main.vaultlist.contextMenu.remove=Eltávolítás… main.vaultlist.contextMenu.remove=Eltávolítás…
main.vaultlist.contextMenu.lock=Zárolás main.vaultlist.contextMenu.lock=Zárolás
main.vaultlist.contextMenu.unlock=Feloldás… main.vaultlist.contextMenu.unlock=Feloldás…
main.vaultlist.contextMenu.unlockNow=Azonnali feloldás main.vaultlist.contextMenu.unlockNow=Azonnali feloldás
main.vaultlist.contextMenu.vaultoptions=Széf beállítások main.vaultlist.contextMenu.vaultoptions=Titkosított tároló beállításai
main.vaultlist.contextMenu.reveal=Széf megjelenítése main.vaultlist.contextMenu.reveal=Tároló megjelenítése
main.vaultlist.contextMenu.share=Megosztás… main.vaultlist.contextMenu.share=Megosztás…
main.vaultlist.addVaultBtn.menuItemNew=Új titkosított tároló létrehozása…
main.vaultlist.addVaultBtn.menuItemExisting=Titkosított tároló megnyitása…
main.vaultlist.addVaultBtn.menuItemRecover=Titkosított tároló visszaállítása…
main.vaultlist.addVaultButton.tooltip=Széf hozzáadása main.vaultlist.addVaultButton.tooltip=Széf hozzáadása
main.vaultlist.showEventsButton.tooltip=Eseménynapló megnyitása
main.vaultlist.showPreferencesButton.tooltip=Beállítások megnyitása
##Notification ##Notification
main.notification.updateAvailable=Frissítés elérhető. main.notification.updateAvailable=Frissítés elérhető.
main.notification.support=Cryptomator támogatása. main.notification.support=Cryptomator támogatása.
main.notification.closeButton.tooltip=Az információs sáv bezárása
## Vault Detail ## Vault Detail
### Welcome ### Welcome
main.vaultDetail.welcomeOnboarding=Köszönjük, hogy a Cryptomator programot választotta a fájlai védelmére. Ha segítségre van szüksége, akkor olvassa el a kezdő útmutatónk lépéseit: main.vaultDetail.welcomeOnboarding=Köszönjük, hogy a Cryptomator programot választotta a fájljai védelmére. Ha segítségre van szüksége, akkor olvassa el a kezdő útmutatónk lépéseit:
main.vaultDetail.storageLocation=Titkosított tároló helye
### Locked ### Locked
main.vaultDetail.lockedStatus=ZÁROLVA main.vaultDetail.lockedStatus=ZÁROLVA
main.vaultDetail.unlockBtn=Feloldás… main.vaultDetail.unlockBtn=Feloldás…
main.vaultDetail.unlockNowBtn=Azonnali feloldás main.vaultDetail.unlockNowBtn=Azonnali feloldás
main.vaultDetail.optionsBtn=Széf beállítások main.vaultDetail.optionsBtn=Titkosított tároló beállításai
main.vaultDetail.passwordSavedInKeychain=Jelszó mentve main.vaultDetail.passwordSavedInKeychain=Jelszó mentve
main.vaultDetail.share=Megosztás… main.vaultDetail.share=Megosztás…
### Unlocked ### Unlocked
main.vaultDetail.unlockedStatus=FELOLDVA main.vaultDetail.unlockedStatus=FELOLDVA
main.vaultDetail.accessLocation=A széf tartalma itt érhető el: main.vaultDetail.accessLocation=A tároló tartalma itt érhető el:
main.vaultDetail.revealBtn=Széf megjelenítése main.vaultDetail.revealBtn=Tároló megjelenítése
main.vaultDetail.copyUri=URI másolása main.vaultDetail.copyUri=URI másolása
main.vaultDetail.lockBtn=Zárolás main.vaultDetail.lockBtn=Zárolás
main.vaultDetail.bytesPerSecondRead=Olvasás: main.vaultDetail.bytesPerSecondRead=Olvasás:
@@ -425,21 +468,26 @@ main.vaultDetail.bytesPerSecondWritten=Írás:
main.vaultDetail.throughput.idle=tétlen main.vaultDetail.throughput.idle=tétlen
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=Széf statisztika main.vaultDetail.stats=Tároló statisztika
main.vaultDetail.locateEncryptedFileBtn=Titkosított fájl megkeresése main.vaultDetail.locateEncryptedFileBtn=Titkosított fájl megkeresése
main.vaultDetail.locateEncryptedFileBtn.tooltip=Válasszon a széfből egy fájlt a titkosított megfelelőjének megkereséséhez main.vaultDetail.locateEncryptedFileBtn.tooltip=Válasszon a tárolóból egy fájlt a titkosított megfelelőjének megkereséséhez
main.vaultDetail.encryptedPathsCopied=Az útvonal a vágólapra került! main.vaultDetail.encryptedPathsCopied=Az útvonal a vágólapra került!
main.vaultDetail.locateEncrypted.filePickerTitle=Fájl kiválasztása a tárolóból
main.vaultDetail.decryptName.buttonLabel=Fájlnevek visszafejtése
main.vaultDetail.decryptName.tooltip=Válasszon ki egy fájlt a titkosított tárolóból, hogy visszafejtse a nevét
### Missing ### Missing
main.vaultDetail.missing.info=A Cryptomator nem talált széfet ezen az útvonalon. main.vaultDetail.missing.info=A Cryptomator nem talált titkosított tárolót ezen az útvonalon.
main.vaultDetail.missing.recheck=Ellenőrizze újra main.vaultDetail.missing.recheck=Ellenőrizze újra
main.vaultDetail.missing.remove=A széf eltávolítása a listából… main.vaultDetail.missing.remove=A tároló eltávolítása a listából…
main.vaultDetail.missing.changeLocation=A széf helyének megváltoztatása… main.vaultDetail.missing.changeLocation=A titkosított tároló helyének megváltoztatása…
### Missing Vault Config ### Missing Vault Config
main.vaultDetail.missingVaultConfig.info=A tároló konfigurációja hiányzik.
main.vaultDetail.missingVaultConfig.restore=Tároló konfiguráció helyreállítása
### Needs Migration ### Needs Migration
main.vaultDetail.migrateButton=Széf frissítése main.vaultDetail.migrateButton=Tároló frissítése
main.vaultDetail.migratePrompt=A széfet új formátumra kell frissíteni, mielőtt hozzáférhet main.vaultDetail.migratePrompt=A titkosított tárolót új formátumra kell frissíteni, mielőtt hozzáférhet
### Error ### Error
main.vaultDetail.error.info=Hiba történt a széf merevlemezről való betöltése során. main.vaultDetail.error.info=Hiba történt a titkosított tároló merevlemezről való betöltése során.
main.vaultDetail.error.reload=Újratöltés main.vaultDetail.error.reload=Újratöltés
main.vaultDetail.error.windowTitle=Hiba az adatok betöltése közben main.vaultDetail.error.windowTitle=Hiba az adatok betöltése közben
@@ -448,7 +496,7 @@ wrongFileAlert.title=Hogyan lehet fájlokat titkosítani
wrongFileAlert.message=Próbálta ezeket a fájlokat titkosítani? wrongFileAlert.message=Próbálta ezeket a fájlokat titkosítani?
wrongFileAlert.description=Erre a célra a Cryptomator egy kötetet biztosít a rendszer fájlkezelőjében. wrongFileAlert.description=Erre a célra a Cryptomator egy kötetet biztosít a rendszer fájlkezelőjében.
wrongFileAlert.instruction.0=Hogy titkosítsa a fájlokat kövesse a következő lépéseket: wrongFileAlert.instruction.0=Hogy titkosítsa a fájlokat kövesse a következő lépéseket:
wrongFileAlert.instruction.1=1. Oldja fel a széfet. wrongFileAlert.instruction.1=1. Oldja fel a titkosított tárolót.
wrongFileAlert.instruction.2=2. Kattintson a "Megjelenítés" gombra, hogy megnyissa a kötetet a fájlkezelőjében. wrongFileAlert.instruction.2=2. Kattintson a "Megjelenítés" gombra, hogy megnyissa a kötetet a fájlkezelőjében.
wrongFileAlert.instruction.3=3. Adjon hozzá fájlokat a kötethez. wrongFileAlert.instruction.3=3. Adjon hozzá fájlokat a kötethez.
wrongFileAlert.link=További segítségért látogasson el ide wrongFileAlert.link=További segítségért látogasson el ide
@@ -456,10 +504,11 @@ wrongFileAlert.link=További segítségért látogasson el ide
# Vault Options # Vault Options
## General ## General
vaultOptions.general=Általános vaultOptions.general=Általános
vaultOptions.general.vaultName=A széf neve vaultOptions.general.vaultName=A tároló neve
vaultOptions.general.autoLock.lockAfterTimePart1=Lezárás, ha tétlen vaultOptions.general.autoLock.lockAfterTimePart1=Lezárás, ha tétlen
vaultOptions.general.autoLock.lockAfterTimePart2=perc vaultOptions.general.autoLock.lockAfterTimePart2=perc
vaultOptions.general.unlockAfterStartup=A széf feloldása a Cryptomator indításakor vaultOptions.general.autoLock.accessibleText=Zárolási időkorlát percben
vaultOptions.general.unlockAfterStartup=A titkosított tároló feloldása a Cryptomator indításakor
vaultOptions.general.actionAfterUnlock=Sikeres feloldás után vaultOptions.general.actionAfterUnlock=Sikeres feloldás után
vaultOptions.general.actionAfterUnlock.ignore=Ne tegyen semmit vaultOptions.general.actionAfterUnlock.ignore=Ne tegyen semmit
vaultOptions.general.actionAfterUnlock.reveal=Jelenítse meg a kötetet vaultOptions.general.actionAfterUnlock.reveal=Jelenítse meg a kötetet
@@ -486,19 +535,21 @@ vaultOptions.mount.volume.type=Kötet típus
vaultOptions.masterkey=Jelszó vaultOptions.masterkey=Jelszó
vaultOptions.masterkey.changePasswordBtn=Jelszó megváltoztatása vaultOptions.masterkey.changePasswordBtn=Jelszó megváltoztatása
vaultOptions.masterkey.forgetSavedPasswordBtn=Mentett jelszó törlése vaultOptions.masterkey.forgetSavedPasswordBtn=Mentett jelszó törlése
vaultOptions.masterkey.recoveryKeyExplanation=A helyreállítási kulcs az egyetlen módja annak, hogy visszaállítsa a széfhez való hozzáférést, ha elveíti a jelszavát. vaultOptions.masterkey.recoveryKeyExplanation=A helyreállítási kulcs az egyetlen módja annak, hogy visszaállítsa a tárolóhoz való hozzáférést, ha elveszíti a jelszavát.
vaultOptions.masterkey.showRecoveryKeyBtn=Visszaállítási kulcs megjelenítése vaultOptions.masterkey.showRecoveryKeyBtn=Visszaállítási kulcs megjelenítése
vaultOptions.masterkey.recoverPasswordBtn=Jelszó visszaállítása vaultOptions.masterkey.recoverPasswordBtn=Jelszó visszaállítása
vaultOptions.masterkey.missingMasterkeyFile=Ezek az beállítások csak akkor érhetők el, ha a masterkey fájl megtalálható a tároló könyvtárában.
## Hub ## Hub
vaultOptions.hub=Helyreállítás vaultOptions.hub=Helyreállítás
vaultOptions.hub.convertInfo=Ezen visszaállítási kulcs segítségével átváltoztathatja ezt a Hub széfet egy jelszó-alapú széffé vészhelyzet esetén. vaultOptions.hub.convertInfo=Ezen visszaállítási kulcs segítségével átváltoztathatja ezt a Hub-tárolót egy jelszó-alapú titkosított tárolóvá vészhelyzet esetén.
vaultOptions.hub.convertBtn=Jelszó-alapú széffé alakítás vaultOptions.hub.convertBtn=Jelszó-alapú tárolóvá alakítás
# Recovery Key # Recovery Key
## Display Recovery Key ## Display Recovery Key
recoveryKey.display.title=Visszaállítási kulcs mutatása recoveryKey.display.title=Visszaállítási kulcs mutatása
recoveryKey.create.message=Jelszó szükséges recoveryKey.create.message=Jelszó szükséges
recoveryKey.create.description=Írja be a jelszavát a "%s" visszaállítási kulcsának megjelenítéséhez: recoveryKey.create.description=Írja be a jelszavát a "%s" visszaállítási kulcsának megjelenítéséhez:
recoveryKey.recover.description=Adja meg a jelszót a "%s" tárolóhoz, hogy helyreállítsa a tároló konfigurációját.
recoveryKey.display.description=A következő helyreállítási kulcs használható a "%s" hozzáférésének visszaállítására: recoveryKey.display.description=A következő helyreállítási kulcs használható a "%s" hozzáférésének visszaállítására:
recoveryKey.display.StorageHints=Tartsa nagyon biztonságos helyen. pl.:\n •Tárolja egy jelszókezelővel\n •Mentse el egy USB meghajtóra\n •Nyomtassa egy papírra recoveryKey.display.StorageHints=Tartsa nagyon biztonságos helyen. pl.:\n •Tárolja egy jelszókezelővel\n •Mentse el egy USB meghajtóra\n •Nyomtassa egy papírra
## Reset Password ## Reset Password
@@ -506,41 +557,71 @@ recoveryKey.display.StorageHints=Tartsa nagyon biztonságos helyen. pl.:\n •T
recoveryKey.recover.title=Jelszó visszaállítása recoveryKey.recover.title=Jelszó visszaállítása
recoveryKey.recover.prompt=Írja be a visszaállítási kulcsot a következőhöz "%s": recoveryKey.recover.prompt=Írja be a visszaállítási kulcsot a következőhöz "%s":
recoveryKey.recover.correctKey=Ez a visszaállítási kulcs érvényes recoveryKey.recover.correctKey=Ez a visszaállítási kulcs érvényes
recoveryKey.recover.wrongKey=Ez a visszaállítási kulcs egy másik széfhez tartozik recoveryKey.recover.wrongKey=Ez a visszaállítási kulcs egy másik titkosított tárolóhóz tartozik
recoveryKey.recover.invalidKey=Ez a visszaállítási kulcs nem érvényes recoveryKey.recover.invalidKey=Ez a visszaállítási kulcs nem érvényes
recoveryKey.printout.heading=Cryptomator visszaállítási kulcs\n"%s"\n recoveryKey.printout.heading=Cryptomator visszaállítási kulcs\n"%s"\n
### Reset Password ### Reset Password
recoveryKey.recover.resetBtn=Visszaállítás recoveryKey.recover.resetBtn=Visszaállítás
recoveryKey.recover.recoverBtn=Helyreállítás
### Recovery Key Password Reset Success ### Recovery Key Password Reset Success
recoveryKey.recover.resetSuccess.message=A jelszó alaphelyzetbe állítása sikeresen megtörtént recoveryKey.recover.resetSuccess.message=A jelszó alaphelyzetbe állítása sikeresen megtörtént
recoveryKey.recover.resetSuccess.description=Feloldhatja a széfet az új jelszóval. recoveryKey.recover.resetSuccess.description=Feloldhatja a titkosított tárolót az új jelszóval.
### Recovery Key Vault Config Reset Success ### Recovery Key Vault Config Reset Success
recoveryKey.recover.resetVaultConfigSuccess.message=Tároló konfiguráció helyreállítva
recoveryKey.recover.resetMasterkeyFileSuccess.message=A mesterkulcsfájl helyreállítva
recoveryKey.recover.resetMasterkeyFileSuccess.description=Mostantól a jelszavával oldhatja fel a titkosított tárolót.
# Recover Vault Config File and/or Masterkey # Recover Vault Config File and/or Masterkey
##Add Existing Vault without recovery - Dialog ##Add Existing Vault without recovery - Dialog
recover.existing.title=Titkosított tároló hozzáadva
recover.existing.message=A tároló sikeresen hozzáadva
recover.existing.description=A "%s" titkosított tároló hozzáadásra került a tárolók listájára. Helyreállítási műveletre nem volt szükség.
##Vault Already Exists - Dialog ##Vault Already Exists - Dialog
recover.alreadyExists.title=A titkosított tároló már létezik
recover.alreadyExists.message=Ez a tároló már hozzá lett adva
recover.alreadyExists.description="%s" nevű titkosított tároló már hozzá volt adva a tárolók listájához, ezért nem került újból hozzáadásra.
##Invalid Selection - Dialog ##Invalid Selection - Dialog
recover.invalidSelection.title=Érvénytelen kiválasztás
recover.invalidSelection.message=A kiválasztott elem nem titkosított tároló
recover.invalidSelection.description=A kiválasztott mappának érvényes Cryptomator tárolónak kell lennie.
## Contact Hub Vault Owner - Dialog ## Contact Hub Vault Owner - Dialog
contactHubVaultOwner.title=Hub széf contactHubVaultOwner.title=Hub széf
contactHubVaultOwner.message=Ezt a titkosító tárolót a Cryptomator Hub segítségével hozták létre
contactHubVaultOwner.description=Kérjük, vegye fel a kapcsolatot a tároló tulajdonosával a hiányzó fájl helyreállítása érdekében. A tároló-sablont a Cryptomator Hubról töltheti le.
##Dialog Title ##Dialog Title
recover.recoverVaultConfig.title=Titkosított tároló konfiguráció helyreállítása
recover.recoverMasterkey.title=Mesterkulcsfájl helyreállítása
## OnBoarding ## OnBoarding
recover.onBoarding.chooseMethod=Válasszon helyreállítási módszer:
recover.onBoarding.useRecoveryKey=Helyreállítási kulcs használata
recover.onBoarding.usePassword=Jelszó használata
recover.onBoarding.intro=Ellenőrizze a következőket:
recover.onBoarding.pleaseConfirm=Továbblépés előtt ellenőrizze a következőket:
recover.onBoarding.otherwisePleaseConfirm=Egyébként erősítse meg:
recover.onBoarding.allMissing.intro=Ha ezt a titkosított tárolót a Cryptomator Hub kezeli, akkor a könyvtár tulajdonosának kell helyreállítania az Ön számára.
recover.onBoarding.intro.ensure=Minden fájl teljes mértékben szinkronizálva van.
recover.onBoarding.affirmation=Elolvastam és megértettem ezeket a követelményeket
###Vault Config Missing ###Vault Config Missing
recover.onBoarding.intro.recoveryKey=Birtokában van a tároló helyreállítási kulcsa és tudja milyen haladó beállításokat használtak.
recover.onBoarding.intro.password=Birtokában van a tároló jelszava és tudja milyen haladó beállításokat használtak.
###Masterkey Missing ###Masterkey Missing
recover.onBoarding.intro.masterkey.recoveryKey=Birtokában van a tároló helyreállítási kulcsa.
## Expert Settings ## Expert Settings
recover.expertSettings.shorteningThreshold.title=Ennek az értéknek meg kell egyeznie a helyreállítás előtt használt értékkel, hogy biztosítva legyen a korábban titkosított adatokkal való kompatibilitás.
# Convert Vault # Convert Vault
convertVault.title=Széf átalakítása convertVault.title=Titkosított tároló átalakítása
convertVault.convert.convertBtn.before=Átalakítás convertVault.convert.convertBtn.before=Átalakítás
convertVault.convert.convertBtn.processing=Átalakítás… convertVault.convert.convertBtn.processing=Átalakítás…
convertVault.success.message=Sikeres átalakítás convertVault.success.message=Sikeres átalakítás
convertVault.hubToPassword.success.description=Feloldhatja a széfet a kiválasztott jelszóval Hub hozzáférés nélkül. convertVault.hubToPassword.success.description=Feloldhatja a titkosított tárolót a kiválasztott jelszóval Hub hozzáférés nélkül.
# New Password # New Password
newPassword.promptText=Adjon meg egy új jelszót newPassword.promptText=Adjon meg egy új jelszót
@@ -556,13 +637,13 @@ passwordStrength.messageLabel.4=Nagyon erős
# Quit # Quit
quit.title=Alkalmazás bezárása quit.title=Alkalmazás bezárása
quit.message=Vannak feloldott széfek quit.message=Vannak feloldott titkosított tárolók
quit.description=Kérem, erősítse meg a kilépési szándékát. A Cryptomator lezárja az összes feloldott széfet az adatvesztés elkerülése érdekében. quit.description=Kérem, erősítse meg a kilépési szándékát. A Cryptomator lezárja az összes feloldott titkosított tárolót az adatvesztés elkerülése érdekében.
quit.lockAndQuitBtn=Zárolás és kilépés quit.lockAndQuitBtn=Zárolás és kilépés
# Forced Quit # Forced Quit
quit.forced.message=Egyes széfeket nem lehetett lezárni quit.forced.message=Egyes tárolókat nem lehetett lezárni
quit.forced.description=A széfek zárolását függőbben lévő műveletek vagy megnyitott fájlok blokkolták. Kényszerítheti a maradék széfek zárolását, de az I/O megszakítása nem mentett adatok elvesztéséhez vezethet. quit.forced.description=A titkosított tárolók zárolását függőbben lévő műveletek vagy megnyitott fájlok blokkolták. Kényszerítheti a maradék tárolók zárolását, de az I/O megszakítása nem mentett adatok elvesztéséhez vezethet.
quit.forced.forceAndQuitBtn=Kényszerítés és Kilépés quit.forced.forceAndQuitBtn=Kényszerítés és Kilépés
# Update Reminder # Update Reminder
@@ -580,37 +661,76 @@ dokanySupportEnd.description=A Cryptomator nem támogatja tovább a Dokany köte
dokanySupportEnd.preferencesBtn=Beállítások megnyitása dokanySupportEnd.preferencesBtn=Beállítások megnyitása
#Retry If Readonly #Retry If Readonly
retryIfReadonly.title=Korlátozott Széf Hozzáférés retryIfReadonly.title=Korlátozott tároló hozzáférés
retryIfReadonly.message=Nincs írási jogod a széf könyvtárához retryIfReadonly.message=Nincs írási jogod a tároló könyvtárához
retryIfReadonly.description=A Cryptomator nem tud a széf könyvtárába írni. Átrakhatod a széfet írásvédettre és megpróbálhatod újra. Ezt az opciót kikapcsolhatod a széf beállításaiban. retryIfReadonly.description=A Cryptomator nem tud a tároló könyvtárába írni. Átrakhatod a tárolót írásvédettre és megpróbálhatod újra. Ezt az opciót kikapcsolhatod a titkosított tároló beállításaiban.
retryIfReadonly.retry=Változtatás és Újrapróbálás retryIfReadonly.retry=Változtatás és Újrapróbálás
# Share Vault # Share Vault
shareVault.title=Széf megosztása shareVault.title=Titkosított tároló megosztása
shareVault.message=Szeretné megosztani a széfét másokkal? shareVault.message=Szeretné megosztani a titkosított tárolóját másokkal?
shareVault.description=Mindig legyen óvatos, amikor másokkal osztja meg a széfét. Röviden, kövesse az alábbi lépéseket: shareVault.description=Mindig legyen óvatos, amikor másokkal osztja meg a tárolóit. Röviden, kövesse az alábbi lépéseket:
shareVault.instruction.1=Ossza meg a titkosított széf mappájának hozzáférését felhőalapú tárolón keresztül. shareVault.instruction.1=1. Ossza meg a titkosított tároló mappájának hozzáférését felhőalapú tárolón keresztül.
shareVault.instruction.2=2. Ossza meg a széf jelszavát biztonságos módon. shareVault.instruction.2=2. Ossza meg a titkosított tároló jelszavát biztonságos módon.
shareVault.remarkBestPractices=További információkért tekintse meg a legjobb gyakorlatokra vonatkozó javaslatokat a dokumentációnkban. shareVault.remarkBestPractices=További információkért tekintse meg a legjobb gyakorlatokra vonatkozó javaslatokat a dokumentációnkban.
shareVault.docsTooltip=Nyissa meg a dokumentációt, hogy többet megtudjon a széfek megosztásáról. shareVault.docsTooltip=Nyissa meg a dokumentációt, hogy többet megtudjon a titkosított tárolók megosztásáról.
shareVault.hubAd.description=A biztonságos mód csapatokban való munkavégzéshez shareVault.hubAd.description=A biztonságos mód csapatokban való munkavégzéshez
shareVault.hubAd.keyManagement=Nullaismeretű (Zero-knowledge) kulcskezelés shareVault.hubAd.keyManagement=• Zero-knowledge kulcskezelés
shareVault.hubAd.authentication=• Erős hitelesítés shareVault.hubAd.authentication=• Erős hitelesítés
shareVault.hubAd.encryption=• Végponttól végpontig terjedő titkosítás shareVault.hubAd.encryption=• Végponttól végpontig terjedő titkosítás
shareVault.visitHub=Látogassa meg a Cryptomator Hubot shareVault.visitHub=Látogassa meg a Cryptomator Hubot
shareVault.hub.message=Hogyan osszon meg egy Hub széfet shareVault.hub.message=Hogyan osszon meg egy Hub-tárolót
shareVault.hub.description=Ahhoz, hogy megossza a széf tartalmát egy másik csapattaggal, két lépést kell végrehajtania: shareVault.hub.description=Ahhoz, hogy megossza a tároló tartalmát egy másik csapattaggal, két lépést kell végrehajtania:
shareVault.hub.instruction.1=Ossza meg a titkosított széf mappájának hozzáférését felhőalapú tárolón keresztül. shareVault.hub.instruction.1=Ossza meg a titkosított széf mappájának hozzáférését felhőalapú tárolón keresztül.
shareVault.hub.instruction.2=2. Adjon hozzáférést a csapattagnak a Cryptomator Hubban. shareVault.hub.instruction.2=2. Adjon hozzáférést a csapattagnak a Cryptomator Hubban.
shareVault.hub.openHub=Nyissa meg a Cryptomator Hubot shareVault.hub.openHub=Nyissa meg a Cryptomator Hubot
# Decrypt File Names # Decrypt File Names
decryptNames.title=Fájlnevek visszafejtése
decryptNames.filePicker.title=Titkosított fájl kiválasztása
decryptNames.filePicker.extensionDescription=Cryptomator titkosított fájl
decryptNames.copyTable.tooltip=Táblázat másolása
decryptNames.clearTable.tooltip=Táblázat törlése
decryptNames.column.encrypted=Titkosított
decryptNames.column.decrypted=Visszafejtett
decryptNames.copyHint=A cella tartalmának másolása a következővel: %s
decryptNames.dropZone.message=Húzza ide a fájlokat, vagy kattintson a kiválasztáshoz
decryptNames.dropZone.error.vaultInternalFiles=A titkosított tároló belső fájljai nem visszafejthető névvel lettek kiválasztva
decryptNames.dropZone.error.foreignFiles=A kiválasztott fájlok nem a "%s" titkosított tárolóhoz tartoznak
decryptNames.dropZone.error.noDirIdBackup=A kiválasztott könyvtár nem tartalmaz dird.c9r fájlt
decryptNames.dropZone.error.generic=A fájlnevek visszafejtése nem sikerült
# Event View # Event View
eventView.title=Események
eventView.filter.allVaults=Mind
eventView.clearListButton.tooltip=Lista törlése
eventView.filterVaults=Szűrés tároló szerint
eventView.cell.actionsButton.tooltip=Eseményműveletek
## event list entries ## event list entries
eventView.entry.vaultLocked.description="%s" megnyitása a részletekért
eventView.entry.conflictResolved.message=Megoldott ütközések
eventView.entry.conflictResolved.showDecrypted=Titkosított fájlok megjelenítése
eventView.entry.conflict.message=Ütközés feloldása sikertelen
eventView.entry.conflict.showDecrypted=A visszafejtett, eredeti fájl megjelenítése
eventView.entry.conflict.showEncrypted=Az ütköző, titkosított fájl megjelenítése
eventView.entry.decryptionFailed.message=A visszafejtés sikertelen
eventView.entry.decryptionFailed.showEncrypted=Titkosított fájl megjelenítése
eventView.entry.brokenDirFile.message=Törött könyvtárhivatkozás
eventView.entry.brokenDirFile.showEncrypted=Törött, titkosított hivatkozás megjelenítése
eventView.entry.brokenFileNode.message=Meghibásodott fájlrendszer-csomópont
eventView.entry.brokenFileNode.showEncrypted=Meghibásodott, titkosított csomópont megjelenítése
eventView.entry.brokenFileNode.copyDecrypted=A visszafejtett elérési út másolása
eventView.entry.inUse.message=A fájl használatban van
eventView.entry.inUse.showDecrypted=Titkosított fájlok megjelenítése
eventView.entry.inUse.showEncrypted=Titkosított fájl megjelenítése
eventView.entry.inUse.copyUserAndDevice=A zároló felhasználó és eszköznév másolása
eventView.entry.inUse.ignoreLock=Használati állapot figyelmen kívül hagyása
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
notification.inUse.message=A fájlt egy másik eszközön használják
notification.inUse.description=A fájlt %s használja ezen a rendszeren: %s. Kérje meg, hogy zárja be a fájlt, és várja meg a szinkronizálás befejezését. Az állapot figyelmen kívül hagyásával most is megnyithatja, de ez ütközéseket okozhat, vagy felülírhatja az újabb módosításokat.
notification.inUse.action=Használati állapot figyelmen kívül hagyása
@@ -154,6 +154,8 @@ unlock.error.title=Gagal membuka kunci "%s"
hub.noKeychain.message=Tidak dapat mengakses perangkat kunci hub.noKeychain.message=Tidak dapat mengakses perangkat kunci
hub.noKeychain.description=Untuk membuka kunci Hub vault, diperlukan perangkat kunci, yang diamankan menggunakan keychain. Untuk melanjutkan, aktifkan “%s” dan pilih keychain di preferensi. hub.noKeychain.description=Untuk membuka kunci Hub vault, diperlukan perangkat kunci, yang diamankan menggunakan keychain. Untuk melanjutkan, aktifkan “%s” dan pilih keychain di preferensi.
hub.noKeychain.openBtn=Buka Preferensi hub.noKeychain.openBtn=Buka Preferensi
### Check Host Authenticity
hub.checkHostTrust.trustBtn=Percayai
### Waiting ### Waiting
hub.auth.message=Menunggu otentikasi… hub.auth.message=Menunggu otentikasi…
hub.auth.description=Anda secara otomatis akan diarahkan ke halaman login. hub.auth.description=Anda secara otomatis akan diarahkan ke halaman login.
@@ -183,6 +185,7 @@ hub.registerFailed.description.deviceAlreadyExists=Perangkat ini sudah terdaftar
### Unauthorized ### Unauthorized
hub.unauthorized.message=Akses ditolak hub.unauthorized.message=Akses ditolak
hub.unauthorized.description=Anda tidak punya otorisasi untuk membuka brankas ini. Hubungi pemilik brankas untuk meminta akses. hub.unauthorized.description=Anda tidak punya otorisasi untuk membuka brankas ini. Hubungi pemilik brankas untuk meminta akses.
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Tindakan diperlukan hub.requireAccountInit.message=Tindakan diperlukan
hub.requireAccountInit.description.0=Untuk melanjutkan, silakan lengkapi langkah-langkah yang diperlukan dalam hub.requireAccountInit.description.0=Untuk melanjutkan, silakan lengkapi langkah-langkah yang diperlukan dalam
@@ -614,4 +617,4 @@ eventView.filter.allVaults=Semua
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
+18 -1
View File
@@ -109,6 +109,13 @@ addvaultwizard.existing.restore=Ripristina…
addvaultwizard.existing.chooseBtn=Scegli… addvaultwizard.existing.chooseBtn=Scegli…
addvaultwizard.existing.filePickerTitle=Seleziona file cassaforte addvaultwizard.existing.filePickerTitle=Seleziona file cassaforte
addvaultwizard.existing.filePickerMimeDesc=Cassaforte di Cryptomator addvaultwizard.existing.filePickerMimeDesc=Cassaforte di Cryptomator
addvaultwizard.existing.notAVault.title=Non è una cassaforte
addvaultwizard.existing.notAVault.message=La cartella selezionata non è una cassaforte Cryptomator
addvaultwizard.existing.notAVault.description.missingDataDir=Manca la necessaria sottodirectory "d" all'interno di "%s".
addvaultwizard.existing.notAVault.description.dataNotADirectory=La voce "d" all'interno di "%s" non è una directory.
addvaultwizard.existing.notAVault.description.missingVaultConfig=Manca il file necessario "vault.cryptomator" all'interno di "%s".
addvaultwizard.existing.notAVault.description.vaultConfigAccessDenied=Il file "vault.cryptomator" che si trova dentro "%s" non può essere letto a causa di diritti di accesso insufficienti.
addvaultwizard.existing.notAVault.description.unsupportedStructure=La struttura della directory di "%s" non è supportata.
## Success ## Success
addvaultwizard.success.nextStepsInstructions=Cassaforte "%s" aggiunta.\nDevi sbloccare questa cassaforte per accedere o aggiungere contenuti. Altrimenti, puoi sbloccarla in qualsiasi momento successivo. addvaultwizard.success.nextStepsInstructions=Cassaforte "%s" aggiunta.\nDevi sbloccare questa cassaforte per accedere o aggiungere contenuti. Altrimenti, puoi sbloccarla in qualsiasi momento successivo.
addvaultwizard.success.unlockNow=Sblocca Ora addvaultwizard.success.unlockNow=Sblocca Ora
@@ -161,6 +168,12 @@ unlock.error.title=Sblocco "%s" non riuscito
hub.noKeychain.message=Impossibile accedere alla chiave del dispositivo hub.noKeychain.message=Impossibile accedere alla chiave del dispositivo
hub.noKeychain.description=Per sbloccare le casseforti Hub, è necessaria una chiave del dispositivo, che è protetta tramite un portachiavi. Per procedere, abilita "%s" e seleziona un portachiavi nelle preferenze. hub.noKeychain.description=Per sbloccare le casseforti Hub, è necessaria una chiave del dispositivo, che è protetta tramite un portachiavi. Per procedere, abilita "%s" e seleziona un portachiavi nelle preferenze.
hub.noKeychain.openBtn=Apri Preferenze hub.noKeychain.openBtn=Apri Preferenze
### Check Host Authenticity
hub.checkHostTrust.message.check=Controllo Configurazione…
hub.checkHostTrust.message.ask=Ti fidi di questo host?
hub.checkHostTrust.message.ask.plural=Ti fidi di questi host?
hub.checkHostTrust.trustBtn=Fidati
hub.checkHostTrust.denyBtn=Rifiuta
### Waiting ### Waiting
hub.auth.message=In attesa di autenticazione… hub.auth.message=In attesa di autenticazione…
hub.auth.description=Dovresti essere reindirizzato automaticamente alla pagina di login. hub.auth.description=Dovresti essere reindirizzato automaticamente alla pagina di login.
@@ -192,6 +205,9 @@ hub.archived.description=Questa cassaforte è stata archiviata e non è più acc
### Unauthorized ### Unauthorized
hub.unauthorized.message=Accesso negato hub.unauthorized.message=Accesso negato
hub.unauthorized.description=Non sei autorizzato ad aprire questa cassaforte. Chiedi l'accesso al proprietario. hub.unauthorized.description=Non sei autorizzato ad aprire questa cassaforte. Chiedi l'accesso al proprietario.
### Untrusted Host
hub.untrustedHost.message=Host non affidabile
hub.untrustedHost.description=La connessione all'Hub è stata bloccata per la tua sicurezza. Se ritieni che l'host Hub sia sicuro, contatta l'amministratore dell'Hub o riprova.
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=Azione richiesta hub.requireAccountInit.message=Azione richiesta
hub.requireAccountInit.description.0=Per procedere, completa i passaggi richiesti nel tuo hub.requireAccountInit.description.0=Per procedere, completa i passaggi richiesti nel tuo
@@ -305,6 +321,7 @@ preferences.general.debugDirectory=Rivela i file di registro
preferences.general.autoStart=Avvia Cryptomator all'avvio del sistema preferences.general.autoStart=Avvia Cryptomator all'avvio del sistema
preferences.general.keychainBackend=Memorizza le password con preferences.general.keychainBackend=Memorizza le password con
preferences.general.quickAccessService=Aggiungi cassaforte sbloccata all'area di accesso rapido preferences.general.quickAccessService=Aggiungi cassaforte sbloccata all'area di accesso rapido
preferences.general.resetTrustedHosts=Azzera gli host affidabili
## Interface ## Interface
preferences.interface=Interfaccia preferences.interface=Interfaccia
preferences.interface.theme=Aspetto preferences.interface.theme=Aspetto
@@ -716,4 +733,4 @@ eventView.entry.inUse.ignoreLock=Ignora lo stato di utilizzo
## FileIsInUse Notification ## FileIsInUse Notification
notification.inUse.message=Il file è in uso su un altro dispositivo notification.inUse.message=Il file è in uso su un altro dispositivo
notification.inUse.description=Il file è aperto da %s su %s. Chiedigli di chiudere il file e permettere che la sincronizzazione termini. È possibile ignorare lo stato ed aprirlo ora, ma questo può causare conflitti o la sovrascrittura delle modifiche più recenti. notification.inUse.description=Il file è aperto da %s su %s. Chiedigli di chiudere il file e permettere che la sincronizzazione termini. È possibile ignorare lo stato ed aprirlo ora, ma questo può causare conflitti o la sovrascrittura delle modifiche più recenti.
notification.inUse.action=Ignora lo Stato di Utilizzo notification.inUse.action=Ignora lo Stato di Utilizzo
@@ -154,6 +154,8 @@ unlock.error.title=ロック解除 "%s" に失敗しました。
hub.noKeychain.message=デバイス キーにアクセスできません hub.noKeychain.message=デバイス キーにアクセスできません
hub.noKeychain.description=ハブ金庫を解錠するには、キーチェーンが保護するデバイス キーが必要です。続行するには、"%s" を有効にし環境設定からキーチェーンを選択します。 hub.noKeychain.description=ハブ金庫を解錠するには、キーチェーンが保護するデバイス キーが必要です。続行するには、"%s" を有効にし環境設定からキーチェーンを選択します。
hub.noKeychain.openBtn=環境設定を開く hub.noKeychain.openBtn=環境設定を開く
### Check Host Authenticity
hub.checkHostTrust.trustBtn=信頼する
### Waiting ### Waiting
hub.auth.message=認証を待機中… hub.auth.message=認証を待機中…
hub.auth.description=ログイン ページに自動的にリダイレクトされます。 hub.auth.description=ログイン ページに自動的にリダイレクトされます。
@@ -183,6 +185,7 @@ hub.registerFailed.description.deviceAlreadyExists=このデバイスは既に
### Unauthorized ### Unauthorized
hub.unauthorized.message=アクセスが拒否されました hub.unauthorized.message=アクセスが拒否されました
hub.unauthorized.description=この金庫を開く権限がありません。金庫の所有者からアクセス許可を貰って下さい。 hub.unauthorized.description=この金庫を開く権限がありません。金庫の所有者からアクセス許可を貰って下さい。
### Untrusted Host
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=アクションが必要です hub.requireAccountInit.message=アクションが必要です
hub.requireAccountInit.description.0=続行するには以下のサイトで必要な手順を完了してください hub.requireAccountInit.description.0=続行するには以下のサイトで必要な手順を完了してください
@@ -632,4 +635,4 @@ eventView.entry.inUse.copyUserAndDevice=ロックしているユーザーとデ
# Notifications # Notifications
## FileIsInUse Notification ## FileIsInUse Notification
+21 -4
View File
@@ -109,6 +109,13 @@ addvaultwizard.existing.restore=복구…
addvaultwizard.existing.chooseBtn=선택… addvaultwizard.existing.chooseBtn=선택…
addvaultwizard.existing.filePickerTitle=Vault 파일 선택 addvaultwizard.existing.filePickerTitle=Vault 파일 선택
addvaultwizard.existing.filePickerMimeDesc=Cryptomator Vault addvaultwizard.existing.filePickerMimeDesc=Cryptomator Vault
addvaultwizard.existing.notAVault.title=Vault가 아님
addvaultwizard.existing.notAVault.message=선택한 폴더는 Cryptomator Vault가 아닙니다
addvaultwizard.existing.notAVault.description.missingDataDir="%s" 내부에 필수 "d" 하위 디렉터리가 누락되었습니다.
addvaultwizard.existing.notAVault.description.dataNotADirectory="%s" 내부의 "d" 항목은 디렉터리가 아닙니다.
addvaultwizard.existing.notAVault.description.missingVaultConfig="%s" 내부에 필수 "vault.cryptomator" 파일이 누락되었습니다.
addvaultwizard.existing.notAVault.description.vaultConfigAccessDenied=접근 권한이 부족하여 "%s" 내부의 "vault.cryptomator" 파일을 읽을 수 없습니다.
addvaultwizard.existing.notAVault.description.unsupportedStructure="%s"의 디렉터리 구조는 지원되지 않습니다.
## Success ## Success
addvaultwizard.success.nextStepsInstructions="%s" Vault가 추가되었습니다.\n이 Vault를 접근하거나 컨텐츠를 추가하려면 잠금 해제가 필요합니다. 그렇지만 언제든지 잠금 해제가 가능합니다. addvaultwizard.success.nextStepsInstructions="%s" Vault가 추가되었습니다.\n이 Vault를 접근하거나 컨텐츠를 추가하려면 잠금 해제가 필요합니다. 그렇지만 언제든지 잠금 해제가 가능합니다.
addvaultwizard.success.unlockNow=지금 잠금 해제 addvaultwizard.success.unlockNow=지금 잠금 해제
@@ -161,6 +168,12 @@ unlock.error.title="%s" 잠금 해제 실패
hub.noKeychain.message=기기 키에 액세스할 수 없습니다 hub.noKeychain.message=기기 키에 액세스할 수 없습니다
hub.noKeychain.description=Hub Vaults를 잠금 해제하려면 키체인을 사용하여 보호되는 기기 키가 필요합니다. 계속하려면 "%s"을(를) 활성화하고 기본 설정에서 키체인을 선택하십시오. hub.noKeychain.description=Hub Vaults를 잠금 해제하려면 키체인을 사용하여 보호되는 기기 키가 필요합니다. 계속하려면 "%s"을(를) 활성화하고 기본 설정에서 키체인을 선택하십시오.
hub.noKeychain.openBtn=설정 열기 hub.noKeychain.openBtn=설정 열기
### Check Host Authenticity
hub.checkHostTrust.message.check=구성 확인 중…
hub.checkHostTrust.message.ask=이 호스트를 신뢰하겠습니까?
hub.checkHostTrust.message.ask.plural=이 호스트를 신뢰하겠습니까?
hub.checkHostTrust.trustBtn=신뢰하기
hub.checkHostTrust.denyBtn=거부
### Waiting ### Waiting
hub.auth.message=인증 대기 중… hub.auth.message=인증 대기 중…
hub.auth.description=자동으로 로그인 페이지로 리다이렉트 될 것입니다. hub.auth.description=자동으로 로그인 페이지로 리다이렉트 될 것입니다.
@@ -192,6 +205,9 @@ hub.archived.description=이 Vault는 아카이브되어 더 이상 접근할
### Unauthorized ### Unauthorized
hub.unauthorized.message=액세스 거부됨 hub.unauthorized.message=액세스 거부됨
hub.unauthorized.description=해당 Vault에 접근하도록 허가되지 않았습니다. Vault의 소유자에게 권한을 요청하세요. hub.unauthorized.description=해당 Vault에 접근하도록 허가되지 않았습니다. Vault의 소유자에게 권한을 요청하세요.
### Untrusted Host
hub.untrustedHost.message=호스트를 신뢰할 수 없음
hub.untrustedHost.description=보안상의 이유로 Hub 연결이 차단되었습니다. Hub 호스트가 안전하다고 판단되시면 Hub 관리자에게 문의하거나 다시 시도해 주세요.
### Requires Account Initialization ### Requires Account Initialization
hub.requireAccountInit.message=조치가 필요함 hub.requireAccountInit.message=조치가 필요함
hub.requireAccountInit.description.0=진행하려면 필요한 조치를 완료하십시오: hub.requireAccountInit.description.0=진행하려면 필요한 조치를 완료하십시오:
@@ -199,7 +215,7 @@ 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.invalidLicense.description=Cryptomator Hub 인스턴스에 잘못된 라이선스가 있습니다. 라이선스를 업그레이드하거나 갱신하려면 Hub 관리자에게 알리십시오.
# Lock # Lock
## Force ## Force
@@ -305,6 +321,7 @@ preferences.general.debugDirectory=로그 파일 표시
preferences.general.autoStart=시스템 시작 시 Cryptomator 실행 preferences.general.autoStart=시스템 시작 시 Cryptomator 실행
preferences.general.keychainBackend=다음 경로에 비밀번호 저장 preferences.general.keychainBackend=다음 경로에 비밀번호 저장
preferences.general.quickAccessService=열린 Vault를 빠른 접근 위치에 추가하기 preferences.general.quickAccessService=열린 Vault를 빠른 접근 위치에 추가하기
preferences.general.resetTrustedHosts=신뢰하는 호스트 목록 초기화
## Interface ## Interface
preferences.interface=인터페이스 preferences.interface=인터페이스
preferences.interface.theme=테마 preferences.interface.theme=테마
@@ -581,7 +598,7 @@ recover.recoverMasterkey.title=마스터키 복구하기
## OnBoarding ## OnBoarding
recover.onBoarding.chooseMethod=복구 방법을 선택하세요: recover.onBoarding.chooseMethod=복구 방법을 선택하세요:
recover.onBoarding.useRecoveryKey=복구키 사용하기 recover.onBoarding.useRecoveryKey=복구 키 사용하기
recover.onBoarding.usePassword=비밀번호 사용하기 recover.onBoarding.usePassword=비밀번호 사용하기
recover.onBoarding.intro=아래 사항을 정확히 읽고 확인하세요: recover.onBoarding.intro=아래 사항을 정확히 읽고 확인하세요:
recover.onBoarding.pleaseConfirm=진행하기 전, 다음 사항을 확인해 주십시오: recover.onBoarding.pleaseConfirm=진행하기 전, 다음 사항을 확인해 주십시오:
@@ -700,7 +717,7 @@ eventView.entry.conflict.showDecrypted=복호화된 원본 파일 보기
eventView.entry.conflict.showEncrypted=충돌하는 암호화된 파일 보기 eventView.entry.conflict.showEncrypted=충돌하는 암호화된 파일 보기
eventView.entry.decryptionFailed.message=복호화 실패 eventView.entry.decryptionFailed.message=복호화 실패
eventView.entry.decryptionFailed.showEncrypted=암호화된 파일 보기 eventView.entry.decryptionFailed.showEncrypted=암호화된 파일 보기
eventView.entry.brokenDirFile.message=망가진 디렉터리 링크 eventView.entry.brokenDirFile.message=잘못된 디렉터리 링크
eventView.entry.brokenDirFile.showEncrypted=망가진 암호화된 링크 보기 eventView.entry.brokenDirFile.showEncrypted=망가진 암호화된 링크 보기
eventView.entry.brokenFileNode.message=망가진 파일 시스템 노드 eventView.entry.brokenFileNode.message=망가진 파일 시스템 노드
eventView.entry.brokenFileNode.showEncrypted=망가진 암호화된 노드 보기 eventView.entry.brokenFileNode.showEncrypted=망가진 암호화된 노드 보기
@@ -716,4 +733,4 @@ eventView.entry.inUse.ignoreLock=사용 여부 상태 무시
## FileIsInUse Notification ## FileIsInUse Notification
notification.inUse.message=다른 기기에서 파일 사용 중 notification.inUse.message=다른 기기에서 파일 사용 중
notification.inUse.description=해당 파일은 %s이(가) %s의 컴퓨터에서 열어 놓은 상태입니다. 파일을 닫고 동기화가 완료될 때까지 기다리도록 요청하세요. 상태를 무시하고 지금 파일을 열 수도 있지만, 이렇게 하면 충돌이 발생하거나 최신 변경 사항이 덮어쓰여질 수 있습니다. notification.inUse.description=해당 파일은 %s이(가) %s의 컴퓨터에서 열어 놓은 상태입니다. 파일을 닫고 동기화가 완료될 때까지 기다리도록 요청하세요. 상태를 무시하고 지금 파일을 열 수도 있지만, 이렇게 하면 충돌이 발생하거나 최신 변경 사항이 덮어쓰여질 수 있습니다.
notification.inUse.action=사용 여부 상태 무시 notification.inUse.action=사용 여부 상태 무시

Some files were not shown because too many files have changed in this diff Show More