Ignore:
Timestamp:
08/08/2026 04:09:04 AM (5 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
0517013
Parents:
3b43e4c
git-author:
Robin <roboburr@…> (08/08/2026 04:08:53 AM)
git-committer:
Robin <roboburr@…> (08/08/2026 04:09:04 AM)
Message:

Een Accept die ons follow-id niet teruggeeft, telt nu ook

Gevonden tegen Funkwhale (audio.pepemoss.com, 7 augustus). Wij stuurden een
Follow met id

.../ap/users/dev#follow-1786161977286-bb2de32f

en de Accept kwam terug met een door Funkwhale ZELF verzonnen id, in onze
eigen namespace:

.../ap/users/dev#follows/19fd8b00-8f66-4362-b233-542eadfa40fc

De update matchte op follow_id en raakte dus niets. De rij bleef eeuwig op
'pending' en er kwam nooit iets binnen -- terwijl de logregel doodleuk
'follow accepted' riep. Een stille no-op, en precies daarom viel het pas op
toen de muziek uitbleef.

Twee dingen veranderd:

TERUGVAL raakt het follow-id niets, dan telt het paar dat we wel zeker

weten: (deze site, deze actor), en alleen als die rij nog op
pending staat. De Accept is handtekening-geverifieerd en
actorUri is de ondertekenaar, dus dit kan niets anders openzetten
dan een follow die wij zelf verstuurd hebben.

EERLIJK de logregel zegt nu 'accept UNMATCHED' als er niets geraakt is,
LOGGEN met het ontvangen id erbij. Zonder dat was dit onvindbaar.

5 tests, waaronder de Funkwhale-vorm en twee die bewaken dat een vreemde
Accept niet andermans rij kan openzetten.

Co-Authored-By: Claude Opus 5 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    r3b43e4c r06bae1e  
    25062506  if (type === 'Accept' && act.object) {
    25072507    const fid = typeof act.object === 'string' ? act.object : (act.object && act.object.id);
    2508     if (fid) { try { fwStmts().acc.run(fid); } catch { /* ignore */ } }
    2509     console.log('[AP] follow accepted', actorUri);
     2508    let raak = 0;
     2509    if (fid) { try { raak = fwStmts().acc.run(fid).changes; } catch { /* ignore */ } }
     2510    // TERUGVAL, en die is nodig gebleken tegen Funkwhale. Een Accept hoort de
     2511    // Follow terug te geven die hij beantwoordt, maar Funkwhale verzint er een
     2512    // EIGEN id voor, in ONZE namespace:
     2513    //
     2514    //   wij stuurden   .../ap/users/dev#follow-1786161977286-bb2de32f
     2515    //   Funkwhale zegt .../ap/users/dev#follows/19fd8b00-8f66-...
     2516    //
     2517    // Matchen op follow_id raakt dan niets, en de volgrelatie bleef eeuwig op
     2518    // 'pending' staan terwijl de logregel 'accepted' riep -- een stille no-op
     2519    // die pas opviel toen er nooit iets binnenkwam.
     2520    //
     2521    // Het paar dat we WEL zeker weten is (deze site, deze actor): de Accept is
     2522    // handtekening-geverifieerd, en actorUri is de ondertekenaar. Alleen een
     2523    // rij die nog op pending staat wordt geraakt, dus dit kan niets anders
     2524    // openzetten dan een follow die wij zelf hebben verstuurd.
     2525    if (!raak && slugParam && actorUri) {
     2526      try { raak = fwStmts().accByActor.run(slugParam, actorUri).changes; } catch { /* ignore */ }
     2527    }
     2528    // Eerlijk loggen: zonder treffer is er niets geaccepteerd, en dat hoort te
     2529    // zien te zijn in plaats van als succes voorbij te komen.
     2530    console.log('[AP] follow', raak ? 'accepted' : 'accept UNMATCHED', actorUri, fid ? '(' + fid + ')' : '');
    25102531    // The moment a friendship exists is the moment the history comes along
    25112532    // (Robins besluit, 30-7): delivery cannot reach into the past, so the
     
    37253746}
    37263747
    3727 let _insFw, _delFw, _listFw, _accFw, _oneFw, _setAB;
     3748let _insFw, _delFw, _listFw, _accFw, _accFwByActor, _oneFw, _setAB;
    37283749function fwStmts() {
    37293750  if (!_insFw) {
     
    37323753    _listFw = db.prepare('SELECT * FROM ap_following WHERE slug = ? ORDER BY created_at DESC');
    37333754    _accFw = db.prepare("UPDATE ap_following SET status = 'accepted' WHERE follow_id = ?");
     3755    // Terugval als de Accept ons follow-id niet teruggeeft (zie de Accept-tak
     3756    // in handleInbox): dan is het paar dat we WEL zeker weten (deze site, deze
     3757    // actor) genoeg, mits de rij nog op pending staat.
     3758    _accFwByActor = db.prepare("UPDATE ap_following SET status = 'accepted' WHERE slug = ? AND actor_uri = ? AND status = 'pending'");
    37343759    _oneFw = db.prepare('SELECT * FROM ap_following WHERE slug = ? AND actor_uri = ?');
    37353760    _setAB = db.prepare('UPDATE ap_following SET auto_boost = ? WHERE slug = ? AND actor_uri = ?');
    37363761  }
    3737   return { ins: _insFw, del: _delFw, list: _listFw, acc: _accFw, one: _oneFw, setAB: _setAB };
     3762  return { ins: _insFw, del: _delFw, list: _listFw, acc: _accFw, accByActor: _accFwByActor, one: _oneFw, setAB: _setAB };
    37383763}
    37393764export function listFollowing(slug) { return fwStmts().list.all(slug); }
Note: See TracChangeset for help on using the changeset viewer.