This commit is contained in:
2026-06-25 12:41:33 -05:00
parent 8c60e154a7
commit 56e34475fc
16 changed files with 113 additions and 46 deletions

View File

@@ -1,30 +1,13 @@
import crypto from 'node:crypto';
import fs from 'node:fs';
import path from 'node:path';
import { config } from '../config.js';
import { db, id, now, visibleClause } from '../db.js';
import { camelAsset, camelAssetFolder, camelAssetLink } from './mappers.js';
function sanitizeFileName(name) {
return String(name || 'asset.bin')
.replace(/[/\\?%*:|"<>]/g, '-')
.replace(/\s+/g, ' ')
.trim()
.slice(0, 180) || 'asset.bin';
}
function normalizePackagePath(value, fallbackName = '') {
const clean = String(value || fallbackName || '')
.replace(/\\/g, '/')
.split('/')
.filter((part) => part && part !== '.' && part !== '..')
.join('/');
return clean.slice(0, 500);
}
import { extnameAny, isPathInside, normalizePackagePath, path, sanitizeFileName } from '../utils/pathUtils.js';
function inferKind(mimeType = '', fileName = '') {
const mime = mimeType.toLowerCase();
const ext = path.extname(fileName).toLowerCase();
const ext = extnameAny(fileName);
if (mime.startsWith('image/')) return 'image';
if (mime.includes('zip') || ['.zip', '.intunewin', '.7z', '.rar'].includes(ext)) return 'archive';
if (['.msi', '.msp', '.exe'].includes(ext)) return 'installer';
@@ -162,8 +145,7 @@ export function getAssetFile(assetId, userId) {
const row = selectAssetById(assetId, userId);
if (!row) return null;
const resolved = path.resolve(row.storage_path);
const fileLockerRoot = path.resolve(config.fileLockerDir);
if (!resolved.startsWith(fileLockerRoot)) throw new Error('Asset file path is outside the configured FileLocker directory');
if (!isPathInside(config.fileLockerDir, resolved)) throw new Error('Asset file path is outside the configured FileLocker directory');
return { asset: camelAsset(row), filePath: resolved };
}