| 
									
										
										
										
											2015-01-10 16:40:54 -05:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var uploadsController = {}, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	fs = require('fs'), | 
					
						
							|  |  |  | 	path = require('path'), | 
					
						
							|  |  |  | 	async = require('async'), | 
					
						
							| 
									
										
										
										
											2015-04-07 15:37:20 -04:00
										 |  |  | 	nconf = require('nconf'), | 
					
						
							| 
									
										
										
										
											2015-02-19 16:37:56 -05:00
										 |  |  | 	validator = require('validator'), | 
					
						
							| 
									
										
										
										
											2015-01-10 16:40:54 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	meta = require('../meta'), | 
					
						
							| 
									
										
										
										
											2015-02-18 21:09:33 -05:00
										 |  |  | 	file = require('../file'), | 
					
						
							| 
									
										
										
										
											2015-01-10 16:40:54 -05:00
										 |  |  | 	plugins = require('../plugins'), | 
					
						
							|  |  |  | 	utils = require('../../public/src/utils'), | 
					
						
							|  |  |  | 	image = require('../image'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | uploadsController.upload = function(req, res, filesIterator, next) { | 
					
						
							|  |  |  | 	var files = req.files.files; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!req.user) { | 
					
						
							|  |  |  | 		deleteTempFiles(files); | 
					
						
							|  |  |  | 		return res.status(403).json('not allowed'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!Array.isArray(files)) { | 
					
						
							|  |  |  | 		return res.status(500).json('invalid files'); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (Array.isArray(files[0])) { | 
					
						
							|  |  |  | 		files = files[0]; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	async.map(files, filesIterator, function(err, images) { | 
					
						
							|  |  |  | 		deleteTempFiles(files); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (err) { | 
					
						
							|  |  |  | 			return res.status(500).send(err.message); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// IE8 - send it as text/html so browser won't trigger a file download for the json response
 | 
					
						
							|  |  |  | 		// malsup.com/jquery/form/#file-upload
 | 
					
						
							|  |  |  | 		res.status(200).send(req.xhr ? images : JSON.stringify(images)); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | uploadsController.uploadPost = function(req, res, next) { | 
					
						
							| 
									
										
										
										
											2015-02-18 21:09:33 -05:00
										 |  |  | 	uploadsController.upload(req, res, function(uploadedFile, next) { | 
					
						
							| 
									
										
										
										
											2015-11-09 14:39:00 -05:00
										 |  |  | 		file.isFileTypeAllowed(uploadedFile.path, function(err) { | 
					
						
							| 
									
										
										
										
											2015-02-18 21:09:33 -05:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return next(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (uploadedFile.type.match(/image./)) { | 
					
						
							|  |  |  | 				uploadImage(req.user.uid, uploadedFile, next); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				uploadFile(req.user.uid, uploadedFile, next); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2015-01-10 16:40:54 -05:00
										 |  |  | 	}, next); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | uploadsController.uploadThumb = function(req, res, next) { | 
					
						
							|  |  |  | 	if (parseInt(meta.config.allowTopicsThumbnail, 10) !== 1) { | 
					
						
							|  |  |  | 		deleteTempFiles(req.files.files); | 
					
						
							|  |  |  | 		return next(new Error('[[error:topic-thumbnails-are-disabled]]')); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-18 21:09:33 -05:00
										 |  |  | 	uploadsController.upload(req, res, function(uploadedFile, next) { | 
					
						
							| 
									
										
										
										
											2015-11-09 14:39:00 -05:00
										 |  |  | 		file.isFileTypeAllowed(uploadedFile.path, function(err) { | 
					
						
							| 
									
										
										
										
											2015-02-18 21:09:33 -05:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return next(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (uploadedFile.type.match(/image./)) { | 
					
						
							|  |  |  | 				var size = meta.config.topicThumbSize || 120; | 
					
						
							| 
									
										
										
										
											2015-09-24 12:04:24 -04:00
										 |  |  | 				image.resizeImage({ | 
					
						
							|  |  |  | 					path: uploadedFile.path, | 
					
						
							|  |  |  | 					extension: path.extname(uploadedFile.name), | 
					
						
							|  |  |  | 					width: size, | 
					
						
							|  |  |  | 					height: size | 
					
						
							|  |  |  | 				}, function(err) { | 
					
						
							| 
									
										
										
										
											2015-02-18 21:09:33 -05:00
										 |  |  | 					if (err) { | 
					
						
							|  |  |  | 						return next(err); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					uploadImage(req.user.uid, uploadedFile, next); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				next(new Error('[[error:invalid-file]]')); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2015-01-10 16:40:54 -05:00
										 |  |  | 	}, next); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-12 20:34:15 -05:00
										 |  |  | uploadsController.uploadGroupCover = function(data, next) { | 
					
						
							| 
									
										
										
										
											2015-10-28 17:42:42 -04:00
										 |  |  | 	uploadImage(0, data, next); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-10 16:40:54 -05:00
										 |  |  | function uploadImage(uid, image, callback) { | 
					
						
							|  |  |  | 	if (plugins.hasListeners('filter:uploadImage')) { | 
					
						
							|  |  |  | 		return plugins.fireHook('filter:uploadImage', {image: image, uid: uid}, callback); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (parseInt(meta.config.allowFileUploads, 10)) { | 
					
						
							|  |  |  | 		uploadFile(uid, image, callback); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		callback(new Error('[[error:uploads-are-disabled]]')); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-18 21:09:33 -05:00
										 |  |  | function uploadFile(uid, uploadedFile, callback) { | 
					
						
							| 
									
										
										
										
											2015-01-10 16:40:54 -05:00
										 |  |  | 	if (plugins.hasListeners('filter:uploadFile')) { | 
					
						
							| 
									
										
										
										
											2015-02-18 21:09:33 -05:00
										 |  |  | 		return plugins.fireHook('filter:uploadFile', {file: uploadedFile, uid: uid}, callback); | 
					
						
							| 
									
										
										
										
											2015-01-10 16:40:54 -05:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (parseInt(meta.config.allowFileUploads, 10) !== 1) { | 
					
						
							|  |  |  | 		return callback(new Error('[[error:uploads-are-disabled]]')); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-18 21:09:33 -05:00
										 |  |  | 	if (!uploadedFile) { | 
					
						
							| 
									
										
										
										
											2015-01-10 16:40:54 -05:00
										 |  |  | 		return callback(new Error('[[error:invalid-file]]')); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-18 21:09:33 -05:00
										 |  |  | 	if (uploadedFile.size > parseInt(meta.config.maximumFileSize, 10) * 1024) { | 
					
						
							| 
									
										
										
										
											2015-01-10 16:40:54 -05:00
										 |  |  | 		return callback(new Error('[[error:file-too-big, ' + meta.config.maximumFileSize + ']]')); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-04-07 15:37:20 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-19 16:46:00 -05:00
										 |  |  | 	var filename = uploadedFile.name || 'upload'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	filename = Date.now() + '-' + validator.escape(filename).substr(0, 255); | 
					
						
							| 
									
										
										
										
											2015-02-18 21:09:33 -05:00
										 |  |  | 	file.saveFileToLocal(filename, 'files', uploadedFile.path, function(err, upload) { | 
					
						
							| 
									
										
										
										
											2015-01-10 16:40:54 -05:00
										 |  |  | 		if (err) { | 
					
						
							|  |  |  | 			return callback(err); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		callback(null, { | 
					
						
							| 
									
										
										
										
											2015-04-07 15:37:20 -04:00
										 |  |  | 			url: nconf.get('relative_path') + upload.url, | 
					
						
							| 
									
										
										
										
											2015-02-18 21:09:33 -05:00
										 |  |  | 			name: uploadedFile.name | 
					
						
							| 
									
										
										
										
											2015-01-10 16:40:54 -05:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function deleteTempFiles(files) { | 
					
						
							| 
									
										
										
										
											2015-09-06 00:49:39 -04:00
										 |  |  | 	async.each(files, function(file, next) { | 
					
						
							|  |  |  | 		fs.unlink(file.path, function(err) { | 
					
						
							|  |  |  | 			if (err) { | 
					
						
							|  |  |  | 				winston.error(err); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			next(); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2015-01-10 16:40:54 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = uploadsController; |