diff --git a/public/i18n/en.yml b/public/i18n/en.yml index 286e0d08..ac0f8636 100644 --- a/public/i18n/en.yml +++ b/public/i18n/en.yml @@ -303,6 +303,16 @@ SETTINGS_SYNC_CONFIG_GITHUB_TOKEN_PLACEHOLDER: Please enter GitHub Token SETTINGS_SYNC_CONFIG_GITEA_TOKEN_PLACEHOLDER: Please enter Gitea Token SETTINGS_SYNC_CONFIG_GITEE_TOKEN_PLACEHOLDER: Please enter Gitee Token SETTINGS_SYNC_CONFIG_PROXY_PLACEHOLDER: Please enter proxy +SETTINGS_SYNC_CONFIG_WEBDAV_ENDPOINT: WebDAV Endpoint +SETTINGS_SYNC_CONFIG_WEBDAV_ENDPOINT_PLACEHOLDER: Please enter WebDAV endpoint URL +SETTINGS_SYNC_CONFIG_WEBDAV_USERNAME: Username +SETTINGS_SYNC_CONFIG_WEBDAV_USERNAME_PLACEHOLDER: Please enter WebDAV username +SETTINGS_SYNC_CONFIG_WEBDAV_PASSWORD: Password +SETTINGS_SYNC_CONFIG_WEBDAV_PASSWORD_PLACEHOLDER: Please enter WebDAV password +SETTINGS_SYNC_CONFIG_WEBDAV_AUTH_TYPE: Authentication Type +SETTINGS_SYNC_CONFIG_WEBDAV_SSL_ENABLED: Enable SSL/HTTPS +SETTINGS_SYNC_CONFIG_WEBDAV_SAVE_PATH: Save Path +SETTINGS_SYNC_CONFIG_WEBDAV_SAVE_PATH_PLACEHOLDER: Please select save path for sync files SETTINGS_UP_DOWN_DESC: Upload and download configuration files SETTINGS_UP_DOWN_TITLE: Please use this after filled the synchronization configuration SETTINGS_SYNC_UPLOAD: Upload diff --git a/public/i18n/zh-CN.yml b/public/i18n/zh-CN.yml index c9d850ba..8e56cc30 100644 --- a/public/i18n/zh-CN.yml +++ b/public/i18n/zh-CN.yml @@ -306,6 +306,16 @@ SETTINGS_SYNC_CONFIG_GITHUB_TOKEN_PLACEHOLDER: 请输入GitHub Token SETTINGS_SYNC_CONFIG_GITEA_TOKEN_PLACEHOLDER: 请输入Gitea Token SETTINGS_SYNC_CONFIG_GITEE_TOKEN_PLACEHOLDER: 请输入Gitee Token SETTINGS_SYNC_CONFIG_PROXY_PLACEHOLDER: 请输入代理地址 +SETTINGS_SYNC_CONFIG_WEBDAV_ENDPOINT: WebDAV端点 +SETTINGS_SYNC_CONFIG_WEBDAV_ENDPOINT_PLACEHOLDER: 请输入WebDAV端点URL +SETTINGS_SYNC_CONFIG_WEBDAV_USERNAME: 用户名 +SETTINGS_SYNC_CONFIG_WEBDAV_USERNAME_PLACEHOLDER: 请输入WebDAV用户名 +SETTINGS_SYNC_CONFIG_WEBDAV_PASSWORD: 密码 +SETTINGS_SYNC_CONFIG_WEBDAV_PASSWORD_PLACEHOLDER: 请输入WebDAV密码 +SETTINGS_SYNC_CONFIG_WEBDAV_AUTH_TYPE: 认证类型 +SETTINGS_SYNC_CONFIG_WEBDAV_SSL_ENABLED: 启用SSL/HTTPS +SETTINGS_SYNC_CONFIG_WEBDAV_SAVE_PATH: 保存路径 +SETTINGS_SYNC_CONFIG_WEBDAV_SAVE_PATH_PLACEHOLDER: 请选择同步文件的保存路径 SETTINGS_UP_DOWN_DESC: 上传下载配置文件 SETTINGS_UP_DOWN_TITLE: 请在设置完同步配置后使用 SETTINGS_SYNC_UPLOAD: 上传 diff --git a/public/i18n/zh-TW.yml b/public/i18n/zh-TW.yml index dc04c653..c5219bae 100644 --- a/public/i18n/zh-TW.yml +++ b/public/i18n/zh-TW.yml @@ -304,6 +304,16 @@ SETTINGS_SYNC_CONFIG_GITHUB_TOKEN_PLACEHOLDER: 請輸入 GitHub Token SETTINGS_SYNC_CONFIG_GITEA_TOKEN_PLACEHOLDER: 請輸入 Gitea Token SETTINGS_SYNC_CONFIG_GITEE_TOKEN_PLACEHOLDER: 請輸入 Gitee Token SETTINGS_SYNC_CONFIG_PROXY_PLACEHOLDER: 請輸入代理地址 +SETTINGS_SYNC_CONFIG_WEBDAV_ENDPOINT: WebDAV端點 +SETTINGS_SYNC_CONFIG_WEBDAV_ENDPOINT_PLACEHOLDER: 請輸入WebDAV端點URL +SETTINGS_SYNC_CONFIG_WEBDAV_USERNAME: 用戶名 +SETTINGS_SYNC_CONFIG_WEBDAV_USERNAME_PLACEHOLDER: 請輸入WebDAV用戶名 +SETTINGS_SYNC_CONFIG_WEBDAV_PASSWORD: 密碼 +SETTINGS_SYNC_CONFIG_WEBDAV_PASSWORD_PLACEHOLDER: 請輸入WebDAV密碼 +SETTINGS_SYNC_CONFIG_WEBDAV_AUTH_TYPE: 認證類型 +SETTINGS_SYNC_CONFIG_WEBDAV_SSL_ENABLED: 啟用SSL/HTTPS +SETTINGS_SYNC_CONFIG_WEBDAV_SAVE_PATH: 保存路徑 +SETTINGS_SYNC_CONFIG_WEBDAV_SAVE_PATH_PLACEHOLDER: 請選擇同步檔案的保存路徑 SETTINGS_UP_DOWN_DESC: 上傳和下載配置檔案 SETTINGS_UP_DOWN_TITLE: 請在設置完同步配置後再使用 SETTINGS_SYNC_UPLOAD: 上傳 diff --git a/src/main/utils/syncSettings.ts b/src/main/utils/syncSettings.ts index 232f2483..97a81a5b 100644 --- a/src/main/utils/syncSettings.ts +++ b/src/main/utils/syncSettings.ts @@ -4,11 +4,13 @@ import fs from 'fs-extra' import { HttpsProxyAgent } from 'hpagent' import path from 'path' import { Octokit } from '@octokit/rest' +import { createClient, AuthType, WebDAVClientOptions } from 'webdav' import db from '@core/datastore' import logger from '@core/picgo/logger' import { configPaths } from '#/utils/configPaths' +import { formatEndpoint } from '#/utils/common' const STORE_PATH = app.getPath('userData') @@ -53,7 +55,30 @@ function getOctokit(syncConfig: ISyncConfig) { }) } -const isSyncConfigValidate = ({ type, username, repo, branch, token }: ISyncConfig) => { +const isSyncConfigValidate = ({ + type, + username, + repo, + branch, + token, + webdavEndpoint, + webdavUsername, + webdavPassword, + webdavAuthType, + webdavSslEnabled, + webdavSavePath +}: ISyncConfig) => { + if (type === 'webdav') { + return ( + type && + webdavEndpoint && + webdavUsername && + webdavPassword && + webdavAuthType !== undefined && + webdavSslEnabled !== undefined && + webdavSavePath !== undefined + ) + } return type && username && repo && branch && token } @@ -97,6 +122,29 @@ async function uploadLocalToRemote(syncConfig: ISyncConfig, fileName: string) { const res = await axios.post(apiUrl, defaultConfig, { headers }) return isHttpResSuccess(res) } + case 'webdav': { + const { + webdavEndpoint = '', + webdavUsername, + webdavPassword, + webdavAuthType = 'basic', + webdavSslEnabled = true, + webdavSavePath = '' + } = syncConfig + const webdavEndpointF = formatEndpoint(webdavEndpoint, webdavSslEnabled) + const options: WebDAVClientOptions = { + username: webdavUsername, + password: webdavPassword + } + if (webdavAuthType === 'digest') { + options.authType = AuthType.Digest + } + const client = createClient(webdavEndpointF, options) + const fileContent = fs.readFileSync(localFilePath) + const remoteFilePath = webdavSavePath ? path.join(webdavSavePath, fileName) : fileName + await client.putFileContents(remoteFilePath, fileContent, { overwrite: true }) + return true + } default: return false } @@ -188,6 +236,29 @@ async function updateLocalToRemote(syncConfig: ISyncConfig, fileName: string) { ) return isHttpResSuccess(res) } + case 'webdav': { + const { + webdavEndpoint = '', + webdavUsername, + webdavPassword, + webdavAuthType = 'basic', + webdavSslEnabled = true, + webdavSavePath = '' + } = syncConfig + const webdavEndpointF = formatEndpoint(webdavEndpoint, webdavSslEnabled) + const options: WebDAVClientOptions = { + username: webdavUsername, + password: webdavPassword + } + if (webdavAuthType === 'digest') { + options.authType = AuthType.Digest + } + const client = createClient(webdavEndpointF, options) + const fileContent = fs.readFileSync(localFilePath) + const remoteFilePath = webdavSavePath ? path.join(webdavSavePath, fileName) : fileName + await client.putFileContents(remoteFilePath, fileContent, { overwrite: true }) + return true + } default: return false } @@ -278,6 +349,29 @@ async function downloadRemoteToLocal(syncConfig: ISyncConfig, fileName: string) } }) } + case 'webdav': { + const { + webdavEndpoint = '', + webdavUsername, + webdavPassword, + webdavAuthType = 'basic', + webdavSslEnabled = true, + webdavSavePath = '' + } = syncConfig + const webdavEndpointF = formatEndpoint(webdavEndpoint, webdavSslEnabled) + const options: WebDAVClientOptions = { + username: webdavUsername, + password: webdavPassword + } + if (webdavAuthType === 'digest') { + options.authType = AuthType.Digest + } + const client = createClient(webdavEndpointF, options) + const remoteFilePath = webdavSavePath ? path.join(webdavSavePath, fileName) : fileName + const fileContent = await client.getFileContents(remoteFilePath) + await fs.writeFile(localFilePath, fileContent as Buffer) + return true + } default: return false } diff --git a/src/renderer/pages/PicGoSetting.vue b/src/renderer/pages/PicGoSetting.vue index 56a29366..164e8d8d 100644 --- a/src/renderer/pages/PicGoSetting.vue +++ b/src/renderer/pages/PicGoSetting.vue @@ -858,9 +858,10 @@ draggable append-to-body > -
+
{{ $T('SETTINGS_SYNC_CONFIG_NOTE') }}
+ @@ -875,19 +876,65 @@ - + + + ({ token: '', endpoint: '', proxy: '', - interval: 60 + interval: 60, + // WebDAV-specific fields + password: '', + authType: 'basic', + sslEnabled: true, + webdavSavePath: '' }) -const syncType = ['github', 'gitee', 'gitea'] +const syncType = ['github', 'gitee', 'gitea', 'webdav'] async function cancelSyncSetting() { syncVisible.value = false @@ -1222,7 +1274,14 @@ async function cancelSyncSetting() { token: '', endpoint: '', proxy: '', - interval: 60 + interval: 60, + // WebDAV-specific fields + webdavEndpoint: '', + webdavUsername: '', + webdavPassword: '', + webdavAuthType: 'basic', + webdavSslEnabled: true, + webdavSavePath: '' } } @@ -1289,7 +1348,14 @@ async function initData() { token: '', endpoint: '', proxy: '', - interval: 60 + interval: 60, + // WebDAV-specific fields + webdavEndpoint: '', + webdavUsername: '', + webdavPassword: '', + webdavAuthType: 'basic', + webdavSslEnabled: true, + webdavSavePath: '' } formOfSetting.value.logFileSizeLimit = enforceNumber(settings.logFileSizeLimit) || 10 addProxyWatch() diff --git a/src/universal/types/i18n.d.ts b/src/universal/types/i18n.d.ts index 08169be9..72ecba69 100644 --- a/src/universal/types/i18n.d.ts +++ b/src/universal/types/i18n.d.ts @@ -299,6 +299,16 @@ interface ILocales { SETTINGS_SYNC_CONFIG_GITEA_TOKEN_PLACEHOLDER: string SETTINGS_SYNC_CONFIG_GITEE_TOKEN_PLACEHOLDER: string SETTINGS_SYNC_CONFIG_PROXY_PLACEHOLDER: string + SETTINGS_SYNC_CONFIG_WEBDAV_ENDPOINT: string + SETTINGS_SYNC_CONFIG_WEBDAV_ENDPOINT_PLACEHOLDER: string + SETTINGS_SYNC_CONFIG_WEBDAV_USERNAME: string + SETTINGS_SYNC_CONFIG_WEBDAV_USERNAME_PLACEHOLDER: string + SETTINGS_SYNC_CONFIG_WEBDAV_PASSWORD: string + SETTINGS_SYNC_CONFIG_WEBDAV_PASSWORD_PLACEHOLDER: string + SETTINGS_SYNC_CONFIG_WEBDAV_AUTH_TYPE: string + SETTINGS_SYNC_CONFIG_WEBDAV_SSL_ENABLED: string + SETTINGS_SYNC_CONFIG_WEBDAV_SAVE_PATH: string + SETTINGS_SYNC_CONFIG_WEBDAV_SAVE_PATH_PLACEHOLDER: string SETTINGS_UP_DOWN_DESC: string SETTINGS_UP_DOWN_TITLE: string SETTINGS_SYNC_UPLOAD: string diff --git a/src/universal/types/types.d.ts b/src/universal/types/types.d.ts index 4e0c4814..025d5c52 100644 --- a/src/universal/types/types.d.ts +++ b/src/universal/types/types.d.ts @@ -47,6 +47,13 @@ interface ISyncConfig { endpoint?: string proxy?: string interval?: number + // WebDAV specific fields + webdavEndpoint?: string + webdavUsername?: string + webdavPassword?: string + webdavAuthType?: 'basic' | 'digest' + webdavSslEnabled?: boolean + webdavSavePath?: string } // Image && PicBed