fix: Fixed the issue that WebDAV synchronization could not check the status and failed during the first backup

This commit is contained in:
李超 2024-08-03 12:40:33 +08:00
parent 3c1e5e7978
commit 716899c030
2 changed files with 22 additions and 9 deletions

View File

@ -29,6 +29,7 @@ async function handle(
const requestUrl = new URL(req.url); const requestUrl = new URL(req.url);
let endpoint = requestUrl.searchParams.get("endpoint"); let endpoint = requestUrl.searchParams.get("endpoint");
let proxy_method = requestUrl.searchParams.get("proxy_method") || req.method;
// Validate the endpoint to prevent potential SSRF attacks // Validate the endpoint to prevent potential SSRF attacks
if ( if (
@ -65,7 +66,11 @@ async function handle(
const targetPath = `${endpoint}${endpointPath}`; const targetPath = `${endpoint}${endpointPath}`;
// only allow MKCOL, GET, PUT // only allow MKCOL, GET, PUT
if (req.method !== "MKCOL" && req.method !== "GET" && req.method !== "PUT") { if (
proxy_method !== "MKCOL" &&
proxy_method !== "GET" &&
proxy_method !== "PUT"
) {
return NextResponse.json( return NextResponse.json(
{ {
error: true, error: true,
@ -78,7 +83,7 @@ async function handle(
} }
// for MKCOL request, only allow request ${folder} // for MKCOL request, only allow request ${folder}
if (req.method === "MKCOL" && !targetPath.endsWith(folder)) { if (proxy_method === "MKCOL" && !targetPath.endsWith(folder)) {
return NextResponse.json( return NextResponse.json(
{ {
error: true, error: true,
@ -91,7 +96,7 @@ async function handle(
} }
// for GET request, only allow request ending with fileName // for GET request, only allow request ending with fileName
if (req.method === "GET" && !targetPath.endsWith(fileName)) { if (proxy_method === "GET" && !targetPath.endsWith(fileName)) {
return NextResponse.json( return NextResponse.json(
{ {
error: true, error: true,
@ -104,7 +109,7 @@ async function handle(
} }
// for PUT request, only allow request ending with fileName // for PUT request, only allow request ending with fileName
if (req.method === "PUT" && !targetPath.endsWith(fileName)) { if (proxy_method === "PUT" && !targetPath.endsWith(fileName)) {
return NextResponse.json( return NextResponse.json(
{ {
error: true, error: true,
@ -118,7 +123,7 @@ async function handle(
const targetUrl = targetPath; const targetUrl = targetPath;
const method = req.method; const method = proxy_method || req.method;
const shouldNotHaveBody = ["get", "head"].includes( const shouldNotHaveBody = ["get", "head"].includes(
method?.toLowerCase() ?? "", method?.toLowerCase() ?? "",
); );
@ -143,7 +148,7 @@ async function handle(
"[Any Proxy]", "[Any Proxy]",
targetUrl, targetUrl,
{ {
method: req.method, method: method,
}, },
{ {
status: fetchResult?.status, status: fetchResult?.status,

View File

@ -14,8 +14,8 @@ export function createWebDavClient(store: SyncStore) {
return { return {
async check() { async check() {
try { try {
const res = await fetch(this.path(folder, proxyUrl), { const res = await fetch(this.path(folder, proxyUrl, "MKCOL"), {
method: "MKCOL", method: "GET",
headers: this.headers(), headers: this.headers(),
}); });
const success = [201, 200, 404, 405, 301, 302, 307, 308].includes( const success = [201, 200, 404, 405, 301, 302, 307, 308].includes(
@ -42,6 +42,10 @@ export function createWebDavClient(store: SyncStore) {
console.log("[WebDav] get key = ", key, res.status, res.statusText); console.log("[WebDav] get key = ", key, res.status, res.statusText);
if (404 == res.status) {
return "";
}
return await res.text(); return await res.text();
}, },
@ -62,7 +66,7 @@ export function createWebDavClient(store: SyncStore) {
authorization: `Basic ${auth}`, authorization: `Basic ${auth}`,
}; };
}, },
path(path: string, proxyUrl: string = "") { path(path: string, proxyUrl: string = "", proxyMethod: string = "") {
if (path.startsWith("/")) { if (path.startsWith("/")) {
path = path.slice(1); path = path.slice(1);
} }
@ -78,9 +82,13 @@ export function createWebDavClient(store: SyncStore) {
let u = new URL(proxyUrl + pathPrefix + path); let u = new URL(proxyUrl + pathPrefix + path);
// add query params // add query params
u.searchParams.append("endpoint", config.endpoint); u.searchParams.append("endpoint", config.endpoint);
proxyMethod && u.searchParams.append("proxy_method", proxyMethod);
url = u.toString(); url = u.toString();
} catch (e) { } catch (e) {
url = pathPrefix + path + "?endpoint=" + config.endpoint; url = pathPrefix + path + "?endpoint=" + config.endpoint;
if (proxyMethod) {
url += "&proxy_method=" + proxyMethod;
}
} }
return url; return url;