├── .idea ├── .name ├── codeStyles │ └── codeStyleConfig.xml ├── vcs.xml ├── .gitignore ├── encodings.xml ├── dictionaries │ └── dict_de.xml ├── inspectionProfiles │ └── Project_Default.xml ├── misc.xml └── runConfigurations │ ├── Cryptomator_Linux.xml │ ├── Cryptomator_Linux_Dev.xml │ ├── Cryptomator_Windows.xml │ ├── Cryptomator_macOS.xml │ ├── Cryptomator_Windows_Dev.xml │ └── Cryptomator_macOS_Dev.xml ├── dist ├── linux │ ├── debian │ │ ├── compat │ │ ├── source │ │ │ ├── format │ │ │ └── include-binaries │ │ ├── changelog │ │ ├── cryptomator.links │ │ ├── cryptomator.install │ │ ├── control │ │ ├── prerm │ │ ├── postinst │ │ └── copyright │ ├── appimage │ │ ├── resources │ │ │ └── AppDir │ │ │ │ ├── usr │ │ │ │ └── share │ │ │ │ │ ├── applications │ │ │ │ │ └── .gitkeep │ │ │ │ │ ├── metainfo │ │ │ │ │ └── .gitkeep │ │ │ │ │ ├── mime │ │ │ │ │ └── packages │ │ │ │ │ │ └── .gitkeep │ │ │ │ │ └── icons │ │ │ │ │ └── hicolor │ │ │ │ │ ├── 256x256 │ │ │ │ │ └── apps │ │ │ │ │ │ └── .gitkeep │ │ │ │ │ ├── 512x512 │ │ │ │ │ └── apps │ │ │ │ │ │ └── .gitkeep │ │ │ │ │ ├── scalable │ │ │ │ │ └── apps │ │ │ │ │ │ └── .gitkeep │ │ │ │ │ └── symbolic │ │ │ │ │ └── apps │ │ │ │ │ └── .gitkeep │ │ │ │ └── bin │ │ │ │ └── cryptomator.sh │ │ └── .gitignore │ ├── resources │ │ └── cryptomator.png │ └── common │ │ ├── org.cryptomator.Cryptomator256.png │ │ ├── org.cryptomator.Cryptomator512.png │ │ ├── application-vnd.cryptomator.vault.xml │ │ └── org.cryptomator.Cryptomator.desktop ├── mac │ ├── .gitignore │ ├── resources │ │ ├── Cryptomator.icns │ │ └── Cryptomator-Vault.icns │ ├── dmg │ │ ├── resources │ │ │ ├── Cryptomator-Volume.icns │ │ │ ├── Cryptomator-FUSE-T-background.tiff │ │ │ ├── Cryptomator-macFUSE-background.tiff │ │ │ ├── FUSE-T.webloc │ │ │ └── macFUSE.webloc │ │ └── .gitignore │ └── Cryptomator.entitlements └── win │ ├── resources │ ├── banner.bmp │ ├── Cryptomator.ico │ ├── background.bmp │ ├── Cryptomator-Vault.ico │ ├── FAvaultFile.properties │ └── ui.wxf │ ├── contrib │ ├── jnidispatch.dll │ └── patchWebDAV.bat │ ├── bundle │ └── resources │ │ ├── logo.png │ │ ├── logoSide.png │ │ └── Cryptomator.ico │ ├── .gitignore │ ├── launcher.bat │ └── build.bat ├── src ├── package │ └── version.txt ├── test │ ├── resources │ │ ├── mockito-extensions │ │ │ └── org.mockito.plugins.MockMaker │ │ └── logback-test.xml │ └── java │ │ └── org │ │ └── cryptomator │ │ ├── ui │ │ ├── keyloading │ │ │ └── hub │ │ │ │ └── HubConfigTest.java │ │ ├── recoverykey │ │ │ └── WordEncoderTest.java │ │ └── changepassword │ │ │ └── PasswordStrengthUtilTest.java │ │ ├── ipc │ │ ├── RevealRunningAppMessageTest.java │ │ ├── LoopbackCommunicatorTest.java │ │ └── IpcCommunicatorTest.java │ │ ├── common │ │ └── settings │ │ │ └── VaultSettingsTest.java │ │ ├── launcher │ │ └── SupportedLanguagesTest.java │ │ └── logging │ │ └── LaunchBasedTriggeringPolicyTest.java └── main │ ├── resources │ ├── img │ │ ├── logo128.png │ │ ├── logo64.png │ │ ├── bot │ │ │ ├── arm-l.png │ │ │ ├── arm-r.png │ │ │ ├── body.png │ │ │ ├── face.png │ │ │ ├── legs.png │ │ │ ├── arm-l@2x.png │ │ │ ├── arm-r@2x.png │ │ │ ├── body@2x.png │ │ │ ├── face@2x.png │ │ │ └── legs@2x.png │ │ ├── hub_logo.png │ │ ├── logo128@2x.png │ │ ├── logo64@2x.png │ │ ├── title-logo.png │ │ ├── tray_icon.png │ │ ├── group-magic.png │ │ ├── hub_logo@2x.png │ │ ├── group-magic@2x.png │ │ ├── title-logo@2x.png │ │ ├── window_icon_32.png │ │ ├── window_icon_512.png │ │ ├── tray_icon_mac@2x.png │ │ ├── vault-volume-mac.png │ │ ├── vault-volume-win.png │ │ ├── select-masterkey-mac.png │ │ ├── select-masterkey-win.png │ │ ├── supporter_cert_stamp.png │ │ ├── tray_icon_unlocked.png │ │ ├── select-masterkey-mac-dark.png │ │ ├── select-masterkey-mac@2x.png │ │ ├── select-masterkey-win@2x.png │ │ ├── supporter_cert_stamp@2x.png │ │ ├── tray_icon_unlocked_mac@2x.png │ │ └── select-masterkey-mac-dark@2x.png │ ├── css │ │ ├── opensans_bold.ttf │ │ ├── quicksand_bold.ttf │ │ ├── opensans_regular.ttf │ │ ├── opensans_semibold.ttf │ │ └── fontawesome5-free-solid.otf │ └── fxml │ │ ├── vault_detail_needsmigration.fxml │ │ ├── vault_options_hub.fxml │ │ ├── health_check_listcell.fxml │ │ ├── vault_detail_welcome.fxml │ │ ├── addvault_new_recoverykey.fxml │ │ ├── recoverykey_success.fxml │ │ ├── preferences_about.fxml │ │ ├── convertvault_hubtopassword_start.fxml │ │ ├── addvault_existing.fxml │ │ ├── recoverykey_reset_password.fxml │ │ ├── recoverykey_recover.fxml │ │ ├── vault_list_cell.fxml │ │ ├── vault_list_contextmenu.fxml │ │ ├── convertvault_hubtopassword_convert.fxml │ │ ├── main_window.fxml │ │ └── health_result_listcell.fxml │ └── java │ └── org │ └── cryptomator │ ├── ui │ ├── keyloading │ │ ├── hub │ │ │ ├── AuthFlowContext.java │ │ │ ├── DeviceAlreadyExistsException.java │ │ │ ├── InvalidLicenseController.java │ │ │ ├── LegacyRegisterSuccessController.java │ │ │ ├── RegisterFailedController.java │ │ │ ├── NoKeychainController.java │ │ │ └── UnauthorizedDeviceController.java │ │ ├── masterkeyfile │ │ │ ├── PassphraseEntryResult.java │ │ │ ├── PassphraseEntryScoped.java │ │ │ ├── ChooseMasterkeyFileScoped.java │ │ │ ├── ChooseMasterkeyFileComponent.java │ │ │ ├── PassphraseEntryComponent.java │ │ │ ├── PassphraseEntryModule.java │ │ │ └── ChooseMasterkeyFileModule.java │ │ ├── KeyLoadingScoped.java │ │ ├── KeyLoading.java │ │ └── KeyLoadingComponent.java │ ├── lock │ │ ├── LockScoped.java │ │ ├── LockWindow.java │ │ ├── LockFailedController.java │ │ └── LockComponent.java │ ├── quit │ │ ├── QuitScoped.java │ │ └── QuitWindow.java │ ├── unlock │ │ ├── UnlockScoped.java │ │ ├── UnlockWindow.java │ │ ├── UnlockCancelledException.java │ │ ├── UnlockComponent.java │ │ └── UnlockRequiresRestartController.java │ ├── traymenu │ │ ├── TrayMenuScoped.java │ │ └── TrayMenuModule.java │ ├── health │ │ ├── HealthCheckScoped.java │ │ ├── HealthCheckWindow.java │ │ ├── HealthCheckComponent.java │ │ └── Result.java │ ├── migration │ │ ├── MigrationScoped.java │ │ ├── MigrationWindow.java │ │ ├── MigrationComponent.java │ │ ├── MigrationStartController.java │ │ ├── MigrationImpossibleController.java │ │ └── MigrationSuccessController.java │ ├── fxapp │ │ ├── PrimaryStage.java │ │ ├── FxApplicationScoped.java │ │ ├── ExitingQuitResponse.java │ │ └── FxApplicationComponent.java │ ├── mainwindow │ │ ├── MainWindow.java │ │ ├── MainWindowScoped.java │ │ ├── VaultDetailNeedsMigrationController.java │ │ ├── MainWindowComponent.java │ │ └── WelcomeController.java │ ├── sharevault │ │ ├── ShareVaultScoped.java │ │ ├── ShareVaultWindow.java │ │ └── ShareVaultComponent.java │ ├── preferences │ │ ├── PreferencesScoped.java │ │ ├── PreferencesWindow.java │ │ ├── SelectedPreferencesTab.java │ │ └── PreferencesComponent.java │ ├── stats │ │ ├── VaultStatisticsScoped.java │ │ ├── VaultStatisticsWindow.java │ │ └── VaultStatisticsComponent.java │ ├── convertvault │ │ ├── ConvertVaultScoped.java │ │ ├── ConvertVaultWindow.java │ │ ├── HubToPasswordSuccessController.java │ │ ├── HubToPasswordStartController.java │ │ └── ConvertVaultComponent.java │ ├── recoverykey │ │ ├── RecoveryKeyScoped.java │ │ ├── RecoveryKeyWindow.java │ │ ├── RecoveryKeySuccessController.java │ │ ├── RecoveryKeyResetPasswordSuccessController.java │ │ └── RecoveryKeyComponent.java │ ├── vaultoptions │ │ ├── VaultOptionsScoped.java │ │ ├── VaultOptionsWindow.java │ │ ├── SelectedVaultOptionsTab.java │ │ └── HubOptionsController.java │ ├── addvaultwizard │ │ ├── AddVaultWizardScoped.java │ │ ├── AddVaultWizardWindow.java │ │ ├── CreateNewVaultRecoveryKeyController.java │ │ └── AddVaultSuccessController.java │ ├── changepassword │ │ ├── ChangePasswordScoped.java │ │ ├── ChangePasswordWindow.java │ │ └── ChangePasswordComponent.java │ ├── forgetpassword │ │ ├── ForgetPasswordScoped.java │ │ └── ForgetPasswordWindow.java │ ├── updatereminder │ │ ├── UpdateReminderScoped.java │ │ ├── UpdateReminderWindow.java │ │ ├── UpdateReminderComponent.java │ │ └── UpdateReminderController.java │ ├── wrongfilealert │ │ ├── WrongFileAlertScoped.java │ │ ├── WrongFileAlertWindow.java │ │ └── WrongFileAlertComponent.java │ ├── common │ │ ├── FxmlScene.java │ │ ├── FxController.java │ │ ├── StageFactory.java │ │ ├── FxControllerKey.java │ │ └── StageInitializer.java │ ├── error │ │ ├── ErrorDiscussion.java │ │ └── ErrorComponent.java │ └── controls │ │ ├── NumericTextField.java │ │ ├── AlphanumericTextField.java │ │ └── FontAwesome5Spinner.java │ ├── common │ ├── Nullable.java │ ├── locationpresets │ │ ├── LocationPreset.java │ │ ├── OneDriveLinuxLocationPresetsProvider.java │ │ ├── DropboxWindowsLocationPresetsProvider.java │ │ ├── ICloudWindowsLocationPresetsProvider.java │ │ ├── ICloudMacLocationPresetsProvider.java │ │ ├── MegaLocationPresetsProvider.java │ │ ├── LeitzcloudLocationPresetsProvider.java │ │ ├── DropboxMacLocationPresetsProvider.java │ │ ├── PCloudLocationPresetsProvider.java │ │ ├── GoogleDriveWindowsLocationPresetsProvider.java │ │ └── DropboxLinuxLocationPresetsProvider.java │ ├── mount │ │ ├── MountPointInUseException.java │ │ ├── MountPointNotSupportedException.java │ │ ├── MountPointNotEmptyDirectoryException.java │ │ ├── MountPointCleanupFailedException.java │ │ ├── MountPointNotExistingException.java │ │ ├── ConflictingMountServiceException.java │ │ ├── HideawayNotDirectoryException.java │ │ ├── IllegalMountPointException.java │ │ └── MountModule.java │ ├── vaults │ │ ├── PerVault.java │ │ ├── VaultListModule.java │ │ ├── VaultComponent.java │ │ ├── VaultListChangeListener.java │ │ └── VaultModule.java │ ├── keychain │ │ ├── NoKeychainAccessProviderException.java │ │ └── KeychainModule.java │ ├── RunnableThrowingException.java │ ├── SupplierThrowingException.java │ ├── ConsumerThrowingException.java │ ├── Constants.java │ ├── settings │ │ ├── WhenUnlocked.java │ │ └── UiTheme.java │ └── ObservableUtil.java │ ├── launcher │ ├── AppLaunchEvent.java │ ├── CryptomatorComponent.java │ └── IpcMessageHandler.java │ ├── logging │ ├── LogbackConfiguratorFactory.java │ ├── LaunchBasedTriggeringPolicy.java │ └── LaunchAndSizeBasedTriggeringPolicy.java │ ├── ipc │ ├── IpcMessageListener.java │ ├── RevealRunningAppMessage.java │ ├── HandleLaunchArgsMessage.java │ └── LoopbackCommunicator.java │ └── networking │ ├── SSLContextWithWindowsCertStore.java │ ├── SSLContextProvider.java │ ├── SSLContextWithMacKeychain.java │ └── SSLContextDifferentTrustStoreBase.java ├── cryptomator.png ├── .gitignore ├── .crowdin.yml ├── .github ├── ISSUE_TEMPLATE │ ├── config.yml │ └── feature.yml ├── FUNDING.yml ├── workflows │ ├── dependency-check.yml │ ├── pullrequest.yml │ ├── winget.yml │ ├── no-response.yml │ ├── stale.yml │ └── av-whitelist.yml ├── SUPPORT.md ├── release.yml └── SECURITY.md └── license └── merges /.idea/.name: -------------------------------------------------------------------------------- 1 | Cryptomator -------------------------------------------------------------------------------- /dist/linux/debian/compat: -------------------------------------------------------------------------------- 1 | 10 2 | -------------------------------------------------------------------------------- /src/package/version.txt: -------------------------------------------------------------------------------- 1 | ${project.version} -------------------------------------------------------------------------------- /dist/linux/debian/source/format: -------------------------------------------------------------------------------- 1 | 3.0 (quilt) 2 | -------------------------------------------------------------------------------- /dist/mac/.gitignore: -------------------------------------------------------------------------------- 1 | embedded.provisionprofile 2 | -------------------------------------------------------------------------------- /dist/linux/appimage/resources/AppDir/usr/share/applications/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/linux/appimage/resources/AppDir/usr/share/metainfo/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/linux/appimage/resources/AppDir/usr/share/mime/packages/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/linux/appimage/resources/AppDir/usr/share/icons/hicolor/256x256/apps/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/linux/appimage/resources/AppDir/usr/share/icons/hicolor/512x512/apps/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/linux/appimage/resources/AppDir/usr/share/icons/hicolor/scalable/apps/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/linux/appimage/resources/AppDir/usr/share/icons/hicolor/symbolic/apps/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /cryptomator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/cryptomator.png -------------------------------------------------------------------------------- /src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker: -------------------------------------------------------------------------------- 1 | mock-maker-inline -------------------------------------------------------------------------------- /dist/win/resources/banner.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/dist/win/resources/banner.bmp -------------------------------------------------------------------------------- /dist/win/contrib/jnidispatch.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/dist/win/contrib/jnidispatch.dll -------------------------------------------------------------------------------- /dist/win/bundle/resources/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/dist/win/bundle/resources/logo.png -------------------------------------------------------------------------------- /dist/win/resources/Cryptomator.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/dist/win/resources/Cryptomator.ico -------------------------------------------------------------------------------- /dist/win/resources/background.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/dist/win/resources/background.bmp -------------------------------------------------------------------------------- /src/main/resources/img/logo128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/logo128.png -------------------------------------------------------------------------------- /src/main/resources/img/logo64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/logo64.png -------------------------------------------------------------------------------- /dist/linux/resources/cryptomator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/dist/linux/resources/cryptomator.png -------------------------------------------------------------------------------- /dist/mac/resources/Cryptomator.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/dist/mac/resources/Cryptomator.icns -------------------------------------------------------------------------------- /src/main/resources/img/bot/arm-l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/bot/arm-l.png -------------------------------------------------------------------------------- /src/main/resources/img/bot/arm-r.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/bot/arm-r.png -------------------------------------------------------------------------------- /src/main/resources/img/bot/body.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/bot/body.png -------------------------------------------------------------------------------- /src/main/resources/img/bot/face.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/bot/face.png -------------------------------------------------------------------------------- /src/main/resources/img/bot/legs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/bot/legs.png -------------------------------------------------------------------------------- /src/main/resources/img/hub_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/hub_logo.png -------------------------------------------------------------------------------- /src/main/resources/img/logo128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/logo128@2x.png -------------------------------------------------------------------------------- /src/main/resources/img/logo64@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/logo64@2x.png -------------------------------------------------------------------------------- /src/main/resources/img/title-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/title-logo.png -------------------------------------------------------------------------------- /src/main/resources/img/tray_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/tray_icon.png -------------------------------------------------------------------------------- /dist/linux/debian/source/include-binaries: -------------------------------------------------------------------------------- 1 | common/org.cryptomator.Cryptomator256.png 2 | common/org.cryptomator.Cryptomator512.png 3 | -------------------------------------------------------------------------------- /dist/win/bundle/resources/logoSide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/dist/win/bundle/resources/logoSide.png -------------------------------------------------------------------------------- /src/main/resources/img/bot/arm-l@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/bot/arm-l@2x.png -------------------------------------------------------------------------------- /src/main/resources/img/bot/arm-r@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/bot/arm-r@2x.png -------------------------------------------------------------------------------- /src/main/resources/img/bot/body@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/bot/body@2x.png -------------------------------------------------------------------------------- /src/main/resources/img/bot/face@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/bot/face@2x.png -------------------------------------------------------------------------------- /src/main/resources/img/bot/legs@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/bot/legs@2x.png -------------------------------------------------------------------------------- /src/main/resources/img/group-magic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/group-magic.png -------------------------------------------------------------------------------- /src/main/resources/img/hub_logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/hub_logo@2x.png -------------------------------------------------------------------------------- /dist/mac/resources/Cryptomator-Vault.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/dist/mac/resources/Cryptomator-Vault.icns -------------------------------------------------------------------------------- /dist/win/bundle/resources/Cryptomator.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/dist/win/bundle/resources/Cryptomator.ico -------------------------------------------------------------------------------- /dist/win/resources/Cryptomator-Vault.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/dist/win/resources/Cryptomator-Vault.ico -------------------------------------------------------------------------------- /src/main/resources/css/opensans_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/css/opensans_bold.ttf -------------------------------------------------------------------------------- /src/main/resources/css/quicksand_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/css/quicksand_bold.ttf -------------------------------------------------------------------------------- /src/main/resources/img/group-magic@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/group-magic@2x.png -------------------------------------------------------------------------------- /src/main/resources/img/title-logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/title-logo@2x.png -------------------------------------------------------------------------------- /src/main/resources/img/window_icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/window_icon_32.png -------------------------------------------------------------------------------- /src/main/resources/img/window_icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/window_icon_512.png -------------------------------------------------------------------------------- /src/main/resources/css/opensans_regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/css/opensans_regular.ttf -------------------------------------------------------------------------------- /src/main/resources/css/opensans_semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/css/opensans_semibold.ttf -------------------------------------------------------------------------------- /src/main/resources/img/tray_icon_mac@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/tray_icon_mac@2x.png -------------------------------------------------------------------------------- /src/main/resources/img/vault-volume-mac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/vault-volume-mac.png -------------------------------------------------------------------------------- /src/main/resources/img/vault-volume-win.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/vault-volume-win.png -------------------------------------------------------------------------------- /dist/mac/dmg/resources/Cryptomator-Volume.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/dist/mac/dmg/resources/Cryptomator-Volume.icns -------------------------------------------------------------------------------- /src/main/resources/img/select-masterkey-mac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/select-masterkey-mac.png -------------------------------------------------------------------------------- /src/main/resources/img/select-masterkey-win.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/select-masterkey-win.png -------------------------------------------------------------------------------- /src/main/resources/img/supporter_cert_stamp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/supporter_cert_stamp.png -------------------------------------------------------------------------------- /src/main/resources/img/tray_icon_unlocked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/tray_icon_unlocked.png -------------------------------------------------------------------------------- /dist/linux/appimage/.gitignore: -------------------------------------------------------------------------------- 1 | # downloaded/created during build 2 | openjfx-jmods.zip 3 | *.jmod 4 | Cryptomator.AppDir 5 | *.AppImage 6 | *.AppImage.zsync -------------------------------------------------------------------------------- /dist/linux/common/org.cryptomator.Cryptomator256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/dist/linux/common/org.cryptomator.Cryptomator256.png -------------------------------------------------------------------------------- /dist/linux/common/org.cryptomator.Cryptomator512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/dist/linux/common/org.cryptomator.Cryptomator512.png -------------------------------------------------------------------------------- /src/main/resources/css/fontawesome5-free-solid.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/css/fontawesome5-free-solid.otf -------------------------------------------------------------------------------- /src/main/resources/img/select-masterkey-mac-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/select-masterkey-mac-dark.png -------------------------------------------------------------------------------- /src/main/resources/img/select-masterkey-mac@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/select-masterkey-mac@2x.png -------------------------------------------------------------------------------- /src/main/resources/img/select-masterkey-win@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/select-masterkey-win@2x.png -------------------------------------------------------------------------------- /src/main/resources/img/supporter_cert_stamp@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/supporter_cert_stamp@2x.png -------------------------------------------------------------------------------- /src/main/resources/img/tray_icon_unlocked_mac@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/tray_icon_unlocked_mac@2x.png -------------------------------------------------------------------------------- /dist/win/.gitignore: -------------------------------------------------------------------------------- 1 | runtime 2 | Cryptomator 3 | installer 4 | *.wixobj 5 | *.pdb 6 | *.msi 7 | *.exe 8 | *.jmod 9 | resources/jfxJmods.zip 10 | license.rtf -------------------------------------------------------------------------------- /dist/mac/dmg/resources/Cryptomator-FUSE-T-background.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/dist/mac/dmg/resources/Cryptomator-FUSE-T-background.tiff -------------------------------------------------------------------------------- /src/main/resources/img/select-masterkey-mac-dark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/src/main/resources/img/select-masterkey-mac-dark@2x.png -------------------------------------------------------------------------------- /dist/mac/dmg/resources/Cryptomator-macFUSE-background.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tedi4t/cryptomator/HEAD/dist/mac/dmg/resources/Cryptomator-macFUSE-background.tiff -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/keyloading/hub/AuthFlowContext.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.keyloading.hub; 2 | 3 | record AuthFlowContext(String deviceId) { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Package Files # 4 | *.jar 5 | *.war 6 | *.ear 7 | 8 | # Maven # 9 | target/ 10 | pom.xml.versionsBackup 11 | 12 | # Java Crash Logs 13 | hs_err_pid*.log -------------------------------------------------------------------------------- /dist/win/resources/FAvaultFile.properties: -------------------------------------------------------------------------------- 1 | mime-type=application/vnd.cryptomator.vault 2 | extension=cryptomator 3 | description=Cryptomator Vault File 4 | icon=resources/Cryptomator-Vault.ico -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /dist/mac/dmg/.gitignore: -------------------------------------------------------------------------------- 1 | # downloaded/created during build 2 | Cryptomator.app/ 3 | runtime/ 4 | dmg/ 5 | *.dmg 6 | license.rtf 7 | openjfx-jmods.zip 8 | *.jmod 9 | Cryptomator.entitlements 10 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/Nullable.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common; 2 | 3 | /** 4 | * Replacement for JSR-305 to avoid runtime dependencies. Used in Dagger components. 5 | */ 6 | public @interface Nullable { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /dist/linux/debian/changelog: -------------------------------------------------------------------------------- 1 | cryptomator (${PPA_VERSION}) focal; urgency=low 2 | 3 | * Full changelog can be found on https://github.com/cryptomator/cryptomator/releases 4 | 5 | -- Cryptobot ${RFC2822_TIMESTAMP} 6 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/locationpresets/LocationPreset.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.locationpresets; 2 | 3 | import java.nio.file.Path; 4 | 5 | public record LocationPreset(String name, Path path) { 6 | 7 | 8 | 9 | } 10 | -------------------------------------------------------------------------------- /.crowdin.yml: -------------------------------------------------------------------------------- 1 | commit_message: '[ci skip]' 2 | files: 3 | - source: /src/main/resources/i18n/strings.properties 4 | translation: /src/main/resources/i18n/strings_%two_letters_code%.properties 5 | escape_quotes: 0 6 | escape_special_characters: 0 7 | -------------------------------------------------------------------------------- /dist/win/contrib/patchWebDAV.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | :: Default values for Cryptomator builds 3 | ::REPLACE ME 4 | 5 | cd %~dp0 6 | powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -Command .\patchWebDAV.ps1^ 7 | -LoopbackAlias %LOOPBACK_ALIAS% -------------------------------------------------------------------------------- /dist/mac/dmg/resources/FUSE-T.webloc: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | URL 6 | https://www.fuse-t.org/ 7 | 8 | 9 | -------------------------------------------------------------------------------- /dist/mac/dmg/resources/macFUSE.webloc: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | URL 6 | https://osxfuse.github.io/ 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/mount/MountPointInUseException.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.mount; 2 | 3 | import java.nio.file.Path; 4 | 5 | public class MountPointInUseException extends IllegalMountPointException { 6 | 7 | public MountPointInUseException(Path path) { 8 | super(path); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Help & Support 4 | url: https://community.cryptomator.org/ 5 | about: You will find answers in our community forum 6 | - name: User Manual 7 | url: https://docs.cryptomator.org/ 8 | about: Read the Cryptomator documentation here 9 | -------------------------------------------------------------------------------- /dist/linux/common/application-vnd.cryptomator.vault.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Cryptomator Vault Metadata 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/launcher/AppLaunchEvent.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.launcher; 2 | 3 | import java.nio.file.Path; 4 | import java.util.Collection; 5 | 6 | public record AppLaunchEvent(AppLaunchEvent.EventType type, Collection pathsToOpen) { 7 | 8 | public enum EventType { 9 | REVEAL_APP, 10 | OPEN_FILE 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # see https://intellij-support.jetbrains.com/hc/en-us/articles/206544839-How-to-manage-projects-under-Version-Control-Systems 2 | 3 | # Default ignored files 4 | /shelf/ 5 | /workspace.xml 6 | /usage.statistics.xml 7 | /dictionaries/ 8 | 9 | # generated from Maven 10 | /jarRepositories.xml 11 | /modules.xml 12 | /*.iml 13 | /libraries/*.xml -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/mount/MountPointNotSupportedException.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.mount; 2 | 3 | import java.nio.file.Path; 4 | 5 | public class MountPointNotSupportedException extends IllegalMountPointException { 6 | 7 | public MountPointNotSupportedException(Path path, String msg) { 8 | super(path, msg); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/PassphraseEntryResult.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.keyloading.masterkeyfile; 2 | 3 | import org.cryptomator.common.Passphrase; 4 | 5 | // TODO: change to package-private, as soon as this works for Dagger -.- 6 | public record PassphraseEntryResult(Passphrase passphrase, boolean savePassphrase) { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/mount/MountPointNotEmptyDirectoryException.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.mount; 2 | 3 | import java.nio.file.Path; 4 | 5 | public class MountPointNotEmptyDirectoryException extends IllegalMountPointException { 6 | 7 | public MountPointNotEmptyDirectoryException(Path path, String msg) { 8 | super(path, msg); 9 | } 10 | } -------------------------------------------------------------------------------- /src/test/resources/logback-test.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/lock/LockScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.lock; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface LockScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/quit/QuitScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.quit; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface QuitScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/logging/LogbackConfiguratorFactory.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.logging; 2 | 3 | public class LogbackConfiguratorFactory { 4 | 5 | public static LogbackConfigurator provider() { 6 | final class Holder { 7 | private static final LogbackConfigurator INSTANCE = new LogbackConfigurator(); 8 | } 9 | return Holder.INSTANCE; 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/unlock/UnlockScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.unlock; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface UnlockScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/vaults/PerVault.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.vaults; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | public @interface PerVault { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/lock/LockWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.lock; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface LockWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/quit/QuitWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.quit; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface QuitWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/traymenu/TrayMenuScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.traymenu; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface TrayMenuScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/mount/MountPointCleanupFailedException.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.mount; 2 | 3 | import java.nio.file.Path; 4 | 5 | public class MountPointCleanupFailedException extends IllegalMountPointException { 6 | 7 | public MountPointCleanupFailedException(Path path) { 8 | super(path, "Mountpoint could not be cleared: " + path.toString()); 9 | } 10 | } -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/health/HealthCheckScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.health; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface HealthCheckScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/migration/MigrationScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.migration; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface MigrationScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/unlock/UnlockWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.unlock; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface UnlockWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/fxapp/PrimaryStage.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.fxapp; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | public @interface PrimaryStage { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/mainwindow/MainWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.mainwindow; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface MainWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/mainwindow/MainWindowScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.mainwindow; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface MainWindowScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/sharevault/ShareVaultScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.sharevault; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface ShareVaultScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/fxapp/FxApplicationScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.fxapp; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | public @interface FxApplicationScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/health/HealthCheckWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.health; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface HealthCheckWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/keyloading/KeyLoadingScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.keyloading; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | public @interface KeyLoadingScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/preferences/PreferencesScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.preferences; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface PreferencesScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/stats/VaultStatisticsScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.stats; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | public @interface VaultStatisticsScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/convertvault/ConvertVaultScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.convertvault; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface ConvertVaultScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/keyloading/KeyLoading.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.keyloading; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | public @interface KeyLoading { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/migration/MigrationWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.migration; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface MigrationWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.recoverykey; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | public @interface RecoveryKeyScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.vaultoptions; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface VaultOptionsScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWizardScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.addvaultwizard; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface AddVaultWizardScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/changepassword/ChangePasswordScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.changepassword; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface ChangePasswordScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/forgetpassword/ForgetPasswordScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.forgetpassword; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface ForgetPasswordScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/preferences/PreferencesWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.preferences; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface PreferencesWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.recoverykey; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface RecoveryKeyWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/sharevault/ShareVaultWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.sharevault; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface ShareVaultWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/stats/VaultStatisticsWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.stats; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface VaultStatisticsWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.updatereminder; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface UpdateReminderScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/convertvault/ConvertVaultWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.convertvault; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface ConvertVaultWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.vaultoptions; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface VaultOptionsWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /dist/linux/debian/cryptomator.links: -------------------------------------------------------------------------------- 1 | usr/lib/cryptomator/bin/cryptomator usr/bin/cryptomator 2 | usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.tray.svg usr/share/icons/hicolor/symbolic/apps/org.cryptomator.Cryptomator.tray-symbolic.svg 3 | usr/share/icons/hicolor/scalable/apps/org.cryptomator.Cryptomator.tray-unlocked.svg usr/share/icons/hicolor/symbolic/apps/org.cryptomator.Cryptomator.tray-unlocked-symbolic.svg -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/wrongfilealert/WrongFileAlertScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.wrongfilealert; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | public @interface WrongFileAlertScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWizardWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.addvaultwizard; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface AddVaultWizardWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/changepassword/ChangePasswordWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.changepassword; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface ChangePasswordWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/common/FxmlScene.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.common; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | public @interface FxmlScene { 13 | 14 | FxmlFile value(); 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/forgetpassword/ForgetPasswordWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.forgetpassword; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface ForgetPasswordWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.updatereminder; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface UpdateReminderWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/wrongfilealert/WrongFileAlertWindow.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.wrongfilealert; 2 | 3 | import javax.inject.Qualifier; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | 7 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 8 | 9 | @Qualifier 10 | @Documented 11 | @Retention(RUNTIME) 12 | @interface WrongFileAlertWindow { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/PassphraseEntryScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.keyloading.masterkeyfile; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface PassphraseEntryScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/ChooseMasterkeyFileScoped.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.keyloading.masterkeyfile; 2 | 3 | import javax.inject.Scope; 4 | import java.lang.annotation.Documented; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | 8 | @Scope 9 | @Documented 10 | @Retention(RetentionPolicy.RUNTIME) 11 | @interface ChooseMasterkeyFileScoped { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /dist/linux/common/org.cryptomator.Cryptomator.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=Cryptomator 3 | Comment=Cloud Storage Encryption Utility 4 | Exec=cryptomator %F 5 | Icon=org.cryptomator.Cryptomator 6 | Terminal=false 7 | Type=Application 8 | Categories=Utility;Security;FileTools; 9 | StartupNotify=true 10 | StartupWMClass=org.cryptomator.launcher.Cryptomator$MainApp 11 | MimeType=application/vnd.cryptomator.encrypted;application/vnd.cryptomator.vault; 12 | -------------------------------------------------------------------------------- /.idea/dictionaries/dict_de.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | tresorinhalt 5 | tresorkonfigurationsdatei 6 | tresorlaufwerk 7 | tresorliste 8 | tresorname 9 | tresoroptionen 10 | tresorstatistik 11 | ungespeicherten 12 | ungespeicherter 13 | 14 | 15 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [cryptomator] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | custom: https://cryptomator.org/sponsors/ 9 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/mount/MountPointNotExistingException.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.mount; 2 | 3 | import java.nio.file.Path; 4 | 5 | public class MountPointNotExistingException extends IllegalMountPointException { 6 | 7 | public MountPointNotExistingException(Path path, String msg) { 8 | super(path, msg); 9 | } 10 | 11 | public MountPointNotExistingException(Path path) { 12 | super(path, "Mountpoint does not exist: " + path); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/unlock/UnlockCancelledException.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.unlock; 2 | 3 | import org.cryptomator.cryptolib.api.MasterkeyLoadingFailedException; 4 | 5 | public class UnlockCancelledException extends MasterkeyLoadingFailedException { 6 | 7 | public UnlockCancelledException(String message) { 8 | super(message); 9 | } 10 | 11 | public UnlockCancelledException(String message, Throwable cause) { 12 | super(message, cause); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/keyloading/hub/DeviceAlreadyExistsException.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.keyloading.hub; 2 | 3 | import org.cryptomator.cryptolib.api.MasterkeyLoadingFailedException; 4 | 5 | /** 6 | * Thrown, when Hub registerDevice-Request returns with 409 7 | */ 8 | class DeviceAlreadyExistsException extends MasterkeyLoadingFailedException { 9 | public DeviceAlreadyExistsException() { 10 | super("Device already registered on this Hub instance"); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/traymenu/TrayMenuModule.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.traymenu; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | import org.cryptomator.integrations.tray.TrayMenuController; 6 | 7 | import java.util.Optional; 8 | 9 | @Module 10 | public class TrayMenuModule { 11 | 12 | @Provides 13 | @TrayMenuScoped 14 | static Optional provideFirstSupportedTrayMenuController() { 15 | return TrayMenuController.get(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/vaultoptions/SelectedVaultOptionsTab.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.vaultoptions; 2 | 3 | public enum SelectedVaultOptionsTab { 4 | /** 5 | * Let the controller decide which tab to show. 6 | */ 7 | ANY, 8 | 9 | /** 10 | * Show general tab 11 | */ 12 | GENERAL, 13 | 14 | /** 15 | * Show mounting tab 16 | */ 17 | MOUNT, 18 | 19 | /** 20 | * Show password tab 21 | */ 22 | KEY, 23 | 24 | /** 25 | * Show hub tab 26 | */ 27 | HUB 28 | 29 | } 30 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/common/FxController.java: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright (c) 2017 Skymatic UG (haftungsbeschränkt). 3 | * All rights reserved. This program and the accompanying materials 4 | * are made available under the terms of the accompanying LICENSE file. 5 | *******************************************************************************/ 6 | package org.cryptomator.ui.common; 7 | 8 | public interface FxController { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/vaults/VaultListModule.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.vaults; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | 6 | import javax.inject.Singleton; 7 | import javafx.collections.FXCollections; 8 | import javafx.collections.ObservableList; 9 | 10 | @Module 11 | public class VaultListModule { 12 | 13 | @Provides 14 | @Singleton 15 | public ObservableList provideVaultList() { 16 | return FXCollections.observableArrayList(Vault::observables); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ipc/IpcMessageListener.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ipc; 2 | 3 | import java.util.List; 4 | 5 | public interface IpcMessageListener { 6 | 7 | default void handleMessage(IpcMessage message) { 8 | switch (message) { 9 | case RevealRunningAppMessage m -> revealRunningApp(); // TODO: rename to _ with JEP 443 10 | case HandleLaunchArgsMessage m -> handleLaunchArgs(m.args()); 11 | } 12 | } 13 | 14 | void revealRunningApp(); 15 | 16 | void handleLaunchArgs(List args); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/fxapp/ExitingQuitResponse.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.fxapp; 2 | 3 | import javafx.application.Platform; 4 | import java.awt.desktop.QuitResponse; 5 | 6 | record ExitingQuitResponse(QuitResponse delegate) implements QuitResponse { 7 | 8 | @Override 9 | public void performQuit() { 10 | Platform.exit(); 11 | // TODO wait a moment for javafx to terminate? 12 | delegate.performQuit(); 13 | } 14 | 15 | @Override 16 | public void cancelQuit() { 17 | delegate.cancelQuit(); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ipc/RevealRunningAppMessage.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ipc; 2 | 3 | import java.nio.ByteBuffer; 4 | 5 | public record RevealRunningAppMessage() implements IpcMessage { 6 | 7 | static RevealRunningAppMessage decode(ByteBuffer ignored) { 8 | return new RevealRunningAppMessage(); 9 | } 10 | 11 | @Override 12 | public MessageType getMessageType() { 13 | return MessageType.REVEAL_RUNNING_APP; 14 | } 15 | 16 | @Override 17 | public ByteBuffer encodePayload() { 18 | return ByteBuffer.allocate(0); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/mount/ConflictingMountServiceException.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.mount; 2 | 3 | import org.cryptomator.integrations.mount.MountFailedException; 4 | 5 | /** 6 | * Thrown by {@link Mounter} to indicate that the selected mount service can not be used 7 | * due to incompatibilities with a different mount service that is already in use. 8 | */ 9 | public class ConflictingMountServiceException extends MountFailedException { 10 | 11 | public ConflictingMountServiceException(String msg) { 12 | super(msg); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/error/ErrorDiscussion.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.error; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | import com.fasterxml.jackson.annotation.JsonProperty; 5 | 6 | @JsonIgnoreProperties(ignoreUnknown = true) 7 | public class ErrorDiscussion { 8 | 9 | @JsonProperty 10 | int upvoteCount; 11 | @JsonProperty 12 | String title; 13 | @JsonProperty 14 | String url; 15 | @JsonProperty 16 | Answer answer; 17 | 18 | @JsonIgnoreProperties(ignoreUnknown = true) 19 | static class Answer { 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /license/merges: -------------------------------------------------------------------------------- 1 | Apache License v2.0|Apache License, Version 2.0|The Apache Software License, Version 2.0|Apache 2.0|Apache Software License - Version 2.0|Apache-2.0 2 | MIT License|The MIT License (MIT)|The MIT License|MIT license 3 | LGPL 2.1|LGPL, version 2.1|GNU Lesser/Library General Public License version 2|GNU Lesser General Public License Version 2.1 4 | GPLv2|GNU General Public License Version 2 5 | GPLv2+CE|CDDL + GPLv2 with classpath exception 6 | Eclipse Public License - Version 1.0|Eclipse Public License - v 1.0 7 | Eclipse Public License - Version 2.0|Eclipse Public License - v 2.0 -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/keychain/NoKeychainAccessProviderException.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.keychain; 2 | 3 | import org.cryptomator.integrations.keychain.KeychainAccessException; 4 | 5 | /** 6 | * Thrown by {@link KeychainManager} if attempted to access a keychain despite no supported keychain access provider being available. 7 | */ 8 | public class NoKeychainAccessProviderException extends KeychainAccessException { 9 | 10 | public NoKeychainAccessProviderException() { 11 | super("Did not find any supported keychain access provider."); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/mount/HideawayNotDirectoryException.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.mount; 2 | 3 | import java.nio.file.Path; 4 | 5 | public class HideawayNotDirectoryException extends IllegalMountPointException { 6 | 7 | private final Path hideaway; 8 | 9 | public HideawayNotDirectoryException(Path path, Path hideaway) { 10 | super(path, "Existing hideaway (" + hideaway.toString() + ") for mountpoint is not a directory: " + path.toString()); 11 | this.hideaway = hideaway; 12 | } 13 | 14 | public Path getHideaway() { 15 | return hideaway; 16 | } 17 | } -------------------------------------------------------------------------------- /dist/win/launcher.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | java ^ 3 | -p "mods" ^ 4 | -cp "libs/*" ^ 5 | -Dcryptomator.settingsPath="~/AppData/Roaming/Cryptomator/settings.json" ^ 6 | -Dcryptomator.ipcSocketPath="~/AppData/Roaming/Cryptomator/ipc.socket" ^ 7 | -Dcryptomator.logDir="~/AppData/Roaming/Cryptomator" ^ 8 | -Dcryptomator.mountPointsDir="~/Cryptomator" ^ 9 | -Dcryptomator.keychainPath="~/AppData/Roaming/Cryptomator/keychain.json" ^ 10 | -Xss20m ^ 11 | -Xmx512m ^ 12 | --enable-preview ` 13 | --enable-native-access=org.cryptomator.jfuse.win ` 14 | -m org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator -------------------------------------------------------------------------------- /.github/workflows/dependency-check.yml: -------------------------------------------------------------------------------- 1 | name: OWASP Maven Dependency Check 2 | on: 3 | schedule: 4 | - cron: '0 8 * * 0' 5 | workflow_dispatch: 6 | 7 | 8 | jobs: 9 | check-dependencies: 10 | uses: skymatic/workflows/.github/workflows/run-dependency-check.yml@v1 11 | with: 12 | runner-os: 'ubuntu-latest' 13 | java-distribution: 'temurin' 14 | java-version: 23 15 | check-command: 'mvn -B validate -Pdependency-check -Djavafx.platform=linux' 16 | secrets: 17 | nvd-api-key: ${{ secrets.NVD_API_KEY }} 18 | slack-webhook-url: ${{ secrets.SLACK_WEBHOOK_URL }} 19 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/RunnableThrowingException.java: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright (c) 2017 Skymatic UG (haftungsbeschränkt). 3 | * All rights reserved. This program and the accompanying materials 4 | * are made available under the terms of the accompanying LICENSE file. 5 | *******************************************************************************/ 6 | package org.cryptomator.common; 7 | 8 | @FunctionalInterface 9 | public interface RunnableThrowingException { 10 | 11 | void run() throws T; 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/SupplierThrowingException.java: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright (c) 2017 Skymatic UG (haftungsbeschränkt). 3 | * All rights reserved. This program and the accompanying materials 4 | * are made available under the terms of the accompanying LICENSE file. 5 | *******************************************************************************/ 6 | package org.cryptomator.common; 7 | 8 | @FunctionalInterface 9 | public interface SupplierThrowingException { 10 | 11 | T get() throws E; 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/ConsumerThrowingException.java: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright (c) 2017 Skymatic UG (haftungsbeschränkt). 3 | * All rights reserved. This program and the accompanying materials 4 | * are made available under the terms of the accompanying LICENSE file. 5 | *******************************************************************************/ 6 | package org.cryptomator.common; 7 | 8 | @FunctionalInterface 9 | public interface ConsumerThrowingException { 10 | 11 | void accept(T t) throws E; 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeySuccessController.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.recoverykey; 2 | 3 | import org.cryptomator.ui.common.FxController; 4 | 5 | import javax.inject.Inject; 6 | import javafx.fxml.FXML; 7 | import javafx.stage.Stage; 8 | 9 | @RecoveryKeyScoped 10 | public class RecoveryKeySuccessController implements FxController { 11 | 12 | private final Stage window; 13 | 14 | @Inject 15 | public RecoveryKeySuccessController(@RecoveryKeyWindow Stage window) { 16 | this.window = window; 17 | } 18 | 19 | @FXML 20 | public void close() { 21 | window.close(); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/keyloading/hub/InvalidLicenseController.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.keyloading.hub; 2 | 3 | import org.cryptomator.ui.common.FxController; 4 | import org.cryptomator.ui.keyloading.KeyLoading; 5 | 6 | import javax.inject.Inject; 7 | import javafx.fxml.FXML; 8 | import javafx.stage.Stage; 9 | 10 | public class InvalidLicenseController implements FxController { 11 | 12 | private final Stage window; 13 | 14 | @Inject 15 | public InvalidLicenseController(@KeyLoading Stage window) { 16 | this.window = window; 17 | } 18 | 19 | @FXML 20 | public void close() { 21 | window.close(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/preferences/SelectedPreferencesTab.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.preferences; 2 | 3 | public enum SelectedPreferencesTab { 4 | /** 5 | * Let the controller decide which tab to show. 6 | */ 7 | ANY, 8 | 9 | /** 10 | * Show general tab 11 | */ 12 | GENERAL, 13 | 14 | /** 15 | * Show interface tab 16 | */ 17 | INTERFACE, 18 | 19 | /** 20 | * Show volume tab 21 | */ 22 | VOLUME, 23 | 24 | /** 25 | * Show updates tab 26 | */ 27 | UPDATES, 28 | 29 | /** 30 | * Show contribute tab 31 | */ 32 | CONTRIBUTE, 33 | 34 | /** 35 | * Show about tab 36 | */ 37 | ABOUT, 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/Constants.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common; 2 | 3 | import org.cryptomator.ui.keyloading.masterkeyfile.MasterkeyFileLoadingStrategy; 4 | 5 | import java.net.URI; 6 | 7 | public interface Constants { 8 | 9 | String MASTERKEY_FILENAME = "masterkey.cryptomator"; 10 | String MASTERKEY_BACKUP_SUFFIX = ".bkup"; 11 | String VAULTCONFIG_FILENAME = "vault.cryptomator"; 12 | String CRYPTOMATOR_FILENAME_EXT = ".cryptomator"; 13 | String CRYPTOMATOR_FILENAME_GLOB = "*.cryptomator"; 14 | URI DEFAULT_KEY_ID = URI.create(MasterkeyFileLoadingStrategy.SCHEME + ":" + MASTERKEY_FILENAME); 15 | byte[] PEPPER = new byte[0]; 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyResetPasswordSuccessController.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.recoverykey; 2 | 3 | import org.cryptomator.ui.common.FxController; 4 | 5 | import javax.inject.Inject; 6 | import javafx.fxml.FXML; 7 | import javafx.stage.Stage; 8 | 9 | @RecoveryKeyScoped 10 | public class RecoveryKeyResetPasswordSuccessController implements FxController { 11 | 12 | private final Stage window; 13 | 14 | @Inject 15 | public RecoveryKeyResetPasswordSuccessController(@RecoveryKeyWindow Stage window) { 16 | this.window = window; 17 | } 18 | 19 | @FXML 20 | public void close() { 21 | window.close(); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /dist/linux/debian/cryptomator.install: -------------------------------------------------------------------------------- 1 | cryptomator usr/lib 2 | common/org.cryptomator.Cryptomator.desktop usr/share/applications 3 | common/org.cryptomator.Cryptomator.svg usr/share/icons/hicolor/scalable/apps 4 | common/org.cryptomator.Cryptomator.tray.svg usr/share/icons/hicolor/scalable/apps 5 | common/org.cryptomator.Cryptomator.tray-unlocked.svg usr/share/icons/hicolor/scalable/apps 6 | common/org.cryptomator.Cryptomator256.png usr/share/icons/hicolor/256x256/apps 7 | common/org.cryptomator.Cryptomator512.png usr/share/icons/hicolor/512x512/apps 8 | common/org.cryptomator.Cryptomator.metainfo.xml usr/share/metainfo 9 | common/application-vnd.cryptomator.vault.xml usr/share/mime/packages -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/controls/NumericTextField.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.controls; 2 | 3 | import javafx.scene.control.TextField; 4 | import javafx.scene.control.TextFormatter; 5 | import java.util.regex.Pattern; 6 | 7 | public class NumericTextField extends TextField { 8 | 9 | private final static Pattern DIGIT_PATTERN = Pattern.compile("\\d*"); 10 | 11 | public NumericTextField() { 12 | this.setTextFormatter(new TextFormatter<>(this::filterNumericTextChange)); 13 | } 14 | 15 | private TextFormatter.Change filterNumericTextChange(TextFormatter.Change change) { 16 | return DIGIT_PATTERN.matcher(change.getText()).matches() ? change : null; 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/common/StageFactory.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.common; 2 | 3 | import org.cryptomator.ui.fxapp.FxApplicationScoped; 4 | 5 | import javax.inject.Inject; 6 | import javafx.stage.Stage; 7 | import javafx.stage.StageStyle; 8 | import java.util.function.Consumer; 9 | 10 | @FxApplicationScoped 11 | public class StageFactory { 12 | 13 | private final Consumer initializer; 14 | 15 | @Inject 16 | public StageFactory(StageInitializer initializer) { 17 | this.initializer = initializer; 18 | } 19 | 20 | public Stage create() { 21 | Stage stage = new Stage(StageStyle.DECORATED); 22 | initializer.accept(stage); 23 | return stage; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/controls/AlphanumericTextField.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.controls; 2 | 3 | import javafx.scene.control.TextField; 4 | import javafx.scene.control.TextFormatter; 5 | import java.util.regex.Pattern; 6 | 7 | public class AlphanumericTextField extends TextField { 8 | 9 | private final static Pattern DIGIT_PATTERN = Pattern.compile("\\w*"); 10 | 11 | public AlphanumericTextField() { 12 | this.setTextFormatter(new TextFormatter<>(this::filterNumericTextChange)); 13 | } 14 | 15 | private TextFormatter.Change filterNumericTextChange(TextFormatter.Change change) { 16 | return DIGIT_PATTERN.matcher(change.getText()).matches() ? change : null; 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/ChooseMasterkeyFileComponent.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.keyloading.masterkeyfile; 2 | 3 | import dagger.Subcomponent; 4 | 5 | import javafx.scene.Scene; 6 | import java.nio.file.Path; 7 | import java.util.concurrent.CompletableFuture; 8 | 9 | @ChooseMasterkeyFileScoped 10 | @Subcomponent(modules = {ChooseMasterkeyFileModule.class}) 11 | public interface ChooseMasterkeyFileComponent { 12 | 13 | @ChooseMasterkeyFileScoped 14 | Scene chooseMasterkeyScene(); 15 | 16 | @ChooseMasterkeyFileScoped 17 | CompletableFuture result(); 18 | 19 | @Subcomponent.Builder 20 | interface Builder { 21 | 22 | ChooseMasterkeyFileComponent build(); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/settings/WhenUnlocked.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.settings; 2 | 3 | import com.fasterxml.jackson.annotation.JsonEnumDefaultValue; 4 | import com.fasterxml.jackson.annotation.JsonFormat; 5 | 6 | @JsonFormat(shape = JsonFormat.Shape.STRING) 7 | public enum WhenUnlocked { 8 | IGNORE("vaultOptions.general.actionAfterUnlock.ignore"), 9 | REVEAL("vaultOptions.general.actionAfterUnlock.reveal"), 10 | @JsonEnumDefaultValue ASK("vaultOptions.general.actionAfterUnlock.ask"); 11 | 12 | private String displayName; 13 | 14 | WhenUnlocked(String displayName) { 15 | this.displayName = displayName; 16 | } 17 | 18 | public String getDisplayName() { 19 | return displayName; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/keyloading/hub/LegacyRegisterSuccessController.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.keyloading.hub; 2 | 3 | import org.cryptomator.ui.common.FxController; 4 | import org.cryptomator.ui.keyloading.KeyLoading; 5 | import org.cryptomator.ui.keyloading.KeyLoadingScoped; 6 | 7 | import javax.inject.Inject; 8 | import javafx.fxml.FXML; 9 | import javafx.stage.Stage; 10 | 11 | @KeyLoadingScoped 12 | public class LegacyRegisterSuccessController implements FxController { 13 | private final Stage window; 14 | 15 | @Inject 16 | public LegacyRegisterSuccessController(@KeyLoading Stage window) { 17 | this.window = window; 18 | } 19 | 20 | @FXML 21 | public void close() { 22 | window.close(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/launcher/CryptomatorComponent.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.launcher; 2 | 3 | import dagger.BindsInstance; 4 | import dagger.Component; 5 | import org.cryptomator.common.CommonsModule; 6 | import org.cryptomator.ui.fxapp.FxApplicationComponent; 7 | 8 | import javax.inject.Named; 9 | import javax.inject.Singleton; 10 | 11 | @Singleton 12 | @Component(modules = {CryptomatorModule.class, CommonsModule.class}) 13 | public interface CryptomatorComponent { 14 | 15 | Cryptomator application(); 16 | 17 | FxApplicationComponent.Builder fxAppComponentBuilder(); 18 | 19 | @Component.Factory 20 | interface Factory { 21 | CryptomatorComponent create(@BindsInstance @Named("startupTime") long startupTime); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /.github/SUPPORT.md: -------------------------------------------------------------------------------- 1 | # Support for Cryptomator 2 | 3 | For development-related topics, GitHub is the right place. 4 | 5 | For _everything else_, please visit our official [Cryptomator Community](https://community.cryptomator.org) (we are there, too :wink:). Amongst others, you will find: 6 | 7 | - [Knowledge Base](https://community.cryptomator.org/c/kb) 8 | - Installation manuals 9 | - Usage guides 10 | - FAQ 11 | - [Help with problems](https://community.cryptomator.org/c/help) 12 | - Assistance with the setup 13 | - Known issues and workarounds 14 | - Discussions about the apps 15 | - [Development discussions](https://community.cryptomator.org/c/development) 16 | - General questions 17 | - Discussions regarding our design decisions 18 | - Our roadmap 19 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/networking/SSLContextWithWindowsCertStore.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.networking; 2 | 3 | import org.cryptomator.integrations.common.OperatingSystem; 4 | 5 | import java.security.KeyStore; 6 | import java.security.KeyStoreException; 7 | 8 | /** 9 | * SSLContextProvider for Windows using the Windows certificate store as trust store 10 | *

