From 63c65e8b7d4d9983e3b21ccb70c645a1eb62ae13 Mon Sep 17 00:00:00 2001 From: eternal-flame-AD Date: Wed, 24 Jul 2024 12:26:40 -0500 Subject: [PATCH] fs robustness patch Signed-off-by: eternal-flame-AD --- src/lib/server/database/loadData.ts | 3 +- src/lib/server/dirHash.ts | 4 +- src/routes/api/database/song/[id]/+server.ts | 39 +++++++++++-------- src/routes/database/edit/[id]/+page.server.ts | 13 ++----- 4 files changed, 31 insertions(+), 28 deletions(-) diff --git a/src/lib/server/database/loadData.ts b/src/lib/server/database/loadData.ts index ad1848a..4aa66ae 100644 --- a/src/lib/server/database/loadData.ts +++ b/src/lib/server/database/loadData.ts @@ -1,4 +1,5 @@ import fs from 'fs'; +import path from 'path'; import { globalMemoryStorage, songData, songNameCache } from '$lib/server/cache.js'; import { getDirectoryHash } from '../dirHash'; @@ -25,7 +26,7 @@ export async function loadData() { songNameCache.flushAll(); for (const songID of songList) { try { - const fileContentString = fs.readFileSync(dataPath + songID + '.json').toString(); + const fileContentString = fs.readFileSync(path.join(dataPath, songID + '.json')).toString(); const data = JSON.parse(fileContentString); songData.set(songID, data); const metadata: MusicMetadata = data; diff --git a/src/lib/server/dirHash.ts b/src/lib/server/dirHash.ts index 856ca5c..19ef295 100644 --- a/src/lib/server/dirHash.ts +++ b/src/lib/server/dirHash.ts @@ -12,7 +12,7 @@ export function getDirectoryHash(dir: string): string { files.forEach(file => { const filePath = path.join(currentDir, file); - const stats = fs.statSync(filePath); + const stats = fs.lstatSync(filePath); if (stats.isDirectory()) { traverseDirectory(filePath); @@ -30,7 +30,7 @@ export function getDirectoryHash(dir: string): string { // Create hash from file details const hash = crypto.createHash('sha256'); - hash.update(fileDetails.join('|')); + hash.update(fileDetails.join('\x00')); return hash.digest('hex'); } \ No newline at end of file diff --git a/src/routes/api/database/song/[id]/+server.ts b/src/routes/api/database/song/[id]/+server.ts index f8889c0..ebc8bde 100644 --- a/src/routes/api/database/song/[id]/+server.ts +++ b/src/routes/api/database/song/[id]/+server.ts @@ -1,30 +1,37 @@ import { getCurrentFormattedDateTime } from '$lib/songUpdateTime'; import { json, error } from '@sveltejs/kit'; import fs from 'fs'; +import path from 'path'; export async function GET({ params }) { - const filePath = `./data/song/${params.id}.json`; - if (!fs.existsSync(filePath)) { + const filePath = path.join('./data/song', `${params.id}.json`); + let data; + try { data = fs.readFileSync(filePath); } catch (e) { return error(404, { message: "No correspoding song." - }) + }); } - const data = fs.readFileSync(filePath); - return json(JSON.parse(data.toString())); + return json(JSON.parse(data.toString())); } export async function POST({ params, request }) { const timeStamp = new Date().getTime(); - if (!fs.existsSync("./data/pending/")) { - fs.mkdirSync("./data/pending"); + try { + if (!fs.existsSync("./data/pending/")) { + fs.mkdirSync("./data/pending", { mode: 0o755 }); + } + const filePath = `./data/pending/${params.id}-${timeStamp}.json`; + const data: MusicMetadata = await request.json(); + data.updateTime = getCurrentFormattedDateTime(); + fs.writeFileSync(filePath, JSON.stringify(data, null, 4), { mode: 0o644 }); + return json({ + "message": "successfully created" + }, { + status: 201 + }); + } catch (e) { + return error(500, { + message: "Internal server error." + }); } - const filePath = `./data/pending/${params.id}-${timeStamp}.json`; - const data: MusicMetadata = await request.json(); - data.updateTime = getCurrentFormattedDateTime(); - fs.writeFileSync(filePath, JSON.stringify(data, null, 4)); - return json({ - "message": "successfully created" - }, { - status: 201 - }); } \ No newline at end of file diff --git a/src/routes/database/edit/[id]/+page.server.ts b/src/routes/database/edit/[id]/+page.server.ts index b887bcb..c87a1a0 100644 --- a/src/routes/database/edit/[id]/+page.server.ts +++ b/src/routes/database/edit/[id]/+page.server.ts @@ -1,22 +1,17 @@ /** @type {import('./$types').PageLoad} */ import fs from 'fs'; +import path from 'path'; export function load({ params }) { - const filePath = `./data/song/${params.id}.json`; - if (!fs.existsSync(filePath)) { - return { - songData: null - } - } - const dataBuffer = fs.readFileSync(filePath); + const filePath = path.join('./data/song', `${params.id}.json`); try { + const dataBuffer = fs.readFileSync(filePath); const data = JSON.parse(dataBuffer.toString()); return { songData: data }; - } - catch { + } catch { return { songData: null }