diff --git a/providers/jikkou-provider-kafka-connect/pom.xml b/providers/jikkou-provider-kafka-connect/pom.xml index 4975fb29f..687a8f58e 100644 --- a/providers/jikkou-provider-kafka-connect/pom.xml +++ b/providers/jikkou-provider-kafka-connect/pom.xml @@ -65,6 +65,12 @@ 1.21.4 test + + com.squareup.okhttp3 + mockwebserver + ${mockwebserver.version} + test + diff --git a/providers/jikkou-provider-kafka-connect/src/main/java/io/jikkou/kafka/connect/api/KafkaConnectApiFactory.java b/providers/jikkou-provider-kafka-connect/src/main/java/io/jikkou/kafka/connect/api/KafkaConnectApiFactory.java index dbe83ced8..c6e940b38 100644 --- a/providers/jikkou-provider-kafka-connect/src/main/java/io/jikkou/kafka/connect/api/KafkaConnectApiFactory.java +++ b/providers/jikkou-provider-kafka-connect/src/main/java/io/jikkou/kafka/connect/api/KafkaConnectApiFactory.java @@ -73,7 +73,7 @@ public static KafkaConnectApi create(@NotNull KafkaConnectClientConfig config, @NotNull private static String getAuthorizationHeader(KafkaConnectClientConfig config) { - String basicAuthInfo = config.basicAuthUser() + ":" + config.basicAuthPassword(); + String basicAuthInfo = config.basicAuthUser().get() + ":" + config.basicAuthPassword().get(); return "Basic " + Encoding.BASE64.encode(basicAuthInfo.getBytes(StandardCharsets.UTF_8)); } } diff --git a/providers/jikkou-provider-kafka-connect/src/test/java/io/jikkou/kafka/connect/api/KafkaConnectApiFactoryTest.java b/providers/jikkou-provider-kafka-connect/src/test/java/io/jikkou/kafka/connect/api/KafkaConnectApiFactoryTest.java new file mode 100644 index 000000000..e6f082390 --- /dev/null +++ b/providers/jikkou-provider-kafka-connect/src/test/java/io/jikkou/kafka/connect/api/KafkaConnectApiFactoryTest.java @@ -0,0 +1,69 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright (c) The original authors + * + * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package io.jikkou.kafka.connect.api; + +import io.jikkou.core.config.Configuration; +import io.jikkou.http.client.ssl.SSLConfig; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import mockwebserver3.MockResponse; +import mockwebserver3.MockWebServer; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class KafkaConnectApiFactoryTest { + + private static MockWebServer mockServer = new MockWebServer(); + + @BeforeAll + static void beforeAll() throws IOException { + mockServer = new MockWebServer(); + mockServer.start(); + } + + @AfterAll + static void afterAll() throws IOException { + mockServer.close(); + } + + @Test + @DisplayName("Should build Authorization header from actual basicAuth credentials") + void shouldBuildBasicAuthHeaderFromActualCredentials() throws InterruptedException { + // Given + mockServer.enqueue(new MockResponse.Builder() + .code(200) + .addHeader("Content-Type", "application/json") + .body("[]") + .build()); + KafkaConnectClientConfig config = new KafkaConnectClientConfig( + "test-cluster", + String.format("http://%s:%s", mockServer.getHostName(), mockServer.getPort()), + AuthMethod.BASICAUTH, + () -> "alice", + () -> "secret", + () -> SSLConfig.from(Configuration.empty()), + false + ); + + // When + try (KafkaConnectApi api = KafkaConnectApiFactory.create(config)) { + api.listConnectors(); + } + + // Then + String authorization = mockServer.takeRequest().getHeaders().get("Authorization"); + String expectedCredentials = Base64.getEncoder() + .encodeToString("alice:secret".getBytes(StandardCharsets.UTF_8)); + // result should correspond to base64 encoded string "alice:secret" prefixed with "Basic" + Assertions.assertEquals("Basic " + expectedCredentials, authorization, + "Authorization header must contain the base64-encoded credentials"); + } +}