Skip to content

Commit 8e4422d

Browse files
Preparations for new release (#3)
Reworked handling of URI resources and SSLContext. Improved compatibility with maven. Upgraded Gradle to 7.3.
1 parent 6bfa0bf commit 8e4422d

11 files changed

Lines changed: 87 additions & 53 deletions

File tree

README.md

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ The artifact is available through Maven Central via Sonatype.
2121
<dependency>
2222
<groupId>dev.nicklasw</groupId>
2323
<artifactId>bankid-sdk</artifactId>
24-
<version>0.10.0</version>
24+
<version>0.11.0</version>
2525
</dependency>
2626
```
2727

2828
### Gradle
2929

3030
```
31-
implementation 'dev.nicklasw:bankid-sdk:0.10.0'
31+
implementation 'dev.nicklasw:bankid-sdk:0.11.0'
3232
```
3333

3434
## Changelog
@@ -62,10 +62,8 @@ import dev.nicklasw.bankid.configuration.Configuration;
6262
import dev.nicklasw.bankid.configuration.Pkcs12;
6363
import dev.nicklasw.bankid.exceptions.BankIdApiErrorException;
6464

65-
final URI pkcs12ResourceUri = ResourceUtils.optionalUriFrom("test.p12")
66-
.orElseThrow();
67-
final URI caResourceUri = ResourceUtils.optionalUriFrom("ca.test.crt")
68-
.orElseThrow();
65+
final URI pkcs12ResourceUri = ResourceUtils.tryUriFrom("test.p12")
66+
final URI caResourceUri = ResourceUtils.tryUriFrom("ca.test.crt")
6967

7068
final Configuration configuration = Configuration.builder()
7169
.baseURL(URL_TEST)

build.gradle

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ repositories {
2121
}
2222

2323
dependencies {
24-
implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.+'
24+
implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.5'
2525

2626
compileOnly 'com.github.spotbugs:spotbugs-annotations'
2727

28-
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.+'
29-
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.+'
28+
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.2'
29+
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.2'
3030

31-
errorprone 'com.google.errorprone:error_prone_core:2.8.+'
31+
errorprone 'com.google.errorprone:error_prone_core:2.8.1'
3232
}
3333

3434
apply from: "gradle/publish.gradle"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

src/main/java/dev/nicklasw/bankid/client/Client.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
package dev.nicklasw.bankid.client;
22

3+
import java.io.IOException;
4+
import java.net.URI;
5+
import java.net.http.HttpClient;
6+
import java.net.http.HttpRequest;
7+
import java.net.http.HttpResponse;
8+
import java.time.Duration;
9+
import java.util.concurrent.CompletableFuture;
10+
import javax.net.ssl.SSLContext;
11+
312
import com.fasterxml.jackson.databind.ObjectMapper;
413
import dev.nicklasw.bankid.client.request.Request;
514
import dev.nicklasw.bankid.client.response.JsonBodyHandler;
615
import dev.nicklasw.bankid.client.response.Response;
716
import dev.nicklasw.bankid.client.response.ResponseWrapper;
8-
import dev.nicklasw.bankid.client.ssl.SSLContexts;
17+
import dev.nicklasw.bankid.client.internal.ssl.SslUtils;
918
import dev.nicklasw.bankid.configuration.Configuration;
1019
import dev.nicklasw.bankid.configuration.Pkcs12;
1120
import dev.nicklasw.bankid.exceptions.BankIdApiErrorException;
@@ -15,15 +24,6 @@
1524
import lombok.RequiredArgsConstructor;
1625
import lombok.SneakyThrows;
1726

18-
import javax.net.ssl.SSLContext;
19-
import java.io.IOException;
20-
import java.net.URI;
21-
import java.net.http.HttpClient;
22-
import java.net.http.HttpRequest;
23-
import java.net.http.HttpResponse;
24-
import java.time.Duration;
25-
import java.util.concurrent.CompletableFuture;
26-
2727
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
2828
public class Client {
2929

@@ -103,10 +103,10 @@ private String body(final Request request) {
103103
private static SSLContext sslContext(final Configuration configuration) {
104104
final Pkcs12 pkcs12 = configuration.getPkcs12();
105105

106-
return SSLContexts.builder()
107-
.loadKeyManager(pkcs12.getPath(), pkcs12.getPassword())
108-
.loadTrustManager(configuration.getCertificate())
109-
.build();
106+
return SslUtils.tryCreateSSLContext(
107+
SslUtils.tryCreateKeyManager(pkcs12.getPath(), pkcs12.getPassword()),
108+
SslUtils.tryCreateTrustManager(configuration.getCertificate())
109+
);
110110
}
111111

112112
private static <R extends Response> R unwrap(final HttpResponse<ResponseWrapper<R>> response) {

src/main/java/dev/nicklasw/bankid/client/ssl/SSLContexts.java renamed to src/main/java/dev/nicklasw/bankid/client/internal/ssl/SslUtils.java

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package dev.nicklasw.bankid.client.ssl;
1+
package dev.nicklasw.bankid.client.internal.ssl;
22

33
import java.io.InputStream;
44
import java.nio.file.Files;
@@ -11,19 +11,15 @@
1111
import javax.net.ssl.SSLContext;
1212
import javax.net.ssl.TrustManagerFactory;
1313

14+
import lombok.NonNull;
1415
import lombok.SneakyThrows;
16+
import lombok.experimental.UtilityClass;
1517

16-
public class SSLContexts {
17-
18-
private KeyManagerFactory keyManagerFactory;
19-
private TrustManagerFactory trustManagerFactory;
20-
21-
public static SSLContexts builder() {
22-
return new SSLContexts();
23-
}
18+
@UtilityClass
19+
public class SslUtils {
2420

2521
@SneakyThrows
26-
public SSLContext build() {
22+
public SSLContext tryCreateSSLContext(final KeyManagerFactory keyManagerFactory, final TrustManagerFactory trustManagerFactory) {
2723
final SSLContext sslContext = SSLContext.getInstance("TLS");
2824

2925
sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
@@ -32,34 +28,35 @@ public SSLContext build() {
3228
}
3329

3430
@SneakyThrows
35-
public SSLContexts loadKeyManager(final Path path, final String password) {
31+
public static KeyManagerFactory tryCreateKeyManager(@NonNull final Path path, @NonNull final String password) {
3632
final KeyStore clientStore = KeyStore.getInstance("PKCS12");
3733

3834
try (final InputStream inputStream = Files.newInputStream(path)) {
3935
clientStore.load(inputStream, password.toCharArray());
4036
}
4137

42-
keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
38+
final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
4339
keyManagerFactory.init(clientStore, password.toCharArray());
4440

45-
return this;
41+
return keyManagerFactory;
4642
}
4743

4844
@SneakyThrows
49-
public SSLContexts loadTrustManager(final Path path) {
45+
public static TrustManagerFactory tryCreateTrustManager(@NonNull final Path path) {
5046
final CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
5147
final X509Certificate caCert = (X509Certificate) certificateFactory.generateCertificate(Files.newInputStream(path));
5248

53-
trustManagerFactory = TrustManagerFactory
54-
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
49+
final TrustManagerFactory trustManagerFactory = TrustManagerFactory
50+
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
5551

5652
final KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
5753
keyStore.load(null);
5854
keyStore.setCertificateEntry("caCert", caCert);
5955

6056
trustManagerFactory.init(keyStore);
6157

62-
return this;
58+
return trustManagerFactory;
6359
}
6460

61+
6562
}

src/main/java/dev/nicklasw/bankid/client/utils/ResourceUtils.java

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,43 @@
11
package dev.nicklasw.bankid.client.utils;
22

3-
import edu.umd.cs.findbugs.annotations.Nullable;
4-
import lombok.experimental.UtilityClass;
5-
63
import java.net.URI;
74
import java.net.URISyntaxException;
85
import java.net.URL;
96
import java.util.Optional;
107

8+
import dev.nicklasw.bankid.exceptions.BankIdException;
9+
import edu.umd.cs.findbugs.annotations.Nullable;
10+
import lombok.NonNull;
11+
import lombok.experimental.UtilityClass;
12+
1113
@UtilityClass
1214
public class ResourceUtils {
1315

14-
public static Optional<URI> optionalUriFrom(final String name) {
15-
return Optional.ofNullable(classLoader().getResource(name))
16+
/**
17+
* Tries to load a resource by name and returns a {@link URI}.
18+
*
19+
* @param resourceName the resource name to be loaded
20+
* @throws BankIdException in case of an error
21+
*/
22+
public static URI tryUriFrom(@NonNull final String resourceName) {
23+
final URL resource = classLoader().getResource(resourceName);
24+
25+
if (resource == null) {
26+
throw new BankIdException(
27+
String.format("The resource could not found and/or accessed. %s", resourceName));
28+
}
29+
30+
return tryResourceToURI(resource);
31+
}
32+
33+
/**
34+
* Loads a resource by name. Returns a {@link Optional#empty} is case of an error.
35+
*
36+
* @param resourceName the resource name to be loaded
37+
* @throws BankIdException in case of an error
38+
*/
39+
public static Optional<URI> optionalUriFrom(@NonNull final String resourceName) {
40+
return Optional.ofNullable(classLoader().getResource(resourceName))
1641
.map(ResourceUtils::resourceToURI);
1742
}
1843

@@ -27,6 +52,14 @@ private static URI resourceToURI(final URL url) {
2752
return null;
2853
}
2954

55+
private static URI tryResourceToURI(final URL url) {
56+
try {
57+
return url.toURI();
58+
} catch (final URISyntaxException e) {
59+
throw new BankIdException("Invalid resource provided", e);
60+
}
61+
}
62+
3063
private static ClassLoader classLoader() {
3164
return Thread.currentThread().getContextClassLoader();
3265
}

src/main/java/dev/nicklasw/bankid/configuration/Pkcs12.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import lombok.EqualsAndHashCode;
44
import lombok.Getter;
5+
import lombok.NonNull;
56
import lombok.RequiredArgsConstructor;
67
import lombok.ToString;
78

@@ -12,6 +13,8 @@
1213
@EqualsAndHashCode
1314
@RequiredArgsConstructor(staticName = "of")
1415
public class Pkcs12 {
16+
@NonNull
1517
private final Path path;
18+
@NonNull
1619
private final String password;
1720
}

src/main/java/dev/nicklasw/bankid/exceptions/BankIdApiErrorException.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ public class BankIdApiErrorException extends BankIdException {
88
Response response;
99

1010
private BankIdApiErrorException(final Response response) {
11-
super(null);
11+
super("Encountered a error from the BankId API");
12+
1213
this.response = response;
1314
}
1415

src/main/java/dev/nicklasw/bankid/exceptions/BankIdException.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,12 @@ public BankIdException(final Throwable cause) {
55
super(cause);
66
}
77

8+
public BankIdException(final String message) {
9+
super(message);
10+
}
11+
812
public BankIdException(final String message, final Throwable cause) {
913
super(message, cause);
1014
}
15+
1116
}

src/main/java/module-info.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,4 @@
1313
exports dev.nicklasw.bankid.client.request;
1414
exports dev.nicklasw.bankid.client.model;
1515
exports dev.nicklasw.bankid.client.utils;
16-
exports dev.nicklasw.bankid.client.ssl;
1716
}

0 commit comments

Comments
 (0)