mirror of https://github.com/shred/acme4j
Make DTOs and Challenges serializable
parent
5b5500d373
commit
7d9d851046
|
@ -13,6 +13,7 @@
|
|||
*/
|
||||
package org.shredzone.acme4j;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.security.KeyPair;
|
||||
|
||||
/**
|
||||
|
@ -22,7 +23,8 @@ import java.security.KeyPair;
|
|||
*
|
||||
* @author Richard "Shred" Körber
|
||||
*/
|
||||
public class Account {
|
||||
public class Account implements Serializable {
|
||||
private static final long serialVersionUID = 1064105289226118702L;
|
||||
|
||||
private final KeyPair keyPair;
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
*/
|
||||
package org.shredzone.acme4j;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
|
@ -25,7 +26,8 @@ import org.shredzone.acme4j.challenge.Challenge;
|
|||
*
|
||||
* @author Richard "Shred" Körber
|
||||
*/
|
||||
public class Authorization {
|
||||
public class Authorization implements Serializable {
|
||||
private static final long serialVersionUID = -3116928998379417741L;
|
||||
|
||||
private String domain;
|
||||
private String status;
|
||||
|
@ -138,6 +140,10 @@ public class Authorization {
|
|||
* validation.
|
||||
*/
|
||||
public Collection<Challenge> findCombination(String... types) {
|
||||
if (combinations == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Collection<String> available = Arrays.asList(types);
|
||||
Collection<String> combinationTypes = new ArrayList<>();
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
*/
|
||||
package org.shredzone.acme4j;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.ArrayList;
|
||||
|
@ -23,7 +24,8 @@ import java.util.List;
|
|||
*
|
||||
* @author Richard "Shred" Körber
|
||||
*/
|
||||
public class Registration {
|
||||
public class Registration implements Serializable {
|
||||
private static final long serialVersionUID = -8177333806740391140L;
|
||||
|
||||
private List<URI> contacts = new ArrayList<>();
|
||||
private URI agreement;
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
*/
|
||||
package org.shredzone.acme4j.challenge;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.net.URI;
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -24,7 +25,7 @@ import org.shredzone.acme4j.util.ClaimBuilder;
|
|||
*
|
||||
* @author Richard "Shred" Körber
|
||||
*/
|
||||
public interface Challenge {
|
||||
public interface Challenge extends Serializable {
|
||||
|
||||
/**
|
||||
* Challenge status enumeration.
|
||||
|
|
|
@ -27,6 +27,7 @@ import org.shredzone.acme4j.util.ClaimBuilder;
|
|||
* @author Richard "Shred" Körber
|
||||
*/
|
||||
public class DnsChallenge extends GenericChallenge {
|
||||
private static final long serialVersionUID = 6964687027713533075L;
|
||||
|
||||
/**
|
||||
* Challenge type name: {@value}
|
||||
|
|
|
@ -13,6 +13,9 @@
|
|||
*/
|
||||
package org.shredzone.acme4j.challenge;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
|
@ -22,6 +25,7 @@ import java.security.PublicKey;
|
|||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.jose4j.json.JsonUtil;
|
||||
import org.jose4j.jwk.JsonWebKey;
|
||||
import org.jose4j.jwk.JsonWebKey.OutputControlLevel;
|
||||
import org.jose4j.lang.JoseException;
|
||||
|
@ -36,6 +40,7 @@ import org.shredzone.acme4j.util.ClaimBuilder;
|
|||
* @author Richard "Shred" Körber
|
||||
*/
|
||||
public class GenericChallenge implements Challenge {
|
||||
private static final long serialVersionUID = 2338794776848388099L;
|
||||
|
||||
protected static final String KEY_TYPE = "type";
|
||||
protected static final String KEY_STATUS = "status";
|
||||
|
@ -44,7 +49,7 @@ public class GenericChallenge implements Challenge {
|
|||
protected static final String KEY_TOKEN = "token";
|
||||
protected static final String KEY_KEY_AUTHORIZSATION = "keyAuthorization";
|
||||
|
||||
private final Map<String, Object> data = new HashMap<>();
|
||||
private transient Map<String, Object> data = new HashMap<>();
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
|
@ -165,4 +170,24 @@ public class GenericChallenge implements Challenge {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Serialize the data map in JSON.
|
||||
*/
|
||||
private void writeObject(ObjectOutputStream out) throws IOException {
|
||||
out.writeUTF(JsonUtil.toJson(data));
|
||||
out.defaultWriteObject();
|
||||
}
|
||||
|
||||
/**
|
||||
* Deserialize the JSON representation of the data map.
|
||||
*/
|
||||
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
|
||||
try {
|
||||
data = new HashMap<>(JsonUtil.parseJson(in.readUTF()));
|
||||
in.defaultReadObject();
|
||||
} catch (JoseException ex) {
|
||||
throw new IOException("Cannot deserialize", ex);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ import org.shredzone.acme4j.util.ClaimBuilder;
|
|||
* @author Richard "Shred" Körber
|
||||
*/
|
||||
public class HttpChallenge extends GenericChallenge {
|
||||
private static final long serialVersionUID = 3322211185872544605L;
|
||||
|
||||
/**
|
||||
* Challenge type name: {@value}
|
||||
|
|
|
@ -26,6 +26,7 @@ import org.shredzone.acme4j.util.ClaimBuilder;
|
|||
* @author Richard "Shred" Körber
|
||||
*/
|
||||
public class ProofOfPossessionChallenge extends GenericChallenge {
|
||||
private static final long serialVersionUID = 6212440828380185335L;
|
||||
|
||||
/**
|
||||
* Challenge type name: {@value}
|
||||
|
|
|
@ -21,6 +21,7 @@ package org.shredzone.acme4j.challenge;
|
|||
* @author Richard "Shred" Körber
|
||||
*/
|
||||
public class TlsSniChallenge extends GenericChallenge {
|
||||
private static final long serialVersionUID = 7370329525205430573L;
|
||||
|
||||
/**
|
||||
* Challenge type name: {@value}
|
||||
|
|
|
@ -17,7 +17,11 @@ import static org.hamcrest.Matchers.*;
|
|||
import static org.junit.Assert.assertThat;
|
||||
import static uk.co.datumedge.hamcrest.json.SameJSONAs.sameJSONAs;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.security.KeyPair;
|
||||
|
@ -132,4 +136,36 @@ public class GenericChallengeTest {
|
|||
assertThat(thumbprint, is(Base64Url.decode(TestUtils.THUMBPRINT)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that challenge serialization works correctly.
|
||||
*/
|
||||
@Test
|
||||
public void testSerialization() throws IOException, ClassNotFoundException {
|
||||
HttpChallenge originalChallenge = new HttpChallenge();
|
||||
originalChallenge.unmarshall(TestUtils.getJsonAsMap("httpChallenge"));
|
||||
|
||||
// Serialize
|
||||
byte[] data;
|
||||
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
|
||||
try (ObjectOutputStream oos = new ObjectOutputStream(out)) {
|
||||
oos.writeObject(originalChallenge);
|
||||
}
|
||||
data = out.toByteArray();
|
||||
}
|
||||
|
||||
// Deserialize
|
||||
Challenge testChallenge;
|
||||
try (ByteArrayInputStream in = new ByteArrayInputStream(data)) {
|
||||
try (ObjectInputStream ois = new ObjectInputStream(in)) {
|
||||
testChallenge = (Challenge) ois.readObject();
|
||||
}
|
||||
}
|
||||
|
||||
assertThat(testChallenge, not(sameInstance((Challenge) originalChallenge)));
|
||||
assertThat(testChallenge, is(instanceOf(HttpChallenge.class)));
|
||||
assertThat(testChallenge.getType(), is(HttpChallenge.TYPE));
|
||||
assertThat(testChallenge.getStatus(), is(Challenge.Status.PENDING));
|
||||
assertThat(((HttpChallenge )testChallenge).getToken(), is("rSoI9JpyvFi-ltdnBW0W1DjKstzG7cHixjzcOjwzAEQ"));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue