- Timestamp:
- 09/23/2026 10:56:31 AM (9 hours ago)
- Branches:
- main
- Children:
- 8a474ab
- Parents:
- 2165b6d
- git-author:
- Bart <bart@…> (09/23/2026 10:56:27 AM)
- git-committer:
- Bart <bart@…> (09/23/2026 10:56:31 AM)
- File:
-
- 1 edited
-
src/routes/activitypub.js (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/activitypub.js
r2165b6d rfa24f7b 973 973 fs.mkdirSync(AP_MEDIA_DIR, { recursive: true }); 974 974 const AP_MEDIA_EXT = new Set(['.jpg', '.jpeg', '.png', '.webp', '.gif', '.mp3', '.m4a', '.ogg', '.opus', '.flac', '.wav', '.mp4', '.webm', '.mov']); 975 976 // Wat een bijlage mag wegen, PER SOORT (Barts 600 MB, 22-9). 977 // 978 // Eén plafond voor alles kan hier niet meer. 32 MB was voor een foto en een 979 // spraakmemo royaal en voor bewegend beeld niets: een half uur 720p op een 980 // bitrate die op een scherm goed oogt (~1,5 Mbit/s) is ruim 350 MB, dus het 981 // plafond moet daar overheen. Datzelfde getal voor een JPEG laten gelden zou 982 // een half-gigabyte-foto toelaten, en dat is geen limiet meer. 983 // 984 // Multer kent de soort nog NIET als het zijn limiet zet -- fileFilter draait 985 // op de naam, niet op de inhoud -- dus daar staat het hoogste getal en de 986 // soort-controle volgt in de handler, zodra req.file.mimetype er is. 987 const MAX_VIDEO_BYTES = 600 * 1024 * 1024; 988 const MAX_AUDIO_BYTES = 64 * 1024 * 1024; 989 const MAX_PICTURE_BYTES = 16 * 1024 * 1024; 990 const maxBytesFor = (mime) => (mime.startsWith('video/') ? MAX_VIDEO_BYTES 991 : mime.startsWith('audio/') ? MAX_AUDIO_BYTES : MAX_PICTURE_BYTES); 992 975 993 const apMediaUpload = multer({ 976 994 storage: multer.diskStorage({ … … 978 996 filename: (req, file, cb) => cb(null, `${randomUUID()}${path.extname(file.originalname || '').toLowerCase()}`), 979 997 }), 980 limits: { fileSize: 32 * 1024 * 1024},998 limits: { fileSize: MAX_VIDEO_BYTES }, 981 999 fileFilter: (req, file, cb) => { 982 1000 const ext = path.extname(file.originalname || '').toLowerCase(); … … 989 1007 if (!auth || auth.site.slug !== req.params.slug) return res.status(403).end(); 990 1008 apMediaUpload.single('file')(req, res, (err) => { 991 if (err) return res.status(400).json({ error: err.message }); 1009 // Te groot is 413 en geen 400: een client die zijn eigen grens niet kent 1010 // moet aan de STATUS kunnen zien dat dit over de maat ging en niet over de 1011 // vorm, en `limit` geeft hem het getal in plaats van een gok. 1012 if (err) { 1013 if (err.code === 'LIMIT_FILE_SIZE') return res.status(413).json({ error: 'File too large', limit: MAX_VIDEO_BYTES }); 1014 return res.status(400).json({ error: err.message }); 1015 } 992 1016 if (!req.file) return res.status(400).json({ error: 'No file' }); 993 1017 const mime = String(req.file.mimetype || ''); … … 995 1019 try { fs.unlinkSync(req.file.path); } catch { /* best effort */ } 996 1020 return res.status(400).json({ error: 'Media must be an image, audio or video file' }); 1021 } 1022 // De soort-grens, nu de soort bekend is. Het bestand staat al op schijf -- 1023 // multer schrijft tijdens het ontvangen -- dus opruimen hoort erbij. 1024 const maxBytes = maxBytesFor(mime); 1025 if (req.file.size > maxBytes) { 1026 try { fs.unlinkSync(req.file.path); } catch { /* best effort */ } 1027 return res.status(413).json({ error: 'File too large', limit: maxBytes }); 997 1028 } 998 1029 // A video gets a poster frame next to it (shaer-zowq), best-effort and
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)