Browse Source

Merge pull request #730 from Gregvh/read-only-setting

Add read-only option to the advanced settings (references #375)
Sebastian Stenzel 6 years ago
parent
commit
fccd02a7e8

+ 7 - 1
main/commons/src/main/java/org/cryptomator/common/settings/VaultSettings.java

@@ -28,6 +28,7 @@ public class VaultSettings {
 	public static final boolean DEFAULT_UNLOCK_AFTER_STARTUP = false;
 	public static final boolean DEFAULT_REAVEAL_AFTER_MOUNT = true;
 	public static final boolean DEFAULT_USES_INDIVIDUAL_MOUNTPATH = false;
+	public static final boolean DEFAULT_USES_READONLY_MODE = false;
 
 	private final String id;
 	private final ObjectProperty<Path> path = new SimpleObjectProperty<>();
@@ -37,6 +38,7 @@ public class VaultSettings {
 	private final BooleanProperty revealAfterMount = new SimpleBooleanProperty(DEFAULT_REAVEAL_AFTER_MOUNT);
 	private final BooleanProperty usesIndividualMountPath = new SimpleBooleanProperty(DEFAULT_USES_INDIVIDUAL_MOUNTPATH);
 	private final StringProperty individualMountPath = new SimpleStringProperty();
+	private final BooleanProperty usesReadOnlyMode = new SimpleBooleanProperty(DEFAULT_USES_READONLY_MODE);
 
 	public VaultSettings(String id) {
 		this.id = Objects.requireNonNull(id);
@@ -45,7 +47,7 @@ public class VaultSettings {
 	}
 
 	Observable[] observables() {
-		return new Observable[]{path, mountName, winDriveLetter, unlockAfterStartup, revealAfterMount, usesIndividualMountPath, individualMountPath};
+		return new Observable[]{path, mountName, winDriveLetter, unlockAfterStartup, revealAfterMount, usesIndividualMountPath, individualMountPath, usesReadOnlyMode};
 	}
 
 	private void deriveMountNameFromPath(Path path) {
@@ -128,6 +130,10 @@ public class VaultSettings {
 		return individualMountPath;
 	}
 
+	public BooleanProperty usesReadOnlyMode() {
+		return usesReadOnlyMode;
+	}
+
 	/* Hashcode/Equals */
 
 	@Override

+ 6 - 0
main/commons/src/main/java/org/cryptomator/common/settings/VaultSettingsJsonAdapter.java

@@ -29,6 +29,7 @@ class VaultSettingsJsonAdapter {
 		out.name("usesIndividualMountPath").value(value.usesIndividualMountPath().get());
 		//TODO: should this always be written? ( because it could contain metadata, which the user does not want to save!)
 		out.name("individualMountPath").value(value.individualMountPath().get());
+		out.name("usesReadOnlyMode").value(value.usesReadOnlyMode().get());
 		out.endObject();
 	}
 
@@ -41,6 +42,7 @@ class VaultSettingsJsonAdapter {
 		boolean unlockAfterStartup = VaultSettings.DEFAULT_UNLOCK_AFTER_STARTUP;
 		boolean revealAfterMount = VaultSettings.DEFAULT_REAVEAL_AFTER_MOUNT;
 		boolean usesIndividualMountPath = VaultSettings.DEFAULT_USES_INDIVIDUAL_MOUNTPATH;
+		boolean usesReadOnlyMode = VaultSettings.DEFAULT_USES_READONLY_MODE;
 
 		in.beginObject();
 		while (in.hasNext()) {
@@ -70,6 +72,9 @@ class VaultSettingsJsonAdapter {
 				case "individualMountPath":
 					individualMountPath = in.nextString();
 					break;
+				case "usesReadOnlyMode":
+					usesReadOnlyMode = in.nextBoolean();
+					break;
 				default:
 					LOG.warn("Unsupported vault setting found in JSON: " + name);
 					in.skipValue();
@@ -85,6 +90,7 @@ class VaultSettingsJsonAdapter {
 		vaultSettings.revealAfterMount().set(revealAfterMount);
 		vaultSettings.usesIndividualMountPath().set(usesIndividualMountPath);
 		vaultSettings.individualMountPath().set(individualMountPath);
+		vaultSettings.usesReadOnlyMode().set(usesReadOnlyMode);
 		return vaultSettings;
 	}
 

+ 5 - 1
main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java

@@ -141,6 +141,9 @@ public class UnlockController implements ViewController {
 	@FXML
 	private CheckBox unlockAfterStartup;
 
+	@FXML
+	private CheckBox useReadOnlyMode;
+
 	@Override
 	public void initialize() {
 		advancedOptions.managedProperty().bind(advancedOptions.visibleProperty());
@@ -232,11 +235,12 @@ public class UnlockController implements ViewController {
 		unlockAfterStartup.setSelected(savePassword.isSelected() && vaultSettings.unlockAfterStartup().get());
 		revealAfterMount.setSelected(vaultSettings.revealAfterMount().get());
 		useOwnMountPath.setSelected(vaultSettings.usesIndividualMountPath().get());
+		useReadOnlyMode.setSelected(vaultSettings.usesReadOnlyMode().get());
 
 		vaultSubs = vaultSubs.and(EasyBind.subscribe(unlockAfterStartup.selectedProperty(), vaultSettings.unlockAfterStartup()::set));
 		vaultSubs = vaultSubs.and(EasyBind.subscribe(revealAfterMount.selectedProperty(), vaultSettings.revealAfterMount()::set));
 		vaultSubs = vaultSubs.and(EasyBind.subscribe(useOwnMountPath.selectedProperty(), vaultSettings.usesIndividualMountPath()::set));
-
+		vaultSubs = vaultSubs.and(EasyBind.subscribe(useReadOnlyMode.selectedProperty(), vaultSettings.usesReadOnlyMode()::set));
 
 		mountPath.textProperty().setValue(vaultSettings.individualMountPath().getValueSafe());
 

+ 11 - 8
main/ui/src/main/resources/fxml/unlock.fxml

@@ -82,16 +82,19 @@
 			
 			<!-- Row 3.4 -->
 			<CheckBox GridPane.rowIndex="4" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="revealAfterMount" text="%unlock.label.revealAfterMount" cacheShape="true" cache="true" />
-			
-			<!-- Row 3.5 Alt1 -->
-			<Label GridPane.rowIndex="5" GridPane.columnIndex="0" fx:id="winDriveLetterLabel" text="%unlock.label.winDriveLetter" cacheShape="true" cache="true" />
-			<ChoiceBox GridPane.rowIndex="5" GridPane.columnIndex="1" fx:id="winDriveLetter" GridPane.hgrow="ALWAYS" maxWidth="Infinity" cacheShape="true" cache="true" />
 
-			<!-- Row 3.5 Alt2 -->
-			<CheckBox GridPane.rowIndex="5" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="useOwnMountPath" text="%unlock.label.useOwnMountPath" cacheShape="true" cache="true" />
+			<!-- Row 3.5 -->
+			<CheckBox GridPane.rowIndex="5" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="useReadOnlyMode" text="%unlock.label.useReadOnlyMode" cacheShape="true" cache="true" />
+
+			<!-- Row 3.6 Alt1 -->
+			<Label GridPane.rowIndex="6" GridPane.columnIndex="0" fx:id="winDriveLetterLabel" text="%unlock.label.winDriveLetter" cacheShape="true" cache="true" />
+			<ChoiceBox GridPane.rowIndex="6" GridPane.columnIndex="1" fx:id="winDriveLetter" GridPane.hgrow="ALWAYS" maxWidth="Infinity" cacheShape="true" cache="true" />
+
+			<!-- Row 3.6 Alt2 -->
+			<CheckBox GridPane.rowIndex="6" GridPane.columnIndex="0" GridPane.columnSpan="2" fx:id="useOwnMountPath" text="%unlock.label.useOwnMountPath" cacheShape="true" cache="true" />
 
-			<Label GridPane.rowIndex="6" GridPane.columnIndex="0" fx:id="mountPathLabel" text="%unlock.label.mountPath" cacheShape="true" cache="true" />
-			<TextField GridPane.rowIndex="6" GridPane.columnIndex="1" fx:id="mountPath" GridPane.hgrow="ALWAYS" maxWidth="Infinity" cacheShape="true" cache="true" />
+			<Label GridPane.rowIndex="7" GridPane.columnIndex="0" fx:id="mountPathLabel" text="%unlock.label.mountPath" cacheShape="true" cache="true" />
+			<TextField GridPane.rowIndex="7" GridPane.columnIndex="1" fx:id="mountPath" GridPane.hgrow="ALWAYS" maxWidth="Infinity" cacheShape="true" cache="true" />
 
 		</GridPane>
 		

+ 1 - 0
main/ui/src/main/resources/localization/en.txt

@@ -73,6 +73,7 @@ unlock.label.savePassword=Save Password
 unlock.label.mountName=Drive Name
 unlock.label.unlockAfterStartup=Auto-Unlock on Start (Experimental)
 unlock.label.revealAfterMount=Reveal Drive
+unlock.label.useReadOnlyMode=Read-only
 unlock.label.winDriveLetter=Drive Letter
 unlock.label.useOwnMountPath=Use individual mount point
 unlock.label.mountPath=Mount path