diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index 6267aa792..a35029acc 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -168,7 +168,7 @@ jobs: cryptomator-*.asc if-no-files-found: error - name: Publish AppImage on GitHub Releases - if: startsWith(github.ref, 'refs/tags/') && github.event_name == 'published' + if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published' uses: softprops/action-gh-release@v1 with: fail_on_unmatched_files: true diff --git a/.github/workflows/debian.yml b/.github/workflows/debian.yml index 0512c25f8..dd7d2adf0 100644 --- a/.github/workflows/debian.yml +++ b/.github/workflows/debian.yml @@ -142,7 +142,6 @@ jobs: - name: Publish on PPA if: inputs.dput run: dput ppa:sebastian-stenzel/cryptomator-beta cryptomator_*_source.changes - # If ref is a tag, also upload to GitHub Releases: - name: Publish Debian package on GitHub Releases if: startsWith(github.ref, 'refs/tags/') && inputs.dput diff --git a/.github/workflows/flathub.yml b/.github/workflows/flathub.yml new file mode 100644 index 000000000..1edbc94d8 --- /dev/null +++ b/.github/workflows/flathub.yml @@ -0,0 +1,88 @@ +name: Create PR for flathub + +on: + release: + types: [published] + workflow_dispatch: + inputs: + tag: + description: 'Release tag' + required: true + +jobs: + get-version: + uses: ./.github/workflows/get-version.yml + with: + version: ${{ inputs.tag }} + tarball: + name: Determines tarball url and compute checksum + runs-on: ubuntu-latest + needs: [get-version] + if: github.event_name == 'workflow_dispatch' || needs.get-version.outputs.versionType == 'stable' + outputs: + url: ${{ steps.url.outputs.url}} + sha512: ${{ steps.sha512.outputs.sha512}} + steps: + - name: Determine tarball url + id: url + run: | + URL=""; + if [[ -n "${{ inputs.tag }}" ]]; then + URL="https://github.com/cryptomator/cryptomator/archive/refs/tags/${{ inputs.tag }}.tar.gz" + else + URL="https://github.com/cryptomator/cryptomator/archive/refs/tags/${{ github.event.release.tag_name }}.tar.gz" + fi + echo "url=${URL}" >> "$GITHUB_OUTPUT" + - name: Download source tarball and compute checksum + id: sha512 + run: | + curl --silent --fail-with-body -L -H "Accept: application/vnd.github+json" ${{ steps.url.outputs.url }} --output cryptomator.tar.gz + TARBALL_SHA512=$(sha512sum cryptomator.tar.gz | cut -d ' ' -f1) + echo "sha512=${TARBALL_SHA512}" >> "$GITHUB_OUTPUT" + flathub: + name: Create PR for flathub + runs-on: ubuntu-latest + needs: [tarball, get-version] + env: + FLATHUB_PR_URL: tbd + steps: + - uses: actions/checkout@v4 + with: + repository: 'flathub/org.cryptomator.Cryptomator' + token: ${{ secrets.CRYPTOBOT_WINGET_TOKEN }} + - name: Checkout release branch + run: | + git checkout -b release/${{ needs.get-version.outputs.semVerStr }} + - name: Update build file + run: | + sed -i -e 's/VERSION: [0-9]\+\.[0-9]\+\.[0-9]\+.*/VERSION: ${{ needs.get-version.outputs.semVerStr }}/g' org.cryptomator.Cryptomator.yaml + sed -i -e 's/sha512: [0-9A-Za-z_-\+]\{128\} #CRYPTOMATOR/sha512: ${{ needs.tarball.outputs.sha512 }} #CRYPTOMATOR/g' org.cryptomator.Cryptomator.yaml + sed -i -e 's;url: https://github.com/cryptomator/cryptomator/archive/refs/tags/[^[:blank:]]\+;url: ${{ needs.tarball.outputs.url }};g' org.cryptomator.Cryptomator.yaml + - name: Commit and push + run: | + git config user.name "${{ github.actor }}" + git config user.email "${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com" + git config push.autoSetupRemote true + git stage . + git commit -m "Prepare release ${{needs.get-version.outputs.semVerStr}}" + git push + - name: Create pull request + run: | + echo "> [!IMPORTANT]\n> Todos:\n> - [ ] Update maven dependencies\n> - [ ] Check for JDK update\n> - [ ] Check for JFX update" > pr_body.md + PR_URL=$(gh pr create --title "Release ${{ needs.get-version.outputs.semVerStr }}" --body-file pr_body.md) + echo "FLATHUB_PR_URL=$PR_URL" >> "$GITHUB_ENV" + env: + GH_TOKEN: ${{ secrets.CRYPTOBOT_WINGET_TOKEN }} + - name: Slack Notification + uses: rtCamp/action-slack-notify@v2 + if: github.event_name == 'release' + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} + SLACK_USERNAME: 'Cryptobot' + SLACK_ICON: false + SLACK_ICON_EMOJI: ':bot:' + SLACK_CHANNEL: 'cryptomator-desktop' + SLACK_TITLE: "Flathub release PR created for ${{ github.event.repository.name }} ${{ github.event.release.tag_name }} created." + SLACK_MESSAGE: "See <${{ env.FLATHUB_PR_URL }}|PR> on how to proceed.>." + SLACK_FOOTER: false + MSG_MINIMAL: true \ No newline at end of file diff --git a/.github/workflows/get-version.yml b/.github/workflows/get-version.yml index ae2b60b4b..cbb463824 100644 --- a/.github/workflows/get-version.yml +++ b/.github/workflows/get-version.yml @@ -50,7 +50,7 @@ jobs: if [[ $GITHUB_REF =~ refs/tags/[0-9]+\.[0-9]+\.[0-9]+.* ]]; then SEM_VER_STR=${GITHUB_REF##*/} elif [[ "${{ inputs.version }}" =~ [0-9]+\.[0-9]+\.[0-9]+.* ]]; then - SEM_VER_STR="${{ github.event.inputs.version }}" + SEM_VER_STR="${{ inputs.version }}" else SEM_VER_STR=`mvn help:evaluate -Dexpression=project.version -q -DforceStdout` fi @@ -73,4 +73,4 @@ jobs: - name: Validate Version uses: skymatic/semver-validation-action@v2 with: - version: ${{ steps.versions.outputs.semVerStr }} \ No newline at end of file + version: ${{ steps.versions.outputs.semVerStr }} \ No newline at end of file diff --git a/.github/workflows/mac-dmg.yml b/.github/workflows/mac-dmg.yml index c4edec9b4..b87d8c79a 100644 --- a/.github/workflows/mac-dmg.yml +++ b/.github/workflows/mac-dmg.yml @@ -258,7 +258,7 @@ jobs: Cryptomator-*.asc if-no-files-found: error - name: Publish dmg on GitHub Releases - if: startsWith(github.ref, 'refs/tags/') && github.event_name == 'published' + if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published' uses: softprops/action-gh-release@v1 with: fail_on_unmatched_files: true diff --git a/.github/workflows/win-exe.yml b/.github/workflows/win-exe.yml index 260730127..d3720c76b 100644 --- a/.github/workflows/win-exe.yml +++ b/.github/workflows/win-exe.yml @@ -255,7 +255,7 @@ jobs: Cryptomator-*.asc if-no-files-found: error - name: Publish .msi on GitHub Releases - if: startsWith(github.ref, 'refs/tags/') && github.event_name == 'published' + if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published' uses: softprops/action-gh-release@v1 with: fail_on_unmatched_files: true @@ -366,7 +366,7 @@ jobs: Cryptomator-*.asc if-no-files-found: error - name: Publish .msi on GitHub Releases - if: startsWith(github.ref, 'refs/tags/') && github.event_name == 'published' + if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published' uses: softprops/action-gh-release@v1 with: fail_on_unmatched_files: true @@ -377,7 +377,7 @@ jobs: allowlist: name: Anti Virus Allowlisting - if: startsWith(github.ref, 'refs/tags/') && github.event_name == 'published' + if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published' runs-on: ubuntu-latest needs: [build-msi, build-exe] steps: @@ -416,7 +416,7 @@ jobs: local-dir: files/ notify-winget: name: Notify for winget-release - if: startsWith(github.ref, 'refs/tags/') && github.event_name == 'published' && needs.get-version.outputs.versionType == 'stable' + if: startsWith(github.ref, 'refs/tags/') && github.event.action == 'published' && needs.get-version.outputs.versionType == 'stable' needs: [build-msi, get-version] runs-on: ubuntu-latest steps: diff --git a/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml b/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml index a542eca67..ac937ec9f 100644 --- a/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml +++ b/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml @@ -5,26 +5,27 @@ FSFAP GPL-3.0-or-later Cryptomator - Multi-platform client-side encryption tool optimized for cloud storages + Encryption made easy and optimized for the cloud

