feat(drive): fix webdav back-compat

add env variable `OXICLOUD_WEBDAV_DRIVE_LISTING_PREFIX`
    which is by default:
    `OXICLOUD_WEBDAV_DRIVE_LISTING_PREFIX="@drive"`

    so `/webdav/` -> points to user's personal drive (**backward compatibilit**y)
    `/web/dav/@drive/{uuid|drive name}/` points to the respective drive

    if admins want directly `/webdav/` pointing to list of drives they need to:
    `OXICLOUD_WEBDAV_DRIVE_LISTING_PREFIX=""`

    + ensure lock is per user (RFC 4918 §9.11)

    fix: #554
This commit is contained in:
Edouard Vanbelle
2026-07-06 20:45:21 +02:00
parent 3d74bed326
commit 7e34045ff8
16 changed files with 1576 additions and 232 deletions
+24
View File
@@ -85,6 +85,30 @@ OXICLOUD_SERVER_HOST=127.0.0.1
# to an admin token. Default: false.
#OXICLOUD_ENABLE_ADMIN_INTERNAL_ENDPOINTS=false
# Native WebDAV URL segment that returns the drive listing. Sanitized
# by trimming leading/trailing `/` so `/@drive/`, `@drive`, and
# `@drive/` are equivalent. Three deployment modes:
#
# * Default `@drive` — back-compat with pre-multi-drive clients.
# /webdav/… → caller's default personal drive
# /webdav/@drive/ → drive listing (per-drive virtual
# folders)
# /webdav/@drive/<sel>/… → specific drive by UUID or its
# display name
#
# * Empty `""` — no default-drive shortcut; `/webdav/` IS the
# drive listing. Clients must always name the drive.
# /webdav/ → drive listing
# /webdav/<sel>/… → specific drive
#
# * Any other string (e.g. `drives`) — same shape as `@drive` but
# with your chosen segment substituted.
#
# Selector `<sel>` is a drive UUID or the drive's display name. Only
# drives the caller has Read on via role_grants resolve; unknown
# selector and permission denial both return 404 (anti-enumeration).
#OXICLOUD_WEBDAV_DRIVE_LISTING_PREFIX=@drive
# How often (milliseconds) the background job drains storage.tree_etag_dirty
# and bumps folder tree ETags (default: 500). Write paths only enqueue bump
# requests — this is the upper bound on how stale an ancestor folder's ETag