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 > -