mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-31 02:55:58 +01:00 
			
		
		
		
	Resolve merge conflicts
This commit is contained in:
		| @@ -32,7 +32,9 @@ define('pictureCropper', ['translator', 'cropper'], function (translator, croppe | ||||
|  | ||||
| 	module.handleImageCrop = function (data, callback) { | ||||
| 		$('#crop-picture-modal').remove(); | ||||
| 		templates.parse('modals/crop_picture', { url: data.url }, function (cropperHtml) { | ||||
| 		templates.parse('modals/crop_picture', { | ||||
| 			url: data.url, | ||||
| 		}, function (cropperHtml) { | ||||
| 			translator.translate(cropperHtml, function (translated) { | ||||
| 				var cropperModal = $(translated); | ||||
| 				cropperModal.modal('show'); | ||||
|   | ||||
| @@ -6,7 +6,6 @@ var async = require('async'); | ||||
| var nconf = require('nconf'); | ||||
| var validator = require('validator'); | ||||
| var winston = require('winston'); | ||||
| var mime = require('mime'); | ||||
|  | ||||
| var meta = require('../meta'); | ||||
| var file = require('../file'); | ||||
| @@ -59,7 +58,10 @@ function uploadAsImage(req, uploadedFile, callback) { | ||||
| 				return next(new Error('[[error:no-privileges]]')); | ||||
| 			} | ||||
| 			if (plugins.hasListeners('filter:uploadImage')) { | ||||
| 				return plugins.fireHook('filter:uploadImage', { image: uploadedFile, uid: req.uid }, callback); | ||||
| 				return plugins.fireHook('filter:uploadImage', { | ||||
| 					image: uploadedFile, | ||||
| 					uid: req.uid, | ||||
| 				}, callback); | ||||
| 			} | ||||
| 			file.isFileTypeAllowed(uploadedFile.path, next); | ||||
| 		}, | ||||
| @@ -155,7 +157,10 @@ uploadsController.uploadThumb = function (req, res, next) { | ||||
| 				} | ||||
|  | ||||
| 				if (plugins.hasListeners('filter:uploadImage')) { | ||||
| 					return plugins.fireHook('filter:uploadImage', { image: uploadedFile, uid: req.uid }, next); | ||||
| 					return plugins.fireHook('filter:uploadImage', { | ||||
| 						image: uploadedFile, | ||||
| 						uid: req.uid, | ||||
| 					}, next); | ||||
| 				} | ||||
|  | ||||
| 				uploadFile(req.uid, uploadedFile, next); | ||||
| @@ -166,11 +171,17 @@ uploadsController.uploadThumb = function (req, res, next) { | ||||
|  | ||||
| uploadsController.uploadGroupCover = function (uid, uploadedFile, callback) { | ||||
| 	if (plugins.hasListeners('filter:uploadImage')) { | ||||
| 		return plugins.fireHook('filter:uploadImage', { image: uploadedFile, uid: uid }, callback); | ||||
| 		return plugins.fireHook('filter:uploadImage', { | ||||
| 			image: uploadedFile, | ||||
| 			uid: uid, | ||||
| 		}, callback); | ||||
| 	} | ||||
|  | ||||
| 	if (plugins.hasListeners('filter:uploadFile')) { | ||||
| 		return plugins.fireHook('filter:uploadFile', { file: uploadedFile, uid: uid }, callback); | ||||
| 		return plugins.fireHook('filter:uploadFile', { | ||||
| 			file: uploadedFile, | ||||
| 			uid: uid, | ||||
| 		}, callback); | ||||
| 	} | ||||
|  | ||||
| 	file.isFileTypeAllowed(uploadedFile.path, function (err) { | ||||
| @@ -183,7 +194,10 @@ uploadsController.uploadGroupCover = function (uid, uploadedFile, callback) { | ||||
|  | ||||
| function uploadFile(uid, uploadedFile, callback) { | ||||
| 	if (plugins.hasListeners('filter:uploadFile')) { | ||||
| 		return plugins.fireHook('filter:uploadFile', { file: uploadedFile, uid: uid }, callback); | ||||
| 		return plugins.fireHook('filter:uploadFile', { | ||||
| 			file: uploadedFile, | ||||
| 			uid: uid, | ||||
| 		}, callback); | ||||
| 	} | ||||
|  | ||||
| 	if (!uploadedFile) { | ||||
| @@ -196,7 +210,7 @@ function uploadFile(uid, uploadedFile, callback) { | ||||
|  | ||||
| 	if (meta.config.hasOwnProperty('allowedFileExtensions')) { | ||||
| 		var allowed = file.allowedExtensions(); | ||||
| 		var extension = typeToExtension(uploadedFile.type); | ||||
| 		var extension = file.typeToExtension(uploadedFile.type); | ||||
| 		if (!extension || (allowed.length > 0 && allowed.indexOf(extension) === -1)) { | ||||
| 			return callback(new Error('[[error:invalid-file-type, ' + allowed.join(', ') + ']]')); | ||||
| 		} | ||||
| @@ -206,7 +220,7 @@ function uploadFile(uid, uploadedFile, callback) { | ||||
| } | ||||
|  | ||||
| function saveFileToLocal(uploadedFile, callback) { | ||||
| 	var extension = typeToExtension(uploadedFile.type); | ||||
| 	var extension = file.typeToExtension(uploadedFile.type); | ||||
| 	if (!extension) { | ||||
| 		return callback(new Error('[[error:invalid-extension]]')); | ||||
| 	} | ||||
| @@ -227,14 +241,6 @@ function saveFileToLocal(uploadedFile, callback) { | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| function typeToExtension(type) { | ||||
| 	var extension; | ||||
| 	if (type) { | ||||
| 		extension = '.' + mime.extension(type); | ||||
| 	} | ||||
| 	return extension; | ||||
| } | ||||
|  | ||||
| function deleteTempFiles(files) { | ||||
| 	async.each(files, function (file, next) { | ||||
| 		fs.unlink(file.path, function (err) { | ||||
| @@ -246,5 +252,4 @@ function deleteTempFiles(files) { | ||||
| 	}); | ||||
| } | ||||
|  | ||||
|  | ||||
| module.exports = uploadsController; | ||||
|   | ||||
| @@ -6,6 +6,7 @@ var path = require('path'); | ||||
| var winston = require('winston'); | ||||
| var jimp = require('jimp'); | ||||
| var mkdirp = require('mkdirp'); | ||||
| var mime = require('mime'); | ||||
|  | ||||
| var utils = require('../public/src/utils'); | ||||
|  | ||||
| @@ -120,4 +121,12 @@ file.linkDirs = function linkDirs(sourceDir, destDir, callback) { | ||||
| 	fs.symlink(sourceDir, destDir, type, callback); | ||||
| }; | ||||
|  | ||||
| file.typeToExtension = function (type) { | ||||
| 	var extension; | ||||
| 	if (type) { | ||||
| 		extension = '.' + mime.extension(type); | ||||
| 	} | ||||
| 	return extension; | ||||
| }; | ||||
|  | ||||
| module.exports = file; | ||||
|   | ||||
| @@ -99,6 +99,7 @@ function setupConfigs() { | ||||
| 	nconf.set('use_port', !!urlObject.port); | ||||
| 	nconf.set('relative_path', relativePath); | ||||
| 	nconf.set('port', urlObject.port || nconf.get('port') || nconf.get('PORT') || (nconf.get('PORT_ENV_VAR') ? nconf.get(nconf.get('PORT_ENV_VAR')) : false) || 4567); | ||||
| 	nconf.set('upload_url', '/assets/uploads'); | ||||
| } | ||||
|  | ||||
| function printStartupInfo() { | ||||
|   | ||||
| @@ -41,7 +41,10 @@ module.exports = function (User) { | ||||
| 		async.waterfall([ | ||||
| 			function (next) { | ||||
| 				if (plugins.hasListeners('filter:uploadImage')) { | ||||
| 					return plugins.fireHook('filter:uploadImage', { image: picture, uid: updateUid }, next); | ||||
| 					return plugins.fireHook('filter:uploadImage', { | ||||
| 						image: picture, | ||||
| 						uid: updateUid, | ||||
| 					}, next); | ||||
| 				} | ||||
|  | ||||
| 				var filename = updateUid + '-profileimg' + (keepAllVersions ? '-' + Date.now() : '') + (convertToPNG ? '.png' : extension); | ||||
| @@ -77,7 +80,10 @@ module.exports = function (User) { | ||||
| 			}, | ||||
| 			function (_image, next) { | ||||
| 				uploadedImage = _image; | ||||
| 				User.setUserFields(updateUid, { uploadedpicture: uploadedImage.url, picture: uploadedImage.url }, next); | ||||
| 				User.setUserFields(updateUid, { | ||||
| 					uploadedpicture: uploadedImage.url, | ||||
| 					picture: uploadedImage.url, | ||||
| 				}, next); | ||||
| 			}, | ||||
| 			function (next) { | ||||
| 				next(null, uploadedImage); | ||||
| @@ -90,10 +96,11 @@ module.exports = function (User) { | ||||
| 			return callback(new Error('[[error:no-plugin]]')); | ||||
| 		} | ||||
|  | ||||
| 		request.head(url, function (err, res) { | ||||
| 			if (err) { | ||||
| 				return callback(err); | ||||
| 			} | ||||
| 		async.waterfall([ | ||||
| 			function (next) { | ||||
| 				request.head(url, next); | ||||
| 			}, | ||||
| 			function (res, body, next) { | ||||
| 				var uploadSize = parseInt(meta.config.maximumProfileImageSize, 10) || 256; | ||||
| 				var size = res.headers['content-length']; | ||||
| 				var type = res.headers['content-type']; | ||||
| @@ -107,15 +114,23 @@ module.exports = function (User) { | ||||
| 					return callback(new Error('[[error:file-too-big, ' + uploadSize + ']]')); | ||||
| 				} | ||||
|  | ||||
| 			var picture = { url: url, name: '' }; | ||||
| 			plugins.fireHook('filter:uploadImage', { image: picture, uid: uid }, function (err, image) { | ||||
| 				if (err) { | ||||
| 					return callback(err); | ||||
| 				} | ||||
| 				User.setUserFields(uid, { uploadedpicture: image.url, picture: image.url }); | ||||
| 				callback(null, image); | ||||
| 			}); | ||||
| 				plugins.fireHook('filter:uploadImage', { | ||||
| 					uid: uid, | ||||
| 					image: { | ||||
| 						url: url, | ||||
| 						name: '', | ||||
| 					}, | ||||
| 				}, next); | ||||
| 			}, | ||||
| 			function (image, next) { | ||||
| 				User.setUserFields(uid, { | ||||
| 					uploadedpicture: image.url, | ||||
| 					picture: image.url, | ||||
| 				}, function (err) { | ||||
| 					next(err, image); | ||||
| 				}); | ||||
| 			}, | ||||
| 		], callback); | ||||
| 	}; | ||||
|  | ||||
| 	User.updateCoverPosition = function (uid, position, callback) { | ||||
| @@ -123,9 +138,11 @@ module.exports = function (User) { | ||||
| 	}; | ||||
|  | ||||
| 	User.updateCoverPicture = function (data, callback) { | ||||
| 		var keepAllVersions = parseInt(meta.config['profile:keepAllUserImages'], 10) === 1; | ||||
| 		var url; | ||||
| 		var md5sum; | ||||
| 		var image = { | ||||
| 			name: 'profileCover', | ||||
| 			uid: data.uid, | ||||
| 		}; | ||||
|  | ||||
| 		if (!data.imageData && data.position) { | ||||
| 			return User.updateCoverPosition(data.uid, data.position, callback); | ||||
| @@ -144,87 +161,41 @@ module.exports = function (User) { | ||||
| 				} | ||||
|  | ||||
| 				if (data.file) { | ||||
| 					return next(); | ||||
| 					return setImmediate(next, null, data.file.path); | ||||
| 				} | ||||
|  | ||||
| 				md5sum = crypto.createHash('md5'); | ||||
| 				md5sum.update(data.imageData); | ||||
| 				md5sum = md5sum.digest('hex'); | ||||
|  | ||||
| 				data.file = { | ||||
| 					path: path.join(os.tmpdir(), md5sum), | ||||
| 				}; | ||||
|  | ||||
| 				var buffer = new Buffer(data.imageData.slice(data.imageData.indexOf('base64') + 7), 'base64'); | ||||
|  | ||||
| 				fs.writeFile(data.file.path, buffer, { | ||||
| 					encoding: 'base64', | ||||
| 				}, next); | ||||
| 				saveImageDataToTempFile(data.imageData, next); | ||||
| 			}, | ||||
| 			function (next) { | ||||
| 				var image = { | ||||
| 					name: 'profileCover', | ||||
| 					path: data.file.path, | ||||
| 					uid: data.uid, | ||||
| 				}; | ||||
| 			function (path, next) { | ||||
| 				image.path = path; | ||||
|  | ||||
| 				if (plugins.hasListeners('filter:uploadImage')) { | ||||
| 					return plugins.fireHook('filter:uploadImage', { image: image, uid: data.uid }, next); | ||||
| 				} | ||||
|  | ||||
| 				var filename = data.uid + '-profilecover' + (keepAllVersions ? '-' + Date.now() : ''); | ||||
| 				async.waterfall([ | ||||
| 					function (next) { | ||||
| 						file.isFileTypeAllowed(data.file.path, next); | ||||
| 					}, | ||||
| 					function (next) { | ||||
| 						file.saveFileToLocal(filename, 'profile', image.path, next); | ||||
| 					}, | ||||
| 					function (upload, next) { | ||||
| 						next(null, { | ||||
| 							url: nconf.get('relative_path') + upload.url, | ||||
| 							name: image.name, | ||||
| 						}); | ||||
| 					}, | ||||
| 				], next); | ||||
| 				uploadProfileOrCover('profilecover', image, data.imageData, next); | ||||
| 			}, | ||||
| 			function (uploadData, next) { | ||||
| 				url = uploadData.url; | ||||
| 				User.setUserField(data.uid, 'cover:url', uploadData.url, next); | ||||
| 			}, | ||||
| 			function (next) { | ||||
| 				fs.unlink(data.file.path, function (err) { | ||||
| 					if (err) { | ||||
| 						winston.error(err); | ||||
| 				if (data.position) { | ||||
| 					User.updateCoverPosition(data.uid, data.position, next); | ||||
| 				} else { | ||||
| 					setImmediate(next); | ||||
| 				} | ||||
| 					next(); | ||||
| 				}); | ||||
| 			}, | ||||
| 		], function (err) { | ||||
| 			if (err) { | ||||
| 				return fs.unlink(data.file.path, function (unlinkErr) { | ||||
| 					if (unlinkErr) { | ||||
| 						winston.error(unlinkErr); | ||||
| 					} | ||||
|  | ||||
| 					callback(err);	// send back the original error | ||||
| 			deleteFile(image.path); | ||||
| 			callback(err, { | ||||
| 				url: url, | ||||
| 			}); | ||||
| 			} | ||||
|  | ||||
| 			if (data.position) { | ||||
| 				User.updateCoverPosition(data.uid, data.position, function (err) { | ||||
| 					callback(err, { url: url }); | ||||
| 				}); | ||||
| 			} else { | ||||
| 				callback(err, { url: url }); | ||||
| 			} | ||||
| 		}); | ||||
| 	}; | ||||
|  | ||||
| 	User.uploadCroppedPicture = function (data, callback) { | ||||
| 		var keepAllVersions = parseInt(meta.config['profile:keepAllUserImages'], 10) === 1; | ||||
| 		var url; | ||||
| 		var md5sum; | ||||
| 		var image = { | ||||
| 			name: 'profileAvatar', | ||||
| 			uid: data.uid, | ||||
| 		}; | ||||
|  | ||||
| 		if (!data.imageData) { | ||||
| 			return callback(new Error('[[error:invalid-data]]')); | ||||
| @@ -232,41 +203,69 @@ module.exports = function (User) { | ||||
|  | ||||
| 		async.waterfall([ | ||||
| 			function (next) { | ||||
| 				var size = data.file ? data.file.size : data.imageData.length; | ||||
| 				var size = data.imageData.length; | ||||
| 				var uploadSize = parseInt(meta.config.maximumProfileImageSize, 10) || 256; | ||||
| 				if (size > uploadSize * 1024) { | ||||
| 					return next(new Error('[[error:file-too-big, ' + meta.config.maximumProfileImageSize + ']]')); | ||||
| 				} | ||||
|  | ||||
| 				md5sum = crypto.createHash('md5'); | ||||
| 				md5sum.update(data.imageData); | ||||
| 				md5sum = md5sum.digest('hex'); | ||||
| 				saveImageDataToTempFile(data.imageData, next); | ||||
| 			}, | ||||
| 			function (path, next) { | ||||
| 				image.path = path; | ||||
|  | ||||
| 				data.file = { | ||||
| 					path: path.join(os.tmpdir(), md5sum), | ||||
| 				}; | ||||
|  | ||||
| 				var buffer = new Buffer(data.imageData.slice(data.imageData.indexOf('base64') + 7), 'base64'); | ||||
|  | ||||
| 				fs.writeFile(data.file.path, buffer, { | ||||
| 					encoding: 'base64', | ||||
| 				uploadProfileOrCover('profileavatar', image, data.imageData, next); | ||||
| 			}, | ||||
| 			function (uploadData, next) { | ||||
| 				url = uploadData.url; | ||||
| 				User.setUserFields(data.uid, { | ||||
| 					uploadedpicture: url, | ||||
| 					picture: url, | ||||
| 				}, next); | ||||
| 			}, | ||||
| 			function (next) { | ||||
| 				var image = { | ||||
| 					name: 'profileAvatar', | ||||
| 					path: data.file.path, | ||||
| 					uid: data.uid, | ||||
| 		], function (err) { | ||||
| 			deleteFile(image.path); | ||||
| 			callback(err, { | ||||
| 				url: url, | ||||
| 			}); | ||||
| 		}); | ||||
| 	}; | ||||
|  | ||||
| 				if (plugins.hasListeners('filter:uploadImage')) { | ||||
| 					return plugins.fireHook('filter:uploadImage', { image: image, uid: data.uid }, next); | ||||
| 	function saveImageDataToTempFile(imageData, callback) { | ||||
| 		var filename = crypto.createHash('md5').update(imageData).digest('hex'); | ||||
| 		var filepath = path.join(os.tmpdir(), filename); | ||||
|  | ||||
| 		var buffer = new Buffer(imageData.slice(imageData.indexOf('base64') + 7), 'base64'); | ||||
|  | ||||
| 		fs.writeFile(filepath, buffer, { | ||||
| 			encoding: 'base64', | ||||
| 		}, function (err) { | ||||
| 			callback(err, filepath); | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 				var filename = data.uid + '-profileavatar' + (keepAllVersions ? '-' + Date.now() : ''); | ||||
| 	function uploadProfileOrCover(type, image, imageData, callback) { | ||||
| 		if (plugins.hasListeners('filter:uploadImage')) { | ||||
| 			return plugins.fireHook('filter:uploadImage', { | ||||
| 				image: image, | ||||
| 				uid: image.uid, | ||||
| 			}, callback); | ||||
| 		} | ||||
| 		var filename = generateProfileImageFilename(image.uid, type, imageData); | ||||
| 		saveFileToLocal(filename, image, callback); | ||||
| 	} | ||||
|  | ||||
| 	function generateProfileImageFilename(uid, type, imageData) { | ||||
| 		var extension = file.typeToExtension(imageData.slice(5, imageData.indexOf('base64') - 1)); | ||||
| 		var keepAllVersions = parseInt(meta.config['profile:keepAllUserImages'], 10) === 1; | ||||
| 		var filename = uid + '-' + type + (keepAllVersions ? '-' + Date.now() : '') + (extension || ''); | ||||
| 		return filename; | ||||
| 	} | ||||
|  | ||||
| 	function saveFileToLocal(filename, image, callback) { | ||||
| 		async.waterfall([ | ||||
| 			function (next) { | ||||
| 						file.isFileTypeAllowed(data.file.path, next); | ||||
| 				file.isFileTypeAllowed(image.path, next); | ||||
| 			}, | ||||
| 			function (next) { | ||||
| 				file.saveFileToLocal(filename, 'profile', image.path, next); | ||||
| @@ -277,28 +276,18 @@ module.exports = function (User) { | ||||
| 					name: image.name, | ||||
| 				}); | ||||
| 			}, | ||||
| 				], next); | ||||
| 			}, | ||||
| 			function (uploadData, next) { | ||||
| 				url = uploadData.url; | ||||
| 				User.setUserFields(data.uid, { uploadedpicture: url, picture: url }, next); | ||||
| 			}, | ||||
| 			function (next) { | ||||
| 				fs.unlink(data.file.path, function (err) { | ||||
| 		], callback); | ||||
| 	} | ||||
|  | ||||
| 	function deleteFile(path) { | ||||
| 		if (path) { | ||||
| 			fs.unlink(path, function (err) { | ||||
| 				if (err) { | ||||
| 					winston.error(err); | ||||
| 				} | ||||
| 					next(); | ||||
| 			}); | ||||
| 			}, | ||||
| 		], function (err) { | ||||
| 			if (err) { | ||||
| 				callback(err);	// send back the original error | ||||
| 		} | ||||
|  | ||||
| 			callback(err, { url: url }); | ||||
| 		}); | ||||
| 	}; | ||||
| 	} | ||||
|  | ||||
| 	User.removeCoverPicture = function (data, callback) { | ||||
| 		db.deleteObjectFields('user:' + data.uid, ['cover:url', 'cover:position'], callback); | ||||
|   | ||||
| @@ -1,2 +1,2 @@ | ||||
| --reporter dot | ||||
| --timeout 15000 | ||||
| --timeout 25000 | ||||
|   | ||||
							
								
								
									
										27
									
								
								test/user.js
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								test/user.js
									
									
									
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
		Reference in New Issue
	
	Block a user