Browse Source

on 409 repsonse of registerDevice-request, show setupFailed with adjusted message

Armin Schrenk 1 year ago
parent
commit
1199ef40dd

+ 6 - 0
src/main/java/org/cryptomator/ui/keyloading/hub/DeviceAlreadyExistsException.java

@@ -0,0 +1,6 @@
+package org.cryptomator.ui.keyloading.hub;
+
+/**
+ * Thrown, when Hub registerDevice-Request returns with 409
+ */
+public class DeviceAlreadyExistsException extends RuntimeException {}

+ 8 - 0
src/main/java/org/cryptomator/ui/keyloading/hub/HubKeyLoadingModule.java

@@ -72,6 +72,14 @@ public abstract class HubKeyLoadingModule {
 		return new CompletableFuture<>();
 	}
 
+	@Provides
+	@KeyLoadingScoped
+	@Named("registerException")
+	static AtomicReference<Throwable> provideRegisterException() {
+		return new AtomicReference<>();
+	}
+
+
 	@Binds
 	@IntoMap
 	@KeyLoadingScoped

+ 13 - 16
src/main/java/org/cryptomator/ui/keyloading/hub/RegisterDeviceController.java

@@ -40,6 +40,7 @@ import java.text.ParseException;
 import java.time.Duration;
 import java.time.Instant;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionException;
 import java.util.concurrent.ExecutorService;
@@ -55,6 +56,7 @@ public class RegisterDeviceController implements FxController {
 	private final Stage window;
 	private final HubConfig hubConfig;
 	private final String bearerToken;
+	private final AtomicReference<Throwable> registerException;
 	private final Lazy<Scene> registerSuccessScene;
 	private final Lazy<Scene> registerFailedScene;
 	private final String deviceId;
@@ -62,7 +64,6 @@ public class RegisterDeviceController implements FxController {
 	private final CompletableFuture<ReceivedKey> result;
 	private final HttpClient httpClient;
 
-	private final BooleanProperty deviceNameAlreadyExists = new SimpleBooleanProperty(false);
 	private final BooleanProperty invalidSetupCode = new SimpleBooleanProperty(false);
 	private final BooleanProperty workInProgress = new SimpleBooleanProperty(false);
 	public TextField setupCodeField;
@@ -70,13 +71,14 @@ public class RegisterDeviceController implements FxController {
 	public Button registerBtn;
 
 	@Inject
-	public RegisterDeviceController(@KeyLoading Stage window, ExecutorService executor, HubConfig hubConfig, @Named("deviceId") String deviceId, DeviceKey deviceKey, CompletableFuture<ReceivedKey> result, @Named("bearerToken") AtomicReference<String> bearerToken, @FxmlScene(FxmlFile.HUB_REGISTER_SUCCESS) Lazy<Scene> registerSuccessScene, @FxmlScene(FxmlFile.HUB_REGISTER_FAILED) Lazy<Scene> registerFailedScene) {
+	public RegisterDeviceController(@KeyLoading Stage window, ExecutorService executor, HubConfig hubConfig, @Named("deviceId") String deviceId, DeviceKey deviceKey, CompletableFuture<ReceivedKey> result, @Named("bearerToken") AtomicReference<String> bearerToken, @Named("registerException") AtomicReference<Throwable> registerException, @FxmlScene(FxmlFile.HUB_REGISTER_SUCCESS) Lazy<Scene> registerSuccessScene, @FxmlScene(FxmlFile.HUB_REGISTER_FAILED) Lazy<Scene> registerFailedScene) {
 		this.window = window;
 		this.hubConfig = hubConfig;
 		this.deviceId = deviceId;
 		this.deviceKeyPair = Objects.requireNonNull(deviceKey.get());
 		this.result = result;
 		this.bearerToken = Objects.requireNonNull(bearerToken.get());
+		this.registerException = registerException;
 		this.registerSuccessScene = registerSuccessScene;
 		this.registerFailedScene = registerFailedScene;
 		this.window.addEventHandler(WindowEvent.WINDOW_HIDING, this::windowClosed);
@@ -85,7 +87,6 @@ public class RegisterDeviceController implements FxController {
 
 	public void initialize() {
 		deviceNameField.setText(determineHostname());
-		deviceNameField.textProperty().addListener(observable -> deviceNameAlreadyExists.set(false));
 		deviceNameField.disableProperty().bind(workInProgress);
 		setupCodeField.textProperty().addListener(observable -> invalidSetupCode.set(false));
 		setupCodeField.disableProperty().bind(workInProgress);
@@ -146,7 +147,7 @@ public class RegisterDeviceController implements FxController {
 					return httpClient.sendAsync(putDeviceReq, HttpResponse.BodyHandlers.discarding());
 				}).whenCompleteAsync((response, throwable) -> {
 					if (response != null) {
-						this.handleResponse(response);
+						this.handleRegisterDeviceResponse(response);
 					} else {
 						this.setupFailed(throwable);
 					}
@@ -170,12 +171,12 @@ public class RegisterDeviceController implements FxController {
 		}
 	}
 
-	private void handleResponse(HttpResponse<Void> response) {
+	private void handleRegisterDeviceResponse(HttpResponse<Void> response) {
 		if (response.statusCode() == 201) {
 			LOG.debug("Device registration for hub instance {} successful.", hubConfig.authSuccessUrl);
 			window.setScene(registerSuccessScene.get());
 		} else if (response.statusCode() == 409) {
-			deviceNameAlreadyExists.set(true);
+			setupFailed(new DeviceAlreadyExistsException());
 		} else {
 			setupFailed(new IllegalStateException("Unexpected http status code " + response.statusCode()));
 		}
@@ -185,7 +186,12 @@ public class RegisterDeviceController implements FxController {
 		switch (cause) {
 			case CompletionException e when e.getCause() instanceof JWEHelper.InvalidJweKeyException -> invalidSetupCode.set(true);
 			default -> {
-				LOG.warn("Device setup failed.", cause);
+				if(cause instanceof DeviceAlreadyExistsException) {
+					LOG.debug("Device already registered in hub instance {} for different user", hubConfig.authSuccessUrl);
+				} else {
+					LOG.warn("Device setup failed.", cause);
+				}
+				registerException.set(cause);
 				window.setScene(registerFailedScene.get());
 				result.completeExceptionally(cause);
 			}
@@ -202,15 +208,6 @@ public class RegisterDeviceController implements FxController {
 	}
 
 	//--- Getters & Setters
-
-	public BooleanProperty deviceNameAlreadyExistsProperty() {
-		return deviceNameAlreadyExists;
-	}
-
-	public boolean getDeviceNameAlreadyExists() {
-		return deviceNameAlreadyExists.get();
-	}
-
 	public BooleanProperty invalidSetupCodeProperty() {
 		return invalidSetupCode;
 	}

+ 16 - 5
src/main/java/org/cryptomator/ui/keyloading/hub/RegisterFailedController.java

@@ -1,23 +1,27 @@
 package org.cryptomator.ui.keyloading.hub;
 
-import com.nimbusds.jose.JWEObject;
 import org.cryptomator.ui.common.FxController;
 import org.cryptomator.ui.keyloading.KeyLoading;
 
 import javax.inject.Inject;
+import javax.inject.Named;
+import javafx.beans.property.BooleanProperty;
+import javafx.beans.property.SimpleBooleanProperty;
 import javafx.fxml.FXML;
 import javafx.stage.Stage;
-import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.atomic.AtomicReference;
 
 public class RegisterFailedController implements FxController {
 
 	private final Stage window;
-	private final CompletableFuture<ReceivedKey> result;
+	private final Throwable registerException;
+	private final SimpleBooleanProperty deviceAlreadyExisting;
 
 	@Inject
-	public RegisterFailedController(@KeyLoading Stage window, CompletableFuture<ReceivedKey> result) {
+	public RegisterFailedController(@KeyLoading Stage window, @Named("registerException") AtomicReference<Throwable> registerExceptionRef) {
 		this.window = window;
-		this.result = result;
+		this.registerException = registerExceptionRef.get();
+		this.deviceAlreadyExisting = new SimpleBooleanProperty(registerException instanceof DeviceAlreadyExistsException);
 	}
 
 	@FXML
@@ -25,5 +29,12 @@ public class RegisterFailedController implements FxController {
 		window.close();
 	}
 
+	public boolean isDeviceAlreadyExisting() {
+		return deviceAlreadyExisting.get();
+	}
+
+	public boolean isGenericError() {
+		return !deviceAlreadyExisting.get();
+	}
 
 }

+ 0 - 9
src/main/resources/fxml/hub_register_device.fxml

@@ -57,15 +57,6 @@
 				<TextField fx:id="deviceNameField" HBox.hgrow="ALWAYS"/>
 			</HBox>
 			<HBox alignment="TOP_RIGHT">
-				<Label text="%hub.register.occupiedMsg" textAlignment="RIGHT" alignment="CENTER_RIGHT" visible="${controller.deviceNameAlreadyExists}" managed="${controller.deviceNameAlreadyExists}" graphicTextGap="6">
-					<padding>
-						<Insets top="6"/>
-					</padding>
-					<graphic>
-						<FontAwesome5IconView glyph="TIMES" styleClass="glyph-icon-red"/>
-					</graphic>
-				</Label>
-
 				<Label text="%hub.register.invalidAccountKeyLabel" textAlignment="RIGHT" alignment="CENTER_RIGHT" visible="${controller.invalidSetupCode}" managed="${controller.invalidSetupCode}" graphicTextGap="6">
 					<padding>
 						<Insets top="6"/>

+ 2 - 1
src/main/resources/fxml/hub_register_failed.fxml

@@ -38,7 +38,8 @@
 					<Insets bottom="6" top="6"/>
 				</padding>
 			</Label>
-			<Label text="%hub.registerFailed.description" wrapText="true"/>
+			<Label text="%hub.registerFailed.description.generic" wrapText="true" visible="${controller.genericError}" managed="${controller.genericError}"/>
+			<Label text="%hub.registerFailed.description.deviceAlreadyExists" wrapText="true" visible="${controller.deviceAlreadyExisting}" managed="${controller.deviceAlreadyExisting}"/>
 
 			<Region VBox.vgrow="ALWAYS" minHeight="18"/>
 			<ButtonBar buttonMinWidth="120" buttonOrder="+C">

+ 3 - 2
src/main/resources/i18n/strings.properties

@@ -158,14 +158,15 @@ hub.register.message=New Device
 hub.register.description=This is the first Hub access from this device. Please authorize it using your Account Key.
 hub.register.nameLabel=Device Name
 hub.register.invalidAccountKeyLabel=Invalid Account Key
-hub.register.occupiedMsg=Name already in use
+hub.register.occupiedMsg=Device already registered by another user
 hub.register.registerBtn=Confirm
 ### Registration Success
 hub.registerSuccess.message=Device named
 hub.registerSuccess.description=To access the vault, your device needs to be authorized by the vault owner.
 ### Registration Failed
 hub.registerFailed.message=Device naming failed
-hub.registerFailed.description=An error was thrown in the naming process. For more details, look into the application log.
+hub.registerFailed.description.generic=An error was thrown in the naming process. For more details, look into the application log.
+hub.registerFailed.description.deviceAlreadyExists=This device is already registered for a different user. Try to change the user account or use a different device.
 ### Unauthorized
 hub.unauthorized.message=Access denied
 hub.unauthorized.description=Your device has not yet been authorized to access this vault. Ask the vault owner to authorize it.