diff --git a/public/assets/images/media/logo-1783091166418-npn577.gif b/public/assets/images/media/logo-1783091166418-npn577.gif new file mode 100644 index 00000000..d995749f Binary files /dev/null and b/public/assets/images/media/logo-1783091166418-npn577.gif differ diff --git a/src/actions/save-logo.ts b/src/actions/save-logo.ts index 83017393..76863102 100644 --- a/src/actions/save-logo.ts +++ b/src/actions/save-logo.ts @@ -1,12 +1,12 @@ "use server"; import { revalidatePath } from "next/cache"; -import { writeFile } from "fs/promises"; +import { mkdir, writeFile } from "fs/promises"; import path from "path"; import { prisma } from "@/lib/prisma"; import { siteSettings } from "@/lib/services/site-settings"; -const MEDIA_DIR = "public/assets/images/media"; +const MEDIA_DIR = "public/assets/images/media/logo"; export async function saveLogo(formData: FormData): Promise<{ success: boolean; url?: string; error?: string }> { try { @@ -20,9 +20,10 @@ export async function saveLogo(formData: FormData): Promise<{ success: boolean; const filePath = path.join(dir, filename); const buffer = Buffer.from(await file.arrayBuffer()); + await mkdir(dir, { recursive: true }); await writeFile(filePath, buffer); - const url = `/api/media/${filename}`; + const url = `/api/media/logo/${filename}`; await prisma.websiteSetting.upsert({ where: { key: "cms_logo" }, @@ -53,9 +54,10 @@ export async function saveLogoFromUrl(gifUrl: string): Promise<{ success: boolea const dir = path.join(process.cwd(), MEDIA_DIR); const filePath = path.join(dir, filename); + await mkdir(dir, { recursive: true }); await writeFile(filePath, buffer); - const url = `/api/media/${filename}`; + const url = `/api/media/logo/${filename}`; await prisma.websiteSetting.upsert({ where: { key: "cms_logo" }, diff --git a/src/app/api/media/[name]/route.ts b/src/app/api/media/[...path]/route.ts similarity index 86% rename from src/app/api/media/[name]/route.ts rename to src/app/api/media/[...path]/route.ts index 29a592c9..4fba7460 100644 --- a/src/app/api/media/[name]/route.ts +++ b/src/app/api/media/[...path]/route.ts @@ -10,11 +10,12 @@ const ALLOWED_EXT = [".png", ".jpg", ".jpeg", ".gif", ".webp", ".svg", ".bmp"]; export async function GET( _request: Request, - { params }: { params: Promise<{ name: string }> }, + { params }: { params: Promise<{ path: string[] }> }, ) { - const { name } = await params; + const { path: segments } = await params; + const name = segments.join("/"); // Prevent path traversal - if (name.includes("..") || name.includes("/") || name.includes("\\")) { + if (name.includes("..") || name.includes("\\")) { return new NextResponse("Forbidden", { status: 403 }); } const ext = path.extname(name).toLowerCase(); diff --git a/src/components/top-header.tsx b/src/components/top-header.tsx index 52746cb5..1f16abdd 100644 --- a/src/components/top-header.tsx +++ b/src/components/top-header.tsx @@ -76,10 +76,13 @@ export async function TopHeader() { Commandocentrum - - Logs - - + + Logs + + + Logo generator + + ) : null}