diff --git a/.env b/.env index 0d8bd66..14be57b 100644 --- a/.env +++ b/.env @@ -1,10 +1,10 @@ -APP_HOST=127.0.0.30 +APP_HOST=localhost APP_PORT=8080 -S3_ENDPOINT=http://127.0.0.30:9000 +S3_ENDPOINT=http://localhost:9001 S3_REGION=us-east-1 S3_BUCKET=test-bucket -MINIO_ACCESS_KEY=my_access_key -MINIO_SECRET_KEY=my_secret_key +RUSTFS_ACCESS_KEY=my_access_key +RUSTFS_SECRET_KEY=my_secret_key JPG_TEST_OBJECT=100.jpg PNG_TEST_OBJECT=100.png GIF_TEST_OBJECT=100.gif diff --git a/docker-compose.yaml b/docker-compose.yaml index 48dfa01..eae999e 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,18 +1,17 @@ version: '3' services: - minio: - image: minio/minio + rustfs: + image: rustfs/rustfs restart: always logging: driver: "json-file" options: max-size: "20m" max-file: "5" - environment: - MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY} - MINIO_SECRET_KEY: ${MINIO_SECRET_KEY} ports: - - ${APP_HOST}:9000:9000 + - 9001:9000 + environment: + RUSTFS_ACCESS_KEY: ${RUSTFS_ACCESS_KEY} + RUSTFS_SECRET_KEY: ${RUSTFS_SECRET_KEY} volumes: - ./data:/data - command: 'server /data' diff --git a/sample/src/main/kotlin/com/icerockdev/sample/Main.kt b/sample/src/main/kotlin/com/icerockdev/sample/Main.kt index b19537b..1944d18 100644 --- a/sample/src/main/kotlin/com/icerockdev/sample/Main.kt +++ b/sample/src/main/kotlin/com/icerockdev/sample/Main.kt @@ -35,7 +35,7 @@ object Main { .credentialsProvider( StaticCredentialsProvider.create( AwsBasicCredentials.create( - dotenv["MINIO_ACCESS_KEY"], dotenv["MINIO_SECRET_KEY"] + dotenv["RUSTFS_ACCESS_KEY"], dotenv["RUSTFS_SECRET_KEY"] ) ) ) @@ -48,7 +48,7 @@ object Main { .credentialsProvider( StaticCredentialsProvider.create( AwsBasicCredentials.create( - dotenv["MINIO_ACCESS_KEY"], dotenv["MINIO_SECRET_KEY"] + dotenv["RUSTFS_ACCESS_KEY"], dotenv["RUSTFS_SECRET_KEY"] ) ) ) diff --git a/storage-service/src/main/kotlin/com/icerockdev/service/storage/s3/policy/dto/Principal.kt b/storage-service/src/main/kotlin/com/icerockdev/service/storage/s3/policy/dto/Principal.kt index 6b88ef8..aa7cf20 100644 --- a/storage-service/src/main/kotlin/com/icerockdev/service/storage/s3/policy/dto/Principal.kt +++ b/storage-service/src/main/kotlin/com/icerockdev/service/storage/s3/policy/dto/Principal.kt @@ -2,10 +2,17 @@ package com.icerockdev.service.storage.s3.policy.dto import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.core.JsonParser +import com.fasterxml.jackson.core.JsonProcessingException +import com.fasterxml.jackson.databind.DeserializationContext +import com.fasterxml.jackson.databind.JsonDeserializer +import com.fasterxml.jackson.databind.JsonNode +import com.fasterxml.jackson.databind.annotation.JsonDeserialize @JsonInclude(JsonInclude.Include.NON_EMPTY) data class Principal( @JsonProperty("AWS") + @JsonDeserialize(using = PrincipalAwsDeserializer::class) val aws: List, @JsonProperty("CanonicalUser") val canonicalUser: String?, @@ -14,3 +21,20 @@ data class Principal( @JsonProperty("Service") val service: List = emptyList(), ) + +class PrincipalAwsDeserializer : JsonDeserializer>() { + override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): List { + try { + val path = p?.parsingContext?.pathAsPointer() + val node = p?.codec?.readTree(p) + return when { + node?.isNull == true -> emptyList() + node?.isArray == true -> p.codec?.treeToValue(node, Array::class.java)?.toList() ?: emptyList() + node?.isTextual == true -> p.codec?.treeToValue(node, String::class.java)?.let { listOf(it) } ?: emptyList() + else -> throw IllegalArgumentException("Principal deserialization error. Unexpected value: $node at path: $path") + } + } catch (e: JsonProcessingException) { + throw RuntimeException("Principal deserialization error happened at: ${e.location}", e) + } + } +} diff --git a/storage-service/src/test/kotlin/S3GeneratePreviewTest.kt b/storage-service/src/test/kotlin/S3GeneratePreviewTest.kt index 3750b8d..19d3814 100644 --- a/storage-service/src/test/kotlin/S3GeneratePreviewTest.kt +++ b/storage-service/src/test/kotlin/S3GeneratePreviewTest.kt @@ -42,7 +42,7 @@ class S3GeneratePreviewTest { .credentialsProvider( StaticCredentialsProvider.create( AwsBasicCredentials.create( - dotenv["MINIO_ACCESS_KEY"], dotenv["MINIO_SECRET_KEY"] + dotenv["RUSTFS_ACCESS_KEY"], dotenv["RUSTFS_SECRET_KEY"] ) ) ) @@ -55,7 +55,7 @@ class S3GeneratePreviewTest { .credentialsProvider( StaticCredentialsProvider.create( AwsBasicCredentials.create( - dotenv["MINIO_ACCESS_KEY"], dotenv["MINIO_SECRET_KEY"] + dotenv["RUSTFS_ACCESS_KEY"], dotenv["RUSTFS_SECRET_KEY"] ) ) ) diff --git a/storage-service/src/test/kotlin/S3StorageTest.kt b/storage-service/src/test/kotlin/S3StorageTest.kt index 490f905..5c38632 100644 --- a/storage-service/src/test/kotlin/S3StorageTest.kt +++ b/storage-service/src/test/kotlin/S3StorageTest.kt @@ -59,7 +59,7 @@ class S3StorageTest { .credentialsProvider( StaticCredentialsProvider.create( AwsBasicCredentials.create( - dotenv["MINIO_ACCESS_KEY"], dotenv["MINIO_SECRET_KEY"] + dotenv["RUSTFS_ACCESS_KEY"], dotenv["RUSTFS_SECRET_KEY"] ) ) ) @@ -72,7 +72,7 @@ class S3StorageTest { .credentialsProvider( StaticCredentialsProvider.create( AwsBasicCredentials.create( - dotenv["MINIO_ACCESS_KEY"], dotenv["MINIO_SECRET_KEY"] + dotenv["RUSTFS_ACCESS_KEY"], dotenv["RUSTFS_SECRET_KEY"] ) ) ) @@ -338,7 +338,7 @@ class S3StorageTest { val jpgObject = storage.get(bucketName, jpgFileName) - assertEquals(metadata, jpgObject?.response()?.metadata()) + assertTrue(jpgObject?.response()?.metadata()?.entries?.containsAll(metadata.entries) ?: false) // copy testing val copyFileName = storage.generateFileKey() @@ -349,7 +349,7 @@ class S3StorageTest { val copyObject = storage.get(bucketName, copyFileName) - assertEquals(metadata, copyObject?.response()?.metadata()) + assertTrue(copyObject?.response()?.metadata()?.entries?.containsAll(metadata.entries) ?: false) assertTrue { storage.deleteBucketWithObjects(bucketName)