Skip to content

Commit d68a4ab

Browse files
committed
#36 Add tests for auth header generation
Signed-off-by: Sven Strittmatter <sven.strittmatter@iteratec.com>
1 parent 2e35251 commit d68a4ab

File tree

5 files changed

+103
-12
lines changed

5 files changed

+103
-12
lines changed

src/main/java/io/securecodebox/persistence/defectdojo/config/Config.java

+10
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,16 @@ public final class Config {
5252
*/
5353
private final int maxPageCountForGets;
5454

55+
/**
56+
* Convenience constructor which sets {@link #DEFAULT_MAX_PAGE_COUNT_FOR_GETS}
57+
*
58+
* @param url not {@code null}
59+
* @param apiKey not {@code null}
60+
*/
61+
public Config(final @NonNull String url, final @NonNull String apiKey) {
62+
this(url, apiKey, DEFAULT_MAX_PAGE_COUNT_FOR_GETS);
63+
}
64+
5565
/**
5666
* Dedicated constructor
5767
*

src/main/java/io/securecodebox/persistence/defectdojo/http/Foo.java

+18-8
Original file line numberDiff line numberDiff line change
@@ -26,27 +26,37 @@
2626
*/
2727
public final class Foo {
2828
private final Config config;
29+
private final ProxyConfig proxyConfig;
2930

30-
public Foo(@NonNull final Config config) {
31+
public Foo(@NonNull final Config config, @NonNull final ProxyConfig proxyConfig) {
3132
super();
3233
this.config = config;
34+
this.proxyConfig = proxyConfig;
3335
}
3436

35-
public HttpHeaders getDefectDojoAuthorizationHeaders() {
37+
/**
38+
* This method generates appropriate authorization headers
39+
*
40+
* @return never {@code null}
41+
*/
42+
public HttpHeaders generateAuthorizationHeaders() {
3643
HttpHeaders headers = new HttpHeaders();
37-
headers.set("Authorization", "Token " + this.config.getApiKey());
44+
headers.set(HttpHeaders.AUTHORIZATION, "Token " + this.config.getApiKey());
3845

39-
String username = System.getProperty("http.proxyUser", "");
40-
String password = System.getProperty("http.proxyPassword", "");
41-
42-
if (!username.isEmpty() || !password.isEmpty()) {
46+
if (proxyConfig.isComplete()) {
47+
// FIXME: System.out logging is a real bad code smell. Standard loging should be used.
4348
System.out.println("Setting Proxy Auth Header...");
44-
headers.set(HttpHeaders.PROXY_AUTHORIZATION, "Basic " + Base64.getEncoder().encodeToString((username + ':' + password).getBytes(StandardCharsets.UTF_8)));
49+
headers.set(HttpHeaders.PROXY_AUTHORIZATION, "Basic " + encodeProxyCredentials(proxyConfig));
4550
}
4651

4752
return headers;
4853
}
4954

55+
static String encodeProxyCredentials(@NonNull final ProxyConfig cfg) {
56+
final var credential = String.format("%s:%s", cfg.getUser(), cfg.getPassword());
57+
return Base64.getEncoder().encodeToString(credential.getBytes(StandardCharsets.UTF_8));
58+
}
59+
5060
public RestTemplate setupRestTemplate() {
5161
RestTemplate restTemplate;
5262

src/main/java/io/securecodebox/persistence/defectdojo/service/GenericDefectDojoService.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.securecodebox.persistence.defectdojo.config.Config;
1414
import io.securecodebox.persistence.defectdojo.exception.LoopException;
1515
import io.securecodebox.persistence.defectdojo.http.Foo;
16+
import io.securecodebox.persistence.defectdojo.http.ProxyConfigFactory;
1617
import io.securecodebox.persistence.defectdojo.model.BaseModel;
1718
import io.securecodebox.persistence.defectdojo.model.Engagement;
1819
import io.securecodebox.persistence.defectdojo.model.Response;
@@ -66,11 +67,11 @@ public GenericDefectDojoService(Config config) {
6667
* @return The DefectDojo Authentication Header
6768
*/
6869
private HttpHeaders getDefectDojoAuthorizationHeaders() {
69-
return new Foo(config).getDefectDojoAuthorizationHeaders();
70+
return new Foo(config, new ProxyConfigFactory().create()).generateAuthorizationHeaders();
7071
}
7172

7273
private RestTemplate setupRestTemplate() {
73-
RestTemplate restTemplate = new Foo(config).setupRestTemplate();
74+
RestTemplate restTemplate = new Foo(config, new ProxyConfigFactory().create()).setupRestTemplate();
7475
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
7576
converter.setObjectMapper(this.objectMapper);
7677
restTemplate.setMessageConverters(List.of(

src/main/java/io/securecodebox/persistence/defectdojo/service/ImportScanService2.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.securecodebox.persistence.defectdojo.config.Config;
1010
import io.securecodebox.persistence.defectdojo.exception.PersistenceException;
1111
import io.securecodebox.persistence.defectdojo.http.Foo;
12+
import io.securecodebox.persistence.defectdojo.http.ProxyConfigFactory;
1213
import io.securecodebox.persistence.defectdojo.model.ScanFile;
1314
import lombok.Data;
1415
import org.springframework.core.io.ByteArrayResource;
@@ -49,11 +50,11 @@ public ImportScanService2(Config config) {
4950
* @return The DefectDojo Authentication Header
5051
*/
5152
private HttpHeaders getDefectDojoAuthorizationHeaders() {
52-
return new Foo(config).getDefectDojoAuthorizationHeaders();
53+
return new Foo(config, new ProxyConfigFactory().create()).generateAuthorizationHeaders();
5354
}
5455

5556
protected RestTemplate setupRestTemplate() {
56-
return new Foo(config).setupRestTemplate();
57+
return new Foo(config, new ProxyConfigFactory().create()).setupRestTemplate();
5758
}
5859

5960
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// SPDX-FileCopyrightText: the secureCodeBox authors
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
package io.securecodebox.persistence.defectdojo.http;
6+
7+
import io.securecodebox.persistence.defectdojo.config.Config;
8+
import lombok.NonNull;
9+
import org.junit.jupiter.api.Disabled;
10+
import org.junit.jupiter.api.Test;
11+
import org.springframework.http.HttpHeaders;
12+
13+
import static org.junit.jupiter.api.Assertions.*;
14+
import static org.hamcrest.MatcherAssert.assertThat;
15+
import static org.hamcrest.Matchers.*;
16+
17+
/**
18+
* Tests for {@link Foo}
19+
*/
20+
class FooTest {
21+
private final Config config = new Config("url", "apikey");
22+
23+
@Test
24+
void generateAuthorizationHeaders_withoutProxyAuth() {
25+
final var incompleteProxyConfig = ProxyConfig.NULL;
26+
27+
final var sut = new Foo(config, incompleteProxyConfig);
28+
29+
assertAll(
30+
() -> assertThat(
31+
sut.generateAuthorizationHeaders().get(HttpHeaders.AUTHORIZATION),
32+
contains("Token apikey")),
33+
() -> assertThat(
34+
sut.generateAuthorizationHeaders().get(HttpHeaders.PROXY_AUTHORIZATION),
35+
not(contains("Basic dXNlcjpwdw==")))
36+
);
37+
}
38+
39+
@Test
40+
void generateAuthorizationHeaders_withProxyAuth() {
41+
final var completeProxyConfig = ProxyConfig.builder()
42+
.user("user")
43+
.password("pw")
44+
.host("host")
45+
.port(42)
46+
.build();
47+
48+
final var sut = new Foo(config, completeProxyConfig);
49+
50+
assertAll(
51+
() -> assertThat(
52+
sut.generateAuthorizationHeaders().get(HttpHeaders.AUTHORIZATION),
53+
contains("Token apikey")),
54+
() -> assertThat(
55+
sut.generateAuthorizationHeaders().get(HttpHeaders.PROXY_AUTHORIZATION),
56+
contains("Basic dXNlcjpwdw=="))
57+
);
58+
}
59+
60+
@Test
61+
void encodeProxyCredentials() {
62+
final var proxyConfig = ProxyConfig.builder()
63+
.user("bärtram")
64+
.password("gohze8Ae")
65+
.build();
66+
67+
assertThat(Foo.encodeProxyCredentials(proxyConfig), is("YsOkcnRyYW06Z29oemU4QWU="));
68+
}
69+
}

0 commit comments

Comments
 (0)