From 0daea86092411969caa2fe2b195ab995edc584c5 Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Sun, 2 Oct 2022 15:28:03 +1100 Subject: Use imagor for image resizing --- src/api/util/utility/EmbedHandlers.ts | 18 +++++++++++++++--- src/cdn/routes/external.ts | 2 ++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/api/util/utility/EmbedHandlers.ts b/src/api/util/utility/EmbedHandlers.ts index a9cba383..db73dcdc 100644 --- a/src/api/util/utility/EmbedHandlers.ts +++ b/src/api/util/utility/EmbedHandlers.ts @@ -2,7 +2,7 @@ import { Config, Embed, EmbedType } from "@fosscord/util"; import fetch, { Response } from "node-fetch"; import * as cheerio from "cheerio"; import probe from "probe-image-size"; -import imageSize from "image-size"; +import crypto from "crypto"; export const DEFAULT_FETCH_OPTIONS: any = { redirect: "follow", @@ -18,16 +18,28 @@ export const DEFAULT_FETCH_OPTIONS: any = { export const getProxyUrl = (url: URL, width: number, height: number) => { const { endpointPublic, resizeWidthMax, resizeHeightMax } = Config.get().cdn; + const secret = Config.get().security.jwtSecret; // maybe shouldn't use this? width = Math.min(width || 500, resizeWidthMax || width); height = Math.min(height || 500, resizeHeightMax || width); - return `${endpointPublic}/external/resize/${encodeURIComponent(url.href)}?width=${width}&height=${height}`; + + let path = `${width}x${height}/${url.host}${url.pathname}` + + const hash = crypto.createHmac('sha1', secret) + .update(path) + .digest('base64') + .replace(/\+/g, '-').replace(/\//g, '_'); + + // TODO: make configurable + return `https://media.understars.dev/${hash}/${path}`; + + // return `${endpointPublic}/external/resize/${encodeURIComponent(url.href)}?width=${width}&height=${height}`; }; const getMeta = ($: cheerio.CheerioAPI, name: string): string | undefined => { let elem = $(`meta[property="${name}"]`); if (!elem.length) elem = $(`meta[name="${name}"]`); return elem.attr("content") || elem.text(); -} +}; export const getMetaDescriptions = (text: string) => { const $ = cheerio.load(text); diff --git a/src/cdn/routes/external.ts b/src/cdn/routes/external.ts index 33528a7b..32979a59 100644 --- a/src/cdn/routes/external.ts +++ b/src/cdn/routes/external.ts @@ -58,6 +58,8 @@ router.get("/:id", async (req: Request, res: Response) => { }); // this method is gross lol don't care +// It's also no longer actually used on Slowcord's official server. +// We actually use imagor now router.get("/resize/:url", async (req: Request, res: Response) => { const url = decodeURIComponent(req.params.url); const { width, height } = req.query; -- cgit 1.4.1