diff --git a/src/posts/parse.js b/src/posts/parse.js index 1af374305d..6381e066ed 100644 --- a/src/posts/parse.js +++ b/src/posts/parse.js @@ -1,10 +1,14 @@ - 'use strict'; +var nconf = require('nconf'), + url = require('url'); + var cache = require('./cache'); var plugins = require('../plugins'); var translator = require('../../public/src/modules/translator'); +var urlRegex = /href="([^"]+)"/g; + module.exports = function(Posts) { Posts.parsePost = function(postData, callback) { @@ -26,6 +30,7 @@ module.exports = function(Posts) { } data.postData.content = translator.escape(data.postData.content); + data.postData.content = Posts.relativeToAbsolute(data.postData.content); if (global.env === 'production' && data.postData.pid) { cache.set(data.postData.pid, data.postData.content); @@ -40,4 +45,29 @@ module.exports = function(Posts) { plugins.fireHook('filter:parse.signature', {userData: userData, uid: uid}, callback); }; + + Posts.relativeToAbsolute = function(content) { + // Turns relative links in post body to absolute urls + var parsed, current, absolute; + + while ((current=urlRegex.exec(content)) !== null) { + if (current[1]) { + 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); + } + } + } + + return content; + }; }; diff --git a/src/topics/follow.js b/src/topics/follow.js index 90708ba50a..209151d8e5 100644 --- a/src/topics/follow.js +++ b/src/topics/follow.js @@ -171,7 +171,7 @@ module.exports = function(Topics) { pid: postData.pid, subject: '[' + (meta.config.title || 'NodeBB') + '] ' + title, intro: '[[notifications:user_posted_to, ' + postData.user.username + ', ' + titleEscaped + ']]', - postBody: postData.content.replace(/"\/\//g, '"http://'), + postBody: postData.content.replace(/"\/\//g, '"https://'), site_title: meta.config.title || 'NodeBB', username: data.userData.username, userslug: data.userData.userslug,