Compare commits

...
Author SHA1 Message Date
dependabot[bot]andGitHub 1cd1f725ad Bump the maven-dependencies group across 1 directory with 13 updates
Bumps the maven-dependencies group with 13 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| org.slf4j:slf4j-api | `2.0.18` | `2.0.19` |
| [ch.qos.logback:logback-core](https://github.com/qos-ch/logback) | `1.5.35` | `1.6.3` |
| [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) | `1.5.35` | `1.6.3` |
| [com.auth0:java-jwt](https://github.com/auth0/java-jwt) | `4.5.2` | `4.6.1` |
| [com.google.dagger:dagger](https://github.com/google/dagger) | `2.59.2` | `2.60.1` |
| [com.google.dagger:dagger-compiler](https://github.com/google/dagger) | `2.59.2` | `2.60.1` |
| [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework) | `6.1.0` | `6.1.3` |
| [com.google.jimfs:jimfs](https://github.com/google/jimfs) | `1.3.1` | `1.3.2` |
| [org.apache.maven.plugins:maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) | `3.15.0` | `3.16.0` |
| [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) | `3.5.6` | `3.6.0` |
| [org.apache.maven.plugins:maven-jar-plugin](https://github.com/apache/maven-jar-plugin) | `3.5.0` | `3.5.1` |
| [org.owasp:dependency-check-maven](https://github.com/dependency-check/DependencyCheck) | `12.2.2` | `13.0.0` |
| [org.codehaus.mojo:exec-maven-plugin](https://github.com/mojohaus/exec-maven-plugin) | `3.5.1` | `3.6.4` |



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

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

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

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

Updates `com.auth0:java-jwt` from 4.5.2 to 4.6.1
- [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.2...4.6.1)

Updates `com.google.dagger:dagger` from 2.59.2 to 2.60.1
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/dagger/compare/dagger-2.59.2...dagger-2.60.1)

Updates `com.google.dagger:dagger-compiler` from 2.59.2 to 2.60.1
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/dagger/compare/dagger-2.59.2...dagger-2.60.1)

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

Updates `com.google.jimfs:jimfs` from 1.3.1 to 1.3.2
- [Release notes](https://github.com/google/jimfs/releases)
- [Commits](https://github.com/google/jimfs/compare/v1.3.1...v1.3.2)

Updates `com.google.dagger:dagger-compiler` from 2.59.2 to 2.60.1
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/dagger/compare/dagger-2.59.2...dagger-2.60.1)

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

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

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

Updates `org.owasp:dependency-check-maven` from 12.2.2 to 13.0.0
- [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.2...v13.0.0)

Updates `org.codehaus.mojo:exec-maven-plugin` from 3.5.1 to 3.6.4
- [Release notes](https://github.com/mojohaus/exec-maven-plugin/releases)
- [Commits](https://github.com/mojohaus/exec-maven-plugin/compare/3.5.1...3.6.4)

---
updated-dependencies:
- dependency-name: org.slf4j:slf4j-api
  dependency-version: 2.0.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: ch.qos.logback:logback-core
  dependency-version: 1.6.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven-dependencies
- dependency-name: ch.qos.logback:logback-classic
  dependency-version: 1.6.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven-dependencies
- dependency-name: ch.qos.logback:logback-classic
  dependency-version: 1.6.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven-dependencies
- dependency-name: com.auth0:java-jwt
  dependency-version: 4.6.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven-dependencies
- dependency-name: com.google.dagger:dagger
  dependency-version: 2.60.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven-dependencies
- dependency-name: com.google.dagger:dagger-compiler
  dependency-version: 2.60.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven-dependencies
- dependency-name: org.junit.jupiter:junit-jupiter
  dependency-version: 6.1.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: com.google.jimfs:jimfs
  dependency-version: 1.3.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: com.google.dagger:dagger-compiler
  dependency-version: 2.60.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven-dependencies
- dependency-name: org.apache.maven.plugins:maven-compiler-plugin
  dependency-version: 3.16.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.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven-dependencies
- dependency-name: org.apache.maven.plugins:maven-jar-plugin
  dependency-version: 3.5.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: maven-dependencies
- dependency-name: org.owasp:dependency-check-maven
  dependency-version: 13.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: maven-dependencies
- dependency-name: org.codehaus.mojo:exec-maven-plugin
  dependency-version: 3.6.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: maven-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-09-15 12:11:44 +00: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
32 changed files with 282 additions and 68 deletions
+2 -2
View File
@@ -9,8 +9,8 @@ Changes to prior versions can be found on the [Github release page](https://gith
## [Unreleased](https://github.com/cryptomator/cryptomator/compare/1.19.3...HEAD)
No changes yet.
### Changed
* Updated Jackson to 2.21.6
## [1.19.3](https://github.com/cryptomator/cryptomator/releases/1.19.3) - 2026-06-29
+14
View File
@@ -89,6 +89,20 @@ For more information on the security details visit [cryptomator.org](https://doc
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
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.
# It is a simple key-value pair file.
# 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:
# Sets the plugin directory and enables plugin loading
+4 -9
View File
@@ -40,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)"
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)
{
Write-Error 'Unable to find wix in your PATH (try: dotnet tool install --global wix --version 6.0.2)'
@@ -65,7 +60,7 @@ if ($wixExtensions -notmatch 'WixToolset.BootstrapperApplications.wixext') {
}
$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'
$revisionNo = $(git rev-list --count HEAD)
@@ -79,7 +74,7 @@ $copyright = "(C) $CopyrightStartYear - $((Get-Date).Year) $Vendor"
# compile
Invoke-CommandWithExitCheck -Command `
"mvn" -Arguments @("-B", "-f", "$buildDir/../../pom.xml", "clean", "package", "-DskipTests", "-Pwin")
"../../mvnw.cmd" -Arguments @("-B", "-f", "$buildDir/../../pom.xml", "clean", "package", "-DskipTests", "-Pwin")
Copy-Item "$buildDir\..\..\target\$MainJarGlob.jar" -Destination "$buildDir\..\..\target\mods"
# add runtime
@@ -212,7 +207,7 @@ if ($LASTEXITCODE -ne 0) {
#Create RTF license for msi
Invoke-CommandWithExitCheck -Command `
"mvn" -Arguments @("-B", "-f", "$buildDir/../../pom.xml", "license:add-third-party", `
"../../mvnw.cmd" -Arguments @("-B", "-f", "$buildDir/../../pom.xml", "license:add-third-party", `
"-Dlicense.thirdPartyFilename=license.rtf", `
"-Dlicense.fileTemplate=$buildDir\resources\licenseTemplate.ftl", `
"-Dlicense.outputDirectory=$buildDir\resources\", `
@@ -259,7 +254,7 @@ Invoke-CommandWithExitCheck -Command `
#Create RTF license for bundle
Invoke-CommandWithExitCheck -Command `
"mvn" -Arguments @("-B", "-f", "$buildDir/../../pom.xml", "license:add-third-party", `
"../../mvnw.cmd" -Arguments @("-B", "-f", "$buildDir/../../pom.xml", "license:add-third-party", `
"-Dlicense.thirdPartyFilename=license.rtf", `
"-Dlicense.fileTemplate=$buildDir\bundle\resources\licenseTemplate.ftl", `
"-Dlicense.outputDirectory=$buildDir\bundle\resources\", `
+130 -12
View File
@@ -38,7 +38,7 @@
<cryptomator.integrations.version>1.9.0</cryptomator.integrations.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.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.webdav.version>3.0.2</cryptomator.webdav.version>
<cryptomator.webdav-servlet.version>1.2.12</cryptomator.webdav-servlet.version>
@@ -46,35 +46,42 @@
<!-- 3rd party dependencies -->
<caffeine.version>3.2.4</caffeine.version>
<commons-lang3.version>3.20.0</commons-lang3.version>
<dagger.version>2.59.2</dagger.version>
<dagger.version>2.60.1</dagger.version>
<easybind.version>2.2</easybind.version>
<jackson.version>2.21.4</jackson.version>
<jackson.version>2.21.6</jackson.version>
<javafx.version>25.0.3</javafx.version>
<jwt.version>4.5.2</jwt.version>
<jwt.version>4.6.1</jwt.version>
<nimbus-jose.version>10.5</nimbus-jose.version>
<logback.version>1.5.35</logback.version>
<slf4j.version>2.0.18</slf4j.version>
<logback.version>1.6.3</logback.version>
<slf4j.version>2.0.19</slf4j.version>
<tinyoauth2.version>0.8.1</tinyoauth2.version>
<zxcvbn.version>1.9.0</zxcvbn.version>
<!-- test dependencies -->
<junit.jupiter.version>6.1.0</junit.jupiter.version>
<junit.jupiter.version>6.1.3</junit.jupiter.version>
<mockito.version>5.23.0</mockito.version>
<hamcrest.version>3.0</hamcrest.version>
<!-- build-time dependencies -->
<jetbrains.annotations.version>26.1.0</jetbrains.annotations.version>
<dependency-check.version>12.2.2</dependency-check.version>
<dependency-check.version>13.0.0</dependency-check.version>
<jacoco.version>0.8.15</jacoco.version>
<license-generator.version>2.7.1</license-generator.version>
<mvn-compiler.version>3.15.0</mvn-compiler.version>
<mvn-compiler.version>3.16.0</mvn-compiler.version>
<mvn-resources.version>3.5.0</mvn-resources.version>
<mvn-dependency.version>3.11.0</mvn-dependency.version>
<mvn-surefire.version>3.5.6</mvn-surefire.version>
<mvn-jar.version>3.5.0</mvn-jar.version>
<mvn-surefire.version>3.6.0</mvn-surefire.version>
<mvn-jar.version>3.5.1</mvn-jar.version>
<mvn-exec.version>3.6.4</mvn-exec.version>
<!-- Property used by surefire to determine jacoco engine -->
<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>
<repositories>
@@ -265,7 +272,7 @@
<dependency>
<groupId>com.google.jimfs</groupId>
<artifactId>jimfs</artifactId>
<version>1.3.1</version>
<version>1.3.2</version>
<scope>test</scope>
</dependency>
@@ -299,6 +306,10 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${mvn-surefire.version}</version>
<configuration>
<!--suppress MavenModelInspection -->
<argLine>@{argLine} -javaagent:${org.mockito:mockito-core:jar}</argLine>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
@@ -320,6 +331,11 @@
<artifactId>dependency-check-maven</artifactId>
<version>${dependency-check.version}</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>${mvn-exec.version}</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
@@ -399,6 +415,12 @@
<includeGroupIds>${nonModularGroupIds}</includeGroupIds>
</configuration>
</execution>
<execution>
<id>get-mockito-agent-path</id>
<goals>
<goal>properties</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
@@ -587,6 +609,102 @@
</dependency>
</dependencies>
</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>
</project>
@@ -8,7 +8,6 @@ import org.slf4j.LoggerFactory;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Optional;
import java.util.Set;
@@ -166,7 +165,7 @@ public class Environment {
private Optional<Path> getPath(String propertyName) {
String value = System.getProperty(propertyName);
return Optional.ofNullable(value).map(Paths::get);
return Optional.ofNullable(value).map(Path::of);
}
@VisibleForTesting
@@ -77,7 +77,7 @@ public class ErrorCode {
public static ErrorCode of(Throwable throwable) {
var causalChain = Throwables.getCausalChain(throwable);
if (causalChain.size() > 1) {
var rootCause = causalChain.get(causalChain.size() - 1);
var rootCause = causalChain.getLast();
var parentOfRootCause = causalChain.get(causalChain.size() - 2);
var rootSpecificFrames = countTopmostFrames(rootCause.getStackTrace(), parentOfRootCause.getStackTrace());
return new ErrorCode(throwable, rootCause, rootSpecificFrames);
@@ -67,7 +67,7 @@ public class SubstitutingProperties extends PropertiesDecorator {
private enum Source {
ENV,
PROPS;
PROPS
}
}
@@ -8,9 +8,9 @@ import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -78,7 +78,7 @@ public final class OneDriveWindowsLocationPresetsProvider implements LocationPre
*/
@Blocking
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) {
throw new TimeoutException(cmdDescription + " timed out after " + timeoutSeconds + "s");
}
@@ -90,7 +90,7 @@ public final class MountWithinParentUtil {
EMPTY_DIR,
BROKEN_JUNCTION;
BROKEN_JUNCTION
}
@@ -22,7 +22,6 @@ import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Objects;
import java.util.Random;
@@ -62,7 +61,7 @@ public class VaultSettings {
VaultSettings(VaultSettingsJson json) {
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.unlockAfterStartup = new SimpleBooleanProperty(this, "unlockAfterStartup", json.unlockAfterStartup);
this.revealAfterMount = new SimpleBooleanProperty(this, "revealAfterMount", json.revealAfterMount);
@@ -47,7 +47,6 @@ import javafx.beans.property.ReadOnlyStringProperty;
import javafx.beans.property.SimpleBooleanProperty;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.ReadOnlyFileSystemException;
import java.util.EnumSet;
import java.util.Objects;
@@ -58,7 +57,7 @@ import java.util.concurrent.atomic.AtomicReference;
public class Vault {
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 final VaultSettings vaultSettings;
@@ -58,7 +58,7 @@ public class VaultState extends ObservableValueBase<VaultState.Value> implements
/**
* Unknown state due to preceding unrecoverable exceptions.
*/
ERROR;
ERROR
}
private final AtomicReference<Value> value;
@@ -34,7 +34,7 @@ public class SupportedLanguages {
var collator = Collator.getInstance(preferredLocale);
collator.setStrength(Collator.PRIMARY);
var sorted = new ArrayList<String>();
sorted.add(0, null);
sorted.addFirst(null);
sorted.add(1, ENGLISH);
LANGUAGE_TAGS.stream() //
.sorted((a, b) -> collator.compare(Locale.forLanguageTag(a).getDisplayName(), Locale.forLanguageTag(b).getDisplayName())) //
@@ -41,7 +41,6 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Optional;
import java.util.ResourceBundle;
import java.util.concurrent.ExecutorService;
@@ -50,7 +49,7 @@ import java.util.concurrent.ExecutorService;
public class CreateNewVaultLocationController implements FxController {
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 final Stage window;
@@ -23,7 +23,7 @@ public class SystemBarUtil {
/**
* OS Bar placed at the bottom screen edge
*/
BOTTOM;
BOTTOM
}
/**
@@ -6,6 +6,7 @@ import org.cryptomator.integrations.common.Priority;
import org.cryptomator.integrations.revealpath.RevealFailedException;
import org.cryptomator.integrations.revealpath.RevealPathService;
import java.nio.file.Files;
import java.nio.file.Path;
/**
@@ -17,14 +18,17 @@ import java.nio.file.Path;
*/
@DisplayName("JavaFX HostServices (GTK)")
@OperatingSystem(OperatingSystem.Value.LINUX)
@Priority(10)
@Priority(Priority.FALLBACK)
public class JfxRevealPathService implements RevealPathService {
@Override
public void reveal(Path p) throws RevealFailedException {
var absPath = p.toAbsolutePath();
var fxApp = FxApplication.INSTANCE.get();
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 {
throw new RevealFailedException("JavaFX Application not initialized");
}
@@ -90,7 +90,7 @@ public class Check {
SUCCEEDED,
SKIPPED,
ERROR,
CANCELLED;
CANCELLED
}
ObservableList<Result> getResults() {
@@ -84,7 +84,7 @@ public class CheckListController implements FxController {
checks.filtered(c -> !c.isChosenForExecution()).forEach(c -> c.setState(Check.CheckState.SKIPPED));
checkExecutor.executeBatch(chosenChecks);
checksListView.getSelectionModel().select(chosenChecks.get(0));
checksListView.getSelectionModel().select(chosenChecks.getFirst());
checksListView.refresh();
window.sizeToScene();
}
@@ -6,6 +6,8 @@ import org.cryptomator.common.settings.Settings;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.common.FxmlFile;
import org.cryptomator.ui.common.FxmlScene;
import org.cryptomator.ui.controls.FontAwesome5Icon;
import org.cryptomator.ui.controls.FontAwesome5IconView;
import org.cryptomator.ui.keyloading.KeyLoading;
import org.cryptomator.ui.keyloading.KeyLoadingScoped;
import org.jetbrains.annotations.VisibleForTesting;
@@ -13,14 +15,24 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javafx.animation.PauseTransition;
import javafx.application.Platform;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.fxml.FXML;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;
import javafx.scene.control.Hyperlink;
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.util.Duration;
import java.net.URI;
import java.util.ResourceBundle;
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 ASK_SINGULAR_KEY = "hub.checkHostTrust.message.ask";
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 Duration COPIED_INDICATION_DURATION = Duration.seconds(2);
private final Stage window;
private final HubConfig hubConfig;
@@ -49,9 +65,10 @@ public class CheckHostTrustController implements FxController {
private final ResourceBundle resourceBundle;
private final SortedSet<String> hostnames;
private final StringProperty messageLabel;
private final StringProperty descriptionLabel;
@FXML
private TextFlow hostnamesFlow;
private VBox hostnamesBox;
@Inject
public CheckHostTrustController(@KeyLoading Stage window, //
@@ -74,6 +91,7 @@ public class CheckHostTrustController implements FxController {
this.resourceBundle = resourceBundle;
this.hostnames = new TreeSet<>();
this.messageLabel = new SimpleStringProperty(resourceBundle.getString(CHECK_KEY));
this.descriptionLabel = new SimpleStringProperty("");
}
@FXML
@@ -117,12 +135,41 @@ public class CheckHostTrustController implements FxController {
}
private void renderHostnames() {
hostnamesFlow.getChildren().clear();
hostnamesBox.getChildren().clear();
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;
messageLabel.set(resourceBundle.getString(messageKey));
var plural = hostnames.size() > 1;
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() {
@@ -176,4 +223,12 @@ public class CheckHostTrustController implements FxController {
return messageLabel.get();
}
public StringProperty descriptionLabelProperty() {
return descriptionLabel;
}
public String getDescriptionLabel() {
return descriptionLabel.get();
}
}
@@ -153,7 +153,7 @@ public class VaultListController implements FxController {
vaults.addListener((ListChangeListener.Change<? extends Vault> c) -> {
while (c.next()) {
if (c.wasAdded()) {
Vault anyAddedVault = c.getAddedSubList().get(0);
Vault anyAddedVault = c.getAddedSubList().getFirst();
vaultList.getSelectionModel().select(anyAddedVault);
}
}
@@ -217,7 +217,7 @@ public class RecoveryKeyValidateController implements FxController {
/**
* 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);
// remove oldest value:
decryptedBytesRead.getData().remove(0);
encryptedBytesWrite.getData().remove(0);
accessedFiles.getData().remove(0);
decryptedBytesRead.getData().removeFirst();
encryptedBytesWrite.getData().removeFirst();
accessedFiles.getData().removeFirst();
// add latest value:
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
SHOW_PREFERENCES,
SHOW_VAULT_OPTIONS;
SHOW_VAULT_OPTIONS
}
+15
View File
@@ -20,6 +20,10 @@
src: url('firacode_regular.ttf');
}
@font-face {
src: url('AtkinsonHyperlegibleMono-Regular.ttf');
}
/*******************************************************************************
* *
* Root Styling & Colors *
@@ -141,6 +145,17 @@
-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 *
+15
View File
@@ -20,6 +20,10 @@
src: url('firacode_regular.ttf');
}
@font-face {
src: url('AtkinsonHyperlegibleMono-Regular.ttf');
}
/*******************************************************************************
* *
* Root Styling & Colors *
@@ -141,6 +145,17 @@
-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 *
@@ -11,12 +11,11 @@
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.shape.Circle?>
<?import javafx.scene.text.TextFlow?>
<HBox xmlns:fx="http://javafx.com/fxml"
xmlns="http://javafx.com/javafx"
fx:controller="org.cryptomator.ui.keyloading.hub.CheckHostTrustController"
minWidth="400"
maxWidth="400"
minWidth="450"
maxWidth="450"
minHeight="145"
spacing="12"
alignment="TOP_LEFT"
@@ -34,13 +33,15 @@
<FontAwesome5IconView styleClass="glyph-icon-white" glyph="QUESTION" glyphSize="24"/>
</StackPane>
</Group>
<VBox HBox.hgrow="ALWAYS">
<VBox HBox.hgrow="ALWAYS" spacing="6">
<Label styleClass="label-large" text="${controller.messageLabel}" wrapText="true" textAlignment="LEFT">
<padding>
<Insets bottom="6" top="6"/>
</padding>
</Label>
<TextFlow fx:id="hostnamesFlow" styleClass="text-flow" minHeight="60"/>
<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"/>
<ButtonBar buttonMinWidth="120" buttonOrder="+CX">
<buttons>
@@ -173,6 +173,9 @@ hub.noKeychain.openBtn=Open Preferences
hub.checkHostTrust.message.check=Checking Configuration…
hub.checkHostTrust.message.ask=Trust this host?
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.denyBtn=Deny
### Waiting
@@ -11,7 +11,6 @@ import org.junit.jupiter.api.condition.EnabledIf;
import org.mockito.Mockito;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
@@ -56,7 +55,7 @@ public class EnvironmentTest {
List<Path> result = env.getPaths("test.path.property").toList();
MatcherAssert.assertThat(result, Matchers.hasSize(1));
MatcherAssert.assertThat(result, Matchers.hasItem(Paths.get("/foo/bar/test")));
MatcherAssert.assertThat(result, Matchers.hasItem(Path.of("/foo/bar/test")));
}
@Test
@@ -38,7 +38,7 @@ public class SettingsJsonTest {
Assertions.assertTrue(jsonObj.checkForUpdatesEnabled);
Assertions.assertEquals(2, jsonObj.directories.size());
Assertions.assertEquals("/vault1", jsonObj.directories.get(0).path);
Assertions.assertEquals("/vault1", jsonObj.directories.getFirst().path);
Assertions.assertEquals("/vault2", jsonObj.directories.get(1).path);
Assertions.assertEquals("--foo --bar", jsonObj.directories.get(1).mountFlags);
Assertions.assertEquals(8080, jsonObj.port);
@@ -67,7 +67,7 @@ public class SettingsJsonTest {
public void testSerialize() throws JsonProcessingException {
var jsonObj = new SettingsJson();
jsonObj.directories = List.of(new VaultSettingsJson(), new VaultSettingsJson());
jsonObj.directories.get(0).id = "test";
jsonObj.directories.getFirst().id = "test";
jsonObj.theme = UiTheme.DARK;
jsonObj.showTrayIcon = false;
@@ -17,7 +17,6 @@ import org.mockito.Mockito;
import java.nio.file.FileSystem;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -43,7 +42,7 @@ public class FileOpenRequestHandlerTest {
AppLaunchEvent evt = queue.poll();
Assertions.assertNotNull(evt);
Collection<Path> paths = evt.pathsToOpen();
MatcherAssert.assertThat(paths, CoreMatchers.hasItems(Paths.get("foo"), Paths.get("bar")));
MatcherAssert.assertThat(paths, CoreMatchers.hasItems(Path.of("foo"), Path.of("bar")));
}
@Test