Changeset 4766720 in Klonkt for src/services/ActivityPubService.js
- Timestamp:
- 08/13/2026 08:50:19 PM (4 weeks ago)
- Branches:
- main
- Children:
- 34a0053
- Parents:
- 44dfbd2
- File:
-
- 1 edited
-
src/services/ActivityPubService.js (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/services/ActivityPubService.js
r44dfbd2 r4766720 431 431 // and publishers should stop delivering here. 432 432 if (site.moved_to && /^https?:\/\//i.test(String(site.moved_to))) actor.movedTo = String(site.moved_to); 433 // Zie movedLock() verderop: het serveren van movedTo is de ENE helft, het 434 // stilzetten van de uitgaande kant de andere. 433 435 // De MusicBrainz-koppeling van de artiest (shaer-mbz). Alleen als hij ZELF 434 436 // gekozen heeft -- er staat niets als er niets gekoppeld is, want een lege … … 2816 2818 } 2817 2819 2820 // ── Op slot na een verhuizing (FEP-7628) ────────────────────────── 2821 // 2822 // Een verhuisd account serveert `movedTo` en is daarmee dood verklaard. Toch kon 2823 // je er gewoon op posten, volgen, liken en reageren, en dat federeerde vrolijk 2824 // de wereld in. Drie dingen gaan daar mis: 2825 // 2826 // - Nieuwe posts krijgen een object-URI op een adres dat je hebt opgezegd. Die 2827 // URI's overleven het domein niet, en de reacties erop ook niet. 2828 // - Je volgers zijn al verhuisd, dus je post in het niets terwijl het lijkt of 2829 // je post. 2830 // - Een server die je movedTo ziet EN tegelijk verse activiteit van dat adres 2831 // krijgt, krijgt tegenstrijdige signalen over de verhuizing. 2832 // 2833 // Daarom staat de poort op de UITGAANDE kant en niet op de knoppen: een 2834 // C2S-client (Shaer) praat rechtstreeks met deze functies en zou anders zo langs 2835 // een verborgen knop lopen. De UI volgt de poort, niet andersom. 2836 // 2837 // WAT DICHT GAAT: posten, reageren, volgen, liken, boosten, stemmen, en een 2838 // tweede verhuizing. 2839 // WAT OPEN BLIJFT: alles wat de wegwijzer draagt (de actor, webfinger, je 2840 // bestaande posts, de outbox), alles inkomend (reacties op oude posts blijven 2841 // binnenkomen en leesbaar), je eigen beheer (archief exporteren, volglijst 2842 // downloaden), en ontvolgen -- opruimen mag altijd. 2843 // Rapporteren blijft OOK open: dat is een veiligheidsklep, geen inhoud maken. 2844 // 2845 // OMKEERBAAR: `moved_to` leegmaken heft het slot op. Een verhuizing kan mislukken 2846 // en dan moet je terug kunnen. 2847 export function movedLock(site) { 2848 const to = site && site.moved_to && /^https?:\/\//i.test(String(site.moved_to)) 2849 ? String(site.moved_to) : null; 2850 return to ? { locked: true, movedTo: to } : { locked: false, movedTo: null }; 2851 } 2852 2853 /** Weigering in de vorm die de aanroepers al kennen: een object met `error`. */ 2854 function movedRefusal(site, wat) { 2855 const l = movedLock(site); 2856 if (!l.locked) return null; 2857 console.warn('[AP] geweigerd, dit account is verhuisd:', wat, '→', l.movedTo); 2858 return { error: 'moved', movedTo: l.movedTo }; 2859 } 2860 2818 2861 // Deliver a new post as Create(Note) to all followers' inboxes (fire-and-forget). 2819 2862 // Needs PUBLIC_BASE_URL (absolute URLs); no-op without followers or base. 2820 2863 export async function deliverCreate(site, post) { 2864 if (movedLock(site).locked) { console.warn('[AP] Create niet bezorgd, account verhuisd:', site && site.slug); return; } 2821 2865 const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, ''); 2822 2866 if (!base || !site || !site.slug) return; … … 3592 3636 3593 3637 export async function deliverReply(site, { postId, postSlug, parent, text, html, language, attachments, mentions, visibility }) { 3638 const _mv = movedRefusal(site, 'reply'); if (_mv) return _mv; 3594 3639 const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, ''); 3595 3640 // Rich replies: `html` is the reply editor's HTML (sanitized here); `text` is … … 4945 4990 export function setReaction(slug, uri, kind, on, opts = {}) { 4946 4991 if (!slug || !uri || (kind !== 'like' && kind !== 'boost')) return; 4992 // Ook hier, en niet alleen bij sendInteraction. Deze functie schrijft ALLEEN de 4993 // lokale vlag; het versturen gebeurt elders. Zonder deze poort zou je op een 4994 // verhuisd account een like zien staan die nooit de deur uit is gegaan, en dat 4995 // is de halve toestand die erger is dan een duidelijke weigering. 4996 try { 4997 const s = db.prepare('SELECT moved_to FROM sites WHERE slug = ?').get(slug); 4998 if (movedLock(s).locked) { console.warn('[AP] reactie geweigerd, account verhuisd:', slug, kind); return; } 4999 } catch { /* geen sites-tabel = geen verhuizing */ } 4947 5000 // EEN sleutel voor beide bronnen. opts.flagUri is de opgeloste object-URI van 4948 5001 // de aanroeper (het C2S-pad kent die uit resolveRemoteNote en dat is … … 5627 5680 // Follow a fediverse account by @handle (WebFinger → actor → signed Follow). 5628 5681 export async function followActor(site, handle, autoBoost = false, { approved = false } = {}) { 5682 const _mv = movedRefusal(site, 'follow'); if (_mv) return _mv; 5629 5683 const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, ''); 5630 5684 if (!base || !site || !site.slug) return { error: 'config' }; … … 5846 5900 */ 5847 5901 export async function moveAccount(site, targetRaw, { fetchActorFn = null, deliverFn = null } = {}) { 5902 // Al verhuisd? Dan eerst het slot eraf (moved_to leegmaken). Anders stapel je 5903 // wegwijzers op elkaar en weet niemand meer waar de keten eindigt. 5848 5904 const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, ''); 5849 5905 if (!base || !site || !site.slug) return { error: 'config' }; 5906 if (movedLock(site).locked) return { error: 'already_moved', movedTo: movedLock(site).movedTo }; 5850 5907 try { 5851 5908 // Was een harde weigering voor elk bewaakt account (shaer-tge); sinds 8-8 … … 6164 6221 // Send a Like or Announce (boost) on a remote note FROM this site. 6165 6222 export async function sendInteraction(site, kind, targetNoteId, authorUri) { 6223 const _mv = movedRefusal(site, `interaction:${kind}`); if (_mv) return _mv; 6166 6224 const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, ''); 6167 6225 if (!base || !site || !site.slug || !targetNoteId) return { error: 'config' }; … … 6347 6405 // by URL, not just ones from accounts you follow (which go through voteOnPoll via /news). 6348 6406 export async function voteOnRemotePoll(site, questionUrl, choices) { 6407 const _mv = movedRefusal(site, 'poll-vote'); if (_mv) return _mv; 6349 6408 const base = (process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, ''); 6350 6409 if (!base || !site || !site.slug || !/^https?:\/\//i.test(String(questionUrl || ''))) return { error: 'config' };
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)