From 9e79350b9ea77ef8075764b643b876887b6b20b7 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Fri, 27 Sep 2019 10:56:44 +0200 Subject: [PATCH 001/202] =?UTF-8?q?added=20the=20strongest=20avenger=20?= =?UTF-8?q?=F0=9F=98=9C=20[ci=20skip]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 0af73f145..a0d7519cd 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,6 +1,6 @@ # These are supported funding model platforms -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +github: [overheadhunter] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username From ccefb3613ea8aa503a6f5dfb4d4a346a428c43ab Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Fri, 27 Sep 2019 20:01:02 +0200 Subject: [PATCH 002/202] renamed file --- main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java | 2 +- .../src/main/java/org/cryptomator/ui/unlock/UnlockModule.java | 2 +- main/ui/src/main/resources/fxml/{unlock2.fxml => unlock.fxml} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename main/ui/src/main/resources/fxml/{unlock2.fxml => unlock.fxml} (100%) diff --git a/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java b/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java index fc449a1ca..c5bfb0bd4 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java +++ b/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java @@ -16,7 +16,7 @@ public enum FxmlFile { PREFERENCES("/fxml/preferences.fxml"), // QUIT("/fxml/quit.fxml"), // REMOVE_VAULT("/fxml/remove_vault.fxml"), // - UNLOCK("/fxml/unlock2.fxml"), // TODO rename + UNLOCK("/fxml/unlock.fxml"), UNLOCK_SUCCESS("/fxml/unlock_success.fxml"), // VAULT_OPTIONS("/fxml/vault_options.fxml"), // WRONGFILEALERT("/fxml/wrongfilealert.fxml"); diff --git a/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockModule.java b/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockModule.java index 7ee1f71e3..8dbb7c7b8 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/unlock/UnlockModule.java @@ -50,7 +50,7 @@ abstract class UnlockModule { @FxmlScene(FxmlFile.UNLOCK) @UnlockScoped static Scene provideUnlockScene(@UnlockWindow FXMLLoaderFactory fxmlLoaders, @UnlockWindow Stage window) { - Scene scene = fxmlLoaders.createScene("/fxml/unlock2.fxml"); // TODO rename fxml file + Scene scene = fxmlLoaders.createScene("/fxml/unlock.fxml"); KeyCombination cmdW = new KeyCodeCombination(KeyCode.W, KeyCombination.SHORTCUT_DOWN); scene.getAccelerators().put(cmdW, window::close); diff --git a/main/ui/src/main/resources/fxml/unlock2.fxml b/main/ui/src/main/resources/fxml/unlock.fxml similarity index 100% rename from main/ui/src/main/resources/fxml/unlock2.fxml rename to main/ui/src/main/resources/fxml/unlock.fxml From 19300900440029b23ccf68ef8230a134de72cf4a Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Fri, 27 Sep 2019 21:43:42 +0200 Subject: [PATCH 003/202] Added first prototyp for recovery key generation --- main/pom.xml | 8 +- main/ui/pom.xml | 4 - .../org/cryptomator/ui/common/FxmlFile.java | 1 + .../ui/controls/NiceSecurePasswordField.java | 4 + .../ui/recoverykey/RecoveryKeyComponent.java | 48 ++++++++++ .../RecoveryKeyCreationController.java | 91 +++++++++++++++++++ .../ui/recoverykey/RecoveryKeyModule.java | 59 ++++++++++++ .../ui/recoverykey/RecoveryKeyScoped.java | 13 +++ .../ui/recoverykey/RecoveryKeyWindow.java | 14 +++ .../WordEncoder.java | 2 +- .../GeneralVaultOptionsController.java | 10 +- .../ui/vaultoptions/VaultOptionsModule.java | 3 +- .../resources/fxml/recoverykey_create.fxml | 46 ++++++++++ .../resources/fxml/vault_options_general.fxml | 1 + .../WordEncoderTest.java | 2 +- 15 files changed, 291 insertions(+), 15 deletions(-) create mode 100644 main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyComponent.java create mode 100644 main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyCreationController.java create mode 100644 main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyModule.java create mode 100644 main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyScoped.java create mode 100644 main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyWindow.java rename main/ui/src/main/java/org/cryptomator/ui/{keyrecovery => recoverykey}/WordEncoder.java (98%) create mode 100644 main/ui/src/main/resources/fxml/recoverykey_create.fxml rename main/ui/src/test/java/org/cryptomator/ui/{keyrecovery => recoverykey}/WordEncoderTest.java (96%) diff --git a/main/pom.xml b/main/pom.xml index 3eee68f51..15fa2d689 100644 --- a/main/pom.xml +++ b/main/pom.xml @@ -24,8 +24,7 @@ UTF-8 - 1.2.2 - 1.9.0-beta1 + 1.9.0-beta2 2.2.1 1.2.0 1.1.11 @@ -82,11 +81,6 @@ - - org.cryptomator - cryptolib - ${cryptomator.cryptolib.version} - org.cryptomator cryptofs diff --git a/main/ui/pom.xml b/main/ui/pom.xml index fd0cc91fd..5e5b46c41 100644 --- a/main/ui/pom.xml +++ b/main/ui/pom.xml @@ -22,10 +22,6 @@ org.cryptomator jni - - org.cryptomator - cryptolib - diff --git a/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java b/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java index c5bfb0bd4..87a979a5c 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java +++ b/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java @@ -15,6 +15,7 @@ public enum FxmlFile { MIGRATION_SUCCESS("/fxml/migration_success.fxml"), // PREFERENCES("/fxml/preferences.fxml"), // QUIT("/fxml/quit.fxml"), // + RECOVERYKEY_CREATE("/fxml/recoverykey_create.fxml"), // REMOVE_VAULT("/fxml/remove_vault.fxml"), // UNLOCK("/fxml/unlock.fxml"), UNLOCK_SUCCESS("/fxml/unlock_success.fxml"), // diff --git a/main/ui/src/main/java/org/cryptomator/ui/controls/NiceSecurePasswordField.java b/main/ui/src/main/java/org/cryptomator/ui/controls/NiceSecurePasswordField.java index b727ccc78..6cc2ac57c 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controls/NiceSecurePasswordField.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controls/NiceSecurePasswordField.java @@ -76,6 +76,10 @@ public class NiceSecurePasswordField extends StackPane { return passwordField.getCharacters(); } + public void setPassword(CharSequence password) { + passwordField.setPassword(password); + } + public void setPassword(char[] password) { passwordField.setPassword(password); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyComponent.java b/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyComponent.java new file mode 100644 index 000000000..f317a140f --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyComponent.java @@ -0,0 +1,48 @@ +package org.cryptomator.ui.recoverykey; + +import dagger.BindsInstance; +import dagger.Lazy; +import dagger.Subcomponent; +import javafx.scene.Scene; +import javafx.stage.Stage; +import org.cryptomator.common.vaults.Vault; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; + +import javax.annotation.Nullable; +import javax.inject.Named; +import java.util.Optional; + +@RecoveryKeyScoped +@Subcomponent(modules = {RecoveryKeyModule.class}) +public interface RecoveryKeyComponent { + + @RecoveryKeyWindow + Stage window(); + + @FxmlScene(FxmlFile.RECOVERYKEY_CREATE) + Lazy scene(); + + default void showRecoveryKeyCreationWindow() { + Stage stage = window(); + stage.setScene(scene().get()); + stage.sizeToScene(); + stage.show(); + } + + @Subcomponent.Builder + interface Builder { + + @BindsInstance + Builder vault(@RecoveryKeyWindow Vault vault); + + @BindsInstance + Builder password(@Nullable CharSequence password); + + @BindsInstance + Builder owner(@Named("keyRecoveryOwner") Stage owner); + + RecoveryKeyComponent build(); + } + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyCreationController.java b/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyCreationController.java new file mode 100644 index 000000000..5b466311c --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyCreationController.java @@ -0,0 +1,91 @@ +package org.cryptomator.ui.recoverykey; + +import javafx.beans.property.ReadOnlyStringProperty; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javafx.fxml.FXML; +import javafx.stage.Stage; +import org.cryptomator.common.vaults.Vault; +import org.cryptomator.cryptofs.CryptoFileSystemProvider; +import org.cryptomator.cryptolib.api.InvalidPassphraseException; +import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.common.Tasks; +import org.cryptomator.ui.controls.NiceSecurePasswordField; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.Nullable; +import javax.inject.Inject; +import java.io.IOException; +import java.util.Arrays; +import java.util.concurrent.ExecutorService; + +@RecoveryKeyScoped +public class RecoveryKeyCreationController implements FxController { + + private static final Logger LOG = LoggerFactory.getLogger(RecoveryKeyCreationController.class); + private static final String MASTERKEY_FILENAME = "masterkey.cryptomator"; // TODO: deduplicate constant declared in multiple classes + + private final Stage window; + private final Vault vault; + private final ExecutorService executor; + private final CharSequence prefilledPassword; + private final WordEncoder wordEncoder; + private final StringProperty recoveryKey; + public NiceSecurePasswordField passwordField; + + @Inject + public RecoveryKeyCreationController(@RecoveryKeyWindow Stage window, @RecoveryKeyWindow Vault vault, ExecutorService executor, @Nullable CharSequence prefilledPassword) { + this.window = window; + this.vault = vault; + this.executor = executor; + this.prefilledPassword = prefilledPassword; + this.wordEncoder = new WordEncoder(); + this.recoveryKey = new SimpleStringProperty(); + } + + @FXML + public void initialize() { + if (prefilledPassword != null) { + passwordField.setPassword(prefilledPassword); + } + } + + @FXML + public void createRecoveryKey() { + Tasks.create(() -> { + byte[] rawKey = CryptoFileSystemProvider.exportRawKey(vault.getPath(), MASTERKEY_FILENAME, new byte[0], passwordField.getCharacters()); + assert rawKey.length == 64; + byte[] paddedKey = Arrays.copyOf(rawKey, 66); + // TODO add two-byte CRC + + try { + return wordEncoder.encodePadded(paddedKey); + } finally { + Arrays.fill(rawKey, (byte) 0x00); + Arrays.fill(paddedKey, (byte) 0x00); + } + }).onSuccess(result -> { + recoveryKey.set(result); + }).onError(IOException.class, e -> { + LOG.error("Creation of recovery key failed.", e); + }).onError(InvalidPassphraseException.class, e -> { + // TODO shake animation? :D + }).runOnce(executor); + } + + @FXML + public void close() { + window.close(); + } + + /* Getter/Setter */ + + public ReadOnlyStringProperty recoveryKeyProperty() { + return recoveryKey; + } + + public String getRecoveryKey() { + return recoveryKey.get(); + } +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyModule.java b/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyModule.java new file mode 100644 index 000000000..44fab7177 --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyModule.java @@ -0,0 +1,59 @@ +package org.cryptomator.ui.recoverykey; + +import dagger.Binds; +import dagger.Module; +import dagger.Provides; +import dagger.multibindings.IntoMap; +import javafx.scene.Scene; +import javafx.scene.image.Image; +import javafx.stage.Modality; +import javafx.stage.Stage; +import org.cryptomator.ui.common.FXMLLoaderFactory; +import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.common.FxControllerKey; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlScene; + +import javax.inject.Named; +import javax.inject.Provider; +import java.util.Map; +import java.util.Optional; +import java.util.ResourceBundle; + +@Module +abstract class RecoveryKeyModule { + + @Provides + @RecoveryKeyWindow + @RecoveryKeyScoped + static FXMLLoaderFactory provideFxmlLoaderFactory(Map, Provider> factories, ResourceBundle resourceBundle) { + return new FXMLLoaderFactory(factories, resourceBundle); + } + + @Provides + @RecoveryKeyWindow + @RecoveryKeyScoped + static Stage provideStage(ResourceBundle resourceBundle, @Named("windowIcon") Optional windowIcon, @Named("keyRecoveryOwner") Stage owner) { + Stage stage = new Stage(); + stage.setTitle("TODO keyRecovery.title"); // TODO localize + stage.setResizable(false); + stage.initModality(Modality.WINDOW_MODAL); + stage.initOwner(owner); + windowIcon.ifPresent(stage.getIcons()::add); + return stage; + } + + @Provides + @FxmlScene(FxmlFile.RECOVERYKEY_CREATE) + @RecoveryKeyScoped + static Scene provideRecoveryKeyCreationScene(@RecoveryKeyWindow FXMLLoaderFactory fxmlLoaders, @RecoveryKeyWindow Stage window) { + return fxmlLoaders.createScene("/fxml/recoverykey_create.fxml"); + } + + // ------------------ + + @Binds + @IntoMap + @FxControllerKey(RecoveryKeyCreationController.class) + abstract FxController bindRecoveryKeyCreationController(RecoveryKeyCreationController controller); +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyScoped.java b/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyScoped.java new file mode 100644 index 000000000..e7b266605 --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyScoped.java @@ -0,0 +1,13 @@ +package org.cryptomator.ui.recoverykey; + +import javax.inject.Scope; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Scope +@Documented +@Retention(RetentionPolicy.RUNTIME) +public @interface RecoveryKeyScoped { + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyWindow.java b/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyWindow.java new file mode 100644 index 000000000..d43fb7b3a --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/recoverykey/RecoveryKeyWindow.java @@ -0,0 +1,14 @@ +package org.cryptomator.ui.recoverykey; + +import javax.inject.Qualifier; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Qualifier +@Documented +@Retention(RUNTIME) +@interface RecoveryKeyWindow { + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/keyrecovery/WordEncoder.java b/main/ui/src/main/java/org/cryptomator/ui/recoverykey/WordEncoder.java similarity index 98% rename from main/ui/src/main/java/org/cryptomator/ui/keyrecovery/WordEncoder.java rename to main/ui/src/main/java/org/cryptomator/ui/recoverykey/WordEncoder.java index d5d3dc091..2fc02c183 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/keyrecovery/WordEncoder.java +++ b/main/ui/src/main/java/org/cryptomator/ui/recoverykey/WordEncoder.java @@ -1,4 +1,4 @@ -package org.cryptomator.ui.keyrecovery; +package org.cryptomator.ui.recoverykey; import com.google.common.base.Preconditions; import com.google.common.base.Splitter; diff --git a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/GeneralVaultOptionsController.java b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/GeneralVaultOptionsController.java index cf8a804c6..5e68480a8 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/GeneralVaultOptionsController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/GeneralVaultOptionsController.java @@ -5,6 +5,7 @@ import javafx.stage.Stage; import org.cryptomator.common.vaults.Vault; import org.cryptomator.ui.changepassword.ChangePasswordComponent; import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.recoverykey.RecoveryKeyComponent; import javax.inject.Inject; @@ -14,12 +15,14 @@ public class GeneralVaultOptionsController implements FxController { private final Vault vault; private final Stage window; private final ChangePasswordComponent.Builder changePasswordWindow; + private final RecoveryKeyComponent.Builder recoveryKeyWindow; @Inject - GeneralVaultOptionsController(@VaultOptionsWindow Vault vault, @VaultOptionsWindow Stage window, ChangePasswordComponent.Builder changePasswordWindow) { + GeneralVaultOptionsController(@VaultOptionsWindow Vault vault, @VaultOptionsWindow Stage window, ChangePasswordComponent.Builder changePasswordWindow, RecoveryKeyComponent.Builder recoveryKeyWindow) { this.vault = vault; this.window = window; this.changePasswordWindow = changePasswordWindow; + this.recoveryKeyWindow = recoveryKeyWindow; } @FXML @@ -27,4 +30,9 @@ public class GeneralVaultOptionsController implements FxController { changePasswordWindow.vault(vault).owner(window).build().showChangePasswordWindow(); } + @FXML + public void showRecoveryKey() { + recoveryKeyWindow.vault(vault).owner(window).build().showRecoveryKeyCreationWindow(); + } + } diff --git a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsModule.java b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsModule.java index 967bbbe1a..130eda0d3 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsModule.java @@ -20,6 +20,7 @@ import org.cryptomator.ui.common.FxControllerKey; import org.cryptomator.ui.common.FxmlFile; import org.cryptomator.ui.common.FxmlScene; import org.cryptomator.ui.mainwindow.MainWindow; +import org.cryptomator.ui.recoverykey.RecoveryKeyComponent; import javax.inject.Named; import javax.inject.Provider; @@ -27,7 +28,7 @@ import java.util.Map; import java.util.Optional; import java.util.ResourceBundle; -@Module(subcomponents = {ChangePasswordComponent.class}) +@Module(subcomponents = {ChangePasswordComponent.class, RecoveryKeyComponent.class}) abstract class VaultOptionsModule { @Provides diff --git a/main/ui/src/main/resources/fxml/recoverykey_create.fxml b/main/ui/src/main/resources/fxml/recoverykey_create.fxml new file mode 100644 index 000000000..e44314d1f --- /dev/null +++ b/main/ui/src/main/resources/fxml/recoverykey_create.fxml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + +