From 5c31a34d5f30dec6c920bec164400461f2856821 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Fri, 8 Jul 2022 11:33:59 +0200 Subject: [PATCH 1/2] Show message in register dialog if device name is already in use --- .../hub/RegisterDeviceController.java | 47 +++++++++++++++++-- .../resources/fxml/hub_register_device.fxml | 19 +++++++- src/main/resources/i18n/strings.properties | 1 + 3 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/keyloading/hub/RegisterDeviceController.java b/src/main/java/org/cryptomator/ui/keyloading/hub/RegisterDeviceController.java index b63a8676a..3f45c89e8 100644 --- a/src/main/java/org/cryptomator/ui/keyloading/hub/RegisterDeviceController.java +++ b/src/main/java/org/cryptomator/ui/keyloading/hub/RegisterDeviceController.java @@ -20,8 +20,12 @@ import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.inject.Named; import javafx.application.Platform; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; import javafx.fxml.FXML; import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.ContentDisplay; import javafx.scene.control.TextField; import javafx.stage.Stage; import javafx.stage.WindowEvent; @@ -32,6 +36,7 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; +import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; @@ -42,6 +47,7 @@ public class RegisterDeviceController implements FxController { private static final Logger LOG = LoggerFactory.getLogger(RegisterDeviceController.class); private static final Gson GSON = new GsonBuilder().setLenient().create(); + private static final List EXPECTED_RESPONSE_CODES = List.of(201, 409); private final Stage window; private final HubConfig hubConfig; @@ -53,8 +59,10 @@ public class RegisterDeviceController implements FxController { private final CompletableFuture result; private final DecodedJWT jwt; private final HttpClient httpClient; + private final BooleanProperty deviceNameAlreadyExists = new SimpleBooleanProperty(false); public TextField deviceNameField; + public Button registerBtn; @Inject public RegisterDeviceController(@KeyLoading Stage window, ExecutorService executor, HubConfig hubConfig, @Named("deviceId") String deviceId, DeviceKey deviceKey, CompletableFuture result, @Named("bearerToken") AtomicReference bearerToken, @FxmlScene(FxmlFile.HUB_REGISTER_SUCCESS) Lazy registerSuccessScene, @FxmlScene(FxmlFile.HUB_REGISTER_FAILED) Lazy registerFailedScene) { @@ -86,6 +94,10 @@ public class RegisterDeviceController implements FxController { @FXML public void register() { + deviceNameAlreadyExists.set(false); + registerBtn.setContentDisplay(ContentDisplay.LEFT); + registerBtn.setDisable(true); + var keyUri = URI.create(hubConfig.devicesResourceUrl + deviceId); var deviceKey = keyPair.getPublic().getEncoded(); var dto = new CreateDeviceDto(); @@ -98,9 +110,15 @@ public class RegisterDeviceController implements FxController { .header("Content-Type", "application/json").PUT(HttpRequest.BodyPublishers.ofString(json, StandardCharsets.UTF_8)) // .build(); httpClient.sendAsync(request, HttpResponse.BodyHandlers.discarding()) // - .handleAsync((response, throwable) -> { + .thenApply(response -> { + if (EXPECTED_RESPONSE_CODES.contains(response.statusCode())) { + return response; + } else { + throw new RuntimeException("Server answered with unexpected status code " + response.statusCode()); + } + }).handleAsync((response, throwable) -> { if (response != null) { - this.registrationSucceeded(response); + this.handleResponse(response); } else { this.registrationFailed(throwable); } @@ -108,9 +126,17 @@ public class RegisterDeviceController implements FxController { }, Platform::runLater); } - private void registrationSucceeded(HttpResponse voidHttpResponse) { - LOG.debug("Device registration for hub instance {} successful.", hubConfig.authSuccessUrl); - window.setScene(registerSuccessScene.get()); + private void handleResponse(HttpResponse voidHttpResponse) { + assert EXPECTED_RESPONSE_CODES.contains(voidHttpResponse.statusCode()); + + if (voidHttpResponse.statusCode() == 409) { + deviceNameAlreadyExists.set(true); + registerBtn.setContentDisplay(ContentDisplay.TEXT_ONLY); + registerBtn.setDisable(false); + } else { + LOG.debug("Device registration for hub instance {} successful.", hubConfig.authSuccessUrl); + window.setScene(registerSuccessScene.get()); + } } private void registrationFailed(Throwable cause) { @@ -135,4 +161,15 @@ public class RegisterDeviceController implements FxController { } + //--- Getters & Setters + + public BooleanProperty deviceNameAlreadyExistsProperty() { + return deviceNameAlreadyExists; + } + + public boolean getDeviceNameAlreadyExists() { + return deviceNameAlreadyExists.get(); + } + + } diff --git a/src/main/resources/fxml/hub_register_device.fxml b/src/main/resources/fxml/hub_register_device.fxml index ff361e60b..8db67c272 100644 --- a/src/main/resources/fxml/hub_register_device.fxml +++ b/src/main/resources/fxml/hub_register_device.fxml @@ -12,6 +12,7 @@ + + + + - diff --git a/src/main/resources/i18n/strings.properties b/src/main/resources/i18n/strings.properties index a7f59b63d..4b8db7eda 100644 --- a/src/main/resources/i18n/strings.properties +++ b/src/main/resources/i18n/strings.properties @@ -136,6 +136,7 @@ hub.receive.description=Cryptomator is receiving and processing the response fro hub.register.message=Device name required hub.register.description=This seems to be the first Hub access from this device. In order to identify it for access authorization, you need to name this device. hub.register.nameLabel=Device Name +hub.register.occupiedMsg=Name already in use hub.register.registerBtn=Confirm ### Registration Success hub.registerSuccess.message=Device named From a7fc8d6fc4e695833d69dbfb553469c56ebfdcee Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Fri, 8 Jul 2022 12:03:38 +0200 Subject: [PATCH 2/2] hide alreadyExistingLabel when deviceName changed by user --- .../cryptomator/ui/keyloading/hub/RegisterDeviceController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/cryptomator/ui/keyloading/hub/RegisterDeviceController.java b/src/main/java/org/cryptomator/ui/keyloading/hub/RegisterDeviceController.java index 3f45c89e8..bd997d994 100644 --- a/src/main/java/org/cryptomator/ui/keyloading/hub/RegisterDeviceController.java +++ b/src/main/java/org/cryptomator/ui/keyloading/hub/RegisterDeviceController.java @@ -81,6 +81,7 @@ public class RegisterDeviceController implements FxController { public void initialize() { deviceNameField.setText(determineHostname()); + deviceNameField.textProperty().addListener(observable -> deviceNameAlreadyExists.set(false)); } private String determineHostname() {