fix(files): don't expose WebDAV XML-attribute artifacts as DOM attributes#3225
fix(files): don't expose WebDAV XML-attribute artifacts as DOM attributes#3225chrip wants to merge 1 commit into
Conversation
…utes
genFileInfo() flattens every DAV property and runs camelcase() on each
key. Since Nextcloud 33, a file's nc:system-tags property contains
<nc:system-tag> elements that carry XML attributes (can-assign, id,
user-visible, ...). The WebDAV parser represents those attributes with a
leading "@", and camelcase() preserves it, so genFileInfo produced keys
such as "@canAssign". When the resulting object is bound via v-bind in
Viewer.vue, Vue calls setAttribute("@canAssign", ...), which throws
"InvalidCharacterError: Invalid qualified name" on Firefox and Safari
(Chrome silently ignores it). The result is that tagged office files
cannot be opened in those browsers.
Skip the structured system-tags subtree (it is not scalar file metadata)
and, as a defensive backstop, drop any camelCased key that still starts
with "@", so XML-attribute artifacts never reach the DOM.
Ref: nextcloud/richdocuments#5490
Assisted-by: ClaudeCode:Opus-4.8
Signed-off-by: Christoph Schaefer <christoph.schaefer@nextcloud.com>
2cc5765 to
f7e98f3
Compare
|
@skjnldsv can you please review this? I fear I dont have enough knowledge on this part of the code to be able to do so myself. |
|
Hello there, We hope that the review process is going smooth and is helpful for you. We want to ensure your pull request is reviewed to your satisfaction. If you have a moment, our community management team would very much appreciate your feedback on your experience with this PR review process. Your feedback is valuable to us as we continuously strive to improve our community developer experience. Please take a moment to complete our short survey by clicking on the following link: https://cloud.nextcloud.com/apps/forms/s/i9Ago4EQRZ7TWxjfmeEpPkf6 Thank you for contributing to Nextcloud and we hope to hear from you soon! (If you believe you should not receive this message, you can add yourself to the blocklist.) |
|
@skjnldsv Hiya, would you be able to review this? |
Summary
Tagged office files (and other tagged files) cannot be opened in the Viewer on Firefox and Safari since Nextcloud 33. Opening them throws:
Chrome is unaffected (it silently tolerates the invalid attribute name).
Originally reported against Nextcloud Office: nextcloud/richdocuments#5490 — but the crash is in the Viewer's
genFileInfo, triggered for any tagged file.Root cause
genFileInfo()(src/utils/fileUtils.ts) recursively flattens every DAV property and runscamelcase()on every key.Since Nextcloud 33, a file's
nc:system-tagsPROPFIND property contains<nc:system-tag>elements that carry XML attributes (can-assign,id,user-visible, …) — seeapps/dav/lib/SystemTag/SystemTagList.phpin server. The WebDAV/fast-xml-parserlayer represents those attributes with a leading@(e.g.@can-assign), andcamelcase('@can-assign')preserves the leading@, yielding@canAssign.genFileInfotherefore produces a key@canAssignon the file-info object.Viewer.vuebinds that object withv-bind="currentFile", so Vue callsel.setAttribute('@canAssign', …).@is illegal in a DOM/XML qualified name → Firefox & Safari throw, Chrome ignores it.The server XML is valid; the bug is purely in the client-side flattening.
Fix
In
genFileInfo:system-tagssubtree — it is not scalar file metadata and should not be flattened into the file-info object.@, so WebDAV XML-attribute artifacts can never reach the DOM.Testing
Validated with a faithful reproduction of
genFileInfo's logic + the realcamelcase@8package against a webdav-parsed PROPFIND of a tagged file:@canAssign,@id,@userVisible→setAttributethrowssystemTagarray as attrfileid,filename, …)To reproduce manually: tag any office file, open it in Firefox → console
InvalidCharacterErroronmaster, gone with this change.Notes
js/are not included (my local toolchain is Node 22 / npm 10, the repo requires Node ^24 / npm ^11). Please recompile via CI / the compile bot.Ref: nextcloud/richdocuments#5490
Assisted-by: ClaudeCode:Opus-4.8