fix: reach directly shared files and keep others' files on a failed copy

Fixes from the review of the Files work (1cf9944b..a9a25b94).

- A file shared on its own, or one below a folder its owner took back,
  could not be reached. Once Stalwart 1.0's placeholder folders were
  left out it became a root of "Shared with me", which listed folders
  only, and search opened it on the drive root. 0.16 lists such files
  as roots too. Each owner's files shared on their own are now listed
  on one page under "Shared with me" ("Files from <name>"), where they
  open, preview and download like any other file and nothing can be
  added; two of the same name get a number. Search opens a shared hit
  where it is listed, and links into a shared drive name the node by id
  (`/files?shared=<owner>:<id>`), so a shared folder or page also
  survives a reload. A Files page that is already open takes the link
  from search directly, since Next keeps it mounted when only the query
  changes.
- A copy that fails part-way destroys only the nodes it made, the
  deepest first and without `onDestroyRemoveChildren`, one call per
  level because 0.16 refuses a folder destroyed in the same call as
  its children. It used to destroy the new folder with everything
  below it, so whatever someone put there during a long copy was
  deleted for good. A folder holding such nodes now stays, and the
  error says part of the copy was left in place.
- The document editor opens read-only on 0.16 for a sharee without the
  rename right. 0.16.6 to 0.16.23 refuse any change a sharee makes
  without Modify, so every save of such a document failed with a 500.
  1.0, told apart by its `maxFileNodeDepth`, still asks for
  `mayModifyContent` alone.
- Ctrl+C with only symlinks selected empties the clipboard instead of
  keeping an earlier cut for the next paste.
- A paste reads each account's file tree once, not once per pasted
  item for the listing and 1.0's depth check.
- The Stalwart bundle's README says that on older 0.16 releases and
  the 1.0 pre-releases a failed update also drops the cached copy, and
  the next restart or reload of the Applications downloads it again,
  not only a later `UpdateApps`. The static README says a restart
  applies the CORS setting on the current 1.0 pre-releases, where
  `ReloadSettings` fails with the stock spam-filter rules.
This commit is contained in:
Linus Rath
2026-09-25 22:16:19 +02:00
parent 5a553a315b
commit d9ffe8a76e
49 changed files with 1010 additions and 126 deletions
+11 -6
View File
@@ -600,8 +600,10 @@ ${demoMode ? "Demo mode is ON: the login page offers a built-in demo account and
or over JMAP as an administrator: \`x:Http/set\` with
\`{"update": {"singleton": {"usePermissiveCors": true}}}\`. It applies once
the settings are reloaded (the \`ReloadSettings\` action) or Stalwart
restarts. Stalwart 0.16 and later ignore the \`[http] permissive-cors\` key
of the old TOML configuration.
restarts. On the current 1.0 pre-releases \`ReloadSettings\` fails while the
stock spam-filter rules are loaded, so restart Stalwart there instead.
Stalwart 0.16 and later ignore the \`[http] permissive-cors\` key of the old
TOML configuration.
A reverse-proxy rule works too if it allows your Lite origin with the
\`Authorization\` and \`Content-Type\` headers on \`/.well-known/jmap\`, \`/jmap/*\`,
@@ -1371,10 +1373,13 @@ update right away.
What a failed download does depends on the Stalwart version. On 0.16.23 the
running bundle stays online. Older 0.16 releases and the 1.0 pre-releases
unmount the Application until a later \`UpdateApps\` succeeds. On every
version, a restart after the cached copy has expired, with \`resourceUrl\`
unreachable, leaves the Application unmounted. So check that \`resourceUrl\`
downloads before running \`UpdateApps\` or restarting.
unmount the Application and drop the cached copy. The next restart,
\`UpdateApps\` or reload of the Applications (the other nodes of a cluster
reload them after \`UpdateApps\`) downloads \`resourceUrl\` again and mounts the
bundle once that works. On every version, a restart after the cached copy
has expired, with \`resourceUrl\` unreachable, leaves the Application
unmounted. So check that \`resourceUrl\` downloads before running
\`UpdateApps\` or restarting.
Open tabs move to the new build on their next navigation (one full page
load); a freshly opened tab gets it immediately. Nothing stays stuck on old