diff --git a/src/baseTypes.ts b/src/baseTypes.ts index 49d4dfa..5831c07 100644 --- a/src/baseTypes.ts +++ b/src/baseTypes.ts @@ -98,6 +98,8 @@ export interface WebdavConfig { depth?: WebdavDepthType; remoteBaseDir?: string; + customHeaders?: string; + /** * @deprecated */ diff --git a/src/fsWebdav.ts b/src/fsWebdav.ts index e716226..0ff1509 100644 --- a/src/fsWebdav.ts +++ b/src/fsWebdav.ts @@ -209,6 +209,29 @@ const tryEncodeURI = (x: string) => { return encodeURI(x); }; +const parseCustomHeaders = (x: string): Record => { + const y = x.trim(); + if (y === "") { + return {}; + } + const z = y.split("\n"); + + const res: Record = {}; + + for (const kv of z) { + if (!kv.includes(":")) { + continue; + } + + const [keyRaw, ...valueArr] = kv.split(":"); + const key = keyRaw.trim(); + const value = valueArr.join(":").trim(); + res[key] = value; + } + + return res; +}; + export class FakeFsWebdav extends FakeFs { kind: "webdav"; @@ -246,9 +269,14 @@ export class FakeFsWebdav extends FakeFs { return; } - const headers = { + const cacheHeader = { "Cache-Control": "no-cache", }; + const customHeaders = parseCustomHeaders( + this.webdavConfig.customHeaders ?? "" + ); + const headers = { ...cacheHeader, ...customHeaders }; + if ( this.webdavConfig.username !== "" && this.webdavConfig.password !== "" diff --git a/src/langs/en.json b/src/langs/en.json index d205e11..563e617 100644 --- a/src/langs/en.json +++ b/src/langs/en.json @@ -232,6 +232,7 @@ "settings_onedrive_emptyfile_desc": "OneDrive doesn't allow uploading empty file (even in its official website). Do you want to show up errors or silently skip the empty files?", "settings_onedrive_emptyfile_skip": "Skip", "settings_onedrive_emptyfile_error": "Error and abort", + "settings_webdav": "Remote For Webdav", "settings_webdav_disclaimer1": "Disclaimer: The information is stored locally. Other malicious/harmful/faulty plugins may read the info. If you see any unintentional access to your webdav server, please immediately change the username and password.", "settings_webdav_cors_os": "Obsidian desktop>=0.13.25 or iOS>=1.1.1 or Android>=1.2.1 supports bypassing CORS locally. But you are using an old version, and you're suggested to upgrade Obsidian.", @@ -249,9 +250,12 @@ "settings_webdav_depth_desc": "Webdav servers should be configured to allow requests with header Depth being '1' or 'Infinity'. If you are not sure what's this, choose \"depth='1'\". If you are sure your server supports depth='infinity', please choose that to get way better performance.", "settings_webdav_depth_1": "only supports depth='1'", "settings_webdav_depth_inf": "supports depth='infinity'", + "settings_webdav_customheaders": "Custom Headers Sent To Servers", + "settings_webdav_customheaders_desc": "Some users may want to set custom headers. If you don't know what it is, just leave it empty. Input them like: X-Header1:value1 in each line. All spaces around header keys and values will be removed.", "settings_webdav_connect_succ": "Great! The webdav server can be accessed.", "settings_webdav_connect_fail": "The webdav server cannot be reached (possible to be any of address/username/password/authtype errors).", "settings_webdav_connect_fail_withcors": "The webdav server cannot be reached (possible to be any of address/username/password/authtype/CORS errors).", + "settings_webdis": "Remote For Webdis", "settings_webdis_disclaimer1": "Disclaimer: This app is NOT an official Redis® Ltd / Redis® OSS / Webdis product. Redis is a registered trademark of Redis Ltd.", "settings_webdis_disclaimer2": "Disclaimer: The information is stored locally. Other malicious/harmful/faulty plugins may read the info. If you see any unintentional access to your Webdis server, please immediately change the username and password.", diff --git a/src/langs/zh_cn.json b/src/langs/zh_cn.json index 2c9ed3e..dea14e8 100644 --- a/src/langs/zh_cn.json +++ b/src/langs/zh_cn.json @@ -231,6 +231,7 @@ "settings_onedrive_emptyfile_desc": "OneDrive 不允许上传空文件(即使官网也是不允许的)。那么你想跳过空文件还是返回错误?", "settings_onedrive_emptyfile_skip": "跳过", "settings_onedrive_emptyfile_error": "返回错误和中断", + "settings_webdav": "Webdav 设置", "settings_webdav_disclaimer1": "声明:您所输入的信息存储于本地。其它有害的或者出错的插件,是有可能读取到这些信息的。如果您发现了 Webdav 服务器有不符合预期的访问,请立刻修改用户名和密码。", "settings_webdav_cors_os": "Obsidian 桌面版>=0.13.25 或 iOS>=1.1.1 或 Android>=1.2.1 支持跳过 CORS 设置。但您正在使用旧版,建议升级。", @@ -248,9 +249,12 @@ "settings_webdav_depth_desc": "Webdav 服务器会被设为接收 Depth header 为“1”或“Infinity”请求。如果您不清楚如何设置,可以选择 depth='1'。如果那你确认服务器支持 depth='infinity',请选择它,会获得更加好的性能。", "settings_webdav_depth_1": "只支持 depth='1'", "settings_webdav_depth_inf": "支持 depth='infinity'", + "settings_webdav_customheaders": "发送到服务器的自定义 Header", + "settings_webdav_customheaders_desc": "有些用户需要设置自定义 header。如果您不知道是什么,可以直接留空不填。输入格式:每行形如 X-Header1:value1。header 的 key 和 value 之间的空格会被删除。", "settings_webdav_connect_succ": "很好!可以连接上 Webdav 服务器。", "settings_webdav_connect_fail": "无法连接上 Webdav 服务器。(可能是地址/账号/密码/鉴权类型等错误。)", "settings_webdav_connect_fail_withcors": "无法连接上 Webdav 服务器。(可能是地址/账号/密码/鉴权类型/CORS 等错误。)", + "settings_webdis": "Webdis 设置", "settings_webdis_disclaimer1": "声明:此插件不是 Redis® Ltd 或 Redis® 软件或 Wedis 的官方产品。Redis 是 Redis Ltd 的注册商标。", "settings_webdis_disclaimer2": "声明:您所输入的信息存储于本地。其它有害的或者出错的插件,是有可能读取到这些信息的。如果您发现了 Webdis 服务器有不符合预期的访问,请立刻修改用户名和密码。", diff --git a/src/langs/zh_tw.json b/src/langs/zh_tw.json index 4109d16..20dcf31 100644 --- a/src/langs/zh_tw.json +++ b/src/langs/zh_tw.json @@ -230,6 +230,7 @@ "settings_onedrive_emptyfile_desc": "OneDrive 不允許上傳空檔案(即使官網也是不允許的)。那麼你想跳過空檔案還是返回錯誤?", "settings_onedrive_emptyfile_skip": "跳過", "settings_onedrive_emptyfile_error": "返回錯誤和中斷", + "settings_webdav": "Webdav 設定", "settings_webdav_disclaimer1": "宣告:您所輸入的資訊儲存於本地。其它有害的或者出錯的外掛,是有可能讀取到這些資訊的。如果您發現了 Webdav 伺服器有不符合預期的訪問,請立刻修改使用者名稱和密碼。", "settings_webdav_cors_os": "Obsidian 桌面版>=0.13.25 或 iOS>=1.1.1 或 Android>=1.1.1 支援跳過 CORS 設定。但您正在使用舊版,建議升級。", @@ -247,9 +248,12 @@ "settings_webdav_depth_desc": "Webdav 伺服器會被設為接收 Depth header 為“1”或“Infinity”請求。如果您不清楚如何設定,可以選擇 depth='1'。如果那你確認伺服器支援 depth='infinity',請選擇它,會獲得更加好的效能。", "settings_webdav_depth_1": "只支援 depth='1'", "settings_webdav_depth_inf": "支援 depth='infinity'", + "settings_webdav_customheaders": "傳送到伺服器的自定義 Header", + "settings_webdav_customheaders_desc": "有些使用者需要設定自定義 header。如果您不知道是什麼,可以直接留空不填。輸入格式:每行形如 X-Header1:value1。header 的 key 和 value 之間的空格會被刪除。", "settings_webdav_connect_succ": "很好!可以連線上 Webdav 伺服器。", "settings_webdav_connect_fail": "無法連線上 Webdav 伺服器。(可能是地址/賬號/密碼/鑑權型別等錯誤。)", "settings_webdav_connect_fail_withcors": "無法連線上 Webdav 伺服器。(可能是地址/賬號/密碼/鑑權型別/CORS 等錯誤。)", + "settings_webdis": "Webdis 設置", "settings_webdis_disclaimer1": "聲明:此插件不是 Redis® Ltd 或 Redis® 軟件或 Wedis 的官方產品。Redis 是 Redis Ltd 的註冊商標。", "settings_webdis_disclaimer2": "聲明:您所輸入的信息存儲於本地。其它有害的或者出錯的插件,是有可能讀取到這些信息的。如果您發現了 Webdis 服務器有不符合預期的訪問,請立刻修改用戶名和密碼。", diff --git a/src/main.ts b/src/main.ts index 86b348d..3ff79c6 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1381,6 +1381,9 @@ export default class RemotelySavePlugin extends Plugin { if (this.settings.webdav.remoteBaseDir === undefined) { this.settings.webdav.remoteBaseDir = ""; } + if (this.settings.webdav.customHeaders === undefined) { + this.settings.webdav.customHeaders = ""; + } if (this.settings.s3.partsConcurrency === undefined) { this.settings.s3.partsConcurrency = 20; } diff --git a/src/settings.ts b/src/settings.ts index e8a1106..56ae09f 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1638,6 +1638,27 @@ export class RemotelySaveSettingTab extends PluginSettingTab { }); }); + new Setting(webdavDiv) + .setName(t("settings_webdav_customheaders")) + .setDesc(stringToFragment(t("settings_webdav_customheaders_desc"))) + .addTextArea((textArea) => { + textArea + .setPlaceholder(`X-Header1: Value1\nX-Header2: Value2`) + .setValue(`${this.plugin.settings.webdav.customHeaders ?? ""}`) + .onChange(async (value) => { + this.plugin.settings.webdav.customHeaders = value + .trim() + .split("\n") + .filter((x) => x.trim() !== "") + .join("\n"); + await this.plugin.saveSettings(); + }); + textArea.inputEl.rows = 10; + textArea.inputEl.cols = 30; + + textArea.inputEl.addClass("webdav-customheaders-textarea"); + }); + let newWebdavRemoteBaseDir = this.plugin.settings.webdav.remoteBaseDir || ""; new Setting(webdavDiv) diff --git a/styles.css b/styles.css index 15415f8..770a1aa 100644 --- a/styles.css +++ b/styles.css @@ -88,6 +88,10 @@ display: none; } +.webdav-customheaders-textarea { + font-family: monospace; +} + .webdis-disclaimer { font-weight: bold; }