From 4de6b0679d34f21a402a0991ad8e3c2243100d91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=B0=8F=E5=B9=B3?= Date: Wed, 31 Jul 2024 11:14:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4minio=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E5=AE=9E=E7=8E=B0=E6=A8=A1=E5=9D=97=EF=BC=8C=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E6=A8=A1=E5=9D=97=E8=A7=84=E5=88=92=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=90=8D=E7=A7=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- minio-plus-core/pom.xml | 8 +- {minio-s3-api => minio-plus-s3-api}/pom.xml | 5 +- .../s3-api-definition}/pom.xml | 2 +- .../org/liuxp/minioplus/s3/def/ListParts.java | 0 .../liuxp/minioplus/s3/def/MinioS3Client.java | 0 .../s3-api-minio}/pom.xml | 4 +- .../s3/official/CustomMinioClient.java | 0 .../s3/official/MinioS3ClientImpl.java | 0 .../main/resources/META-INF/spring.factories | 0 .../s3-api-minio}/src/test/java/Digest.java | 0 .../s3-api-minio}/src/test/java/S3Base.java | 0 .../src/test/java/S3Escaper.java | 0 .../s3-api-minio}/src/test/java/Signer.java | 0 .../s3-api-minio}/src/test/java/Time.java | 0 .../pom.xml | 8 +- .../pom.xml | 8 +- minio-s3-api/minio-s3-api-custom/pom.xml | 30 --- .../s3/custom/MinioS3ClientImpl.java | 88 ------- .../liuxp/minioplus/s3/custom/S3APIEnums.java | 39 --- .../liuxp/minioplus/s3/custom/S3Request.java | 52 ---- .../liuxp/minioplus/s3/custom/S3Signer.java | 228 ------------------ .../org/liuxp/minioplus/s3/custom/Time.java | 44 ---- .../main/resources/META-INF/spring.factories | 2 - .../src/test/java/S3RequestTest.java | 54 ----- pom.xml | 13 +- 25 files changed, 31 insertions(+), 554 deletions(-) rename {minio-s3-api => minio-plus-s3-api}/pom.xml (80%) rename {minio-s3-api/minio-s3-api-definition => minio-plus-s3-api/s3-api-definition}/pom.xml (92%) rename {minio-s3-api/minio-s3-api-definition => minio-plus-s3-api/s3-api-definition}/src/main/java/org/liuxp/minioplus/s3/def/ListParts.java (100%) rename {minio-s3-api/minio-s3-api-definition => minio-plus-s3-api/s3-api-definition}/src/main/java/org/liuxp/minioplus/s3/def/MinioS3Client.java (100%) rename {minio-s3-api/minio-s3-api-official => minio-plus-s3-api/s3-api-minio}/pom.xml (92%) rename {minio-s3-api/minio-s3-api-official => minio-plus-s3-api/s3-api-minio}/src/main/java/org/liuxp/minioplus/s3/official/CustomMinioClient.java (100%) rename {minio-s3-api/minio-s3-api-official => minio-plus-s3-api/s3-api-minio}/src/main/java/org/liuxp/minioplus/s3/official/MinioS3ClientImpl.java (100%) rename {minio-s3-api/minio-s3-api-official => minio-plus-s3-api/s3-api-minio}/src/main/resources/META-INF/spring.factories (100%) rename {minio-s3-api/minio-s3-api-official => minio-plus-s3-api/s3-api-minio}/src/test/java/Digest.java (100%) rename {minio-s3-api/minio-s3-api-official => minio-plus-s3-api/s3-api-minio}/src/test/java/S3Base.java (100%) rename {minio-s3-api/minio-s3-api-official => minio-plus-s3-api/s3-api-minio}/src/test/java/S3Escaper.java (100%) rename {minio-s3-api/minio-s3-api-official => minio-plus-s3-api/s3-api-minio}/src/test/java/Signer.java (100%) rename {minio-s3-api/minio-s3-api-official => minio-plus-s3-api/s3-api-minio}/src/test/java/Time.java (100%) delete mode 100644 minio-s3-api/minio-s3-api-custom/pom.xml delete mode 100644 minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/MinioS3ClientImpl.java delete mode 100644 minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/S3APIEnums.java delete mode 100644 minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/S3Request.java delete mode 100644 minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/S3Signer.java delete mode 100644 minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/Time.java delete mode 100644 minio-s3-api/minio-s3-api-custom/src/main/resources/META-INF/spring.factories delete mode 100644 minio-s3-api/minio-s3-api-custom/src/test/java/S3RequestTest.java diff --git a/minio-plus-core/pom.xml b/minio-plus-core/pom.xml index 52cf190..ac2f5b3 100644 --- a/minio-plus-core/pom.xml +++ b/minio-plus-core/pom.xml @@ -12,6 +12,12 @@ minio-plus-core jar + + 8 + 8 + UTF-8 + + org.springframework.boot @@ -27,7 +33,7 @@ me.liuxp - minio-s3-api-definition + s3-api-definition diff --git a/minio-s3-api/pom.xml b/minio-plus-s3-api/pom.xml similarity index 80% rename from minio-s3-api/pom.xml rename to minio-plus-s3-api/pom.xml index 9b2dbc7..f67a470 100644 --- a/minio-s3-api/pom.xml +++ b/minio-plus-s3-api/pom.xml @@ -13,9 +13,8 @@ pom - minio-s3-api-definition - minio-s3-api-custom - minio-s3-api-official + s3-api-definition + s3-api-minio \ No newline at end of file diff --git a/minio-s3-api/minio-s3-api-definition/pom.xml b/minio-plus-s3-api/s3-api-definition/pom.xml similarity index 92% rename from minio-s3-api/minio-s3-api-definition/pom.xml rename to minio-plus-s3-api/s3-api-definition/pom.xml index d501fd8..3edae71 100644 --- a/minio-s3-api/minio-s3-api-definition/pom.xml +++ b/minio-plus-s3-api/s3-api-definition/pom.xml @@ -9,7 +9,7 @@ 4.0.0 - minio-s3-api-definition + s3-api-definition jar diff --git a/minio-s3-api/minio-s3-api-definition/src/main/java/org/liuxp/minioplus/s3/def/ListParts.java b/minio-plus-s3-api/s3-api-definition/src/main/java/org/liuxp/minioplus/s3/def/ListParts.java similarity index 100% rename from minio-s3-api/minio-s3-api-definition/src/main/java/org/liuxp/minioplus/s3/def/ListParts.java rename to minio-plus-s3-api/s3-api-definition/src/main/java/org/liuxp/minioplus/s3/def/ListParts.java diff --git a/minio-s3-api/minio-s3-api-definition/src/main/java/org/liuxp/minioplus/s3/def/MinioS3Client.java b/minio-plus-s3-api/s3-api-definition/src/main/java/org/liuxp/minioplus/s3/def/MinioS3Client.java similarity index 100% rename from minio-s3-api/minio-s3-api-definition/src/main/java/org/liuxp/minioplus/s3/def/MinioS3Client.java rename to minio-plus-s3-api/s3-api-definition/src/main/java/org/liuxp/minioplus/s3/def/MinioS3Client.java diff --git a/minio-s3-api/minio-s3-api-official/pom.xml b/minio-plus-s3-api/s3-api-minio/pom.xml similarity index 92% rename from minio-s3-api/minio-s3-api-official/pom.xml rename to minio-plus-s3-api/s3-api-minio/pom.xml index 3277c6a..9b24066 100644 --- a/minio-s3-api/minio-s3-api-official/pom.xml +++ b/minio-plus-s3-api/s3-api-minio/pom.xml @@ -9,7 +9,7 @@ 4.0.0 - minio-s3-api-official + s3-api-minio jar @@ -31,7 +31,7 @@ me.liuxp - minio-s3-api-definition + s3-api-definition me.liuxp diff --git a/minio-s3-api/minio-s3-api-official/src/main/java/org/liuxp/minioplus/s3/official/CustomMinioClient.java b/minio-plus-s3-api/s3-api-minio/src/main/java/org/liuxp/minioplus/s3/official/CustomMinioClient.java similarity index 100% rename from minio-s3-api/minio-s3-api-official/src/main/java/org/liuxp/minioplus/s3/official/CustomMinioClient.java rename to minio-plus-s3-api/s3-api-minio/src/main/java/org/liuxp/minioplus/s3/official/CustomMinioClient.java diff --git a/minio-s3-api/minio-s3-api-official/src/main/java/org/liuxp/minioplus/s3/official/MinioS3ClientImpl.java b/minio-plus-s3-api/s3-api-minio/src/main/java/org/liuxp/minioplus/s3/official/MinioS3ClientImpl.java similarity index 100% rename from minio-s3-api/minio-s3-api-official/src/main/java/org/liuxp/minioplus/s3/official/MinioS3ClientImpl.java rename to minio-plus-s3-api/s3-api-minio/src/main/java/org/liuxp/minioplus/s3/official/MinioS3ClientImpl.java diff --git a/minio-s3-api/minio-s3-api-official/src/main/resources/META-INF/spring.factories b/minio-plus-s3-api/s3-api-minio/src/main/resources/META-INF/spring.factories similarity index 100% rename from minio-s3-api/minio-s3-api-official/src/main/resources/META-INF/spring.factories rename to minio-plus-s3-api/s3-api-minio/src/main/resources/META-INF/spring.factories diff --git a/minio-s3-api/minio-s3-api-official/src/test/java/Digest.java b/minio-plus-s3-api/s3-api-minio/src/test/java/Digest.java similarity index 100% rename from minio-s3-api/minio-s3-api-official/src/test/java/Digest.java rename to minio-plus-s3-api/s3-api-minio/src/test/java/Digest.java diff --git a/minio-s3-api/minio-s3-api-official/src/test/java/S3Base.java b/minio-plus-s3-api/s3-api-minio/src/test/java/S3Base.java similarity index 100% rename from minio-s3-api/minio-s3-api-official/src/test/java/S3Base.java rename to minio-plus-s3-api/s3-api-minio/src/test/java/S3Base.java diff --git a/minio-s3-api/minio-s3-api-official/src/test/java/S3Escaper.java b/minio-plus-s3-api/s3-api-minio/src/test/java/S3Escaper.java similarity index 100% rename from minio-s3-api/minio-s3-api-official/src/test/java/S3Escaper.java rename to minio-plus-s3-api/s3-api-minio/src/test/java/S3Escaper.java diff --git a/minio-s3-api/minio-s3-api-official/src/test/java/Signer.java b/minio-plus-s3-api/s3-api-minio/src/test/java/Signer.java similarity index 100% rename from minio-s3-api/minio-s3-api-official/src/test/java/Signer.java rename to minio-plus-s3-api/s3-api-minio/src/test/java/Signer.java diff --git a/minio-s3-api/minio-s3-api-official/src/test/java/Time.java b/minio-plus-s3-api/s3-api-minio/src/test/java/Time.java similarity index 100% rename from minio-s3-api/minio-s3-api-official/src/test/java/Time.java rename to minio-plus-s3-api/s3-api-minio/src/test/java/Time.java diff --git a/minio-plus-spring-boot-starter/minio-plus-all-spring-boot-starter/pom.xml b/minio-plus-spring-boot-starter/minio-plus-all-spring-boot-starter/pom.xml index bea28c0..f9f2f35 100644 --- a/minio-plus-spring-boot-starter/minio-plus-all-spring-boot-starter/pom.xml +++ b/minio-plus-spring-boot-starter/minio-plus-all-spring-boot-starter/pom.xml @@ -12,6 +12,12 @@ minio-plus-all-spring-boot-starter jar + + 8 + 8 + UTF-8 + + me.liuxp @@ -19,7 +25,7 @@ me.liuxp - minio-s3-api-official + s3-api-minio diff --git a/minio-plus-spring-boot-starter/minio-plus-core-spring-boot-starter/pom.xml b/minio-plus-spring-boot-starter/minio-plus-core-spring-boot-starter/pom.xml index 0538ea2..d971128 100644 --- a/minio-plus-spring-boot-starter/minio-plus-core-spring-boot-starter/pom.xml +++ b/minio-plus-spring-boot-starter/minio-plus-core-spring-boot-starter/pom.xml @@ -12,6 +12,12 @@ minio-plus-core-spring-boot-starter jar + + 8 + 8 + UTF-8 + + me.liuxp @@ -19,7 +25,7 @@ me.liuxp - minio-s3-api-official + s3-api-minio diff --git a/minio-s3-api/minio-s3-api-custom/pom.xml b/minio-s3-api/minio-s3-api-custom/pom.xml deleted file mode 100644 index 1aa8099..0000000 --- a/minio-s3-api/minio-s3-api-custom/pom.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - minio-s3-api - me.liuxp - ${revision} - - 4.0.0 - - minio-s3-api-custom - jar - - - - cn.hutool - hutool-all - - - me.liuxp - minio-s3-api-definition - - - me.liuxp - minio-plus-common - - - - \ No newline at end of file diff --git a/minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/MinioS3ClientImpl.java b/minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/MinioS3ClientImpl.java deleted file mode 100644 index c3ccf69..0000000 --- a/minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/MinioS3ClientImpl.java +++ /dev/null @@ -1,88 +0,0 @@ -package org.liuxp.minioplus.s3.custom; - -import cn.hutool.http.HttpResponse; -import cn.hutool.http.Method; -import lombok.extern.slf4j.Slf4j; -import org.liuxp.minioplus.common.config.MinioPlusProperties; -import org.liuxp.minioplus.s3.def.ListParts; -import org.liuxp.minioplus.s3.def.MinioS3Client; -import org.springframework.stereotype.Repository; - -import javax.annotation.Resource; -import java.io.InputStream; -import java.time.ZonedDateTime; -import java.util.List; - -@Slf4j -@Repository -public class MinioS3ClientImpl implements MinioS3Client { - - @Resource - private MinioPlusProperties properties; - - @Override - public Boolean bucketExists(String bucketName) { - - // 取得当前时间 - ZonedDateTime date = ZonedDateTime.now(); - - // HTTP请求 - HttpResponse httpResponse = S3Request.request(properties.getKey(),properties.getSecret(),properties.getBackend() - ,properties.getBackend()+"/"+bucketName,"","/"+bucketName, Method.HEAD.name(),date,0); - - return httpResponse.isOk(); - - } - - @Override - public void makeBucket(String bucketName) { - - } - - @Override - public String createMultipartUpload(String bucketName, String objectName) { - return null; - } - - @Override - public Boolean completeMultipartUpload(String bucketName, String objectName, String uploadId, List parts) { - return null; - } - - @Override - public ListParts listParts(String bucketName, String objectName, Integer maxParts, String uploadId) { - - // 获取失败时,拼一个空的返回值 - return null; - } - - @Override - public String getUploadObjectUrl(String bucketName, String objectName, String uploadId, String partNumber) { - return null; - } - - @Override - public String getDownloadUrl(String fileName, String contentType, String bucketName, String objectName) { - return null; - } - - @Override - public String getPreviewUrl(String contentType, String bucketName, String objectName) { - return null; - } - - @Override - public Boolean putObject(String bucketName, String objectName, InputStream stream, long size, String contentType) { - return null; - } - - @Override - public byte[] getObject(String bucketName, String objectName) { - return new byte[0]; - } - - @Override - public void removeObject(String bucketName, String objectName) { - - } -} diff --git a/minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/S3APIEnums.java b/minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/S3APIEnums.java deleted file mode 100644 index 36927d3..0000000 --- a/minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/S3APIEnums.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.liuxp.minioplus.s3.custom; - -/** - * S3 API 接口定义 - * @author contact@liuxp.me - * @since 2024/06/07 - */ -public enum S3APIEnums { - - BUCKET_EXISTS("检查桶是否存在", "http://localhost:9000/document","/document","HEAD"); - - private final String name; - private final String url; - private final String path; - private final String method; - - S3APIEnums(String name,String url,String path,String method) { - this.name = name; - this.url = url; - this.path = path; - this.method = method; - } - - public String getName() { - return name; - } - - public String getUrl() { - return url; - } - - public String getPath() { - return path; - } - - public String getMethod() { - return method; - } -} diff --git a/minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/S3Request.java b/minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/S3Request.java deleted file mode 100644 index 51eb908..0000000 --- a/minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/S3Request.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.liuxp.minioplus.s3.custom; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.http.HttpRequest; -import cn.hutool.http.HttpResponse; -import cn.hutool.http.HttpUtil; -import cn.hutool.http.Method; - -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.time.ZonedDateTime; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class S3Request { - - static String ZERO_MD5_HASH = "1B2M2Y8AsgTpgAmY7PhCfg=="; - static String ZERO_SHA256_HASH = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; - - public static HttpResponse request(String accessKey,String secretKey,String backend,String url, Object body, String path, String method, ZonedDateTime date,int length){ - - - String md5Hash = ZERO_MD5_HASH; - if (body instanceof byte[]) { - md5Hash = S3Signer.md5Hash((byte[]) body, length); - } - - // 创建除Authorization外所有header - Map> headers = new HashMap<>(); - headers.put("Host", CollUtil.newArrayList(backend.replace("http://","").replace("https://",""))); - headers.put("Accept-Encoding", CollUtil.newArrayList("identity")); - headers.put("User-Agent", CollUtil.newArrayList("MinIO (Windows 10; amd64) minio-java/8.3.3")); - headers.put("Content-MD5", CollUtil.newArrayList(md5Hash)); - headers.put("x-amz-content-sha256", CollUtil.newArrayList(ZERO_SHA256_HASH)); - headers.put("x-amz-date", CollUtil.newArrayList(date.format(Time.AMZ_DATE_FORMAT))); - - // 计算authorization - String authorization = S3Signer.build(accessKey,secretKey,date,headers,"",method,path,ZERO_SHA256_HASH); - - HttpRequest httpRequest = HttpUtil.createRequest(Method.HEAD, url); - httpRequest.header(headers,true); - httpRequest.header("Authorization", authorization); - - return httpRequest.execute(); - } - - - - - -} diff --git a/minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/S3Signer.java b/minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/S3Signer.java deleted file mode 100644 index c7cd41e..0000000 --- a/minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/S3Signer.java +++ /dev/null @@ -1,228 +0,0 @@ -package org.liuxp.minioplus.s3.custom; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.text.CharSequenceUtil; -import cn.hutool.core.util.HexUtil; -import lombok.extern.slf4j.Slf4j; - -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; -import java.nio.charset.StandardCharsets; -import java.security.InvalidKeyException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.time.ZonedDateTime; -import java.util.*; -import java.util.stream.Collectors; - -@Slf4j -public class S3Signer { - - private static final String serviceName = "s3"; - private static final String US_EAST_1 = "us-east-1"; - private static final Set IGNORED_HEADERS = CollUtil.set(true,"accept-encoding", "authorization", "content-type", "content-length", "user-agent"); - - public static String build(String accessKey,String secretKey,ZonedDateTime date,Map> headers,String params,String method,String path,String zeroSha256Hash){ - - try { - // 计算scope - String scope = buildScope(date); - - // 计算signedHeaders - Map canonicalHeaders = buildCanonicalHeaders(headers); - - // 计算signedHeaders - String signedHeaders = buildSignedHeaders(canonicalHeaders); - - // 计算canonicalQueryString - String canonicalQueryString = buildCanonicalQueryString(params); - - // 计算buildCanonicalRequest - String canonicalRequestHash = buildCanonicalRequest(canonicalHeaders,signedHeaders,canonicalQueryString,method,path,zeroSha256Hash); - - // 计算stringToSign - String stringToSign = buildStringToSign(date,scope,canonicalRequestHash); - - // 计算signingKey - byte[] signingKey = buildSigningKey(date,secretKey); - - // 计算signature - String signature = buildSignature(signingKey,stringToSign); - - // 计算authorization - String authorization = buildAuthorization(accessKey,scope,signedHeaders,signature); - - log.debug("httpRequest.headers()="+headers); - log.debug("scope="+scope); - log.debug("canonicalHeaders="+canonicalHeaders); - log.debug("signedHeaders="+signedHeaders); - log.debug("canonicalQueryString="+canonicalQueryString); - log.debug("canonicalRequestHash="+canonicalRequestHash); - log.debug("stringToSign="+stringToSign); - log.debug("signature="+signature); - log.debug("authorization="+authorization); - - return authorization; - }catch (Exception e){ - throw new RuntimeException("S3签名失败", e); - } - } - - // 计算scope - private static String buildScope(ZonedDateTime date){ - return date.format(Time.SIGNER_DATE_FORMAT) + "/" + US_EAST_1 + "/" + serviceName + "/aws4_request"; - } - - private static Map buildCanonicalHeaders(Map> headers){ - Map canonicalHeaders = new TreeMap<>(); - - for (String name : headers.keySet()) { - String signedHeader = name.toLowerCase(Locale.US); - if (!IGNORED_HEADERS.contains(signedHeader)) { - // Convert and add header values as per - // https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html - // * Header having multiple values should be converted to comma separated values. - // * Multi-spaced value of header should be trimmed to single spaced value. - canonicalHeaders.put( - signedHeader, - headers.get(name).stream() - .map( - value -> { - return value.replaceAll("( +)", " "); - }) - .collect(Collectors.joining(","))); - } - } - return canonicalHeaders; - } - - /** - * 计算signedHeaders - * @return - */ - private static String buildSignedHeaders(Map canonicalHeaders) { - return CharSequenceUtil.join(";", canonicalHeaders.keySet()); - } - - private static String buildCanonicalQueryString(String params){ - - if(CharSequenceUtil.isBlank(params)){ - return ""; - } - - return params; - - //TODO - -// MapUtil - - // Building a multimap which only order keys, ordering values is not performed - // until MinIO server supports it. -// Multimap signedQueryParams = -// MultimapBuilder.treeKeys().arrayListValues().build(); -// -// for (String queryParam : params.split("&")) { -// String[] tokens = queryParam.split("="); -// if (tokens.length > 1) { -// signedQueryParams.put(tokens[0], tokens[1]); -// } else { -// signedQueryParams.put(tokens[0], ""); -// } -// } -// -// return Joiner.on("&").withKeyValueSeparator("=").join(signedQueryParams.entries()); - - } - - private static String buildCanonicalRequest(Map canonicalHeaders,String signedHeaders - ,String canonicalQueryString,String method,String path,String zeroSha256Hash) throws NoSuchAlgorithmException { - - StringBuilder headers = new StringBuilder(); - for (String key : canonicalHeaders.keySet()) { - - headers.append(key); - headers.append(":"); - headers.append(canonicalHeaders.get(key)); - headers.append("\n"); - } - - String canonicalRequest = method + "\n" + path + "\n" + canonicalQueryString + "\n" - + headers + "\n" + signedHeaders + "\n" + zeroSha256Hash; - log.debug("canonicalRequest="+canonicalRequest); - - byte[] data = canonicalRequest.getBytes(StandardCharsets.UTF_8); - MessageDigest sha256Digest = MessageDigest.getInstance("SHA-256"); - sha256Digest.update(data, 0, data.length); - - return HexUtil.encodeHexStr(sha256Digest.digest()); - } - - /** - * 计算stringToSign - * @param date - * @param scope - * @param canonicalRequestHash - * @return - */ - private static String buildStringToSign(ZonedDateTime date,String scope,String canonicalRequestHash){ - return "AWS4-HMAC-SHA256" + "\n" + date.format(Time.AMZ_DATE_FORMAT) + "\n" + scope + "\n" + canonicalRequestHash; - } - - /** - * 计算signingKey - * @param date - * @return - * @throws NoSuchAlgorithmException - * @throws InvalidKeyException - */ - private static byte[] buildSigningKey(ZonedDateTime date,String secretKey) throws NoSuchAlgorithmException, InvalidKeyException { - String aws4SecretKey = "AWS4" + secretKey; - byte[] dateKey = sumHmac(aws4SecretKey.getBytes(StandardCharsets.UTF_8), date.format(Time.SIGNER_DATE_FORMAT).getBytes(StandardCharsets.UTF_8)); - byte[] dateRegionKey = sumHmac(dateKey, US_EAST_1.getBytes(StandardCharsets.UTF_8)); - byte[] dateRegionServiceKey = sumHmac(dateRegionKey, serviceName.getBytes(StandardCharsets.UTF_8)); - return sumHmac(dateRegionServiceKey, "aws4_request".getBytes(StandardCharsets.UTF_8)); - } - - /** - * 计算signature - * @param signingKey - * @param stringToSign - * @return - */ - private static String buildSignature(byte[] signingKey,String stringToSign) throws NoSuchAlgorithmException, InvalidKeyException { - byte[] digest = sumHmac(signingKey, stringToSign.getBytes(StandardCharsets.UTF_8)); - return HexUtil.encodeHexStr(digest); - } - - /** - * 计算authorization - * @param accessKey - * @param scope - * @param signedHeaders - * @param signature - * @return - */ - private static String buildAuthorization(String accessKey,String scope,String signedHeaders,String signature){ - return "AWS4-HMAC-SHA256 Credential=" + accessKey + "/" + scope + ", SignedHeaders=" + signedHeaders + ", Signature=" + signature; - } - - private static byte[] sumHmac(byte[] key, byte[] data) throws NoSuchAlgorithmException, InvalidKeyException { - Mac mac = Mac.getInstance("HmacSHA256"); - - mac.init(new SecretKeySpec(key, "HmacSHA256")); - mac.update(data); - - return mac.doFinal(); - } - - public static String md5Hash(byte[] data, int length) { - try { - MessageDigest md5Digest = MessageDigest.getInstance("MD5"); - md5Digest.update(data, 0, length); - return Base64.getEncoder().encodeToString(md5Digest.digest()); - }catch (Exception e){ - throw new RuntimeException("md5Hash失败", e); - } - - } -} diff --git a/minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/Time.java b/minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/Time.java deleted file mode 100644 index 15e97fc..0000000 --- a/minio-s3-api/minio-s3-api-custom/src/main/java/org/liuxp/minioplus/s3/custom/Time.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.liuxp.minioplus.s3.custom;/* - * MinIO Java SDK for Amazon S3 Compatible Cloud Storage, - * (C) 2020 MinIO, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.Locale; - -/** Time formatters for S3 APIs. */ -public class Time { - public static final ZoneId UTC = ZoneId.of("Z"); - - public static final DateTimeFormatter AMZ_DATE_FORMAT = - DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'", Locale.US).withZone(UTC); - - public static final DateTimeFormatter RESPONSE_DATE_FORMAT = - DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH':'mm':'ss'.'SSS'Z'", Locale.US).withZone(UTC); - - // Formatted string is convertible to LocalDate only, not to LocalDateTime or ZonedDateTime. - // Below example shows how to use this to get ZonedDateTime. - // LocalDate.parse("20200225", SIGNER_DATE_FORMAT).atStartOfDay(UTC); - public static final DateTimeFormatter SIGNER_DATE_FORMAT = - DateTimeFormatter.ofPattern("yyyyMMdd", Locale.US).withZone(UTC); - - public static final DateTimeFormatter HTTP_HEADER_DATE_FORMAT = - DateTimeFormatter.ofPattern("EEE',' dd MMM yyyy HH':'mm':'ss 'GMT'", Locale.US).withZone(UTC); - - public static final DateTimeFormatter EXPIRATION_DATE_FORMAT = RESPONSE_DATE_FORMAT; - - private Time() {} -} diff --git a/minio-s3-api/minio-s3-api-custom/src/main/resources/META-INF/spring.factories b/minio-s3-api/minio-s3-api-custom/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 0263741..0000000 --- a/minio-s3-api/minio-s3-api-custom/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,2 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -org.liuxp.minioplus.s3.custom.MinioS3ClientImpl \ No newline at end of file diff --git a/minio-s3-api/minio-s3-api-custom/src/test/java/S3RequestTest.java b/minio-s3-api/minio-s3-api-custom/src/test/java/S3RequestTest.java deleted file mode 100644 index ab81b65..0000000 --- a/minio-s3-api/minio-s3-api-custom/src/test/java/S3RequestTest.java +++ /dev/null @@ -1,54 +0,0 @@ -import cn.hutool.http.HttpResponse; -import org.liuxp.minioplus.s3.custom.S3Request; - -import java.time.ZonedDateTime; - -public class S3RequestTest { - - -// public static void main(String[] args){ -// -// String accessKey = "minioadmin"; -// String secretKey = "minioadmin"; -// String backend = "http://localhost:9000"; -// String bucket = "document"; -//// String url = "http://localhost:9000/document1"; -// -//// ZonedDateTime date = ZonedDateTime.parse("2024-05-31T16:31:54Z"); -// // 取得当前时间 -// ZonedDateTime date = ZonedDateTime.now(); -// -// HttpResponse httpResponse = S3Request.request(accessKey,secretKey,backend,backend+"/"+bucket,"","/"+bucket,"HEAD",date); -// -// System.out.println("httpResponse.isOk()="+httpResponse.isOk()); -// System.out.println("httpResponse.getStatus()="+httpResponse.getStatus()); -// System.out.println("httpResponse.headers()="+httpResponse.headers()); -// System.out.println("httpResponse.body()="+httpResponse.body()); -// -// } - - public static void main(String[] args){ - - String accessKey = "minioadmin"; - String secretKey = "minioadmin"; - String backend = "http://localhost:9000"; - String bucket = "document223"; -// String url = "http://localhost:9000/document1"; - -// ZonedDateTime date = ZonedDateTime.parse("2024-05-31T16:31:54Z"); - // 取得当前时间 - ZonedDateTime date = ZonedDateTime.now(); - - byte[] EMPTY_BODY = new byte[] {}; - - HttpResponse httpResponse = S3Request.request(accessKey,secretKey,backend,backend+"/"+bucket,EMPTY_BODY,"/"+bucket,"PUT",date,0); - - System.out.println("httpResponse.isOk()="+httpResponse.isOk()); - System.out.println("httpResponse.getStatus()="+httpResponse.getStatus()); - System.out.println("httpResponse.headers()="+httpResponse.headers()); - System.out.println("httpResponse.body()="+httpResponse.body()); - - } - - -} diff --git a/pom.xml b/pom.xml index 848c4eb..9015a2c 100644 --- a/pom.xml +++ b/pom.xml @@ -40,8 +40,8 @@ minio-plus-common minio-plus-core minio-plus-extension + minio-plus-s3-api minio-plus-spring-boot-starter - minio-s3-api @@ -49,7 +49,7 @@ 1.8 1.8 3.0.1 - 0.1.4 + 0.1.5 2.7.18 3.5.7 1.18.32 @@ -154,7 +154,7 @@ me.liuxp - minio-s3-api-definition + s3-api-definition ${revision} @@ -164,7 +164,7 @@ me.liuxp - minio-s3-api-official + s3-api-minio ${revision} @@ -305,10 +305,7 @@ dependency-check-maven 10.0.3 - true - true - true - true + true