fix(api): 🐛 Fetch media content-type from data, instead of doing naive guesses

This commit is contained in:
Jesse Wierzbinski 2024-12-16 23:57:21 +01:00
parent 6f67881d96
commit 4fdb96930f
No known key found for this signature in database
8 changed files with 111 additions and 23 deletions

View file

@ -1,4 +1,5 @@
import { apiRoute, applyConfig, auth, jsonOrForm } from "@/api";
import { mimeLookup } from "@/content_types";
import { mergeAndDeduplicate } from "@/lib";
import { sanitizedHtmlStrip } from "@/sanitization";
import { createRoute } from "@hono/zod-openapi";
@ -267,21 +268,37 @@ export default apiRoute((app) =>
if (avatar) {
if (avatar instanceof File) {
const { path } = await mediaManager.addFile(avatar);
const { path, uploadedFile } =
await mediaManager.addFile(avatar);
const contentType = uploadedFile.type;
self.avatar = Attachment.getUrl(path);
self.source.avatar = {
content_type: contentType,
};
} else {
self.avatar = avatar;
self.source.avatar = {
content_type: await mimeLookup(avatar),
};
}
}
if (header) {
if (header instanceof File) {
const { path } = await mediaManager.addFile(header);
const { path, uploadedFile } =
await mediaManager.addFile(header);
const contentType = uploadedFile.type;
self.header = Attachment.getUrl(path);
self.source.header = {
content_type: contentType,
};
} else {
self.header = header;
self.source.header = {
content_type: await mimeLookup(header),
};
}
}

View file

@ -61,8 +61,12 @@ export default apiRoute((app) =>
name: "Versia Server",
version: pkg.version,
},
banner: urlToContentFormat(config.instance.banner),
logo: urlToContentFormat(config.instance.logo),
banner: config.instance.banner
? urlToContentFormat(config.instance.banner)
: undefined,
logo: config.instance.logo
? urlToContentFormat(config.instance.logo)
: undefined,
shared_inbox: new URL(
"/inbox",
config.http.base_url,

View file

@ -6,7 +6,6 @@ import { WebFinger } from "@versia/federation/schemas";
import { User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables";
import { and, eq, isNull } from "drizzle-orm";
import { lookup } from "mime-types";
import { z } from "zod";
import { config } from "~/packages/config-manager";
import { ErrorSchema } from "~/types/api";
@ -137,9 +136,8 @@ export default apiRoute((app) =>
},
{
rel: "avatar",
// TODO: don't... don't use the mime type from the file extension
type:
lookup(user.getAvatarUrl(config)) ||
user.data.source.avatar?.content_type ||
"application/octet-stream",
href: user.getAvatarUrl(config),
},