Skip to content

feat: merge the workpagages branch into main - #3956

Merged
butonic merged 35 commits into
mainfrom
workpagages
Nov 13, 2026
Merged

butonic merged 35 commits into
mainfrom
workpagages

Conversation

@butonic

@butonic butonic commented Nov 11, 2026 •

Copy link
Copy Markdown
Member

Tracks the work packages that land on workpagages before they go to main. Stays a draft until the work packages are done. We merge main into workpagages regularly to keep the diff small.

So far:

Open against workpagages:

AI assistance: Claude Code (claude-opus-5-5) merged main into the branch and drafted this description.

asaah262 and others added 7 commits November 10, 2026 13:41
The drive item name was derived from the resource path. Space roots
have no path ("."), so e.g. the sharedByMe response reported "." as
the name of a shared project space. Use the name provided by the
storage provider and fall back to the base of the path if it is empty.

Adjust the sharedByMe acceptance scenario for link shares of a
project space accordingly: the space root item now carries the name of
the space.
fix(graph): report the space name instead of "." for space roots in sharedByMe
Updating a drive with an empty name ("name": "") succeeded and silently
kept the old name, because the name was only validated when it was
non-empty. Validate it whenever the request contains it, so an empty
name is rejected with 400 like on create. A request without a name, or
with "name": null, still leaves the name unchanged.

Space names were trimmed with strings.TrimSpace, which only removes
Unicode whitespace. Invisible formatting characters such as the
zero-width space (U+200B), the word joiner (U+2060) or the byte order
mark (U+FEFF) aren't whitespace, so a name made only of them was
accepted on create and on update, and showed up as an empty name in
every client. Trim these characters from both ends of the name as
well. Inside a name they are still allowed, since some of them are
needed there, e.g. the zero-width joiner in emoji sequences.

Assisted-by: Claude Code:claude-opus-5-5
Assisted-by: Claude Code:claude-opus-5-5
@codacy-production

codacy-production Bot commented Nov 11, 2026 •

Copy link
Copy Markdown

Up to standards ✅

🟢 Issues 0 issues

Results:
0 new issues

View in Codacy

🟢 Metrics 139 complexity

Metric Results
Complexity 139

View in Codacy

🟢 Coverage 69.39% diff coverage · +0.67% coverage variation

Metric Results
Coverage variation ✅ +0.67% coverage variation (-1.00%)
Diff coverage ✅ 69.39% diff coverage

View coverage diff in Codacy

Coverage variation details
Coverable lines Covered lines Coverage
Common ancestor commit (f314b17) 93691 27122 28.95%
Head commit (ede21a0) 94083 (+392) 27862 (+740) 29.61% (+0.67%)

Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: <coverage of head commit> - <coverage of common ancestor commit>

