From 0d4208931870d4b173322d95a564cbe0dea8d376 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20K=C3=B6rber?= Date: Wed, 21 Feb 2018 19:58:50 +0100 Subject: [PATCH] Return nonce header --- .../acme4j/connector/Connection.java | 7 +++-- .../acme4j/connector/DefaultConnection.java | 14 +++++----- .../acme4j/provider/AbstractAcmeProvider.java | 5 +++- .../connector/DefaultConnectionTest.java | 26 +++++++++---------- .../acme4j/connector/DummyConnection.java | 2 +- .../provider/AbstractAcmeProviderTest.java | 3 +-- 6 files changed, 29 insertions(+), 28 deletions(-) diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/connector/Connection.java b/acme4j-client/src/main/java/org/shredzone/acme4j/connector/Connection.java index 1c9b718b..15139d54 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/connector/Connection.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/connector/Connection.java @@ -116,12 +116,11 @@ public interface Connection extends AutoCloseable { void handleRetryAfter(String message) throws AcmeException; /** - * Updates a {@link Session} by evaluating the HTTP response header. + * Gets the nonce from the nonce header. * - * @param session - * {@link Session} instance to be updated + * @return Nonce, or {@code null} if no nonce header was set */ - void updateSession(Session session); + byte[] getNonce(); /** * Gets a location from the {@code Location} header. diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/connector/DefaultConnection.java b/acme4j-client/src/main/java/org/shredzone/acme4j/connector/DefaultConnection.java index e0fd9487..e165c857 100644 --- a/acme4j-client/src/main/java/org/shredzone/acme4j/connector/DefaultConnection.java +++ b/acme4j-client/src/main/java/org/shredzone/acme4j/connector/DefaultConnection.java @@ -112,11 +112,11 @@ public class DefaultConnection implements Connection { throwAcmeException(); } - updateSession(session); - - if (session.getNonce() == null) { + byte[] nonce = getNonce(); + if (nonce == null) { throw new AcmeProtocolException("Server did not provide a nonce"); } + session.setNonce(nonce); } catch (IOException ex) { throw new AcmeNetworkException(ex); } finally { @@ -241,12 +241,12 @@ public class DefaultConnection implements Connection { } @Override - public void updateSession(Session session) { + public byte[] getNonce() { assertConnectionIsOpen(); String nonceHeader = conn.getHeaderField(REPLAY_NONCE_HEADER); if (nonceHeader == null || nonceHeader.trim().isEmpty()) { - return; + return null; } if (!BASE64URL_PATTERN.matcher(nonceHeader).matches()) { @@ -255,7 +255,7 @@ public class DefaultConnection implements Connection { LOG.debug("Replay Nonce: {}", nonceHeader); - session.setNonce(Base64Url.decode(nonceHeader)); + return Base64Url.decode(nonceHeader); } @Override @@ -353,7 +353,7 @@ public class DefaultConnection implements Connection { logHeaders(); - updateSession(session); + session.setNonce(getNonce()); int rc = conn.getResponseCode(); if ((httpStatus.length == 0 && rc != HttpURLConnection.HTTP_OK) 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 9fd1271f..2ec78944 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 @@ -53,7 +53,10 @@ public abstract class AbstractAcmeProvider implements AcmeProvider { conn.sendRequest(resolve(serverUri), session); // use nonce header if there is one, saves a HEAD request... - conn.updateSession(session); + byte[] nonce = conn.getNonce(); + if (nonce != null) { + session.setNonce(nonce); + } return conn.readJsonResponse(); } diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/connector/DefaultConnectionTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/connector/DefaultConnectionTest.java index 98341334..26c7aaef 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/connector/DefaultConnectionTest.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/connector/DefaultConnectionTest.java @@ -97,9 +97,8 @@ public class DefaultConnectionTest { assertThat(session.getNonce(), is(nullValue())); try (DefaultConnection conn = new DefaultConnection(mockHttpConnection)) { conn.conn = mockUrlConnection; - conn.updateSession(session); + assertThat(conn.getNonce(), is(nullValue())); } - assertThat(session.getNonce(), is(nullValue())); verify(mockUrlConnection).getHeaderField("Replay-Nonce"); verifyNoMoreInteractions(mockUrlConnection); @@ -116,9 +115,8 @@ public class DefaultConnectionTest { try (DefaultConnection conn = new DefaultConnection(mockHttpConnection)) { conn.conn = mockUrlConnection; - conn.updateSession(session); + assertThat(conn.getNonce(), is(TestUtils.DUMMY_NONCE)); } - assertThat(session.getNonce(), is(TestUtils.DUMMY_NONCE)); verify(mockUrlConnection).getHeaderField("Replay-Nonce"); verifyNoMoreInteractions(mockUrlConnection); @@ -136,7 +134,7 @@ public class DefaultConnectionTest { try (DefaultConnection conn = new DefaultConnection(mockHttpConnection)) { conn.conn = mockUrlConnection; - conn.updateSession(session); + conn.getNonce(); fail("Expected to fail"); } catch (AcmeProtocolException ex) { assertThat(ex.getMessage(), org.hamcrest.Matchers.startsWith("Invalid replay nonce")); @@ -677,17 +675,18 @@ public class DefaultConnectionTest { } else { fail("unknown nonce"); } - }; + } @Override - public void updateSession(Session session) { + public byte[] getNonce() { assertThat(session, is(sameInstance(DefaultConnectionTest.this.session))); if (session.getNonce() == nonce1) { - session.setNonce(nonce2); + return nonce2; } else { fail("unknown nonce"); + return null; } - }; + } }) { JSONBuilder cb = new JSONBuilder(); cb.put("foo", 123).put("bar", "a-string"); @@ -752,17 +751,18 @@ public class DefaultConnectionTest { } else { fail("unknown nonce"); } - }; + } @Override - public void updateSession(Session session) { + public byte[] getNonce() { assertThat(session, is(sameInstance(DefaultConnectionTest.this.session))); if (session.getNonce() == nonce1) { - session.setNonce(nonce2); + return nonce2; } else { fail("unknown nonce"); + return null; } - }; + } }) { JSONBuilder cb = new JSONBuilder(); cb.put("foo", 123).put("bar", "a-string"); diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/connector/DummyConnection.java b/acme4j-client/src/test/java/org/shredzone/acme4j/connector/DummyConnection.java index d9ec1fa0..426b07e1 100644 --- a/acme4j-client/src/test/java/org/shredzone/acme4j/connector/DummyConnection.java +++ b/acme4j-client/src/test/java/org/shredzone/acme4j/connector/DummyConnection.java @@ -67,7 +67,7 @@ public class DummyConnection implements Connection { } @Override - public void updateSession(Session session) { + public byte[] getNonce() { throw new UnsupportedOperationException(); } 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 85a43b19..3e645b11 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 @@ -15,7 +15,6 @@ package org.shredzone.acme4j.provider; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; import static org.shredzone.acme4j.toolbox.TestUtils.getJSON; import static uk.co.datumedge.hamcrest.json.SameJSONAs.sameJSONAs; @@ -110,7 +109,7 @@ public class AbstractAcmeProviderTest { assertThat(map.toString(), sameJSONAs(TestUtils.getJSON("directory").toString())); verify(connection).sendRequest(testResolvedUrl, session); - verify(connection).updateSession(any(Session.class)); + verify(connection).getNonce(); verify(connection).readJsonResponse(); verify(connection).close(); verifyNoMoreInteractions(connection);