From 0b1e512a57eca99b013ae77430c362fd367106b7 Mon Sep 17 00:00:00 2001 From: Anders Mikkelsen Date: Sat, 26 Oct 2019 19:22:51 +0200 Subject: [PATCH] implemented bindChallenge --- .../main/java/org/shredzone/acme4j/Login.java | 17 +++++++++ .../java/org/shredzone/acme4j/LoginTest.java | 38 +++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/Login.java b/acme4j-client/src/main/java/org/shredzone/acme4j/Login.java index 799d7ac5..c1ad5093 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/Login.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/Login.java @@ -23,6 +23,8 @@ import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.concurrent.ThreadSafe; import org.shredzone.acme4j.challenge.Challenge; +import org.shredzone.acme4j.connector.Connection; +import org.shredzone.acme4j.exception.AcmeException; import org.shredzone.acme4j.exception.AcmeProtocolException; import org.shredzone.acme4j.toolbox.JSON; @@ -123,6 +125,21 @@ public class Login { return new Order(this, requireNonNull(location, "location")); } + /** + * Creates a new instance of {@link Challenge} and binds it to this login. + * + * @param location + * Location URL of the order + * @return {@link Challenge} bound to the login + */ + public Challenge bindChallenge(URL location) throws AcmeException { + Connection connect = session.connect(); + connect.sendSignedPostAsGetRequest(location, this); + JSON data = connect.readJsonResponse(); + Objects.requireNonNull(data, "data"); + return createChallenge(data); + } + /** * Creates a {@link Challenge} instance for the given challenge data. * diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/LoginTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/LoginTest.java index 79d94df9..435ca0af 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/LoginTest.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/LoginTest.java @@ -16,9 +16,11 @@ package org.shredzone.acme4j; import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.*; +import static org.shredzone.acme4j.toolbox.TestUtils.getJSON; import static org.shredzone.acme4j.toolbox.TestUtils.url; import java.io.IOException; +import java.net.HttpURLConnection; import java.net.URL; import java.security.KeyPair; @@ -27,6 +29,7 @@ import org.mockito.ArgumentMatchers; import org.shredzone.acme4j.challenge.Challenge; import org.shredzone.acme4j.challenge.Http01Challenge; import org.shredzone.acme4j.provider.AcmeProvider; +import org.shredzone.acme4j.provider.TestableConnectionProvider; import org.shredzone.acme4j.toolbox.JSON; import org.shredzone.acme4j.toolbox.JSONBuilder; import org.shredzone.acme4j.toolbox.TestUtils; @@ -135,4 +138,39 @@ public class LoginTest { verify(mockProvider).createChallenge(login, data); } + + /** + * Test that binding to a challenge invokes createChallenge + */ + @Test + public void testBindChallenge() throws Exception { + URL locationUrl = new URL("https://example.com/acme/challenge/1"); + + Http01Challenge mockChallenge = mock(Http01Challenge.class); + JSON httpChallenge = getJSON("httpChallenge"); + TestableConnectionProvider provider = new TestableConnectionProvider() { + @Override + public int sendSignedPostAsGetRequest(URL url, Login login) { + assertThat(url, is(locationUrl)); + return HttpURLConnection.HTTP_OK; + } + + @Override + public JSON readJsonResponse() { + return httpChallenge; + } + + @Override + public Challenge createChallenge(Login login, JSON json) { + assertThat(json, is(httpChallenge)); + return mockChallenge; + } + }; + + Login login = provider.createLogin(); + Challenge challenge = login.bindChallenge(locationUrl); + assertThat(challenge, is(instanceOf(Http01Challenge.class))); + assertThat(challenge, is(sameInstance(mockChallenge))); + } + }