mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-07-05 11:08:30 +02:00
Merge branch 'master' of https://github.com/designcreateplay/NodeBB
This commit is contained in:
@@ -5,6 +5,7 @@ var db = require('./database.js'),
|
||||
topics = require('./topics.js'),
|
||||
plugins = require('./plugins'),
|
||||
CategoryTools = require('./categoryTools'),
|
||||
meta = require('./meta'),
|
||||
|
||||
async = require('async'),
|
||||
winston = require('winston'),
|
||||
@@ -45,14 +46,14 @@ var db = require('./database.js'),
|
||||
});
|
||||
};
|
||||
|
||||
Categories.getCategoryById = function(category_id, current_user, callback) {
|
||||
Categories.getCategoryById = function(category_id, start, end, current_user, callback) {
|
||||
Categories.getCategoryData(category_id, function(err, categoryData) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
function getTopicIds(next) {
|
||||
Categories.getTopicIds(category_id, 0, 19, next);
|
||||
Categories.getTopicIds(category_id, start, end, next);
|
||||
}
|
||||
|
||||
function getActiveUsers(next) {
|
||||
@@ -65,10 +66,15 @@ var db = require('./database.js'),
|
||||
});
|
||||
}
|
||||
|
||||
async.parallel([getTopicIds, getActiveUsers, getSidebars], function(err, results) {
|
||||
function getPageCount(next) {
|
||||
Categories.getPageCount(category_id, next);
|
||||
}
|
||||
|
||||
async.parallel([getTopicIds, getActiveUsers, getSidebars, getPageCount], function(err, results) {
|
||||
var tids = results[0],
|
||||
active_users = results[1],
|
||||
sidebars = results[2];
|
||||
sidebars = results[2],
|
||||
pageCount = results[3];
|
||||
|
||||
var category = {
|
||||
'category_name': categoryData.name,
|
||||
@@ -82,6 +88,7 @@ var db = require('./database.js'),
|
||||
'category_id': category_id,
|
||||
'active_users': [],
|
||||
'topics': [],
|
||||
'pageCount': pageCount,
|
||||
'disableSocialButtons': meta.config.disableSocialButtons !== undefined ? parseInt(meta.config.disableSocialButtons, 10) !== 0 : false,
|
||||
'sidebars': sidebars
|
||||
};
|
||||
@@ -137,6 +144,18 @@ var db = require('./database.js'),
|
||||
db.getSortedSetRevRange('categories:' + cid + ':tid', start, stop, callback);
|
||||
};
|
||||
|
||||
Categories.getPageCount = function(cid, callback) {
|
||||
db.sortedSetCard('categories:' + cid + ':tid', function(err, topicCount) {
|
||||
if(err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
var topicsPerPage = parseInt(meta.config.topicsPerPage, 10);
|
||||
topicsPerPage = topicsPerPage ? topicsPerPage : 20;
|
||||
|
||||
callback(null, Math.ceil(parseInt(topicCount, 10) / topicsPerPage));
|
||||
});
|
||||
};
|
||||
|
||||
Categories.getAllCategories = function(current_user, callback) {
|
||||
db.getListRange('categories:cid', 0, -1, function(err, cids) {
|
||||
|
||||
@@ -626,6 +626,19 @@
|
||||
});
|
||||
}
|
||||
|
||||
module.sortedSetCard = function(key, callback) {
|
||||
db.collection('objects').count({_key:key}, function(err, count) {
|
||||
if(err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if(!count) {
|
||||
return callback(null, 0);
|
||||
}
|
||||
callback(null, count);
|
||||
});
|
||||
}
|
||||
|
||||
module.sortedSetRank = function(key, value, callback) {
|
||||
if(value !== null && value !== undefined) {
|
||||
value = value.toString();
|
||||
|
||||
@@ -374,6 +374,10 @@
|
||||
redisClient.zcount(key, min, max, callback);
|
||||
}
|
||||
|
||||
module.sortedSetCard = function(key, callback) {
|
||||
redisClient.zcard(key, callback);
|
||||
}
|
||||
|
||||
module.sortedSetRank = function(key, value, callback) {
|
||||
redisClient.zrank(key, value, callback);
|
||||
}
|
||||
|
||||
@@ -1,16 +1,18 @@
|
||||
var User = require('./user'),
|
||||
var fs = require('fs'),
|
||||
async = require('async'),
|
||||
path = require('path'),
|
||||
|
||||
User = require('./user'),
|
||||
Plugins = require('./plugins'),
|
||||
Meta = require('./meta'),
|
||||
Translator = require('../public/src/translator'),
|
||||
|
||||
fs = require('fs'),
|
||||
async = require('async'),
|
||||
path = require('path'),
|
||||
templates = require('../public/src/templates'),
|
||||
|
||||
Emailer = {};
|
||||
|
||||
var render = function(template, params, callback) {
|
||||
if (templates[template] !== null) {
|
||||
|
||||
if (templates[template]) {
|
||||
Translator.translate(templates[template].parse(params), function(template) {
|
||||
callback(null, template);
|
||||
});
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
};
|
||||
|
||||
Feed.updateCategory = function (cid, callback) {
|
||||
categories.getCategoryById(cid, 0, function (err, categoryData) {
|
||||
categories.getCategoryById(cid, 0, -1, 0, function (err, categoryData) {
|
||||
if (err) return callback(new Error('category-invalid'));
|
||||
|
||||
var feed = new rss({
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
var db = require('./database'),
|
||||
async = require('async'),
|
||||
user = require('./user'),
|
||||
plugins = require('./plugins');
|
||||
plugins = require('./plugins'),
|
||||
meta = require('./meta');
|
||||
|
||||
|
||||
|
||||
@@ -202,6 +202,10 @@ var fs = require('fs'),
|
||||
} else return;
|
||||
};
|
||||
|
||||
Plugins.hasListeners = function(hook) {
|
||||
return (Plugins.loadedHooks[hook] && Plugins.loadedHooks[hook].length > 0);
|
||||
};
|
||||
|
||||
Plugins.fireHook = function(hook, args, callback) {
|
||||
hookList = Plugins.loadedHooks[hook];
|
||||
|
||||
|
||||
26
src/posts.js
26
src/posts.js
@@ -194,7 +194,7 @@ var db = require('./database'),
|
||||
post.user_rep = userData.reputation || 0;
|
||||
post.user_postcount = userData.postcount || 0;
|
||||
post.user_banned = parseInt(userData.banned, 10) === 1;
|
||||
post.picture = userData.picture || gravatar.url('', {}, https = nconf.get('https'));
|
||||
post.picture = userData.picture || gravatar.url('', {}, true);
|
||||
|
||||
if(meta.config.disableSignatures === undefined || parseInt(meta.config.disableSignatures, 10) === 0) {
|
||||
post.signature = signature;
|
||||
@@ -468,4 +468,28 @@ var db = require('./database'),
|
||||
});
|
||||
}
|
||||
|
||||
Posts.getPidPage = function(pid, callback) {
|
||||
Posts.getPostField(pid, 'tid', function(err, tid) {
|
||||
if(err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
topics.getPids(tid, function(err, pids) {
|
||||
if(err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
var index = pids.indexOf(pid);
|
||||
if(index === -1) {
|
||||
return callback(new Error('pid not found'));
|
||||
}
|
||||
var postsPerPage = parseInt(meta.config.postsPerPage, 10);
|
||||
postsPerPage = postsPerPage ? postsPerPage : 20;
|
||||
|
||||
var page = Math.ceil((index + 1) / postsPerPage);
|
||||
callback(null, page);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
}(exports));
|
||||
|
||||
@@ -7,13 +7,14 @@ var nconf = require('nconf'),
|
||||
user = require('./../user'),
|
||||
groups = require('../groups'),
|
||||
topics = require('./../topics'),
|
||||
pkg = require('./../../package.json'),
|
||||
pkg = require('./../../package'),
|
||||
categories = require('./../categories'),
|
||||
meta = require('../meta'),
|
||||
plugins = require('../plugins'),
|
||||
Languages = require('../languages'),
|
||||
events = require('./../events'),
|
||||
utils = require('./../../public/src/utils.js');
|
||||
utils = require('./../../public/src/utils'),
|
||||
templates = require('./../../public/src/templates');
|
||||
|
||||
(function (Admin) {
|
||||
Admin.isAdmin = function (req, res, next) {
|
||||
|
||||
@@ -11,10 +11,11 @@ var path = require('path'),
|
||||
posts = require('../posts'),
|
||||
categories = require('../categories'),
|
||||
categoryTools = require('../categoryTools')
|
||||
meta = require('../meta'),
|
||||
Plugins = require('../plugins'),
|
||||
utils = require('../../public/src/utils'),
|
||||
translator = require('../../public/src/translator'),
|
||||
pkg = require('../../package.json'),
|
||||
meta = require('../meta');
|
||||
pkg = require('../../package.json');
|
||||
|
||||
|
||||
(function (Api) {
|
||||
@@ -42,8 +43,10 @@ var path = require('path'),
|
||||
config.useOutgoingLinksPage = parseInt(meta.config.useOutgoingLinksPage, 10) === 1;
|
||||
config.allowGuestPosting = parseInt(meta.config.allowGuestPosting, 10) === 1;
|
||||
config.allowFileUploads = parseInt(meta.config.allowFileUploads, 10) === 1;
|
||||
config.usePagination = parseInt(meta.config.usePagination, 10) === 1;
|
||||
config.topicsPerPage = meta.config.topicsPerPage || 20;
|
||||
config.postsPerPage = meta.config.postsPerPage || 20;
|
||||
config.maximumFileSize = meta.config.maximumFileSize;
|
||||
config.emailSetup = !!meta.config['email:from'];
|
||||
config.defaultLang = meta.config.defaultLang || 'en';
|
||||
|
||||
res.json(200, config);
|
||||
@@ -113,7 +116,8 @@ var path = require('path'),
|
||||
app.get('/login', function (req, res) {
|
||||
var data = {},
|
||||
login_strategies = auth.get_login_strategies(),
|
||||
num_strategies = login_strategies.length;
|
||||
num_strategies = login_strategies.length,
|
||||
emailersPresent = Plugins.hasListeners('action:email.send');
|
||||
|
||||
if (num_strategies == 0) {
|
||||
data = {
|
||||
@@ -128,8 +132,8 @@ var path = require('path'),
|
||||
}
|
||||
|
||||
data.authentication = login_strategies;
|
||||
|
||||
data.token = res.locals.csrf_token;
|
||||
data.showResetLink = emailersPresent;
|
||||
|
||||
res.json(data);
|
||||
});
|
||||
@@ -161,20 +165,40 @@ var path = require('path'),
|
||||
});
|
||||
|
||||
app.get('/topic/:id/:slug?', function (req, res, next) {
|
||||
|
||||
var uid = (req.user) ? req.user.uid : 0;
|
||||
var page = 1;
|
||||
if(req.query && req.query.page) {
|
||||
page = req.query.page;
|
||||
}
|
||||
|
||||
if(!utils.isNumber(page) || parseInt(page, 10) < 1) {
|
||||
return res.send(404);
|
||||
}
|
||||
|
||||
var postsPerPage = parseInt(meta.config.postsPerPage ? meta.config.postsPerPage : 20, 10);
|
||||
var start = (page - 1) * postsPerPage;
|
||||
var end = start + postsPerPage - 1;
|
||||
|
||||
ThreadTools.privileges(req.params.id, uid, function(err, privileges) {
|
||||
if (privileges.read) {
|
||||
topics.getTopicWithPosts(req.params.id, uid, 0, 10, false, function (err, data) {
|
||||
if (!err) {
|
||||
// Send in privilege data as well
|
||||
data.privileges = privileges;
|
||||
topics.getTopicWithPosts(req.params.id, uid, start, end, false, function (err, data) {
|
||||
if(err) {
|
||||
return next(err);
|
||||
}
|
||||
|
||||
if (parseInt(data.deleted, 10) === 1 && parseInt(data.expose_tools, 10) === 0) {
|
||||
return res.json(404, {});
|
||||
}
|
||||
if(page > data.pageCount) {
|
||||
return res.send(404);
|
||||
}
|
||||
|
||||
res.json(data);
|
||||
} else next();
|
||||
data.currentPage = page;
|
||||
data.privileges = privileges;
|
||||
|
||||
if (parseInt(data.deleted, 10) === 1 && parseInt(data.expose_tools, 10) === 0) {
|
||||
return res.json(404, {});
|
||||
}
|
||||
|
||||
res.json(data);
|
||||
});
|
||||
} else {
|
||||
res.send(403);
|
||||
@@ -184,16 +208,28 @@ var path = require('path'),
|
||||
|
||||
app.get('/category/:id/:slug?', function (req, res, next) {
|
||||
var uid = (req.user) ? req.user.uid : 0;
|
||||
var page = 1;
|
||||
if(req.query && req.query.page) {
|
||||
page = req.query.page;
|
||||
}
|
||||
|
||||
if(!utils.isNumber(page) || parseInt(page, 10) < 1) {
|
||||
return res.send(404);
|
||||
}
|
||||
|
||||
var topicsPerPage = parseInt(meta.config.topicsPerPage ? meta.config.topicsPerPage : 20, 10);
|
||||
var start = (page - 1) * topicsPerPage;
|
||||
var end = start + topicsPerPage - 1;
|
||||
|
||||
// Category Whitelisting
|
||||
categoryTools.privileges(req.params.id, uid, function(err, privileges) {
|
||||
if (!err && privileges.read) {
|
||||
categories.getCategoryById(req.params.id, uid, function (err, data) {
|
||||
categories.getCategoryById(req.params.id, start, end, uid, function (err, data) {
|
||||
if(err) {
|
||||
return next(err);
|
||||
}
|
||||
|
||||
// Add privilege data to template data
|
||||
data.currentPage = page;
|
||||
data.privileges = privileges;
|
||||
|
||||
if (data && parseInt(data.disabled, 10) === 0) {
|
||||
|
||||
@@ -74,7 +74,13 @@ var DebugRoute = function(app) {
|
||||
});
|
||||
|
||||
app.get('/test', function(req, res) {
|
||||
res.send();
|
||||
|
||||
/*topics.getTopicPosts2(2, 0, 10, 5, function(err, data) {
|
||||
res.json(data);
|
||||
})*/
|
||||
topics.getTopicWithPosts(2, 1, 0, -1, true, function (err, topicData) {
|
||||
res.json(topicData);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@@ -8,6 +8,7 @@ var fs = require('fs'),
|
||||
posts = require('./../posts'),
|
||||
postTools = require('../postTools'),
|
||||
utils = require('./../../public/src/utils'),
|
||||
templates = require('./../../public/src/templates'),
|
||||
meta = require('./../meta'),
|
||||
db = require('./../database');
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
var categories = require('../categories'),
|
||||
meta = require('./../meta'),
|
||||
|
||||
SocketCategories = {};
|
||||
|
||||
@@ -15,8 +16,10 @@ SocketCategories.loadMore = function(socket, data, callback) {
|
||||
return callback(new Error('invalid data'));
|
||||
}
|
||||
|
||||
var topicsPerPage = parseInt(meta.config.topicsPerPage, 10) || 20;
|
||||
|
||||
var start = data.after,
|
||||
end = start + 9;
|
||||
end = start + topicsPerPage - 1;
|
||||
|
||||
categories.getCategoryTopics(data.cid, start, end, socket.uid, function(err, topics) {
|
||||
callback(err, {
|
||||
@@ -25,4 +28,8 @@ SocketCategories.loadMore = function(socket, data, callback) {
|
||||
});
|
||||
};
|
||||
|
||||
SocketCategories.getPageCount = function(socket, cid, callback) {
|
||||
categories.getPageCount(cid, callback);
|
||||
}
|
||||
|
||||
module.exports = SocketCategories;
|
||||
@@ -30,9 +30,9 @@ Sockets.userSockets = {};
|
||||
Sockets.rooms = {};
|
||||
|
||||
|
||||
Sockets.init = function() {
|
||||
Sockets.init = function(server) {
|
||||
|
||||
io = socketioWildcard(SocketIO).listen(global.server, {
|
||||
io = socketioWildcard(SocketIO).listen(server, {
|
||||
log: false,
|
||||
transports: ['websocket', 'xhr-polling', 'jsonp-polling', 'flashsocket'],
|
||||
'browser client minification': true
|
||||
|
||||
@@ -58,7 +58,7 @@ SocketMeta.updateHeader = function(socket, data, callback) {
|
||||
email: '',
|
||||
picture: gravatar.url('', {
|
||||
s: '24'
|
||||
}, nconf.get('https')),
|
||||
}, true),
|
||||
config: {
|
||||
allowGuestSearching: meta.config.allowGuestSearching
|
||||
}
|
||||
|
||||
@@ -93,7 +93,17 @@ SocketPosts.uploadFile = function(socket, data, callback) {
|
||||
};
|
||||
|
||||
SocketPosts.getRawPost = function(socket, pid, callback) {
|
||||
posts.getPostField(pid, 'content', callback);
|
||||
posts.getPostFields(pid, ['content', 'deleted'], function(err, data) {
|
||||
if(err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if(data.deleted === '1') {
|
||||
return callback(new Error('This post no longer exists'));
|
||||
}
|
||||
|
||||
callback(null, data.content);
|
||||
});
|
||||
};
|
||||
|
||||
SocketPosts.edit = function(socket, data, callback) {
|
||||
@@ -194,4 +204,8 @@ SocketPosts.getFavouritedUsers = function(socket, pid, callback) {
|
||||
});
|
||||
};
|
||||
|
||||
SocketPosts.getPidPage = function(socket, pid, callback) {
|
||||
posts.getPidPage(pid, callback);
|
||||
}
|
||||
|
||||
module.exports = SocketPosts;
|
||||
@@ -1,6 +1,9 @@
|
||||
var topics = require('../topics'),
|
||||
threadTools = require('../threadTools'),
|
||||
index = require('./index'),
|
||||
|
||||
async = require('async'),
|
||||
|
||||
SocketTopics = {};
|
||||
|
||||
SocketTopics.post = function(socket, data, callback) {
|
||||
@@ -230,11 +233,21 @@ SocketTopics.loadMore = function(socket, data, callback) {
|
||||
return callback(new Error('invalid data'));
|
||||
}
|
||||
|
||||
var start = data.after,
|
||||
end = start + 9;
|
||||
var postsPerPage = parseInt(meta.config.postsPerPage, 10);
|
||||
postsPerPage = postsPerPage ? postsPerPage : 20;
|
||||
|
||||
topics.getTopicPosts(data.tid, start, end, socket.uid, function(err, posts) {
|
||||
callback(err, {posts: posts});
|
||||
var start = data.after,
|
||||
end = start + postsPerPage - 1;
|
||||
|
||||
async.parallel({
|
||||
posts: function(next) {
|
||||
topics.getTopicPosts(data.tid, start, end, socket.uid, next);
|
||||
},
|
||||
privileges: function(next) {
|
||||
threadTools.privileges(data.tid, socket.uid, next);
|
||||
}
|
||||
}, function(err, results) {
|
||||
callback(err, results);
|
||||
});
|
||||
};
|
||||
|
||||
@@ -256,4 +269,8 @@ SocketTopics.loadMoreUnreadTopics = function(socket, data, callback) {
|
||||
topics.getUnreadTopics(socket.uid, start, end, callback);
|
||||
};
|
||||
|
||||
SocketTopics.getPageCount = function(socket, tid, callback) {
|
||||
topics.getPageCount(tid, callback);
|
||||
}
|
||||
|
||||
module.exports = SocketTopics;
|
||||
@@ -187,9 +187,20 @@ var winston = require('winston'),
|
||||
|
||||
ThreadTools.move = function(tid, cid, callback) {
|
||||
topics.getTopicFields(tid, ['cid', 'lastposttime'], function(err, topicData) {
|
||||
if(err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
var oldCid = topicData.cid;
|
||||
if(!oldCid) {
|
||||
return callback(new Error('invalid-topic'));
|
||||
}
|
||||
|
||||
db.sortedSetRemove('categories:' + oldCid + ':tid', tid, function(err, result) {
|
||||
if(err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
db.sortedSetAdd('categories:' + cid + ':tid', topicData.lastposttime, tid, function(err, result) {
|
||||
|
||||
if(err) {
|
||||
|
||||
@@ -330,10 +330,6 @@ var async = require('async'),
|
||||
postData[i].index = start + i;
|
||||
}
|
||||
|
||||
postData = postData.filter(function(post) {
|
||||
return parseInt(current_user, 10) !== 0 || parseInt(post.deleted, 10) === 0;
|
||||
});
|
||||
|
||||
pids = postData.map(function(post) {
|
||||
return post.pid;
|
||||
});
|
||||
@@ -386,6 +382,9 @@ var async = require('async'),
|
||||
postData[i].favourited = fav_data[pid];
|
||||
postData[i].display_moderator_tools = (current_user != 0) && privileges[pid].editable;
|
||||
postData[i].display_move_tools = privileges[pid].move ? '' : 'hidden';
|
||||
if(parseInt(postData[i].deleted, 10) === 1 && !privileges[pid].view_deleted) {
|
||||
postData[i].content = 'This post is deleted!';
|
||||
}
|
||||
}
|
||||
|
||||
callback(null, postData);
|
||||
@@ -393,6 +392,19 @@ var async = require('async'),
|
||||
});
|
||||
}
|
||||
|
||||
Topics.getPageCount = function(tid, callback) {
|
||||
db.sortedSetCard('tid:' + tid + ':posts', function(err, postCount) {
|
||||
if(err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
var postsPerPage = parseInt(meta.config.postsPerPage, 10);
|
||||
postsPerPage = postsPerPage ? postsPerPage : 20;
|
||||
|
||||
callback(null, Math.ceil(parseInt(postCount, 10) / postsPerPage));
|
||||
});
|
||||
}
|
||||
|
||||
Topics.getCategoryData = function(tid, callback) {
|
||||
Topics.getTopicField(tid, 'cid', function(err, cid) {
|
||||
if(err) {
|
||||
@@ -713,14 +725,14 @@ var async = require('async'),
|
||||
topicData.unreplied = parseInt(topicData.postcount, 10) === 1;
|
||||
topicData.username = topicInfo.username || 'anonymous';
|
||||
topicData.userslug = topicInfo.userslug || '';
|
||||
topicData.picture = topicInfo.picture || gravatar.url('', {}, https = nconf.get('https'));
|
||||
topicData.picture = topicInfo.picture || gravatar.url('', {}, true);
|
||||
topicData.categoryIcon = topicInfo.categoryData.icon;
|
||||
topicData.categoryName = topicInfo.categoryData.name;
|
||||
topicData.categorySlug = topicInfo.categoryData.slug;
|
||||
topicData.badgeclass = (topicInfo.hasread && parseInt(current_user, 10) !== 0) ? '' : 'badge-important';
|
||||
topicData.teaser_username = topicInfo.teaserInfo.username || '';
|
||||
topicData.teaser_userslug = topicInfo.teaserInfo.userslug || '';
|
||||
topicData.teaser_userpicture = topicInfo.teaserInfo.picture || gravatar.url('', {}, https = nconf.get('https'));
|
||||
topicData.teaser_userpicture = topicInfo.teaserInfo.picture || gravatar.url('', {}, true);
|
||||
topicData.teaser_pid = topicInfo.teaserInfo.pid;
|
||||
topicData.teaser_timestamp = utils.toISOString(topicInfo.teaserInfo.timestamp);
|
||||
|
||||
@@ -755,21 +767,25 @@ var async = require('async'),
|
||||
|
||||
function getTopicData(next) {
|
||||
Topics.getTopicData(tid, next);
|
||||
};
|
||||
}
|
||||
|
||||
function getTopicPosts(next) {
|
||||
Topics.getTopicPosts(tid, start, end, current_user, next);
|
||||
};
|
||||
}
|
||||
|
||||
function getPrivileges(next) {
|
||||
threadTools.privileges(tid, current_user, next);
|
||||
};
|
||||
}
|
||||
|
||||
function getCategoryData(next) {
|
||||
Topics.getCategoryData(tid, next);
|
||||
};
|
||||
}
|
||||
|
||||
async.parallel([getTopicData, getTopicPosts, getPrivileges, getCategoryData], function(err, results) {
|
||||
function getPageCount(next) {
|
||||
Topics.getPageCount(tid, next);
|
||||
}
|
||||
|
||||
async.parallel([getTopicData, getTopicPosts, getPrivileges, getCategoryData, getPageCount], function(err, results) {
|
||||
if (err) {
|
||||
winston.error('[Topics.getTopicWithPosts] Could not retrieve topic data: ', err.message);
|
||||
return callback(err, null);
|
||||
@@ -778,7 +794,11 @@ var async = require('async'),
|
||||
var topicData = results[0],
|
||||
topicPosts = results[1],
|
||||
privileges = results[2],
|
||||
categoryData = results[3];
|
||||
categoryData = results[3],
|
||||
pageCount = results[4];
|
||||
|
||||
var postsPerPage = parseInt(meta.config.postsPerPage, 10);
|
||||
postsPerPage = postsPerPage ? postsPerPage : 20;
|
||||
|
||||
callback(null, {
|
||||
'topic_name': topicData.title,
|
||||
@@ -791,6 +811,7 @@ var async = require('async'),
|
||||
'slug': topicData.slug,
|
||||
'postcount': topicData.postcount,
|
||||
'viewcount': topicData.viewcount,
|
||||
'pageCount': pageCount,
|
||||
'unreplied': parseInt(topicData.postcount, 10) > 1,
|
||||
'topic_id': tid,
|
||||
'expose_tools': privileges.editable ? 1 : 0,
|
||||
@@ -1018,7 +1039,7 @@ var async = require('async'),
|
||||
pid: postData.pid,
|
||||
username: userData.username || 'anonymous',
|
||||
userslug: userData.userslug,
|
||||
picture: userData.picture || gravatar.url('', {}, https = nconf.get('https')),
|
||||
picture: userData.picture || gravatar.url('', {}, true),
|
||||
timestamp: postData.timestamp
|
||||
});
|
||||
});
|
||||
|
||||
@@ -17,7 +17,7 @@ var db = require('./database'),
|
||||
|
||||
Upgrade.check = function(callback) {
|
||||
// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema
|
||||
var latestSchema = new Date(2014, 0, 23, 16, 5).getTime();
|
||||
var latestSchema = new Date(2014, 0, 25, 0, 0).getTime();
|
||||
|
||||
db.get('schemaDate', function(err, value) {
|
||||
if (parseInt(value, 10) >= latestSchema) {
|
||||
@@ -318,11 +318,46 @@ Upgrade.upgrade = function(callback) {
|
||||
winston.info('[2014/1/23] Updating Administrators Group');
|
||||
next();
|
||||
});
|
||||
})
|
||||
});
|
||||
} else {
|
||||
winston.info('[2014/1/23] Updating Administrators Group -- skipped');
|
||||
next();
|
||||
}
|
||||
},
|
||||
function(next) {
|
||||
thisSchemaDate = new Date(2014, 0, 25, 0, 0).getTime();
|
||||
if (schemaDate < thisSchemaDate) {
|
||||
updatesMade = true;
|
||||
|
||||
db.getSortedSetRange('users:joindate', 0, -1, function(err, uids) {
|
||||
if(err) {
|
||||
return next(err);
|
||||
}
|
||||
|
||||
if(!uids || !uids.length) {
|
||||
winston.info('[2014/1/25] Updating User Gravatars to HTTPS -- skipped');
|
||||
return next();
|
||||
}
|
||||
|
||||
var gravatar = require('gravatar');
|
||||
|
||||
function updateGravatar(uid, next) {
|
||||
User.getUserFields(uid, ['email', 'picture', 'gravatarpicture'], function(err, userData) {
|
||||
var gravatarPicture = User.createGravatarURLFromEmail(userData.email);
|
||||
if(userData.picture === userData.gravatarpicture) {
|
||||
User.setUserField(uid, 'picture', gravatarPicture);
|
||||
}
|
||||
User.setUserField(uid, 'gravatarpicture', gravatarPicture, next);
|
||||
});
|
||||
}
|
||||
|
||||
winston.info('[2014/1/25] Updating User Gravatars to HTTPS');
|
||||
async.each(uids, updateGravatar, next);
|
||||
});
|
||||
} else {
|
||||
winston.info('[2014/1/25] Updating User Gravatars to HTTPS -- skipped');
|
||||
next();
|
||||
}
|
||||
}
|
||||
// Add new schema updates here
|
||||
// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema IN LINE 17!!!
|
||||
|
||||
17
src/user.js
17
src/user.js
@@ -442,15 +442,14 @@ var bcrypt = require('bcrypt'),
|
||||
size: '128',
|
||||
default: 'identicon',
|
||||
rating: 'pg'
|
||||
},
|
||||
https = nconf.get('https');
|
||||
};
|
||||
|
||||
if (!email) {
|
||||
email = '';
|
||||
options.forcedefault = 'y';
|
||||
}
|
||||
|
||||
return gravatar.url(email, options, https);
|
||||
return gravatar.url(email, options, true);
|
||||
};
|
||||
|
||||
User.hashPassword = function(password, callback) {
|
||||
@@ -490,13 +489,13 @@ var bcrypt = require('bcrypt'),
|
||||
|
||||
User.search = function(query, callback) {
|
||||
if (!query || query.length === 0) {
|
||||
return callback(null, []);
|
||||
return callback(null, {timing:0, users:[]});
|
||||
}
|
||||
var start = process.hrtime();
|
||||
|
||||
db.getObject('username:uid', function(err, usernamesHash) {
|
||||
if (err) {
|
||||
return callback(null, []);
|
||||
return callback(null, {timing: 0, users:[]});
|
||||
}
|
||||
|
||||
query = query.toLowerCase();
|
||||
@@ -516,7 +515,9 @@ var bcrypt = require('bcrypt'),
|
||||
});
|
||||
|
||||
User.getDataForUsers(results, function(userdata) {
|
||||
callback(null, userdata);
|
||||
var diff = process.hrtime(start);
|
||||
var timing = (diff[0] * 1e3 + diff[1] / 1e6).toFixed(1);
|
||||
callback(null, {timing: timing, users: userdata});
|
||||
});
|
||||
});
|
||||
};
|
||||
@@ -885,6 +886,10 @@ var bcrypt = require('bcrypt'),
|
||||
|
||||
User.email = {
|
||||
verify: function(uid, email) {
|
||||
if (!plugins.hasListeners('action:email.send')) {
|
||||
return;
|
||||
}
|
||||
|
||||
var confirm_code = utils.generateUUID(),
|
||||
confirm_link = nconf.get('url') + '/confirm/' + confirm_code;
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ var path = require('path'),
|
||||
validator = require('validator'),
|
||||
async = require('async'),
|
||||
S = require('string'),
|
||||
qs = require('querystring'),
|
||||
|
||||
pkg = require('../package.json'),
|
||||
|
||||
@@ -28,7 +29,9 @@ var path = require('path'),
|
||||
meta = require('./meta'),
|
||||
feed = require('./feed'),
|
||||
plugins = require('./plugins'),
|
||||
logger = require('./logger');
|
||||
logger = require('./logger'),
|
||||
templates = require('./../public/src/templates'),
|
||||
translator = require('./../public/src/translator');
|
||||
|
||||
if(nconf.get('ssl')) {
|
||||
server = require('https').createServer({
|
||||
@@ -39,13 +42,12 @@ if(nconf.get('ssl')) {
|
||||
server = require('http').createServer(WebServer);
|
||||
}
|
||||
|
||||
module.exports.server = server;
|
||||
|
||||
(function (app) {
|
||||
"use strict";
|
||||
|
||||
var templates = null,
|
||||
clientScripts;
|
||||
|
||||
var clientScripts;
|
||||
|
||||
plugins.ready(function() {
|
||||
// Minify client-side libraries
|
||||
@@ -60,9 +62,6 @@ if(nconf.get('ssl')) {
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
server.app = app;
|
||||
|
||||
/**
|
||||
* `options` object requires: req, res
|
||||
* accepts: metaTags, linkTags
|
||||
@@ -200,7 +199,6 @@ if(nconf.get('ssl')) {
|
||||
|
||||
// Local vars, other assorted setup
|
||||
app.use(function (req, res, next) {
|
||||
nconf.set('https', req.secure);
|
||||
res.locals.csrf_token = req.session._csrf;
|
||||
|
||||
// Disable framing
|
||||
@@ -376,8 +374,6 @@ if(nconf.get('ssl')) {
|
||||
});
|
||||
|
||||
module.exports.init = function () {
|
||||
templates = global.templates;
|
||||
|
||||
// translate all static templates served by webserver here. ex. footer, logout
|
||||
plugins.fireHook('filter:footer.build', '', function(err, appendHTML) {
|
||||
var footer = templates.footer.parse({
|
||||
@@ -649,6 +645,10 @@ if(nconf.get('ssl')) {
|
||||
}
|
||||
|
||||
var topic_url = tid + (req.params.slug ? '/' + req.params.slug : '');
|
||||
var queryString = qs.stringify(req.query);
|
||||
if(queryString.length) {
|
||||
topic_url += '?' + queryString;
|
||||
}
|
||||
|
||||
res.send(
|
||||
data.header +
|
||||
@@ -706,7 +706,7 @@ if(nconf.get('ssl')) {
|
||||
});
|
||||
},
|
||||
function (next) {
|
||||
categories.getCategoryById(cid, 0, function (err, categoryData) {
|
||||
categories.getCategoryById(cid, 0, -1, 0, function (err, categoryData) {
|
||||
|
||||
if (categoryData) {
|
||||
if (parseInt(categoryData.disabled, 10) === 1) {
|
||||
@@ -763,6 +763,10 @@ if(nconf.get('ssl')) {
|
||||
}
|
||||
|
||||
var category_url = cid + (req.params.slug ? '/' + req.params.slug : '');
|
||||
var queryString = qs.stringify(req.query);
|
||||
if(queryString.length) {
|
||||
category_url += '?' + queryString;
|
||||
}
|
||||
|
||||
res.send(
|
||||
data.header +
|
||||
@@ -932,6 +936,3 @@ if(nconf.get('ssl')) {
|
||||
|
||||
});
|
||||
}(WebServer));
|
||||
|
||||
|
||||
global.server = server;
|
||||
|
||||
Reference in New Issue
Block a user