Personas have walls their followers write on
Owner decision of 2026-10-06 (G-0009, FEP-400e). A persona's actor names its wall (…/graffiti, sm:wall) and, in
Smithereen's privacySettings, that its followers may write on it. A public post that is not a reply, sent with the wall
as its target by an account following the persona, is hosted: the persona is notified, it reaches the persona's and its
followers' homes, and the followers' servers and the author's are told with Add{Note}. The persona deletes it with
DELETE /api/v1/statuses/:id, which sends Remove{Note}; Smithereen deletes the post then. The wall lists the persona's
public posts that start a thread and what was written on it.
Elsewhere: an account's Add{Note} on its own wall shows the post to its followers here as on that wall (privapub.wall on
the status), and its Remove takes it away. An Add or Remove naming a collection of the account's own server PrivaPub
does not know has its document read again first, at most hourly: accounts kept before walls were read had none.
Checked live: Smithereen 40 checks (G-0009 closed); GoToSocial and Mastodon unchanged (121).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
This commit is contained in:
1 parent
e0682fa868
commit
c47b6e5533
26 files changed
+582
-36
No files matched your search
@@ -40,6 +40,10 @@ until_true 45 '[ "$(curl -s -H "$PH" "$P/api/v1/accounts/relationships?id[]=$sm_
|
||||
&& ok "alice follows smuser (Accept arrived)" || ko "smuser's Accept never arrived"
|
||||
until_true 30 '[ "$(sm friends.areFriends "user_ids=$alice_on_sm" | j "print(d[\"response\"][0][\"friend_status\"])")" = "friends" ]' \
|
||||
&& ok "the two follows make them friends on Smithereen" || ko "Smithereen does not count them as friends ($(sm friends.areFriends "user_ids=$alice_on_sm"))"
|
||||
# (alice's profile, told again: Smithereen learns of her wall, and that PrivaPub's actors have walls, when it reads her)
|
||||
curl -s -o /dev/null -X PATCH -H "$PH" "$P/api/v1/accounts/update_credentials" -d "note=alice of the pasture"
|
||||
until_true 30 '[ -n "$(sm_sql "select 1 from servers where host='"'privapub.test'"' and features & 1")" ]' \
|
||||
&& ok "Smithereen learns that PrivaPub's actors have walls" || ko "Smithereen never took PrivaPub for a server with walls"
|
||||
|
||||
echo " walls"
|
||||
sm_post=$(sm wall.post "message=a Smithereen wall post $run" | j "print(d['response'])")
|
||||
@@ -104,13 +108,37 @@ echo " someone else's wall"
|
||||
# smfriend writes on smuser's wall: the post carries the wall as its target, and smuser tells its followers' servers
|
||||
# with Add{Note}, which is no pin
|
||||
read -r _ sm_on_friend <<< "$(SMTOKEN=$SFT sm_load "https://smithereen.test/users/$sm_self")"
|
||||
smf wall.post "owner_id=$sm_self" "message=a word on smuser's wall $run" >/dev/null
|
||||
smf wall.post "owner_id=$sm_self" "message=a word on the wall of smuser $run" >/dev/null
|
||||
# (Smithereen sends a post on someone else's wall, and its owner's Add, only to servers whose actors have a wall: G-0009)
|
||||
until_true 20 '[ -n "$(p_home_has "a word on smuser'"'"'s wall $run")" ]' && ok "a post on smuser's wall reaches alice" \
|
||||
|| xf "a post on smuser's wall never reaches alice: Smithereen sends it only to servers with walls (G-0009)"
|
||||
until_true 45 '[ -n "$(p_home_has "a word on the wall of smuser $run")" ]' && ok "a post on smuser's wall reaches alice" \
|
||||
|| ko "a post on smuser's wall never reaches alice"
|
||||
on_wall=$(p_home_has "a word on the wall of smuser $run")
|
||||
[ "$(curl -s -H "$PH" "$P/api/v1/statuses/$on_wall" | j "print((d['privapub'].get('wall') or {}).get('acct'))")" = "smuser@smithereen.test" ] \
|
||||
&& ok "as written on smuser's wall" || ko "PrivaPub does not say it is on smuser's wall"
|
||||
[ "$(curl -s -H "$PH" "$P/api/v1/accounts/$sm_on_p/statuses?pinned=true" | j "print(len(d))")" = "0" ] \
|
||||
&& ok "and is not taken for a pin" || ko "PrivaPub took the wall's Add for a pin"
|
||||
|
||||
echo " alice's wall"
|
||||
# smuser follows alice, so it may write on her wall (her actor says her followers may): PrivaPub hosts the post, tells
|
||||
# alice, lists it on her wall and tells her followers' servers with Add; alice takes it off, which deletes it on Smithereen
|
||||
sm_wall_post=$(sm wall.post "owner_id=$alice_on_sm" "message=a word on alice's wall $run" | j "print(d.get('response', ''))")
|
||||
[ -n "$sm_wall_post" ] && ok "Smithereen lets smuser write on alice's wall" || ko "Smithereen refused smuser's post on alice's wall ($(sm wall.post "owner_id=$alice_on_sm" "message=x" | head -c 200))"
|
||||
p_mention() { curl -s -H "$PH" "$P/api/v1/notifications?types[]=mention&limit=40" | j "print(next((n['status']['id'] for n in d if 'a word on alice' in n['status']['content'] and '$run' in n['status']['content']), ''))"; }
|
||||
until_true 45 '[ -n "$(p_mention)" ]' && ok "the post on alice's wall reaches her" || ko "the post on alice's wall never reached her"
|
||||
walled=$(p_mention)
|
||||
[ "$(curl -s -H "$PH" "$P/api/v1/statuses/$walled" | j "print((d['privapub'].get('wall') or {}).get('username'))")" = "alice_smithereen" ] \
|
||||
&& ok "as written on her wall" || ko "PrivaPub does not say it is on alice's wall"
|
||||
walled_uri=$(curl -s -H "$PH" "$P/api/v1/statuses/$walled" | j "print(d['uri'])")
|
||||
pfetch -s -H 'Accept: application/activity+json' "$alice_uri/graffiti?page=true" | grep -q "$walled_uri" \
|
||||
&& ok "her wall lists it" || ko "her wall does not list it"
|
||||
# (the Add delivered to Smithereen, done: Smithereen holds the post already, its author's; the body's quotes are \u0022)
|
||||
p_adds_done() { podman exec pasture-mongo mongosh --quiet PrivaPub --eval 'print(db.Job.countDocuments({Host:"smithereen.test", State:2, Payload:/type\\u0022:\\u0022Add\\u0022.*graffiti/}))'; }
|
||||
until_true 30 '[ "$(p_adds_done)" -ge 1 ]' && ok "alice tells her followers' servers with Add" || ko "no Add reached Smithereen"
|
||||
curl -s -o /dev/null -X DELETE -H "$PH" "$P/api/v1/statuses/$walled"
|
||||
until_true 45 '[ "$(sm_sql "select count(*) from wall_posts where id=$sm_wall_post")" = "0" ]' \
|
||||
&& ok "alice takes it off her wall, and Smithereen deletes it" || ko "the post is still on Smithereen after alice took it off"
|
||||
[ "$(curl -s -o /dev/null -w "%{http_code}" -H "$PH" "$P/api/v1/statuses/$walled")" = "404" ] && ok "and it is gone here" || ko "it is still here"
|
||||
|
||||
echo " private messages"
|
||||
sm messages.send "to=$alice_on_sm" "body=a Smithereen message $run" >/dev/null
|
||||
until_true 45 'curl -s -H "$PH" "$P/api/v1/conversations" | grep -q "a Smithereen message $run"' && ok "smuser's message arrives as a DM" || ko "smuser's message never reached alice"
|
||||
|
||||
@@ -134,7 +134,8 @@
|
||||
"phase": "P3",
|
||||
"code": "smithereen 1.0.3 ActivityPubWorker.sendAddPostToWallActivity and sendActivityForPost: requireFeature(Server.Feature.WALL_POSTS), which ObjectLinkResolver.maybeUpdateServerFeaturesFromActor sets only for a server whose actors have sm:wall",
|
||||
"opened": "2026-10-05",
|
||||
"status": "open",
|
||||
"note": "Waits for the owner: a persona would publish a wall (sm:wall, FEP-400e), which also offers Smithereen's users to write on it, and PrivaPub would host their posts and announce them with Add{Note}."
|
||||
"status": "closed",
|
||||
"note": "Closed by the owner's decision of 2026-10-06: a persona's actor names its wall (sm:wall, FEP-400e), so Smithereen sends PrivaPub what is written on its users' walls (Add{Note}, shown to their followers here as on that wall), and its users may write on a persona's wall when they follow it. Checked live: Smithereen 1.0.3 scenario, 40 checks.",
|
||||
"closed": "2026-10-06"
|
||||
}
|
||||
]
|
||||
Reference in new issue
Block a user