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>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]