| 189 | 190 | * @returns {void} |
| 190 | 191 | */ |
| 191 | 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 | 208 | // ValidateCheck filenamecategory |
| 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 | 229 | // Download to temp |
| 218 | 230 | const res = await fetch(url); |
| 219 | 231 | if (!res.ok || res.body === null) { |