From 52ace91580b4d06d8d05092bd343ebf724edb5ee Mon Sep 17 00:00:00 2001 From: Nicolas Date: Sat, 19 Sep 2026 14:59:16 +0200 Subject: [PATCH] change config --- config.example.json | 2 +- config.schema.json | 2 +- src/config.ts | 4 ++-- src/lib/storage.ts | 7 +++++-- src/routes/upload.ts | 1 + 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/config.example.json b/config.example.json index 0eb9469..8118b22 100644 --- a/config.example.json +++ b/config.example.json @@ -16,7 +16,7 @@ "dir": "./uploads/videos", "allowDirectories": true, "allowedMimeTypes": ["video/*"], - "permissions": "0o666" + "permissions": "0666" }, { "name": "divers", "label": "Divers", "dir": "./uploads/divers" } ], diff --git a/config.schema.json b/config.schema.json index c6d12d0..480a44c 100644 --- a/config.schema.json +++ b/config.schema.json @@ -51,7 +51,7 @@ }, "permissions":{ "type":"string", - "default":"0o666", + "default":"0666", "description": "Mode d'écriture sur le disque" } } diff --git a/src/config.ts b/src/config.ts index c7f5235..8c94cea 100644 --- a/src/config.ts +++ b/src/config.ts @@ -65,7 +65,7 @@ export interface DropTarget { * Mode de permission d'écriture * Par défaut 0o666 */ - permission: string; + permission: number; } /** Liste non vide de cibles de dépôt ; la première est la cible par défaut. */ @@ -392,7 +392,7 @@ function parseTargets(value: unknown, defaultMimePolicy: MimePolicy): DropTarget raw.allowedMimeTypes === undefined || raw.allowedMimeTypes === null ? defaultMimePolicy : parseMimePolicy(raw.allowedMimeTypes, `targets[${String(index)}].allowedMimeTypes`), - permission: optionalString(raw.label, `targets[${String(index)}].permission`) ?? "0o666" + permission: parseInt(optionalString(raw.label, `targets[${String(index)}].permission`) ?? "0666",8) }; }; diff --git a/src/lib/storage.ts b/src/lib/storage.ts index d5b2273..8356132 100644 --- a/src/lib/storage.ts +++ b/src/lib/storage.ts @@ -33,12 +33,15 @@ export interface SaveFileParams { /** Dossier de destination (résolu depuis la cible de dépôt choisie). */ targetDir: string; maxFileSizeBytes: number; + /** Permission d'écriture */ + permission:number; /** * Mode dossier : recrée `segments` sous `targetDir` et conserve `fileName` ; * un fichier existant au même chemin est écrasé. Absent -> nom dérivé unique * à la racine de `targetDir`. */ placement?: FilePlacement; + } const MAX_BASE_LENGTH = 60; @@ -143,7 +146,7 @@ export async function resolveDestination(input: DestinationInput): Promise { - const { source, originalName, mimeType, maxFileSizeBytes } = params; + const { source, originalName, mimeType, maxFileSizeBytes,permission } = params; const { storedName, destination } = await resolveDestination(params); let bytesWritten = 0; @@ -162,7 +165,7 @@ export async function saveFile(params: SaveFileParams): Promise { await pipeline( source, limiter, - createWriteStream(destination, { highWaterMark: WRITE_HIGH_WATER_MARK }), + createWriteStream(destination, { highWaterMark: WRITE_HIGH_WATER_MARK ,mode:permission}), ); } catch (error) { await rm(destination, { force: true }); diff --git a/src/routes/upload.ts b/src/routes/upload.ts index 3d8c182..980bf03 100644 --- a/src/routes/upload.ts +++ b/src/routes/upload.ts @@ -94,6 +94,7 @@ export const uploadRoutes: FastifyPluginCallback = (app, _options, done) => { targetDir: target.dir, maxFileSizeBytes: app.appConfig.maxFileSizeBytes, ...(placement !== undefined ? { placement } : {}), + permission:target.permission }); app.notifier.uploadCompleted({