From 6dfb229c66e6845ad9fa49d241cdffb03ae8e22d Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 22 Apr 2015 12:13:14 -0400 Subject: [PATCH 1/3] closes #2842 --- src/controllers/index.js | 2 +- src/middleware/middleware.js | 21 +++++++++++---------- src/routes/authentication.js | 24 ++++++++++++++++-------- src/routes/index.js | 4 +++- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/controllers/index.js b/src/controllers/index.js index 9500fca12c..7a2f225290 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -81,7 +81,7 @@ Controllers.login = function(req, res, next) { data.alternate_logins = loginStrategies.length > 0; data.authentication = loginStrategies; data.showResetLink = emailersPresent; - data.allowLocalLogin = parseInt(meta.config.allowLocalLogin, 10) === 1; + data.allowLocalLogin = parseInt(meta.config.allowLocalLogin, 10) === 1 || parseInt(req.query.local, 10) === 1; data.allowRegistration = parseInt(meta.config.allowRegistration, 10) === 1; data.allowLoginWith = '[[login:' + (meta.config.allowLoginWith || 'username-email') + ']]'; data.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[global:login]]'}]); diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 9e400de9b7..8adc6aabe7 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -10,18 +10,19 @@ var app, winston = require('winston'), validator = require('validator'), nconf = require('nconf'), + ensureLoggedIn = require('connect-ensure-login'), - plugins = require('./../plugins'), - navigation = require('./../navigation'), - meta = require('./../meta'), - translator = require('./../../public/src/modules/translator'), - user = require('./../user'), - groups = require('./../groups'), - db = require('./../database'), - categories = require('./../categories'), - topics = require('./../topics'), + plugins = require('../plugins'), + navigation = require('../navigation'), + meta = require('../meta'), + translator = require('../../public/src/modules/translator'), + user = require('../user'), + groups = require('../groups'), + db = require('../database'), + categories = require('../categories'), + topics = require('../topics'), messaging = require('../messaging'), - ensureLoggedIn = require('connect-ensure-login'), + analytics = require('../analytics'), controllers = { diff --git a/src/routes/authentication.js b/src/routes/authentication.js index a0f420458d..4f9611e56a 100644 --- a/src/routes/authentication.js +++ b/src/routes/authentication.js @@ -101,11 +101,23 @@ user.auth.logAttempt(uid, req.ip, next); }, function(next) { - db.getObjectFields('user:' + uid, ['password', 'banned', 'passwordExpiry'], next); + async.parallel({ + userData: function(next) { + db.getObjectFields('user:' + uid, ['password', 'banned', 'passwordExpiry'], next); + }, + isAdmin: function(next) { + user.isAdministrator(uid, next); + } + }, next); }, - function(_userData, next) { - userData = _userData; + function(result, next) { + userData = result.userData; userData.uid = uid; + userData.isAdmin = result.isAdmin; + + if (!result.isAdmin && parseInt(meta.config.allowLocalLogin, 10) === 0) { + return next(new Error('[[error:local-login-disabled]]')); + } if (!userData || !userData.password) { return next(new Error('[[error:invalid-user-data]]')); @@ -136,10 +148,6 @@ }); function login(req, res, next) { - if (parseInt(meta.config.allowLocalLogin, 10) === 0) { - return res.status(404).send(''); - } - // Handle returnTo data if (req.body.hasOwnProperty('returnTo') && !req.session.returnTo) { req.session.returnTo = req.body.returnTo; @@ -147,7 +155,7 @@ if (plugins.hasListeners('action:auth.overrideLogin')) { return Auth.continueLogin(req, res, next); - }; + } var loginWith = meta.config.allowLoginWith || 'username-email'; diff --git a/src/routes/index.js b/src/routes/index.js index e9a2ed5ace..2ebf77d53e 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -118,7 +118,9 @@ module.exports = function(app, middleware) { app.all(relativePath + '/api/?*', middleware.prepareAPI); app.all(relativePath + '/api/admin/?*', middleware.isAdmin); - app.all(relativePath + '/admin/?*', middleware.ensureLoggedIn, middleware.applyCSRF, middleware.isAdmin); + + var ensureLoggedIn = require('connect-ensure-login'); + app.all(relativePath + '/admin/?*', ensureLoggedIn.ensureLoggedIn(nconf.get('relative_path') + '/login?local=1'), middleware.applyCSRF, middleware.isAdmin); adminRoutes(router, middleware, controllers); metaRoutes(router, middleware, controllers); From dd61bdb9c6b5f99611ee01f73c24cbade3687a2c Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 22 Apr 2015 13:47:41 -0400 Subject: [PATCH 2/3] closes #3038 --- public/src/client/account/favourites.js | 6 +++-- public/src/client/account/posts.js | 6 +++-- public/src/client/account/topics.js | 6 +++-- public/src/client/account/watched.js | 6 +++-- public/src/client/category.js | 3 +-- public/src/client/recent.js | 2 +- public/src/client/tag.js | 2 +- src/controllers/accounts.js | 36 +++++++++++++++++++++---- src/pagination.js | 2 +- 9 files changed, 51 insertions(+), 18 deletions(-) diff --git a/public/src/client/account/favourites.js b/public/src/client/account/favourites.js index 1e6e77e20b..30a6d29a7e 100644 --- a/public/src/client/account/favourites.js +++ b/public/src/client/account/favourites.js @@ -10,7 +10,9 @@ define('forum/account/favourites', ['forum/account/header', 'forum/infinitescrol $('.user-favourite-posts img').addClass('img-responsive'); - infinitescroll.init(loadMore); + if (!config.usePagination) { + infinitescroll.init(loadMore); + } }; function loadMore(direction) { @@ -24,10 +26,10 @@ define('forum/account/favourites', ['forum/account/header', 'forum/infinitescrol }, function(data, done) { if (data.posts && data.posts.length) { onPostsLoaded(data.posts, done); - $('.user-favourite-posts').attr('data-nextstart', data.nextStart); } else { done(); } + $('.user-favourite-posts').attr('data-nextstart', data.nextStart); }); } diff --git a/public/src/client/account/posts.js b/public/src/client/account/posts.js index c4759b9016..9b04cdc67a 100644 --- a/public/src/client/account/posts.js +++ b/public/src/client/account/posts.js @@ -10,7 +10,9 @@ define('forum/account/posts', ['forum/account/header', 'forum/infinitescroll'], $('.user-favourite-posts img').addClass('img-responsive'); - infinitescroll.init(loadMore); + if (!config.usePagination) { + infinitescroll.init(loadMore); + } }; function loadMore(direction) { @@ -24,10 +26,10 @@ define('forum/account/posts', ['forum/account/header', 'forum/infinitescroll'], }, function(data, done) { if (data.posts && data.posts.length) { onPostsLoaded(data.posts, done); - $('.user-favourite-posts').attr('data-nextstart', data.nextStart); } else { done(); } + $('.user-favourite-posts').attr('data-nextstart', data.nextStart); }); } diff --git a/public/src/client/account/topics.js b/public/src/client/account/topics.js index c6c93f4262..3242f0395e 100644 --- a/public/src/client/account/topics.js +++ b/public/src/client/account/topics.js @@ -8,7 +8,9 @@ define('forum/account/topics', ['forum/account/header', 'forum/infinitescroll'], AccountTopics.init = function() { header.init(); - infinitescroll.init(loadMore); + if (!config.usePagination) { + infinitescroll.init(loadMore); + } }; function loadMore(direction) { @@ -23,10 +25,10 @@ define('forum/account/topics', ['forum/account/header', 'forum/infinitescroll'], if (data.topics && data.topics.length) { onTopicsLoaded(data.topics, done); - $('[component="category"]').attr('data-nextstart', data.nextStart); } else { done(); } + $('[component="category"]').attr('data-nextstart', data.nextStart); }); } diff --git a/public/src/client/account/watched.js b/public/src/client/account/watched.js index 08feb89344..b9f7fcc5f7 100644 --- a/public/src/client/account/watched.js +++ b/public/src/client/account/watched.js @@ -7,7 +7,9 @@ define('forum/account/watched', ['forum/account/header', 'forum/infinitescroll'] AccountWatched.init = function() { header.init(); - infinitescroll.init(loadMore); + if (!config.usePagination) { + infinitescroll.init(loadMore); + } }; function loadMore(direction) { @@ -21,10 +23,10 @@ define('forum/account/watched', ['forum/account/header', 'forum/infinitescroll'] }, function(data, done) { if (data.topics && data.topics.length) { onTopicsLoaded(data.topics, done); - $('[component="category"]').attr('data-nextstart', data.nextStart); } else { done(); } + $('[component="category"]').attr('data-nextstart', data.nextStart); }); } diff --git a/public/src/client/category.js b/public/src/client/category.js index 5e64f4fc56..777d3f808a 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -342,17 +342,16 @@ define('forum/category', [ after: after, author: utils.params().author }, function (data, done) { - if (data.topics && data.topics.length) { Category.onTopicsLoaded(data, function() { done(); callback(); }); - $('[component="category"]').attr('data-nextstart', data.nextStart); } else { done(); } + $('[component="category"]').attr('data-nextstart', data.nextStart); $(window).trigger('action:categories.loaded'); }); } diff --git a/public/src/client/recent.js b/public/src/client/recent.js index dc4a949c4d..fc55ee9b08 100644 --- a/public/src/client/recent.js +++ b/public/src/client/recent.js @@ -93,10 +93,10 @@ define('forum/recent', ['forum/infinitescroll', 'components'], function(infinite }, function(data, done) { if (data.topics && data.topics.length) { Recent.onTopicsLoaded('recent', data.topics, false, done); - $('[component="category"]').attr('data-nextstart', data.nextStart); } else { done(); } + $('[component="category"]').attr('data-nextstart', data.nextStart); }); }; diff --git a/public/src/client/tag.js b/public/src/client/tag.js index 7328934e2d..d2e6dd30b7 100644 --- a/public/src/client/tag.js +++ b/public/src/client/tag.js @@ -29,11 +29,11 @@ define('forum/tag', ['forum/recent', 'forum/infinitescroll'], function(recent, i }, function(data, done) { if (data.topics && data.topics.length) { recent.onTopicsLoaded('tag', data.topics, false, done); - $('[component="category"]').attr('data-nextstart', data.nextStart); } else { done(); $('#load-more-btn').hide(); } + $('[component="category"]').attr('data-nextstart', data.nextStart); }); } }; diff --git a/src/controllers/accounts.js b/src/controllers/accounts.js index 536241dba1..71a208ba06 100644 --- a/src/controllers/accounts.js +++ b/src/controllers/accounts.js @@ -255,22 +255,48 @@ accountsController.getGroups = function(req, res, next) { }; function getFromUserSet(tpl, set, method, type, req, res, next) { - accountsController.getBaseUser(req.params.userslug, req.uid, function(err, userData) { + async.parallel({ + settings: function(next) { + user.getSettings(req.uid, next); + }, + userData: function(next) { + accountsController.getBaseUser(req.params.userslug, req.uid, next); + } + }, function(err, results) { if (err) { return next(err); } - + var userData = results.userData; if (!userData) { return helpers.notFound(req, res); } - method('uid:' + userData.uid + ':' + set, req.uid, 0, 19, function(err, data) { + var setName = 'uid:' + userData.uid + ':' + set; + + var page = Math.max(1, parseInt(req.query.page, 10) || 1); + var itemsPerPage = (tpl === 'account/topics' || tpl === 'account/watched') ? results.settings.topicsPerPage : results.settings.postsPerPage; + itemsPerPage = parseInt(itemsPerPage, 10); + + async.parallel({ + count: function(next) { + db.sortedSetCard(setName, next); + }, + data: function(next) { + var start = (page - 1) * itemsPerPage; + var stop = start + itemsPerPage; + method(setName, req.uid, start, stop, next); + } + }, function(err, results) { if (err) { return next(err); } - userData[type] = data[type]; - userData.nextStart = data.nextStart; + userData[type] = results.data[type]; + userData.nextStart = results.data.nextStart; + var pageCount = Math.ceil(results.count / itemsPerPage); + + var pagination = require('../pagination'); + userData.pagination = pagination.create(page, pageCount); res.render(tpl, userData); }); diff --git a/src/pagination.js b/src/pagination.js index 58aac68f8f..58813c391b 100644 --- a/src/pagination.js +++ b/src/pagination.js @@ -13,7 +13,7 @@ pagination.create = function(currentPage, pageCount, queryObj) { pages: [] }; } - + pageCount = parseInt(pageCount, 10); var pagesToShow = [1, 2, pageCount - 1, pageCount]; currentPage = parseInt(currentPage, 10) || 1; From d99e028a1e4d34c8b975d35d145869b89f820e68 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 22 Apr 2015 13:57:14 -0400 Subject: [PATCH 3/3] only call sortedSetCard if using pagination --- src/controllers/accounts.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/controllers/accounts.js b/src/controllers/accounts.js index 71a208ba06..8dd8860a45 100644 --- a/src/controllers/accounts.js +++ b/src/controllers/accounts.js @@ -275,11 +275,14 @@ function getFromUserSet(tpl, set, method, type, req, res, next) { var page = Math.max(1, parseInt(req.query.page, 10) || 1); var itemsPerPage = (tpl === 'account/topics' || tpl === 'account/watched') ? results.settings.topicsPerPage : results.settings.postsPerPage; - itemsPerPage = parseInt(itemsPerPage, 10); async.parallel({ - count: function(next) { - db.sortedSetCard(setName, next); + itemCount: function(next) { + if (results.settings.usePagination) { + db.sortedSetCard(setName, next); + } else { + next(null, 0); + } }, data: function(next) { var start = (page - 1) * itemsPerPage; @@ -293,7 +296,7 @@ function getFromUserSet(tpl, set, method, type, req, res, next) { userData[type] = results.data[type]; userData.nextStart = results.data.nextStart; - var pageCount = Math.ceil(results.count / itemsPerPage); + var pageCount = Math.ceil(results.itemCount / itemsPerPage); var pagination = require('../pagination'); userData.pagination = pagination.create(page, pageCount);