Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,31 @@ Versions are `<stock CSS version>-<n>`: a new stock release starts at `-1`, a
new overlay on the same stock adds one. A tag `v<version>` publishes both
images (`.github/workflows/build.yml`).

## 7.3.0-1 — 2026-11-03

Stock CSS 7.3.0 (#30). An instance updates the image; nothing to change in
`.env` but the version. Pods made before keep what they have: the new pod
files below come with pods made from this image on.

- **CSS 7.3.0.** Runs on Node 24 (the guard is built and tested in the stock
image, so it moved with it). Upstream changes that matter to instances:
pod quota now works in subdomain mode (was silently unlimited), write locks
hold while a request body is still arriving, and **a WebID's profile can be
repaired** from the account (`recoverWebId`): it is regenerated from the pod
templates, the old one backed up beside it.
- **Merged into the overlay:** the consent page's "repair it first" line and the
account page's "Repair a WebID in one of your pods" link (stock ids kept,
hidden when the server can't repair), set apart from the main choice.
- **New pods are findable by type.** A new pod starts with a public Type Index
(`settings/publicTypeIndex.ttl`, readable by anyone), a private one
(`settings/privateTypeIndex.ttl`) and a preferences file (`settings/prefs.ttl`,
naming the private index), all private but the public index. The profile
(`pod/base/profile/card$.ttl.hbs`, now an override, in the baseline) links the
public index and the preferences file, so apps never have to write the
profile to add them; a profile repaired by 7.3's recovery keeps the links.
Both layouts, WAC and ACP. Asked by Maps of Making home (mom-home#14,
decision 2026-11-03).

## 7.2.0-13 — 2026-11-02

An instance updates the image; nothing to change in `.env` but the version.
Expand Down
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
#
# Nothing in CSS is patched. The image only adds files where stock CSS already
# looks for them (templates/), one config, and one component (PodNameGuard).
ARG CSS_VERSION=7.2.0
ARG CSS_VERSION=7.3.0

# PodNameGuard, built and tested in the stock image it will run in, so on the
# same Node: 18 for CSS 7.x, 22 for 8.0. Until 7.2.0-5 this stage was a pinned
# same Node: 18 for CSS 7.0-7.2, 24 from 7.3.0, 22 for 8.0. Until 7.2.0-5 this stage was a pinned
# node:18-slim, which would have kept testing on 18 after the move to 8.0 (and
# 18 is past end of life). The stage only builds; nothing of it but the built
# component reaches the final image.
Expand Down
6 changes: 6 additions & 0 deletions overlay/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -590,3 +590,9 @@ ol.breadcrumbs > li:only-child { display: none; }
@media (prefers-reduced-motion: reduce) {
.pending-line { animation: none; left: 0; width: 100%; opacity: 0.5; }
}

/* CSS 7.3.0's WebID recovery links (consent, account). On consent it is an
aside to the choice above, not part of it: set apart and quieter. On the
account page it sits beside "Link a WebID": a gap, never run together. */
#recoverWebId:is(p) { margin-top: 24px; font-size: 0.875rem; color: var(--text-secondary); }
#linkWebId + #recoverWebId { margin-left: 1.5em; }
9 changes: 8 additions & 1 deletion overlay/templates/identity/account/resource.html.ejs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<%# Override of CSS 7.2.0 identity/account/resource.html.ejs (upstream-baseline.sha256).
<%# Override of CSS 7.3.0 identity/account/resource.html.ejs (upstream-baseline.sha256).
Kept from stock: every id and the whole script, but for two labels it sets
("Change" for "(update)", "Remove" for util.js's "(delete)").
Changed: copy, an intro line, and the order — pods and WebIDs first, each
Expand All @@ -20,6 +20,7 @@
</p>
<ul id="webIdEntries"></ul>
<a id="linkWebId" href="" class="link">Link a WebID from elsewhere</a>
<a id="recoverWebId" href="" class="link">Repair a WebID in one of your pods</a>
</div>
<div id="passwordLogins">
<h2>How you log in</h2>
Expand Down Expand Up @@ -79,6 +80,12 @@
setVisibility('webIds', false);
} else {
updateElement('linkWebId', controls.html.account.linkWebId, { href: true });
// CSS 7.3.0 (stock, kept): only shown when the server can recover a WebID from its pods.
if (controls.html.account.recoverWebId) {
updateElement('recoverWebId', controls.html.account.recoverWebId, { href: true });
} else {
setVisibility('recoverWebId', false);
}
showAccountInfo(elements.webIdEntries, webIdLinks, false, true,
'Are you sure you want to delete the registration of this WebID? ' +
'If you do so you will be unable to identify as this WebID using this server, which can potentially cause you to lose access to data restricted to this WebID.',
Expand Down
17 changes: 16 additions & 1 deletion overlay/templates/identity/oidc/consent.html.ejs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<%# Override of CSS 7.2.0 identity/oidc/consent.html.ejs (upstream-baseline.sha256).
<%# Override of CSS 7.3.0 identity/oidc/consent.html.ejs (upstream-baseline.sha256).
Kept from stock: every id, name and the consent flow in consent().
Changed: copy; focus starts on the heading (#authorize is disabled at load and
cannot take autofocus); the WebID list is sorted, labelled for reading and
Expand Down Expand Up @@ -37,6 +37,11 @@
<button id="edit-account" type="button" class="alternate">Edit account</button>
<button id="switch-account" type="button" class="alternate">Use a different account</button>
</p>

<p id="recoverWebId">
If an app can't read or use a WebID that lives in one of your pods, stop here:
<a id="recover-webid" href="" class="link">repair it first</a> from your account.
</p>
</form>

<script>
Expand Down Expand Up @@ -168,6 +173,7 @@
}

function wireButtons(controls) {
const recoverWebIdLink = document.getElementById('recover-webid');
elements.cancel.addEventListener('click', async() => {
const res = await fetch(controls.oidc.cancel, { method: 'POST' });
location.href = (await res.json()).location;
Expand All @@ -177,6 +183,15 @@
await fetch(controls.account.logout, { method: 'POST' });
location.href = controls.html.main.login;
});

// CSS 7.3.0 (stock, kept): a broken WebID is repaired before it is used again, so the flow is not
// resumed here: without a `return` parameter the recovery page goes back to the account page.
// A link needs a real href: an empty one would navigate to the current page.
if (controls.html.account?.recoverWebId) {
recoverWebIdLink.href = controls.html.account.recoverWebId;
} else {
setVisibility('recoverWebId', false);
}
}

// Adds client info to the UI. As text: the name and ID come from the app's
Expand Down
20 changes: 20 additions & 0 deletions overlay/templates/pod/acp/settings/publicTypeIndex.ttl.acr
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# The public Type Index is readable by anyone (same as wac/): apps find a pod's
# findable data through it.
@prefix acl: <http://www.w3.org/ns/auth/acl#>.
@prefix acp: <http://www.w3.org/ns/solid/acp#>.

<#publicTypeIndex>
a acp:AccessControlResource;
acp:resource <./publicTypeIndex.ttl>;
acp:accessControl <#publicReadAccess>.

<#publicReadAccess>
a acp:AccessControl;
acp:apply [
a acp:Policy;
acp:allow acl:Read;
acp:anyOf [
a acp:Matcher;
acp:agent acp:PublicAgent
]
].
26 changes: 26 additions & 0 deletions overlay/templates/pod/base/profile/card$.ttl.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{{!--
Override of CSS 7.3.0 pod/base/profile/card$.ttl.hbs (upstream-baseline.sha256).
Kept from stock: every statement, in the same order and with the same conditions.
Added: the two discovery links every Solid app looks for (solid:publicTypeIndex,
pim:preferencesFile, whose file names the private Type Index), so a new pod is
findable by type from day one and apps never need to write the profile to add
them (Maps of Making home, decision 2026-11-03). CSS 7.3's WebID recovery
regenerates the profile from this template: a repaired profile keeps the links.
This comment does not reach the pod.
--}}
@prefix foaf: <http://xmlns.com/foaf/0.1/>.
@prefix solid: <http://www.w3.org/ns/solid/terms#>.
@prefix pim: <http://www.w3.org/ns/pim/space#>.

<>
a foaf:PersonalProfileDocument;
foaf:maker <{{webId}}>;
foaf:primaryTopic <{{webId}}>.

<{{webId}}>
{{#if name}}foaf:name "{{name}}";{{/if}}
{{#if oidcIssuer}}solid:oidcIssuer <{{oidcIssuer}}>;{{/if}}
{{#if linkStorage}}pim:storage <{{base.path}}>;{{/if}}
{{#if linkStorage}}solid:publicTypeIndex <{{base.path}}settings/publicTypeIndex.ttl>;{{/if}}
{{#if linkStorage}}pim:preferencesFile <{{base.path}}settings/prefs.ttl>;{{/if}}
a foaf:Person.
10 changes: 10 additions & 0 deletions overlay/templates/pod/base/settings/prefs.ttl.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{{!--
The preferences file (pim:preferencesFile in the profile): private, it names
the private Type Index so its address is not published in the profile.
--}}
@prefix pim: <http://www.w3.org/ns/pim/space#>.
@prefix solid: <http://www.w3.org/ns/solid/terms#>.

<> a pim:ConfigurationFile.

<{{webId}}> solid:privateTypeIndex <./privateTypeIndex.ttl>.
8 changes: 8 additions & 0 deletions overlay/templates/pod/base/settings/privateTypeIndex.ttl.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{{!--
The private Type Index: where the owner's apps find what is the owner's alone
(an app's settings). Private: inherits the pod root's owner-only rules. Named
in settings/prefs.ttl, not in the public profile.
--}}
@prefix solid: <http://www.w3.org/ns/solid/terms#>.

<> a solid:TypeIndex, solid:UnlistedDocument.
9 changes: 9 additions & 0 deletions overlay/templates/pod/base/settings/publicTypeIndex.ttl.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{{!--
The public Type Index: where apps find what this pod makes findable, by type
(a space file, later a network's config). Readable by anyone
(wac/settings/publicTypeIndex.ttl.acl.hbs): list only what is public anyway.
Linked from the profile (profile/card). Starts empty; apps add their own entries.
--}}
@prefix solid: <http://www.w3.org/ns/solid/terms#>.

<> a solid:TypeIndex, solid:ListedDocument.
17 changes: 17 additions & 0 deletions overlay/templates/pod/wac/settings/publicTypeIndex.ttl.acl.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# The public Type Index is readable by anyone: apps find a pod's findable data
# through it. The owner keeps full control. Everything else in settings/ stays
# private (the pod root's owner-only rules).
@prefix acl: <http://www.w3.org/ns/auth/acl#>.
@prefix foaf: <http://xmlns.com/foaf/0.1/>.

<#public>
a acl:Authorization;
acl:agentClass foaf:Agent;
acl:accessTo <./publicTypeIndex.ttl>;
acl:mode acl:Read.

<#owner>
a acl:Authorization;
acl:agent <{{webId}}>;
acl:accessTo <./publicTypeIndex.ttl>;
acl:mode acl:Read, acl:Write, acl:Control.
18 changes: 9 additions & 9 deletions pod-name-guard/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion pod-name-guard/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"@solid/community-server": "^7.0.0"
},
"devDependencies": {
"@solid/community-server": "7.2.0",
"@solid/community-server": "7.3.0",
"componentsjs-generator": "^3.1.2",
"typescript": "^5.5.3"
}
Expand Down
7 changes: 4 additions & 3 deletions upstream-baseline.sha256
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,16 @@
# changes one of these, our copy is now an override of something that moved:
# re-diff upstream vs overlay/, merge, then refresh this file
# (scripts/check-overrides.sh --rebaseline).
# image: solidproject/community-server:7.2.0
# image: docker.io/solidproject/community-server:7.3.0
dd4410b9532fab475600eb33359662e8298b8c3b40f1329f577bf0bda81d8829 main.html.ejs
d626342c07dd2b5bfe0781cabae0c9fe1028aad40bff4d0b51f2a35e282b46c8 styles/main.css
2f5f8a68836377bce534ebfb0f2a655533105e7bca5d5054bf26c357eff2ed3c identity/account/create-pod.html.ejs
34ced171ad6dc257d5f2e4af12e217ea5c65c6021fc2d1127eb2d794e457a32c identity/oidc/consent.html.ejs
0241eac433ba7eb82f447ebd86ab109824fbdc0a7d9dd319b3acd430cb02c7da identity/account/resource.html.ejs
19517a1cc9c89a5ce00f0d4403bab1be0aed05bdc74f63b87edacdc4b0f944bd identity/oidc/consent.html.ejs
33e8bd1c98dd4c31456e4fcaa87ae1fc67888f6c1cbf2a1686db95d0764440c1 identity/account/resource.html.ejs
66e80cd28eb30ad9c67bc805d023c9e9ca84072dcf9c427ee27d126b50ce7548 identity/password/login.html.ejs
edac5fa9f3e3ff6f70228137834d8550c1b099690d2ef83b37322714d8562278 identity/password/register.html.ejs
f99f165d8e87250bcc2ade76065c0fe624b7b50418bd7211abacd337496d4054 identity/password/forgot.html.ejs
e279ff53c05fafe1d6934bc192b3a1582b348ae8ac7e711e5818e74ae9512976 identity/password/reset.html.ejs
bcf1c2377eb25f2f98bd697e55e3f4030f4a1cdff93b1c7500e16e9eb07246dd identity/password/reset-email.html.ejs
5959dfa82a88b4c253b85b85cf506d4e3e9890d23f66e0657dfa1e0775341f2a pod/base/README$.md.hbs
8fdf3ed1f59a7cb67a9a216ea227ebf638aa058e66bafe0707810c1901182985 pod/base/profile/card$.ttl.hbs
Loading