From 81bbe93640fef46c69f64afa943afc9e0b1d4629 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 16 May 2016 08:22:23 -0400 Subject: [PATCH] fixes #4653 --- src/posts/parse.js | 32 +++++++++++++++++++++++++++++++- src/topics/follow.js | 2 +- 2 files changed, 32 insertions(+), 2 deletions(-) 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,