Commit af1c8fd5 authored by Grant's avatar Grant
Browse files

implement authorized media fetch for avatars

parent 4e699046
Loading
Loading
Loading
Loading
Loading
+13 −14
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
        "eventemitter3": "^5.0.1",
        "express": "^4.21.2",
        "morgan": "^1.10.0",
        "signed": "^2.1.0",
        "turndown": "^7.2.0"
      },
      "devDependencies": {
@@ -1549,7 +1550,6 @@
      "version": "1.19.5",
      "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
      "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
      "dev": true,
      "dependencies": {
        "@types/connect": "*",
        "@types/node": "*"
@@ -1559,7 +1559,6 @@
      "version": "3.4.38",
      "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
      "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
      "dev": true,
      "dependencies": {
        "@types/node": "*"
      }
@@ -1574,7 +1573,6 @@
      "version": "5.0.0",
      "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz",
      "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==",
      "dev": true,
      "dependencies": {
        "@types/body-parser": "*",
        "@types/express-serve-static-core": "^5.0.0",
@@ -1586,7 +1584,6 @@
      "version": "5.0.2",
      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz",
      "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==",
      "dev": true,
      "dependencies": {
        "@types/node": "*",
        "@types/qs": "*",
@@ -1597,8 +1594,7 @@
    "node_modules/@types/http-errors": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
      "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
      "dev": true
      "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA=="
    },
    "node_modules/@types/json-schema": {
      "version": "7.0.15",
@@ -1609,8 +1605,7 @@
    "node_modules/@types/mime": {
      "version": "1.3.5",
      "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
      "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
      "dev": true
      "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="
    },
    "node_modules/@types/morgan": {
      "version": "1.9.9",
@@ -1658,20 +1653,17 @@
    "node_modules/@types/qs": {
      "version": "6.9.17",
      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz",
      "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==",
      "dev": true
      "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ=="
    },
    "node_modules/@types/range-parser": {
      "version": "1.2.7",
      "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
      "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
      "dev": true
      "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="
    },
    "node_modules/@types/send": {
      "version": "0.17.4",
      "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
      "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
      "dev": true,
      "dependencies": {
        "@types/mime": "^1",
        "@types/node": "*"
@@ -1681,7 +1673,6 @@
      "version": "1.15.7",
      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
      "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
      "dev": true,
      "dependencies": {
        "@types/http-errors": "*",
        "@types/node": "*",
@@ -3937,6 +3928,14 @@
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/signed": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/signed/-/signed-2.1.0.tgz",
      "integrity": "sha512-QEw2xsFVbR+4xy+7OeUpMCHlJdR+UDikzJuDrrHXtTgcVvXDWDgbcbvgZV13aVkHVyosuuZPAUQtxgTthb0vRA==",
      "dependencies": {
        "@types/express": "^4.17.2"
      }
    },
    "node_modules/statuses": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+4 −0
Original line number Diff line number Diff line
@@ -35,6 +35,10 @@
    "eventemitter3": "^5.0.1",
    "express": "^4.21.2",
    "morgan": "^1.10.0",
    "signed": "^2.1.0",
    "turndown": "^7.2.0"
  },
  "overrides": {
    "@types/express": "^5.0.0"
  }
}
+2 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import {
  Typing,
  User,
  Webhook,
  WebhookMessageCreateOptions,
  WebhookType,
  parseEmoji,
} from "discord.js";
@@ -1286,7 +1287,7 @@ class Discord_ {
        roles: [],
      } as const,
      embeds: [] as APIEmbed[],
    };
    } satisfies WebhookMessageCreateOptions;

    let messageId: string | undefined;

+10 −6
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ import {
} from "../types/matrix";
import { FriendlyError } from "./utils";
import { Secrets } from "./secrets";
import { Signed } from "./signed";

/**
 * Homeserver friendly name (not direct access)
@@ -497,16 +498,17 @@ export class Matrix {
   * @param mxc
   * @returns
   */
  static getMediaURL(mxc?: MXC, use: "internal" | "external" = "external") {
  static getMediaURL(mxc?: MXC) {
    if (!mxc) return undefined;

    return mxc.replace(
      "mxc://",
      `${this.getHomeserver(use)}/_matrix/media/v3/download/`
    );
    const encoded = Buffer.from(mxc).toString("base64url");

    return Signed.sign(`https://${process.env.HOST}/mxc/${encoded}`);
  }

  static async loadMediaURL(mxc: MXC) {
  static async loadMediaURL(mxc: MXC): Promise<ArrayBuffer>;
  static async loadMediaURL(mxc: MXC, raw: true): Promise<Response>;
  static async loadMediaURL(mxc: MXC, raw?: boolean) {
    const request = await Matrix.rawFetch(
      `/_matrix/client/v1/media/download/${mxc.replace("mxc://", "")}`
    );
@@ -514,6 +516,8 @@ export class Matrix {
    if (request.status > 399)
      throw new Error("Unknown status: " + request.status);

    if (raw) return request;

    return request.arrayBuffer();
  }

+7 −1
Original line number Diff line number Diff line
import fs from "node:fs";

type SecretName = "MATRIX_AS_TOKEN" | "MATRIX_HS_TOKEN" | "DISCORD_TOKEN";
type SecretName =
  | "MATRIX_AS_TOKEN"
  | "MATRIX_HS_TOKEN"
  | "DISCORD_TOKEN"
  | "SIGNED_SECRET";

export class Secrets {
  private static instance: Secrets;
@@ -8,6 +12,7 @@ export class Secrets {
    MATRIX_AS_TOKEN: "",
    MATRIX_HS_TOKEN: "",
    DISCORD_TOKEN: "",
    SIGNED_SECRET: "",
  };

  constructor() {
@@ -15,6 +20,7 @@ export class Secrets {
    this.load("DISCORD_TOKEN");
    this.load("MATRIX_AS_TOKEN");
    this.load("MATRIX_HS_TOKEN");
    this.load("SIGNED_SECRET");
  }

  private load(secret: SecretName) {
Loading