From 5bbf1b596614c51dab68049fc9f5d76464a2dad8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20K=C3=B6rber?= Date: Sat, 6 May 2023 17:11:36 +0200 Subject: [PATCH] getCertificate() is not Optional getCertificate() would only return Optional.empty() if it was invoked before the order was finalized. In order to keep the API simple, that state will now throw an IllegalStateException, and getCertificate() directly returns a non-null Certificate now. --- .../src/main/java/org/shredzone/acme4j/Order.java | 13 +++++++++---- .../test/java/org/shredzone/acme4j/OrderTest.java | 8 ++++---- .../org/shredzone/acme4j/example/ClientTest.java | 2 +- .../shredzone/acme4j/it/boulder/OrderHttpIT.java | 5 +---- .../org/shredzone/acme4j/it/pebble/OrderIT.java | 2 +- .../shredzone/acme4j/it/pebble/OrderWildcardIT.java | 5 +---- 6 files changed, 17 insertions(+), 18 deletions(-) diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/Order.java b/acme4j-client/src/main/java/org/shredzone/acme4j/Order.java index 4e22c3d4..52faac39 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/Order.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/Order.java @@ -114,12 +114,17 @@ public class Order extends AcmeJsonResource { } /** - * Gets the {@link Certificate} if it is available. + * Gets the {@link Certificate}. + * + * @throws IllegalStateException + * if the order is not ready yet. You must finalize the order first, and wait + * for the status to become {@link Status#VALID}. */ - public Optional getCertificate() { + public Certificate getCertificate() { return getJSON().get("certificate") - .map(Value::asURL) - .map(getLogin()::bindCertificate); + .map(Value::asURL) + .map(getLogin()::bindCertificate) + .orElseThrow(() -> new IllegalStateException("Order is not completed")); } /** diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/OrderTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/OrderTest.java index 0631bf1f..a35ae955 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/OrderTest.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/OrderTest.java @@ -79,7 +79,7 @@ public class OrderTest { .isEqualTo("2016-01-01T00:00:00Z"); softly.assertThat(order.getNotAfter().orElseThrow()) .isEqualTo("2016-01-08T00:00:00Z"); - softly.assertThat(order.getCertificate().orElseThrow().getLocation()) + softly.assertThat(order.getCertificate().getLocation()) .isEqualTo(url("https://example.com/acme/cert/1234")); softly.assertThat(order.getFinalizeLocation()).isEqualTo(finalizeUrl); @@ -141,13 +141,13 @@ public class OrderTest { try (var softly = new AutoCloseableSoftAssertions()) { // Lazy loading softly.assertThat(requestWasSent).isFalse(); - softly.assertThat(order.getCertificate().orElseThrow().getLocation()) + softly.assertThat(order.getCertificate().getLocation()) .isEqualTo(url("https://example.com/acme/cert/1234")); softly.assertThat(requestWasSent).isTrue(); // Subsequent queries do not trigger another load requestWasSent.set(false); - softly.assertThat(order.getCertificate().orElseThrow().getLocation()) + softly.assertThat(order.getCertificate().getLocation()) .isEqualTo(url("https://example.com/acme/cert/1234")); softly.assertThat(order.getStatus()).isEqualTo(Status.PENDING); softly.assertThat(order.getExpires().orElseThrow()).isEqualTo("2015-03-01T14:09:00Z"); @@ -210,7 +210,7 @@ public class OrderTest { .isEqualTo("2016-01-01T00:00:00Z"); softly.assertThat(order.getNotAfter().orElseThrow()) .isEqualTo("2016-01-08T00:00:00Z"); - softly.assertThat(order.getCertificate().orElseThrow().getLocation()) + softly.assertThat(order.getCertificate().getLocation()) .isEqualTo(url("https://example.com/acme/cert/1234")); softly.assertThat(order.getAutoRenewalCertificate()).isEmpty(); softly.assertThat(order.getFinalizeLocation()).isEqualTo(finalizeUrl); diff --git a/acme4j-example/src/main/java/org/shredzone/acme4j/example/ClientTest.java b/acme4j-example/src/main/java/org/shredzone/acme4j/example/ClientTest.java index 2efcfa75..5574c691 100644 --- a/acme4j-example/src/main/java/org/shredzone/acme4j/example/ClientTest.java +++ b/acme4j-example/src/main/java/org/shredzone/acme4j/example/ClientTest.java @@ -142,7 +142,7 @@ public class ClientTest { } // Get the certificate - Certificate certificate = order.getCertificate().orElseThrow(); + Certificate certificate = order.getCertificate(); LOG.info("Success! The certificate for domains {} has been generated!", domains); LOG.info("Certificate URL: {}", certificate.getLocation()); diff --git a/acme4j-it/src/test/java/org/shredzone/acme4j/it/boulder/OrderHttpIT.java b/acme4j-it/src/test/java/org/shredzone/acme4j/it/boulder/OrderHttpIT.java index c585e59b..8fa97d24 100644 --- a/acme4j-it/src/test/java/org/shredzone/acme4j/it/boulder/OrderHttpIT.java +++ b/acme4j-it/src/test/java/org/shredzone/acme4j/it/boulder/OrderHttpIT.java @@ -23,7 +23,6 @@ import java.security.KeyPair; import org.junit.jupiter.api.Test; import org.shredzone.acme4j.AccountBuilder; import org.shredzone.acme4j.Authorization; -import org.shredzone.acme4j.Certificate; import org.shredzone.acme4j.Order; import org.shredzone.acme4j.Session; import org.shredzone.acme4j.Status; @@ -93,9 +92,7 @@ public class OrderHttpIT { .conditionEvaluationListener(cond -> updateOrder(order)) .untilAsserted(() -> assertThat(order.getStatus()).isNotIn(Status.PENDING, Status.PROCESSING)); - var cert = order.getCertificate() - .map(Certificate::getCertificate) - .orElseThrow(); + var cert = order.getCertificate().getCertificate(); assertThat(cert.getNotAfter()).isNotNull(); assertThat(cert.getNotBefore()).isNotNull(); assertThat(cert.getSubjectX500Principal().getName()).contains("CN=" + TEST_DOMAIN); diff --git a/acme4j-it/src/test/java/org/shredzone/acme4j/it/pebble/OrderIT.java b/acme4j-it/src/test/java/org/shredzone/acme4j/it/pebble/OrderIT.java index 55fd6081..f9b44a01 100644 --- a/acme4j-it/src/test/java/org/shredzone/acme4j/it/pebble/OrderIT.java +++ b/acme4j-it/src/test/java/org/shredzone/acme4j/it/pebble/OrderIT.java @@ -195,7 +195,7 @@ public class OrderIT extends PebbleITBase { assertThat(order.getStatus()).isEqualTo(Status.VALID); - var certificate = order.getCertificate().orElseThrow(); + var certificate = order.getCertificate(); var cert = certificate.getCertificate(); assertThat(cert).isNotNull(); assertThat(cert.getNotBefore().toInstant()).isEqualTo(notBefore); diff --git a/acme4j-it/src/test/java/org/shredzone/acme4j/it/pebble/OrderWildcardIT.java b/acme4j-it/src/test/java/org/shredzone/acme4j/it/pebble/OrderWildcardIT.java index 2286ca22..8fd2f972 100644 --- a/acme4j-it/src/test/java/org/shredzone/acme4j/it/pebble/OrderWildcardIT.java +++ b/acme4j-it/src/test/java/org/shredzone/acme4j/it/pebble/OrderWildcardIT.java @@ -25,7 +25,6 @@ import java.time.temporal.ChronoUnit; import org.bouncycastle.asn1.x509.GeneralName; import org.junit.jupiter.api.Test; import org.shredzone.acme4j.AccountBuilder; -import org.shredzone.acme4j.Certificate; import org.shredzone.acme4j.Session; import org.shredzone.acme4j.Status; import org.shredzone.acme4j.challenge.Dns01Challenge; @@ -112,9 +111,7 @@ public class OrderWildcardIT extends PebbleITBase { order.getStatus()).isNotIn(Status.PENDING, Status.PROCESSING)); - var cert = order.getCertificate() - .map(Certificate::getCertificate) - .orElseThrow(); + var cert = order.getCertificate().getCertificate(); assertThat(cert).isNotNull(); assertThat(cert.getNotAfter()).isNotEqualTo(notBefore); assertThat(cert.getNotBefore()).isNotEqualTo(notAfter);