This is an automated email from the ASF dual-hosted git repository.
btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-jdkim.git
The following commit(s) were added to refs/heads/master by this push:
new 65ff762 Remove commons-codec
65ff762 is described below
commit 65ff762e05271ec8b64642070ed16dd15d165b8f
Author: Emerson Pinter <[email protected]>
AuthorDate: Thu Oct 2 20:46:40 2025 -0300
Remove commons-codec
---
main/pom.xml | 34 ----------------------
.../java/org/apache/james/jdkim/DKIMSigner.java | 5 ++--
.../java/org/apache/james/jdkim/DKIMVerifier.java | 10 +++++--
.../james/jdkim/tagvalue/PublicKeyRecordImpl.java | 4 +--
.../james/jdkim/tagvalue/SignatureRecordImpl.java | 10 +++----
.../jdkim/tagvalue/SignatureRecordTemplate.java | 14 ++++-----
.../org/apache/james/jdkim/tagvalue/TagValue.java | 12 +++++++-
.../test/java/org/apache/james/jdkim/DKIMTest.java | 6 ++--
.../james/jdkim/SignatureRecordImplTest.java | 16 ++++++++++
.../test/java/org/apache/james/jdkim/TestKeys.java | 7 ++---
pom.xml | 6 ----
11 files changed, 57 insertions(+), 67 deletions(-)
diff --git a/main/pom.xml b/main/pom.xml
index 1f1d29e..29db1aa 100644
--- a/main/pom.xml
+++ b/main/pom.xml
@@ -35,10 +35,6 @@
<inceptionYear>2008</inceptionYear>
<dependencies>
- <dependency>
- <groupId>commons-codec</groupId>
- <artifactId>commons-codec</artifactId>
- </dependency>
<dependency>
<groupId>dnsjava</groupId>
<artifactId>dnsjava</artifactId>
@@ -94,36 +90,6 @@
</execution>
</executions>
</plugin>
- <!-- Shading commons-codec Base64 class so that we don't have one more dependency -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- <version>3.6.0</version>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- <configuration>
- <artifactSet>
- <includes>
- <include>commons-codec:commons-codec</include>
- </includes>
- </artifactSet>
- <relocations>
- <relocation>
- <pattern>org.apache.commons.codec</pattern>
- <shadedPattern>org.apache.james.jdkim.codec</shadedPattern>
- </relocation>
- </relocations>
- <transformers>
- <transformer implementation="org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformer" />
- </transformers>
- </configuration>
- </execution>
- </executions>
- </plugin>
<plugin>
<groupId>org.apache.rat</groupId>
<artifactId>apache-rat-plugin</artifactId>
diff --git a/main/src/main/java/org/apache/james/jdkim/DKIMSigner.java b/main/src/main/java/org/apache/james/jdkim/DKIMSigner.java
index 7f05aa7..c280d40 100644
--- a/main/src/main/java/org/apache/james/jdkim/DKIMSigner.java
+++ b/main/src/main/java/org/apache/james/jdkim/DKIMSigner.java
@@ -21,7 +21,6 @@ package org.apache.james.jdkim;
import static org.apache.james.jdkim.DKIMCommon.signatureCheck;
-import org.apache.commons.codec.binary.Base64;
import org.apache.james.jdkim.api.BodyHasher;
import org.apache.james.jdkim.api.Headers;
import org.apache.james.jdkim.api.SignatureRecord;
@@ -41,6 +40,7 @@ import java.security.Signature;
import java.security.SignatureException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.Base64;
import java.util.List;
public class DKIMSigner {
@@ -160,7 +160,8 @@ public class DKIMSigner {
*/
public static PrivateKey getPrivateKey(String privateKeyPKCS8)
throws NoSuchAlgorithmException, InvalidKeySpecException {
- byte[] encKey = Base64.decodeBase64(privateKeyPKCS8.getBytes());
+ byte[] encKey = Base64.getMimeDecoder().decode(privateKeyPKCS8.getBytes());
+
// byte[] encKey = privateKey.getBytes();
PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(encKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
diff --git a/main/src/main/java/org/apache/james/jdkim/DKIMVerifier.java b/main/src/main/java/org/apache/james/jdkim/DKIMVerifier.java
index 44537a1..07c1ddc 100644
--- a/main/src/main/java/org/apache/james/jdkim/DKIMVerifier.java
+++ b/main/src/main/java/org/apache/james/jdkim/DKIMVerifier.java
@@ -295,9 +295,13 @@ public class DKIMVerifier {
List<CharSequence> signedHeadersList = signatureRecord.getHeaders();
- byte[] decoded = signatureRecord.getSignature();
- signatureVerify(messageHeaders, signatureRecord, decoded,
- publicKeyRecord, signedHeadersList);
+ try {
+ byte[] decoded = signatureRecord.getSignature();
+ signatureVerify(messageHeaders, signatureRecord, decoded,
+ publicKeyRecord, signedHeadersList);
+ } catch (IllegalArgumentException e) {
+ throw new PermFailException("Invalid signature record: " + e.getMessage(), signatureRecord, e);
+ }
// we track all canonicalizations+limit+bodyHash we
// see so to be able to check all of them in a single
diff --git a/main/src/main/java/org/apache/james/jdkim/tagvalue/PublicKeyRecordImpl.java b/main/src/main/java/org/apache/james/jdkim/tagvalue/PublicKeyRecordImpl.java
index c1225d9..d482eab 100644
--- a/main/src/main/java/org/apache/james/jdkim/tagvalue/PublicKeyRecordImpl.java
+++ b/main/src/main/java/org/apache/james/jdkim/tagvalue/PublicKeyRecordImpl.java
@@ -19,7 +19,6 @@
package org.apache.james.jdkim.tagvalue;
-import org.apache.commons.codec.binary.Base64;
import org.apache.james.jdkim.api.PublicKeyRecord;
import java.security.KeyFactory;
@@ -29,6 +28,7 @@ import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
+import java.util.Base64;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -178,7 +178,7 @@ public class PublicKeyRecordImpl extends TagValue implements PublicKeyRecord {
public PublicKey getPublicKey() {
try {
String p = getValue("p").toString();
- byte[] key = Base64.decodeBase64(p.getBytes());
+ byte[] key = Base64.getMimeDecoder().decode(p.getBytes());
KeyFactory keyFactory;
keyFactory = KeyFactory.getInstance(getValue("k").toString());
X509EncodedKeySpec pubSpec = new X509EncodedKeySpec(key);
diff --git a/main/src/main/java/org/apache/james/jdkim/tagvalue/SignatureRecordImpl.java b/main/src/main/java/org/apache/james/jdkim/tagvalue/SignatureRecordImpl.java
index dfa3e1c..c2cfc88 100644
--- a/main/src/main/java/org/apache/james/jdkim/tagvalue/SignatureRecordImpl.java
+++ b/main/src/main/java/org/apache/james/jdkim/tagvalue/SignatureRecordImpl.java
@@ -21,9 +21,9 @@ package org.apache.james.jdkim.tagvalue;
import static org.apache.james.jdkim.parser.DKIMQuotedPrintable.dkimQuotedPrintableDecode;
-import org.apache.commons.codec.binary.Base64;
import org.apache.james.jdkim.api.SignatureRecord;
+import java.util.Base64;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Pattern;
@@ -215,11 +215,11 @@ public class SignatureRecordImpl extends TagValue implements SignatureRecord {
}
public byte[] getBodyHash() {
- return Base64.decodeBase64(getValue("bh").toString().getBytes());
+ return decodeBase64TagValue("bh");
}
public byte[] getSignature() {
- return Base64.decodeBase64(getValue("b").toString().getBytes());
+ return decodeBase64TagValue("b");
}
public CharSequence getRawSignature() {
@@ -274,12 +274,12 @@ public class SignatureRecordImpl extends TagValue implements SignatureRecord {
}
public void setSignature(byte[] newSignature) {
- String signature = new String(Base64.encodeBase64(newSignature));
+ String signature = new String(Base64.getMimeDecoder().decode(newSignature));
setValue("b", signature);
}
public void setBodyHash(byte[] newBodyHash) {
- String bodyHash = new String(Base64.encodeBase64(newBodyHash));
+ String bodyHash = new String(Base64.getMimeDecoder().decode(newBodyHash));
setValue("bh", bodyHash);
// If a t=; parameter is present in the signature, make sure to
// fill it with the current timestamp
diff --git a/main/src/main/java/org/apache/james/jdkim/tagvalue/SignatureRecordTemplate.java b/main/src/main/java/org/apache/james/jdkim/tagvalue/SignatureRecordTemplate.java
index 186c3c8..d33bab4 100644
--- a/main/src/main/java/org/apache/james/jdkim/tagvalue/SignatureRecordTemplate.java
+++ b/main/src/main/java/org/apache/james/jdkim/tagvalue/SignatureRecordTemplate.java
@@ -19,12 +19,12 @@
package org.apache.james.jdkim.tagvalue;
+import java.util.Base64;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
-import org.apache.commons.codec.binary.Base64;
import org.apache.james.jdkim.api.HashMethod;
import org.apache.james.jdkim.api.SignatureRecord;
import org.apache.james.jdkim.api.SigningAlgorithm;
@@ -223,11 +223,11 @@ public class SignatureRecordTemplate extends TagValue implements SignatureRecord
}
public byte[] getBodyHash() {
- return Base64.decodeBase64(getValue("bh").toString().getBytes());
+ return decodeBase64TagValue("bh");
}
public byte[] getSignature() {
- return Base64.decodeBase64(getValue("b").toString().getBytes());
+ return decodeBase64TagValue("b");
}
public CharSequence getRawSignature() {
@@ -282,12 +282,12 @@ public class SignatureRecordTemplate extends TagValue implements SignatureRecord
}
public void setSignature(byte[] newSignature) {
- String signature = new String(Base64.encodeBase64(newSignature));
+ String signature = new String(Base64.getEncoder().encode(newSignature));
setValue("b", signature);
}
public void setBodyHash(byte[] newBodyHash) {
- String bodyHash = new String(Base64.encodeBase64(newBodyHash));
+ String bodyHash = new String(Base64.getEncoder().encode(newBodyHash));
setValue("bh", bodyHash);
// If a t=; parameter is present in the signature, make sure to
// fill it with the current timestamp
@@ -299,10 +299,10 @@ public class SignatureRecordTemplate extends TagValue implements SignatureRecord
public SignatureRecordImpl toSignatureRecord(SigningAlgorithm algorithm, HashMethod hashMethod, byte[] bodyHash, byte[] signature) {
setValue("a", algorithm.asTagValue() + "-" + hashMethod.asTagValue());
- String bodyHashTagValue = new String(Base64.encodeBase64(bodyHash));
+ String bodyHashTagValue = new String(Base64.getEncoder().encode(bodyHash));
setValue("bh", bodyHashTagValue);
- String signatureTagValue = new String(Base64.encodeBase64(signature));
+ String signatureTagValue = new String(Base64.getEncoder().encode(signature));
setValue("b", signatureTagValue);
// If a t=; parameter is present in the signature, make sure to
// fill it with the current timestamp
diff --git a/main/src/main/java/org/apache/james/jdkim/tagvalue/TagValue.java b/main/src/main/java/org/apache/james/jdkim/tagvalue/TagValue.java
index 6af2d22..68562a5 100644
--- a/main/src/main/java/org/apache/james/jdkim/tagvalue/TagValue.java
+++ b/main/src/main/java/org/apache/james/jdkim/tagvalue/TagValue.java
@@ -20,6 +20,7 @@
package org.apache.james.jdkim.tagvalue;
import java.util.ArrayList;
+import java.util.Base64;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -44,6 +45,7 @@ public class TagValue {
// Use possessive matching to avoid heavy stack usage
private static final Pattern valuePattern = Pattern.compile("^(?:" + tval
+ "(?:(?:(?:\r\n)?[\t ])++" + tval + ")*+)?$");
+ private static final Pattern b64PadFixPattern = Pattern.compile("=(\r?\n\\s*)=$");
// we may use a TreeMap because we may need to know original order.
private final Map<String, CharSequence> tagValues;
@@ -219,7 +221,15 @@ public class TagValue {
else
return val;
}
-
+
+ protected byte[] decodeBase64TagValue(String key) {
+ // When a base64 string ends with a newline between two '=', java.util.Base64 fails.
+ String value = getValue(key).toString();
+ return Base64.getMimeDecoder().decode(
+ b64PadFixPattern.matcher(value).replaceAll("$1==")
+ );
+ }
+
protected void setValue(String tag, String value) {
stringRepresentation = null;
tagValues.put(tag, value);
diff --git a/main/src/test/java/org/apache/james/jdkim/DKIMTest.java b/main/src/test/java/org/apache/james/jdkim/DKIMTest.java
index fce5524..09f7441 100644
--- a/main/src/test/java/org/apache/james/jdkim/DKIMTest.java
+++ b/main/src/test/java/org/apache/james/jdkim/DKIMTest.java
@@ -33,9 +33,9 @@ import java.net.URISyntaxException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
+import java.util.Base64;
import java.util.List;
-import org.apache.commons.codec.binary.Base64;
import org.apache.james.jdkim.MockPublicKeyRecordRetriever.Record;
import org.apache.james.jdkim.api.Headers;
import org.apache.james.jdkim.api.Result;
@@ -49,12 +49,12 @@ public class DKIMTest {
Record.of(
"selector2",
"messiah.edu",
- "k=rsa; p=" + Base64.encodeBase64String(TestKeys.publicKey.getEncoded()) + ";"
+ "k=rsa; p=" + Base64.getEncoder().encodeToString(TestKeys.publicKey.getEncoded()) + ";"
),
Record.of(
"selector3",
"messiah.edu",
- "k=rsa; p=" + Base64.encodeBase64String(TestKeys.publicKey_2.getEncoded()) + ";"
+ "k=rsa; p=" + Base64.getEncoder().encodeToString(TestKeys.publicKey_2.getEncoded()) + ";"
)
);
diff --git a/main/src/test/java/org/apache/james/jdkim/SignatureRecordImplTest.java b/main/src/test/java/org/apache/james/jdkim/SignatureRecordImplTest.java
index d31ef44..d380ec1 100644
--- a/main/src/test/java/org/apache/james/jdkim/SignatureRecordImplTest.java
+++ b/main/src/test/java/org/apache/james/jdkim/SignatureRecordImplTest.java
@@ -24,6 +24,7 @@ import org.apache.james.jdkim.tagvalue.SignatureRecordImpl;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import org.junit.Assert;
import org.junit.Test;
public class SignatureRecordImplTest {
@@ -132,4 +133,19 @@ public class SignatureRecordImplTest {
).hasMessageContaining("expired");
}
+ @Test
+ public void should_parse_signature_with_newline_between_padding() {
+ String signature = "v=1; a=rsa-sha256; q=dns/txt; c=simple; s=selector2; d=messiah.edu; bh=6pQY\r\n" +
+ " 5V6Dw8mCYWq017gfbpv+x2X4GvOhIIZtKw6iU6g=; h=date:from:subject; b=Axa\r\n" +
+ " 8s/gTnnJ8em45KV/AQw33hQ4uYtBKiQp3dLq7oRFt+WmDZ5ZErPq4lBVXfP+IAvP+Au9\r\n" +
+ " 1J8270ivn1J/6E0YqKntn4s1hjcNBPPRVohvmlcQ1mEMd6DuYDtWjDFwG2GWZwtilaPY\r\n" +
+ " 2afhlTuAbHkn8nHm7MVtAGETO8QQ2zfD1NSGzKbNYP9I+hrDJq5ajka6PZn1d+mDhUH5\r\n" +
+ " Px8yScYqo5i8Z8GXaejSIu7RsLDuxtOO2cuClRi8MKGxc7MiGndMufXB8xbS1L80IFly\r\n" +
+ " unOVY5eBaqnnhF2YrDDQfZ6DTqorzX6D5dNjpjOG6AbsqkW83Drx0TTV/5M0raU1SIw=\r\n" +
+ " =";
+
+ SignatureRecordImpl signatureRecord = new SignatureRecordImpl(signature);
+ Assert.assertTrue(signatureRecord.getSignature().length > 0);
+ Assert.assertTrue(signatureRecord.getBodyHash().length > 0);
+ }
}
diff --git a/main/src/test/java/org/apache/james/jdkim/TestKeys.java b/main/src/test/java/org/apache/james/jdkim/TestKeys.java
index 82b1900..72265ed 100644
--- a/main/src/test/java/org/apache/james/jdkim/TestKeys.java
+++ b/main/src/test/java/org/apache/james/jdkim/TestKeys.java
@@ -31,8 +31,7 @@ import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
-
-import org.apache.commons.codec.binary.Base64;
+import java.util.Base64;
public class TestKeys {
public static final PrivateKey privateKey = loadPrivateKey("org/apache/james/jdkim/keys/private.key");
@@ -50,7 +49,7 @@ public class TestKeys {
.replace("-----BEGIN PUBLIC KEY-----", "")
.replace("-----END PUBLIC KEY-----", "")
.replaceAll(System.lineSeparator(), "");
- byte[] encoded = Base64.decodeBase64(keyText);
+ byte[] encoded = Base64.getMimeDecoder().decode(keyText);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded);
return keyFactory.generatePublic(keySpec);
@@ -71,7 +70,7 @@ public class TestKeys {
.replace("-----BEGIN PRIVATE KEY-----", "")
.replace("-----END PRIVATE KEY-----", "")
.replaceAll(System.lineSeparator(), "");
- byte[] encoded = Base64.decodeBase64(keyText);
+ byte[] encoded = Base64.getMimeDecoder().decode(keyText);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
return keyFactory.generatePrivate(keySpec);
diff --git a/pom.xml b/pom.xml
index 3f78004..696678e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,7 +62,6 @@
<properties>
<apache-mime4j.version>0.8.12</apache-mime4j.version>
- <commons-codec.version>1.18.0</commons-codec.version>
<dnsjava.version>3.6.3</dnsjava.version>
<james-skin.version>1.8</james-skin.version>
<junit.version>4.13.2</junit.version>
@@ -71,11 +70,6 @@
<dependencyManagement>
<dependencies>
- <dependency>
- <groupId>commons-codec</groupId>
- <artifactId>commons-codec</artifactId>
- <version>${commons-codec.version}</version>
- </dependency>
<dependency>
<groupId>dnsjava</groupId>
<artifactId>dnsjava</artifactId>
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.