diff --git a/public/i18n/en.yml b/public/i18n/en.yml index 02f1ee1..7284c42 100644 --- a/public/i18n/en.yml +++ b/public/i18n/en.yml @@ -944,19 +944,16 @@ MANAGE_NEW_BUCKET_QINIU_BUCKETNAME_RULE_MSG_B: Bucket name length cannot exceed MANAGE_NEW_BUCKET_QINIU_BUCKETNAME_RULE_MSG_C: Bucket names can only contain lowercase letters, numbers, and hyphens, and cannot start or end with a hyphen. MANAGE_NEW_BUCKET_QINIU_REGION: Region MANAGE_NEW_BUCKET_QINIU_ACL_DESC: Public Access -MANAGE_NEW_BUCKET_UPYUN_NAME: Upyun -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_DESC: Bucket Name -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_PLACEHOLDER: Please enter bucket name -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_A: Bucket name cannot be empty -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_B: Bucket name length should be between 5-20 characters -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_C: Bucket names can only contain lowercase letters, numbers, and hyphens, and cannot start or end with a hyphen. -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_DESC: Operator Name -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_PLACEHOLDER: Please enter operator name -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_RULE_MSG_A: Operator name cannot be empty -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_DESC: Password -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_PLACEHOLDER: Please enter password -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_RULE_MSG_A: Password cannot be empty - +MANAGE_NEW_BUCKET_S3PLIST_NAME: S3-Compatible +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_DESC: Bucket Name +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_PLACEHOLDER: Please enter the Bucket name +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_RULE_MSG_A: Bucket name can't be empty +MANAGE_NEW_BUCKET_S3PLIST_REGION: Region +MANAGE_NEW_BUCKET_S3PLIST_ACL_DESC: Access Control +MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_RW: Public Read and Write +MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_R: Public Read +MANAGE_NEW_BUCKET_S3PLIST_ACL_PRIVATE: Private +MANAGE_NEW_BUCKET_S3PLIST_ACL_AUTHENTICATED_READ: Authenticated Read # ---renderer i18n end--- # plugins diff --git a/public/i18n/zh-CN.yml b/public/i18n/zh-CN.yml index 1a2a1c2..c211ef2 100644 --- a/public/i18n/zh-CN.yml +++ b/public/i18n/zh-CN.yml @@ -949,19 +949,16 @@ MANAGE_NEW_BUCKET_QINIU_BUCKETNAME_RULE_MSG_B: Bucket名称长度不能超过63 MANAGE_NEW_BUCKET_QINIU_BUCKETNAME_RULE_MSG_C: Bucket名称只能包含小写字母、数字和中划线,且不能以中划线开头和结尾 MANAGE_NEW_BUCKET_QINIU_REGION: 区域 MANAGE_NEW_BUCKET_QINIU_ACL_DESC: 公开访问 -MANAGE_NEW_BUCKET_UPYUN_NAME: 又拍云 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_DESC: Bucket名 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_PLACEHOLDER: 请输入Bucket名 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_A: Bucket名不能为空 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_B: Bucket名称长度为5-20个字符 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_C: Bucket名称只能包含小写字母、数字和中划线,且不能以中划线开头和结尾 -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_DESC: 操作员 -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_PLACEHOLDER: 请输入操作员 -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_RULE_MSG_A: 操作员不能为空 -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_DESC: 密码 -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_PLACEHOLDER: 请输入密码 -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_RULE_MSG_A: 密码不能为空 - +MANAGE_NEW_BUCKET_S3PLIST_NAME: S3兼容云 +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_DESC: Bucket名 +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_PLACEHOLDER: 请输入Bucket名 +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_RULE_MSG_A: Bucket名不能为空 +MANAGE_NEW_BUCKET_S3PLIST_REGION: 区域 +MANAGE_NEW_BUCKET_S3PLIST_ACL_DESC: 访问权限 +MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_RW: 公共读写 +MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_R: 公共读 +MANAGE_NEW_BUCKET_S3PLIST_ACL_PRIVATE: 私有 +MANAGE_NEW_BUCKET_S3PLIST_ACL_AUTHENTICATED_READ: 授权读 # ---renderer i18n end--- diff --git a/public/i18n/zh-TW.yml b/public/i18n/zh-TW.yml index 971e944..82704df 100644 --- a/public/i18n/zh-TW.yml +++ b/public/i18n/zh-TW.yml @@ -944,18 +944,16 @@ MANAGE_NEW_BUCKET_QINIU_BUCKETNAME_RULE_MSG_B: Bucket名稱長度不能超過63 MANAGE_NEW_BUCKET_QINIU_BUCKETNAME_RULE_MSG_C: Bucket名稱只能包含小寫字母、數字和中橫線,且不能以中橫線開頭和結尾 MANAGE_NEW_BUCKET_QINIU_REGION: 區域 MANAGE_NEW_BUCKET_QINIU_ACL_DESC: 公開訪問 -MANAGE_NEW_BUCKET_UPYUN_NAME: 又拍雲 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_DESC: Bucket名稱 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_PLACEHOLDER: 請輸入Bucket名稱 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_A: Bucket名稱不能為空 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_B: Bucket名稱長度為5-20個字符 -MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_C: Bucket名稱只能包含小寫字母、數字和中橫線,且不能以中橫線開頭和結尾 -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_DESC: 操作員 -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_PLACEHOLDER: 請輸入操作員 -MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_RULE_MSG_A: 操作員不能為空 -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_DESC: 密碼 -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_PLACEHOLDER: 請輸入密碼 -MANAGE_NEW_BUCKET_UPYUN_PASSWORD_RULE_MSG_A: 密碼不能為空 +MANAGE_NEW_BUCKET_S3PLIST_NAME: S3兼容雲 +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_DESC: Bucket名稱 +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_PLACEHOLDER: 請輸入Bucket名稱 +MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_RULE_MSG_A: Bucket名稱不能為空 +MANAGE_NEW_BUCKET_S3PLIST_REGION: 區域 +MANAGE_NEW_BUCKET_S3PLIST_ACL_DESC: 訪問權限 +MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_RW: 公共讀寫 +MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_R: 公共讀 +MANAGE_NEW_BUCKET_S3PLIST_ACL_PRIVATE: 私有 +MANAGE_NEW_BUCKET_S3PLIST_ACL_AUTHENTICATED_READ: 授權讀 # ---renderer i18n end--- # plugins diff --git a/src/main/manage/apis/s3plist.ts b/src/main/manage/apis/s3plist.ts index 8875516..40e33d2 100644 --- a/src/main/manage/apis/s3plist.ts +++ b/src/main/manage/apis/s3plist.ts @@ -12,7 +12,10 @@ import { DeleteObjectCommand, DeleteObjectsCommand, PutObjectCommand, - S3ClientConfig + S3ClientConfig, + CreateBucketCommand, + PutPublicAccessBlockCommand, + PutBucketAclCommand } from '@aws-sdk/client-s3' // AWS S3 上传和进度 @@ -171,6 +174,89 @@ class S3plistApi { } } + async putPublicAccess (bucketName: string, client: S3Client) { + const input = { + Bucket: bucketName, + PublicAccessBlockConfiguration: { + BlockPublicAcls: false, + IgnorePublicAcls: false, + BlockPublicPolicy: false, + RestrictPublicBuckets: false + } + } + const command = new PutPublicAccessBlockCommand(input) + const data = await client.send(command) + if (data.$metadata.httpStatusCode !== 200) { + this.logParam(data, 'putPublicAccess') + throw new Error('manage.setting.putPublicAccessError') + } + } + + /** + * 新建存储桶 + * @param {Object} configMap + * configMap = { + * BucketName: string, + * region: string, + * acl: string + * } + */ + async createBucket (configMap: IStringKeyMap): Promise { + const { BucketName, region, acl, endpoint } = configMap + try { + await this.getDogeCloudToken() + const options = Object.assign({}, this.baseOptions) as S3ClientConfig + options.region = String(region) || 'us-east-1' + const client = new S3Client(options) + const command = new ListBucketsCommand({}) + const data = await client.send(command) + if (data.$metadata.httpStatusCode === 200) { + const bucketList = data.Buckets?.map((item) => item.Name) + if (bucketList?.includes(BucketName)) { + return true + } + } + if (endpoint === '' || endpoint.includes('amazonaws')) { + const createCommand = new CreateBucketCommand({ + Bucket: BucketName, + ObjectOwnership: 'BucketOwnerPreferred' + }) + const createData = await client.send(createCommand) + if (createData.$metadata.httpStatusCode === 200) { + if (acl !== 'private') { + await this.putPublicAccess(BucketName, client) + const putACLCommand = new PutBucketAclCommand({ + Bucket: BucketName, + ACL: acl + }) + const putACLData = await client.send(putACLCommand) + if (putACLData.$metadata.httpStatusCode !== 200) { + this.logParam(putACLData, 'createBucket') + return false + } + } + return true + } else { + this.logParam(createData, 'createBucket') + } + } else { + const createCommand = new CreateBucketCommand({ + Bucket: BucketName, + ACL: acl + }) + const createData = await client.send(createCommand) + if (createData.$metadata.httpStatusCode === 200) { + return true + } else { + this.logParam(createData, 'createBucket') + } + } + } catch (error) { + this.logParam(error, 'createBucket') + } + return false + } + /** * 获取存储桶列表 */ diff --git a/src/main/manage/apis/tcyun.ts b/src/main/manage/apis/tcyun.ts index 296ef8b..57e3276 100644 --- a/src/main/manage/apis/tcyun.ts +++ b/src/main/manage/apis/tcyun.ts @@ -108,13 +108,8 @@ class TcyunApi { * acl: private | publicRead | publicReadWrite */ async createBucket (configMap: IStringKeyMap): Promise < boolean > { - const aclTransMap: IStringKeyMap = { - private: 'private', - publicRead: 'public-read', - publicReadWrite: 'public-read-write' - } const res = await this.ctx.putBucket({ - ACL: aclTransMap[configMap.acl], + ACL: configMap.acl, Bucket: configMap.BucketName, Region: configMap.region }) diff --git a/src/main/manage/manageApi.ts b/src/main/manage/manageApi.ts index 7380029..e22081c 100644 --- a/src/main/manage/manageApi.ts +++ b/src/main/manage/manageApi.ts @@ -230,6 +230,7 @@ export class ManageApi extends EventEmitter implements ManageApiType { case 'tcyun': case 'aliyun': case 'qiniu': + case 's3plist': try { client = this.createClient() as any return await client.createBucket(param!) diff --git a/src/renderer/manage/pages/manageMain.vue b/src/renderer/manage/pages/manageMain.vue index f5f42b3..c40ffc3 100644 --- a/src/renderer/manage/pages/manageMain.vue +++ b/src/renderer/manage/pages/manageMain.vue @@ -355,7 +355,7 @@ const urlMap : IStringKeyMap = { webdavplist: 'https://baike.baidu.com/item/WebDAV/4610909' } -const showNewIconList = ['aliyun', 'qiniu', 'tcyun'] +const showNewIconList = ['aliyun', 'qiniu', 'tcyun', 's3plist'] const bucketT = $T('MANAGE_MAIN_PAGE_BUCKET') const galleryT = $T('MANAGE_MAIN_PAGE_GALLERY') @@ -415,6 +415,7 @@ function createNewBucket (picBedName: string) { if (currentPicBedName.value === 'tcyun') { resultMap.BucketName = `${resultMap.BucketName}-${currentPagePicBedConfig.appId}` } + resultMap.endpoint = currentPagePicBedConfig.endpoint invokeToMain('createBucket', currentAlias, resultMap).then((result: any) => { if (result) { ElNotification({ diff --git a/src/renderer/manage/utils/newBucketConfig.ts b/src/renderer/manage/utils/newBucketConfig.ts index bab4ec2..f9d6263 100644 --- a/src/renderer/manage/utils/newBucketConfig.ts +++ b/src/renderer/manage/utils/newBucketConfig.ts @@ -50,8 +50,8 @@ export const newBucketConfig:IStringKeyMap = { default: 'private', options: { private: $T('MANAGE_NEW_BUCKET_TCYUN_ACL_PRIVATE'), - publicRead: $T('MANAGE_NEW_BUCKET_TCYUN_ACL_PUBLIC_R'), - publicReadWrite: $T('MANAGE_NEW_BUCKET_TCYUN_ACL_PUBLIC_RW') + 'public-read': $T('MANAGE_NEW_BUCKET_TCYUN_ACL_PUBLIC_R'), + 'public-read-write': $T('MANAGE_NEW_BUCKET_TCYUN_ACL_PUBLIC_RW') } } }, @@ -162,67 +162,46 @@ export const newBucketConfig:IStringKeyMap = { }, options: ['BucketName', 'region', 'acl'] }, - upyun: { - name: $T('MANAGE_NEW_BUCKET_UPYUN_NAME'), - icon: 'upyun', + s3plist: { + name: $T('MANAGE_NEW_BUCKET_S3PLIST_NAME'), + icon: 's3plist', configOptions: { BucketName: { required: true, - description: $T('MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_DESC'), - placeholder: $T('MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_PLACEHOLDER'), + description: $T('MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_DESC'), + placeholder: $T('MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_PLACEHOLDER'), paraType: 'string', component: 'input', default: 'piclist', rule: [ { required: true, - message: $T('MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_A'), - trigger: 'blur' - }, - { - validator: (rule: any, value: any, callback: any) => { - const reg = /^[a-z][a-z0-9-]{4,19}$/ - if (value.length > 23 || value.length < 5) { - callback(new Error($T('MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_B'))) - } else if (!reg.test(value)) { - callback(new Error($T('MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_C'))) - } else { - callback() - } - }, - trigger: 'change' - } - ] - }, - operator: { - required: true, - description: $T('MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_DESC'), - placeholder: $T('MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_PLACEHOLDER'), - paraType: 'string', - component: 'input', - rule: [ - { - required: true, - message: $T('MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_RULE_MSG_A'), + message: $T('MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_RULE_MSG_A'), trigger: 'blur' } ] }, - password: { + region: { required: true, - description: $T('MANAGE_NEW_BUCKET_UPYUN_PASSWORD_DESC'), - placeholder: $T('MANAGE_NEW_BUCKET_UPYUN_PASSWORD_PLACEHOLDER'), + description: $T('MANAGE_NEW_BUCKET_S3PLIST_REGION'), paraType: 'string', component: 'input', - rule: [ - { - required: true, - message: $T('MANAGE_NEW_BUCKET_UPYUN_PASSWORD_RULE_MSG_A'), - trigger: 'blur' - } - ] + default: 'us-east-1' + }, + acl: { + required: true, + description: $T('MANAGE_NEW_BUCKET_S3PLIST_ACL_DESC'), + paraType: 'string', + component: 'select', + default: 'private', + options: { + private: $T('MANAGE_NEW_BUCKET_S3PLIST_ACL_PRIVATE'), + 'public-read': $T('MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_R'), + 'public-read-write': $T('MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_RW'), + 'authenticated-read': $T('MANAGE_NEW_BUCKET_S3PLIST_ACL_AUTHENTICATED_READ') + } } }, - options: ['BucketName', 'operator', 'password'] + options: ['BucketName', 'region', 'acl'] } } diff --git a/src/universal/types/i18n.d.ts b/src/universal/types/i18n.d.ts index baa9b2a..dacf790 100644 --- a/src/universal/types/i18n.d.ts +++ b/src/universal/types/i18n.d.ts @@ -901,18 +901,16 @@ interface ILocales { MANAGE_NEW_BUCKET_QINIU_BUCKETNAME_RULE_MSG_C: string MANAGE_NEW_BUCKET_QINIU_REGION: string MANAGE_NEW_BUCKET_QINIU_ACL_DESC: string - MANAGE_NEW_BUCKET_UPYUN_NAME: string - MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_DESC: string - MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_PLACEHOLDER: string - MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_A: string - MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_B: string - MANAGE_NEW_BUCKET_UPYUN_BUCKETNAME_RULE_MSG_C: string - MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_DESC: string - MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_PLACEHOLDER: string - MANAGE_NEW_BUCKET_UPYUN_OPERATORNAME_RULE_MSG_A: string - MANAGE_NEW_BUCKET_UPYUN_PASSWORD_DESC: string - MANAGE_NEW_BUCKET_UPYUN_PASSWORD_PLACEHOLDER: string - MANAGE_NEW_BUCKET_UPYUN_PASSWORD_RULE_MSG_A: string + MANAGE_NEW_BUCKET_S3PLIST_NAME: string + MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_DESC: string + MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_PLACEHOLDER: string + MANAGE_NEW_BUCKET_S3PLIST_BUCKETNAME_RULE_MSG_A: string + MANAGE_NEW_BUCKET_S3PLIST_REGION: string + MANAGE_NEW_BUCKET_S3PLIST_ACL_DESC: string + MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_RW: string + MANAGE_NEW_BUCKET_S3PLIST_ACL_PUBLIC_R: string + MANAGE_NEW_BUCKET_S3PLIST_ACL_PRIVATE: string + MANAGE_NEW_BUCKET_S3PLIST_ACL_AUTHENTICATED_READ: string PLUGIN_INSTALL_SUCCEED: string PLUGIN_INSTALL_FAILED: string PLUGIN_UNINSTALL_SUCCEED: string