diff --git a/main/ui/pom.xml b/main/ui/pom.xml
index 23d67cc0e..fd0cc91fd 100644
--- a/main/ui/pom.xml
+++ b/main/ui/pom.xml
@@ -73,7 +73,7 @@
com.nulab-inc
zxcvbn
- 1.2.2
+ 1.2.7
diff --git a/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultPasswordController.java b/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultPasswordController.java
index b45499b90..03127d38d 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultPasswordController.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultPasswordController.java
@@ -54,11 +54,6 @@ public class CreateNewVaultPasswordController implements FxController {
public Button finishButton;
public SecPasswordField passwordField;
public SecPasswordField reenterField;
- public Region passwordStrengthLevel0;
- public Region passwordStrengthLevel1;
- public Region passwordStrengthLevel2;
- public Region passwordStrengthLevel3;
- public Region passwordStrengthLevel4;
public Label passwordStrengthLabel;
public HBox passwordMatchBox;
public FontAwesome5IconView checkmark;
@@ -97,11 +92,6 @@ public class CreateNewVaultPasswordController implements FxController {
passwordMatchLabel.textProperty().bind(Bindings.when(passwordsMatch.and(reenterFieldNotEmpty)).then(resourceBundle.getString("addvaultwizard.new.passwordsMatch")).otherwise(resourceBundle.getString("addvaultwizard.new.passwordsDoNotMatch")));
//bindsings for the password strength indicator
- passwordStrengthLevel0.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(0), strengthRater::getBackgroundWithStrengthColor));
- passwordStrengthLevel1.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(1), strengthRater::getBackgroundWithStrengthColor));
- passwordStrengthLevel2.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(2), strengthRater::getBackgroundWithStrengthColor));
- passwordStrengthLevel3.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(3), strengthRater::getBackgroundWithStrengthColor));
- passwordStrengthLevel4.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(4), strengthRater::getBackgroundWithStrengthColor));
passwordStrengthLabel.textProperty().bind(EasyBind.map(passwordStrength, strengthRater::getStrengthDescription));
}
@@ -144,4 +134,11 @@ public class CreateNewVaultPasswordController implements FxController {
return vaultName;
}
+ public IntegerProperty passwordStrengthProperty() {
+ return passwordStrength;
+ }
+
+ public int getPasswordStrength() {
+ return passwordStrength.get();
+ }
}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java b/main/ui/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java
index 0e65cc315..f55ff2b33 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/changepassword/ChangePasswordController.java
@@ -9,8 +9,6 @@ import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
-import javafx.scene.layout.Region;
-import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import org.cryptomator.common.vaults.Vault;
import org.cryptomator.cryptolib.api.InvalidPassphraseException;
@@ -40,11 +38,6 @@ public class ChangePasswordController implements FxController {
public SecPasswordField oldPasswordField;
public SecPasswordField newPasswordField;
public SecPasswordField reenterPasswordField;
- public Region passwordStrengthLevel0;
- public Region passwordStrengthLevel1;
- public Region passwordStrengthLevel2;
- public Region passwordStrengthLevel3;
- public Region passwordStrengthLevel4;
public Label passwordStrengthLabel;
public HBox passwordMatchBox;
public FontAwesome5IconView checkmark;
@@ -79,14 +72,7 @@ public class ChangePasswordController implements FxController {
cross.managedProperty().bind(cross.visibleProperty());
passwordMatchLabel.textProperty().bind(Bindings.when(passwordsMatch.and(reenterFieldNotEmpty)).then(resourceBundle.getString("changepassword.passwordsMatch")).otherwise(resourceBundle.getString("changepassword.passwordsDoNotMatch")));
- //bindsings for the password strength indicator
- passwordStrengthLevel0.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(0), strengthRater::getBackgroundWithStrengthColor));
- passwordStrengthLevel1.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(1), strengthRater::getBackgroundWithStrengthColor));
- passwordStrengthLevel2.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(2), strengthRater::getBackgroundWithStrengthColor));
- passwordStrengthLevel3.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(3), strengthRater::getBackgroundWithStrengthColor));
- passwordStrengthLevel4.backgroundProperty().bind(EasyBind.combine(passwordStrength, new SimpleIntegerProperty(4), strengthRater::getBackgroundWithStrengthColor));
passwordStrengthLabel.textProperty().bind(EasyBind.map(passwordStrength, strengthRater::getStrengthDescription));
-
}
@FXML
@@ -109,10 +95,18 @@ public class ChangePasswordController implements FxController {
LOG.info("Wrong old password.");
}
}
+
/* Getter/Setter */
public Vault getVault() {
return vault;
}
+ public IntegerProperty passwordStrengthProperty() {
+ return passwordStrength;
+ }
+
+ public int getPasswordStrength() {
+ return passwordStrength.get();
+ }
}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/controls/PasswordStrengthIndicator.java b/main/ui/src/main/java/org/cryptomator/ui/controls/PasswordStrengthIndicator.java
new file mode 100644
index 000000000..a1619968b
--- /dev/null
+++ b/main/ui/src/main/java/org/cryptomator/ui/controls/PasswordStrengthIndicator.java
@@ -0,0 +1,85 @@
+package org.cryptomator.ui.controls;
+
+import javafx.beans.binding.BooleanBinding;
+import javafx.beans.property.IntegerProperty;
+import javafx.beans.property.SimpleIntegerProperty;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Priority;
+import javafx.scene.layout.Region;
+import org.fxmisc.easybind.EasyBind;
+
+public class PasswordStrengthIndicator extends HBox {
+
+ private static final String STYLECLASS = "password-strength-indicator";
+ private static final String SEGMENT_CLASS = "segment";
+ private static final String ACTIVE_SEGMENT_CLASS = "active";
+ private static final String STRENGTH_0_CLASS = "strength-0";
+ private static final String STRENGTH_1_CLASS = "strength-1";
+ private static final String STRENGTH_2_CLASS = "strength-2";
+ private static final String STRENGTH_3_CLASS = "strength-3";
+ private static final String STRENGTH_4_CLASS = "strength-4";
+
+ private final Region s0;
+ private final Region s1;
+ private final Region s2;
+ private final Region s3;
+ private final Region s4;
+ private final IntegerProperty strength = new SimpleIntegerProperty();
+ private final BooleanBinding isStrength0 = strength.isEqualTo(0);
+ private final BooleanBinding isStrength1 = strength.isEqualTo(1);
+ private final BooleanBinding isStrength2 = strength.isEqualTo(2);
+ private final BooleanBinding isStrength3 = strength.isEqualTo(3);
+ private final BooleanBinding isStrength4 = strength.isEqualTo(4);
+ private final BooleanBinding isMinimumStrength0 = strength.greaterThanOrEqualTo(0);
+ private final BooleanBinding isMinimumStrength1 = strength.greaterThanOrEqualTo(1);
+ private final BooleanBinding isMinimumStrength2 = strength.greaterThanOrEqualTo(2);
+ private final BooleanBinding isMinimumStrength3 = strength.greaterThanOrEqualTo(3);
+ private final BooleanBinding isMinimumStrength4 = strength.greaterThanOrEqualTo(4);
+
+ public PasswordStrengthIndicator() {
+ this.s0 = new Region();
+ this.s1 = new Region();
+ this.s2 = new Region();
+ this.s3 = new Region();
+ this.s4 = new Region();
+
+ getChildren().addAll(s0, s1, s2, s3, s4);
+ setHgrow(s0, Priority.ALWAYS);
+ setHgrow(s1, Priority.ALWAYS);
+ setHgrow(s2, Priority.ALWAYS);
+ setHgrow(s3, Priority.ALWAYS);
+ setHgrow(s4, Priority.ALWAYS);
+
+ getStyleClass().add(STYLECLASS);
+ s0.getStyleClass().add(SEGMENT_CLASS);
+ s1.getStyleClass().add(SEGMENT_CLASS);
+ s2.getStyleClass().add(SEGMENT_CLASS);
+ s3.getStyleClass().add(SEGMENT_CLASS);
+ s4.getStyleClass().add(SEGMENT_CLASS);
+
+ EasyBind.includeWhen(s0.getStyleClass(), ACTIVE_SEGMENT_CLASS, isMinimumStrength0);
+ EasyBind.includeWhen(s1.getStyleClass(), ACTIVE_SEGMENT_CLASS, isMinimumStrength1);
+ EasyBind.includeWhen(s2.getStyleClass(), ACTIVE_SEGMENT_CLASS, isMinimumStrength2);
+ EasyBind.includeWhen(s3.getStyleClass(), ACTIVE_SEGMENT_CLASS, isMinimumStrength3);
+ EasyBind.includeWhen(s4.getStyleClass(), ACTIVE_SEGMENT_CLASS, isMinimumStrength4);
+ EasyBind.includeWhen(getStyleClass(), STRENGTH_0_CLASS, isStrength0);
+ EasyBind.includeWhen(getStyleClass(), STRENGTH_1_CLASS, isStrength1);
+ EasyBind.includeWhen(getStyleClass(), STRENGTH_2_CLASS, isStrength2);
+ EasyBind.includeWhen(getStyleClass(), STRENGTH_3_CLASS, isStrength3);
+ EasyBind.includeWhen(getStyleClass(), STRENGTH_4_CLASS, isStrength4);
+ }
+
+ /* Observables */
+
+ public IntegerProperty strengthProperty() {
+ return strength;
+ }
+
+ public void setStrength(int strength) {
+ this.strength.set(strength);
+ }
+
+ public int getStrength() {
+ return strength.get();
+ }
+}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/util/PasswordStrengthUtil.java b/main/ui/src/main/java/org/cryptomator/ui/util/PasswordStrengthUtil.java
index 2f110d54d..ac0766dd6 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/util/PasswordStrengthUtil.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/util/PasswordStrengthUtil.java
@@ -49,6 +49,7 @@ public class PasswordStrengthUtil {
}
}
+ @Deprecated
public Color getStrengthColor(Number score) {
switch (score.intValue()) {
case 0:
@@ -66,12 +67,14 @@ public class PasswordStrengthUtil {
}
}
+ @Deprecated
public Background getBackgroundWithStrengthColor(Number score) {
Color c = this.getStrengthColor(score);
BackgroundFill fill = new BackgroundFill(c, CornerRadii.EMPTY, Insets.EMPTY);
return new Background(fill);
}
+ @Deprecated
public Background getBackgroundWithStrengthColor(Number score, Number threshold) {
return score.intValue() >= threshold.intValue() ? getBackgroundWithStrengthColor(score) : getBackgroundWithStrengthColor(-1);
}
diff --git a/main/ui/src/main/resources/css/dark_theme.css b/main/ui/src/main/resources/css/dark_theme.css
index 9379dbbff..b052ea7e1 100644
--- a/main/ui/src/main/resources/css/dark_theme.css
+++ b/main/ui/src/main/resources/css/dark_theme.css
@@ -347,6 +347,36 @@
-fx-background-color: SECONDARY;
}
+/*******************************************************************************
+ * *
+ * Password Strength Indicator *
+ * *
+ ******************************************************************************/
+
+.password-strength-indicator .segment {
+ -fx-background-color: #ffffff;
+}
+
+.password-strength-indicator.strength-0 .segment.active {
+ -fx-background-color: #e74c3c;
+}
+
+.password-strength-indicator.strength-1 .segment.active {
+ -fx-background-color: #e67e22;
+}
+
+.password-strength-indicator.strength-2 .segment.active {
+ -fx-background-color: #f1c40f;
+}
+
+.password-strength-indicator.strength-3 .segment.active {
+ -fx-background-color: #40d47e;
+}
+
+.password-strength-indicator.strength-4 .segment.active {
+ -fx-background-color: #27ae60;
+}
+
/*******************************************************************************
* *
* ButtonGroup *
diff --git a/main/ui/src/main/resources/css/light_theme.css b/main/ui/src/main/resources/css/light_theme.css
index 1e97f6921..05a7ed24b 100644
--- a/main/ui/src/main/resources/css/light_theme.css
+++ b/main/ui/src/main/resources/css/light_theme.css
@@ -347,6 +347,36 @@
-fx-background-color: SECONDARY;
}
+/*******************************************************************************
+ * *
+ * Password Strength Indicator *
+ * *
+ ******************************************************************************/
+
+.password-strength-indicator .segment {
+ -fx-background-color: #ffffff;
+}
+
+.password-strength-indicator.strength-0 .segment.active {
+ -fx-background-color: #e74c3c;
+}
+
+.password-strength-indicator.strength-1 .segment.active {
+ -fx-background-color: #e67e22;
+}
+
+.password-strength-indicator.strength-2 .segment.active {
+ -fx-background-color: #f1c40f;
+}
+
+.password-strength-indicator.strength-3 .segment.active {
+ -fx-background-color: #40d47e;
+}
+
+.password-strength-indicator.strength-4 .segment.active {
+ -fx-background-color: #27ae60;
+}
+
/*******************************************************************************
* *
* ButtonGroup *
diff --git a/main/ui/src/main/resources/fxml/addvault_new_password.fxml b/main/ui/src/main/resources/fxml/addvault_new_password.fxml
index 9eac74abe..f116ff2a4 100644
--- a/main/ui/src/main/resources/fxml/addvault_new_password.fxml
+++ b/main/ui/src/main/resources/fxml/addvault_new_password.fxml
@@ -10,6 +10,7 @@
+
-
-
-
-
-
-
-
+
diff --git a/main/ui/src/main/resources/fxml/changepassword.fxml b/main/ui/src/main/resources/fxml/changepassword.fxml
index e112d8ca3..03eb4c180 100644
--- a/main/ui/src/main/resources/fxml/changepassword.fxml
+++ b/main/ui/src/main/resources/fxml/changepassword.fxml
@@ -12,6 +12,7 @@
+
-
-
-
-
-
-
-
+