From 8d0caa9785b7e7ad8b223f53bd88df0cab4844e7 Mon Sep 17 00:00:00 2001 From: Jeff Zucker <44732708+jeff-zucker@users.noreply.github.com> Date: Sun, 25 Jan 2026 11:22:10 -0800 Subject: [PATCH 1/3] Add SHACL shape for Solid WebID profile discovery This shape defines discovery predicates for Solid WebID profiles, including preferences file, inbox, storage, and OIDC issuer endpoints. --- shapes/profile-discovery-shape.ttl | 122 +++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 shapes/profile-discovery-shape.ttl diff --git a/shapes/profile-discovery-shape.ttl b/shapes/profile-discovery-shape.ttl new file mode 100644 index 0000000..381fde8 --- /dev/null +++ b/shapes/profile-discovery-shape.ttl @@ -0,0 +1,122 @@ +@prefix sh: . +@prefix foaf: . +@prefix vcard: . +@prefix solid: . +@prefix ldp: . +@prefix owl: . +@prefix rdfs: . +@prefix pim: . +@prefix interop: . + +########################################################################## +# +# SHAPE FOR DISCOVERY OF THE MAJAR ENDPOINTS IN A SOLID WEBID-PROFILE +# +# This shape includes discovery predicates mentioned in +# the Solid WebID Profile draft specification. The intention +# is to support most currently extant Solid Profiles. Therefore +# the shape also includes discovery predicates in common use but +# not in the draft specification. These inlude : +# +# * the non-standard `foaf:primaryTopicOf`. +# * the most common validation endpoint - `solid:oidcIssuer`. +# * both currently used discovery mechanisms - type indexes and SAI +# +# The shape is agnostic regarding whether the WebID document is located +# on a Solid server or not, whether the WebID document and the "social profile" +# are the same document or not, and whether the profile uses type indexes +# or SAI for further discovery. +# +# To use this shape for validation, one must first load the full profile, +# i.e. all of the available endpoints in the shape. The resulting graph +# can then be validated against this shape. +# +########################################################################## + +<> + dcterms:issued "2026-01-25"^^xsd:date ; + dct:creator . + +<#Webid-profile-discovery-shape> a sh:Shape ; + + sh:targetClass foaf:Agent, foaf:Person, foaf:Organization ; + sh:name "WebID Profile Shape" ; + sh:description "Shape for discovery of Solid WebID Profile endpoints." ; + sh:property + + # PREFERENCES-FILE + # + [ + sh:path pim:preferencesFile ; + sh:nodeKind sh:IRI ; + sh:minCount 1 ; + sh:maxCount 1 ; + sh:description "The profile must have exactly 1 preferences file." + ] , + + # INBOX + # + [ + sh:path ldp:inbox ; + sh:nodeKind sh:IRI ; + sh:maxCount 1 ; + sh:description "The profile may have 0 or one inbox." + ] , + + # STORAGE + # + [ + sh:path solid:storage ; + sh:nodeKind sh:IRI ; + sh:description "The profile may have 0 or more storage endpoints." + ] , + + # SEE-ALSO + # + [ + sh:path rdfs:seeAlso ; + sh:nodeKind sh:IRI ; + sh:description "The profile may have 0 or more seeAlso endpoints." + ] , + + # ISSUER + # + [ + sh:path solid:oidcIssuer ; + sh:nodeKind sh:IRI ; + sh:description "The profile may have 0 or more OIDC issuer endpoints." + ] , + + # TYPE INDEXES + # + [ + sh:path solid:publicTypeIndex ; + sh:nodeKind sh:IRI ; + sh:maxCount 1 ; + sh:description "The profile may have 0 or 1 publicTypeIndex endpoint." + ] , + [ + sh:path solid:privateTypeIndex ; + sh:nodeKind sh:IRI ; + sh:maxCount 1 ; + sh:description "The profile may have 0 or 1 privateTypeIndex endpoint." + ] , + + # PRIMARY-TOPIC-OF + # + [ + sh:path foaf:primaryTopicOf ; + sh:nodeKind sh:IRI ; + sh:maxCount 1 ; + sh:description "The profile may have 0 or 1 primary-topic-of endpoints." + ], + + # SAI + [ + sh:path interop:authorizationAgent ; + sh:nodeKind sh:IRI ; + sh:maxCount 1 ; + sh:description "The profile may have 0 or 1 authorization agent." + ] + +. From c8a26bcfecb7cb22766c133857187690df253652 Mon Sep 17 00:00:00 2001 From: Jeff Zucker <44732708+jeff-zucker@users.noreply.github.com> Date: Sun, 25 Jan 2026 11:32:45 -0800 Subject: [PATCH 2/3] Update authorization agent property in profile shape Add dct: prefix. Correct interop:authorizationAgent to interop:hasAuthorizationAgent --- shapes/profile-discovery-shape.ttl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shapes/profile-discovery-shape.ttl b/shapes/profile-discovery-shape.ttl index 381fde8..6ad2b43 100644 --- a/shapes/profile-discovery-shape.ttl +++ b/shapes/profile-discovery-shape.ttl @@ -7,6 +7,7 @@ @prefix rdfs: . @prefix pim: . @prefix interop: . +@prefix dct: . ########################################################################## # @@ -113,7 +114,7 @@ # SAI [ - sh:path interop:authorizationAgent ; + sh:path interop:hasAuthorizationAgent ; sh:nodeKind sh:IRI ; sh:maxCount 1 ; sh:description "The profile may have 0 or 1 authorization agent." From 8be0ffab2568878d7ae609447a1c60208d15a2e4 Mon Sep 17 00:00:00 2001 From: Jeff Zucker <44732708+jeff-zucker@users.noreply.github.com> Date: Sun, 25 Jan 2026 16:26:41 -0800 Subject: [PATCH 3/3] Update shapes/profile-discovery-shape.ttl Co-authored-by: elf Pavlik --- shapes/profile-discovery-shape.ttl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shapes/profile-discovery-shape.ttl b/shapes/profile-discovery-shape.ttl index 6ad2b43..c3d7b21 100644 --- a/shapes/profile-discovery-shape.ttl +++ b/shapes/profile-discovery-shape.ttl @@ -67,7 +67,7 @@ # STORAGE # [ - sh:path solid:storage ; + sh:path pim:storage ; sh:nodeKind sh:IRI ; sh:description "The profile may have 0 or more storage endpoints." ] ,