Changeset 6c4ff7e in Klonkt for src/routes
- Timestamp:
- 08/13/2026 11:39:57 PM (4 weeks ago)
- Branches:
- main
- Children:
- 9529d7b
- Parents:
- fbfd7a1
- Location:
- src/routes
- Files:
-
- 3 edited
-
activitypub.js (modified) (2 diffs)
-
admin-migrate.js (modified) (2 diffs)
-
audio.js (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/activitypub.js
rfbfd7a1 r6c4ff7e 1043 1043 }); 1044 1044 1045 /** 1046 * Mag deze aanvrager alles van `slug` zien? Waar bij de eigenaar zelf, en waar 1047 * voor de actor waar `slug` naartoe verhuisd is (FEP-1580, Source Instance). 1048 * 1049 * Eén plek voor die vraag, want hij komt op meerdere collecties terug en twee 1050 * antwoorden op dezelfde vraag lopen vroeg of laat uiteen. 1051 */ 1052 async function magAlles(req, slug) { 1053 const auth = OAuth.verifyBearer(req.headers.authorization); 1054 if (auth && auth.site.slug === slug) return true; 1055 if (!req.headers['signature']) return false; 1056 const v = await AP.verifyRequest(req).catch(() => null); 1057 return !!(v && v.id && AP.isMoveTarget(slug, v.id)); 1058 } 1059 1045 1060 // ── FEP-1580: de vertaaltabel van een verhuizing ────────────────── 1046 1061 // … … 1115 1130 // stap 3). Een playlist is een keuze hieruit; deze collectie is alles wat de 1116 1131 // artiest heeft opengezet, ook wat in geen enkele playlist staat. 1117 router.get('/ap/users/:slug/tracks', (req, res) => {1132 router.get('/ap/users/:slug/tracks', async (req, res) => { 1118 1133 const site = publicSite(req.params.slug); 1119 1134 if (!site) return res.status(404).end(); 1120 AP.sendAP(res, AP.buildTrackCollection(baseUrl(req), site, AP.siteOpenTracks(site.id )));1135 AP.sendAP(res, AP.buildTrackCollection(baseUrl(req), site, AP.siteOpenTracks(site.id, { alles: await magAlles(req, site.slug) }))); 1121 1136 }); 1122 1137 -
src/routes/admin-migrate.js
rfbfd7a1 r6c4ff7e 29 29 import { requireGod } from '../middleware/auth.js'; 30 30 import ActivityPubService from '../services/ActivityPubService.js'; 31 import { safeFetch, signedGetJson, noteId, noteVisibility } from '../services/ActivityPubService.js';31 import { safeFetch, signedGetJson, signedGetHeaders, noteId, noteVisibility } from '../services/ActivityPubService.js'; 32 32 import HtmlSanitizerService from '../services/HtmlSanitizerService.js'; 33 import { MEDIA_ROOT } from '../config/paths.js';33 import { MEDIA_ROOT, AUDIO_ROOT } from '../config/paths.js'; 34 34 import * as Migration from '../services/MigrationService.js'; 35 35 import { buildArchive, zipArchive } from '../services/ArchiveExportService.js'; … … 111 111 sourceUri: opgegeven || null, 112 112 deps: { 113 getJson: signedGetJson, safeFetch, mediaRoot: MEDIA_ROOT, fs, path, noteId, noteVisibility,113 getJson: signedGetJson, safeFetch, mediaRoot: MEDIA_ROOT, audioRoot: AUDIO_ROOT, fs, path, noteId, noteVisibility, signHeaders: signedGetHeaders, 114 114 sanitize: (h) => HtmlSanitizerService.sanitize(h || ''), 115 115 }, -
src/routes/audio.js
rfbfd7a1 r6c4ff7e 30 30 import db from '../config/database.js'; 31 31 import { recordPlay } from '../services/StatsService.js'; 32 import AP from '../services/ActivityPubService.js'; 32 33 33 34 const __dirname = path.dirname(fileURLToPath(import.meta.url)); … … 71 72 } 72 73 73 router.get('/stream/:filename', (req, res) => { 74 /** 75 * FEP-1580: de instantie waar dit account naartoe verhuisd is mag ALLE audio 76 * ophalen, ook wat niet fedi_open is. 77 * 78 * Zonder deze tak ziet de nieuwe Klonkt de tracklijst wel en krijgt hij de 79 * bestanden niet, en dan verhuis je een bibliotheek met alleen titels. Dat is 80 * precies de halve waarheid die deze hele ronde moest opruimen. 81 * 82 * Smal gehouden: een geldige handtekening, van precies de actor in moved_to, en 83 * alleen voor een bestand dat van DIE site is. moved_to komt er alleen te staan 84 * als de doel-actor ons in alsoKnownAs had, dus er heeft iemand met beheer aan 85 * beide kanten ja gezegd. 86 */ 87 async function isMoveTargetAudio(req, filename) { 88 if (!req.headers['signature'] || !filename) return false; 89 let rij; 90 try { 91 rij = db.prepare(`SELECT s.slug FROM audio_tracks t 92 JOIN media m ON t.media_id = m.id 93 JOIN sites s ON s.id = t.site_id 94 WHERE m.storage_path = ? OR m.storage_path LIKE ? LIMIT 1`) 95 .get(filename, `%${filename}`); 96 } catch { return false; } 97 if (!rij || !rij.slug) return false; 98 const v = await AP.verifyRequest(req).catch(() => null); 99 return !!(v && v.id && AP.isMoveTarget(rij.slug, v.id)); 100 } 101 102 router.get('/stream/:filename', async (req, res) => { 74 103 const { filename } = req.params; 75 104 76 if (!isAllowedAudioRequest(req, filename) ) {105 if (!isAllowedAudioRequest(req, filename) && !(await isMoveTargetAudio(req, filename))) { 77 106 return res.status(403).send('Direct access not allowed'); 78 107 }
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)