From bfde26be794d6b7d0cdc4d8b47c56f5156a92777 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Mon, 2 Nov 2020 13:09:30 +0100 Subject: [PATCH] Added new keychain module and refactored UI parts --- .../org/cryptomator/common/CommonsModule.java | 3 +- .../org/cryptomator/common/JniModule.java | 1 + .../common/keychain/KeychainModule.java | 41 +++++ .../common/settings/KeychainBackend.java | 40 ++--- .../cryptomator/common/settings/Settings.java | 6 +- .../GeneralPreferencesController.java | 35 ++-- .../main/resources/i18n/strings.properties | 8 +- .../main/resources/license/THIRD-PARTY.txt | 152 +++++++++--------- 8 files changed, 150 insertions(+), 136 deletions(-) create mode 100644 main/commons/src/main/java/org/cryptomator/common/keychain/KeychainModule.java diff --git a/main/commons/src/main/java/org/cryptomator/common/CommonsModule.java b/main/commons/src/main/java/org/cryptomator/common/CommonsModule.java index 5ace6a3e2..ed278e1ab 100644 --- a/main/commons/src/main/java/org/cryptomator/common/CommonsModule.java +++ b/main/commons/src/main/java/org/cryptomator/common/CommonsModule.java @@ -9,6 +9,7 @@ import com.tobiasdiez.easybind.EasyBind; import dagger.Module; import dagger.Provides; import org.apache.commons.lang3.SystemUtils; +import org.cryptomator.common.keychain.KeychainModule; import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.SettingsProvider; import org.cryptomator.common.vaults.Vault; @@ -33,7 +34,7 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -@Module(subcomponents = {VaultComponent.class}) +@Module(subcomponents = {VaultComponent.class}, includes = {KeychainModule.class}) public abstract class CommonsModule { private static final Logger LOG = LoggerFactory.getLogger(CommonsModule.class); diff --git a/main/commons/src/main/java/org/cryptomator/common/JniModule.java b/main/commons/src/main/java/org/cryptomator/common/JniModule.java index 180736710..aaeda2964 100644 --- a/main/commons/src/main/java/org/cryptomator/common/JniModule.java +++ b/main/commons/src/main/java/org/cryptomator/common/JniModule.java @@ -15,6 +15,7 @@ import javax.inject.Singleton; import java.util.Optional; @Module +@Deprecated public class JniModule { @Provides diff --git a/main/commons/src/main/java/org/cryptomator/common/keychain/KeychainModule.java b/main/commons/src/main/java/org/cryptomator/common/keychain/KeychainModule.java new file mode 100644 index 000000000..895781c8f --- /dev/null +++ b/main/commons/src/main/java/org/cryptomator/common/keychain/KeychainModule.java @@ -0,0 +1,41 @@ +package org.cryptomator.common.keychain; + +import dagger.Module; +import dagger.Provides; +import org.cryptomator.common.settings.Settings; +import org.cryptomator.integrations.keychain.KeychainAccessProvider; + +import javax.inject.Singleton; +import javafx.beans.binding.Bindings; +import javafx.beans.binding.ObjectBinding; +import java.util.ServiceLoader; +import java.util.Set; +import java.util.stream.Collectors; + +@Module +public class KeychainModule { + + @Provides + @Singleton + static Set> provideAvailableKeychainAccessProviderFactories() { + return ServiceLoader.load(KeychainAccessProvider.class).stream().collect(Collectors.toUnmodifiableSet()); + } + + @Provides + @Singleton + static Set provideSupportedKeychainAccessProviders(Set> availableFactories) { + return availableFactories.stream().map(ServiceLoader.Provider::get).collect(Collectors.toUnmodifiableSet()); + } + + @Provides + @Singleton + static ObjectBinding provideKeychainAccessProvider(Settings settings, Set providers) { + return Bindings.createObjectBinding(() -> { + var selectedProviderClass = settings.keychainBackend().get().getProviderClass(); + var selectedProvider = providers.stream().filter(provider -> provider.getClass().getName().equals(selectedProviderClass)).findAny(); + var fallbackProvider = providers.stream().findAny().orElse(null); + return selectedProvider.orElse(fallbackProvider); + }, settings.keychainBackend()); + } + +} diff --git a/main/commons/src/main/java/org/cryptomator/common/settings/KeychainBackend.java b/main/commons/src/main/java/org/cryptomator/common/settings/KeychainBackend.java index a54c81b08..65f869a12 100644 --- a/main/commons/src/main/java/org/cryptomator/common/settings/KeychainBackend.java +++ b/main/commons/src/main/java/org/cryptomator/common/settings/KeychainBackend.java @@ -1,39 +1,19 @@ package org.cryptomator.common.settings; -import org.apache.commons.lang3.SystemUtils; - -import java.util.Arrays; - public enum KeychainBackend { - GNOME("preferences.general.keychainBackend.gnome", SystemUtils.IS_OS_LINUX), // - KDE("preferences.general.keychainBackend.kde", SystemUtils.IS_OS_LINUX), // - MAC_SYSTEM_KEYCHAIN("preferences.general.keychainBackend.macSystemKeychain", SystemUtils.IS_OS_MAC), // - WIN_SYSTEM_KEYCHAIN("preferences.general.keychainBackend.winSystemKeychain", SystemUtils.IS_OS_WINDOWS); + GNOME("org.cryptomator.linux.keychain.SecretServiceKeychainAccess"), + KDE("org.cryptomator.linux.keychain.KDEWalletKeychainAccess"), + MAC_SYSTEM_KEYCHAIN("org.cryptomator.macos.keychain.MacSystemKeychainAccess"), + WIN_SYSTEM_KEYCHAIN("org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess"); - public static KeychainBackend[] supportedBackends() { - return Arrays.stream(values()).filter(KeychainBackend::isSupported).toArray(KeychainBackend[]::new); + private final String providerClass; + + KeychainBackend(String providerClass) { + this.providerClass = providerClass; } - public static KeychainBackend defaultBackend() { - if (SystemUtils.IS_OS_LINUX) { - return KeychainBackend.GNOME; - } else { // SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_WINDOWS - return Arrays.stream(KeychainBackend.supportedBackends()).findFirst().orElseThrow(IllegalStateException::new); - } + public String getProviderClass() { + return providerClass; } - private final String configName; - private final boolean isSupported; - - KeychainBackend(String configName, boolean isSupported) { - this.configName = configName; - this.isSupported = isSupported; - } - - public String getDisplayName() { - return configName; - } - - public boolean isSupported() { return isSupported; } - } diff --git a/main/commons/src/main/java/org/cryptomator/common/settings/Settings.java b/main/commons/src/main/java/org/cryptomator/common/settings/Settings.java index 22b42628d..e50391d2d 100644 --- a/main/commons/src/main/java/org/cryptomator/common/settings/Settings.java +++ b/main/commons/src/main/java/org/cryptomator/common/settings/Settings.java @@ -8,6 +8,8 @@ ******************************************************************************/ package org.cryptomator.common.settings; +import org.apache.commons.lang3.SystemUtils; + import javafx.beans.Observable; import javafx.beans.property.BooleanProperty; import javafx.beans.property.IntegerProperty; @@ -33,9 +35,9 @@ public class Settings { public static final int DEFAULT_NUM_TRAY_NOTIFICATIONS = 3; public static final WebDavUrlScheme DEFAULT_GVFS_SCHEME = WebDavUrlScheme.DAV; public static final boolean DEFAULT_DEBUG_MODE = false; - public static final VolumeImpl DEFAULT_PREFERRED_VOLUME_IMPL = System.getProperty("os.name").toLowerCase().contains("windows") ? VolumeImpl.DOKANY : VolumeImpl.FUSE; + public static final VolumeImpl DEFAULT_PREFERRED_VOLUME_IMPL = SystemUtils.IS_OS_WINDOWS ? VolumeImpl.DOKANY : VolumeImpl.FUSE; public static final UiTheme DEFAULT_THEME = UiTheme.LIGHT; - public static final KeychainBackend DEFAULT_KEYCHAIN_BACKEND = KeychainBackend.defaultBackend(); + public static final KeychainBackend DEFAULT_KEYCHAIN_BACKEND = SystemUtils.IS_OS_WINDOWS ? KeychainBackend.WIN_SYSTEM_KEYCHAIN : SystemUtils.IS_OS_MAC ? KeychainBackend.MAC_SYSTEM_KEYCHAIN : KeychainBackend.GNOME; public static final NodeOrientation DEFAULT_USER_INTERFACE_ORIENTATION = NodeOrientation.LEFT_TO_RIGHT; private static final String DEFAULT_LICENSE_KEY = ""; diff --git a/main/ui/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java b/main/ui/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java index 4e4abfbc9..0d58323ce 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java @@ -6,6 +6,7 @@ import org.cryptomator.common.LicenseHolder; import org.cryptomator.common.settings.KeychainBackend; import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.UiTheme; +import org.cryptomator.integrations.keychain.KeychainAccessProvider; import org.cryptomator.keychain.KeychainAccessStrategy; import org.cryptomator.keychain.LinuxSystemKeychainAccess; import org.cryptomator.ui.common.FxController; @@ -32,7 +33,9 @@ import java.util.Arrays; import java.util.EnumSet; import java.util.Optional; import java.util.ResourceBundle; +import java.util.Set; import java.util.concurrent.ExecutorService; +import java.util.stream.Collectors; @PreferencesScoped public class GeneralPreferencesController implements FxController { @@ -48,7 +51,7 @@ public class GeneralPreferencesController implements FxController { private final ResourceBundle resourceBundle; private final Application application; private final Environment environment; - private Optional keychain; + private final Set keychainAccessProviders; public ChoiceBox themeChoiceBox; public ChoiceBox keychainBackendChoiceBox; public CheckBox startHiddenCheckbox; @@ -59,11 +62,11 @@ public class GeneralPreferencesController implements FxController { public RadioButton nodeOrientationRtl; @Inject - GeneralPreferencesController(Settings settings, @Named("trayMenuSupported") boolean trayMenuSupported, Optional autoStartStrategy, Optional keychain, ObjectProperty selectedTabProperty, LicenseHolder licenseHolder, ExecutorService executor, ResourceBundle resourceBundle, Application application, Environment environment) { + GeneralPreferencesController(Settings settings, @Named("trayMenuSupported") boolean trayMenuSupported, Optional autoStartStrategy, Set keychainAccessProviders, ObjectProperty selectedTabProperty, LicenseHolder licenseHolder, ExecutorService executor, ResourceBundle resourceBundle, Application application, Environment environment) { this.settings = settings; this.trayMenuSupported = trayMenuSupported; this.autoStartStrategy = autoStartStrategy; - this.keychain = keychain; + this.keychainAccessProviders = keychainAccessProviders; this.selectedTabProperty = selectedTabProperty; this.licenseHolder = licenseHolder; this.executor = executor; @@ -96,16 +99,15 @@ public class GeneralPreferencesController implements FxController { nodeOrientation.selectedToggleProperty().addListener(this::toggleNodeOrientation); keychainBackendChoiceBox.getItems().addAll(getAvailableBackends()); - if (keychain.isPresent() && SystemUtils.IS_OS_LINUX) { - keychainBackendChoiceBox.setValue(LinuxSystemKeychainAccess.getBackendActivated()); - } - if (keychain.isPresent() && (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_WINDOWS)) { - keychainBackendChoiceBox.setValue(Arrays.stream(KeychainBackend.supportedBackends()).findFirst().orElseThrow(IllegalStateException::new)); - } keychainBackendChoiceBox.setConverter(new KeychainBackendConverter(resourceBundle)); keychainBackendChoiceBox.valueProperty().bindBidirectional(settings.keychainBackend()); } + private KeychainBackend[] getAvailableBackends() { + var namesOfAvailableProviders = keychainAccessProviders.stream().map(KeychainAccessProvider::getClass).map(Class::getName).collect(Collectors.toUnmodifiableSet()); + return Arrays.stream(KeychainBackend.values()).filter(value -> namesOfAvailableProviders.contains(value.getProviderClass())).toArray(KeychainBackend[]::new); + } + public boolean isTrayMenuSupported() { return this.trayMenuSupported; } @@ -183,7 +185,7 @@ public class GeneralPreferencesController implements FxController { @Override public String toString(KeychainBackend impl) { - return resourceBundle.getString(impl.getDisplayName()); + return resourceBundle.getString("preferences.general.keychainBackend." + impl.getProviderClass()); } @Override @@ -215,17 +217,4 @@ public class GeneralPreferencesController implements FxController { } } - private KeychainBackend[] getAvailableBackends() { - if (!keychain.isPresent()) { - return new KeychainBackend[]{}; - } - if (SystemUtils.IS_OS_LINUX) { - EnumSet backends = LinuxSystemKeychainAccess.getAvailableKeychainBackends(); - return backends.toArray(KeychainBackend[]::new); - } - if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_WINDOWS) { - return KeychainBackend.supportedBackends(); - } - return new KeychainBackend[]{}; - } } diff --git a/main/ui/src/main/resources/i18n/strings.properties b/main/ui/src/main/resources/i18n/strings.properties index 3805399aa..e391d263a 100644 --- a/main/ui/src/main/resources/i18n/strings.properties +++ b/main/ui/src/main/resources/i18n/strings.properties @@ -144,10 +144,10 @@ preferences.general.debugLogging=Enable debug logging preferences.general.debugDirectory=Reveal log files preferences.general.autoStart=Launch Cryptomator on system start preferences.general.keychainBackend=Store passwords with -preferences.general.keychainBackend.gnome=Gnome Keyring -preferences.general.keychainBackend.kde=KDE KWallet -preferences.general.keychainBackend.macSystemKeychain=macOS Keychain Access -preferences.general.keychainBackend.winSystemKeychain=Windows Data Protection Keychain +preferences.general.keychainBackend.org.cryptomator.linux.keychain.SecretServiceKeychainAccess=Gnome Keyring +preferences.general.keychainBackend.org.cryptomator.linux.keychain.KDEWalletKeychainAccess=KDE KWallet +preferences.general.keychainBackend.org.cryptomator.macos.keychain.MacSystemKeychainAccess=macOS Keychain Access +preferences.general.keychainBackend.org.cryptomator.windows.keychain.WindowsProtectedKeychainAccess=Windows Data Protection Keychain preferences.general.interfaceOrientation=Interface Orientation preferences.general.interfaceOrientation.ltr=Left to Right preferences.general.interfaceOrientation.rtl=Right to Left diff --git a/main/ui/src/main/resources/license/THIRD-PARTY.txt b/main/ui/src/main/resources/license/THIRD-PARTY.txt index 3674e5e05..65d2cdb2c 100644 --- a/main/ui/src/main/resources/license/THIRD-PARTY.txt +++ b/main/ui/src/main/resources/license/THIRD-PARTY.txt @@ -12,81 +12,81 @@ You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. Cryptomator uses 53 third-party dependencies under the following licenses: - Apache License v2.0: - - HKDF-RFC5869 (at.favre.lib:hkdf:1.1.0 - https://github.com/patrickfav/hkdf) - - jffi (com.github.jnr:jffi:1.2.23 - http://github.com/jnr/jffi) - - jnr-a64asm (com.github.jnr:jnr-a64asm:1.0.0 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-a64asm) - - jnr-constants (com.github.jnr:jnr-constants:0.9.15 - http://github.com/jnr/jnr-constants) - - jnr-enxio (com.github.jnr:jnr-enxio:0.28 - http://github.com/jnr/jnr-enxio) - - jnr-ffi (com.github.jnr:jnr-ffi:2.1.12 - http://github.com/jnr/jnr-ffi) - - jnr-unixsocket (com.github.jnr:jnr-unixsocket:0.33 - http://github.com/jnr/jnr-unixsocket) - - FindBugs-jsr305 (com.google.code.findbugs:jsr305:3.0.2 - http://findbugs.sourceforge.net/) - - Gson (com.google.code.gson:gson:2.8.6 - https://github.com/google/gson/gson) - - Dagger (com.google.dagger:dagger:2.22 - https://github.com/google/dagger) - - error-prone annotations (com.google.errorprone:error_prone_annotations:2.3.4 - http://nexus.sonatype.org/oss-repository-hosting.html/error_prone_parent/error_prone_annotations) - - Guava InternalFutureFailureAccess and InternalFutures (com.google.guava:failureaccess:1.0.1 - https://github.com/google/guava/failureaccess) - - Guava: Google Core Libraries for Java (com.google.guava:guava:29.0-jre - https://github.com/google/guava/guava) - - Guava ListenableFuture only (com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava - https://github.com/google/guava/listenablefuture) - - J2ObjC Annotations (com.google.j2objc:j2objc-annotations:1.3 - https://github.com/google/j2objc/) - - Apache Commons CLI (commons-cli:commons-cli:1.4 - http://commons.apache.org/proper/commons-cli/) - - Apache Commons IO (commons-io:commons-io:2.6 - http://commons.apache.org/proper/commons-io/) - - javax.inject (javax.inject:javax.inject:1 - http://code.google.com/p/atinject/) - - Java Native Access (net.java.dev.jna:jna:5.1.0 - https://github.com/java-native-access/jna) - - Java Native Access Platform (net.java.dev.jna:jna-platform:5.1.0 - https://github.com/java-native-access/jna) - - Apache Commons Lang (org.apache.commons:commons-lang3:3.11 - https://commons.apache.org/proper/commons-lang/) - - Apache HttpCore (org.apache.httpcomponents:httpcore:4.4.13 - http://hc.apache.org/httpcomponents-core-ga) - - Jackrabbit WebDAV Library (org.apache.jackrabbit:jackrabbit-webdav:2.21.3 - http://jackrabbit.apache.org/jackrabbit-webdav/) - - Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.31.v20200723 - http://www.eclipse.org/jetty) - - Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.31.v20200723 - http://www.eclipse.org/jetty) - - Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.31.v20200723 - http://www.eclipse.org/jetty) - - Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.31.v20200723 - http://www.eclipse.org/jetty) - - Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.31.v20200723 - http://www.eclipse.org/jetty) - - Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.31.v20200723 - http://www.eclipse.org/jetty) - - Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.31.v20200723 - http://www.eclipse.org/jetty) - - Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.31.v20200723 - http://www.eclipse.org/jetty) - BSD: - - asm (org.ow2.asm:asm:7.1 - http://asm.ow2.org/) - - asm-analysis (org.ow2.asm:asm-analysis:7.1 - http://asm.ow2.org/) - - asm-commons (org.ow2.asm:asm-commons:7.1 - http://asm.ow2.org/) - - asm-tree (org.ow2.asm:asm-tree:7.1 - http://asm.ow2.org/) - - asm-util (org.ow2.asm:asm-util:7.1 - http://asm.ow2.org/) - Eclipse Public License - Version 1.0: - - Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.31.v20200723 - http://www.eclipse.org/jetty) - - Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.31.v20200723 - http://www.eclipse.org/jetty) - - Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.31.v20200723 - http://www.eclipse.org/jetty) - - Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.31.v20200723 - http://www.eclipse.org/jetty) - - Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.31.v20200723 - http://www.eclipse.org/jetty) - - Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.31.v20200723 - http://www.eclipse.org/jetty) - - Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.31.v20200723 - http://www.eclipse.org/jetty) - - Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.31.v20200723 - http://www.eclipse.org/jetty) - Eclipse Public License - v 2.0: - - jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix) - GPLv2: - - jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix) - GPLv2+CE: - - Java Servlet API (javax.servlet:javax.servlet-api:3.1.0 - http://servlet-spec.java.net) - - javafx-base (org.openjfx:javafx-base:14 - https://openjdk.java.net/projects/openjfx/javafx-base/) - - javafx-controls (org.openjfx:javafx-controls:14 - https://openjdk.java.net/projects/openjfx/javafx-controls/) - - javafx-fxml (org.openjfx:javafx-fxml:14 - https://openjdk.java.net/projects/openjfx/javafx-fxml/) - - javafx-graphics (org.openjfx:javafx-graphics:14 - https://openjdk.java.net/projects/openjfx/javafx-graphics/) - LGPL 2.1: - - dbus-java (com.github.hypfvieh:dbus-java:3.2.3 - https://github.com/hypfvieh/dbus-java/dbus-java) - - jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix) - - Java Native Access (net.java.dev.jna:jna:5.1.0 - https://github.com/java-native-access/jna) - - Java Native Access Platform (net.java.dev.jna:jna-platform:5.1.0 - https://github.com/java-native-access/jna) - MIT License: - - java jwt (com.auth0:java-jwt:3.10.3 - https://github.com/auth0/java-jwt) - - java-utils (com.github.hypfvieh:java-utils:1.0.6 - https://github.com/hypfvieh/java-utils) - - jnr-x86asm (com.github.jnr:jnr-x86asm:1.0.2 - http://github.com/jnr/jnr-x86asm) - - jnr-fuse (com.github.serceman:jnr-fuse:0.5.4 - no url defined) - - zxcvbn4j (com.nulab-inc:zxcvbn:1.3.0 - https://github.com/nulab/zxcvbn4j) - - secret-service (de.swiesend:secret-service:1.1.0 - https://github.com/swiesend/secret-service) - - Checker Qual (org.checkerframework:checker-qual:2.11.1 - https://checkerframework.org) - - kdewallet (org.purejava:kdewallet:1.1.1 - https://github.com/purejava/kdewallet) - - SLF4J API Module (org.slf4j:slf4j-api:1.7.30 - http://www.slf4j.org) - The BSD 2-Clause License: - - EasyBind (com.tobiasdiez:easybind:2.1.0 - https://github.com/tobiasdiez/EasyBind) + Apache License v2.0: + - HKDF-RFC5869 (at.favre.lib:hkdf:1.1.0 - https://github.com/patrickfav/hkdf) + - jffi (com.github.jnr:jffi:1.2.23 - http://github.com/jnr/jffi) + - jnr-a64asm (com.github.jnr:jnr-a64asm:1.0.0 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-a64asm) + - jnr-constants (com.github.jnr:jnr-constants:0.9.15 - http://github.com/jnr/jnr-constants) + - jnr-enxio (com.github.jnr:jnr-enxio:0.28 - http://github.com/jnr/jnr-enxio) + - jnr-ffi (com.github.jnr:jnr-ffi:2.1.12 - http://github.com/jnr/jnr-ffi) + - jnr-unixsocket (com.github.jnr:jnr-unixsocket:0.33 - http://github.com/jnr/jnr-unixsocket) + - FindBugs-jsr305 (com.google.code.findbugs:jsr305:3.0.2 - http://findbugs.sourceforge.net/) + - Gson (com.google.code.gson:gson:2.8.6 - https://github.com/google/gson/gson) + - Dagger (com.google.dagger:dagger:2.22 - https://github.com/google/dagger) + - error-prone annotations (com.google.errorprone:error_prone_annotations:2.3.4 - http://nexus.sonatype.org/oss-repository-hosting.html/error_prone_parent/error_prone_annotations) + - Guava InternalFutureFailureAccess and InternalFutures (com.google.guava:failureaccess:1.0.1 - https://github.com/google/guava/failureaccess) + - Guava: Google Core Libraries for Java (com.google.guava:guava:30.0-jre - https://github.com/google/guava/guava) + - Guava ListenableFuture only (com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava - https://github.com/google/guava/listenablefuture) + - J2ObjC Annotations (com.google.j2objc:j2objc-annotations:1.3 - https://github.com/google/j2objc/) + - Apache Commons CLI (commons-cli:commons-cli:1.4 - http://commons.apache.org/proper/commons-cli/) + - Apache Commons IO (commons-io:commons-io:2.6 - http://commons.apache.org/proper/commons-io/) + - javax.inject (javax.inject:javax.inject:1 - http://code.google.com/p/atinject/) + - Java Native Access (net.java.dev.jna:jna:5.1.0 - https://github.com/java-native-access/jna) + - Java Native Access Platform (net.java.dev.jna:jna-platform:5.1.0 - https://github.com/java-native-access/jna) + - Apache Commons Lang (org.apache.commons:commons-lang3:3.11 - https://commons.apache.org/proper/commons-lang/) + - Apache HttpCore (org.apache.httpcomponents:httpcore:4.4.13 - http://hc.apache.org/httpcomponents-core-ga) + - Jackrabbit WebDAV Library (org.apache.jackrabbit:jackrabbit-webdav:2.21.3 - http://jackrabbit.apache.org/jackrabbit-webdav/) + - Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.31.v20200723 - http://www.eclipse.org/jetty) + - Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.31.v20200723 - http://www.eclipse.org/jetty) + - Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.31.v20200723 - http://www.eclipse.org/jetty) + - Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.31.v20200723 - http://www.eclipse.org/jetty) + - Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.31.v20200723 - http://www.eclipse.org/jetty) + - Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.31.v20200723 - http://www.eclipse.org/jetty) + - Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.31.v20200723 - http://www.eclipse.org/jetty) + - Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.31.v20200723 - http://www.eclipse.org/jetty) + BSD: + - asm (org.ow2.asm:asm:7.1 - http://asm.ow2.org/) + - asm-analysis (org.ow2.asm:asm-analysis:7.1 - http://asm.ow2.org/) + - asm-commons (org.ow2.asm:asm-commons:7.1 - http://asm.ow2.org/) + - asm-tree (org.ow2.asm:asm-tree:7.1 - http://asm.ow2.org/) + - asm-util (org.ow2.asm:asm-util:7.1 - http://asm.ow2.org/) + Eclipse Public License - Version 1.0: + - Jetty :: Http Utility (org.eclipse.jetty:jetty-http:9.4.31.v20200723 - http://www.eclipse.org/jetty) + - Jetty :: IO Utility (org.eclipse.jetty:jetty-io:9.4.31.v20200723 - http://www.eclipse.org/jetty) + - Jetty :: Security (org.eclipse.jetty:jetty-security:9.4.31.v20200723 - http://www.eclipse.org/jetty) + - Jetty :: Server Core (org.eclipse.jetty:jetty-server:9.4.31.v20200723 - http://www.eclipse.org/jetty) + - Jetty :: Servlet Handling (org.eclipse.jetty:jetty-servlet:9.4.31.v20200723 - http://www.eclipse.org/jetty) + - Jetty :: Utilities (org.eclipse.jetty:jetty-util:9.4.31.v20200723 - http://www.eclipse.org/jetty) + - Jetty :: Webapp Application Support (org.eclipse.jetty:jetty-webapp:9.4.31.v20200723 - http://www.eclipse.org/jetty) + - Jetty :: XML utilities (org.eclipse.jetty:jetty-xml:9.4.31.v20200723 - http://www.eclipse.org/jetty) + Eclipse Public License - v 2.0: + - jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix) + GPLv2: + - jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix) + GPLv2+CE: + - Java Servlet API (javax.servlet:javax.servlet-api:3.1.0 - http://servlet-spec.java.net) + - javafx-base (org.openjfx:javafx-base:14 - https://openjdk.java.net/projects/openjfx/javafx-base/) + - javafx-controls (org.openjfx:javafx-controls:14 - https://openjdk.java.net/projects/openjfx/javafx-controls/) + - javafx-fxml (org.openjfx:javafx-fxml:14 - https://openjdk.java.net/projects/openjfx/javafx-fxml/) + - javafx-graphics (org.openjfx:javafx-graphics:14 - https://openjdk.java.net/projects/openjfx/javafx-graphics/) + LGPL 2.1: + - dbus-java (com.github.hypfvieh:dbus-java:3.2.3 - https://github.com/hypfvieh/dbus-java/dbus-java) + - jnr-posix (com.github.jnr:jnr-posix:3.0.54 - http://nexus.sonatype.org/oss-repository-hosting.html/jnr-posix) + - Java Native Access (net.java.dev.jna:jna:5.1.0 - https://github.com/java-native-access/jna) + - Java Native Access Platform (net.java.dev.jna:jna-platform:5.1.0 - https://github.com/java-native-access/jna) + MIT License: + - java jwt (com.auth0:java-jwt:3.10.3 - https://github.com/auth0/java-jwt) + - java-utils (com.github.hypfvieh:java-utils:1.0.6 - https://github.com/hypfvieh/java-utils) + - jnr-x86asm (com.github.jnr:jnr-x86asm:1.0.2 - http://github.com/jnr/jnr-x86asm) + - jnr-fuse (com.github.serceman:jnr-fuse:0.5.4 - no url defined) + - zxcvbn4j (com.nulab-inc:zxcvbn:1.3.0 - https://github.com/nulab/zxcvbn4j) + - secret-service (de.swiesend:secret-service:1.1.0 - https://github.com/swiesend/secret-service) + - Checker Qual (org.checkerframework:checker-qual:3.5.0 - https://checkerframework.org) + - kdewallet (org.purejava:kdewallet:1.1.1 - https://github.com/purejava/kdewallet) + - SLF4J API Module (org.slf4j:slf4j-api:1.7.30 - http://www.slf4j.org) + The BSD 2-Clause License: + - EasyBind (com.tobiasdiez:easybind:2.1.0 - https://github.com/tobiasdiez/EasyBind) Cryptomator uses other third-party assets under the following licenses: - SIL OFL 1.1 License: - - Font Awesome 5.12.0 (https://fontawesome.com/) +SIL OFL 1.1 License: +- Font Awesome 5.12.0 (https://fontawesome.com/)