- Cryptomator provides transparent, client-side encryption for your cloud. Protect your documents from unauthorized - access. Cryptomator is free and open source software, so you can rest assured there are no backdoors. + Cryptomator provides easy-to-use, transparent, client-side encryption for your cloud. + It protects your documents from unauthorized access and prying eyes, while you will still be able to view and edit your documents locally. + By not requiring any registration or account and performing all encryption locally, it gives you back control over your data and ensures your privacy. + Cryptomator is offered for all major platforms (including Android and iOS).

- Cryptomator encrypts file contents and names using AES. Your passphrase is protected against bruteforcing attempts - using scrypt. Directory structures get obfuscated. The only thing which cannot be encrypted without breaking your - cloud synchronization is the modification date of your files. + Cryptomator encrypts file contents and names using the widespread industry standard AES. + Your passphrase is protected against brute forcing attempts using scrypt. + Additionally, directory structures get obfuscated. + For more info about the Cryptomator encryption scheme, check out the online documentation.

- Cryptomator is a free and open source software licensed under the GPLv3. This allows anyone to check our code. It - is impossible to introduce backdoors for third parties. Also we cannot hide vulnerabilities. And the best thing - is: There is no need to trust us, as you can control us! -

-

- Vendor lock-ins are impossible. Even if we decided to stop development: The source code is already cloned by - hundreds of other developers. As you don't need an account, you will never stand in front of locked doors. + Cryptomator is a free and open-source software licensed under the GPLv3. + This allows anyone to check our code. + Thus, it is impossible to introduce backdoors for third parties or to hide vulnerabilities, so you do not need to trust Cryptomator. + Also, vendor lock-ins are impossible. + Even if we decided to stop development: The source code is already cloned by hundreds of other developers and development can be picked up by others.

