Moved various non-ui related stuff to commons

This commit is contained in:
Sebastian Stenzel
2019-07-30 14:49:35 +02:00
parent 71afb088b5
commit 1ec887092f
44 changed files with 169 additions and 209 deletions

View File

@@ -11,28 +11,49 @@
<description>Shared utilities</description>
<dependencies>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>cryptofs</artifactId>
</dependency>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>fuse-nio-adapter</artifactId>
</dependency>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>dokany-nio-adapter</artifactId>
</dependency>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>webdav-nio-adapter</artifactId>
</dependency>
<!-- JavaFx -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
</dependency>
<!-- Libs -->
<!-- EasyBind -->
<dependency>
<groupId>org.fxmisc.easybind</groupId>
<artifactId>easybind</artifactId>
</dependency>
<!-- Google -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<!-- Apache Commons -->
<dependency>
<groupId>org.fxmisc.easybind</groupId>
<artifactId>easybind</artifactId>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!-- DI -->

View File

@@ -5,22 +5,87 @@
*******************************************************************************/
package org.cryptomator.common;
import java.util.Comparator;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import javafx.beans.binding.Binding;
import javafx.beans.binding.Bindings;
import javafx.collections.ObservableList;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.SettingsProvider;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.common.vaults.VaultComponent;
import org.cryptomator.common.vaults.VaultList;
import org.cryptomator.frontend.webdav.WebDavServer;
import org.fxmisc.easybind.EasyBind;
import javax.inject.Named;
import javax.inject.Singleton;
import java.net.InetSocketAddress;
import java.util.Comparator;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
import dagger.Module;
import dagger.Provides;
@Module(subcomponents = {VaultComponent.class})
public abstract class CommonsModule {
@Module
public class CommonsModule {
private static final int NUM_SCHEDULER_THREADS = 4;
@Provides
@Singleton
@Named("SemVer")
Comparator<String> providesSemVerComparator() {
static Comparator<String> providesSemVerComparator() {
return new SemVerComparator();
}
@Provides
@Singleton
static Settings provideSettings(SettingsProvider settingsProvider) {
return settingsProvider.get();
}
@Binds
@Singleton
abstract ObservableList<Vault> bindVaultList(VaultList vaultList);
@Provides
@Singleton
static ScheduledExecutorService provideScheduledExecutorService(@Named("shutdownTaskScheduler") Consumer<Runnable> shutdownTaskScheduler) {
final AtomicInteger threadNumber = new AtomicInteger(1);
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(NUM_SCHEDULER_THREADS, r -> {
Thread t = new Thread(r);
t.setName("Background Thread " + threadNumber.getAndIncrement());
t.setDaemon(true);
return t;
});
shutdownTaskScheduler.accept(executorService::shutdown);
return executorService;
}
@Binds
@Singleton
abstract ExecutorService bindExecutorService(ScheduledExecutorService executor);
@Provides
@Singleton
static Binding<InetSocketAddress> provideServerSocketAddressBinding(Settings settings) {
return Bindings.createObjectBinding(() -> {
String host = SystemUtils.IS_OS_WINDOWS ? "127.0.0.1" : "localhost";
return InetSocketAddress.createUnresolved(host, settings.port().intValue());
}, settings.port());
}
@Provides
@Singleton
static WebDavServer provideWebDavServer(Binding<InetSocketAddress> serverSocketAddressBinding) {
WebDavServer server = WebDavServer.create();
// no need to unsubscribe eventually, because server is a singleton
EasyBind.subscribe(serverSocketAddressBinding, server::bind);
return server;
}
}

View File

@@ -17,7 +17,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import java.io.IOException;
import java.io.InputStream;
@@ -38,10 +37,11 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Supplier;
import java.util.stream.Stream;
@Singleton
public class SettingsProvider implements Provider<Settings> {
public class SettingsProvider implements Supplier<Settings> {
private static final Logger LOG = LoggerFactory.getLogger(SettingsProvider.class);
private static final long SAVE_DELAY_MS = 1000;

View File

@@ -1,4 +1,4 @@
package org.cryptomator.ui.model;
package org.cryptomator.common.vaults;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;

View File

@@ -1,4 +1,4 @@
package org.cryptomator.ui.model;
package org.cryptomator.common.vaults;
import com.google.common.base.Strings;
import org.cryptomator.common.settings.VaultSettings;

View File

@@ -1,4 +1,4 @@
package org.cryptomator.ui.model;
package org.cryptomator.common.vaults;
import com.google.common.base.Splitter;
import org.apache.commons.lang3.SystemUtils;

View File

@@ -1,4 +1,4 @@
package org.cryptomator.ui.model;
package org.cryptomator.common.vaults;
import javax.inject.Scope;
import java.lang.annotation.Documented;

View File

@@ -6,10 +6,9 @@
* Contributors:
* Sebastian Stenzel - initial API and implementation
*******************************************************************************/
package org.cryptomator.ui.model;
package org.cryptomator.common.vaults;
import com.google.common.base.Strings;
import javafx.application.Platform;
import javafx.beans.Observable;
import javafx.beans.binding.Binding;
import javafx.beans.binding.Bindings;
@@ -118,27 +117,15 @@ public class Vault {
}
public synchronized void unlock(CharSequence passphrase) throws CryptoException, IOException, Volume.VolumeException {
Platform.runLater(() -> state.set(State.PROCESSING));
try {
if (vaultSettings.usesIndividualMountPath().get() && Strings.isNullOrEmpty(vaultSettings.individualMountPath().get())) {
throw new NotDirectoryException("");
}
CryptoFileSystem fs = getCryptoFileSystem(passphrase);
volume = volumeProvider.get();
volume.mount(fs, getMountFlags());
Platform.runLater(() -> {
state.set(State.UNLOCKED);
});
} catch (Exception e) {
Platform.runLater(() -> state.set(State.LOCKED));
throw e;
if (vaultSettings.usesIndividualMountPath().get() && Strings.isNullOrEmpty(vaultSettings.individualMountPath().get())) {
throw new NotDirectoryException("");
}
CryptoFileSystem fs = getCryptoFileSystem(passphrase);
volume = volumeProvider.get();
volume.mount(fs, getMountFlags());
}
public synchronized void lock(boolean forced) throws Volume.VolumeException {
Platform.runLater(() -> {
state.set(State.PROCESSING);
});
if (forced && volume.supportsForcedUnmount()) {
volume.unmountForced();
} else {
@@ -152,9 +139,6 @@ public class Vault {
LOG.error("Error closing file system.", e);
}
}
Platform.runLater(() -> {
state.set(State.LOCKED);
});
}
/**
@@ -190,13 +174,17 @@ public class Vault {
// Observable Properties
// *******************************************************************************
public ReadOnlyObjectProperty<State> stateProperty() {
public ObjectProperty<State> stateProperty() {
return state;
}
public State getState() {
return state.get();
}
public void setState(State value) {
state.setValue(value);
}
public BooleanBinding lockedProperty() {
return locked;

View File

@@ -3,7 +3,7 @@
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the accompanying LICENSE file.
*******************************************************************************/
package org.cryptomator.ui.model;
package org.cryptomator.common.vaults;
import dagger.BindsInstance;
import org.cryptomator.common.settings.VaultSettings;

View File

@@ -6,7 +6,7 @@
* Contributors:
* Sebastian Stenzel - initial API and implementation
*******************************************************************************/
package org.cryptomator.ui.model;
package org.cryptomator.common.vaults;
import org.cryptomator.common.settings.VaultSettings;

View File

@@ -3,7 +3,7 @@
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the accompanying LICENSE file.
*******************************************************************************/
package org.cryptomator.ui.model;
package org.cryptomator.common.vaults;
import com.google.common.collect.Lists;
import javafx.collections.ListChangeListener;

View File

@@ -3,7 +3,7 @@
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the accompanying LICENSE file.
*******************************************************************************/
package org.cryptomator.ui.model;
package org.cryptomator.common.vaults;
import dagger.Module;
import dagger.Provides;

View File

@@ -1,4 +1,4 @@
package org.cryptomator.ui.model;
package org.cryptomator.common.vaults;
import org.cryptomator.common.settings.VolumeImpl;
import org.cryptomator.cryptofs.CryptoFileSystem;

View File

@@ -1,4 +1,4 @@
package org.cryptomator.ui.model;
package org.cryptomator.common.vaults;
import org.cryptomator.common.settings.Settings;

View File

@@ -3,10 +3,9 @@
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the accompanying LICENSE file.
*******************************************************************************/
package org.cryptomator.ui.model;
package org.cryptomator.common.vaults;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.ui.fxapp.FxApplicationScoped;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -4,9 +4,7 @@ import dagger.Module;
import dagger.Provides;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.SettingsProvider;
import org.cryptomator.ui.UiModule;
import org.cryptomator.ui.model.AppLaunchEvent;
import org.cryptomator.ui.model.VaultComponent;
import org.cryptomator.ui.traymenu.TrayMenuComponent;
import javax.inject.Named;
@@ -17,7 +15,7 @@ import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.function.Consumer;
@Module(includes = {UiModule.class}, subcomponents = {VaultComponent.class, TrayMenuComponent.class})
@Module(subcomponents = {TrayMenuComponent.class})
class CryptomatorModule {
@Provides
@@ -34,12 +32,6 @@ class CryptomatorModule {
return new CountDownLatch(1);
}
@Provides
@Singleton
static Settings provideSettings(SettingsProvider settingsProvider) {
return settingsProvider.get();
}
@Provides
@Singleton
@Named("launchEventQueue")

View File

@@ -18,29 +18,10 @@
<groupId>org.cryptomator</groupId>
<artifactId>commons</artifactId>
</dependency>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>cryptofs</artifactId>
</dependency>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>jni</artifactId>
</dependency>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>fuse-nio-adapter</artifactId>
</dependency>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>dokany-nio-adapter</artifactId>
</dependency>
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>webdav-nio-adapter</artifactId>
</dependency>
<!-- CryptoLib -->
<dependency>
<groupId>org.cryptomator</groupId>
<artifactId>cryptolib</artifactId>
@@ -76,7 +57,7 @@
<artifactId>gson</artifactId>
</dependency>
<!-- apache commons -->
<!-- Apache Commons -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>

View File

@@ -1,93 +0,0 @@
/*******************************************************************************
* Copyright (c) 2016, 2017 Sebastian Stenzel and others.
* All rights reserved.
* This program and the accompanying materials are made available under the terms of the accompanying LICENSE file.
*
* Contributors:
* Sebastian Stenzel - initial API and implementation
*******************************************************************************/
package org.cryptomator.ui;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import javafx.beans.binding.Binding;
import javafx.beans.binding.Bindings;
import javafx.collections.ObservableList;
import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.frontend.webdav.WebDavServer;
import org.cryptomator.keychain.KeychainModule;
import org.cryptomator.ui.fxapp.FxApplicationScoped;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.ui.model.VaultList;
import org.fxmisc.easybind.EasyBind;
import javax.inject.Named;
import javax.inject.Singleton;
import java.net.InetSocketAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
// TODO move to common...
@Deprecated(forRemoval = true, since = "1.5.0")
@Module(includes = {KeychainModule.class})
public abstract class UiModule {
private static final int NUM_SCHEDULER_THREADS = 4;
@Binds
@Singleton
abstract ObservableList<Vault> bindVaultList(VaultList vaultList);
@Provides
@Singleton
static ScheduledExecutorService provideScheduledExecutorService(@Named("shutdownTaskScheduler") Consumer<Runnable> shutdownTaskScheduler) {
final AtomicInteger threadNumber = new AtomicInteger(1);
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(NUM_SCHEDULER_THREADS, r -> {
Thread t = new Thread(r);
t.setName("Scheduler Thread " + threadNumber.getAndIncrement());
t.setDaemon(true);
return t;
});
shutdownTaskScheduler.accept(executorService::shutdown);
return executorService;
}
// TODO @Binds abstract ExecutorService bindExecutorService(ScheduledExecutorService executor); ?
@Provides
@Singleton
static ExecutorService provideExecutorService(@Named("shutdownTaskScheduler") Consumer<Runnable> shutdownTaskScheduler) {
final AtomicInteger threadNumber = new AtomicInteger(1);
ExecutorService executorService = Executors.newCachedThreadPool(r -> {
Thread t = new Thread(r);
t.setName("Background Thread " + threadNumber.getAndIncrement());
t.setDaemon(true);
return t;
});
shutdownTaskScheduler.accept(executorService::shutdown);
return executorService;
}
@Provides
@Singleton
static Binding<InetSocketAddress> provideServerSocketAddressBinding(Settings settings) {
return Bindings.createObjectBinding(() -> {
String host = SystemUtils.IS_OS_WINDOWS ? "127.0.0.1" : "localhost";
return InetSocketAddress.createUnresolved(host, settings.port().intValue());
}, settings.port());
}
@Provides
@Singleton
static WebDavServer provideWebDavServer(Binding<InetSocketAddress> serverSocketAddressBinding) {
WebDavServer server = WebDavServer.create();
// no need to unsubscribe eventually, because server is a singleton
EasyBind.subscribe(serverSocketAddressBinding, server::bind);
return server;
}
}

View File

@@ -13,8 +13,8 @@ import org.cryptomator.common.settings.VaultSettings;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.common.FxmlFile;
import org.cryptomator.ui.common.FxmlScene;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.ui.model.VaultFactory;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.common.vaults.VaultFactory;
import javax.inject.Inject;
import java.io.File;

View File

@@ -27,7 +27,7 @@ import org.cryptomator.cryptolib.api.InvalidPassphraseException;
import org.cryptomator.cryptolib.api.UnsupportedVaultFormatException;
import org.cryptomator.ui.controls.SecPasswordField;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.ui.util.PasswordStrengthUtil;
import org.fxmisc.easybind.EasyBind;
import org.slf4j.Logger;

View File

@@ -22,7 +22,7 @@ import javafx.scene.layout.GridPane;
import javafx.scene.layout.Region;
import org.cryptomator.ui.controls.SecPasswordField;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.ui.util.PasswordStrengthUtil;
import org.fxmisc.easybind.EasyBind;
import org.slf4j.Logger;

View File

@@ -51,9 +51,9 @@ import org.cryptomator.ui.controls.DirectoryListCell;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.AppLaunchEvent;
import org.cryptomator.ui.model.AutoUnlocker;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.ui.model.VaultFactory;
import org.cryptomator.ui.model.VaultList;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.common.vaults.VaultFactory;
import org.cryptomator.common.vaults.VaultList;
import org.cryptomator.ui.model.upgrade.UpgradeStrategies;
import org.cryptomator.ui.model.upgrade.UpgradeStrategy;
import org.cryptomator.ui.util.DialogBuilderUtil;

View File

@@ -28,7 +28,7 @@ import org.cryptomator.ui.fxapp.FxApplicationScoped;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.common.settings.VolumeImpl;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Volume;
import org.cryptomator.common.vaults.Volume;
import javax.inject.Inject;
import javax.inject.Named;

View File

@@ -42,8 +42,8 @@ import org.cryptomator.cryptolib.api.UnsupportedVaultFormatException;
import org.cryptomator.keychain.KeychainAccess;
import org.cryptomator.ui.controls.SecPasswordField;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.ui.model.WindowsDriveLetters;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.common.vaults.WindowsDriveLetters;
import org.cryptomator.ui.util.DialogBuilderUtil;
import org.cryptomator.ui.common.Tasks;
import org.fxmisc.easybind.EasyBind;

View File

@@ -31,7 +31,7 @@ import javafx.scene.layout.VBox;
import javafx.stage.PopupWindow.AnchorLocation;
import javafx.util.Duration;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.ui.util.DialogBuilderUtil;
import org.cryptomator.ui.common.Tasks;
import org.fxmisc.easybind.EasyBind;

View File

@@ -25,7 +25,7 @@ import org.cryptomator.ui.controls.SecPasswordField;
import org.cryptomator.ui.model.upgrade.UpgradeStrategies;
import org.cryptomator.ui.model.upgrade.UpgradeStrategy;
import org.cryptomator.ui.model.upgrade.UpgradeStrategy.UpgradeFailedException;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.ui.common.Tasks;
import org.fxmisc.easybind.EasyBind;

View File

@@ -8,7 +8,7 @@
*******************************************************************************/
package org.cryptomator.ui.controls;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import org.fxmisc.easybind.EasyBind;
import javafx.beans.binding.ObjectExpression;

View File

@@ -6,22 +6,19 @@
package org.cryptomator.ui.fxapp;
import dagger.Binds;
import dagger.Lazy;
import dagger.Module;
import dagger.Provides;
import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.ObservableList;
import org.cryptomator.ui.UiModule;
import org.cryptomator.keychain.KeychainModule;
import org.cryptomator.ui.mainwindow.MainWindowComponent;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.ui.model.VaultList;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.ui.preferences.PreferencesComponent;
import java.util.ResourceBundle;
@Module(subcomponents = {MainWindowComponent.class, PreferencesComponent.class})
@Module(includes = {KeychainModule.class}, subcomponents = {MainWindowComponent.class, PreferencesComponent.class})
abstract class FxApplicationModule {
@Binds

View File

@@ -5,7 +5,7 @@ import javafx.beans.property.ReadOnlyObjectProperty;
import javafx.fxml.FXML;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.common.Tasks;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.ui.unlock.UnlockComponent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -44,11 +44,14 @@ public class VaultDetailController implements FxController {
@FXML
public void lock() {
vault.get().setState(Vault.State.PROCESSING);
Tasks.create(() -> {
vault.get().lock(false);
}).onSuccess(() -> {
LOG.trace("Regular unmount succeeded.");
vault.get().setState(Vault.State.LOCKED);
}).onError(Exception.class, e -> {
vault.get().setState(Vault.State.UNLOCKED);
// TODO
}).runOnce(executor);
}

View File

@@ -4,7 +4,7 @@ import javafx.beans.binding.Binding;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import org.fxmisc.easybind.EasyBind;
import javax.inject.Inject;

View File

@@ -8,7 +8,7 @@ import javafx.scene.control.ListView;
import javafx.util.Callback;
import org.cryptomator.ui.common.FXMLLoaderFactory;
import org.cryptomator.ui.controls.DraggableListCell;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import javax.inject.Inject;
import java.io.IOException;

View File

@@ -7,7 +7,7 @@ import javafx.scene.control.ListView;
import javafx.scene.layout.AnchorPane;
import org.cryptomator.ui.addvaultwizard.AddVaultWizardComponent;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -5,6 +5,9 @@
*******************************************************************************/
package org.cryptomator.ui.model;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.common.vaults.VaultList;
import org.cryptomator.common.vaults.Volume;
import org.cryptomator.ui.fxapp.FxApplicationScoped;
import org.cryptomator.cryptolib.api.CryptoException;
import org.cryptomator.keychain.KeychainAccess;
@@ -21,6 +24,7 @@ import java.util.Optional;
import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors;
@Deprecated(forRemoval = true, since = "1.5.0")
@FxApplicationScoped
public class AutoUnlocker {

View File

@@ -6,7 +6,7 @@
package org.cryptomator.ui.model.upgrade;
import org.cryptomator.ui.fxapp.FxApplicationScoped;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import javax.inject.Inject;
import java.util.Arrays;

View File

@@ -19,7 +19,7 @@ import org.cryptomator.cryptolib.api.InvalidPassphraseException;
import org.cryptomator.cryptolib.api.KeyFile;
import org.cryptomator.cryptolib.api.UnsupportedVaultFormatException;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -11,7 +11,7 @@ import org.cryptomator.ui.fxapp.FxApplicationScoped;
import org.cryptomator.cryptolib.Cryptors;
import org.cryptomator.cryptolib.api.Cryptor;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -12,7 +12,7 @@ import org.cryptomator.cryptolib.Cryptors;
import org.cryptomator.cryptolib.api.Cryptor;
import org.cryptomator.cryptolib.common.MessageDigestSupplier;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -10,7 +10,7 @@ import org.cryptomator.cryptolib.Cryptors;
import org.cryptomator.cryptolib.api.Cryptor;
import org.cryptomator.cryptolib.api.FileHeader;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -12,7 +12,7 @@ import org.cryptomator.cryptolib.Cryptors;
import org.cryptomator.cryptolib.api.Cryptor;
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -12,7 +12,7 @@ import org.cryptomator.common.settings.UiTheme;
import org.cryptomator.common.settings.VolumeImpl;
import org.cryptomator.common.settings.WebDavUrlScheme;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.model.Volume;
import org.cryptomator.common.vaults.Volume;
import javax.inject.Inject;

View File

@@ -3,7 +3,7 @@ package org.cryptomator.ui.traymenu;
import javafx.beans.Observable;
import javafx.collections.ObservableList;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import javax.inject.Inject;
import javax.inject.Named;

View File

@@ -10,10 +10,9 @@ import dagger.Lazy;
import dagger.Subcomponent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import org.cryptomator.ui.common.FXMLLoaderFactory;
import org.cryptomator.ui.common.FxmlFile;
import org.cryptomator.ui.common.FxmlScene;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
@UnlockScoped
@Subcomponent(modules = {UnlockModule.class})

View File

@@ -15,7 +15,7 @@ import org.cryptomator.keychain.KeychainAccess;
import org.cryptomator.ui.common.FxController;
import org.cryptomator.ui.common.Tasks;
import org.cryptomator.ui.controls.SecPasswordField;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.ui.util.DialogBuilderUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -69,12 +69,14 @@ public class UnlockController implements FxController {
@FXML
public void unlock() {
CharSequence password = passwordField.getCharacters();
vault.setState(Vault.State.PROCESSING);
Tasks.create(() -> {
vault.unlock(password);
if (keychainAccess.isPresent() && savePassword.isSelected()) {
keychainAccess.get().storePassphrase(vault.getId(), password);
}
}).onSuccess(() -> {
vault.setState(Vault.State.UNLOCKED);
passwordField.swipe();
LOG.info("Unlock of '{}' succeeded.", vault.getDisplayableName());
window.close();
@@ -92,6 +94,10 @@ public class UnlockController implements FxController {
}).onError(Exception.class, e -> { // including RuntimeExceptions
LOG.error("Unlock failed for technical reasons.", e);
// TODO
}).andFinally(() -> {
if (!vault.isUnlocked()) {
vault.setState(Vault.State.LOCKED);
}
}).runOnce(executor);
}

View File

@@ -4,10 +4,8 @@ import com.google.common.jimfs.Configuration;
import com.google.common.jimfs.Jimfs;
import org.cryptomator.ui.l10n.Localization;
import org.cryptomator.ui.l10n.LocalizationMock;
import org.cryptomator.ui.model.Vault;
import org.cryptomator.ui.model.upgrade.UpgradeStrategy;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.ui.model.upgrade.UpgradeStrategy.UpgradeFailedException;
import org.cryptomator.ui.model.upgrade.UpgradeVersion3to4;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;