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