@muhgholy/next-drive 4.23.25 → 4.23.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { getDriveConfig, getDriveInformation, resolveProvider, drive_default, GoogleDriveProvider, LocalStorageProvider, getImageSettings, account_default, withSignedUrl, withSignedUrls, handleUpload } from './chunk-VBFXHZBY.js';
1
+ import { getDriveConfig, getDriveInformation, resolveProvider, drive_default, GoogleDriveProvider, LocalStorageProvider, getImageSettings, account_default, withSignedUrl, withSignedUrls, handleUpload } from './chunk-W7PHCOE6.js';
2
2
  import path from 'path';
3
3
  import fs from 'fs';
4
4
  import crypto from 'crypto';
@@ -751,5 +751,5 @@ var driveAPIHandler = async (req, res) => {
751
751
  };
752
752
 
753
753
  export { driveAPIHandler, driveFileSchemaZod };
754
- //# sourceMappingURL=chunk-ZNWS7VJP.js.map
755
- //# sourceMappingURL=chunk-ZNWS7VJP.js.map
754
+ //# sourceMappingURL=chunk-CLF77PSE.js.map
755
+ //# sourceMappingURL=chunk-CLF77PSE.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server/actions/cors.ts","../src/server/security/crypto-utils.ts","../src/server/actions/public.ts","../src/server/actions/auth.ts","../src/server/zod/schemas.ts","../src/server/actions/drive.ts","../src/server/index.ts"],"names":["stream","authenticated"],"mappings":"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","file":"chunk-ZNWS7VJP.js","sourcesContent":["import type { NextApiRequest, NextApiResponse } from 'next';\nimport { getDriveConfig } from '@/server/config';\n\nexport const applyCorsHeaders = (req: NextApiRequest, res: NextApiResponse, config: ReturnType<typeof getDriveConfig>): boolean => {\n const cors = config.cors;\n if (!cors?.enabled) return false;\n\n const origin = req.headers.origin;\n const allowedOrigins = cors.origins ?? '*';\n const methods = cors.methods ?? ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'];\n const allowedHeaders = cors.allowedHeaders ?? ['Content-Type', 'Authorization', 'X-Drive-Account', 'Tus-Resumable', 'Upload-Length', 'Upload-Offset', 'Upload-Metadata', 'Upload-Concat', 'Upload-Defer-Length'];\n const exposedHeaders = cors.exposedHeaders ?? ['Content-Length', 'Content-Type', 'Content-Disposition', 'Location', 'Tus-Resumable', 'Upload-Length', 'Upload-Offset', 'Upload-Metadata', 'Upload-Expires', 'X-Drive-Item'];\n const credentials = cors.credentials ?? false;\n const maxAge = cors.maxAge ?? 86400;\n\n let allowOrigin: string | null = null;\n if (origin) {\n if (allowedOrigins === '*') {\n allowOrigin = origin;\n } else if (Array.isArray(allowedOrigins)) {\n if (allowedOrigins.includes(origin)) {\n allowOrigin = origin;\n }\n } else if (allowedOrigins === origin) {\n allowOrigin = origin;\n }\n } else if (allowedOrigins === '*') {\n allowOrigin = '*';\n }\n\n if (!allowOrigin) {\n if (req.method === 'OPTIONS') {\n res.status(403).end();\n return true;\n }\n return false;\n }\n\n res.setHeader('Access-Control-Allow-Origin', allowOrigin);\n res.setHeader('Access-Control-Allow-Methods', methods.join(', '));\n res.setHeader('Access-Control-Allow-Headers', allowedHeaders.join(', '));\n res.setHeader('Access-Control-Expose-Headers', exposedHeaders.join(', '));\n res.setHeader('Access-Control-Max-Age', maxAge.toString());\n\n if (credentials) {\n res.setHeader('Access-Control-Allow-Credentials', 'true');\n }\n\n if (req.method === 'OPTIONS') {\n res.status(204).end();\n return true;\n }\n\n return false;\n};\n","import crypto from 'crypto';\r\n\r\n/**\r\n * Constant-time string comparison to prevent timing attacks\r\n */\r\nexport function constantTimeCompare(a: string, b: string): boolean {\r\n\tif (a.length !== b.length) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tlet result = 0;\r\n\tfor (let i = 0; i < a.length; i++) {\r\n\t\tresult |= a.charCodeAt(i) ^ b.charCodeAt(i);\r\n\t}\r\n\r\n\treturn result === 0;\r\n}\r\n\r\n/**\r\n * Safe error message that doesn't leak sensitive information\r\n */\r\nexport function getSafeErrorMessage(error: unknown): string {\r\n\tif (error instanceof Error) {\r\n\t\t// Filter out sensitive patterns (case-insensitive)\r\n\t\tconst message = error.message.toLowerCase();\r\n\r\n\t\t// Don't expose database errors\r\n\t\tif (message.includes('mongo')) {\r\n\t\t\treturn 'Database operation failed';\r\n\t\t}\r\n\r\n\t\t// Don't expose file paths\r\n\t\tif (message.includes('/') || message.includes('\\\\')) {\r\n\t\t\treturn 'File operation failed';\r\n\t\t}\r\n\r\n\t\t// Don't expose validation details from internal libraries\r\n\t\tif (message.includes('validation') || message.includes('cast')) {\r\n\t\t\treturn 'Invalid input';\r\n\t\t}\r\n\r\n\t\t// Generic safe messages\r\n\t\treturn 'Operation failed';\r\n\t}\r\n\r\n\treturn 'Internal server error';\r\n}\r\n\r\n/**\r\n * Validate and sanitize Content-Disposition filename\r\n */\r\nexport function sanitizeContentDispositionFilename(filename: string): string {\r\n\t// Remove any path components\r\n\tconst basename = filename.replace(/^.*[\\\\\\/]/, '');\r\n\r\n\t// Remove or encode dangerous characters\r\n\treturn basename\r\n\t\t.replace(/[\"\\r\\n]/g, '')\r\n\t\t.replace(/[^\\x20-\\x7E]/g, '') // Remove non-printable ASCII\r\n\t\t.slice(0, 255);\r\n}\r\n","import type { NextApiRequest, NextApiResponse } from 'next';\nimport path from 'path';\nimport fs from 'fs';\nimport crypto from 'crypto';\nimport sharp from 'sharp';\nimport { getDriveConfig } from '@/server/config';\nimport Drive from '@/server/database/mongoose/schema/drive';\nimport { getImageSettings } from '@/server/utils';\nimport { sanitizeContentDispositionFilename } from '@/server/security/crypto-utils';\nimport { LocalStorageProvider } from '@/server/storage-adapters/local';\nimport { GoogleDriveProvider } from '@/server/storage-adapters/google';\n\nexport const handlePublicAction = async (\n req: NextApiRequest,\n res: NextApiResponse,\n action: string,\n config: ReturnType<typeof getDriveConfig>\n): Promise<boolean> => {\n if (action !== 'serve' && action !== 'thumbnail') {\n return false;\n }\n\n try {\n const { id, token } = req.query;\n if (!id || typeof id !== 'string') {\n res.status(400).json({ status: 400, message: 'Could not open file: missing or invalid file ID' });\n return true;\n }\n\n const drive = await Drive.findById(id);\n if (!drive) {\n res.status(404).json({ status: 404, message: 'File not found or no longer available' });\n return true;\n }\n\n if (config.security?.signedUrls?.enabled) {\n if (!token || typeof token !== 'string') {\n res.status(401).json({ status: 401, message: 'Access denied: this link is missing its access token' });\n return true;\n }\n\n try {\n const decoded = Buffer.from(token, 'base64url').toString();\n const [expiryStr, signature] = decoded.split(':');\n const expiry = parseInt(expiryStr, 10);\n\n if (Date.now() / 1000 > expiry) {\n res.status(401).json({ status: 401, message: 'Access denied: this link has expired' });\n return true;\n }\n\n const { secret } = config.security.signedUrls;\n const expectedSignature = crypto.createHmac('sha256', secret)\n .update(`${id}:${expiry}`)\n .digest('hex');\n\n if (signature !== expectedSignature) {\n res.status(401).json({ status: 401, message: 'Access denied: this link\\'s access token is invalid' });\n return true;\n }\n } catch {\n res.status(401).json({ status: 401, message: 'Access denied: this link\\'s access token is malformed' });\n return true;\n }\n }\n\n const itemProvider = drive.provider?.type === 'GOOGLE' ? GoogleDriveProvider : LocalStorageProvider;\n const itemAccountId = drive.storageAccountId ? drive.storageAccountId.toString() : undefined;\n\n if (action === 'thumbnail') {\n const stream = await itemProvider.getThumbnail(drive, itemAccountId);\n res.setHeader('Content-Type', 'image/webp');\n if (config.cors?.enabled) {\n res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');\n }\n stream.pipe(res);\n return true;\n }\n\n const { stream, mime, size: fileSize } = await itemProvider.openStream(drive, itemAccountId);\n const safeFilename = sanitizeContentDispositionFilename(drive.name);\n\n const format = req.query.format as string;\n const quality = req.query.quality as string;\n const display = req.query.display as string;\n const sizePreset = req.query.size as string;\n const fit = req.query.fit as string;\n const position = req.query.position as string;\n\n const isImage = mime.startsWith('image/');\n const shouldTransform = isImage && (format || quality || display || sizePreset || fit);\n\n res.setHeader('Content-Disposition', `inline; filename=\"${safeFilename}\"`);\n\n if (config.cors?.enabled) {\n res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');\n }\n\n if (shouldTransform) {\n try {\n const settings = getImageSettings(fileSize, quality, display, sizePreset, fit, position);\n\n let targetFormat = format || mime.split('/')[1];\n if (targetFormat === 'jpg') targetFormat = 'jpeg';\n if (!['jpeg', 'png', 'webp', 'avif'].includes(targetFormat)) {\n targetFormat = format || 'webp';\n }\n\n const cacheDir = path.join(config.storage.path, 'file', drive._id.toString(), 'cache');\n const cacheKey = [\n 'opt',\n `q${settings.quality}`,\n `e${settings.effort}`,\n settings.width ? `${settings.width}x${settings.height}` : 'orig',\n settings.fit || 'none',\n settings.position || 'c',\n targetFormat,\n ].join('_');\n const cachePath = path.join(cacheDir, `${cacheKey}.bin`);\n\n if (fs.existsSync(cachePath)) {\n const cacheStat = fs.statSync(cachePath);\n res.setHeader('Content-Type', `image/${targetFormat}`);\n res.setHeader('Content-Length', cacheStat.size);\n res.setHeader('Cache-Control', 'public, max-age=31536000, immutable');\n if (config.cors?.enabled) {\n res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');\n }\n if ('destroy' in stream) {\n (stream as NodeJS.ReadableStream & { destroy: () => void }).destroy();\n }\n fs.createReadStream(cachePath).pipe(res);\n return true;\n }\n\n if (!fs.existsSync(cacheDir)) fs.mkdirSync(cacheDir, { recursive: true });\n\n let pipeline = sharp();\n\n if (settings.width && settings.height) {\n pipeline = pipeline.resize(settings.width, settings.height, {\n fit: settings.fit || 'inside',\n position: settings.position || 'center',\n withoutEnlargement: true,\n background: { r: 0, g: 0, b: 0, alpha: 0 },\n });\n }\n\n if (targetFormat === 'jpeg') {\n pipeline = pipeline.jpeg({ quality: settings.quality, mozjpeg: true });\n res.setHeader('Content-Type', 'image/jpeg');\n } else if (targetFormat === 'png') {\n pipeline = pipeline.png({ compressionLevel: settings.pngCompression, adaptiveFiltering: true });\n res.setHeader('Content-Type', 'image/png');\n } else if (targetFormat === 'webp') {\n const webpEffort = Math.min(settings.effort, 6);\n pipeline = pipeline.webp({ quality: settings.quality, effort: webpEffort });\n res.setHeader('Content-Type', 'image/webp');\n } else if (targetFormat === 'avif') {\n pipeline = pipeline.avif({ quality: settings.quality, effort: settings.effort });\n res.setHeader('Content-Type', 'image/avif');\n }\n\n res.setHeader('Cache-Control', 'public, max-age=31536000, immutable');\n\n pipeline.on('error', (err) => {\n console.error('[next-drive] Pipeline error:', err);\n });\n\n stream.pipe(pipeline);\n\n pipeline.clone().toFile(cachePath).catch(e => console.error('[next-drive] Cache write failed:', e));\n pipeline.clone().pipe(res);\n return true;\n } catch (e) {\n console.error('[next-drive] Image transformation failed:', e);\n }\n }\n\n res.setHeader('Content-Type', mime);\n if (fileSize) res.setHeader('Content-Length', fileSize);\n stream.pipe(res);\n return true;\n } catch (error) {\n console.error(`[next-drive] Error in ${action}:`, error);\n const detail = error instanceof Error ? error.message : 'Something went wrong while serving the file';\n res.status(500).json({ status: 500, message: `Request \"${action}\" failed: ${detail}` });\n return true;\n }\n};\n","import type { NextApiRequest, NextApiResponse } from 'next';\nimport { google } from 'googleapis';\nimport { getDriveConfig } from '@/server/config';\nimport StorageAccount from '@/server/database/mongoose/schema/storage/account';\nimport Drive from '@/server/database/mongoose/schema/drive';\nimport { GoogleDriveProvider } from '@/server/storage-adapters/google';\n\nexport const handleAuthAction = async (\n req: NextApiRequest,\n res: NextApiResponse,\n action: string,\n config: ReturnType<typeof getDriveConfig>,\n owner: Record<string, unknown> | null\n): Promise<boolean> => {\n if (!['getAuthUrl', 'callback', 'listAccounts', 'removeAccount'].includes(action)) {\n return false;\n }\n\n switch (action) {\n case 'getAuthUrl': {\n const { provider } = req.query;\n if (provider === 'GOOGLE') {\n const { clientId, clientSecret, redirectUri } = config.storage?.google || {};\n if (!clientId || !clientSecret || !redirectUri) {\n res.status(500).json({ status: 500, message: 'Google Drive is not configured on the server' });\n return true;\n }\n\n const callbackUri = new URL(redirectUri);\n callbackUri.searchParams.set('action', 'callback');\n const oAuth2Client = new google.auth.OAuth2(clientId, clientSecret, callbackUri.toString());\n const state = Buffer.from(JSON.stringify({ owner })).toString('base64');\n const url = oAuth2Client.generateAuthUrl({\n access_type: 'offline',\n scope: ['https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/userinfo.email'],\n state,\n prompt: 'consent',\n });\n res.status(200).json({ status: 200, message: 'Auth URL generated', data: { url } });\n return true;\n }\n res.status(400).json({ status: 400, message: 'Unknown storage provider requested' });\n return true;\n }\n\n case 'callback': {\n const { code } = req.query;\n if (!code) {\n res.status(400).json({ status: 400, message: 'Google sign-in failed: authorization code missing' });\n return true;\n }\n\n const { clientId, clientSecret, redirectUri } = config.storage?.google || {};\n if (!clientId || !clientSecret || !redirectUri) {\n res.status(500).json({ status: 500, message: 'Google Drive sign-in is not configured on the server' });\n return true;\n }\n\n const callbackUri = new URL(redirectUri);\n callbackUri.searchParams.set('action', 'callback');\n const oAuth2Client = new google.auth.OAuth2(clientId, clientSecret, callbackUri.toString());\n\n const { tokens } = await oAuth2Client.getToken(code as string);\n oAuth2Client.setCredentials(tokens);\n\n const oauth2 = google.oauth2({ version: 'v2', auth: oAuth2Client });\n const userInfo = await oauth2.userinfo.get();\n\n const existing = await StorageAccount.findOne({ owner, 'metadata.google.email': userInfo.data.email, 'metadata.provider': 'GOOGLE' });\n if (existing) {\n existing.metadata.google.credentials = tokens as Record<string, unknown>;\n existing.markModified('metadata');\n await existing.save();\n } else {\n const newAccount = new StorageAccount({\n owner,\n name: userInfo.data.name || 'Google Drive',\n metadata: {\n provider: 'GOOGLE',\n google: {\n email: userInfo.data.email,\n credentials: tokens as Record<string, unknown>,\n },\n },\n });\n await newAccount.save();\n }\n\n res.setHeader('Content-Type', 'text/html');\n res.send(`<!DOCTYPE html>\n<html>\n<head><title>Authentication Complete</title></head>\n<body>\n<p>Authentication successful! This window will close automatically.</p>\n<script>\n(function() {\n\\tif (window.opener) {\n\\t\\ttry {\n\\t\\t\\twindow.opener.postMessage('oauth-success', '*');\n\\t\\t} catch (e) {}\n\\t}\n\\ttry {\n\\t\\tlocalStorage.setItem('next-drive-oauth-success', Date.now().toString());\n\\t\\tlocalStorage.removeItem('next-drive-oauth-success');\n\\t} catch (e) {}\n\\twindow.close();\n\\tsetTimeout(function() {\n\\t\\tdocument.body.innerHTML = '<p style=\"font-family: system-ui; text-align: center; margin-top: 50px;\">Authentication successful!<br>You can close this tab now.</p>';\n\\t}, 500);\n})();\n</script>\n</body>\n</html>`);\n return true;\n }\n\n case 'listAccounts': {\n const accounts = await StorageAccount.find({ owner });\n res.status(200).json({\n status: 200,\n data: {\n accounts: accounts.map(a => ({\n id: a._id.toString(),\n name: a.name,\n email: a.metadata.google?.email || '',\n provider: a.metadata.provider,\n })),\n },\n });\n return true;\n }\n\n case 'removeAccount': {\n const { id } = req.query;\n const account = await StorageAccount.findOne({ _id: id, owner });\n if (!account) {\n res.status(404).json({ status: 404, message: 'Could not disconnect: account not found' });\n return true;\n }\n\n if (account.metadata.provider === 'GOOGLE') {\n try {\n await GoogleDriveProvider.revokeToken(owner, account._id.toString());\n } catch (e) {\n console.error('Failed to revoke Google token:', e);\n }\n }\n\n await StorageAccount.deleteOne({ _id: id, owner });\n await Drive.deleteMany({ owner, storageAccountId: id });\n res.status(200).json({ status: 200, message: 'Account removed' });\n return true;\n }\n\n default:\n return false;\n }\n};\n","import { z } from 'zod';\r\nimport { isValidObjectId } from 'mongoose';\r\n\r\n// ** Custom ObjectId validator\r\nconst objectIdSchema = z.string().refine(val => isValidObjectId(val), {\r\n message: 'Invalid ObjectId format',\r\n});\r\n\r\n// ** Sanitize filename - remove path traversal and dangerous characters\r\nconst sanitizeFilename = (name: string): string => {\r\n return (\r\n name\r\n .replace(/[<>:\"|?*\\x00-\\x1F]/g, '') // Remove dangerous chars\r\n .replace(/^\\.+/, '') // Remove leading dots\r\n .replace(/\\.+$/, '') // Remove trailing dots\r\n .replace(/\\\\/g, '/') // Normalize slashes\r\n .replace(/\\/+/g, '/') // Remove duplicate slashes\r\n .replace(/\\.\\.\\//g, '') // Remove path traversal\r\n .replace(/\\.\\.+/g, '') // Remove remaining ..\r\n .split('/')\r\n .pop() ||\r\n '' // Take only the filename part (remove all paths)\r\n .trim()\r\n .slice(0, 255)\r\n ); // Limit length\r\n};\r\n\r\n// ** Sanitize search query for regex\r\nconst sanitizeRegexInput = (input: string): string => {\r\n // Escape regex special characters\r\n return input.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').slice(0, 100);\r\n};\r\n\r\n// ** File/Folder name schema\r\nconst nameSchema = z\r\n .string()\r\n .min(1, 'Name is required')\r\n .max(255, 'Name too long')\r\n .transform(sanitizeFilename)\r\n .refine(val => val.length > 0, { message: 'Invalid name after sanitization' });\r\n\r\n// ** List query schema\r\nexport const listQuerySchema = z.object({\r\n folderId: z.union([z.literal('root'), objectIdSchema, z.undefined()]),\r\n limit: z\r\n .string()\r\n .optional()\r\n .transform(val => {\r\n const num = parseInt(val || '50', 10);\r\n return Math.min(Math.max(1, num), 100);\r\n }),\r\n afterId: objectIdSchema.optional(),\r\n});\r\n\r\n// ** Serve query schema\r\nexport const serveQuerySchema = z.object({\r\n id: objectIdSchema,\r\n token: z.string().optional(),\r\n});\r\n\r\n// ** Thumbnail query schema\r\nexport const thumbnailQuerySchema = z.object({\r\n id: objectIdSchema,\r\n size: z.enum(['small', 'medium', 'large']).optional().default('medium'),\r\n token: z.string().optional(),\r\n});\r\n\r\n// ** Rename body schema\r\nexport const renameBodySchema = z.object({\r\n id: objectIdSchema,\r\n newName: nameSchema,\r\n});\r\n\r\n// ** Delete query schema\r\nexport const deleteQuerySchema = z.object({\r\n id: objectIdSchema,\r\n});\r\n\r\n// ** Delete many body schema\r\nexport const deleteManyBodySchema = z.object({\r\n ids: z.array(objectIdSchema).min(1).max(1000),\r\n});\r\n\r\n// ** Create folder body schema\r\nexport const createFolderBodySchema = z.object({\r\n name: nameSchema,\r\n parentId: z.union([z.literal('root'), objectIdSchema, z.string().length(0), z.undefined()]).optional(),\r\n});\r\n\r\n// ** Move body schema\r\nexport const moveBodySchema = z.object({\r\n ids: z.array(objectIdSchema).min(1).max(1000),\r\n targetFolderId: z.union([z.literal('root'), objectIdSchema, z.undefined()]).optional(),\r\n});\r\n\r\n// ** Reorder body schema\r\nexport const reorderBodySchema = z.object({\r\n ids: z.array(objectIdSchema).min(1).max(1000),\r\n});\r\n\r\n// ** Search query schema\r\nexport const searchQuerySchema = z.object({\r\n q: z.string().min(1).max(100).transform(sanitizeRegexInput),\r\n folderId: z.union([z.literal('root'), objectIdSchema, z.undefined()]).optional(),\r\n limit: z\r\n .string()\r\n .optional()\r\n .transform(val => {\r\n const num = parseInt(val || '50', 10);\r\n return Math.min(Math.max(1, num), 100);\r\n }),\r\n trashed: z\r\n .string()\r\n .optional()\r\n .transform(val => val === 'true'),\r\n});\r\n\r\n// ** Restore query schema\r\nexport const restoreQuerySchema = z.object({\r\n id: objectIdSchema,\r\n});\r\n\r\n// ** Purge trash query schema\r\nexport const purgeTrashQuerySchema = z.object({\r\n days: z.number().int().min(1).max(365).optional(),\r\n});\r\n\r\n// ** Drive File Schema (Public)\r\nexport const driveFileSchemaZod = z.object({\r\n id: z.string(),\r\n file: z.object({\r\n name: z.string(),\r\n mime: z.string(),\r\n size: z.number(),\r\n }),\r\n});\r\n\r\n// ** Constants\r\nexport const MAX_FOLDER_DEPTH = 50;\r\n\r\n// ** Export sanitization functions\r\nexport { sanitizeFilename, sanitizeRegexInput };\r\n","import type { NextApiRequest, NextApiResponse } from 'next';\nimport type { IncomingMessage, ServerResponse } from 'http';\nimport { getDriveConfig } from '@/server/config';\nimport * as schemas from '@/server/zod/schemas';\nimport { handleUpload } from '@/server/tus';\nimport type { TDatabaseDrive, TDriveConfigInformation } from '@/types/server';\nimport type { TStorageProvider } from '@/types/server/storage';\nimport { GoogleDriveProvider } from '@/server/storage-adapters/google';\nimport { LocalStorageProvider } from '@/server/storage-adapters/local';\nimport { withSignedUrl, withSignedUrls, Drive } from '@/server/actions/shared';\nimport { resolveProvider } from '@/server/actions/shared';\n\ntype TDriveActionContext = {\n req: NextApiRequest;\n res: NextApiResponse;\n action: string;\n config: ReturnType<typeof getDriveConfig>;\n owner: Record<string, unknown> | null;\n isRootMode: boolean;\n authenticated: boolean;\n information: TDriveConfigInformation;\n provider: TStorageProvider;\n accountId?: string;\n};\n\nexport const handleDriveAction = async (ctx: TDriveActionContext): Promise<void> => {\n const { req, res, action, config, owner, isRootMode, authenticated, information, provider, accountId } = ctx;\n\n switch (action) {\n case 'list': {\n if (req.method !== 'GET') return void res.status(405).json({ status: 405, message: 'Listing files requires a GET request' });\n const listQuery = schemas.listQuerySchema.safeParse(req.query);\n if (!listQuery.success) return void res.status(400).json({ status: 400, message: 'Could not list files: invalid request parameters' });\n\n const { folderId, limit, afterId } = listQuery.data;\n\n try {\n await provider.sync(folderId || 'root', owner, accountId);\n } catch (e) {\n console.error('Sync failed', e);\n }\n\n const query: Record<string, unknown> = {\n 'provider.type': provider.name,\n storageAccountId: accountId || null,\n parentId: folderId === 'root' || !folderId ? null : folderId,\n trashedAt: null,\n };\n\n if (!isRootMode) {\n query.owner = owner;\n }\n\n if (afterId) query._id = { $lt: afterId };\n\n const items = await Drive.find(query, {}, { sort: { order: 1, _id: -1 }, limit });\n const plainItems = withSignedUrls(await Promise.all(items.map(item => item.toClient())), config);\n\n res.status(200).json({ status: 200, message: 'Items retrieved', data: { items: plainItems, hasMore: items.length === limit } });\n return;\n }\n\n case 'search': {\n const searchData = schemas.searchQuerySchema.safeParse(req.query);\n if (!searchData.success) return void res.status(400).json({ status: 400, message: 'Could not search: invalid request parameters' });\n const { q, folderId, limit, trashed } = searchData.data;\n\n if (!trashed) {\n try {\n await provider.search(q, owner, accountId);\n } catch (e) {\n console.error('Search sync failed', e);\n }\n }\n\n const query: Record<string, unknown> = {\n 'provider.type': provider.name,\n storageAccountId: accountId || null,\n trashedAt: trashed ? { $ne: null } : null,\n name: { $regex: q, $options: 'i' },\n };\n\n if (!isRootMode) {\n query.owner = owner;\n }\n\n if (folderId && folderId !== 'root') query.parentId = folderId;\n\n const items = await Drive.find(query, {}, { limit, sort: { createdAt: -1 } });\n const plainItems = withSignedUrls(await Promise.all(items.map(i => i.toClient())), config);\n\n res.status(200).json({ status: 200, message: 'Results', data: { items: plainItems } });\n return;\n }\n\n case 'upload': {\n // ** tus resumable upload protocol owns POST/HEAD/PATCH/DELETE for `?action=upload`.\n // ** Context is passed to the tus hooks (src/server/tus.ts) via the web Request.\n await handleUpload(req as unknown as IncomingMessage, res as unknown as ServerResponse, { config, owner, authenticated, isRootMode, information, provider, accountId });\n return;\n }\n\n case 'createFolder': {\n const folderData = schemas.createFolderBodySchema.safeParse(req.body);\n if (!folderData.success) return void res.status(400).json({ status: 400, message: folderData.error.errors[0].message });\n const { name, parentId } = folderData.data;\n\n const item = withSignedUrl(await provider.createFolder(name, parentId ?? null, owner, accountId), config);\n res.status(201).json({ status: 201, message: 'Folder created', data: { item } });\n return;\n }\n\n case 'delete': {\n const deleteData = schemas.deleteQuerySchema.safeParse(req.query);\n if (!deleteData.success) return void res.status(400).json({ status: 400, message: 'Could not move to trash: invalid ID' });\n const { id } = deleteData.data;\n const drive = await Drive.findById(id);\n if (!drive) return void res.status(404).json({ status: 404, message: 'Could not move to trash: item not found' });\n\n const itemProvider = drive.provider?.type === 'GOOGLE' ? GoogleDriveProvider : LocalStorageProvider;\n const itemAccountId = drive.storageAccountId ? drive.storageAccountId.toString() : undefined;\n\n try {\n await itemProvider.trash([id], owner, itemAccountId);\n } catch (e) {\n console.error('Provider trash failed:', e);\n }\n\n drive.trashedAt = new Date();\n await drive.save();\n res.status(200).json({ status: 200, message: 'Moved to trash', data: null });\n return;\n }\n\n case 'deletePermanent': {\n const deleteData = schemas.deleteQuerySchema.safeParse(req.query);\n if (!deleteData.success) return void res.status(400).json({ status: 400, message: 'Could not delete: invalid ID' });\n const { id } = deleteData.data;\n await provider.delete([id], owner, accountId);\n const quota = await provider.getQuota(owner, accountId, information.storage.quotaInBytes);\n res.status(200).json({ status: 200, message: 'Deleted', statistic: { storage: quota } });\n return;\n }\n\n case 'quota': {\n const quota = await provider.getQuota(owner, accountId, information.storage.quotaInBytes);\n res.status(200).json({\n status: 200,\n message: 'Quota retrieved',\n data: {\n usedInBytes: quota.usedInBytes,\n totalInBytes: quota.quotaInBytes,\n availableInBytes: Math.max(0, quota.quotaInBytes - quota.usedInBytes),\n percentage: quota.quotaInBytes > 0 ? Math.round((quota.usedInBytes / quota.quotaInBytes) * 100) : 0,\n },\n statistic: { storage: quota },\n });\n return;\n }\n\n case 'trash': {\n try {\n const { provider: trashProvider, accountId: trashAccountId } = await resolveProvider(req, owner);\n await trashProvider.syncTrash(owner, trashAccountId);\n } catch (e) {\n console.error('Trash sync failed', e);\n }\n\n const query: Record<string, unknown> = {\n owner,\n 'provider.type': provider.name,\n storageAccountId: accountId || null,\n trashedAt: { $ne: null },\n };\n\n const items = await Drive.find(query, {}, { sort: { trashedAt: -1 } });\n const plainItems = withSignedUrls(await Promise.all(items.map(item => item.toClient())), config);\n\n res.status(200).json({ status: 200, message: 'Trash items', data: { items: plainItems, hasMore: false } });\n return;\n }\n\n case 'restore': {\n const restoreData = schemas.deleteQuerySchema.safeParse(req.query);\n if (!restoreData.success) return void res.status(400).json({ status: 400, message: 'Could not restore: invalid ID' });\n const { id } = restoreData.data;\n const drive = await Drive.findById(id);\n if (!drive) return void res.status(404).json({ status: 404, message: 'Could not restore: item not found' });\n\n let targetParentId = drive.parentId;\n if (targetParentId) {\n const parent = await Drive.findById(targetParentId);\n if (parent?.trashedAt) {\n targetParentId = null;\n }\n }\n\n const itemProvider = drive.provider?.type === 'GOOGLE' ? GoogleDriveProvider : LocalStorageProvider;\n const itemAccountId = drive.storageAccountId ? drive.storageAccountId.toString() : undefined;\n\n try {\n await itemProvider.untrash([id], owner, itemAccountId);\n if (targetParentId !== drive.parentId) {\n await itemProvider.move(id, targetParentId?.toString() ?? null, owner, itemAccountId);\n }\n } catch (e) {\n console.error('Provider restore failed:', e);\n }\n\n drive.trashedAt = null;\n drive.parentId = targetParentId;\n await drive.save();\n\n res.status(200).json({\n status: 200,\n message: targetParentId === null && drive.parentId !== null ? 'Restored to root (parent folder was trashed)' : 'Restored',\n data: null,\n });\n return;\n }\n\n case 'move': {\n const moveData = schemas.moveBodySchema.safeParse(req.body);\n if (!moveData.success) return void res.status(400).json({ status: 400, message: 'Could not move: invalid request data' });\n const { ids, targetFolderId } = moveData.data;\n\n const items: TDatabaseDrive[] = [];\n const effectiveTargetId = targetFolderId === 'root' || !targetFolderId ? null : targetFolderId;\n\n for (const id of ids) {\n try {\n const item = await provider.move(id, effectiveTargetId, owner, accountId);\n items.push(item);\n } catch (e) {\n console.error(`Failed to move item ${id}`, e);\n }\n }\n\n res.status(200).json({ status: 200, message: 'Moved', data: { items: withSignedUrls(items, config) } });\n return;\n }\n\n case 'reorder': {\n if (req.method !== 'POST') {\n return void res.status(405).json({ status: 405, message: 'Reordering requires a POST request' });\n }\n\n const reorderData = schemas.reorderBodySchema.safeParse(req.body);\n if (!reorderData.success) {\n return void res.status(400).json({ status: 400, message: 'Could not reorder: invalid request data' });\n }\n\n const { ids } = reorderData.data;\n\n const query: Record<string, unknown> = {\n _id: { $in: ids },\n 'provider.type': provider.name,\n storageAccountId: accountId || null,\n trashedAt: null,\n };\n\n if (!isRootMode) {\n query.owner = owner;\n }\n\n const existingItems = await Drive.find(query, { _id: 1, parentId: 1 });\n if (existingItems.length !== ids.length) {\n return void res.status(404).json({ status: 404, message: 'Could not reorder: one or more items were not found' });\n }\n\n const parentIds = new Set(existingItems.map(item => (item.parentId ? item.parentId.toString() : 'root')));\n if (parentIds.size > 1) {\n return void res.status(400).json({ status: 400, message: 'Could not reorder: all items must be in the same folder' });\n }\n\n const operations = ids.map((id, order) => ({\n updateOne: {\n filter: {\n _id: id,\n 'provider.type': provider.name,\n storageAccountId: accountId || null,\n trashedAt: null,\n ...(isRootMode ? {} : { owner }),\n },\n update: { $set: { order } },\n },\n }));\n\n await Drive.bulkWrite(operations as never);\n\n const updatedItems = await Drive.find(query, {}, { sort: { order: 1 } });\n const plainItems = withSignedUrls(await Promise.all(updatedItems.map(item => item.toClient())), config);\n\n res.status(200).json({ status: 200, message: 'Reordered', data: { items: plainItems } });\n return;\n }\n\n case 'rename': {\n const renameData = schemas.renameBodySchema.safeParse({ id: req.query.id, ...req.body });\n if (!renameData.success) return void res.status(400).json({ status: 400, message: 'Could not rename: invalid request data' });\n const { id, newName } = renameData.data;\n const item = withSignedUrl(await provider.rename(id, newName, owner, accountId), config);\n res.status(200).json({ status: 200, message: 'Renamed', data: { item } });\n return;\n }\n\n default: {\n res.status(400).json({ status: 400, message: `Unknown action requested: \"${action}\"` });\n return;\n }\n }\n};\n","import type { NextApiRequest, NextApiResponse } from 'next';\n\nimport { getDriveConfig, getDriveInformation, driveConfiguration } from '@/server/config';\nimport { applyCorsHeaders } from '@/server/actions/cors';\nimport { handlePublicAction } from '@/server/actions/public';\nimport { handleAuthAction } from '@/server/actions/auth';\nimport { handleDriveAction } from '@/server/actions/drive';\nimport { resolveProvider } from '@/server/actions/shared';\n\n// ** Parse the raw request body as JSON.\n// ** Needed because Next.js Pages Router disables the built-in body parser (config.api.bodyParser = false)\n// ** so that multipart/form-data uploads can be streamed directly to formidable. That leaves `req.body`\n// ** as `undefined` for every other (JSON) action unless we parse it ourselves here.\n// ** Only safe to call for Node-stream-based requests (Next.js, Express); other adapters (e.g. Hono)\n// ** don't expose `.on()` and are expected to populate `req.body` themselves before calling the handler.\nconst parseJsonBody = (req: NextApiRequest): Promise<Record<string, unknown>> => {\n return new Promise((resolve) => {\n try {\n const chunks: Buffer[] = [];\n req.on('data', (chunk: Buffer) => chunks.push(chunk));\n req.on('end', () => {\n const raw = Buffer.concat(chunks).toString();\n if (!raw) return resolve({});\n try {\n resolve(JSON.parse(raw));\n } catch {\n resolve({});\n }\n });\n req.on('error', () => resolve({}));\n } catch {\n resolve({});\n }\n });\n};\n\n// ** Main API handler for all drive operations\nexport const driveAPIHandler = async (req: NextApiRequest, res: NextApiResponse): Promise<void> => {\n // ** Only parse manually when the body hasn't already been parsed (e.g. by Express's json middleware)\n // ** and the request object actually supports Node-style streaming (`.on`). Frameworks that already\n // ** populate `req.body` (even with `{}`) or don't expose `.on()` are left untouched.\n if (req.body === undefined && typeof req.on === 'function' && (req.headers['content-type'] || '').includes('application/json')) {\n req.body = await parseJsonBody(req);\n } else if (req.body === undefined) {\n req.body = {};\n }\n\n\n const action = (req.query.action as string) || (req.query.code && req.query.state ? 'callback' : undefined);\n\n let config: ReturnType<typeof getDriveConfig>;\n try {\n config = getDriveConfig();\n } catch (error) {\n console.error('[next-drive] Configuration error:', error);\n res.status(500).json({ status: 500, message: 'Drive is not ready: failed to initialize configuration' });\n return;\n }\n\n const isPreflightHandled = applyCorsHeaders(req, res, config);\n if (isPreflightHandled) return;\n\n if (!action) {\n res.status(400).json({ status: 400, message: 'Missing \"action\" parameter in request' });\n return;\n }\n\n const wasPublicHandled = await handlePublicAction(req, res, action, config);\n if (wasPublicHandled) return;\n\n try {\n const mode = config.mode || 'NORMAL';\n\n if (action === 'information') {\n const { clientId, clientSecret, redirectUri } = config.storage?.google || {};\n const googleConfigured = !!(clientId && clientSecret && redirectUri);\n\n let authenticated = false;\n try {\n await getDriveInformation({ method: 'REQUEST', req });\n authenticated = true;\n } catch {\n authenticated = false;\n }\n\n res.status(200).json({\n status: 200,\n message: 'Information retrieved',\n data: {\n providers: {\n google: googleConfigured,\n },\n mode,\n authenticated,\n unauthenticatedUploads: !!config.security?.unauthenticated?.enabled,\n },\n });\n return;\n }\n\n const isRootMode = mode === 'ROOT';\n\n // Resolve the caller. Anonymous visitors are allowed only for one-time uploads\n // (when enabled); every other action keeps requiring authentication.\n let information: Awaited<ReturnType<typeof getDriveInformation>>;\n let authenticated = true;\n try {\n information = await getDriveInformation({ method: 'REQUEST', req });\n } catch (err) {\n if (action === 'upload' && config.security?.unauthenticated?.enabled) {\n information = { key: null, storage: { quotaInBytes: 0 } };\n authenticated = false;\n } else {\n throw err;\n }\n }\n const { key: owner } = information;\n\n const wasAuthHandled = await handleAuthAction(req, res, action, config, owner);\n if (wasAuthHandled) return;\n\n const { provider, accountId } = await resolveProvider(req, owner);\n\n await handleDriveAction({\n req,\n res,\n action,\n config,\n owner,\n isRootMode,\n authenticated,\n information,\n provider,\n accountId,\n });\n } catch (error: unknown) {\n console.error(`[next-drive] Error handling action ${action}:`, error);\n const detail = error instanceof Error ? error.message : 'Something went wrong while processing your request';\n res.status(500).json({ status: 500, message: `Request \"${action}\" failed: ${detail}` });\n }\n};\n\nexport { driveConfiguration, getDriveConfig, getDriveInformation };\nexport { driveGetUrl, driveReadFile, driveFilePath, driveUpload, driveDelete, driveList, driveInfo, driveListFiles, driveCleanup, driveConfirm, drivePurgeExpired } from '@/server/controllers/drive';\nexport { default as DatabaseMongoDrive } from '@/server/database/mongoose/schema/drive';\nexport type { IDatabaseDriveDocument } from '@/server/database/mongoose/schema/drive';\nexport { driveFileSchemaZod } from '@/server/zod/schemas';\nexport { driveCreateUrl } from '@/client/utils';\nexport type { TDriveFile, TDriveInformation } from '@/types/client';\nexport type {\n TDriveDatabase,\n TDriveMode,\n TDriveInformationInput,\n TDriveConfigInformation,\n TDriveSecurityConfig,\n TDriveStorageConfig,\n TDriveCorsConfig,\n TDriveConfiguration,\n TDatabaseDriveStatus,\n TDatabaseDriveMetadataFile,\n TDatabaseDriveMetadataFolder,\n TDatabaseDriveInformation,\n TDatabaseDriveProvider,\n TDatabaseDriveMetadata,\n TDatabaseDrive,\n TDriveAction,\n TDriveAPIResponse,\n TDriveThumbnailSize,\n TDriveImageQuality,\n TMigration,\n TImageMetadata,\n TVideoMetadata,\n} from '@/types/server';\n"]}
1
+ {"version":3,"sources":["../src/server/actions/cors.ts","../src/server/security/crypto-utils.ts","../src/server/actions/public.ts","../src/server/actions/auth.ts","../src/server/zod/schemas.ts","../src/server/actions/drive.ts","../src/server/index.ts"],"names":["stream","authenticated"],"mappings":"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","file":"chunk-CLF77PSE.js","sourcesContent":["import type { NextApiRequest, NextApiResponse } from 'next';\nimport { getDriveConfig } from '@/server/config';\n\nexport const applyCorsHeaders = (req: NextApiRequest, res: NextApiResponse, config: ReturnType<typeof getDriveConfig>): boolean => {\n const cors = config.cors;\n if (!cors?.enabled) return false;\n\n const origin = req.headers.origin;\n const allowedOrigins = cors.origins ?? '*';\n const methods = cors.methods ?? ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'];\n const allowedHeaders = cors.allowedHeaders ?? ['Content-Type', 'Authorization', 'X-Drive-Account', 'Tus-Resumable', 'Upload-Length', 'Upload-Offset', 'Upload-Metadata', 'Upload-Concat', 'Upload-Defer-Length'];\n const exposedHeaders = cors.exposedHeaders ?? ['Content-Length', 'Content-Type', 'Content-Disposition', 'Location', 'Tus-Resumable', 'Upload-Length', 'Upload-Offset', 'Upload-Metadata', 'Upload-Expires', 'X-Drive-Item'];\n const credentials = cors.credentials ?? false;\n const maxAge = cors.maxAge ?? 86400;\n\n let allowOrigin: string | null = null;\n if (origin) {\n if (allowedOrigins === '*') {\n allowOrigin = origin;\n } else if (Array.isArray(allowedOrigins)) {\n if (allowedOrigins.includes(origin)) {\n allowOrigin = origin;\n }\n } else if (allowedOrigins === origin) {\n allowOrigin = origin;\n }\n } else if (allowedOrigins === '*') {\n allowOrigin = '*';\n }\n\n if (!allowOrigin) {\n if (req.method === 'OPTIONS') {\n res.status(403).end();\n return true;\n }\n return false;\n }\n\n res.setHeader('Access-Control-Allow-Origin', allowOrigin);\n res.setHeader('Access-Control-Allow-Methods', methods.join(', '));\n res.setHeader('Access-Control-Allow-Headers', allowedHeaders.join(', '));\n res.setHeader('Access-Control-Expose-Headers', exposedHeaders.join(', '));\n res.setHeader('Access-Control-Max-Age', maxAge.toString());\n\n if (credentials) {\n res.setHeader('Access-Control-Allow-Credentials', 'true');\n }\n\n if (req.method === 'OPTIONS') {\n res.status(204).end();\n return true;\n }\n\n return false;\n};\n","import crypto from 'crypto';\r\n\r\n/**\r\n * Constant-time string comparison to prevent timing attacks\r\n */\r\nexport function constantTimeCompare(a: string, b: string): boolean {\r\n\tif (a.length !== b.length) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tlet result = 0;\r\n\tfor (let i = 0; i < a.length; i++) {\r\n\t\tresult |= a.charCodeAt(i) ^ b.charCodeAt(i);\r\n\t}\r\n\r\n\treturn result === 0;\r\n}\r\n\r\n/**\r\n * Safe error message that doesn't leak sensitive information\r\n */\r\nexport function getSafeErrorMessage(error: unknown): string {\r\n\tif (error instanceof Error) {\r\n\t\t// Filter out sensitive patterns (case-insensitive)\r\n\t\tconst message = error.message.toLowerCase();\r\n\r\n\t\t// Don't expose database errors\r\n\t\tif (message.includes('mongo')) {\r\n\t\t\treturn 'Database operation failed';\r\n\t\t}\r\n\r\n\t\t// Don't expose file paths\r\n\t\tif (message.includes('/') || message.includes('\\\\')) {\r\n\t\t\treturn 'File operation failed';\r\n\t\t}\r\n\r\n\t\t// Don't expose validation details from internal libraries\r\n\t\tif (message.includes('validation') || message.includes('cast')) {\r\n\t\t\treturn 'Invalid input';\r\n\t\t}\r\n\r\n\t\t// Generic safe messages\r\n\t\treturn 'Operation failed';\r\n\t}\r\n\r\n\treturn 'Internal server error';\r\n}\r\n\r\n/**\r\n * Validate and sanitize Content-Disposition filename\r\n */\r\nexport function sanitizeContentDispositionFilename(filename: string): string {\r\n\t// Remove any path components\r\n\tconst basename = filename.replace(/^.*[\\\\\\/]/, '');\r\n\r\n\t// Remove or encode dangerous characters\r\n\treturn basename\r\n\t\t.replace(/[\"\\r\\n]/g, '')\r\n\t\t.replace(/[^\\x20-\\x7E]/g, '') // Remove non-printable ASCII\r\n\t\t.slice(0, 255);\r\n}\r\n","import type { NextApiRequest, NextApiResponse } from 'next';\nimport path from 'path';\nimport fs from 'fs';\nimport crypto from 'crypto';\nimport sharp from 'sharp';\nimport { getDriveConfig } from '@/server/config';\nimport Drive from '@/server/database/mongoose/schema/drive';\nimport { getImageSettings } from '@/server/utils';\nimport { sanitizeContentDispositionFilename } from '@/server/security/crypto-utils';\nimport { LocalStorageProvider } from '@/server/storage-adapters/local';\nimport { GoogleDriveProvider } from '@/server/storage-adapters/google';\n\nexport const handlePublicAction = async (\n req: NextApiRequest,\n res: NextApiResponse,\n action: string,\n config: ReturnType<typeof getDriveConfig>\n): Promise<boolean> => {\n if (action !== 'serve' && action !== 'thumbnail') {\n return false;\n }\n\n try {\n const { id, token } = req.query;\n if (!id || typeof id !== 'string') {\n res.status(400).json({ status: 400, message: 'Could not open file: missing or invalid file ID' });\n return true;\n }\n\n const drive = await Drive.findById(id);\n if (!drive) {\n res.status(404).json({ status: 404, message: 'File not found or no longer available' });\n return true;\n }\n\n if (config.security?.signedUrls?.enabled) {\n if (!token || typeof token !== 'string') {\n res.status(401).json({ status: 401, message: 'Access denied: this link is missing its access token' });\n return true;\n }\n\n try {\n const decoded = Buffer.from(token, 'base64url').toString();\n const [expiryStr, signature] = decoded.split(':');\n const expiry = parseInt(expiryStr, 10);\n\n if (Date.now() / 1000 > expiry) {\n res.status(401).json({ status: 401, message: 'Access denied: this link has expired' });\n return true;\n }\n\n const { secret } = config.security.signedUrls;\n const expectedSignature = crypto.createHmac('sha256', secret)\n .update(`${id}:${expiry}`)\n .digest('hex');\n\n if (signature !== expectedSignature) {\n res.status(401).json({ status: 401, message: 'Access denied: this link\\'s access token is invalid' });\n return true;\n }\n } catch {\n res.status(401).json({ status: 401, message: 'Access denied: this link\\'s access token is malformed' });\n return true;\n }\n }\n\n const itemProvider = drive.provider?.type === 'GOOGLE' ? GoogleDriveProvider : LocalStorageProvider;\n const itemAccountId = drive.storageAccountId ? drive.storageAccountId.toString() : undefined;\n\n if (action === 'thumbnail') {\n const stream = await itemProvider.getThumbnail(drive, itemAccountId);\n res.setHeader('Content-Type', 'image/webp');\n if (config.cors?.enabled) {\n res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');\n }\n stream.pipe(res);\n return true;\n }\n\n const { stream, mime, size: fileSize } = await itemProvider.openStream(drive, itemAccountId);\n const safeFilename = sanitizeContentDispositionFilename(drive.name);\n\n const format = req.query.format as string;\n const quality = req.query.quality as string;\n const display = req.query.display as string;\n const sizePreset = req.query.size as string;\n const fit = req.query.fit as string;\n const position = req.query.position as string;\n\n const isImage = mime.startsWith('image/');\n const shouldTransform = isImage && (format || quality || display || sizePreset || fit);\n\n res.setHeader('Content-Disposition', `inline; filename=\"${safeFilename}\"`);\n\n if (config.cors?.enabled) {\n res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');\n }\n\n if (shouldTransform) {\n try {\n const settings = getImageSettings(fileSize, quality, display, sizePreset, fit, position);\n\n let targetFormat = format || mime.split('/')[1];\n if (targetFormat === 'jpg') targetFormat = 'jpeg';\n if (!['jpeg', 'png', 'webp', 'avif'].includes(targetFormat)) {\n targetFormat = format || 'webp';\n }\n\n const cacheDir = path.join(config.storage.path, 'file', drive._id.toString(), 'cache');\n const cacheKey = [\n 'opt',\n `q${settings.quality}`,\n `e${settings.effort}`,\n settings.width ? `${settings.width}x${settings.height}` : 'orig',\n settings.fit || 'none',\n settings.position || 'c',\n targetFormat,\n ].join('_');\n const cachePath = path.join(cacheDir, `${cacheKey}.bin`);\n\n if (fs.existsSync(cachePath)) {\n const cacheStat = fs.statSync(cachePath);\n res.setHeader('Content-Type', `image/${targetFormat}`);\n res.setHeader('Content-Length', cacheStat.size);\n res.setHeader('Cache-Control', 'public, max-age=31536000, immutable');\n if (config.cors?.enabled) {\n res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');\n }\n if ('destroy' in stream) {\n (stream as NodeJS.ReadableStream & { destroy: () => void }).destroy();\n }\n fs.createReadStream(cachePath).pipe(res);\n return true;\n }\n\n if (!fs.existsSync(cacheDir)) fs.mkdirSync(cacheDir, { recursive: true });\n\n let pipeline = sharp();\n\n if (settings.width && settings.height) {\n pipeline = pipeline.resize(settings.width, settings.height, {\n fit: settings.fit || 'inside',\n position: settings.position || 'center',\n withoutEnlargement: true,\n background: { r: 0, g: 0, b: 0, alpha: 0 },\n });\n }\n\n if (targetFormat === 'jpeg') {\n pipeline = pipeline.jpeg({ quality: settings.quality, mozjpeg: true });\n res.setHeader('Content-Type', 'image/jpeg');\n } else if (targetFormat === 'png') {\n pipeline = pipeline.png({ compressionLevel: settings.pngCompression, adaptiveFiltering: true });\n res.setHeader('Content-Type', 'image/png');\n } else if (targetFormat === 'webp') {\n const webpEffort = Math.min(settings.effort, 6);\n pipeline = pipeline.webp({ quality: settings.quality, effort: webpEffort });\n res.setHeader('Content-Type', 'image/webp');\n } else if (targetFormat === 'avif') {\n pipeline = pipeline.avif({ quality: settings.quality, effort: settings.effort });\n res.setHeader('Content-Type', 'image/avif');\n }\n\n res.setHeader('Cache-Control', 'public, max-age=31536000, immutable');\n\n pipeline.on('error', (err) => {\n console.error('[next-drive] Pipeline error:', err);\n });\n\n stream.pipe(pipeline);\n\n pipeline.clone().toFile(cachePath).catch(e => console.error('[next-drive] Cache write failed:', e));\n pipeline.clone().pipe(res);\n return true;\n } catch (e) {\n console.error('[next-drive] Image transformation failed:', e);\n }\n }\n\n res.setHeader('Content-Type', mime);\n if (fileSize) res.setHeader('Content-Length', fileSize);\n stream.pipe(res);\n return true;\n } catch (error) {\n console.error(`[next-drive] Error in ${action}:`, error);\n const detail = error instanceof Error ? error.message : 'Something went wrong while serving the file';\n res.status(500).json({ status: 500, message: `Request \"${action}\" failed: ${detail}` });\n return true;\n }\n};\n","import type { NextApiRequest, NextApiResponse } from 'next';\nimport { google } from 'googleapis';\nimport { getDriveConfig } from '@/server/config';\nimport StorageAccount from '@/server/database/mongoose/schema/storage/account';\nimport Drive from '@/server/database/mongoose/schema/drive';\nimport { GoogleDriveProvider } from '@/server/storage-adapters/google';\n\nexport const handleAuthAction = async (\n req: NextApiRequest,\n res: NextApiResponse,\n action: string,\n config: ReturnType<typeof getDriveConfig>,\n owner: Record<string, unknown> | null\n): Promise<boolean> => {\n if (!['getAuthUrl', 'callback', 'listAccounts', 'removeAccount'].includes(action)) {\n return false;\n }\n\n switch (action) {\n case 'getAuthUrl': {\n const { provider } = req.query;\n if (provider === 'GOOGLE') {\n const { clientId, clientSecret, redirectUri } = config.storage?.google || {};\n if (!clientId || !clientSecret || !redirectUri) {\n res.status(500).json({ status: 500, message: 'Google Drive is not configured on the server' });\n return true;\n }\n\n const callbackUri = new URL(redirectUri);\n callbackUri.searchParams.set('action', 'callback');\n const oAuth2Client = new google.auth.OAuth2(clientId, clientSecret, callbackUri.toString());\n const state = Buffer.from(JSON.stringify({ owner })).toString('base64');\n const url = oAuth2Client.generateAuthUrl({\n access_type: 'offline',\n scope: ['https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/userinfo.email'],\n state,\n prompt: 'consent',\n });\n res.status(200).json({ status: 200, message: 'Auth URL generated', data: { url } });\n return true;\n }\n res.status(400).json({ status: 400, message: 'Unknown storage provider requested' });\n return true;\n }\n\n case 'callback': {\n const { code } = req.query;\n if (!code) {\n res.status(400).json({ status: 400, message: 'Google sign-in failed: authorization code missing' });\n return true;\n }\n\n const { clientId, clientSecret, redirectUri } = config.storage?.google || {};\n if (!clientId || !clientSecret || !redirectUri) {\n res.status(500).json({ status: 500, message: 'Google Drive sign-in is not configured on the server' });\n return true;\n }\n\n const callbackUri = new URL(redirectUri);\n callbackUri.searchParams.set('action', 'callback');\n const oAuth2Client = new google.auth.OAuth2(clientId, clientSecret, callbackUri.toString());\n\n const { tokens } = await oAuth2Client.getToken(code as string);\n oAuth2Client.setCredentials(tokens);\n\n const oauth2 = google.oauth2({ version: 'v2', auth: oAuth2Client });\n const userInfo = await oauth2.userinfo.get();\n\n const existing = await StorageAccount.findOne({ owner, 'metadata.google.email': userInfo.data.email, 'metadata.provider': 'GOOGLE' });\n if (existing) {\n existing.metadata.google.credentials = tokens as Record<string, unknown>;\n existing.markModified('metadata');\n await existing.save();\n } else {\n const newAccount = new StorageAccount({\n owner,\n name: userInfo.data.name || 'Google Drive',\n metadata: {\n provider: 'GOOGLE',\n google: {\n email: userInfo.data.email,\n credentials: tokens as Record<string, unknown>,\n },\n },\n });\n await newAccount.save();\n }\n\n res.setHeader('Content-Type', 'text/html');\n res.send(`<!DOCTYPE html>\n<html>\n<head><title>Authentication Complete</title></head>\n<body>\n<p>Authentication successful! This window will close automatically.</p>\n<script>\n(function() {\n\\tif (window.opener) {\n\\t\\ttry {\n\\t\\t\\twindow.opener.postMessage('oauth-success', '*');\n\\t\\t} catch (e) {}\n\\t}\n\\ttry {\n\\t\\tlocalStorage.setItem('next-drive-oauth-success', Date.now().toString());\n\\t\\tlocalStorage.removeItem('next-drive-oauth-success');\n\\t} catch (e) {}\n\\twindow.close();\n\\tsetTimeout(function() {\n\\t\\tdocument.body.innerHTML = '<p style=\"font-family: system-ui; text-align: center; margin-top: 50px;\">Authentication successful!<br>You can close this tab now.</p>';\n\\t}, 500);\n})();\n</script>\n</body>\n</html>`);\n return true;\n }\n\n case 'listAccounts': {\n const accounts = await StorageAccount.find({ owner });\n res.status(200).json({\n status: 200,\n data: {\n accounts: accounts.map(a => ({\n id: a._id.toString(),\n name: a.name,\n email: a.metadata.google?.email || '',\n provider: a.metadata.provider,\n })),\n },\n });\n return true;\n }\n\n case 'removeAccount': {\n const { id } = req.query;\n const account = await StorageAccount.findOne({ _id: id, owner });\n if (!account) {\n res.status(404).json({ status: 404, message: 'Could not disconnect: account not found' });\n return true;\n }\n\n if (account.metadata.provider === 'GOOGLE') {\n try {\n await GoogleDriveProvider.revokeToken(owner, account._id.toString());\n } catch (e) {\n console.error('Failed to revoke Google token:', e);\n }\n }\n\n await StorageAccount.deleteOne({ _id: id, owner });\n await Drive.deleteMany({ owner, storageAccountId: id });\n res.status(200).json({ status: 200, message: 'Account removed' });\n return true;\n }\n\n default:\n return false;\n }\n};\n","import { z } from 'zod';\r\nimport { isValidObjectId } from 'mongoose';\r\n\r\n// ** Custom ObjectId validator\r\nconst objectIdSchema = z.string().refine(val => isValidObjectId(val), {\r\n message: 'Invalid ObjectId format',\r\n});\r\n\r\n// ** Sanitize filename - remove path traversal and dangerous characters\r\nconst sanitizeFilename = (name: string): string => {\r\n return (\r\n name\r\n .replace(/[<>:\"|?*\\x00-\\x1F]/g, '') // Remove dangerous chars\r\n .replace(/^\\.+/, '') // Remove leading dots\r\n .replace(/\\.+$/, '') // Remove trailing dots\r\n .replace(/\\\\/g, '/') // Normalize slashes\r\n .replace(/\\/+/g, '/') // Remove duplicate slashes\r\n .replace(/\\.\\.\\//g, '') // Remove path traversal\r\n .replace(/\\.\\.+/g, '') // Remove remaining ..\r\n .split('/')\r\n .pop() ||\r\n '' // Take only the filename part (remove all paths)\r\n .trim()\r\n .slice(0, 255)\r\n ); // Limit length\r\n};\r\n\r\n// ** Sanitize search query for regex\r\nconst sanitizeRegexInput = (input: string): string => {\r\n // Escape regex special characters\r\n return input.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').slice(0, 100);\r\n};\r\n\r\n// ** File/Folder name schema\r\nconst nameSchema = z\r\n .string()\r\n .min(1, 'Name is required')\r\n .max(255, 'Name too long')\r\n .transform(sanitizeFilename)\r\n .refine(val => val.length > 0, { message: 'Invalid name after sanitization' });\r\n\r\n// ** List query schema\r\nexport const listQuerySchema = z.object({\r\n folderId: z.union([z.literal('root'), objectIdSchema, z.undefined()]),\r\n limit: z\r\n .string()\r\n .optional()\r\n .transform(val => {\r\n const num = parseInt(val || '50', 10);\r\n return Math.min(Math.max(1, num), 100);\r\n }),\r\n afterId: objectIdSchema.optional(),\r\n});\r\n\r\n// ** Serve query schema\r\nexport const serveQuerySchema = z.object({\r\n id: objectIdSchema,\r\n token: z.string().optional(),\r\n});\r\n\r\n// ** Thumbnail query schema\r\nexport const thumbnailQuerySchema = z.object({\r\n id: objectIdSchema,\r\n size: z.enum(['small', 'medium', 'large']).optional().default('medium'),\r\n token: z.string().optional(),\r\n});\r\n\r\n// ** Rename body schema\r\nexport const renameBodySchema = z.object({\r\n id: objectIdSchema,\r\n newName: nameSchema,\r\n});\r\n\r\n// ** Delete query schema\r\nexport const deleteQuerySchema = z.object({\r\n id: objectIdSchema,\r\n});\r\n\r\n// ** Delete many body schema\r\nexport const deleteManyBodySchema = z.object({\r\n ids: z.array(objectIdSchema).min(1).max(1000),\r\n});\r\n\r\n// ** Create folder body schema\r\nexport const createFolderBodySchema = z.object({\r\n name: nameSchema,\r\n parentId: z.union([z.literal('root'), objectIdSchema, z.string().length(0), z.undefined()]).optional(),\r\n});\r\n\r\n// ** Move body schema\r\nexport const moveBodySchema = z.object({\r\n ids: z.array(objectIdSchema).min(1).max(1000),\r\n targetFolderId: z.union([z.literal('root'), objectIdSchema, z.undefined()]).optional(),\r\n});\r\n\r\n// ** Reorder body schema\r\nexport const reorderBodySchema = z.object({\r\n ids: z.array(objectIdSchema).min(1).max(1000),\r\n});\r\n\r\n// ** Search query schema\r\nexport const searchQuerySchema = z.object({\r\n q: z.string().min(1).max(100).transform(sanitizeRegexInput),\r\n folderId: z.union([z.literal('root'), objectIdSchema, z.undefined()]).optional(),\r\n limit: z\r\n .string()\r\n .optional()\r\n .transform(val => {\r\n const num = parseInt(val || '50', 10);\r\n return Math.min(Math.max(1, num), 100);\r\n }),\r\n trashed: z\r\n .string()\r\n .optional()\r\n .transform(val => val === 'true'),\r\n});\r\n\r\n// ** Restore query schema\r\nexport const restoreQuerySchema = z.object({\r\n id: objectIdSchema,\r\n});\r\n\r\n// ** Purge trash query schema\r\nexport const purgeTrashQuerySchema = z.object({\r\n days: z.number().int().min(1).max(365).optional(),\r\n});\r\n\r\n// ** Drive File Schema (Public)\r\nexport const driveFileSchemaZod = z.object({\r\n id: z.string(),\r\n file: z.object({\r\n name: z.string(),\r\n mime: z.string(),\r\n size: z.number(),\r\n }),\r\n});\r\n\r\n// ** Constants\r\nexport const MAX_FOLDER_DEPTH = 50;\r\n\r\n// ** Export sanitization functions\r\nexport { sanitizeFilename, sanitizeRegexInput };\r\n","import type { NextApiRequest, NextApiResponse } from 'next';\nimport type { IncomingMessage, ServerResponse } from 'http';\nimport { getDriveConfig } from '@/server/config';\nimport * as schemas from '@/server/zod/schemas';\nimport { handleUpload } from '@/server/tus';\nimport type { TDatabaseDrive, TDriveConfigInformation } from '@/types/server';\nimport type { TStorageProvider } from '@/types/server/storage';\nimport { GoogleDriveProvider } from '@/server/storage-adapters/google';\nimport { LocalStorageProvider } from '@/server/storage-adapters/local';\nimport { withSignedUrl, withSignedUrls, Drive } from '@/server/actions/shared';\nimport { resolveProvider } from '@/server/actions/shared';\n\ntype TDriveActionContext = {\n req: NextApiRequest;\n res: NextApiResponse;\n action: string;\n config: ReturnType<typeof getDriveConfig>;\n owner: Record<string, unknown> | null;\n isRootMode: boolean;\n authenticated: boolean;\n information: TDriveConfigInformation;\n provider: TStorageProvider;\n accountId?: string;\n};\n\nexport const handleDriveAction = async (ctx: TDriveActionContext): Promise<void> => {\n const { req, res, action, config, owner, isRootMode, authenticated, information, provider, accountId } = ctx;\n\n switch (action) {\n case 'list': {\n if (req.method !== 'GET') return void res.status(405).json({ status: 405, message: 'Listing files requires a GET request' });\n const listQuery = schemas.listQuerySchema.safeParse(req.query);\n if (!listQuery.success) return void res.status(400).json({ status: 400, message: 'Could not list files: invalid request parameters' });\n\n const { folderId, limit, afterId } = listQuery.data;\n\n try {\n await provider.sync(folderId || 'root', owner, accountId);\n } catch (e) {\n console.error('Sync failed', e);\n }\n\n const query: Record<string, unknown> = {\n 'provider.type': provider.name,\n storageAccountId: accountId || null,\n parentId: folderId === 'root' || !folderId ? null : folderId,\n trashedAt: null,\n };\n\n if (!isRootMode) {\n query.owner = owner;\n }\n\n if (afterId) query._id = { $lt: afterId };\n\n const items = await Drive.find(query, {}, { sort: { order: 1, _id: -1 }, limit });\n const plainItems = withSignedUrls(await Promise.all(items.map(item => item.toClient())), config);\n\n res.status(200).json({ status: 200, message: 'Items retrieved', data: { items: plainItems, hasMore: items.length === limit } });\n return;\n }\n\n case 'search': {\n const searchData = schemas.searchQuerySchema.safeParse(req.query);\n if (!searchData.success) return void res.status(400).json({ status: 400, message: 'Could not search: invalid request parameters' });\n const { q, folderId, limit, trashed } = searchData.data;\n\n if (!trashed) {\n try {\n await provider.search(q, owner, accountId);\n } catch (e) {\n console.error('Search sync failed', e);\n }\n }\n\n const query: Record<string, unknown> = {\n 'provider.type': provider.name,\n storageAccountId: accountId || null,\n trashedAt: trashed ? { $ne: null } : null,\n name: { $regex: q, $options: 'i' },\n };\n\n if (!isRootMode) {\n query.owner = owner;\n }\n\n if (folderId && folderId !== 'root') query.parentId = folderId;\n\n const items = await Drive.find(query, {}, { limit, sort: { createdAt: -1 } });\n const plainItems = withSignedUrls(await Promise.all(items.map(i => i.toClient())), config);\n\n res.status(200).json({ status: 200, message: 'Results', data: { items: plainItems } });\n return;\n }\n\n case 'upload': {\n // ** tus resumable upload protocol owns POST/HEAD/PATCH/DELETE for `?action=upload`.\n // ** Context is passed to the tus hooks (src/server/tus.ts) via the web Request.\n await handleUpload(req as unknown as IncomingMessage, res as unknown as ServerResponse, { config, owner, authenticated, isRootMode, information, provider, accountId });\n return;\n }\n\n case 'createFolder': {\n const folderData = schemas.createFolderBodySchema.safeParse(req.body);\n if (!folderData.success) return void res.status(400).json({ status: 400, message: folderData.error.errors[0].message });\n const { name, parentId } = folderData.data;\n\n const item = withSignedUrl(await provider.createFolder(name, parentId ?? null, owner, accountId), config);\n res.status(201).json({ status: 201, message: 'Folder created', data: { item } });\n return;\n }\n\n case 'delete': {\n const deleteData = schemas.deleteQuerySchema.safeParse(req.query);\n if (!deleteData.success) return void res.status(400).json({ status: 400, message: 'Could not move to trash: invalid ID' });\n const { id } = deleteData.data;\n const drive = await Drive.findById(id);\n if (!drive) return void res.status(404).json({ status: 404, message: 'Could not move to trash: item not found' });\n\n const itemProvider = drive.provider?.type === 'GOOGLE' ? GoogleDriveProvider : LocalStorageProvider;\n const itemAccountId = drive.storageAccountId ? drive.storageAccountId.toString() : undefined;\n\n try {\n await itemProvider.trash([id], owner, itemAccountId);\n } catch (e) {\n console.error('Provider trash failed:', e);\n }\n\n drive.trashedAt = new Date();\n await drive.save();\n res.status(200).json({ status: 200, message: 'Moved to trash', data: null });\n return;\n }\n\n case 'deletePermanent': {\n const deleteData = schemas.deleteQuerySchema.safeParse(req.query);\n if (!deleteData.success) return void res.status(400).json({ status: 400, message: 'Could not delete: invalid ID' });\n const { id } = deleteData.data;\n await provider.delete([id], owner, accountId);\n const quota = await provider.getQuota(owner, accountId, information.storage.quotaInBytes);\n res.status(200).json({ status: 200, message: 'Deleted', statistic: { storage: quota } });\n return;\n }\n\n case 'quota': {\n const quota = await provider.getQuota(owner, accountId, information.storage.quotaInBytes);\n res.status(200).json({\n status: 200,\n message: 'Quota retrieved',\n data: {\n usedInBytes: quota.usedInBytes,\n totalInBytes: quota.quotaInBytes,\n availableInBytes: Math.max(0, quota.quotaInBytes - quota.usedInBytes),\n percentage: quota.quotaInBytes > 0 ? Math.round((quota.usedInBytes / quota.quotaInBytes) * 100) : 0,\n },\n statistic: { storage: quota },\n });\n return;\n }\n\n case 'trash': {\n try {\n const { provider: trashProvider, accountId: trashAccountId } = await resolveProvider(req, owner);\n await trashProvider.syncTrash(owner, trashAccountId);\n } catch (e) {\n console.error('Trash sync failed', e);\n }\n\n const query: Record<string, unknown> = {\n owner,\n 'provider.type': provider.name,\n storageAccountId: accountId || null,\n trashedAt: { $ne: null },\n };\n\n const items = await Drive.find(query, {}, { sort: { trashedAt: -1 } });\n const plainItems = withSignedUrls(await Promise.all(items.map(item => item.toClient())), config);\n\n res.status(200).json({ status: 200, message: 'Trash items', data: { items: plainItems, hasMore: false } });\n return;\n }\n\n case 'restore': {\n const restoreData = schemas.deleteQuerySchema.safeParse(req.query);\n if (!restoreData.success) return void res.status(400).json({ status: 400, message: 'Could not restore: invalid ID' });\n const { id } = restoreData.data;\n const drive = await Drive.findById(id);\n if (!drive) return void res.status(404).json({ status: 404, message: 'Could not restore: item not found' });\n\n let targetParentId = drive.parentId;\n if (targetParentId) {\n const parent = await Drive.findById(targetParentId);\n if (parent?.trashedAt) {\n targetParentId = null;\n }\n }\n\n const itemProvider = drive.provider?.type === 'GOOGLE' ? GoogleDriveProvider : LocalStorageProvider;\n const itemAccountId = drive.storageAccountId ? drive.storageAccountId.toString() : undefined;\n\n try {\n await itemProvider.untrash([id], owner, itemAccountId);\n if (targetParentId !== drive.parentId) {\n await itemProvider.move(id, targetParentId?.toString() ?? null, owner, itemAccountId);\n }\n } catch (e) {\n console.error('Provider restore failed:', e);\n }\n\n drive.trashedAt = null;\n drive.parentId = targetParentId;\n await drive.save();\n\n res.status(200).json({\n status: 200,\n message: targetParentId === null && drive.parentId !== null ? 'Restored to root (parent folder was trashed)' : 'Restored',\n data: null,\n });\n return;\n }\n\n case 'move': {\n const moveData = schemas.moveBodySchema.safeParse(req.body);\n if (!moveData.success) return void res.status(400).json({ status: 400, message: 'Could not move: invalid request data' });\n const { ids, targetFolderId } = moveData.data;\n\n const items: TDatabaseDrive[] = [];\n const effectiveTargetId = targetFolderId === 'root' || !targetFolderId ? null : targetFolderId;\n\n for (const id of ids) {\n try {\n const item = await provider.move(id, effectiveTargetId, owner, accountId);\n items.push(item);\n } catch (e) {\n console.error(`Failed to move item ${id}`, e);\n }\n }\n\n res.status(200).json({ status: 200, message: 'Moved', data: { items: withSignedUrls(items, config) } });\n return;\n }\n\n case 'reorder': {\n if (req.method !== 'POST') {\n return void res.status(405).json({ status: 405, message: 'Reordering requires a POST request' });\n }\n\n const reorderData = schemas.reorderBodySchema.safeParse(req.body);\n if (!reorderData.success) {\n return void res.status(400).json({ status: 400, message: 'Could not reorder: invalid request data' });\n }\n\n const { ids } = reorderData.data;\n\n const query: Record<string, unknown> = {\n _id: { $in: ids },\n 'provider.type': provider.name,\n storageAccountId: accountId || null,\n trashedAt: null,\n };\n\n if (!isRootMode) {\n query.owner = owner;\n }\n\n const existingItems = await Drive.find(query, { _id: 1, parentId: 1 });\n if (existingItems.length !== ids.length) {\n return void res.status(404).json({ status: 404, message: 'Could not reorder: one or more items were not found' });\n }\n\n const parentIds = new Set(existingItems.map(item => (item.parentId ? item.parentId.toString() : 'root')));\n if (parentIds.size > 1) {\n return void res.status(400).json({ status: 400, message: 'Could not reorder: all items must be in the same folder' });\n }\n\n const operations = ids.map((id, order) => ({\n updateOne: {\n filter: {\n _id: id,\n 'provider.type': provider.name,\n storageAccountId: accountId || null,\n trashedAt: null,\n ...(isRootMode ? {} : { owner }),\n },\n update: { $set: { order } },\n },\n }));\n\n await Drive.bulkWrite(operations as never);\n\n const updatedItems = await Drive.find(query, {}, { sort: { order: 1 } });\n const plainItems = withSignedUrls(await Promise.all(updatedItems.map(item => item.toClient())), config);\n\n res.status(200).json({ status: 200, message: 'Reordered', data: { items: plainItems } });\n return;\n }\n\n case 'rename': {\n const renameData = schemas.renameBodySchema.safeParse({ id: req.query.id, ...req.body });\n if (!renameData.success) return void res.status(400).json({ status: 400, message: 'Could not rename: invalid request data' });\n const { id, newName } = renameData.data;\n const item = withSignedUrl(await provider.rename(id, newName, owner, accountId), config);\n res.status(200).json({ status: 200, message: 'Renamed', data: { item } });\n return;\n }\n\n default: {\n res.status(400).json({ status: 400, message: `Unknown action requested: \"${action}\"` });\n return;\n }\n }\n};\n","import type { NextApiRequest, NextApiResponse } from 'next';\n\nimport { getDriveConfig, getDriveInformation, driveConfiguration } from '@/server/config';\nimport { applyCorsHeaders } from '@/server/actions/cors';\nimport { handlePublicAction } from '@/server/actions/public';\nimport { handleAuthAction } from '@/server/actions/auth';\nimport { handleDriveAction } from '@/server/actions/drive';\nimport { resolveProvider } from '@/server/actions/shared';\n\n// ** Parse the raw request body as JSON.\n// ** Needed because Next.js Pages Router disables the built-in body parser (config.api.bodyParser = false)\n// ** so that multipart/form-data uploads can be streamed directly to formidable. That leaves `req.body`\n// ** as `undefined` for every other (JSON) action unless we parse it ourselves here.\n// ** Only safe to call for Node-stream-based requests (Next.js, Express); other adapters (e.g. Hono)\n// ** don't expose `.on()` and are expected to populate `req.body` themselves before calling the handler.\nconst parseJsonBody = (req: NextApiRequest): Promise<Record<string, unknown>> => {\n return new Promise((resolve) => {\n try {\n const chunks: Buffer[] = [];\n req.on('data', (chunk: Buffer) => chunks.push(chunk));\n req.on('end', () => {\n const raw = Buffer.concat(chunks).toString();\n if (!raw) return resolve({});\n try {\n resolve(JSON.parse(raw));\n } catch {\n resolve({});\n }\n });\n req.on('error', () => resolve({}));\n } catch {\n resolve({});\n }\n });\n};\n\n// ** Main API handler for all drive operations\nexport const driveAPIHandler = async (req: NextApiRequest, res: NextApiResponse): Promise<void> => {\n // ** Only parse manually when the body hasn't already been parsed (e.g. by Express's json middleware)\n // ** and the request object actually supports Node-style streaming (`.on`). Frameworks that already\n // ** populate `req.body` (even with `{}`) or don't expose `.on()` are left untouched.\n if (req.body === undefined && typeof req.on === 'function' && (req.headers['content-type'] || '').includes('application/json')) {\n req.body = await parseJsonBody(req);\n } else if (req.body === undefined) {\n req.body = {};\n }\n\n\n const action = (req.query.action as string) || (req.query.code && req.query.state ? 'callback' : undefined);\n\n let config: ReturnType<typeof getDriveConfig>;\n try {\n config = getDriveConfig();\n } catch (error) {\n console.error('[next-drive] Configuration error:', error);\n res.status(500).json({ status: 500, message: 'Drive is not ready: failed to initialize configuration' });\n return;\n }\n\n const isPreflightHandled = applyCorsHeaders(req, res, config);\n if (isPreflightHandled) return;\n\n if (!action) {\n res.status(400).json({ status: 400, message: 'Missing \"action\" parameter in request' });\n return;\n }\n\n const wasPublicHandled = await handlePublicAction(req, res, action, config);\n if (wasPublicHandled) return;\n\n try {\n const mode = config.mode || 'NORMAL';\n\n if (action === 'information') {\n const { clientId, clientSecret, redirectUri } = config.storage?.google || {};\n const googleConfigured = !!(clientId && clientSecret && redirectUri);\n\n let authenticated = false;\n try {\n await getDriveInformation({ method: 'REQUEST', req });\n authenticated = true;\n } catch {\n authenticated = false;\n }\n\n res.status(200).json({\n status: 200,\n message: 'Information retrieved',\n data: {\n providers: {\n google: googleConfigured,\n },\n mode,\n authenticated,\n unauthenticatedUploads: !!config.security?.unauthenticated?.enabled,\n },\n });\n return;\n }\n\n const isRootMode = mode === 'ROOT';\n\n // Resolve the caller. Anonymous visitors are allowed only for one-time uploads\n // (when enabled); every other action keeps requiring authentication.\n let information: Awaited<ReturnType<typeof getDriveInformation>>;\n let authenticated = true;\n try {\n information = await getDriveInformation({ method: 'REQUEST', req });\n } catch (err) {\n if (action === 'upload' && config.security?.unauthenticated?.enabled) {\n information = { key: null, storage: { quotaInBytes: 0 } };\n authenticated = false;\n } else {\n throw err;\n }\n }\n const { key: owner } = information;\n\n const wasAuthHandled = await handleAuthAction(req, res, action, config, owner);\n if (wasAuthHandled) return;\n\n const { provider, accountId } = await resolveProvider(req, owner);\n\n await handleDriveAction({\n req,\n res,\n action,\n config,\n owner,\n isRootMode,\n authenticated,\n information,\n provider,\n accountId,\n });\n } catch (error: unknown) {\n console.error(`[next-drive] Error handling action ${action}:`, error);\n const detail = error instanceof Error ? error.message : 'Something went wrong while processing your request';\n res.status(500).json({ status: 500, message: `Request \"${action}\" failed: ${detail}` });\n }\n};\n\nexport { driveConfiguration, getDriveConfig, getDriveInformation };\nexport { driveGetUrl, driveReadFile, driveFilePath, driveUpload, driveDelete, driveList, driveInfo, driveListFiles, driveCleanup, driveConfirm, drivePurgeExpired } from '@/server/controllers/drive';\nexport { default as DatabaseMongoDrive } from '@/server/database/mongoose/schema/drive';\nexport type { IDatabaseDriveDocument } from '@/server/database/mongoose/schema/drive';\nexport { driveFileSchemaZod } from '@/server/zod/schemas';\nexport { driveCreateUrl } from '@/client/utils';\nexport type { TDriveFile, TDriveInformation } from '@/types/client';\nexport type {\n TDriveDatabase,\n TDriveMode,\n TDriveInformationInput,\n TDriveConfigInformation,\n TDriveSecurityConfig,\n TDriveStorageConfig,\n TDriveCorsConfig,\n TDriveConfiguration,\n TDatabaseDriveStatus,\n TDatabaseDriveMetadataFile,\n TDatabaseDriveMetadataFolder,\n TDatabaseDriveInformation,\n TDatabaseDriveProvider,\n TDatabaseDriveMetadata,\n TDatabaseDrive,\n TDriveAction,\n TDriveAPIResponse,\n TDriveThumbnailSize,\n TDriveImageQuality,\n TMigration,\n TImageMetadata,\n TVideoMetadata,\n} from '@/types/server';\n"]}
@@ -3,9 +3,9 @@
3
3
  var fs = require('fs');
