From e865eaf4125bbc4f267f1116b16b5ba4cf0d1c92 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Thu, 12 Aug 2021 17:38:50 +0200 Subject: [PATCH] added quick & dirty device registration --- .../keyloading/hub/ReceiveKeyController.java | 46 ++++++++++++++----- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java b/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java index 7597f2b6e..c87a09efc 100644 --- a/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java +++ b/src/main/java/org/cryptomator/ui/keyloading/hub/ReceiveKeyController.java @@ -1,7 +1,9 @@ package org.cryptomator.ui.keyloading.hub; import com.google.common.base.Preconditions; +import com.google.common.base.Strings; import com.google.common.io.BaseEncoding; +import com.google.gson.Gson; import com.google.gson.JsonElement; import org.cryptomator.common.vaults.Vault; import org.cryptomator.ui.common.ErrorComponent; @@ -45,6 +47,7 @@ public class ReceiveKeyController implements FxController { private final Stage window; private final String bearerToken; + private final KeyPair keyPair; private final AtomicReference eciesParamsRef; private final UserInteractionLock result; private final ErrorComponent.Builder errorComponent; @@ -58,19 +61,18 @@ public class ReceiveKeyController implements FxController { public ReceiveKeyController(@KeyLoading Vault vault, ExecutorService executor, @KeyLoading Stage window, AtomicReference keyPairRef, @Named("bearerToken") AtomicReference tokenRef, AtomicReference eciesParamsRef, UserInteractionLock result, ErrorComponent.Builder errorComponent) { this.window = window; this.bearerToken = Objects.requireNonNull(tokenRef.get()); + this.keyPair = Objects.requireNonNull(keyPairRef.get()); this.eciesParamsRef = eciesParamsRef; this.result = result; this.errorComponent = errorComponent; this.vaultBaseUri = getVaultBaseUri(vault); this.window.addEventHandler(WindowEvent.WINDOW_HIDING, this::windowClosed); this.httpClient = HttpClient.newBuilder().executor(executor).build(); -// var deviceKey = BaseEncoding.base64Url().omitPadding().encode(keyPairRef.get().getPublic().getEncoded()); -// LOG.info("deviceKey {}", deviceKey); } @FXML public void initialize() { - var keyUri = appendPath(vaultBaseUri, "/keys/desktop-app-3000"); // TODO use actual device id + var keyUri = appendPath(vaultBaseUri, "/keys/desktop-app"); // TODO use actual device id var request = HttpRequest.newBuilder(keyUri) // .header("Authorization", "Bearer " + bearerToken) // .GET() // @@ -93,14 +95,36 @@ public class ReceiveKeyController implements FxController { @FXML public void register() { - Preconditions.checkArgument(deviceName.textProperty().isNotEmpty().get(), "device name must not be empty"); -// var keyUri = appendPath(vaultBaseUri, "../../devices/desktop-app-3000"); -// var request = HttpRequest.newBuilder(keyUri) // -// .header("Authorization", "Bearer " + bearerToken) // -// .GET() // -// .build(); -// httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofInputStream()) // -// .whenCompleteAsync(this::loadedExistingKey, Platform::runLater); + Preconditions.checkArgument(!Strings.isNullOrEmpty(deviceName.getText()), "device name must not be empty"); + var deviceKey = BaseEncoding.base64Url().omitPadding().encode(keyPair.getPublic().getEncoded()); + var json = """ + { + "id": "desktop-app", + "name": "%s", + "publicKey": "%s" + } + """.formatted(deviceName.getText(), deviceKey); // TODO use gson + + var regUri = URI.create("http://localhost:9090/devices/desktop-app"); // TODO read api base from vault config! + var request = HttpRequest.newBuilder(regUri) // + .header("Authorization", "Bearer " + bearerToken) // + .header("Content-Type", "application/json; charset=UTF-8") // + .PUT(HttpRequest.BodyPublishers.ofString(json)) // + .build(); + httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofInputStream()) // + .whenCompleteAsync(this::createdNewDevice, Platform::runLater); + } + + private void createdNewDevice(HttpResponse response, Throwable error) { + if (error != null) { + retrievalFailed(error); + } else { + switch (response.statusCode()) { + case 201 -> LOG.info("TODO device created, waiting for authorization"); + case 409 -> LOG.info("TODO device already exists. still waiting for authorization"); + default -> retrievalFailed(new IOException("Unexpected response " + response.statusCode())); + } + } } private void retrievalSucceeded(HttpResponse response) {