| 
									
										
										
										
											2015-04-20 17:56:43 -04:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:20:53 +03:00
										 |  |  | var nconf = require('nconf'); | 
					
						
							|  |  |  | var url = require('url'); | 
					
						
							|  |  |  | var winston = require('winston'); | 
					
						
							| 
									
										
										
										
											2016-11-21 11:07:20 -05:00
										 |  |  | var S = require('string'); | 
					
						
							| 
									
										
										
										
											2016-05-16 08:22:23 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-21 11:07:20 -05:00
										 |  |  | var meta = require('../meta'); | 
					
						
							| 
									
										
										
										
											2016-02-23 13:08:38 +02:00
										 |  |  | var cache = require('./cache'); | 
					
						
							|  |  |  | var plugins = require('../plugins'); | 
					
						
							| 
									
										
										
										
											2016-03-17 11:38:21 +02:00
										 |  |  | var translator = require('../../public/src/modules/translator'); | 
					
						
							| 
									
										
										
										
											2015-04-20 17:56:43 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-16 08:22:23 -04:00
										 |  |  | var urlRegex = /href="([^"]+)"/g; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | module.exports = function (Posts) { | 
					
						
							|  |  |  | 	Posts.parsePost = function (postData, callback) { | 
					
						
							| 
									
										
										
										
											2015-04-20 17:56:43 -04:00
										 |  |  | 		postData.content = postData.content || ''; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-31 21:39:02 +03:00
										 |  |  | 		if (postData.pid && cache.has(String(postData.pid))) { | 
					
						
							|  |  |  | 			postData.content = cache.get(String(postData.pid)); | 
					
						
							| 
									
										
										
										
											2015-04-20 17:56:43 -04:00
										 |  |  | 			return callback(null, postData); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-11 12:20:58 -04:00
										 |  |  | 		// Casting post content into a string, just in case
 | 
					
						
							|  |  |  | 		if (typeof postData.content !== 'string') { | 
					
						
							|  |  |  | 			postData.content = postData.content.toString(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-18 12:30:49 -07:00
										 |  |  | 		plugins.fireHook('filter:parse.post', { postData: postData }, function (err, data) { | 
					
						
							| 
									
										
										
										
											2015-04-20 17:56:43 -04:00
										 |  |  | 			if (err) { | 
					
						
							|  |  |  | 				return callback(err); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-11-16 16:51:19 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-17 11:38:21 +02:00
										 |  |  | 			data.postData.content = translator.escape(data.postData.content); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-25 12:30:43 -05:00
										 |  |  | 			if (global.env === 'production' && data.postData.pid) { | 
					
						
							| 
									
										
										
										
											2016-08-31 21:39:02 +03:00
										 |  |  | 				cache.set(String(data.postData.pid), data.postData.content); | 
					
						
							| 
									
										
										
										
											2015-11-16 16:51:19 -05:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2015-04-20 17:56:43 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			callback(null, data.postData); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	Posts.parseSignature = function (userData, uid, callback) { | 
					
						
							| 
									
										
										
										
											2016-11-21 11:07:20 -05:00
										 |  |  | 		userData.signature = sanitizeSignature(userData.signature || ''); | 
					
						
							| 
									
										
										
										
											2017-02-18 12:30:49 -07:00
										 |  |  | 		plugins.fireHook('filter:parse.signature', { userData: userData, uid: uid }, callback); | 
					
						
							| 
									
										
										
										
											2015-04-20 17:56:43 -04:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2016-05-16 08:22:23 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-13 11:43:39 +02:00
										 |  |  | 	Posts.relativeToAbsolute = function (content) { | 
					
						
							| 
									
										
										
										
											2016-05-16 08:22:23 -04:00
										 |  |  | 		// Turns relative links in post body to absolute urls
 | 
					
						
							| 
									
										
										
										
											2017-02-17 20:20:42 -07:00
										 |  |  | 		var parsed; | 
					
						
							|  |  |  | 		var current; | 
					
						
							|  |  |  | 		var absolute; | 
					
						
							| 
									
										
										
										
											2016-05-16 08:22:23 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:20:53 +03:00
										 |  |  | 		while ((current = urlRegex.exec(content)) !== null) { | 
					
						
							| 
									
										
										
										
											2016-05-16 08:22:23 -04:00
										 |  |  | 			if (current[1]) { | 
					
						
							| 
									
										
										
										
											2016-06-03 11:20:53 +03:00
										 |  |  | 				try { | 
					
						
							|  |  |  | 					parsed = url.parse(current[1]); | 
					
						
							|  |  |  | 					if (!parsed.protocol) { | 
					
						
							|  |  |  | 						if (current[1].startsWith('/')) { | 
					
						
							|  |  |  | 							// Internal link
 | 
					
						
							|  |  |  | 							absolute = nconf.get('url') + current[1]; | 
					
						
							|  |  |  | 						} else { | 
					
						
							|  |  |  | 							// External link
 | 
					
						
							|  |  |  | 							absolute = '//' + current[1]; | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						content = content.slice(0, current.index + 6) + absolute + content.slice(current.index + 6 + current[1].length); | 
					
						
							| 
									
										
										
										
											2016-05-16 08:22:23 -04:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2017-02-18 01:52:56 -07:00
										 |  |  | 				} catch (err) { | 
					
						
							| 
									
										
										
										
											2016-06-29 21:09:05 +03:00
										 |  |  | 					winston.verbose(err.messsage); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2016-05-16 08:22:23 -04:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return content; | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2016-11-21 11:07:20 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	function sanitizeSignature(signature) { | 
					
						
							| 
									
										
										
										
											2017-02-17 20:20:42 -07:00
										 |  |  | 		var	string = S(signature); | 
					
						
							|  |  |  | 		var tagsToStrip = []; | 
					
						
							| 
									
										
										
										
											2016-11-21 11:07:20 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (parseInt(meta.config['signatures:disableLinks'], 10) === 1) { | 
					
						
							|  |  |  | 			tagsToStrip.push('a'); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (parseInt(meta.config['signatures:disableImages'], 10) === 1) { | 
					
						
							|  |  |  | 			tagsToStrip.push('img'); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return tagsToStrip.length ? string.stripTags.apply(string, tagsToStrip).s : signature; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-11-26 23:34:55 -05:00
										 |  |  | }; |