diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/Session.java b/acme4j-client/src/main/java/org/shredzone/acme4j/Session.java index ce130ad7..dc6c0480 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/Session.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/Session.java @@ -27,9 +27,9 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.stream.StreamSupport; import org.shredzone.acme4j.challenge.Challenge; -import org.shredzone.acme4j.challenge.TokenChallenge; import org.shredzone.acme4j.connector.Resource; import org.shredzone.acme4j.exception.AcmeException; +import org.shredzone.acme4j.exception.AcmeProtocolException; import org.shredzone.acme4j.provider.AcmeProvider; import org.shredzone.acme4j.toolbox.JSON; @@ -174,15 +174,9 @@ public class Session { * @return {@link Challenge} instance */ public Challenge createChallenge(JSON data) { - Objects.requireNonNull(data, "data"); - Challenge challenge = provider().createChallenge(this, data); if (challenge == null) { - if (data.contains("token")) { - challenge = new TokenChallenge(this, data); - } else { - challenge = new Challenge(this, data); - } + throw new AcmeProtocolException("Could not create challenge for: " + data); } return challenge; } diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/provider/AbstractAcmeProvider.java b/acme4j-client/src/main/java/org/shredzone/acme4j/provider/AbstractAcmeProvider.java index 7ebb5be0..e61b7ddf 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/provider/AbstractAcmeProvider.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/provider/AbstractAcmeProvider.java @@ -25,6 +25,7 @@ import org.shredzone.acme4j.challenge.Challenge; import org.shredzone.acme4j.challenge.Dns01Challenge; import org.shredzone.acme4j.challenge.Http01Challenge; import org.shredzone.acme4j.challenge.TlsSni02Challenge; +import org.shredzone.acme4j.challenge.TokenChallenge; import org.shredzone.acme4j.connector.Connection; import org.shredzone.acme4j.connector.DefaultConnection; import org.shredzone.acme4j.connector.HttpConnector; @@ -72,6 +73,9 @@ public abstract class AbstractAcmeProvider implements AcmeProvider { /** * {@inheritDoc} *

+ * This implementation handles the standard challenge types. For unknown types, + * generic {@link Challenge} or {@link TokenChallenge} instances are created. + *

* Custom provider implementations may override this method to provide challenges that * are unique to the provider. */ @@ -83,11 +87,15 @@ public abstract class AbstractAcmeProvider implements AcmeProvider { String type = data.get("type").required().asString(); BiFunction constructor = CHALLENGES.get(type); - if (constructor == null) { - return null; + if (constructor != null) { + return constructor.apply(session, data); } - return constructor.apply(session, data); + if (data.contains("token")) { + return new TokenChallenge(session, data); + } else { + return new Challenge(session, data); + } } /** diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/provider/AbstractAcmeProviderTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/provider/AbstractAcmeProviderTest.java index 125ccdff..a197a03c 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/provider/AbstractAcmeProviderTest.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/provider/AbstractAcmeProviderTest.java @@ -155,7 +155,8 @@ public class AbstractAcmeProviderTest { .put("url", "https://example.com/some/challenge") .toJSON(); Challenge c6 = provider.createChallenge(session, json6); - assertThat(c6, is(nullValue())); + assertThat(c6, not(nullValue())); + assertThat(c6, instanceOf(Challenge.class)); try { JSON json7 = new JSONBuilder()