diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/Account.java b/acme4j-client/src/main/java/org/shredzone/acme4j/Account.java index e79a564a..ca6f5133 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/Account.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/Account.java @@ -110,18 +110,6 @@ public class Account extends AcmeJsonResource { return new ResourceIterator<>(getLogin(), KEY_ORDERS, ordersUrl, Login::bindOrder); } - @Override - public void update() throws AcmeException { - LOG.debug("update Account"); - try (Connection conn = getSession().connect()) { - conn.sendSignedRequest(getLocation(), new JSONBuilder(), getLogin()); - JSON json = conn.readJsonResponse(); - if (json != null) { - setJSON(json); - } - } - } - /** * Creates a builder for a new {@link Order}. * diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/connector/PreDraft15Connection.java b/acme4j-client/src/main/java/org/shredzone/acme4j/connector/PreDraft15Connection.java index ffeeab09..63f85c44 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/connector/PreDraft15Connection.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/connector/PreDraft15Connection.java @@ -17,6 +17,7 @@ import java.net.URL; import org.shredzone.acme4j.Login; import org.shredzone.acme4j.exception.AcmeException; +import org.shredzone.acme4j.toolbox.JSONBuilder; /** * This {@link Connection} is used for servers that do not implement the POST-as-GET @@ -43,6 +44,11 @@ public class PreDraft15Connection extends DefaultConnection { @Override public int sendSignedPostAsGetRequest(URL url, Login login) throws AcmeException { + // Account resources must be updated by a signed POST request with empty JSON body + if (login.getAccountLocation().toExternalForm().equals(url.toExternalForm())) { + return sendSignedRequest(url, new JSONBuilder(), login); + } + return sendRequest(url, login.getSession(), MIME_JSON); } diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/AccountTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/AccountTest.java index 14a290a4..779934bd 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/AccountTest.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/AccountTest.java @@ -76,6 +76,8 @@ public class AccountTest { jsonResponse = new JSONBuilder() .array("orders", Arrays.asList("https://example.com/acme/order/1")) .toJSON(); + } else { + jsonResponse = getJSON("updateAccountResponse"); } return HttpURLConnection.HTTP_OK; } @@ -94,6 +96,11 @@ public class AccountTest { public Collection getLinks(String relation) { return Collections.emptyList(); } + + @Override + public void handleRetryAfter(String message) throws AcmeException { + // do nothing + } }; Login login = provider.createLogin(); @@ -124,7 +131,7 @@ public class AccountTest { TestableConnectionProvider provider = new TestableConnectionProvider() { @Override - public int sendSignedRequest(URL url, JSONBuilder claims, Login login) { + public int sendSignedPostAsGetRequest(URL url, Login login) { requestWasSent.set(true); assertThat(url, is(locationUrl)); return HttpURLConnection.HTTP_OK; @@ -147,6 +154,11 @@ public class AccountTest { default: return null; } } + + @Override + public void handleRetryAfter(String message) throws AcmeException { + // do nothing + } }; Account account = new Account(provider.createLogin()); diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/connector/PreDraft15ConnectionTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/connector/PreDraft15ConnectionTest.java index baba975b..7c35e3cb 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/connector/PreDraft15ConnectionTest.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/connector/PreDraft15ConnectionTest.java @@ -13,6 +13,9 @@ */ package org.shredzone.acme4j.connector; +import static org.hamcrest.CoreMatchers.sameInstance; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; import static org.mockito.Mockito.*; import java.io.IOException; @@ -22,6 +25,7 @@ import java.net.URI; import java.net.URL; import java.security.KeyPair; import java.util.Locale; +import java.util.concurrent.atomic.AtomicBoolean; import org.jose4j.base64url.Base64Url; import org.junit.Before; @@ -31,6 +35,7 @@ import org.shredzone.acme4j.Login; import org.shredzone.acme4j.Session; import org.shredzone.acme4j.exception.AcmeException; import org.shredzone.acme4j.provider.AcmeProvider; +import org.shredzone.acme4j.toolbox.JSONBuilder; import org.shredzone.acme4j.toolbox.TestUtils; /** @@ -95,6 +100,29 @@ public class PreDraft15ConnectionTest { verifyNoMoreInteractions(mockUrlConnection); } + /** + * Test update requests to Account in compatibility mode. + */ + @Test + public void testUpdateAccountRequest() throws Exception { + final AtomicBoolean wasInvoked = new AtomicBoolean(); + + try (PreDraft15Connection conn = new PreDraft15Connection(mockHttpConnection) { + @Override + public int sendSignedRequest(URL url, JSONBuilder claims, Login login) throws AcmeException { + assertThat(url, is(accountUrl)); + assertThat(claims.toString(), is("{}")); + assertThat(login, is(sameInstance(PreDraft15ConnectionTest.this.login))); + wasInvoked.set(true); + return HttpURLConnection.HTTP_OK; + }; + }) { + conn.sendSignedPostAsGetRequest(accountUrl, login); + } + + assertThat(wasInvoked.get(), is(true)); + } + /** * Test certificate POST-as-GET requests in compatibility mode. */