Overview
For a collection to HEAD-link to a source it does not own, the source's owner must explicitly grant HEAD access to the collection's owner. OCL currently has no mechanism for owner-to-owner authorization. This ticket covers the design and implementation of that access control layer.
All same-owner linked source tickets (#2546–#2553) can ship without this. This ticket unblocks cross-owner use cases only (e.g., MSF Belgium collection HEAD-linking to the MSF source).
Background
Jonathan Payne (2026-05-29): "We don't really have a precedent for that type of access control." Today, HEAD is accessible to anyone with repo access (versionless references point to latest, but HEAD is still reachable). Future permissions work must change this. The key constraint: authorization must be owner-based, not user-based — the collection's owner (org or user) is authorized, not an individual user, so resolution is consistent regardless of who triggers it.
Cross-owner use case (MSF example)
MSF Belgium has a collection that HEAD-links to the MSF source. MSF (the source owner) grants HEAD access to the MSF Belgium owner. MSF Belgium's collections can now resolve to MSF source HEAD during authoring. However: MSF Belgium will always depend on MSF to cut a source release before MSF Belgium can publish a collection version. This implied dependency should be communicated clearly in the UI.
Tasks
Key code areas
core/common/permissions.py — HasPrivateAccess, HasOwnership, CanEditConceptDictionary — extend or add owner-level permission type
core/collections/models.py:43 — Collection model
src/components/repos/RepoCreate.jsx — source settings form
Dependencies
- All same-owner linked source tickets are independent of this
- This must ship before cross-owner HEAD-link is enabled
Related
Overview
For a collection to HEAD-link to a source it does not own, the source's owner must explicitly grant HEAD access to the collection's owner. OCL currently has no mechanism for owner-to-owner authorization. This ticket covers the design and implementation of that access control layer.
All same-owner linked source tickets (#2546–#2553) can ship without this. This ticket unblocks cross-owner use cases only (e.g., MSF Belgium collection HEAD-linking to the MSF source).
Background
Jonathan Payne (2026-05-29): "We don't really have a precedent for that type of access control." Today, HEAD is accessible to anyone with repo access (versionless references point to latest, but HEAD is still reachable). Future permissions work must change this. The key constraint: authorization must be owner-based, not user-based — the collection's owner (org or user) is authorized, not an individual user, so resolution is consistent regardless of who triggers it.
Cross-owner use case (MSF example)
MSF Belgium has a collection that HEAD-links to the MSF source. MSF (the source owner) grants HEAD access to the MSF Belgium owner. MSF Belgium's collections can now resolve to MSF source HEAD during authoring. However: MSF Belgium will always depend on MSF to cut a source release before MSF Belgium can publish a collection version. This implied dependency should be communicated clearly in the UI.
Tasks
SourceHeadAccessmodel on Source, or a JSON list of authorized owner URLs on the Source)Key code areas
core/common/permissions.py—HasPrivateAccess,HasOwnership,CanEditConceptDictionary— extend or add owner-level permission typecore/collections/models.py:43— Collection modelsrc/components/repos/RepoCreate.jsx— source settings formDependencies
Related