From 7cd583c9cf854d464b8f7102b2606a1311cb6b79 Mon Sep 17 00:00:00 2001 From: Till Krullmann Date: Thu, 2 Nov 2017 16:45:05 +0100 Subject: [PATCH] Eliminated usage of Guava and Commons-Lang libraries --- gradle/dependency-management.gradle | 4 --- .../spring/autoconfigure/JwtProperties.java | 17 +++++---- .../spring/io/Base64DecodingByteSource.java | 26 +++++--------- .../spring/io/ResourceBinaryDataSupplier.java | 27 ++++++++++++++ .../spring/io/ResourceByteSourceAdapter.java | 35 ------------------- jwt/build.gradle | 3 -- .../unbrokendome/jsonwebtoken/BinaryData.java | 5 ++- .../jsonwebtoken/ClaimsBuilder.java | 4 +-- .../unbrokendome/jsonwebtoken/IOSupplier.java | 18 ++++++++++ .../encoding/JwsCompactDecoder.java | 17 ++++++--- .../jsonwebtoken/impl/AbstractMapData.java | 7 ++-- .../impl/AbstractMapDataBuilder.java | 5 +-- .../DefaultJwtDecodingProcessorBuilder.java | 16 ++++----- .../DefaultJwtEncodingProcessorBuilder.java | 7 ++-- .../jsonwebtoken/signature/KeyLoader.java | 4 +-- .../signature/SignatureAlgorithm.java | 2 +- .../AbstractAsymmetricSignatureAlgorithm.java | 2 +- .../signature/impl/MacSignatureAlgorithm.java | 4 +-- .../impl/NoneSignatureAlgorithm.java | 5 +-- .../signature/impl/PKCS8PrivateKeyLoader.java | 6 ++-- .../impl/PublicKeyExtractorChain.java | 10 +++--- .../impl/PublicKeyFromPrivateKeyLoader.java | 4 +-- .../signature/impl/SecretKeyLoader.java | 6 ++-- .../impl/SignaturePublicKeyVerifier.java | 5 +-- .../signature/impl/SignerVerifier.java | 5 +-- .../signature/impl/X509PublicKeyLoader.java | 8 ++--- .../unbrokendome/jsonwebtoken/util/Pair.java | 28 +++++++++++++++ 27 files changed, 152 insertions(+), 128 deletions(-) create mode 100644 jwt-spring/src/main/java/org/unbrokendome/jsonwebtoken/spring/io/ResourceBinaryDataSupplier.java delete mode 100644 jwt-spring/src/main/java/org/unbrokendome/jsonwebtoken/spring/io/ResourceByteSourceAdapter.java create mode 100644 jwt/src/main/java/org/unbrokendome/jsonwebtoken/IOSupplier.java create mode 100644 jwt/src/main/java/org/unbrokendome/jsonwebtoken/util/Pair.java diff --git a/gradle/dependency-management.gradle b/gradle/dependency-management.gradle index c6ddff3..797d64a 100644 --- a/gradle/dependency-management.gradle +++ b/gradle/dependency-management.gradle @@ -16,12 +16,8 @@ dependencyManagement { dependency 'com.google.code.findbugs:jsr305:3.0.2' - dependency 'com.google.guava:guava:21.0' - dependency 'nf.fr.eraasoft:objectpool:1.1.2' - dependency 'org.apache.commons:commons-lang3:3.5' - dependencySet(group: 'org.bouncycastle', version: '1.55') { entry 'bcpkix-jdk15on' entry 'bcprov-jdk15on' diff --git a/jwt-spring/src/main/java/org/unbrokendome/jsonwebtoken/spring/autoconfigure/JwtProperties.java b/jwt-spring/src/main/java/org/unbrokendome/jsonwebtoken/spring/autoconfigure/JwtProperties.java index f7da4e5..dbd5937 100644 --- a/jwt-spring/src/main/java/org/unbrokendome/jsonwebtoken/spring/autoconfigure/JwtProperties.java +++ b/jwt-spring/src/main/java/org/unbrokendome/jsonwebtoken/spring/autoconfigure/JwtProperties.java @@ -1,10 +1,9 @@ package org.unbrokendome.jsonwebtoken.spring.autoconfigure; -import com.google.common.io.ByteSource; -import com.google.common.io.CharSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.core.io.Resource; import org.springframework.util.StringUtils; +import org.unbrokendome.jsonwebtoken.IOSupplier; import org.unbrokendome.jsonwebtoken.JwtDecodeOnlyProcessorBuilder; import org.unbrokendome.jsonwebtoken.JwtDecodingProcessorBuilderBase; import org.unbrokendome.jsonwebtoken.JwtEncodeOnlyProcessorBuilder; @@ -18,7 +17,7 @@ import org.unbrokendome.jsonwebtoken.signature.VerificationKeyResolver; import org.unbrokendome.jsonwebtoken.spring.JwtProcessorMode; import org.unbrokendome.jsonwebtoken.spring.io.Base64DecodingByteSource; -import org.unbrokendome.jsonwebtoken.spring.io.ResourceByteSourceAdapter; +import org.unbrokendome.jsonwebtoken.spring.io.ResourceBinaryDataSupplier; import javax.annotation.Nullable; import java.nio.charset.StandardCharsets; @@ -185,13 +184,13 @@ public void setKey(String key) { @Nullable - protected ByteSource getKeyByteSource() { + protected IOSupplier getKeyByteSource() { if (key != null && !key.trim().isEmpty()) { - return new Base64DecodingByteSource(CharSource.wrap(key), StandardCharsets.UTF_8); + return new Base64DecodingByteSource(() -> key, StandardCharsets.UTF_8); } else if (keyResource != null) { - ByteSource encodedByteSource = new ResourceByteSourceAdapter(keyResource); - return new Base64DecodingByteSource(encodedByteSource); + return new Base64DecodingByteSource( + new ResourceBinaryDataSupplier(keyResource)); } else { return null; @@ -202,7 +201,7 @@ protected ByteSource getKeyByteSource() { @Nullable protected Key loadSigningKey(SignatureAlgorithm algorithm) { - ByteSource keyByteSource = getKeyByteSource(); + IOSupplier keyByteSource = getKeyByteSource(); if (keyByteSource == null) { if (algorithm != SignatureAlgorithms.NONE) { throw new IllegalStateException("A signature algorithm other than NONE was specified, but no signing " + @@ -234,7 +233,7 @@ protected Key loadSigningKey(SignatureAlgorithm algorithm) { @Nullable protected Key loadVerificationKey(SignatureAlgorithm algorithm) { - ByteSource keyByteSource = getKeyByteSource(); + IOSupplier keyByteSource = getKeyByteSource(); if (keyByteSource == null) { if (algorithm != SignatureAlgorithms.NONE) { throw new IllegalStateException("A signature algorithm other than NONE was specified, but no verification " + diff --git a/jwt-spring/src/main/java/org/unbrokendome/jsonwebtoken/spring/io/Base64DecodingByteSource.java b/jwt-spring/src/main/java/org/unbrokendome/jsonwebtoken/spring/io/Base64DecodingByteSource.java index c160533..c481820 100644 --- a/jwt-spring/src/main/java/org/unbrokendome/jsonwebtoken/spring/io/Base64DecodingByteSource.java +++ b/jwt-spring/src/main/java/org/unbrokendome/jsonwebtoken/spring/io/Base64DecodingByteSource.java @@ -1,38 +1,30 @@ package org.unbrokendome.jsonwebtoken.spring.io; -import com.google.common.io.ByteSource; -import com.google.common.io.CharSource; +import org.unbrokendome.jsonwebtoken.IOSupplier; import java.io.IOException; -import java.io.InputStream; import java.nio.charset.Charset; import java.util.Base64; -public final class Base64DecodingByteSource extends ByteSource { +public final class Base64DecodingByteSource implements IOSupplier { - private final ByteSource encoded; + private final IOSupplier encoded; - public Base64DecodingByteSource(ByteSource encoded) { + public Base64DecodingByteSource(IOSupplier encoded) { this.encoded = encoded; } - public Base64DecodingByteSource(CharSource encoded, Charset charset) { - this(encoded.asByteSource(charset)); + public Base64DecodingByteSource(IOSupplier encoded, Charset charset) { + this(() -> encoded.get().getBytes(charset)); } @Override - public byte[] read() throws IOException { - return Base64.getMimeDecoder().decode(encoded.read()); - } - - - @Override - public InputStream openStream() throws IOException { - InputStream encodedStream = encoded.openStream(); - return Base64.getDecoder().wrap(encodedStream); + public byte[] get() throws IOException { + byte[] encodedBytes = encoded.get(); + return Base64.getMimeDecoder().decode(encodedBytes); } } diff --git a/jwt-spring/src/main/java/org/unbrokendome/jsonwebtoken/spring/io/ResourceBinaryDataSupplier.java b/jwt-spring/src/main/java/org/unbrokendome/jsonwebtoken/spring/io/ResourceBinaryDataSupplier.java new file mode 100644 index 0000000..1f722b4 --- /dev/null +++ b/jwt-spring/src/main/java/org/unbrokendome/jsonwebtoken/spring/io/ResourceBinaryDataSupplier.java @@ -0,0 +1,27 @@ +package org.unbrokendome.jsonwebtoken.spring.io; + +import org.springframework.core.io.Resource; +import org.springframework.util.StreamUtils; +import org.unbrokendome.jsonwebtoken.IOSupplier; + +import java.io.IOException; +import java.io.InputStream; + + +public class ResourceBinaryDataSupplier implements IOSupplier { + + private final Resource resource; + + + public ResourceBinaryDataSupplier(Resource resource) { + this.resource = resource; + } + + + @Override + public byte[] get() throws IOException { + try (InputStream input = resource.getInputStream()) { + return StreamUtils.copyToByteArray(input); + } + } +} diff --git a/jwt-spring/src/main/java/org/unbrokendome/jsonwebtoken/spring/io/ResourceByteSourceAdapter.java b/jwt-spring/src/main/java/org/unbrokendome/jsonwebtoken/spring/io/ResourceByteSourceAdapter.java deleted file mode 100644 index e5579c1..0000000 --- a/jwt-spring/src/main/java/org/unbrokendome/jsonwebtoken/spring/io/ResourceByteSourceAdapter.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.unbrokendome.jsonwebtoken.spring.io; - -import com.google.common.base.Optional; -import com.google.common.io.ByteSource; -import org.springframework.core.io.Resource; - -import java.io.IOException; -import java.io.InputStream; - - -public final class ResourceByteSourceAdapter extends ByteSource { - - private final Resource resource; - - - public ResourceByteSourceAdapter(Resource resource) { - this.resource = resource; - } - - - @Override - public Optional sizeIfKnown() { - try { - return Optional.of(resource.contentLength()); - } catch (IOException ex) { - return Optional.absent(); - } - } - - - @Override - public InputStream openStream() throws IOException { - return resource.getInputStream(); - } -} diff --git a/jwt/build.gradle b/jwt/build.gradle index 71c43b5..4115574 100644 --- a/jwt/build.gradle +++ b/jwt/build.gradle @@ -7,13 +7,10 @@ apply plugin: 'nebula.optional-base' dependencies { api 'com.fasterxml.jackson.core:jackson-databind' - api 'com.google.guava:guava' - implementation 'org.apache.commons:commons-lang3' implementation 'org.slf4j:slf4j-api' implementation 'nf.fr.eraasoft:objectpool' implementation 'org.bouncycastle:bcpkix-jdk15on', optional implementation 'org.bouncycastle:bcprov-jdk15on', optional - } diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/BinaryData.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/BinaryData.java index 1183767..3a6ad1f 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/BinaryData.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/BinaryData.java @@ -1,11 +1,10 @@ package org.unbrokendome.jsonwebtoken; -import org.apache.commons.lang3.builder.HashCodeBuilder; - import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.Base64; +import java.util.Objects; /** @@ -88,7 +87,7 @@ private boolean equals(BinaryData other) { @Override public int hashCode() { - return new HashCodeBuilder().append(buffer).toHashCode(); + return Objects.hash(buffer); } diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/ClaimsBuilder.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/ClaimsBuilder.java index 247960b..99aa576 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/ClaimsBuilder.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/ClaimsBuilder.java @@ -1,7 +1,5 @@ package org.unbrokendome.jsonwebtoken; -import com.google.common.collect.ImmutableSet; - import javax.annotation.Nonnull; import java.time.Instant; import java.util.Set; @@ -57,7 +55,7 @@ default ClaimsBuilder setAudience(String audience) { */ @Nonnull default ClaimsBuilder setAudiences(Set audiences) { - return set(AUDIENCE, ImmutableSet.copyOf(audiences)); + return set(AUDIENCE, audiences); } diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/IOSupplier.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/IOSupplier.java new file mode 100644 index 0000000..bea8603 --- /dev/null +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/IOSupplier.java @@ -0,0 +1,18 @@ +package org.unbrokendome.jsonwebtoken; + +import java.io.IOException; + + +/** + * Represents a supplier of results which involves some I/O operation. + * + *

Similar to {@link java.util.function.Supplier}, but the {@link #get()} method may throw an + * {@link IOException}. + * + * @param the type of results supplied by this supplier + */ +@FunctionalInterface +public interface IOSupplier { + + T get() throws IOException; +} diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/encoding/JwsCompactDecoder.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/encoding/JwsCompactDecoder.java index 4c1012f..03f67a9 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/encoding/JwsCompactDecoder.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/encoding/JwsCompactDecoder.java @@ -1,13 +1,13 @@ package org.unbrokendome.jsonwebtoken.encoding; -import com.google.common.base.Splitter; -import org.apache.commons.lang3.StringUtils; import org.unbrokendome.jsonwebtoken.BinaryData; import org.unbrokendome.jsonwebtoken.Jws; import org.unbrokendome.jsonwebtoken.encoding.text.Base64TextEncoding; import org.unbrokendome.jsonwebtoken.impl.DefaultJws; +import java.util.Collections; import java.util.List; +import java.util.StringTokenizer; import java.util.function.Function; @@ -15,7 +15,6 @@ public final class JwsCompactDecoder implements JwsDecoder { private static final char SEPARATOR = '.'; - private final Splitter splitter = Splitter.on(SEPARATOR); private final Function textDecoder; @@ -31,7 +30,15 @@ public JwsCompactDecoder() { @Override public Jws decode(String encoded) throws JwtMalformedTokenException { - List parts = splitter.splitToList(encoded); + StringTokenizer tokenizer = new StringTokenizer(encoded, String.valueOf(SEPARATOR)); + @SuppressWarnings({ "unchecked", "rawtypes" }) + List parts = (List) Collections.list(tokenizer); + + // For the NONE algorithm, the token ends with a dot - the signature part is empty. StringTokenizer won't + // add a token for this, so let's add an empty third part manually + if (parts.size() == 2 && encoded.endsWith(".")) { + parts.add(""); + } if (parts.size() != 3) { throw new JwtMalformedTokenException("Token must contain exactly 3 parts separated by a period"); @@ -52,7 +59,7 @@ private BinaryData decodePayload(String encoded) throws JwtMalformedTokenExcepti private BinaryData decodeSignature(String encoded) throws JwtMalformedTokenException { - return StringUtils.isNotEmpty(encoded) ? decodeText(encoded) : BinaryData.EMPTY; + return !encoded.isEmpty() ? decodeText(encoded) : BinaryData.EMPTY; } diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/impl/AbstractMapData.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/impl/AbstractMapData.java index bd976cd..fefde11 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/impl/AbstractMapData.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/impl/AbstractMapData.java @@ -1,10 +1,9 @@ package org.unbrokendome.jsonwebtoken.impl; import com.fasterxml.jackson.annotation.JsonValue; -import com.google.common.collect.ImmutableMap; -import org.apache.commons.lang3.builder.HashCodeBuilder; import java.util.Map; +import java.util.Objects; abstract class AbstractMapData { @@ -13,7 +12,7 @@ abstract class AbstractMapData { protected AbstractMapData(Map map) { - this.map = ImmutableMap.copyOf(map); + this.map = map; } @@ -41,7 +40,7 @@ private boolean equals(AbstractMapData other) { @Override public int hashCode() { - return new HashCodeBuilder().append(map).toHashCode(); + return Objects.hash(map); } diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/impl/AbstractMapDataBuilder.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/impl/AbstractMapDataBuilder.java index 449e1b3..122b0bf 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/impl/AbstractMapDataBuilder.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/impl/AbstractMapDataBuilder.java @@ -1,11 +1,12 @@ package org.unbrokendome.jsonwebtoken.impl; -import com.google.common.collect.ImmutableMap; import org.unbrokendome.jsonwebtoken.MapData; import org.unbrokendome.jsonwebtoken.MapDataBuilder; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.Collections; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @@ -26,7 +27,7 @@ public Object get(String key) { @Override @Nonnull public Map asMap() { - return ImmutableMap.copyOf(map); + return Collections.unmodifiableMap(new HashMap<>(map)); } diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/impl/DefaultJwtDecodingProcessorBuilder.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/impl/DefaultJwtDecodingProcessorBuilder.java index b7f523b..0a1fc04 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/impl/DefaultJwtDecodingProcessorBuilder.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/impl/DefaultJwtDecodingProcessorBuilder.java @@ -1,9 +1,6 @@ package org.unbrokendome.jsonwebtoken.impl; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; import org.unbrokendome.jsonwebtoken.JwtDecodeOnlyProcessorBuilder; import org.unbrokendome.jsonwebtoken.JwtDecodingProcessor; import org.unbrokendome.jsonwebtoken.encoding.DefaultHeaderDeserializer; @@ -18,7 +15,9 @@ import org.unbrokendome.jsonwebtoken.signature.provider.PoolConfigurer; import java.security.Key; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.function.Function; @@ -28,7 +27,7 @@ public final class DefaultJwtDecodingProcessorBuilder implements JwtDecodeOnlyProcessorBuilder { private final Map>> verifierBuilders = new HashMap<>(); - private final ImmutableList.Builder> payloadDeserializers = ImmutableList.builder(); + private final List> payloadDeserializers = new ArrayList<>(); @Override @@ -59,13 +58,12 @@ public JwtDecodingProcessor build() { PoolConfigurer poolConfigurer = getPoolConfigurer(); - @SuppressWarnings("ConstantConditions") - Map> verifiers = Maps.transformValues(verifierBuilders, - f -> f.apply(poolConfigurer)); + Map> verifiers = new HashMap<>(verifierBuilders.size()); + verifierBuilders.forEach((key, f) -> verifiers.put(key, f.apply(poolConfigurer))); return new DefaultJwtDecodingProcessor( - payloadDeserializers.build(), - ImmutableMap.copyOf(verifiers), + payloadDeserializers, + verifiers, new DefaultHeaderDeserializer(objectMapper), new JwsCompactDecoder()); } diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/impl/DefaultJwtEncodingProcessorBuilder.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/impl/DefaultJwtEncodingProcessorBuilder.java index 9375dde..a65f727 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/impl/DefaultJwtEncodingProcessorBuilder.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/impl/DefaultJwtEncodingProcessorBuilder.java @@ -1,7 +1,6 @@ package org.unbrokendome.jsonwebtoken.impl; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.ImmutableList; import org.unbrokendome.jsonwebtoken.JwtEncodeOnlyProcessorBuilder; import org.unbrokendome.jsonwebtoken.JwtEncodingProcessor; import org.unbrokendome.jsonwebtoken.encoding.DefaultHeaderSerializer; @@ -18,13 +17,15 @@ import javax.annotation.Nullable; import java.security.Key; +import java.util.ArrayList; +import java.util.List; public final class DefaultJwtEncodingProcessorBuilder extends AbstractJwtProcessorBuilder implements JwtEncodeOnlyProcessorBuilder { - private final ImmutableList.Builder payloadSerializers = ImmutableList.builder(); + private final List payloadSerializers = new ArrayList<>(); private SignatureAlgorithm signingAlgorithm = SignatureAlgorithms.NONE; @Nullable private SigningKeyResolver signingKeyResolver; @@ -57,7 +58,7 @@ public JwtEncodingProcessor build() { Signer signer = signingAlgorithm.createSigner(getPoolConfigurer()); return new DefaultJwtEncodingProcessor( - payloadSerializers.build(), + payloadSerializers, signingAlgorithm, signer, signingKeyResolver != null ? signingKeyResolver : NoneKeyResolver.getInstance(), new DefaultHeaderSerializer(objectMapper), diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/KeyLoader.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/KeyLoader.java index fadc5cf..549a93e 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/KeyLoader.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/KeyLoader.java @@ -1,6 +1,6 @@ package org.unbrokendome.jsonwebtoken.signature; -import com.google.common.io.ByteSource; +import org.unbrokendome.jsonwebtoken.IOSupplier; import java.io.IOException; import java.security.Key; @@ -22,5 +22,5 @@ public interface KeyLoader { * @throws IOException for I/O errors * @throws InvalidKeySpecException if the binary resource does not match the expected key format */ - TKey load(ByteSource source) throws IOException, InvalidKeySpecException; + TKey load(IOSupplier source) throws IOException, InvalidKeySpecException; } diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/SignatureAlgorithm.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/SignatureAlgorithm.java index a953f01..64b089e 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/SignatureAlgorithm.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/SignatureAlgorithm.java @@ -1,8 +1,8 @@ package org.unbrokendome.jsonwebtoken.signature; -import org.apache.commons.lang3.tuple.Pair; import org.unbrokendome.jsonwebtoken.JoseHeaderBuilder; import org.unbrokendome.jsonwebtoken.signature.provider.PoolConfigurer; +import org.unbrokendome.jsonwebtoken.util.Pair; import javax.annotation.Nullable; import java.security.Key; diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/AbstractAsymmetricSignatureAlgorithm.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/AbstractAsymmetricSignatureAlgorithm.java index a506dd1..ad4afc4 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/AbstractAsymmetricSignatureAlgorithm.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/AbstractAsymmetricSignatureAlgorithm.java @@ -1,6 +1,5 @@ package org.unbrokendome.jsonwebtoken.signature.impl; -import org.apache.commons.lang3.tuple.Pair; import org.unbrokendome.jsonwebtoken.signature.AsymmetricSignatureAlgorithm; import org.unbrokendome.jsonwebtoken.signature.KeyLoader; import org.unbrokendome.jsonwebtoken.signature.Signer; @@ -8,6 +7,7 @@ import org.unbrokendome.jsonwebtoken.signature.provider.AlgorithmProvider; import org.unbrokendome.jsonwebtoken.signature.provider.AlgorithmProviders; import org.unbrokendome.jsonwebtoken.signature.provider.PoolConfigurer; +import org.unbrokendome.jsonwebtoken.util.Pair; import javax.annotation.Nullable; import java.security.KeyFactory; diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/MacSignatureAlgorithm.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/MacSignatureAlgorithm.java index feba1a4..1649170 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/MacSignatureAlgorithm.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/MacSignatureAlgorithm.java @@ -1,11 +1,11 @@ package org.unbrokendome.jsonwebtoken.signature.impl; -import org.apache.commons.lang3.tuple.Pair; import org.unbrokendome.jsonwebtoken.signature.KeyLoader; import org.unbrokendome.jsonwebtoken.signature.Signer; import org.unbrokendome.jsonwebtoken.signature.Verifier; import org.unbrokendome.jsonwebtoken.signature.provider.AlgorithmProviders; import org.unbrokendome.jsonwebtoken.signature.provider.PoolConfigurer; +import org.unbrokendome.jsonwebtoken.util.Pair; import javax.annotation.Nullable; import javax.crypto.SecretKey; @@ -31,7 +31,7 @@ public Signer createSigner(@Nullable PoolConfigurer poolConfigurer) { @Override public Verifier createVerifier(@Nullable PoolConfigurer poolConfigurer) { - return createSignerAndVerifier(poolConfigurer).getRight(); + return createSignerAndVerifier(poolConfigurer).getSecond(); } diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/NoneSignatureAlgorithm.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/NoneSignatureAlgorithm.java index a977e9b..88f056b 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/NoneSignatureAlgorithm.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/NoneSignatureAlgorithm.java @@ -1,6 +1,6 @@ package org.unbrokendome.jsonwebtoken.signature.impl; -import com.google.common.io.ByteSource; +import org.unbrokendome.jsonwebtoken.IOSupplier; import org.unbrokendome.jsonwebtoken.signature.KeyLoader; import org.unbrokendome.jsonwebtoken.signature.SignatureAlgorithm; import org.unbrokendome.jsonwebtoken.signature.Signer; @@ -8,6 +8,7 @@ import org.unbrokendome.jsonwebtoken.signature.provider.PoolConfigurer; import javax.annotation.Nullable; +import java.io.InputStream; import java.security.Key; @@ -64,7 +65,7 @@ private NoneKeyLoader() { } @Override - public Key load(ByteSource source) { + public Key load(IOSupplier source) { return NoneKey.getInstance(); } } diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/PKCS8PrivateKeyLoader.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/PKCS8PrivateKeyLoader.java index 642a583..586ccc6 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/PKCS8PrivateKeyLoader.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/PKCS8PrivateKeyLoader.java @@ -1,6 +1,6 @@ package org.unbrokendome.jsonwebtoken.signature.impl; -import com.google.common.io.ByteSource; +import org.unbrokendome.jsonwebtoken.IOSupplier; import org.unbrokendome.jsonwebtoken.signature.KeyLoader; import java.io.IOException; @@ -23,9 +23,9 @@ public PKCS8PrivateKeyLoader(Supplier keyFactorySupplier) { @Override - public PrivateKey load(ByteSource source) throws IOException, InvalidKeySpecException { + public PrivateKey load(IOSupplier source) throws IOException, InvalidKeySpecException { - KeySpec keySpec = new PKCS8EncodedKeySpec(source.read()); + KeySpec keySpec = new PKCS8EncodedKeySpec(source.get()); KeyFactory keyFactory = keyFactorySupplier.get(); return keyFactory.generatePrivate(keySpec); diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/PublicKeyExtractorChain.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/PublicKeyExtractorChain.java index ba459de..5139ad6 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/PublicKeyExtractorChain.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/PublicKeyExtractorChain.java @@ -1,21 +1,19 @@ package org.unbrokendome.jsonwebtoken.signature.impl; -import com.google.common.collect.ImmutableList; - import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; -import java.util.Collection; +import java.util.List; public class PublicKeyExtractorChain implements PublicKeyExtractor { - private final Collection extractors; + private final List extractors; - public PublicKeyExtractorChain(Iterable extractors) { - this.extractors = ImmutableList.copyOf(extractors); + public PublicKeyExtractorChain(List extractors) { + this.extractors = extractors; } diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/PublicKeyFromPrivateKeyLoader.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/PublicKeyFromPrivateKeyLoader.java index 23204dd..00e0597 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/PublicKeyFromPrivateKeyLoader.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/PublicKeyFromPrivateKeyLoader.java @@ -1,6 +1,6 @@ package org.unbrokendome.jsonwebtoken.signature.impl; -import com.google.common.io.ByteSource; +import org.unbrokendome.jsonwebtoken.IOSupplier; import org.unbrokendome.jsonwebtoken.signature.KeyLoader; import java.io.IOException; @@ -27,7 +27,7 @@ public PublicKeyFromPrivateKeyLoader(KeyLoader privateKeyLoader, @Override - public PublicKey load(ByteSource source) throws IOException, InvalidKeySpecException { + public PublicKey load(IOSupplier source) throws IOException, InvalidKeySpecException { PrivateKey privateKey = privateKeyLoader.load(source); return publicKeyExtractor.publicKeyFromPrivateKey(privateKey, keyFactory); } diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/SecretKeyLoader.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/SecretKeyLoader.java index a8547a1..ce14450 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/SecretKeyLoader.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/SecretKeyLoader.java @@ -1,6 +1,6 @@ package org.unbrokendome.jsonwebtoken.signature.impl; -import com.google.common.io.ByteSource; +import org.unbrokendome.jsonwebtoken.IOSupplier; import org.unbrokendome.jsonwebtoken.signature.KeyLoader; import javax.crypto.SecretKey; @@ -22,8 +22,8 @@ public SecretKeyLoader(String algorithm) { @Override - public SecretKey load(ByteSource source) throws IOException { - byte[] bytes = source.read(); + public SecretKey load(IOSupplier source) throws IOException { + byte[] bytes = source.get(); return new SecretKeySpec(bytes, algorithm); } } diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/SignaturePublicKeyVerifier.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/SignaturePublicKeyVerifier.java index 0a1caf0..1bc7206 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/SignaturePublicKeyVerifier.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/SignaturePublicKeyVerifier.java @@ -1,6 +1,5 @@ package org.unbrokendome.jsonwebtoken.signature.impl; -import com.google.common.base.Preconditions; import org.unbrokendome.jsonwebtoken.BinaryData; import org.unbrokendome.jsonwebtoken.signature.JwsSignatureException; import org.unbrokendome.jsonwebtoken.signature.JwsSignatureMismatchException; @@ -34,7 +33,9 @@ public SignaturePublicKeyVerifier(AlgorithmProvider provider) { public void verify(BinaryData header, BinaryData payload, BinaryData signature, @Nullable PublicKey key) throws JwsSignatureException { - Preconditions.checkArgument(key != null, "Verification key must not be null"); + if (key == null) { + throw new IllegalArgumentException("Verification key must not be null"); + } try { if (!doVerify(header, payload, signature, key)) { diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/SignerVerifier.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/SignerVerifier.java index bcc43e3..d5df6fe 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/SignerVerifier.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/SignerVerifier.java @@ -1,6 +1,5 @@ package org.unbrokendome.jsonwebtoken.signature.impl; -import com.google.common.base.Preconditions; import org.unbrokendome.jsonwebtoken.BinaryData; import org.unbrokendome.jsonwebtoken.signature.JwsSignatureException; import org.unbrokendome.jsonwebtoken.signature.JwsSignatureMismatchException; @@ -34,7 +33,9 @@ public SignerVerifier(Signer signer) { public void verify(BinaryData header, BinaryData payload, BinaryData signature, @Nullable TKey key) throws JwsSignatureException { - Preconditions.checkArgument(key != null, "Key must not be null"); + if (key == null) { + throw new IllegalArgumentException("Key must not be null"); + } BinaryData expectedSignature = signer.sign(header, payload, key); if (!expectedSignature.equals(signature)) { diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/X509PublicKeyLoader.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/X509PublicKeyLoader.java index 61bf2d8..0bfe27a 100644 --- a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/X509PublicKeyLoader.java +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/signature/impl/X509PublicKeyLoader.java @@ -1,15 +1,13 @@ package org.unbrokendome.jsonwebtoken.signature.impl; -import com.google.common.io.ByteSource; +import org.unbrokendome.jsonwebtoken.IOSupplier; import org.unbrokendome.jsonwebtoken.signature.KeyLoader; import java.io.IOException; import java.security.KeyFactory; -import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.KeySpec; -import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.function.Supplier; @@ -28,9 +26,9 @@ public X509PublicKeyLoader(Supplier keyFactorySupplier) { @Override - public PublicKey load(ByteSource source) throws IOException, InvalidKeySpecException { + public PublicKey load(IOSupplier source) throws IOException, InvalidKeySpecException { - KeySpec keySpec = new X509EncodedKeySpec(source.read()); + KeySpec keySpec = new X509EncodedKeySpec(source.get()); KeyFactory keyFactory = keyFactorySupplier.get(); return keyFactory.generatePublic(keySpec); diff --git a/jwt/src/main/java/org/unbrokendome/jsonwebtoken/util/Pair.java b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/util/Pair.java new file mode 100644 index 0000000..aaef9f2 --- /dev/null +++ b/jwt/src/main/java/org/unbrokendome/jsonwebtoken/util/Pair.java @@ -0,0 +1,28 @@ +package org.unbrokendome.jsonwebtoken.util; + +public class Pair { + + private final T1 first; + private final T2 second; + + + public Pair(T1 first, T2 second) { + this.first = first; + this.second = second; + } + + + public static Pair of(T1 first, T2 second) { + return new Pair<>(first, second); + } + + + public T1 getFirst() { + return first; + } + + + public T2 getSecond() { + return second; + } +}