Skip to content

Commit 07e0cd8

Browse files
committed
Remove commons-codec dependency
We used this only in tests, Java security provides the functionality.
1 parent fc3e461 commit 07e0cd8

File tree

7 files changed

+40
-37
lines changed

7 files changed

+40
-37
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ Running S3Mock in unit tests is still supported by using [TestContainers](https:
150150
* Remove JUnit 4.x support.
151151
* Remove legacy properties for S3Mock configuration.
152152
* Move all controller-related code from "com.adobe.testing.s3mock" to com.adobe.testing.s3mock.controller package.
153+
* Remove Apache libraries like "commons-compress", "commons-codec" or "commons-lang3" from dependencies. Kotlin and Java standard library provide similar functionality.
153154
* Version updates
154155
* Bump Spring Boot version to 4.x
155156
* Bump Spring Framework version to 7.x

integration-tests/src/test/kotlin/com/adobe/testing/s3mock/its/CrtAsyncIT.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package com.adobe.testing.s3mock.its
1818

1919
import com.adobe.testing.s3mock.util.DigestUtil
20-
import org.apache.commons.codec.digest.DigestUtils
2120
import org.assertj.core.api.Assertions.assertThat
2221
import org.junit.jupiter.api.Test
2322
import org.junit.jupiter.api.TestInfo
@@ -29,6 +28,7 @@ import software.amazon.awssdk.transfer.s3.S3TransferManager
2928
import software.amazon.awssdk.transfer.s3.model.DownloadRequest
3029
import java.io.ByteArrayInputStream
3130
import java.nio.charset.StandardCharsets
31+
import java.security.MessageDigest
3232

3333
internal class CrtAsyncIT : S3TestBase() {
3434
private val autoS3CrtAsyncClient: S3AsyncClient = createAutoS3CrtAsyncClient()
@@ -163,10 +163,11 @@ internal class CrtAsyncIT : S3TestBase() {
163163
}, AsyncResponseTransformer.toBytes())
164164
.join()
165165

166+
val md5 = MessageDigest.getInstance("MD5")
166167
val uploadFileBytes = readStreamIntoByteArray(UPLOAD_FILE.inputStream())
167-
(DigestUtils.md5(randomBytes) + DigestUtils.md5(uploadFileBytes)).also {
168+
(md5.digest(randomBytes) + md5.digest(uploadFileBytes)).also {
168169
// verify special etag
169-
assertThat(completeMultipartUploadResponse.eTag()).isEqualTo("\"${DigestUtils.md5Hex(it)}-2\"")
170+
assertThat(completeMultipartUploadResponse.eTag()).isEqualTo("\"${md5.digest(it).joinToString("") { "%02x".format(it) }}-2\"")
170171
}
171172

172173
// verify content size

integration-tests/src/test/kotlin/com/adobe/testing/s3mock/its/MultipartIT.kt

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package com.adobe.testing.s3mock.its
1818
import com.adobe.testing.s3mock.S3Exception.Companion.PRECONDITION_FAILED
1919
import com.adobe.testing.s3mock.util.DigestUtil
2020
import com.adobe.testing.s3mock.util.DigestUtil.hexDigest
21-
import org.apache.commons.codec.digest.DigestUtils
2221
import org.assertj.core.api.Assertions.assertThat
2322
import org.assertj.core.api.Assertions.assertThatThrownBy
2423
import org.assertj.core.api.InstanceOfAssertFactories
@@ -50,6 +49,7 @@ import software.amazon.awssdk.utils.http.SdkHttpUtils
5049
import java.io.ByteArrayInputStream
5150
import java.io.File
5251
import java.nio.charset.StandardCharsets
52+
import java.security.MessageDigest
5353
import java.time.Instant
5454
import java.util.UUID
5555
import java.util.concurrent.CompletionException
@@ -239,10 +239,10 @@ internal class MultipartIT : S3TestBase() {
239239
}
240240

241241
val uploadFileBytes = readStreamIntoByteArray(UPLOAD_FILE.inputStream())
242-
243-
(DigestUtils.md5(randomBytes) + DigestUtils.md5(uploadFileBytes)).also {
242+
val md5 = MessageDigest.getInstance("MD5")
243+
(md5.digest(randomBytes) + md5.digest(uploadFileBytes)).also {
244244
// verify special etag
245-
assertThat(completeMultipartUpload.eTag()).isEqualTo("\"${DigestUtils.md5Hex(it)}-2\"")
245+
assertThat(completeMultipartUpload.eTag()).isEqualTo("\"${md5.digest(it).joinToString("") { "%02x".format(it) }}-2\"")
246246
}
247247

248248
s3Client
@@ -345,9 +345,10 @@ internal class MultipartIT : S3TestBase() {
345345
}
346346
}
347347

348-
(DigestUtils.md5(tempFile.readBytes()) + DigestUtils.md5(readStreamIntoByteArray(uploadFile.inputStream()))).also {
348+
val md5 = MessageDigest.getInstance("MD5")
349+
(md5.digest(tempFile.readBytes()) + md5.digest(readStreamIntoByteArray(uploadFile.inputStream()))).also {
349350
// verify special etag
350-
assertThat(completeMultipartUpload.eTag()).isEqualTo("\"${DigestUtils.md5Hex(it)}-2\"")
351+
assertThat(completeMultipartUpload.eTag()).isEqualTo("\"${md5.digest(it).joinToString("") { "%02x".format(it) }}-2\"")
351352
}
352353

353354
s3Client
@@ -663,7 +664,8 @@ internal class MultipartIT : S3TestBase() {
663664
fun `list parts lists all uploaded parts`(testInfo: TestInfo) {
664665
val bucketName = givenBucket(testInfo)
665666
val objectMetadata = mapOf("key" to "value")
666-
val hash = UPLOAD_FILE.inputStream().use { DigestUtils.md5Hex(it) }
667+
val md5 = MessageDigest.getInstance("MD5")
668+
val hash = UPLOAD_FILE.inputStream().use { md5.digest(it.readBytes()).joinToString("") { "%02x".format(it) } }
667669
val initiateMultipartUploadResult =
668670
s3Client.createMultipartUpload {
669671
it.bucket(bucketName)
@@ -725,7 +727,8 @@ internal class MultipartIT : S3TestBase() {
725727
fun `list parts lists uploaded parts matching parameters`(testInfo: TestInfo) {
726728
val bucketName = givenBucket(testInfo)
727729
val objectMetadata = mapOf("key" to "value")
728-
val hash = UPLOAD_FILE.inputStream().use { DigestUtils.md5Hex(it) }
730+
val md5 = MessageDigest.getInstance("MD5")
731+
val hash = UPLOAD_FILE.inputStream().use { md5.digest(it.readBytes()).joinToString("") { "%02x".format(it) } }
729732
val initiateMultipartUploadResult =
730733
s3Client.createMultipartUpload {
731734
it.bucket(bucketName)
@@ -1084,10 +1087,11 @@ internal class MultipartIT : S3TestBase() {
10841087
}
10851088
}
10861089

1090+
val md5 = MessageDigest.getInstance("MD5")
10871091
// Verify only 1st and 3rd counts
1088-
(DigestUtils.md5(randomBytes1) + DigestUtils.md5(randomBytes3)).also {
1092+
(md5.digest(randomBytes1) + md5.digest(randomBytes3)).also {
10891093
// verify special etag
1090-
assertThat(result.eTag()).isEqualTo("\"${DigestUtils.md5Hex(it)}-2\"")
1094+
assertThat(result.eTag()).isEqualTo("\"${md5.digest(it).joinToString("") { "%02x".format(it) }}-2\"")
10911095
}
10921096

10931097
s3Client
@@ -1247,10 +1251,11 @@ internal class MultipartIT : S3TestBase() {
12471251
it.parts(parts)
12481252
}
12491253
}
1254+
val md5 = MessageDigest.getInstance("MD5")
12501255
// Verify parts
1251-
(DigestUtils.md5(allRandomBytes[0]) + DigestUtils.md5(allRandomBytes[1])).also {
1256+
(md5.digest(allRandomBytes[0]) + md5.digest(allRandomBytes[1])).also {
12521257
// verify etag
1253-
assertThat(result.eTag()).isEqualTo("\"${DigestUtils.md5Hex(it)}-2\"")
1258+
assertThat(result.eTag()).isEqualTo("\"${md5.digest(it).joinToString("") { "%02x".format(it) }}-2\"")
12541259
}
12551260

12561261
s3Client

pom.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@
8888

8989
<aws-kotlin.version>1.5.77</aws-kotlin.version>
9090

91-
<commons-codec.version>1.20.0</commons-codec.version>
9291
<httpclient.version>4.5.14</httpclient.version>
9392
<httpmime.version>4.5.14</httpmime.version>
9493
<httpcore.version>4.4.16</httpcore.version>
@@ -216,11 +215,6 @@
216215
<artifactId>testcontainers-bom</artifactId>
217216
<version>${testcontainers.version}</version>
218217
</dependency>
219-
<dependency>
220-
<groupId>commons-codec</groupId>
221-
<artifactId>commons-codec</artifactId>
222-
<version>${commons-codec.version}</version>
223-
</dependency>
224218
<dependency>
225219
<groupId>org.testng</groupId>
226220
<artifactId>testng</artifactId>

server/pom.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,6 @@
7878
<groupId>software.amazon.awssdk</groupId>
7979
<artifactId>aws-crt-client</artifactId>
8080
</dependency>
81-
<dependency>
82-
<groupId>commons-codec</groupId>
83-
<artifactId>commons-codec</artifactId>
84-
</dependency>
8581
<dependency>
8682
<groupId>org.jspecify</groupId>
8783
<artifactId>jspecify</artifactId>

server/src/test/kotlin/com/adobe/testing/s3mock/store/MultipartStoreTest.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import com.adobe.testing.s3mock.dto.Part
2424
import com.adobe.testing.s3mock.dto.StorageClass
2525
import com.adobe.testing.s3mock.util.DigestUtil
2626
import com.adobe.testing.s3mock.util.HeaderUtil
27-
import org.apache.commons.codec.digest.DigestUtils
2827
import org.assertj.core.api.Assertions.assertThat
2928
import org.assertj.core.api.Assertions.assertThatThrownBy
3029
import org.junit.jupiter.api.AfterAll
@@ -46,6 +45,7 @@ import java.io.IOException
4645
import java.nio.charset.StandardCharsets
4746
import java.nio.file.Files
4847
import java.nio.file.Paths
48+
import java.security.MessageDigest
4949
import java.util.Collections
5050
import java.util.Date
5151
import java.util.UUID
@@ -213,7 +213,8 @@ internal class MultipartStoreTest : StoreTestBase() {
213213
NO_CHECKSUM,
214214
NO_CHECKSUM_ALGORITHM,
215215
)
216-
val allMd5s = DigestUtils.md5("Part1") + DigestUtils.md5("Part2")
216+
val md5 = MessageDigest.getInstance("MD5")
217+
val allMd5s = md5.digest("Part1".toByteArray()) + md5.digest("Part2".toByteArray())
217218

218219
assertThat(
219220
Paths.get(
@@ -227,7 +228,7 @@ internal class MultipartStoreTest : StoreTestBase() {
227228
TEST_BUCKET_NAME, id.toString(), "objectMetadata.json"
228229
).toFile()
229230
).exists()
230-
assertThat(result.etag).isEqualTo("\"${DigestUtils.md5Hex(allMd5s)}-2\"")
231+
assertThat(result.etag).isEqualTo("\"${md5.digest(allMd5s).joinToString("") {"%02x".format(it)} }-2\"")
231232
}
232233

233234
@Test
@@ -650,9 +651,10 @@ internal class MultipartStoreTest : StoreTestBase() {
650651
}
651652

652653
private fun prepareExpectedPart(partNumber: Int, lastModified: Date, content: String): Part {
654+
val md5 = MessageDigest.getInstance("MD5")
653655
return Part(
654656
partNumber,
655-
DigestUtils.md5Hex(content),
657+
md5.digest(content.toByteArray()).joinToString("") { "%02x".format(it) },
656658
lastModified,
657659
content.toByteArray().size.toLong()
658660
)

server/src/test/kotlin/com/adobe/testing/s3mock/util/DigestUtilTest.kt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
package com.adobe.testing.s3mock.util
1717

18-
import org.apache.commons.codec.digest.DigestUtils
18+
import java.security.MessageDigest
1919
import org.assertj.core.api.Assertions.assertThat
2020
import org.junit.jupiter.api.Test
2121
import org.junit.jupiter.api.TestInfo
@@ -25,14 +25,16 @@ import software.amazon.awssdk.utils.BinaryUtils
2525
internal class DigestUtilTest {
2626
@Test
2727
fun testHexDigestOfMultipleFiles(testInfo: TestInfo) {
28+
val md5 = MessageDigest.getInstance("MD5")
29+
2830
//yes, this is correct - AWS calculates a Multipart digest by calculating the digest of every
2931
//file involved, and then calculates the digest on the result.
3032
//a hyphen with the part count is added as a suffix.
3133
val expected = "${
32-
DigestUtils.md5Hex(
33-
DigestUtils.md5("Part1") //testFile1
34-
+ DigestUtils.md5("Part2") //testFile2
35-
)
34+
md5.digest(
35+
md5.digest("Part1".toByteArray()) //testFile1
36+
+ md5.digest("Part2".toByteArray()) //testFile2
37+
).joinToString("") { "%02x".format(it) }
3638
}-2"
3739

3840
//files contain the exact content seen above
@@ -46,13 +48,15 @@ internal class DigestUtilTest {
4648

4749
@Test
4850
fun testChecksumOfMultipleFiles(testInfo: TestInfo) {
51+
val sha256 = MessageDigest.getInstance("SHA-256")
52+
4953
//yes, this is correct - AWS calculates a Multipart digest by calculating the digest of every
5054
//file involved, and then calculates the digest on the result.
5155
//a hyphen with the part count is added as a suffix.
5256
val expected = "${
53-
BinaryUtils.toBase64(DigestUtils.sha256(
54-
DigestUtils.sha256("Part1") //testFile1
55-
+ DigestUtils.sha256("Part2") //testFile2
57+
BinaryUtils.toBase64(sha256.digest(
58+
sha256.digest("Part1".toByteArray()) //testFile1
59+
+ sha256.digest("Part2".toByteArray()) //testFile2
5660
))
5761
}-2"
5862

0 commit comments

Comments
 (0)