diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..357b2e3e4 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,24 @@ +version: 2 +updates: + - package-ecosystem: "maven" + directory: "/" + schedule: + interval: "weekly" + day: "monday" + time: "06:00" + timezone: "UTC" + groups: + all: # one PR for all dependencies + patterns: + - "*" + + - package-ecosystem: "github-actions" + directory: "/" # even for `.github/workflows` + schedule: + interval: "monthly" + groups: + all: # one PR for all actions + patterns: + - "*" + labels: + - "misc:ci" \ No newline at end of file diff --git a/.github/workflows/mac-dmg.yml b/.github/workflows/mac-dmg.yml index 1b3b4f0b9..764af2d9a 100644 --- a/.github/workflows/mac-dmg.yml +++ b/.github/workflows/mac-dmg.yml @@ -8,6 +8,11 @@ on: version: description: 'Version' required: false + notarize: + description: 'Notarize' + required: true + default: false + type: boolean env: JAVA_VERSION: 20 @@ -222,7 +227,7 @@ jobs: env: VERSION_NO: ${{ needs.get-version.outputs.semVerNum }} - name: Notarize .dmg - if: startsWith(github.ref, 'refs/tags/') + if: startsWith(github.ref, 'refs/tags/') || inputs.notarize uses: cocoalibs/xcode-notarization-action@v1 with: app-path: 'Cryptomator-*.dmg' diff --git a/.github/workflows/release-check.yml b/.github/workflows/release-check.yml index 481861540..d5a17d121 100644 --- a/.github/workflows/release-check.yml +++ b/.github/workflows/release-check.yml @@ -18,7 +18,7 @@ jobs: name: Validate commits pushed to release/hotfix branch to fulfill release requirements runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - id: validate-pom-version name: Validate POM version run: | diff --git a/.github/workflows/win-exe.yml b/.github/workflows/win-exe.yml index 6f241c16d..b4646a4e5 100644 --- a/.github/workflows/win-exe.yml +++ b/.github/workflows/win-exe.yml @@ -359,7 +359,7 @@ jobs: cp msi/*.msi files cp exe/*.exe files - name: Upload to Kaspersky - uses: SamKirkland/FTP-Deploy-Action@4.3.3 + uses: SamKirkland/FTP-Deploy-Action@v4.3.4 with: protocol: ftps server: allowlist.kaspersky-labs.com @@ -368,7 +368,7 @@ jobs: password: ${{ secrets.ALLOWLIST_KASPERSKY_PASSWORD }} local-dir: files/ - name: Upload to Avast - uses: SamKirkland/FTP-Deploy-Action@4.3.0 + uses: SamKirkland/FTP-Deploy-Action@v4.3.4 with: protocol: ftp server: whitelisting.avast.com diff --git a/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml b/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml index 4fd30d14f..0ca6499ad 100644 --- a/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml +++ b/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml @@ -66,6 +66,7 @@ + diff --git a/dist/win/build.bat b/dist/win/build.bat index 997d94328..6dcb344c0 100644 --- a/dist/win/build.bat +++ b/dist/win/build.bat @@ -11,7 +11,7 @@ SET HELP_URL="https://cryptomator.org/contact/" SET MODULE_AND_MAIN_CLASS="org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator" SET LOOPBACK_ALIAS="cryptomator-vault" -powershell -NoLogo -ExecutionPolicy Unrestricted -Command .\build.ps1^ +powershell -NoLogo -NoProfile -ExecutionPolicy Unrestricted -Command .\build.ps1^ -AppName %APPNAME%^ -MainJarGlob "%MAIN_JAR_GLOB%"^ -ModuleAndMainClass "%MODULE_AND_MAIN_CLASS%"^ diff --git a/dist/win/contrib/patchWebDAV.bat b/dist/win/contrib/patchWebDAV.bat index aad226881..cc9f667dd 100644 --- a/dist/win/contrib/patchWebDAV.bat +++ b/dist/win/contrib/patchWebDAV.bat @@ -3,5 +3,5 @@ ::REPLACE ME cd %~dp0 -powershell -NoLogo -NonInteractive -ExecutionPolicy Unrestricted -Command .\patchWebDAV.ps1^ +powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command .\patchWebDAV.ps1^ -LoopbackAlias %LOOPBACK_ALIAS% \ No newline at end of file diff --git a/dist/win/contrib/version170-migrate-settings.bat b/dist/win/contrib/version170-migrate-settings.bat index 94ec16dac..345b01ad9 100644 --- a/dist/win/contrib/version170-migrate-settings.bat +++ b/dist/win/contrib/version170-migrate-settings.bat @@ -2,4 +2,4 @@ :: see comments in file ./version170-migrate-settings.ps1 cd %~dp0 -powershell -NoLogo -NonInteractive -ExecutionPolicy Unrestricted -Command .\version170-migrate-settings.ps1 \ No newline at end of file +powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command .\version170-migrate-settings.ps1 \ No newline at end of file diff --git a/pom.xml b/pom.xml index f1f42b093..871611ea0 100644 --- a/pom.xml +++ b/pom.xml @@ -35,9 +35,9 @@ 2.6.6 1.3.0 - 1.2.0 + 1.2.2 1.2.0 - 1.3.0-beta5 + 1.3.0-beta6 3.0.0 2.0.0 2.0.3 diff --git a/src/main/java/org/cryptomator/common/locationpresets/OneDriveWindowsLocationPresetsProvider.java b/src/main/java/org/cryptomator/common/locationpresets/OneDriveWindowsLocationPresetsProvider.java index 7dcfde239..1d5bffd70 100644 --- a/src/main/java/org/cryptomator/common/locationpresets/OneDriveWindowsLocationPresetsProvider.java +++ b/src/main/java/org/cryptomator/common/locationpresets/OneDriveWindowsLocationPresetsProvider.java @@ -83,8 +83,8 @@ public final class OneDriveWindowsLocationPresetsProvider implements LocationPre throw new TimeoutException(cmdDescription + " timed out after " + timeoutSeconds + "s"); } if (process.exitValue() != 0) { - @SuppressWarnings("resource") var stdout = process.inputReader(StandardCharsets.UTF_8).lines().collect(Collectors.joining("\n")); - @SuppressWarnings("resource") var stderr = process.errorReader(StandardCharsets.UTF_8).lines().collect(Collectors.joining("\n")); + @SuppressWarnings("resource") var stdout = process.inputReader(StandardCharsets.ISO_8859_1).lines().collect(Collectors.joining("\n")); + @SuppressWarnings("resource") var stderr = process.errorReader(StandardCharsets.ISO_8859_1).lines().collect(Collectors.joining("\n")); throw new CommandFailedException(cmdDescription, process.exitValue(), stdout, stderr); } } diff --git a/src/main/java/org/cryptomator/ui/error/ErrorController.java b/src/main/java/org/cryptomator/ui/error/ErrorController.java index d84af9fde..b25de6d84 100644 --- a/src/main/java/org/cryptomator/ui/error/ErrorController.java +++ b/src/main/java/org/cryptomator/ui/error/ErrorController.java @@ -42,7 +42,7 @@ public class ErrorController implements FxController { private static final ObjectMapper JSON = new ObjectMapper(); private static final Logger LOG = LoggerFactory.getLogger(ErrorController.class); - private static final String ERROR_CODES_URL = "https://gist.githubusercontent.com/cryptobot/accba9fb9555e7192271b85606f97230/raw/errorcodes.json"; + private static final String ERROR_CODES_URL = "https://api.cryptomator.org/desktop/error-codes.json"; private static final String SEARCH_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/categories/errors?discussions_q=category:Errors+%s"; private static final String REPORT_URL_FORMAT = "https://github.com/cryptomator/cryptomator/discussions/new?category=Errors&title=Error+%s&body=%s"; private static final String SEARCH_ERRORCODE_DELIM = " OR "; @@ -65,11 +65,13 @@ public class ErrorController implements FxController { private final Scene previousScene; private final Stage window; private final Environment environment; + private final ExecutorService executorService; private final BooleanProperty copiedDetails = new SimpleBooleanProperty(); private final ObjectProperty matchingErrorDiscussion = new SimpleObjectProperty<>(); private final BooleanExpression errorSolutionFound = matchingErrorDiscussion.isNotNull(); private final BooleanProperty isLoadingHttpResponse = new SimpleBooleanProperty(); + private final BooleanProperty askedForLookupDatabasePermission = new SimpleBooleanProperty(); @Inject ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window, Environment environment, ExecutorService executorService) { @@ -79,15 +81,7 @@ public class ErrorController implements FxController { this.previousScene = previousScene; this.window = window; this.environment = environment; - - isLoadingHttpResponse.set(true); - HttpClient httpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build(); - HttpRequest httpRequest = HttpRequest.newBuilder()// - .uri(URI.create(ERROR_CODES_URL))// - .build(); - httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofInputStream())// - .thenAcceptAsync(this::loadHttpResponse, executorService)// - .whenCompleteAsync((r, e) -> isLoadingHttpResponse.set(false), Platform::runLater); + this.executorService = executorService; } @FXML @@ -140,6 +134,24 @@ public class ErrorController implements FxController { CompletableFuture.delayedExecutor(2, TimeUnit.SECONDS, Platform::runLater).execute(() -> copiedDetails.set(false)); } + @FXML + public void dismiss() { + askedForLookupDatabasePermission.set(true); + } + + @FXML + public void lookUpSolution() { + isLoadingHttpResponse.set(true); + askedForLookupDatabasePermission.set(true); + HttpClient httpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build(); + HttpRequest httpRequest = HttpRequest.newBuilder()// + .uri(URI.create(ERROR_CODES_URL))// + .build(); + httpClient.sendAsync(httpRequest, HttpResponse.BodyHandlers.ofInputStream())// + .thenAcceptAsync(this::loadHttpResponse, executorService)// + .whenCompleteAsync((r, e) -> isLoadingHttpResponse.set(false), Platform::runLater); + } + private void loadHttpResponse(HttpResponse response) { if (response.statusCode() != 200) { LOG.error("Status code {} when trying to load {} ", response.statusCode(), response.uri()); @@ -293,4 +305,12 @@ public class ErrorController implements FxController { return isLoadingHttpResponse.get(); } + public BooleanProperty askedForLookupDatabasePermissionProperty() { + return askedForLookupDatabasePermission; + } + + public boolean getAskedForLookupDatabasePermission() { + return askedForLookupDatabasePermission.get(); + } + } \ No newline at end of file diff --git a/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerModule.java b/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerModule.java index ffc2a3d2f..d70301e78 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerModule.java +++ b/src/main/java/org/cryptomator/ui/fxapp/UpdateCheckerModule.java @@ -28,7 +28,7 @@ public abstract class UpdateCheckerModule { private static final Logger LOG = LoggerFactory.getLogger(UpdateCheckerModule.class); - private static final URI LATEST_VERSION_URI = URI.create("https://api.cryptomator.org/updates/latestVersion.json"); + private static final URI LATEST_VERSION_URI = URI.create("https://api.cryptomator.org/desktop/latest-version.json"); private static final Duration UPDATE_CHECK_INTERVAL = Duration.hours(3); private static final Duration DISABLED_UPDATE_CHECK_INTERVAL = Duration.hours(100000); // Duration.INDEFINITE leads to overflows... diff --git a/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java b/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java index 88f8045eb..ac80f0302 100644 --- a/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java +++ b/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java @@ -102,9 +102,8 @@ public class ReceiveKeyController implements FxController { switch (response.statusCode()) { case 200 -> requestUserKey(response.body()); case 402 -> licenseExceeded(); - case 403 -> accessNotGranted(); + case 403, 410 -> accessNotGranted(); // or vault has been archived, effectively disallowing access - TODO: add specific dialog? case 404 -> requestLegacyAccessToken(); - case 410 -> throw new IOException("Vault has been archived."); // TODO add dialog default -> throw new IOException("Unexpected response " + response.statusCode()); } } catch (IOException e) { @@ -188,9 +187,8 @@ public class ReceiveKeyController implements FxController { switch (response.statusCode()) { case 200 -> receivedLegacyAccessTokenSuccess(response.body()); case 402 -> licenseExceeded(); - case 403 -> accessNotGranted(); + case 403, 410 -> accessNotGranted(); // or vault has been archived, effectively disallowing access case 404 -> needsLegacyDeviceRegistration(); - case 410 -> throw new IOException("Vault has been archived."); // TODO add dialog default -> throw new IOException("Unexpected response " + response.statusCode()); } } catch (IOException e) { diff --git a/src/main/resources/fxml/error.fxml b/src/main/resources/fxml/error.fxml index cc11db58a..aa0703d0c 100644 --- a/src/main/resources/fxml/error.fxml +++ b/src/main/resources/fxml/error.fxml @@ -32,25 +32,37 @@ - - -