4
4
  var path = require('path');
5
5
  var stream = require('stream');
6
+ var mongoose = require('mongoose');
6
7
  var server = require('@tus/server');
7
8
  var fileStore = require('@tus/file-store');
8
- var mongoose = require('mongoose');
9
9
  var os2 = require('os');
10
10
  var crypto2 = require('crypto');
11
11
  var sharp2 = require('sharp');
@@ -263,7 +263,7 @@ var getGlobal = () => {
263
263
  config: null,
264
264
  migrationPromise: null,
265
265
  initialized: false,
266
- abuse: { ipHits: /* @__PURE__ */ new Map(), concurrent: 0 }
266
+ abuse: { ipHits: /* @__PURE__ */ new Map(), active: /* @__PURE__ */ new Map(), lastSweep: 0 }
267
267
  };
268
268
  }
269
269
  return globalThis[GLOBAL_KEY];
@@ -1717,7 +1717,7 @@ var driveCleanup = async () => {
1717
1717
  }
1718
1718
  }
1719
1719
  try {
1720
- const { getTusServer: getTusServer2 } = await import('./tus-P67YULWB.cjs');
1720
+ const { getTusServer: getTusServer2 } = await import('./tus-JZQ3PKBS.cjs');
1721
1721
  await getTusServer2().cleanUpExpiredUploads();
1722
1722
  } catch (e) {
1723
1723
  console.error("[next-drive] Failed to clean up expired tus uploads:", e);
@@ -1770,10 +1770,13 @@ var withSignedUrls = (items, config) => {
1770
1770
  // src/server/tus.ts
1771
1771
  var UPLOAD_EXPIRATION_MS = 24 * 60 * 60 * 1e3;
1772
1772
  var getCtx = (req) => req.__driveCtx;
1773
- var decConcurrent = () => {
1774
- const abuse = globalThis.__nextDrive?.abuse;
1775
- if (abuse) abuse.concurrent = Math.max(0, abuse.concurrent - 1);
1773
+ var abuseStore = () => globalThis.__nextDrive.abuse;
1774
+ var countActiveAnon = (store) => {
1775
+ const cutoff = Date.now() - UPLOAD_EXPIRATION_MS;
1776
+ for (const [id, ts] of store.active) if (ts < cutoff) store.active.delete(id);
1777
+ return store.active.size;
1776
1778
  };
1779
+ var releaseSlot = (id) => abuseStore()?.active.delete(id);
1777
1780
  var getTusServer = () => {
1778
1781
  const g = globalThis;
1779
1782
  g.__nextDrive = g.__nextDrive ?? {};
@@ -1796,7 +1799,14 @@ var getTusServer = () => {
1796
1799
  },
1797
1800
  // ** Keep the upload id in the query string so every method stays on `?action=upload`.
1798
1801
  generateUrl: (_req, { path: p, id }) => `${p}?action=upload&id=${id}`,
1799
- getFileIdFromRequest: (req) => new URL(req.url, "http://x").searchParams.get("id") ?? void 0,
1802
+ // ** SECURITY: the id becomes a filesystem path inside FileStore (fs.unlink/read/resolve), and it
1803
+ // ** arrives from the client-controlled query string. Only accept the exact format our
1804
+ // ** namingFunction produces (32 lowercase hex) so a crafted `?id=../../..` cannot traverse out
1805
+ // ** of the upload dir (which would allow arbitrary file read/delete). Anything else -> 404.
1806
+ getFileIdFromRequest: (req) => {
1807
+ const id = new URL(req.url, "http://x").searchParams.get("id");
1808
+ return id && /^[a-f0-9]{32}$/.test(id) ? id : void 0;
1809
+ },
1800
1810
  onUploadCreate: async (req, upload) => {
1801
1811
  const ctx = getCtx(req);
1802
1812
  if (!ctx) throw { status_code: 500, body: "Could not upload: request context is missing" };
@@ -1810,22 +1820,30 @@ var getTusServer = () => {
1810
1820
  if (fileType && !validateMimeType(fileType, unauth.allowedMimeTypes)) throw { status_code: 400, body: `Could not upload: file type "${fileType}" is not allowed` };
1811
1821
  const abuse = unauth.abuse;
1812
1822
  if (abuse) {
1813
- const store = globalThis.__nextDrive.abuse;
1823
+ const store = abuseStore();
1814
1824
  const now = Date.now();
1825
+ if (now - store.lastSweep > 6e4) {
1826
+ store.lastSweep = now;
1827
+ for (const [seenIp, seenHits] of store.ipHits) {
1828
+ const fresh = seenHits.filter((t) => now - t < 36e5);
1829
+ if (fresh.length) store.ipHits.set(seenIp, fresh);
1830
+ else store.ipHits.delete(seenIp);
1831
+ }
1832
+ }
1815
1833
  const nreq = req.__nodeReq;
1816
1834
  const ip = (nreq && abuse.clientId?.(nreq)) ?? (abuse.trustedHeaders ?? ["cf-connecting-ip", "x-forwarded-for"]).map((h) => req.headers.get(h)).find(Boolean)?.split(",")[0].trim() ?? nreq?.socket?.remoteAddress ?? "unknown";
1817
1835
  const hits = (store.ipHits.get(ip) ?? []).filter((t) => now - t < 36e5);
1818
1836
  const perIp = abuse.perIp;
1819
1837
  if (perIp && hits.filter((t) => now - t < perIp.windowMinutes * 6e4).length >= perIp.max) throw { status_code: 429, body: "Too many uploads, please try again later" };
1820
1838
  if (abuse.hourlyPerIp && hits.length >= abuse.hourlyPerIp) throw { status_code: 429, body: "Hourly upload limit reached, please try again later" };
1821
- if (abuse.maxConcurrent && store.concurrent >= abuse.maxConcurrent) throw { status_code: 429, body: "Server is busy with uploads, please try again later" };
1839
+ if (abuse.maxConcurrent && countActiveAnon(store) >= abuse.maxConcurrent) throw { status_code: 429, body: "Server is busy with uploads, please try again later" };
1822
1840
  if (abuse.maxLiveBytes) {
1823
1841
  const [agg] = await drive_default.aggregate([{ $match: { expiresAt: { $ne: null } } }, { $group: { _id: null, total: { $sum: "$information.sizeInBytes" } } }]);
1824
1842
  if ((agg?.total ?? 0) + size > abuse.maxLiveBytes) throw { status_code: 429, body: "Temporary storage is full, please try again later" };
1825
1843
  }
1826
1844
  hits.push(now);
1827
1845
  store.ipHits.set(ip, hits);
1828
- store.concurrent++;
1846
+ store.active.set(upload.id, now);
1829
1847
  }
1830
1848
  } else {
1831
1849
  if (fileType && config2.security && !validateMimeType(fileType, config2.security.allowedMimeTypes)) throw { status_code: 400, body: `Could not upload: file type "${fileType}" is not allowed` };
@@ -1839,17 +1857,38 @@ var getTusServer = () => {
1839
1857
  onUploadFinish: async (req, upload) => {
1840
1858
  const ctx = getCtx(req);
1841
1859
  if (!ctx) throw { status_code: 500, body: "Could not finish upload: request context is missing" };
1842
- const { config: config2, authenticated, owner, provider, accountId } = ctx;
1860
+ const { config: config2, authenticated, owner, provider, accountId, information, isRootMode } = ctx;
1843
1861
  const meta = upload.metadata ?? {};
1862
+ const size = upload.size ?? 0;
1844
1863
  const filePath = upload.storage?.path ?? path__default.default.join(tusDir, upload.id);
1864
+ const ownerValue = authenticated ? owner : null;
1865
+ if (!authenticated) releaseSlot(upload.id);
1845
1866
  const already = await drive_default.findOne({ "meta.tusId": upload.id });
1846
1867
  if (already) return { headers: { "X-Drive-Item": encodeURIComponent(JSON.stringify(withSignedUrl(await already.toClient(), config2))) } };
1847
- const ownerValue = authenticated ? owner : null;
1848
- const parentId = !authenticated || !meta.folderId || meta.folderId === "root" ? null : meta.folderId;
1849
- let name = meta.filename || "file";
1868
+ if (!authenticated) {
1869
+ const unauth = config2.security?.unauthenticated;
1870
+ if (!unauth?.enabled) throw { status_code: 401, body: "Authentication required to upload" };
1871
+ if (size > unauth.maxUploadSizeInBytes) throw { status_code: 413, body: "Could not upload: file exceeds the maximum allowed size" };
1872
+ if (unauth.abuse?.maxLiveBytes) {
1873
+ const [agg] = await drive_default.aggregate([{ $match: { expiresAt: { $ne: null } } }, { $group: { _id: null, total: { $sum: "$information.sizeInBytes" } } }]);
1874
+ if ((agg?.total ?? 0) + size > unauth.abuse.maxLiveBytes) throw { status_code: 429, body: "Temporary storage is full, please try again later" };
1875
+ }
1876
+ } else if (!isRootMode) {
1877
+ if (config2.security && size > config2.security.maxUploadSizeInBytes) throw { status_code: 413, body: "Could not upload: file exceeds the maximum allowed size" };
1878
+ const quota = await provider.getQuota(owner, accountId, information.storage.quotaInBytes);
1879
+ if (quota.usedInBytes + size > quota.quotaInBytes) throw { status_code: 413, body: "Could not upload: you have run out of storage space" };
1880
+ }
1881
+ let parentId = null;
1882
+ if (authenticated && meta.folderId && meta.folderId !== "root") {
1883
+ if (!mongoose.isValidObjectId(meta.folderId)) throw { status_code: 400, body: "Could not upload: invalid target folder" };
1884
+ const folder = await drive_default.findOne({ _id: meta.folderId, owner: ownerValue, storageAccountId: accountId || null, "information.type": "FOLDER", trashedAt: null });
1885
+ if (!folder) throw { status_code: 404, body: "Could not upload: target folder was not found" };
1886
+ parentId = meta.folderId;
1887
+ }
1888
+ let name = (meta.filename || "file").replace(/[/\\]/g, "_").replace(/[\x00-\x1f<>:"|?*]/g, "").replace(/^\.+/, "").trim().slice(0, 255) || "file";
1850
1889
  let replaceTargetId = null;
1851
1890
  const dupeQuery = { owner: ownerValue, storageAccountId: accountId || null, "provider.type": provider.name, parentId, "information.type": "FILE", trashedAt: null };
1852
- if (meta.conflictAction === "replace") {
1891
+ if (authenticated && meta.conflictAction === "replace") {
1853
1892
  const existing = await drive_default.findOne({ ...dupeQuery, name });
1854
1893
  if (existing) replaceTargetId = String(existing._id);
1855
1894
  } else {
@@ -1865,7 +1904,7 @@ var getTusServer = () => {
1865
1904
  name,
1866
1905
  parentId,
1867
1906
  order: 0,
1868
- information: { type: "FILE", sizeInBytes: upload.size ?? 0, mime: meta.filetype || "application/octet-stream", path: "" },
1907
+ information: { type: "FILE", sizeInBytes: size, mime: meta.filetype || "application/octet-stream", path: "" },
1869
1908
  status: "UPLOADING",
1870
1909
  expiresAt: authenticated ? null : new Date(Date.now() + (config2.security?.unauthenticated?.ttlMinutes ?? 60) * 6e4),
1871
1910
  meta: { tusId: upload.id }
@@ -1877,19 +1916,15 @@ var getTusServer = () => {
1877
1916
  if (replaceTargetId) await provider.delete([replaceTargetId], ownerValue, accountId);
1878
1917
  fs__default.default.rmSync(filePath, { force: true });
1879
1918
  fs__default.default.rmSync(`${filePath}.json`, { force: true });
1880
- if (!authenticated) decConcurrent();
1881
1919
  return { headers: { "X-Drive-Item": encodeURIComponent(JSON.stringify(withSignedUrl(item, config2))) } };
1882
1920
  } catch (err) {
1883
1921
  await drive_default.deleteOne({ _id: drive._id });
1884
- if (!authenticated) decConcurrent();
1885
- throw { status_code: 500, body: err instanceof Error ? err.message : "Could not finish upload" };
1922
+ console.error("[next-drive] Upload finalize failed:", err);
1923
+ throw { status_code: 500, body: "Could not finish upload" };
1886
1924
  }
1887
1925
  }
1888
1926
  });
1889
- server$1.on(server.EVENTS.POST_TERMINATE, (req) => {
1890
- const ctx = getCtx(req);
1891
- if (ctx && !ctx.authenticated) decConcurrent();
1892
- });
1927
+ server$1.on(server.EVENTS.POST_TERMINATE, (_req, _res, id) => releaseSlot(id));
1893
1928
  g.__nextDrive.tus = server$1;
1894
1929
  return server$1;
1895
1930
  };
@@ -1942,5 +1977,5 @@ exports.handleUpload = handleUpload;
1942
1977
  exports.resolveProvider = resolveProvider;
1943
1978
  exports.withSignedUrl = withSignedUrl;
1944
1979
  exports.withSignedUrls = withSignedUrls;
1945
- //# sourceMappingURL=chunk-45FZNILV.cjs.map
1946
- //# sourceMappingURL=chunk-45FZNILV.cjs.map
1980
+ //# sourceMappingURL=chunk-DUTHZ5HA.cjs.map
1981
+ //# sourceMappingURL=chunk-DUTHZ5HA.cjs.map