revert
Some checks failed
Publier l'image Docker / test (push) Failing after 13s
Publier l'image Docker / publish (push) Has been skipped

This commit is contained in:
Nicolas 2026-09-19 15:46:09 +02:00
parent 5d2cf9a2f3
commit 6b6b67a31c
7 changed files with 10 additions and 30 deletions

View file

@ -15,8 +15,7 @@
"label": "Vidéos", "label": "Vidéos",
"dir": "./uploads/videos", "dir": "./uploads/videos",
"allowDirectories": true, "allowDirectories": true,
"allowedMimeTypes": ["video/*"], "allowedMimeTypes": ["video/*"]
"permissions": "0666"
}, },
{ "name": "divers", "label": "Divers", "dir": "./uploads/divers" } { "name": "divers", "label": "Divers", "dir": "./uploads/divers" }
], ],

View file

@ -48,11 +48,6 @@
} }
} }
] ]
},
"permissions":{
"type":"string",
"default":"0666",
"description": "Mode d'écriture sur le disque"
} }
} }
} }

View file

@ -60,12 +60,6 @@ export interface DropTarget {
* valeur globale `allowedMimeTypes`. Toujours résolu après parsing. * valeur globale `allowedMimeTypes`. Toujours résolu après parsing.
*/ */
allowedMimeTypes: MimePolicy; allowedMimeTypes: MimePolicy;
/**
* Mode de permission d'écriture
* Par défaut 0o666
*/
permission: number;
} }
/** Liste non vide de cibles de dépôt ; la première est la cible par défaut. */ /** Liste non vide de cibles de dépôt ; la première est la cible par défaut. */
@ -391,8 +385,7 @@ function parseTargets(value: unknown, defaultMimePolicy: MimePolicy): DropTarget
allowedMimeTypes: allowedMimeTypes:
raw.allowedMimeTypes === undefined || raw.allowedMimeTypes === null raw.allowedMimeTypes === undefined || raw.allowedMimeTypes === null
? defaultMimePolicy ? defaultMimePolicy
: parseMimePolicy(raw.allowedMimeTypes, `targets[${String(index)}].allowedMimeTypes`), : parseMimePolicy(raw.allowedMimeTypes, `targets[${String(index)}].allowedMimeTypes`)
permission: parseInt(optionalString(raw.permission, `targets[${String(index)}].permission`) ?? "0666",8)
}; };
}; };
@ -450,7 +443,5 @@ export function loadConfig(env: NodeJS.ProcessEnv): AppConfig {
throw new ConfigError(`JSON invalide dans ${file}`, { cause }); throw new ConfigError(`JSON invalide dans ${file}`, { cause });
} }
const parsedConfig = parseConfig(raw); return parseConfig(raw);
console.log(JSON.stringify(parsedConfig,undefined,2))
return parsedConfig;
} }

View file

@ -33,8 +33,6 @@ export interface SaveFileParams {
/** Dossier de destination (résolu depuis la cible de dépôt choisie). */ /** Dossier de destination (résolu depuis la cible de dépôt choisie). */
targetDir: string; targetDir: string;
maxFileSizeBytes: number; maxFileSizeBytes: number;
/** Permission d'écriture */
permission:number;
/** /**
* Mode dossier : recrée `segments` sous `targetDir` et conserve `fileName` ; * Mode dossier : recrée `segments` sous `targetDir` et conserve `fileName` ;
* un fichier existant au même chemin est écrasé. Absent -> nom dérivé unique * un fichier existant au même chemin est écrasé. Absent -> nom dérivé unique
@ -146,7 +144,7 @@ export async function resolveDestination(input: DestinationInput): Promise<Resol
* le fichier partiel est supprimé et `PayloadTooLargeError` est levée. * le fichier partiel est supprimé et `PayloadTooLargeError` est levée.
*/ */
export async function saveFile(params: SaveFileParams): Promise<StoredFile> { export async function saveFile(params: SaveFileParams): Promise<StoredFile> {
const { source, originalName, mimeType, maxFileSizeBytes,permission } = params; const { source, originalName, mimeType, maxFileSizeBytes } = params;
const { storedName, destination } = await resolveDestination(params); const { storedName, destination } = await resolveDestination(params);
let bytesWritten = 0; let bytesWritten = 0;
@ -165,7 +163,7 @@ export async function saveFile(params: SaveFileParams): Promise<StoredFile> {
await pipeline( await pipeline(
source, source,
limiter, limiter,
createWriteStream(destination, { highWaterMark: WRITE_HIGH_WATER_MARK ,mode:permission}), createWriteStream(destination, { highWaterMark: WRITE_HIGH_WATER_MARK ,mode:0o777}),
); );
} catch (error) { } catch (error) {
await rm(destination, { force: true }); await rm(destination, { force: true });

View file

@ -93,8 +93,7 @@ export const uploadRoutes: FastifyPluginCallback = (app, _options, done) => {
mimeType: part.mimetype, mimeType: part.mimetype,
targetDir: target.dir, targetDir: target.dir,
maxFileSizeBytes: app.appConfig.maxFileSizeBytes, maxFileSizeBytes: app.appConfig.maxFileSizeBytes,
...(placement !== undefined ? { placement } : {}), ...(placement !== undefined ? { placement } : {})
permission:target.permission
}); });
app.notifier.uploadCompleted({ app.notifier.uploadCompleted({

View file

@ -39,8 +39,7 @@ describe('parseConfig', () => {
label: 'photos', label: 'photos',
dir: './uploads/photos', dir: './uploads/photos',
allowDirectories: false, allowDirectories: false,
allowedMimeTypes: DEFAULT_ALLOWED_MIME, allowedMimeTypes: DEFAULT_ALLOWED_MIME
permission:0o666
}, },
]); ]);
expect(config.targets[0]?.allowedMimeTypes).toBe(DEFAULT_ALLOWED_MIME); expect(config.targets[0]?.allowedMimeTypes).toBe(DEFAULT_ALLOWED_MIME);
@ -97,8 +96,7 @@ describe('parseConfig', () => {
label: 'X', label: 'X',
dir: './x', dir: './x',
allowDirectories: false, allowDirectories: false,
allowedMimeTypes: DEFAULT_ALLOWED_MIME, allowedMimeTypes: DEFAULT_ALLOWED_MIME
permission:0o666
}); });
expect( expect(
parseConfig({ ...BASE, targets: [{ name: 'x', dir: './x', allowDirectories: true }] }) parseConfig({ ...BASE, targets: [{ name: 'x', dir: './x', allowDirectories: true }] })

View file

@ -24,8 +24,8 @@ afterEach(async () => {
await removeDir(uploadDir); await removeDir(uploadDir);
}); });
function params(maxFileSizeBytes = 1024 * 1024): { targetDir: string; maxFileSizeBytes: number,permission:number } { function params(maxFileSizeBytes = 1024 * 1024): { targetDir: string; maxFileSizeBytes: number } {
return { targetDir: uploadDir, maxFileSizeBytes ,permission:0o666}; return { targetDir: uploadDir, maxFileSizeBytes };
} }
describe('saveFile', () => { describe('saveFile', () => {