diff --git a/src/controllers/category.js b/src/controllers/category.js index 1daa746f27..2002099cb9 100644 --- a/src/controllers/category.js +++ b/src/controllers/category.js @@ -124,10 +124,15 @@ categoryController.get = async function (req, res, next) { categoryData.topicIndex = topicIndex; categoryData.selectedTag = tagData.selectedTag; categoryData.selectedTags = tagData.selectedTags; - categoryData.rssFeedUrl = `${url}/category/${categoryData.cid}.rss`; - if (parseInt(req.uid, 10)) { + if (req.loggedIn) { categories.markAsRead([cid], req.uid); - categoryData.rssFeedUrl += `?uid=${req.uid}&token=${rssToken}`; + } + + if (!meta.config['feeds:disableRSS']) { + categoryData.rssFeedUrl = `${url}/category/${categoryData.cid}.rss`; + if (req.loggedIn) { + categoryData.rssFeedUrl += `?uid=${req.uid}&token=${rssToken}`; + } } addTags(categoryData, res, currentPage); diff --git a/src/controllers/popular.js b/src/controllers/popular.js index 3869f35cfd..fcc34e5496 100644 --- a/src/controllers/popular.js +++ b/src/controllers/popular.js @@ -21,10 +21,12 @@ popularController.get = async function (req, res, next) { data.breadcrumbs = helpers.buildBreadcrumbs(breadcrumbs); } - const feedQs = data.rssFeedUrl.split('?')[1]; - data.rssFeedUrl = `${nconf.get('relative_path')}/popular/${validator.escape(String(req.query.term || 'alltime'))}.rss`; - if (req.loggedIn) { - data.rssFeedUrl += `?${feedQs}`; + if (!data['feeds:disableRSS'] && data.rssFeedUrl) { + const feedQs = data.rssFeedUrl.split('?')[1]; + data.rssFeedUrl = `${nconf.get('relative_path')}/popular/${validator.escape(String(req.query.term || 'alltime'))}.rss`; + if (req.loggedIn) { + data.rssFeedUrl += `?${feedQs}`; + } } res.render('popular', data); }; diff --git a/src/controllers/recent.js b/src/controllers/recent.js index 878f74d6b3..5699fee1b7 100644 --- a/src/controllers/recent.js +++ b/src/controllers/recent.js @@ -79,9 +79,11 @@ recentController.getData = async function (req, url, sort) { data.selectedTag = tagData.selectedTag; data.selectedTags = tagData.selectedTags; data['feeds:disableRSS'] = meta.config['feeds:disableRSS'] || 0; - data.rssFeedUrl = `${relative_path}/${url}.rss`; - if (req.loggedIn) { - data.rssFeedUrl += `?uid=${req.uid}&token=${rssToken}`; + if (!meta.config['feeds:disableRSS']) { + data.rssFeedUrl = `${relative_path}/${url}.rss`; + if (req.loggedIn) { + data.rssFeedUrl += `?uid=${req.uid}&token=${rssToken}`; + } } data.filters = helpers.buildFilters(baseUrl, filter, query); diff --git a/src/controllers/tags.js b/src/controllers/tags.js index 9c25051b8a..392ff9201e 100644 --- a/src/controllers/tags.js +++ b/src/controllers/tags.js @@ -25,12 +25,13 @@ tagsController.getTag = async function (req, res) { breadcrumbs: helpers.buildBreadcrumbs([{ text: '[[tags:tags]]', url: '/tags' }, { text: tag }]), title: `[[pages:tag, ${tag}]]`, }; - const [settings, cids, categoryData, canPost, isPrivileged, isFollowing] = await Promise.all([ + const [settings, cids, categoryData, canPost, isPrivileged, rssToken, isFollowing] = await Promise.all([ user.getSettings(req.uid), cid || categories.getCidsByPrivilege('categories:cid', req.uid, 'topics:read'), helpers.getSelectedCategory(cid), privileges.categories.canPostTopic(req.uid), user.isPrivileged(req.uid), + user.auth.getFeedToken(req.uid), topics.isFollowingTag(req.params.tag, req.uid), ]); const start = Math.max(0, (page - 1) * settings.topicsPerPage); @@ -71,7 +72,13 @@ tagsController.getTag = async function (req, res) { }); templateData['feeds:disableRSS'] = meta.config['feeds:disableRSS']; - templateData.rssFeedUrl = `${nconf.get('relative_path')}/tags/${tag}.rss`; + if (!meta.config['feeds:disableRSS']) { + templateData.rssFeedUrl = `${nconf.get('relative_path')}/tags/${tag}.rss`; + if (req.loggedIn) { + templateData.rssFeedUrl += `?uid=${req.uid}&token=${rssToken}`; + } + } + res.render('tag', templateData); }; diff --git a/src/controllers/top.js b/src/controllers/top.js index e2935ec54d..c19fb972f3 100644 --- a/src/controllers/top.js +++ b/src/controllers/top.js @@ -19,10 +19,12 @@ topController.get = async function (req, res, next) { data.title = `[[pages:top-${term}]]`; } - const feedQs = data.rssFeedUrl.split('?')[1]; - data.rssFeedUrl = `${nconf.get('relative_path')}/top/${validator.escape(String(req.query.term || 'alltime'))}.rss`; - if (req.loggedIn) { - data.rssFeedUrl += `?${feedQs}`; + if (!data['feeds:disableRSS'] && data.rssFeedUrl) { + const feedQs = data.rssFeedUrl.split('?')[1]; + data.rssFeedUrl = `${nconf.get('relative_path')}/top/${validator.escape(String(req.query.term || 'alltime'))}.rss`; + if (req.loggedIn) { + data.rssFeedUrl += `?${feedQs}`; + } } res.render('top', data); diff --git a/src/controllers/topics.js b/src/controllers/topics.js index 7a57c0e5c4..518882d826 100644 --- a/src/controllers/topics.js +++ b/src/controllers/topics.js @@ -105,9 +105,11 @@ topicsController.get = async function getTopic(req, res, next) { topicData.allowMultipleBadges = meta.config.allowMultipleBadges === 1; topicData.privateUploads = meta.config.privateUploads === 1; topicData.showPostPreviewsOnHover = meta.config.showPostPreviewsOnHover === 1; - topicData.rssFeedUrl = `${relative_path}/topic/${topicData.tid}.rss`; - if (req.loggedIn) { - topicData.rssFeedUrl += `?uid=${req.uid}&token=${rssToken}`; + if (!meta.config['feeds:disableRSS']) { + topicData.rssFeedUrl = `${relative_path}/topic/${topicData.tid}.rss`; + if (req.loggedIn) { + topicData.rssFeedUrl += `?uid=${req.uid}&token=${rssToken}`; + } } topicData.postIndex = postIndex; diff --git a/src/routes/feeds.js b/src/routes/feeds.js index c4a1c2d9f2..b913ca56da 100644 --- a/src/routes/feeds.js +++ b/src/routes/feeds.js @@ -156,13 +156,10 @@ async function generateForTopics(req, res, next) { if (meta.config['feeds:disableRSS']) { return next(); } - let token = null; - if (req.query.token && req.query.uid) { - token = await db.getObjectField(`user:${req.query.uid}`, 'rss_token'); - } + const uid = await getUidFromToken(req); await sendTopicsFeed({ - uid: token && token === req.query.token ? req.query.uid : req.uid, + uid: uid, title: 'Most recently created topics', description: 'A list of topics that have been created recently', feed_url: '/topics.rss', @@ -212,13 +209,7 @@ async function generateSorted(options, req, res, next) { } const term = terms[req.params.term] || options.term; - - let token = null; - if (req.query.token && req.query.uid) { - token = await db.getObjectField(`user:${req.query.uid}`, 'rss_token'); - } - - const uid = token && token === req.query.token ? req.query.uid : req.uid; + const uid = await getUidFromToken(req); const params = { uid: uid, @@ -402,13 +393,14 @@ async function generateForTag(req, res) { if (meta.config['feeds:disableRSS']) { return controllers404.handle404(req, res); } + const uid = await getUidFromToken(req); const tag = validator.escape(String(req.params.tag)); const page = parseInt(req.query.page, 10) || 1; const topicsPerPage = meta.config.topicsPerPage || 20; const start = Math.max(0, (page - 1) * topicsPerPage); const stop = start + topicsPerPage - 1; await sendTopicsFeed({ - uid: req.uid, + uid: uid, title: `Topics tagged with ${tag}`, description: `A list of topics that have been tagged with ${tag}`, feed_url: `/tags/${tag}.rss`, @@ -418,6 +410,15 @@ async function generateForTag(req, res) { }, `tag:${tag}:topics`, res); } +async function getUidFromToken(req) { + let token = null; + if (req.query.token && req.query.uid) { + token = await db.getObjectField(`user:${req.query.uid}`, 'rss_token'); + } + + return token && token === req.query.token ? req.query.uid : req.uid; +} + function sendFeed(feed, res) { const xml = feed.xml(); res.type('xml').set('Content-Length', Buffer.byteLength(xml)).send(xml);