11 | * In order to work, the jdk.crypto.mscapi jmod is needed 12 | */ 13 | @OperatingSystem(OperatingSystem.Value.WINDOWS) 14 | public class SSLContextWithWindowsCertStore extends SSLContextDifferentTrustStoreBase implements SSLContextProvider { 15 | 16 | @Override 17 | KeyStore getTruststore() throws KeyStoreException { 18 | return KeyStore.getInstance("WINDOWS-ROOT"); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/networking/SSLContextProvider.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.networking; 2 | 3 | import org.cryptomator.integrations.common.IntegrationsLoader; 4 | 5 | import javax.net.ssl.SSLContext; 6 | import java.security.SecureRandom; 7 | import java.util.ServiceLoader; 8 | import java.util.stream.Stream; 9 | 10 | public interface SSLContextProvider { 11 | 12 | SSLContext getContext(SecureRandom csprng) throws SSLContextBuildException; 13 | 14 | class SSLContextBuildException extends Exception { 15 | 16 | SSLContextBuildException(Throwable t) { 17 | super(t); 18 | } 19 | } 20 | 21 | static Stream loadAll() { 22 | return IntegrationsLoader.loadAll(ServiceLoader.load(SSLContextProvider.class), SSLContextProvider.class); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /.github/workflows/pullrequest.yml: -------------------------------------------------------------------------------- 1 | name: Pull Request 2 | 3 | on: 4 | pull_request: 5 | 6 | env: 7 | JAVA_DIST: 'temurin' 8 | JAVA_VERSION: 23 9 | 10 | defaults: 11 | run: 12 | shell: bash 13 | 14 | jobs: 15 | test: 16 | name: Compile and Test 17 | runs-on: ubuntu-latest 18 | if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')" 19 | steps: 20 | - uses: actions/checkout@v4 21 | - uses: actions/setup-java@v4 22 | with: 23 | distribution: ${{ env.JAVA_DIST }} 24 | java-version: ${{ env.JAVA_VERSION }} 25 | cache: 'maven' 26 | - name: Build and Test 27 | run: xvfb-run mvn -B clean install jacoco:report -Pcoverage -Djavafx.platform=linux -------------------------------------------------------------------------------- /src/main/resources/fxml/vault_detail_needsmigration.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | 18 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/lock/LockFailedController.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.lock; 2 | 3 | import org.cryptomator.common.vaults.Vault; 4 | import org.cryptomator.ui.common.FxController; 5 | 6 | import javax.inject.Inject; 7 | import javafx.fxml.FXML; 8 | import javafx.stage.Stage; 9 | 10 | @LockScoped 11 | public class LockFailedController implements FxController { 12 | 13 | private final Stage window; 14 | private final Vault vault; 15 | 16 | @Inject 17 | public LockFailedController(@LockWindow Stage window, @LockWindow Vault vault) { 18 | this.window = window; 19 | this.vault = vault; 20 | } 21 | 22 | @FXML 23 | public void close() { 24 | window.close(); 25 | } 26 | 27 | // ----- Getter & Setter ----- 28 | public String getVaultName() { 29 | return vault.getDisplayName(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/keyloading/KeyLoadingComponent.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.keyloading; 2 | 3 | import dagger.BindsInstance; 4 | import dagger.Subcomponent; 5 | import org.cryptomator.common.vaults.Vault; 6 | import org.cryptomator.cryptolib.api.MasterkeyLoader; 7 | 8 | import javafx.stage.Stage; 9 | import java.util.Map; 10 | import java.util.function.Supplier; 11 | 12 | @KeyLoadingScoped 13 | @Subcomponent(modules = {KeyLoadingModule.class}) 14 | public interface KeyLoadingComponent { 15 | 16 | @KeyLoading 17 | KeyLoadingStrategy keyloadingStrategy(); 18 | 19 | @Subcomponent.Builder 20 | interface Builder { 21 | 22 | @BindsInstance 23 | Builder vault(@KeyLoading Vault vault); 24 | 25 | @BindsInstance 26 | Builder window(@KeyLoading Stage window); 27 | 28 | KeyLoadingComponent build(); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/keyloading/hub/RegisterFailedController.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.keyloading.hub; 2 | 3 | import org.cryptomator.ui.common.FxController; 4 | import org.cryptomator.ui.keyloading.KeyLoading; 5 | 6 | import javax.inject.Inject; 7 | import javafx.fxml.FXML; 8 | import javafx.stage.Stage; 9 | import java.util.concurrent.CompletableFuture; 10 | 11 | public class RegisterFailedController implements FxController { 12 | 13 | private final Stage window; 14 | private final CompletableFuture result; 15 | 16 | @Inject 17 | public RegisterFailedController(@KeyLoading Stage window, CompletableFuture result) { 18 | this.window = window; 19 | this.result = result; 20 | } 21 | 22 | @FXML 23 | public void close() { 24 | result.cancel(true); 25 | window.close(); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /.github/workflows/winget.yml: -------------------------------------------------------------------------------- 1 | name: Publish MSI to winget-pkgs 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | tag: 7 | description: 'Release tag' 8 | required: true 9 | 10 | jobs: 11 | winget: 12 | name: Publish winget package 13 | runs-on: windows-latest 14 | steps: 15 | - name: Sync winget-pkgs fork 16 | run: | 17 | gh repo sync cryptomator/winget-pkgs -b master --force 18 | env: 19 | GH_TOKEN: ${{ secrets.CRYPTOBOT_WINGET_TOKEN }} 20 | - name: Submit package 21 | uses: vedantmgoyal2009/winget-releaser@main 22 | with: 23 | identifier: Cryptomator.Cryptomator 24 | version: ${{ inputs.tag }} 25 | release-tag: ${{ inputs.tag }} 26 | installers-regex: '\.msi$' 27 | token: ${{ secrets.CRYPTOBOT_WINGET_TOKEN }} -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/networking/SSLContextWithMacKeychain.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.networking; 2 | 3 | import org.cryptomator.integrations.common.OperatingSystem; 4 | 5 | import java.io.IOException; 6 | import java.security.KeyStore; 7 | import java.security.KeyStoreException; 8 | import java.security.NoSuchAlgorithmException; 9 | import java.security.cert.CertificateException; 10 | 11 | /** 12 | * SSLContextProvider for macOS using the macOS Keychain as truststore 13 | */ 14 | @OperatingSystem(OperatingSystem.Value.MAC) 15 | public class SSLContextWithMacKeychain extends SSLContextDifferentTrustStoreBase implements SSLContextProvider { 16 | 17 | @Override 18 | KeyStore getTruststore() throws KeyStoreException, CertificateException, IOException, NoSuchAlgorithmException { 19 | return KeyStore.getInstance("KeychainStore-ROOT"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /.github/release.yml: -------------------------------------------------------------------------------- 1 | # .github/release.yml 2 | # see https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes#configuring-automatically-generated-release-notes 3 | 4 | changelog: 5 | exclude: 6 | authors: 7 | - cryptobot 8 | - dependabot 9 | - github-actions 10 | categories: 11 | - title: What's New 🎉 12 | labels: 13 | - type:feature-request 14 | - type:enhancement 15 | - title: Bugfixes 🐛 16 | labels: 17 | - type:security-issue 18 | - type:bug 19 | - type:minor-bug 20 | - title: Other Changes 📎 21 | labels: 22 | - "*" 23 | exclude: 24 | labels: 25 | - type:feature-request 26 | - type:enhancement 27 | - type:security-issue 28 | - type:bug 29 | - type:minor-bug -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/convertvault/HubToPasswordSuccessController.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.convertvault; 2 | 3 | import org.cryptomator.common.vaults.Vault; 4 | import org.cryptomator.ui.common.FxController; 5 | 6 | import javax.inject.Inject; 7 | import javafx.fxml.FXML; 8 | import javafx.stage.Stage; 9 | 10 | public class HubToPasswordSuccessController implements FxController { 11 | 12 | private final Stage window; 13 | private final Vault vault; 14 | 15 | @Inject 16 | HubToPasswordSuccessController(@ConvertVaultWindow Stage window, @ConvertVaultWindow Vault vault) { 17 | this.window = window; 18 | this.vault = vault; 19 | } 20 | 21 | @FXML 22 | public void close() { 23 | window.close(); 24 | window.getOwner().hide(); 25 | } 26 | 27 | /* Observables */ 28 | 29 | public Vault getVault() { 30 | return vault; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/test/java/org/cryptomator/ui/keyloading/hub/HubConfigTest.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.keyloading.hub; 2 | 3 | import com.auth0.jwt.JWT; 4 | import org.junit.jupiter.api.Assertions; 5 | import org.junit.jupiter.api.DisplayName; 6 | import org.junit.jupiter.api.Test; 7 | 8 | public class HubConfigTest { 9 | 10 | @Test 11 | @DisplayName("can parse JWT with unknown fields in header claim \"hub\"") 12 | public void testParseJWTWithUnknownFields() { 13 | var jwt = JWT.decode("eyJraWQiOiIxMjMiLCJ0eXAiOiJqd3QiLCJhbGciOiJIUzI1NiIsImh1YiI6eyJ1bmtub3duRmllbGQiOjQyLCJjbGllbnRJZCI6ImNyeXB0b21hdG9yIn19.eyJqdGkiOiI0NTYifQ.e1CStFf5fdh9ofX_6O8_LfbHfHEJZqUpuYNWz9xZp0I"); 14 | var claim = jwt.getHeaderClaim("hub"); 15 | var hubConfig = Assertions.assertDoesNotThrow(() -> claim.as(HubConfig.class)); 16 | Assertions.assertEquals("cryptomator", hubConfig.clientId); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /dist/mac/Cryptomator.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.application-identifier 6 | ###APP_IDENTIFIER_PREFIX###org.cryptomator 7 | com.apple.developer.team-identifier 8 | ###TEAM_IDENTIFIER### 9 | com.apple.security.cs.allow-jit 10 | 11 | com.apple.security.cs.allow-unsigned-executable-memory 12 | 13 | com.apple.security.cs.disable-executable-page-protection 14 | 15 | com.apple.security.cs.disable-library-validation 16 | 17 | keychain-access-groups 18 | 19 | ###APP_IDENTIFIER_PREFIX###org.cryptomator 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/wrongfilealert/WrongFileAlertComponent.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.wrongfilealert; 2 | 3 | import dagger.Lazy; 4 | import dagger.Subcomponent; 5 | import org.cryptomator.ui.common.FxmlFile; 6 | import org.cryptomator.ui.common.FxmlScene; 7 | 8 | import javafx.scene.Scene; 9 | import javafx.stage.Stage; 10 | 11 | @WrongFileAlertScoped 12 | @Subcomponent(modules = {WrongFileAlertModule.class}) 13 | public interface WrongFileAlertComponent { 14 | 15 | @WrongFileAlertWindow 16 | Stage window(); 17 | 18 | @FxmlScene(FxmlFile.WRONGFILEALERT) 19 | Lazy scene(); 20 | 21 | default void showWrongFileAlertWindow() { 22 | Stage stage = window(); 23 | stage.setScene(scene().get()); 24 | stage.sizeToScene(); 25 | stage.show(); 26 | } 27 | 28 | @Subcomponent.Builder 29 | interface Builder { 30 | 31 | WrongFileAlertComponent build(); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/updatereminder/UpdateReminderComponent.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.updatereminder; 2 | 3 | import dagger.Lazy; 4 | import dagger.Subcomponent; 5 | import org.cryptomator.ui.common.FxmlFile; 6 | import org.cryptomator.ui.common.FxmlScene; 7 | 8 | import javafx.scene.Scene; 9 | import javafx.stage.Stage; 10 | 11 | @UpdateReminderScoped 12 | @Subcomponent(modules = {UpdateReminderModule.class}) 13 | public interface UpdateReminderComponent { 14 | 15 | @UpdateReminderWindow 16 | Stage window(); 17 | 18 | @FxmlScene(FxmlFile.UPDATE_REMINDER) 19 | Lazy updateReminderScene(); 20 | 21 | default void showUpdateReminderWindow() { 22 | Stage stage = window(); 23 | stage.setScene(updateReminderScene().get()); 24 | stage.sizeToScene(); 25 | stage.show(); 26 | } 27 | 28 | @Subcomponent.Factory 29 | interface Factory { 30 | 31 | UpdateReminderComponent create(); 32 | } 33 | } -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultRecoveryKeyController.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.addvaultwizard; 2 | 3 | import dagger.Lazy; 4 | import org.cryptomator.ui.common.FxController; 5 | import org.cryptomator.ui.common.FxmlFile; 6 | import org.cryptomator.ui.common.FxmlScene; 7 | 8 | import javax.inject.Inject; 9 | import javafx.fxml.FXML; 10 | import javafx.scene.Scene; 11 | import javafx.stage.Stage; 12 | 13 | public class CreateNewVaultRecoveryKeyController implements FxController { 14 | 15 | private final Stage window; 16 | private final Lazy successScene; 17 | 18 | @Inject 19 | CreateNewVaultRecoveryKeyController(@AddVaultWizardWindow Stage window, @FxmlScene(FxmlFile.ADDVAULT_SUCCESS) Lazy successScene) { 20 | this.window = window; 21 | this.successScene = successScene; 22 | } 23 | 24 | @FXML 25 | public void next() { 26 | window.setScene(successScene.get()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/common/FxControllerKey.java: -------------------------------------------------------------------------------- 1 | /******************************************************************************* 2 | * Copyright (c) 2017 Skymatic UG (haftungsbeschränkt). 3 | * All rights reserved. This program and the accompanying materials 4 | * are made available under the terms of the accompanying LICENSE file. 5 | *******************************************************************************/ 6 | package org.cryptomator.ui.common; 7 | 8 | import dagger.MapKey; 9 | 10 | import java.lang.annotation.Documented; 11 | import java.lang.annotation.Retention; 12 | import java.lang.annotation.Target; 13 | 14 | import static java.lang.annotation.ElementType.METHOD; 15 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 16 | 17 | @Documented 18 | @Target(METHOD) 19 | @Retention(RUNTIME) 20 | @MapKey 21 | public @interface FxControllerKey { 22 | 23 | Class value(); 24 | } 25 | -------------------------------------------------------------------------------- /dist/win/resources/ui.wxf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 1 10 | 1 11 | NOT Installed 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/sharevault/ShareVaultComponent.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.sharevault; 2 | 3 | import dagger.BindsInstance; 4 | import dagger.Lazy; 5 | import dagger.Subcomponent; 6 | import org.cryptomator.common.vaults.Vault; 7 | import org.cryptomator.ui.common.FxmlFile; 8 | import org.cryptomator.ui.common.FxmlScene; 9 | 10 | import javafx.scene.Scene; 11 | import javafx.stage.Stage; 12 | 13 | @ShareVaultScoped 14 | @Subcomponent(modules = {ShareVaultModule.class}) 15 | public interface ShareVaultComponent { 16 | 17 | @ShareVaultWindow 18 | Stage window(); 19 | 20 | @FxmlScene(FxmlFile.SHARE_VAULT) 21 | Lazy scene(); 22 | 23 | default void showShareVaultWindow(){ 24 | Stage stage = window(); 25 | stage.setScene(scene().get()); 26 | stage.show(); 27 | } 28 | 29 | @Subcomponent.Factory 30 | interface Factory { 31 | ShareVaultComponent create(@BindsInstance @ShareVaultWindow Vault vault); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/settings/UiTheme.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.settings; 2 | 3 | import com.fasterxml.jackson.annotation.JsonEnumDefaultValue; 4 | import com.fasterxml.jackson.annotation.JsonFormat; 5 | import org.apache.commons.lang3.SystemUtils; 6 | 7 | @JsonFormat(shape = JsonFormat.Shape.STRING) 8 | public enum UiTheme { 9 | @JsonEnumDefaultValue LIGHT("preferences.interface.theme.light"), // 10 | DARK("preferences.interface.theme.dark"), // 11 | AUTOMATIC("preferences.interface.theme.automatic"); 12 | 13 | public static UiTheme[] applicableValues() { 14 | if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_WINDOWS) { 15 | return values(); 16 | } else { 17 | return new UiTheme[]{LIGHT, DARK}; 18 | } 19 | } 20 | 21 | private final String displayName; 22 | 23 | UiTheme(String displayName) { 24 | this.displayName = displayName; 25 | } 26 | 27 | public String getDisplayName() { 28 | return displayName; 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/error/ErrorComponent.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.error; 2 | 3 | import dagger.BindsInstance; 4 | import dagger.Subcomponent; 5 | import org.cryptomator.common.Nullable; 6 | import org.cryptomator.ui.common.FxmlFile; 7 | import org.cryptomator.ui.common.FxmlScene; 8 | 9 | import javafx.scene.Scene; 10 | import javafx.stage.Stage; 11 | 12 | @Subcomponent(modules = {ErrorModule.class}) 13 | public interface ErrorComponent { 14 | 15 | Stage window(); 16 | 17 | @FxmlScene(FxmlFile.ERROR) 18 | Scene scene(); 19 | 20 | default Stage show() { 21 | Stage stage = window(); 22 | stage.setScene(scene()); 23 | stage.setMinWidth(420); 24 | stage.setMinHeight(300); 25 | stage.show(); 26 | return stage; 27 | } 28 | 29 | @Subcomponent.Factory 30 | interface Factory { 31 | 32 | ErrorComponent create(@BindsInstance Throwable cause, @BindsInstance Stage window, @BindsInstance @Nullable Scene previousScene); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/keyloading/hub/NoKeychainController.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.keyloading.hub; 2 | 3 | import org.cryptomator.ui.common.FxController; 4 | import org.cryptomator.ui.fxapp.FxApplicationWindows; 5 | import org.cryptomator.ui.keyloading.KeyLoading; 6 | import org.cryptomator.ui.preferences.SelectedPreferencesTab; 7 | 8 | import javax.inject.Inject; 9 | import javafx.stage.Stage; 10 | 11 | public class NoKeychainController implements FxController { 12 | 13 | private final Stage window; 14 | private final FxApplicationWindows appWindows; 15 | 16 | @Inject 17 | public NoKeychainController(@KeyLoading Stage window, FxApplicationWindows appWindows) { 18 | this.window = window; 19 | this.appWindows = appWindows; 20 | } 21 | 22 | 23 | public void cancel() { 24 | window.close(); 25 | } 26 | 27 | public void openPreferences() { 28 | appWindows.showPreferencesWindow(SelectedPreferencesTab.GENERAL); 29 | window.close(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/PassphraseEntryComponent.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.keyloading.masterkeyfile; 2 | 3 | import dagger.BindsInstance; 4 | import dagger.Subcomponent; 5 | import org.cryptomator.common.Nullable; 6 | import org.cryptomator.common.Passphrase; 7 | 8 | import javax.inject.Named; 9 | import javafx.scene.Scene; 10 | import java.util.concurrent.CompletableFuture; 11 | 12 | @PassphraseEntryScoped 13 | @Subcomponent(modules = {PassphraseEntryModule.class}) 14 | public interface PassphraseEntryComponent { 15 | 16 | @PassphraseEntryScoped 17 | Scene passphraseEntryScene(); 18 | 19 | @PassphraseEntryScoped 20 | CompletableFuture result(); 21 | 22 | @Subcomponent.Builder 23 | interface Builder { 24 | 25 | @BindsInstance 26 | PassphraseEntryComponent.Builder savedPassword(@Nullable @Named("savedPassword") Passphrase savedPassword); 27 | 28 | PassphraseEntryComponent build(); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/vaultoptions/HubOptionsController.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.vaultoptions; 2 | 3 | import org.cryptomator.common.vaults.Vault; 4 | import org.cryptomator.ui.common.FxController; 5 | import org.cryptomator.ui.convertvault.ConvertVaultComponent; 6 | 7 | import javax.inject.Inject; 8 | import javafx.stage.Stage; 9 | 10 | public class HubOptionsController implements FxController { 11 | 12 | private final Vault vault; 13 | private final Stage window; 14 | private final ConvertVaultComponent.Factory convertVaultFactory; 15 | 16 | 17 | @Inject 18 | public HubOptionsController(@VaultOptionsWindow Vault vault, @VaultOptionsWindow Stage window, ConvertVaultComponent.Factory convertVaultFactory) { 19 | this.vault = vault; 20 | this.window = window; 21 | this.convertVaultFactory = convertVaultFactory; 22 | } 23 | 24 | public void startConversion() { 25 | convertVaultFactory.create(vault,window).showHubToPasswordWindow(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ipc/HandleLaunchArgsMessage.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ipc; 2 | 3 | import com.google.common.base.Joiner; 4 | import com.google.common.base.Splitter; 5 | 6 | import java.nio.ByteBuffer; 7 | import java.nio.charset.StandardCharsets; 8 | import java.util.List; 9 | 10 | record HandleLaunchArgsMessage(List args) implements IpcMessage { 11 | 12 | private static final char DELIMITER = '\n'; 13 | 14 | public static HandleLaunchArgsMessage decode(ByteBuffer encoded) { 15 | var str = StandardCharsets.UTF_8.decode(encoded).toString(); 16 | var args = Splitter.on(DELIMITER).omitEmptyStrings().splitToList(str); 17 | return new HandleLaunchArgsMessage(args); 18 | } 19 | 20 | @Override 21 | public MessageType getMessageType() { 22 | return MessageType.HANDLE_LAUNCH_ARGS; 23 | } 24 | 25 | @Override 26 | public ByteBuffer encodePayload() { 27 | var str = Joiner.on(DELIMITER).join(args); 28 | return StandardCharsets.UTF_8.encode(str); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/resources/fxml/vault_options_hub.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 13 | 14 | 15 | 16 | 17 | 26 | -------------------------------------------------------------------------------- /dist/win/build.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | :: Default values for Cryptomator builds 3 | SET APPNAME="Cryptomator" 4 | SET MAIN_JAR_GLOB="cryptomator-*" 5 | SET UPGRADE_UUID="bda45523-42b1-4cae-9354-a45475ed4775" 6 | SET VENDOR="Skymatic GmbH" 7 | SET FIRST_COPYRIGHT_YEAR=2016 8 | SET ABOUT_URL="https://cryptomator.org" 9 | SET UPDATE_URL="https://cryptomator.org/downloads/" 10 | SET HELP_URL="https://cryptomator.org/contact/" 11 | SET MODULE_AND_MAIN_CLASS="org.cryptomator.desktop/org.cryptomator.launcher.Cryptomator" 12 | SET LOOPBACK_ALIAS="cryptomator-vault" 13 | 14 | pwsh -NoLogo -NoProfile -ExecutionPolicy Unrestricted -Command .\build.ps1^ 15 | -AppName %APPNAME%^ 16 | -MainJarGlob "%MAIN_JAR_GLOB%"^ 17 | -ModuleAndMainClass "%MODULE_AND_MAIN_CLASS%"^ 18 | -UpgradeUUID "%UPGRADE_UUID%"^ 19 | -Vendor ""%VENDOR%""^ 20 | -CopyrightStartYear %FIRST_COPYRIGHT_YEAR%^ 21 | -AboutUrl "%ABOUT_URL%"^ 22 | -HelpUrl "%HELP_URL%"^ 23 | -UpdateUrl "%UPDATE_URL%"^ 24 | -LoopbackAlias "%LOOPBACK_ALIAS%"^ 25 | -Clean 1 -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/locationpresets/OneDriveLinuxLocationPresetsProvider.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.locationpresets; 2 | 3 | import org.cryptomator.integrations.common.CheckAvailability; 4 | import org.cryptomator.integrations.common.OperatingSystem; 5 | 6 | import java.nio.file.Files; 7 | import java.nio.file.Path; 8 | import java.util.stream.Stream; 9 | 10 | import static org.cryptomator.integrations.common.OperatingSystem.Value.LINUX; 11 | 12 | @OperatingSystem(LINUX) 13 | @CheckAvailability 14 | public final class OneDriveLinuxLocationPresetsProvider implements LocationPresetsProvider { 15 | 16 | 17 | private static final Path LOCATION = LocationPresetsProvider.resolveLocation("~/OneDrive"); 18 | 19 | @CheckAvailability 20 | public static boolean isPresent() { 21 | return Files.isDirectory(LOCATION); 22 | } 23 | 24 | @Override 25 | public Stream getLocations() { 26 | return Stream.of(new LocationPreset("OneDrive", LOCATION)); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/lock/LockComponent.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.lock; 2 | 3 | import dagger.BindsInstance; 4 | import dagger.Subcomponent; 5 | import org.cryptomator.common.Nullable; 6 | import org.cryptomator.common.vaults.Vault; 7 | 8 | import javax.inject.Named; 9 | import javafx.stage.Stage; 10 | import java.util.concurrent.ExecutorService; 11 | import java.util.concurrent.Future; 12 | 13 | 14 | @LockScoped 15 | @Subcomponent(modules = {LockModule.class}) 16 | public interface LockComponent { 17 | 18 | ExecutorService defaultExecutorService(); 19 | 20 | LockWorkflow lockWorkflow(); 21 | 22 | default Future startLockWorkflow() { 23 | LockWorkflow workflow = lockWorkflow(); 24 | defaultExecutorService().submit(workflow); 25 | return workflow; 26 | } 27 | 28 | @Subcomponent.Factory 29 | interface Factory { 30 | LockComponent create(@BindsInstance @LockWindow Vault vault, @BindsInstance @Named("lockWindowOwner") @Nullable Stage owner); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/locationpresets/DropboxWindowsLocationPresetsProvider.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.locationpresets; 2 | 3 | import org.cryptomator.integrations.common.CheckAvailability; 4 | import org.cryptomator.integrations.common.OperatingSystem; 5 | 6 | import java.nio.file.Files; 7 | import java.nio.file.Path; 8 | import java.util.stream.Stream; 9 | 10 | import static org.cryptomator.integrations.common.OperatingSystem.Value.WINDOWS; 11 | 12 | @OperatingSystem(WINDOWS) 13 | @CheckAvailability 14 | public final class DropboxWindowsLocationPresetsProvider implements LocationPresetsProvider { 15 | 16 | private static final Path LOCATION = LocationPresetsProvider.resolveLocation("~/Dropbox"); 17 | 18 | 19 | @CheckAvailability 20 | public static boolean isPresent() { 21 | return Files.isDirectory(LOCATION); 22 | } 23 | 24 | @Override 25 | public Stream getLocations() { 26 | return Stream.of(new LocationPreset("Dropbox", LOCATION)); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/locationpresets/ICloudWindowsLocationPresetsProvider.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.locationpresets; 2 | 3 | import org.cryptomator.integrations.common.CheckAvailability; 4 | import org.cryptomator.integrations.common.OperatingSystem; 5 | 6 | import java.nio.file.Files; 7 | import java.nio.file.Path; 8 | import java.util.stream.Stream; 9 | 10 | import static org.cryptomator.integrations.common.OperatingSystem.Value.WINDOWS; 11 | 12 | @OperatingSystem(WINDOWS) 13 | @CheckAvailability 14 | public final class ICloudWindowsLocationPresetsProvider implements LocationPresetsProvider { 15 | 16 | private static final Path LOCATION = LocationPresetsProvider.resolveLocation("~/iCloudDrive"); 17 | 18 | @CheckAvailability 19 | public static boolean isPresent() { 20 | return Files.isDirectory(LOCATION); 21 | } 22 | 23 | @Override 24 | public Stream getLocations() { 25 | return Stream.of(new LocationPreset("iCloud Drive", LOCATION)); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/mount/IllegalMountPointException.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.mount; 2 | 3 | import java.nio.file.Path; 4 | 5 | /** 6 | * Indicates that validation or preparation of a mountpoint failed due to a configuration error or an invalid system state.
7 | * Instances of this exception are usually caught and displayed to the user in an appropriate fashion, e.g. by {@link org.cryptomator.ui.unlock.UnlockInvalidMountPointController UnlockInvalidMountPointController.} 8 | */ 9 | public class IllegalMountPointException extends IllegalArgumentException { 10 | 11 | private final Path mountpoint; 12 | 13 | public IllegalMountPointException(Path mountpoint) { 14 | this(mountpoint, "The provided mountpoint has a problem: " + mountpoint.toString()); 15 | } 16 | 17 | public IllegalMountPointException(Path mountpoint, String msg) { 18 | super(msg); 19 | this.mountpoint = mountpoint; 20 | } 21 | 22 | public Path getMountpoint() { 23 | return mountpoint; 24 | } 25 | } -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/migration/MigrationComponent.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.migration; 2 | 3 | import dagger.BindsInstance; 4 | import dagger.Lazy; 5 | import dagger.Subcomponent; 6 | import org.cryptomator.common.vaults.Vault; 7 | import org.cryptomator.ui.common.FxmlFile; 8 | import org.cryptomator.ui.common.FxmlScene; 9 | 10 | import javafx.scene.Scene; 11 | import javafx.stage.Stage; 12 | 13 | @MigrationScoped 14 | @Subcomponent(modules = {MigrationModule.class}) 15 | public interface MigrationComponent { 16 | 17 | @MigrationWindow 18 | Stage window(); 19 | 20 | @FxmlScene(FxmlFile.MIGRATION_START) 21 | Lazy scene(); 22 | 23 | default Stage showMigrationWindow() { 24 | Stage stage = window(); 25 | stage.setScene(scene().get()); 26 | stage.show(); 27 | return stage; 28 | } 29 | 30 | @Subcomponent.Builder 31 | interface Builder { 32 | 33 | @BindsInstance 34 | Builder vault(@MigrationWindow Vault vault); 35 | 36 | MigrationComponent build(); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/main/resources/fxml/health_check_listcell.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 27 | -------------------------------------------------------------------------------- /.github/workflows/no-response.yml: -------------------------------------------------------------------------------- 1 | # Configuration for close-stale-issues - https://github.com/marketplace/actions/close-stale-issues 2 | 3 | name: 'Close awaiting response issues' 4 | on: 5 | schedule: 6 | - cron: '00 09 * * *' 7 | 8 | jobs: 9 | no-response: 10 | runs-on: ubuntu-latest 11 | permissions: 12 | issues: write 13 | pull-requests: write 14 | steps: 15 | - uses: actions/stale@v9 16 | with: 17 | days-before-stale: 14 18 | days-before-close: 0 19 | days-before-pr-close: -1 20 | stale-issue-label: 'state:stale' 21 | close-issue-message: "This issue has been automatically closed because there has been no response to our request for more information from the original author. With only the information that is currently in the issue, we don't have enough information to take action. Please reach out if you have or find the answers we need so that we can investigate further." 22 | only-labels: 'state:awaiting-response' 23 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/common/locationpresets/ICloudMacLocationPresetsProvider.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.common.locationpresets; 2 | 3 | import org.cryptomator.integrations.common.CheckAvailability; 4 | import org.cryptomator.integrations.common.OperatingSystem; 5 | 6 | import java.nio.file.Files; 7 | import java.nio.file.Path; 8 | import java.util.stream.Stream; 9 | 10 | import static org.cryptomator.integrations.common.OperatingSystem.Value.MAC; 11 | 12 | @OperatingSystem(MAC) 13 | @CheckAvailability 14 | public final class ICloudMacLocationPresetsProvider implements LocationPresetsProvider { 15 | 16 | private static final Path LOCATION = LocationPresetsProvider.resolveLocation("~/Library/Mobile Documents/com~apple~CloudDocs"); 17 | 18 | @CheckAvailability 19 | public static boolean isPresent() { 20 | return Files.isDirectory(LOCATION); 21 | } 22 | 23 | @Override 24 | public Stream getLocations() { 25 | return Stream.of(new LocationPreset("iCloud Drive", LOCATION)); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/common/StageInitializer.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.common; 2 | 3 | import org.apache.commons.lang3.SystemUtils; 4 | import org.cryptomator.ui.fxapp.FxApplicationScoped; 5 | 6 | import javax.inject.Inject; 7 | import javafx.scene.image.Image; 8 | import javafx.stage.Stage; 9 | import java.util.List; 10 | import java.util.function.Consumer; 11 | 12 | /** 13 | * Performs common setup for all stages 14 | */ 15 | @FxApplicationScoped 16 | public class StageInitializer implements Consumer { 17 | 18 | private final List windowIcons; 19 | 20 | @Inject 21 | public StageInitializer() { 22 | this.windowIcons = SystemUtils.IS_OS_MAC ? List.of() : List.of( // 23 | new Image(StageInitializer.class.getResource("/img/window_icon_32.png").toString()), // 24 | new Image(StageInitializer.class.getResource("/img/window_icon_512.png").toString()) // 25 | ); 26 | } 27 | 28 | @Override 29 | public void accept(Stage stage) { 30 | stage.getIcons().setAll(windowIcons); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /dist/linux/appimage/resources/AppDir/bin/cryptomator.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | cd $(dirname $0) 3 | 4 | # determine GTK version 5 | GTK2_PRESENT=1 # initially false 6 | GTK3_PRESENT=0 # initially true 7 | if command -v dpkg &> /dev/null; then # do stuff for debian based things 8 | GTK2_PRESENT=`dpkg -l libgtk* | grep -e '\^ii' | grep -e 'libgtk2-*' &> /dev/null; echo $?` 9 | GTK3_PRESENT=`dpkg -l libgtk* | grep -e '\^ii' | grep -e 'libgtk-3-*' &> /dev/null; echo $?` 10 | elif command -v rpm &> /dev/null; then # do stuff for rpm based things (including yum/dnf) 11 | GTK2_PRESENT=`rpm -qa | grep -e '\^gtk2-[0-9][0-9]*' &> /dev/null; echo $?` 12 | GTK3_PRESENT=`rpm -qa | grep -e '\^gtk3-[0-9][0-9]*' &> /dev/null; echo $?` 13 | elif command -v pacman &> /dev/null; then # don't forget arch 14 | GTK2_PRESENT=`pacman -Qi gtk2 &> /dev/null; echo $?` 15 | GTK3_PRESENT=`pacman -Qi gtk3 &> /dev/null; echo $?` 16 | fi 17 | 18 | if [ "$GTK2_PRESENT" -eq 0 ] && [ "$GTK3_PRESENT" -ne 0 ]; then 19 | bin/Cryptomator-gtk2 $@ 20 | else 21 | bin/Cryptomator $@ 22 | fi -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/keyloading/masterkeyfile/PassphraseEntryModule.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.keyloading.masterkeyfile; 2 | 3 | import dagger.Module; 4 | import dagger.Provides; 5 | import org.cryptomator.ui.common.DefaultSceneFactory; 6 | import org.cryptomator.ui.common.FxmlFile; 7 | import org.cryptomator.ui.common.FxmlLoaderFactory; 8 | 9 | import javafx.scene.Scene; 10 | import java.util.ResourceBundle; 11 | import java.util.concurrent.CompletableFuture; 12 | 13 | @Module 14 | interface PassphraseEntryModule { 15 | 16 | @Provides 17 | @PassphraseEntryScoped 18 | static CompletableFuture provideResult() { 19 | return new CompletableFuture<>(); 20 | } 21 | 22 | @Provides 23 | @PassphraseEntryScoped 24 | static Scene provideUnlockScene(PassphraseEntryController controller, DefaultSceneFactory sceneFactory, ResourceBundle resourceBundle) { 25 | return FxmlLoaderFactory.forController(controller, sceneFactory, resourceBundle).createScene(FxmlFile.UNLOCK_ENTER_PASSWORD); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/resources/fxml/vault_detail_welcome.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /dist/linux/debian/control: -------------------------------------------------------------------------------- 1 | Source: cryptomator 2 | Maintainer: Cryptobot 3 | Section: utils 4 | Priority: optional 5 | Build-Depends: debhelper (>=10), coffeelibs-jdk-23 (>= 23.0.1+11-0ppa1), libgtk-3-0, libxxf86vm1, libgl1 6 | Standards-Version: 4.5.0 7 | Homepage: https://cryptomator.org 8 | Vcs-Git: https://github.com/cryptomator/cryptomator.git 9 | Vcs-browser: https://github.com/cryptomator/cryptomator 10 | 11 | Package: cryptomator 12 | Architecture: any 13 | Section: utils 14 | Priority: optional 15 | Depends: ${shlibs:Depends}, ${misc:Depends}, fuse3 16 | Recommends: gvfs-backends, gvfs-fuse, gnome-keyring 17 | XB-AppName: Cryptomator 18 | XB-Category: Utility;Security;FileTools; 19 | Homepage: https://cryptomator.org 20 | Description: Multi-platform client-side encryption of your cloud files. 21 | Cryptomator provides free client-side AES encryption for your cloud files. 22 | Create encrypted vaults, which get mounted as virtual volumes. Whatever 23 | you save on one of these volumes will end up encrypted inside your vault. 24 | -------------------------------------------------------------------------------- /src/test/java/org/cryptomator/ipc/RevealRunningAppMessageTest.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ipc; 2 | 3 | import org.junit.jupiter.api.Assertions; 4 | import org.junit.jupiter.api.Test; 5 | import org.junit.jupiter.api.io.TempDir; 6 | 7 | import java.io.IOException; 8 | import java.nio.channels.FileChannel; 9 | import java.nio.file.Path; 10 | import java.nio.file.StandardOpenOption; 11 | import java.util.List; 12 | 13 | public class RevealRunningAppMessageTest { 14 | 15 | @Test 16 | public void testSendAndReceive(@TempDir Path tmpDir) throws IOException { 17 | var message = new RevealRunningAppMessage(); 18 | 19 | var file = tmpDir.resolve("tmp.file"); 20 | try (var ch = FileChannel.open(file, StandardOpenOption.CREATE_NEW, StandardOpenOption.READ, StandardOpenOption.WRITE)) { 21 | message.send(ch); 22 | ch.position(0); 23 | if (IpcMessage.receive(ch) instanceof RevealRunningAppMessage received) { 24 | Assertions.assertNotNull(received); 25 | } else { 26 | Assertions.fail("Received message of unexpected class"); 27 | } 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/java/org/cryptomator/ui/mainwindow/VaultDetailNeedsMigrationController.java: -------------------------------------------------------------------------------- 1 | package org.cryptomator.ui.mainwindow; 2 | 3 | import org.cryptomator.common.vaults.Vault; 4 | import org.cryptomator.ui.common.FxController; 5 | import org.cryptomator.ui.migration.MigrationComponent; 6 | 7 | import javax.inject.Inject; 8 | import javafx.beans.property.ObjectProperty; 9 | import javafx.beans.property.ReadOnlyObjectProperty; 10 | import javafx.fxml.FXML; 11 | 12 | @MainWindowScoped 13 | public class VaultDetailNeedsMigrationController implements FxController { 14 | 15 | private final ReadOnlyObjectProperty vault; 16 | private final MigrationComponent.Builder vaultMigrationWindow; 17 | 18 | @Inject 19 | public VaultDetailNeedsMigrationController(ObjectProperty vault, MigrationComponent.Builder vaultMigrationWindow) { 20 | this.vault = vault; 21 | this.vaultMigrationWindow = vaultMigrationWindow; 22 | } 23 | 24 | @FXML 25 | public void showVaultMigrator() { 26 | vaultMigrationWindow.vault(vault.get()).build().showMigrationWindow(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/resources/fxml/addvault_new_recoverykey.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |