Changeset 74c5abc in Klonkt for src/middleware/render.js


Ignore:
Timestamp:
06/28/2026 04:46:38 PM (2 months ago)
Author:
Robin Genis <roboburr@…>
Branches:
main
Children:
99989f9
Parents:
f79a471
Message:

feat(images): downscale remote (fediverse) avatars via a signed proxy

Remote avatars live on other servers, so the browser shrank full-res line-art to ~44px
(jagged). Fetch them once (SSRF-safe via safeFetch), downscale identically (lanczos -> WebP),
cache, serve. HMAC-signed proxy URLs → not an open resizer.

  • services/ActivityPubService.js — export safeFetch
  • services/ThumbnailService.js — getRemoteThumbnail + signed imgProxyUrl/verifyImg; +128px size
  • server.js — GET /img/a/:w signed proxy route
  • middleware/render.js — avatar(url,w) helper (local thumb / remote proxy)
  • views: news.ejs, fedi-node.ejs, following.ejs avatars -> avatar()
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/middleware/render.js

    rf79a471 r74c5abc  
    2020import { isPremium as isPremiumInstance, premiumEnabled, premiumUnlocked } from '../services/PatreonService.js';
    2121import ActivityPubService from '../services/ActivityPubService.js';
     22import { imgProxyUrl } from '../services/ThumbnailService.js';
    2223import { audioEnabled as audioFeatureEnabled } from '../config/features.js';
    2324
     
    165166      ? `/media/thumb/${w || 480}/${url.slice(7)}`
    166167      : url,
     168    // Crisp avatars: a local /media avatar goes through the local thumb route; a REMOTE
     169    // (fediverse) avatar through the signed downscaling proxy. Same downscale, the remote
     170    // one is just fetched first. Default 128px (covers feed 44px → profile ~120px).
     171    avatar: (url, w) => {
     172      if (!url || typeof url !== 'string') return url;
     173      if (url.startsWith('/media/') && !url.startsWith('/media/thumb/')) return `/media/thumb/${w || 128}/${url.slice(7)}`;
     174      if (/^https?:\/\//i.test(url)) return imgProxyUrl(url, w || 128);
     175      return url;
     176    },
    167177    pageTitle: data.pageTitle || (data.site && data.site.title) || 'Klonkt',
    168178    appVersion: APP_VERSION,
Note: See TracChangeset for help on using the changeset viewer.