| 189 | * @returns {void} | 190 | * @returns {void} |
| 190 | */ | 191 | */ |
| 191 | router.post('/download', async (request, response) => { | 192 | router.post('/download', async (request, response) => { |
| 192 | const url = request.body.url; | 193 | try { |
| 193 | const inputCategory = request.body.category; | 194 | if (!isValidUrl(request.body.url)) { |
| | 195 | console.warn('Asset download failed: Must be a valid URL'); |
| | 196 | return response.sendStatus(400); |
| | 197 | } |
| 194 | | 198 | |
| 195 | // Check category | 199 | const url = String(request.body.url); |
| 196 | let category = null; | 200 | const inputCategory = request.body.category; |
| 197 | for (let i of VALID_CATEGORIES) | | |
| 198 | if (i == inputCategory) | | |
| 199 | category = i; | | |
| 200 | | 201 | |
| 201 | if (category === null) { | 202 | const host = getHostFromUrl(url); |
| 202 | console.error('Bad request: unsupported asset category.'); | 203 | if (!isHostWhitelisted(host)) { |
| 203 | return response.sendStatus(400); | 204 | console.error(`Received an import for "${host}", but site is not whitelisted. This domain must be added to the config key "whitelistImportDomains" to allow import from this source.`); |
| 204 | } | 205 | return response.sendStatus(404); |
| | 206 | } |
| 205 | | 207 | |
| 206 | // Validate filename | 208 | // Check category |
| 207 | ensureFoldersExist(request.user.directories); | 209 | let category = null; |
| 208 | const validation = validateAssetFileName(request.body.filename); | 210 | for (let i of VALID_CATEGORIES) |
| 209 | if (validation.error) | 211 | if (i == inputCategory) |
| 210 | return response.status(400).send(validation.message); | 212 | category = i; |
| 211 | | 213 | |
| 212 | const temp_path = path.join(request.user.directories.assets, 'temp', request.body.filename); | 214 | if (category === null) { |
| 213 | const file_path = path.join(request.user.directories.assets, category, request.body.filename); | 215 | console.error('Bad request: unsupported asset category.'); |
| 214 | console.info('Request received to download', url, 'to', file_path); | 216 | return response.sendStatus(400); |
| | 217 | } |
| | 218 | |
| | 219 | // Validate filename |
| | 220 | ensureFoldersExist(request.user.directories); |
| | 221 | const validation = validateAssetFileName(request.body.filename); |
| | 222 | if (validation.error) |
| | 223 | return response.status(400).send(validation.message); |
| | 224 | |
| | 225 | const temp_path = path.join(request.user.directories.assets, 'temp', request.body.filename); |
| | 226 | const file_path = path.join(request.user.directories.assets, category, request.body.filename); |
| | 227 | console.info('Request received to download', url, 'to', file_path); |
| 215 | | 228 | |
| 216 | try { | | |
| 217 | // Download to temp | 229 | // Download to temp |
| 218 | const res = await fetch(url); | 230 | const res = await fetch(url); |
| 219 | if (!res.ok || res.body === null) { | 231 | if (!res.ok || res.body === null) { |