revert
This commit is contained in:
parent
5d2cf9a2f3
commit
6b6b67a31c
7 changed files with 10 additions and 30 deletions
|
|
@ -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" }
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -48,11 +48,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
"permissions":{
|
|
||||||
"type":"string",
|
|
||||||
"default":"0666",
|
|
||||||
"description": "Mode d'écriture sur le disque"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 });
|
||||||
|
|
|
||||||
|
|
@ -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({
|
||||||
|
|
|
||||||
|
|
@ -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 }] })
|
||||||
|
|
|
||||||
|
|
@ -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', () => {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue