From e0f6b4edf09c0ef68abcf4b65bc5e713c491fcad Mon Sep 17 00:00:00 2001 From: NodeBB Misty Date: Mon, 28 Mar 2016 09:02:18 -0400 Subject: [PATCH 1/6] Latest translations and fallbacks --- public/language/fr/error.json | 4 ++-- public/language/fr/global.json | 4 ++-- public/language/fr/groups.json | 2 +- public/language/fr/modules.json | 8 ++++---- public/language/fr/user.json | 4 ++-- public/language/fr/users.json | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/public/language/fr/error.json b/public/language/fr/error.json index b34f0c58c6..d80c43277e 100644 --- a/public/language/fr/error.json +++ b/public/language/fr/error.json @@ -27,7 +27,7 @@ "password-too-long": "Mot de passe trop long", "user-banned": "Utilisateur banni", "user-too-new": "Désolé, vous devez attendre encore %1 seconde(s) avant d'envoyer votre premier message", - "blacklisted-ip": "Sorry, your IP address has been banned from this community. If you feel this is in error, please contact an administrator.", + "blacklisted-ip": "Désolé, votre adresse IP a été bannie de cette communauté. Si vous pensez que c'est une erreur, veuillez contacter un administrateur.", "no-category": "Cette catégorie n'existe pas", "no-topic": "Ce sujet n'existe pas", "no-post": "Ce message n'existe pas", @@ -99,5 +99,5 @@ "no-session-found": "Pas de session de connexion trouvé!", "not-in-room": "L'utilisateur n'est pas dans cette salle", "no-users-in-room": "Aucun utilisateur dans cette salle", - "cant-kick-self": "You can't kick yourself from the group" + "cant-kick-self": "Vous ne pouvez pas vous exclure vous-même du groupe" } \ No newline at end of file diff --git a/public/language/fr/global.json b/public/language/fr/global.json index f7bd29a1b6..7096b63f7c 100644 --- a/public/language/fr/global.json +++ b/public/language/fr/global.json @@ -29,13 +29,13 @@ "header.popular": "Populaire", "header.users": "Utilisateurs", "header.groups": "Groupes", - "header.chats": "Chats", + "header.chats": "Discussions", "header.notifications": "Notifications", "header.search": "Recherche", "header.profile": "Profil", "header.navigation": "Navigation", "notifications.loading": "Chargement des notifications", - "chats.loading": "Chargement des chats", + "chats.loading": "Chargement des discussions", "motd.welcome": "Bienvenue sur NodeBB, la plate-forme de discussion du futur.", "previouspage": "Page précédente", "nextpage": "Page suivante", diff --git a/public/language/fr/groups.json b/public/language/fr/groups.json index 05f17fbd59..65a5274979 100644 --- a/public/language/fr/groups.json +++ b/public/language/fr/groups.json @@ -41,7 +41,7 @@ "details.hidden": "Masqué", "details.hidden_help": "Si cette case est cochée, ce groupe n'est pas affiché dans la liste des groupes, et les utilisateurs devront être invités manuellement.", "details.delete_group": "Supprimer le groupe", - "details.private_system_help": "Private groups is disabled at system level, this option does not do anything", + "details.private_system_help": "Les groupes privés sont désactivés au niveau du système, cette option ne déclenche rien", "event.updated": "Les détails du groupe ont été mis à jour", "event.deleted": "Le groupe \"%1\" a été supprimé", "membership.accept-invitation": "Accepter l'invitation", diff --git a/public/language/fr/modules.json b/public/language/fr/modules.json index 27ee80e92f..33fd5fe494 100644 --- a/public/language/fr/modules.json +++ b/public/language/fr/modules.json @@ -1,14 +1,14 @@ { "chat.chatting_with": "Discuter avec ", - "chat.placeholder": "Tapez votre message ici, appuyez sur Entrer pour envoyer", + "chat.placeholder": "Tapez votre message ici, appuyez sur Entrée pour envoyer", "chat.send": "Envoyer", "chat.no_active": "Vous n'avez aucune discussion en cours.", "chat.user_typing": "%1 est en train d'écrire ...", "chat.user_has_messaged_you": "%1 vous a envoyé un message.", "chat.see_all": "Voir toutes les discussions", - "chat.mark_all_read": "Mark all chats read", + "chat.mark_all_read": "Marquer toutes les discussions comme lues", "chat.no-messages": "Veuillez sélectionner un destinataire pour voir l'historique des discussions", - "chat.no-users-in-room": "Aucun utilisateur dans cette salle", + "chat.no-users-in-room": "Aucun participant à cette discussion", "chat.recent-chats": "Discussions récentes", "chat.contacts": "Contacts", "chat.message-history": "Historique des messages", @@ -19,7 +19,7 @@ "chat.three_months": "3 Mois", "chat.delete_message_confirm": "Êtes-vous sûr de vouloir supprimer ce message ?", "chat.roomname": "Salle de discussion %1", - "chat.add-users-to-room": "Ajouter des utilisateurs à la salle", + "chat.add-users-to-room": "Ajouter des participants", "composer.compose": "Écrire", "composer.show_preview": "Afficher l'aperçu", "composer.hide_preview": "Masquer l'aperçu", diff --git a/public/language/fr/user.json b/public/language/fr/user.json index 34c1026e7e..0a6450fdd3 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -39,7 +39,7 @@ "change_username": "Changer le nom d'utilisateur", "change_email": "Changer l'e-mail", "edit": "Éditer", - "edit-profile": "Edit Profile", + "edit-profile": "Éditer le profil", "default_picture": "Icône par défaut", "uploaded_picture": "Image envoyée", "upload_new_picture": "Envoyer une nouvelle image", @@ -92,7 +92,7 @@ "open_links_in_new_tab": "Ouvrir les liens externes dans un nouvel onglet", "enable_topic_searching": "Activer la recherche dans les sujets", "topic_search_help": "Une fois activé, la recherche dans les sujets va remplacer la recherche de page du navigateur et vous permettra de rechercher dans l'intégralité d'un sujet au lieu des seuls posts affichés à l'écran.", - "scroll_to_my_post": "After posting a reply, show the new post", + "scroll_to_my_post": "Après avoir répondu, montrer le nouveau message", "follow_topics_you_reply_to": "Suivre les sujets auxquels vous répondez", "follow_topics_you_create": "Suivre les sujets que vous créez", "grouptitle": "Sélectionnez le titre de groupe que vous souhaitez afficher", diff --git a/public/language/fr/users.json b/public/language/fr/users.json index d70a54698e..fad9536811 100644 --- a/public/language/fr/users.json +++ b/public/language/fr/users.json @@ -3,7 +3,7 @@ "top_posters": "Actifs", "most_reputation": "Réputés", "search": "Rechercher", - "enter_username": "Entrer un nom d'utilisateur pour rechercher", + "enter_username": "Entrez le nom d'un utilisateur", "load_more": "Charger la suite", "users-found-search-took": "%1 utilisateur(s) trouvé(s)! La recherche a pris %2 secondes.", "filter-by": "Filtrer par", From 31e70ac5a8ef053ce3f44f0ef2207fb79cec98e6 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 28 Mar 2016 14:02:56 -0400 Subject: [PATCH 2/6] applying threshold detection only to topics re: #4477 --- public/src/modules/navigator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/modules/navigator.js b/public/src/modules/navigator.js index 7127f1f15c..73ea9b8946 100644 --- a/public/src/modules/navigator.js +++ b/public/src/modules/navigator.js @@ -119,7 +119,7 @@ define('navigator', ['forum/pagination', 'components'], function(pagination, com }); // If a threshold is undefined, try to determine one based on new index - if (threshold === undefined) { + if (threshold === undefined && ajaxify.currentPage.startsWith('topic')) { var anchorEl = components.get('post/anchor', index - 1), anchorRect = anchorEl.get(0).getBoundingClientRect(); From 1783a07067dff9303ba92e753b40b46d3eb81114 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 28 Mar 2016 14:50:02 -0400 Subject: [PATCH 3/6] more tweaks to threshold --- public/less/global.less | 2 +- public/src/client/topic/posts.js | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/public/less/global.less b/public/less/global.less index d9f16c74e8..458fa4b8e6 100644 --- a/public/less/global.less +++ b/public/less/global.less @@ -14,7 +14,7 @@ &[data-state="unloaded"], &[data-state="loading"] { display: inherit; - height: 1rem; + height: 2rem; opacity: 0; } diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 5823d81b65..35e7ec5d29 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -10,7 +10,9 @@ define('forum/topic/posts', [ 'components' ], function(pagination, infinitescroll, postTools, navigator, components) { - var Posts = {}; + var Posts = { + _threshold: 0 + }; Posts.onNewPost = function(data) { if (!data || !data.posts || !data.posts.length) { @@ -255,6 +257,7 @@ define('forum/topic/posts', [ If no threshold is defined, loaded images will push down content, as per default */ + Posts._threshold = threshold; var images = components.get('post/content').find('img[data-state="unloaded"]'), visible = images.filter(function() { @@ -272,7 +275,7 @@ define('forum/topic/posts', [ newHeight = document.body.clientHeight; var imageRect = this.getBoundingClientRect(); - if (imageRect.top < threshold) { + if (imageRect.top < Posts._threshold) { scrollTop = scrollTop + (newHeight - oldHeight); $(window).scrollTop(scrollTop); } From 5e3a114b17b3fe738efc9c841e5905a5e740552e Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 28 Mar 2016 19:55:40 -0400 Subject: [PATCH 4/6] added LRU cache to registration queue data --- package.json | 1 + src/user/approval.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/package.json b/package.json index 9adf788c69..5289968835 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "autoprefixer": "^6.2.3", "bcryptjs": "~2.3.0", "body-parser": "^1.9.0", + "checksum": "^0.1.1", "colors": "^1.1.0", "compression": "^1.1.0", "connect-ensure-login": "^0.1.1", diff --git a/src/user/approval.js b/src/user/approval.js index 41237043eb..273ad3a3a2 100644 --- a/src/user/approval.js +++ b/src/user/approval.js @@ -3,6 +3,8 @@ var async = require('async'); var request = require('request'); +var LRU = require('lru-cache'); +var checksum = require('checksum'); var db = require('../database'); var meta = require('../meta'); @@ -12,6 +14,11 @@ var groups = require('../groups'); var translator = require('../../public/src/modules/translator'); var utils = require('../../public/src/utils'); +var sfsCache = LRU({ + max: 500, + maxAge: 1000*60*60*24 // one day +}); + module.exports = function(User) { @@ -163,6 +170,17 @@ module.exports = function(User) { return next(null, user); } + var sum = checksum(user.ip+user.email+user.username); + if (sfsCache.has(sum)) { + var cached = sfsCache.get(sum); + user.spamData = cached; + user.usernameSpam = cached.username.frequency > 0 || cached.username.appears > 0; + user.emailSpam = cached.email.frequency > 0 || cached.email.appears > 0; + user.ipSpam = cached.ip.frequency > 0 || cached.ip.appears > 0; + + return next(null, user); + } + // temporary: see http://www.stopforumspam.com/forum/viewtopic.php?id=6392 user.ip = user.ip.replace('::ffff:', ''); @@ -179,6 +197,7 @@ module.exports = function(User) { return next(null, user); } if (response.statusCode === 200) { + sfsCache.set(sum, body); user.spamData = body; user.usernameSpam = body.username.frequency > 0 || body.username.appears > 0; user.emailSpam = body.email.frequency > 0 || body.email.appears > 0; From 879a8ba55020b2b417306c1e8c9c0edb5b0ef837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 29 Mar 2016 11:00:21 +0300 Subject: [PATCH 5/6] up widget-essentials --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5289968835..f6b5639d22 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "nodebb-theme-lavender": "3.0.9", "nodebb-theme-persona": "4.0.114", "nodebb-theme-vanilla": "5.0.61", - "nodebb-widget-essentials": "2.0.8", + "nodebb-widget-essentials": "2.0.9", "nodemailer": "2.0.0", "nodemailer-sendmail-transport": "1.0.0", "nodemailer-smtp-transport": "^2.4.1", From 99ae0eb378c3ea240e2e0ade0e5cdbd0b4f44b9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 29 Mar 2016 11:26:28 +0300 Subject: [PATCH 6/6] closes #4468 --- package.json | 1 - src/controllers/admin/users.js | 13 +++++++++++-- src/user/approval.js | 21 +-------------------- src/views/admin/manage/registration.tpl | 2 ++ 4 files changed, 14 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index f6b5639d22..f3855046fc 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "autoprefixer": "^6.2.3", "bcryptjs": "~2.3.0", "body-parser": "^1.9.0", - "checksum": "^0.1.1", "colors": "^1.1.0", "compression": "^1.1.0", "connect-ensure-login": "^0.1.1", diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js index 3651767153..7e5bd530d6 100644 --- a/src/controllers/admin/users.js +++ b/src/controllers/admin/users.js @@ -77,10 +77,17 @@ usersController.banned = function(req, res, next) { }; usersController.registrationQueue = function(req, res, next) { + var page = parseInt(req.query.page, 10) || 1; + var itemsPerPage = 20; + var start = (page - 1) * 20; + var stop = start + itemsPerPage - 1; var invitations; async.parallel({ + registrationQueueCount: function(next) { + db.sortedSetCard('registration:queue', next); + }, users: function(next) { - user.getRegistrationQueue(0, -1, next); + user.getRegistrationQueue(start, stop, next); }, invites: function(next) { async.waterfall([ @@ -118,6 +125,8 @@ usersController.registrationQueue = function(req, res, next) { if (err) { return next(err); } + var pageCount = Math.max(1, Math.ceil(data.registrationQueueCount / itemsPerPage)); + data.pagination = pagination.create(page, pageCount); res.render('admin/manage/registration', data); }); }; @@ -146,7 +155,7 @@ function getUsers(set, section, req, res, next) { var data = { users: results.users, page: page, - pageCount: Math.ceil(results.count / resultsPerPage) + pageCount: Math.max(1, Math.ceil(results.count / resultsPerPage)) }; data[section] = true; render(req, res, data); diff --git a/src/user/approval.js b/src/user/approval.js index 273ad3a3a2..94e0f097e5 100644 --- a/src/user/approval.js +++ b/src/user/approval.js @@ -3,8 +3,6 @@ var async = require('async'); var request = require('request'); -var LRU = require('lru-cache'); -var checksum = require('checksum'); var db = require('../database'); var meta = require('../meta'); @@ -14,11 +12,6 @@ var groups = require('../groups'); var translator = require('../../public/src/modules/translator'); var utils = require('../../public/src/utils'); -var sfsCache = LRU({ - max: 500, - maxAge: 1000*60*60*24 // one day -}); - module.exports = function(User) { @@ -165,22 +158,11 @@ module.exports = function(User) { return user; }).filter(Boolean); - async.mapLimit(users, 20, function(user, next) { + async.map(users, function(user, next) { if (!user) { return next(null, user); } - var sum = checksum(user.ip+user.email+user.username); - if (sfsCache.has(sum)) { - var cached = sfsCache.get(sum); - user.spamData = cached; - user.usernameSpam = cached.username.frequency > 0 || cached.username.appears > 0; - user.emailSpam = cached.email.frequency > 0 || cached.email.appears > 0; - user.ipSpam = cached.ip.frequency > 0 || cached.ip.appears > 0; - - return next(null, user); - } - // temporary: see http://www.stopforumspam.com/forum/viewtopic.php?id=6392 user.ip = user.ip.replace('::ffff:', ''); @@ -197,7 +179,6 @@ module.exports = function(User) { return next(null, user); } if (response.statusCode === 200) { - sfsCache.set(sum, body); user.spamData = body; user.usernameSpam = body.username.frequency > 0 || body.username.appears > 0; user.emailSpam = body.email.frequency > 0 || body.email.appears > 0; diff --git a/src/views/admin/manage/registration.tpl b/src/views/admin/manage/registration.tpl index f4dbe697ef..d293d8cfa4 100644 --- a/src/views/admin/manage/registration.tpl +++ b/src/views/admin/manage/registration.tpl @@ -55,6 +55,8 @@ + +