@@ -42,7 +43,7 @@ - + Light theme https://user-images.githubusercontent.com/11858409/156986109-6e58f59c-8b8c-4501-b33b-bb1e33007cea.png @@ -56,10 +57,13 @@ https://github.com/cryptomator/cryptomator/issues/ https://cryptomator.org/donate https://community.cryptomator.org/c/kb/faq - https://community.cryptomator.org/ + https://docs.cryptomator.org/ https://translate.cryptomator.org - Skymatic GmbH + + Skymatic GmbH + + mild diff --git a/pom.xml b/pom.xml index af81d1f78..a39bdd080 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.cryptomator cryptomator - 1.12.3 + 1.13.0-SNAPSHOT Cryptomator Desktop App @@ -34,7 +34,7 @@ 2.6.9 - 1.3.0 + 1.3.1 1.2.5 1.2.3 1.4.4 diff --git a/src/main/java/org/cryptomator/common/mount/Mounter.java b/src/main/java/org/cryptomator/common/mount/Mounter.java index 2b50e3cef..6ca067305 100644 --- a/src/main/java/org/cryptomator/common/mount/Mounter.java +++ b/src/main/java/org/cryptomator/common/mount/Mounter.java @@ -119,14 +119,8 @@ public class Mounter { Files.createDirectories(defaultMountPointBase); builder.setMountpoint(defaultMountPointBase); } else if (canMountToDir) { - var dirName = vaultSettings.mountName.get(); - //required for https://github.com/cryptomator/cryptomator/issues/3272 - if(service.getClass().getCanonicalName().equals("org.cryptomator.frontend.fuse.mount.FuseTMountProvider")) { - dirName = vaultSettings.id; - } - var mountPoint = defaultMountPointBase.resolve(dirName); + var mountPoint = defaultMountPointBase.resolve(vaultSettings.mountName.get()); Files.createDirectories(mountPoint); - cleanup = () -> removeCreatedDirectory(mountPoint); builder.setMountpoint(mountPoint); } } else { @@ -162,14 +156,6 @@ public class Mounter { } - private void removeCreatedDirectory(Path toDelete) { - try { - Files.delete(toDelete); - } catch (IOException e) { - LOG.warn("Unable to remove {} after unmount: {}.", toDelete, e.getMessage()); - } - } - public MountHandle mount(VaultSettings vaultSettings, Path cryptoFsRoot) throws IOException, MountFailedException { var mountService = mountProviders.stream().filter(s -> s.getClass().getName().equals(vaultSettings.mountService.getValue())).findFirst().orElse(defaultMountService.getValue()); diff --git a/src/main/java/org/cryptomator/ui/error/ErrorController.java b/src/main/java/org/cryptomator/ui/error/ErrorController.java index 45c940bcb..5b7dd9a60 100644 --- a/src/main/java/org/cryptomator/ui/error/ErrorController.java +++ b/src/main/java/org/cryptomator/ui/error/ErrorController.java @@ -75,6 +75,7 @@ public class ErrorController implements FxController { private final BooleanExpression errorSolutionFound = matchingErrorDiscussion.isNotNull(); private final BooleanProperty isLoadingHttpResponse = new SimpleBooleanProperty(); private final BooleanProperty askedForLookupDatabasePermission = new SimpleBooleanProperty(); + private final boolean formerSceneWasResizable; @Inject ErrorController(Application application, @Named("stackTrace") String stackTrace, ErrorCode errorCode, @Nullable Scene previousScene, Stage window, Environment environment, ExecutorService executorService) { @@ -85,12 +86,14 @@ public class ErrorController implements FxController { this.window = window; this.environment = environment; this.executorService = executorService; + this.formerSceneWasResizable = window.isResizable(); } @FXML public void back() { if (previousScene != null) { window.setScene(previousScene); + window.setResizable(formerSceneWasResizable); } } diff --git a/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java b/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java index 4215af2bc..804f4cd67 100644 --- a/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java +++ b/src/main/java/org/cryptomator/ui/unlock/UnlockWorkflow.java @@ -116,7 +116,10 @@ public class UnlockWorkflow extends Task { double x = mainWindow.getX() + (mainWindow.getWidth() - window.getWidth()) / 2; double y = mainWindow.getY() + (mainWindow.getHeight() - window.getHeight()) / 2; if(!mainWindow.isShowing()) { - Screen screen = Screen.getScreensForRectangle(mainWindow.getX(), mainWindow.getY(), mainWindow.getWidth(), mainWindow.getHeight()).get(0); + Screen screen = Screen.getScreensForRectangle(mainWindow.getX(), mainWindow.getY(), mainWindow.getWidth(), mainWindow.getHeight()) + .stream() + .findFirst() + .orElse(Screen.getPrimary()); Rectangle2D bounds = screen.getVisualBounds(); x = bounds.getMinX() + (bounds.getWidth() - window.getWidth()) / 2; y = bounds.getMinY() + (bounds.getHeight() - window.getHeight()) / 2; diff --git a/src/main/resources/fxml/error.fxml b/src/main/resources/fxml/error.fxml index aa0703d0c..91f7fff3e 100644 --- a/src/main/resources/fxml/error.fxml +++ b/src/main/resources/fxml/error.fxml @@ -9,86 +9,97 @@ + - + spacing="12"> - - - - - - - - - -