diff --git a/packages/backend/src/server/api/mastodon/endpoints/account.ts b/packages/backend/src/server/api/mastodon/endpoints/account.ts index 21bb4a6fbb..b479d5a48d 100644 --- a/packages/backend/src/server/api/mastodon/endpoints/account.ts +++ b/packages/backend/src/server/api/mastodon/endpoints/account.ts @@ -3,7 +3,7 @@ import { resolveUser } from "@/remote/resolve-user.js"; import Router from "@koa/router"; import { FindOptionsWhere, IsNull } from "typeorm"; import { getClient } from "../ApiMastodonCompatibleService.js"; -import { argsToBools, limitToInt } from "./timeline.js"; +import { limitToInt } from "./timeline.js"; const relationshopModel = { id: "", @@ -118,7 +118,7 @@ export function apiAccountMastodon(router: Router): void { try { const data = await client.getAccountStatuses( ctx.params.id, - argsToBools(limitToInt(ctx.query as any)), + limitToInt(ctx.query as any), ); ctx.body = data.data; } catch (e: any) { diff --git a/packages/backend/src/server/api/mastodon/endpoints/timeline.ts b/packages/backend/src/server/api/mastodon/endpoints/timeline.ts index 04a15e65df..f90c275445 100644 --- a/packages/backend/src/server/api/mastodon/endpoints/timeline.ts +++ b/packages/backend/src/server/api/mastodon/endpoints/timeline.ts @@ -12,15 +12,6 @@ export function limitToInt(q: ParsedUrlQuery) { return q; } -export function argsToBools(q: ParsedUrlQuery) { - let object: any = q; - if (q.only_media) - if (typeof q.only_media === "string") object.only_media = q.only_media.toLowerCase() === "true"; - if (q.exclude_replies) - if (typeof q.exclude_replies === "string") object.exclude_replies = q.exclude_replies.toLowerCase() === "true"; - return q; -} - export function toTextWithReaction(status: Entity.Status[], host: string) { return status.map((t) => { if (!t) return statusModel(null, null, [], "no content"); diff --git a/packages/backend/src/server/index.ts b/packages/backend/src/server/index.ts index 73cf58ec27..aef0d100ff 100644 --- a/packages/backend/src/server/index.ts +++ b/packages/backend/src/server/index.ts @@ -30,9 +30,59 @@ import proxyServer from "./proxy/index.js"; import webServer from "./web/index.js"; import { initializeStreamingServer } from "./api/streaming.js"; import { koaBody } from "koa-body"; +import { ParsedUrlQuery } from "node:querystring"; export const serverLogger = new Logger("server", "gray", false); +const stringToBoolean = (stringValue: string) => { + switch(stringValue?.toLowerCase()?.trim()){ + case "true": + case "yes": + case "1": + return true; + + case "false": + case "no": + case "0": + case null: + case undefined: + return false; + + default: + return JSON.parse(stringValue); + } +} + +const objectParser = (object: Object): Object => { + const newObject: any = {}; + + for (const key in object) { + const value = object[key]; + + if (typeof value === "object") { + newObject[key] = objectParser(value); + } else if (typeof value === "string") { + newObject[key] = stringToBoolean(value); + } + } + + return newObject; +}; + +const queryParser = (object: ParsedUrlQuery): ParsedUrlQuery => { + const newObject = object; + + for (const key in object) { + const value = object[key]; + + if (typeof value === "string") { + newObject[key] = stringToBoolean(value); + } + } + + return newObject; +}; + // Init app const app = new Koa(); app.proxy = true; @@ -80,6 +130,7 @@ mastoRouter.use( mastoRouter.use(async (ctx, next) => { if (ctx.request.query) { + ctx.request.query = queryParser(ctx.request.query) if (!ctx.request.body || Object.keys(ctx.request.body).length === 0) { ctx.request.body = ctx.request.query } else {