Diff coverage details
Coverable lines Covered lines Diff coverage
Pull request (#3956) 490 340 69.39%

Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: <covered lines added or modified>/<coverable lines added or modified> * 100%

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

asaah262 and others added 21 commits November 11, 2026 12:14
…rmission

feat(graph): add GET endpoints for single sharing permissions
…-name

fix(graph): reject empty and invisible drive names on update
Co-authored-by: Firas Frikha <firas.frikha@kiteworks.com>
Pins reva to the workpackages branch (2d4db7d27), which carries the
upload coordinator and the other WP1 storage changes on top of reva
main. Once workpackages lands in reva main this becomes a regular bump
to main.

Assisted-by: Claude Code:claude-opus-5-5
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
Signed-off-by: Firas Frikha <firas.frikha@kiteworks.com>
Upload sessions whose node metadata can no longer be read can never
finish postprocessing, stay in processing state indefinitely and keep
consuming the quota of their space.

Wire up the Orphaned session filter so operators can list the affected
sessions and remove them with --clean:

    opencloud storage-users uploads sessions --orphaned
    opencloud storage-users uploads sessions --orphaned --clean

Signed-off-by: Julian Koberg <julian.koberg@kiteworks.com>
The driver no longer consumes postprocessing events: the upload
coordinator does, in the "dcfs" group, and the driver only consumes
DeleteRevision in "dcfs-revisions". The command still disables async
uploads so it does not join that group.

Assisted-by: Claude Code:claude-opus-5-5
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
…on PostprocessingFinished

The storage drops postprocessing events that belong to another storage,
which needs its mount id and the resource id on the event.
Postprocessing results are dropped when their storage id does not match
the driver's mount id. Only the decomposed driver was given a mount_id,
so under decomposeds3 there was nothing to compare against.

Also pass it in DecomposedNoEvents and DecomposedS3NoEvents.
The upload coordinator reads the mount id from the driver config to drop
postprocessing results that belong to another storage. The dataprovider
does not add it to the driver config the way the storageprovider does,
so without it the coordinator accepts every result for posix.

Assisted-by: Claude Code:claude-opus-5-5
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
The remote instance still sees the share with the role it was created
with, so the upload coordinator refuses the upload there instead of the
owner's instance failing it with 500.

Assisted-by: Claude Code:claude-opus-5-5
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
Picks up opencloud-eu/reva#978: a failed blob
commit now logs the space and node id, and the last attempt logs that
we give up. This runs the rest of the `owncloud/reva#733` port through
the opencloud CI.

Assisted-by: Claude Code:claude-opus-5-5
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
Picks up the space manager checks from
opencloud-eu/reva#990 and
opencloud-eu/reva#993.

go-chi and go-jose move up because reva requires the newer versions.

Assisted-by: Claude Code:claude-opus-5-5
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
Log the error text with every permission failure, at debug and error
level, and the texts of both errors when a fallback returns a different
error than the first attempt.

Log gateway selection failures in the share helpers at error level with
the request id and, where available, the permission id, so they can be
matched with the entry of the calling operation.

Use constants for the log keys, the recipient types and the tracer name,
log the space type of unsupported spaces and the user id of the shared
by me listing, and log an unknown permission type when deleting.

Assisted-by: Claude Code:claude-opus-5-5
Publish the spaces.server_managed capability, driven by the OC_CLAIM_MANAGED_SPACES_ENABLED setting, so that clients can block adding and removing users to and from spaces.
Refine the description of the OC_CLAIM_MANAGED_SPACES_ENABLED setting and add a section to the frontend README that explains what it does.
Assert that the spaces.server_managed capability follows the OC_CLAIM_MANAGED_SPACES_ENABLED setting for both values.
…-and-tracing

feat(graph): improve logging and tracing for drive item permissions
Without $expand=memberOf, GET /me built the user from the CS3 user of
the request context. That user doesn't know the identities the user
signed in with, so identities[].issuerAssignedId contained the internal
user ID instead of the subject assigned by the identity provider, which
the identity backend stores when the user is provisioned. Only requests
with $expand=memberOf read the user from the identity backend and
returned the correct value.

GET /me now always reads the user from the identity backend. The group
memberships are still only looked up when $expand=memberOf asks for
them, so a plain /me costs one more user lookup in the identity
backend.

This changes the response of a plain GET /me in two cases:
- users for whom the identity backend has no stored identity, e.g.
  users created through the API rather than signed in through an
  identity provider, get no identities at all, instead of one that
  wrongly carried the internal user ID
- when the identity backend doesn't know the user, /me answers with its
  error (e.g. 404 instead of 200 with a model built from the request
  context)

A failing identity backend is now logged at error level, a user it
doesn't know at debug level.

PERFORMANCE: every plain GET /me now runs one search in the identity
backend (LDAP), where it used to need none.

Assisted-by: Claude Code:claude-opus-5-5
feat(frontend): add server managed spaces capability
asaah262 and others added 6 commits November 13, 2026 13:22
Assisted-by: Claude Code:claude-opus-5-5
Brings in opencloud-eu/reva#1001, which merges
reva main into workpackages: the typed storage results, the fix for
synchronous uploads stuck in processing (moved to the upload
coordinator), the main-queue replica fix and the posix id cache fail
fast.

Assisted-by: Claude Code:claude-opus-5-5
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
workpackages was merged into reva main with
opencloud-eu/reva#957, so we no longer need to
pin the workpackages branch. The code is the same as 7ff1d6fb1, only
the version changes.

Assisted-by: Claude Code:claude-opus-5-5
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
fix(graph): return the identities of the identity backend on /me
feat(graph): allow client-supplied drive IDs when creating spaces
feat: switch uploads to the reva upload coordinator
@butonic
butonic marked this pull request as ready for review November 13, 2026 15:58
The only conflicts were the reva bump in go.mod, go.sum and vendor.
main moved to reva v2.52.2, workpagages already points to reva main
036856689, which contains v2.52.2, so we keep that and re-vendor.

Assisted-by: Claude Code:claude-opus-5-5
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
@butonic
butonic enabled auto-merge November 13, 2026 16:10
@butonic
butonic merged commit bc8cd60 into main Nov 13, 2026
60 of 61 checks passed
@butonic
butonic deleted the workpagages branch November 13, 2026 16:53
@butonic
butonic restored the workpagages branch November 13, 2026 17:05
@butonic
butonic deleted the workpagages branch November 13, 2026 17:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.