mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-01-18 16:35:31 +01:00
34 lines
946 B
TypeScript
34 lines
946 B
TypeScript
|
|
import path from 'path';
|
||
|
|
import crypto from 'node:crypto';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Sanitize a filename by removing any directory components, replacing non-alphanumeric characters
|
||
|
|
* @param inputName
|
||
|
|
*/
|
||
|
|
export function sanitizeFilename(inputName: string): string {
|
||
|
|
// Remove any directory components
|
||
|
|
let name = path.basename(inputName);
|
||
|
|
|
||
|
|
// Replace any non-alphanumeric characters except for '.' and '-'
|
||
|
|
name = name.replace(/[^a-zA-Z0-9.-]/g, '_');
|
||
|
|
|
||
|
|
// Ensure the name doesn't start with a dot (hidden file in Unix-like systems)
|
||
|
|
if (name.startsWith('.') || name === '') {
|
||
|
|
name = '_' + name;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Limit the length of the filename
|
||
|
|
const MAX_LENGTH = 255;
|
||
|
|
if (name.length > MAX_LENGTH) {
|
||
|
|
const ext = path.extname(name);
|
||
|
|
const nameWithoutExt = path.basename(name, ext);
|
||
|
|
name =
|
||
|
|
nameWithoutExt.slice(0, MAX_LENGTH - ext.length - 7) +
|
||
|
|
'-' +
|
||
|
|
crypto.randomBytes(3).toString('hex') +
|
||
|
|
ext;
|
||
|
|
}
|
||
|
|
|
||
|
|
return name;
|
||
|
|
}
|