Repository navigation
linkeddatahub-6.3.0
·
44 commits
to master
since this release
Migration
- Access is plain WAC over the document hierarchy:
acl:defaulton a container covers everything below it,acl:Controlgrants nothing, and owners are granted throughlacl:OwnerAgent; runmigrations/6.0-acl.ru.templateon each admin store andmigrations/6.0-hierarchy.ru.templateon every store ldh create authorizationtakes--defaultinstead of--control- Delete
acl/authorizations/append-request/from existing admin datasets:acl:Appendon a container now lets an agent create documents in it - A write to an existing document must quote its entity tag in
If-Match(428without one,412when stale), and a create sendsIf-None-Match: *(#452) PATCH /settingsneedsIf-Matchtoo;ldh packages add/removealready send it (#453)PUTanswers204on replace and201on create, without anETag; read the new tag withHEAD(#456)- A file upload is an ordinary
POST: it needsIf-Matchand answers204with the newETag(#456) ldhexits1on a redirect instead of following it (#454)- Re-sync copies of
docker-compose.ymlandMakefile, and addPROXY_SECRETto.envwithmake secrets; the platform does not start without it
Added
- A
PUTwithIf-None-Match: *needs onlyacl:Append, so an agent can be allowed to create documents without replacing them MAX_UPLOAD_LENGTHsets a separate size limit for file uploadsldh add file --replacereplaces a document with the file's description- Deleting a document asks in a dialog, which also explains a refusal
- Printing a document prints its content alone: no app chrome or block controls, tables and charts in full, and a page number in place of the browser's header and footer
- The access-control model is formalised in Lean (
formal/acl/), with proofs of its properties, kept in step with the code in CI and replayed against the server by the HTTP tests
Changed
acl:Writecoversacl:Append, following the ACL ontology- A document's graph states only its own place in the hierarchy:
sioc:has_parent/sioc:has_containerare server-managed, and other subjects' containment is refused with422 DELETEof a container that still has documents answers409dct:createdanddct:modifiedare server-managed, andPATCHupdatesLast-Modified- Sign-up stores only the agent's own description
- Access checks are several times faster on large stores
Removed
- The end-user dataset no longer seeds the
services/container with the DBpedia and Wikidata services; existing stores keep theirs
Fixed
- A malformed IRI is refused with
422naming each value, and the form marks the field; aPATCHused to store some, such as<http://[::1> - A form no longer lets a typed URI or language tag add statements to its update
- A write that violates SPIN constraints and SHACL shapes reports both in one
422 - A class with a SHACL shape and no SPIN constructor can be chosen as the type of a new instance again
- A
PATCHwithGRAPH,WITHorUSINGis refused with422instead of changing nothing (#453) ?graph=or?defaulton a document answers400instead of being ignored- Uploads are stored whole, hashed one by one, left behind neither on refusal nor in the temporary folder (#455)
foaf:mbox_sha1sumis the SHA1 of the agent's address (#455)- Byte ranges of uploaded files follow RFC 9110
- HTML entity tags change with the stylesheets and packages, so a deploy no longer serves stale pages
- Concurrent settings updates no longer lose one of them (#453)
- Opening the settings dialog no longer makes the next save of the page fail with
412 ldh createwith a parent URI lacking its trailing slash creates the document inside it- Re-saving a document no longer runs its imports again
- An empty
POSTis a no-op answering204 - A
PATCHthat would empty the root or a WebID document answers422instead of405 - A
428response explains how to get the current entity tag - A write whose
Acceptnames no RDF syntax is no longer refused with406 405responses list the allowed methods, a415toPATCHnames the accepted type, and access requests answer201- An anonymous
HEADon a document the requester may only append to is answered200with its entity tag instead of403: the front Varnish fetched a HEAD as a GET on a cache miss, so the platform decided it as a read.HEADnow bypasses the cache and is decided as a HEAD, the way a conditional write by an agent withoutacl:Readneeds
Security
- A document's types, which authorizations match on, come from its own graph only, so a write to one document cannot change another's access
/sparqlrefuses SPARQL Update with405acl:owneranddct:creatorare server-managed, and aPATCHthat changes them is refused with422- nginx and Tomcat refuse unusual request paths, and the platform accepts a forwarded client certificate only with the secret shared with nginx
- Responses to authenticated agents and uploaded files are
Cache-Control: private, and the front Varnish no longer caches OAuth sessions - Writes and access changes evict the affected cached responses, and documents are revalidated
- OAuth sign-in verifies the ID token's signature first, accepts only
RS256, and survives a provider key rotation - An agent's delegation and ID token are sent only to this instance's dataspaces, and a refreshed token replaces the old one
- The page OAuth sign-in returns to must belong to this instance, and the OAuth cookies are hardened
- Outbound fetches check every redirect hop against the internal-address rules
- A package stylesheet whose URL is refused is left out instead of fetched