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,