fix: rename in webdav was not working if a different root is set

Massimo Melina committed Mar 7, 2026 at 22:30 UTC 446f130862151142ae11e34b8f655a7e4e255491
1 file changed +4 -2
src/webdav.ts
+4 -2
@@ -4,7 +4,8 @@ import {
4 } from './vfs'
5 import {
6 HTTP_BAD_REQUEST, HTTP_CREATED, HTTP_METHOD_NOT_ALLOWED, HTTP_NO_CONTENT, HTTP_NOT_FOUND, HTTP_SERVER_ERROR,
7 - enforceFinal, pathEncode, prefix, getOrSet, Dict, Timeout, HTTP_UNAUTHORIZED, CFG, HTTP_LOCKED, HTTP_FORBIDDEN, DAY
7 + enforceFinal, pathEncode, prefix, getOrSet, Dict, Timeout, HTTP_UNAUTHORIZED, CFG, HTTP_LOCKED, HTTP_FORBIDDEN, DAY,
8 + join as crossJoin
9 } from './cross'
10 import { PassThrough } from 'stream'
11 import { mkdir, rm } from 'fs/promises'
@@ -123,8 +124,9 @@ export async function handledWebdav(ctx: Koa.Context) {
124 const i = dest.indexOf('//')
125 if (i >= 0)
126 dest = dest.slice(dest.indexOf('/', i + 2))
127 + dest = crossJoin(ctx.state.root || '', dest) // on Windows, we must use / as the delimiter to be able to compare with `path` below
128 if (isLocked(dest, ctx)) return true
127 - if (dirname(path) === dirname(dest)) // rename. `path` is is encoded, so we test before decoding `dest`
129 + if (dirname(path) === dirname(dest)) // rename case. `path` is is encoded, so we test before decoding `dest`
130 try {
131 await requestedRename(node, basename(decodeURI(dest)), ctx)
132 return ctx.status = HTTP_CREATED