From dc6224c920279c3c4e75219ddb8713d1eff2cfcd Mon Sep 17 00:00:00 2001 From: eoao Date: Sat, 6 Sep 2025 21:33:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=A0=E9=99=A4S3=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=B2=A1=E6=9C=89MD5=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mail-vue/src/views/sys-setting/index.vue | 22 ++++++++++--- mail-worker/src/service/s3-service.js | 39 +++++++++++++++++++----- 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/mail-vue/src/views/sys-setting/index.vue b/mail-vue/src/views/sys-setting/index.vue index 5457f3f..de91e27 100644 --- a/mail-vue/src/views/sys-setting/index.vue +++ b/mail-vue/src/views/sys-setting/index.vue @@ -187,7 +187,7 @@
{{ $t('oss') }}
-
+
{{ $t('osDomain') }}
{{ setting.r2Domain || '' }} @@ -199,9 +199,7 @@
{{ $t('s3Configuration') }}
- +
@@ -699,7 +697,6 @@ const r2DomainInput = ref('') const loginOpacity = ref(0) const backgroundUrl = ref('') let backgroundFile = {} -const s3IsDisabled = ref(false) const showSetBackground = ref(false) let regVerifyCount = ref(1) let addVerifyCount = ref(1) @@ -1348,6 +1345,21 @@ function editSetting(settingForm, refreshStatus = true) { } } +.r2domain-item { + display: flex; + gap: 10px; + > div:first-child { + display: flex; + align-items: center; + gap: 5px; + } + + > div:last-child { + flex: 1; + text-align: right; + } +} + .title-icon.warning { position: relative; top: 2px; diff --git a/mail-worker/src/service/s3-service.js b/mail-worker/src/service/s3-service.js index d7bdd59..93d502f 100644 --- a/mail-worker/src/service/s3-service.js +++ b/mail-worker/src/service/s3-service.js @@ -28,34 +28,57 @@ const s3Service = { await client.send(new PutObjectCommand(obj)) }, - async deleteObj(c,keys) { + async deleteObj(c, keys) { if (typeof keys === 'string') { - keys = [keys] + keys = [keys]; } if (keys.length === 0) { - return + return; } - const client = await this.client(c) - + const client = await this.client(c); const { bucket } = await settingService.query(c); + + client.middlewareStack.add( + (next) => async (args) => { + + const body = args.request.body + + // 计算 MD5 校验和并转换为 Base64 编码 + const encoder = new TextEncoder(); + const data = encoder.encode(body); + + // 使用 Web Crypto API 计算 MD5 校验和 + const hashBuffer = await crypto.subtle.digest('MD5', data); + const hashArray = new Uint8Array(hashBuffer); + const contentMD5 = btoa(String.fromCharCode.apply(null, hashArray)); + + args.request.headers["Content-MD5"] = contentMD5; + + return next(args); + }, + { step: "build", name: "inspectRequestMiddleware" } + ); + + await client.send( new DeleteObjectsCommand({ Bucket: bucket, Delete: { - Objects: keys.map(key => ({Key: key})) + Objects: keys.map(key => ({ Key: key })) } }) - ) + ); }, + async client(c) { const { region, endpoint, s3AccessKey, s3SecretKey } = await settingService.query(c); return new S3Client({ - region: region, + region: region || 'auto', endpoint: domainUtils.toOssDomain(endpoint), credentials: { accessKeyId: s3AccessKey,