mirror of
https://github.com/yusufipk/OpenFrame.git
synced 2026-09-11 09:36:08 +00:00
fix(api): add rate limiting, file size validation, and timeout handling
- Add Content-Length header check for early file size validation on audio upload - Add rate limiting (60 req/min) to public watch endpoint - Add 10-second timeout with AbortController for YouTube and Vimeo oEmbed requests - Add automatic rate limit cleanup interval for self-hosted servers - Fix null check for comment.replies in video page content - Add checkWorkspaceAccess helper for workspace authorization
This commit is contained in:
@@ -10,6 +10,15 @@ const ALLOWED_TYPES = ['audio/webm', 'audio/ogg', 'audio/mp4', 'audio/mpeg', 'au
|
||||
|
||||
export async function POST(request: Request) {
|
||||
try {
|
||||
// Check Content-Length header BEFORE loading the file
|
||||
const contentLength = request.headers.get('content-length');
|
||||
if (contentLength) {
|
||||
const fileSize = parseInt(contentLength, 10);
|
||||
if (isNaN(fileSize) || fileSize > MAX_FILE_SIZE) {
|
||||
return apiErrors.badRequest('File too large. Maximum size is 10MB.');
|
||||
}
|
||||
}
|
||||
|
||||
// Rate limit
|
||||
const limited = await rateLimit(request, 'voice-upload');
|
||||
if (limited) return limited;
|
||||
@@ -27,6 +36,7 @@ export async function POST(request: Request) {
|
||||
return apiErrors.badRequest('No audio file provided');
|
||||
}
|
||||
|
||||
// Double-check file size (defense in depth - Content-Length can be spoofed)
|
||||
if (file.size > MAX_FILE_SIZE) {
|
||||
return apiErrors.badRequest('File too large. Maximum size is 10MB.');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user