From e53a18f219858dd44cba4941f6c5ac7841580d7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 24 Jun 2020 23:04:24 -0400 Subject: [PATCH 01/28] fix: #8437, #8433 --- public/src/client/account/edit.js | 3 +- src/controllers/accounts/edit.js | 27 +++++++++++++++++ src/routes/api.js | 2 ++ src/user/picture.js | 48 +++++++++++++++++++++++++++++-- 4 files changed, 76 insertions(+), 4 deletions(-) diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js index c6f99d733b..aeb63b7561 100644 --- a/public/src/client/account/edit.js +++ b/public/src/client/account/edit.js @@ -206,7 +206,7 @@ define('forum/account/edit', ['forum/account/header', 'translator', 'components' updateHeader(urlOnServer); - if (ajaxify.data.picture.length) { + if (ajaxify.data.picture && ajaxify.data.picture.length) { $('#user-current-picture, img.avatar').attr('src', urlOnServer); ajaxify.data.uploadedpicture = urlOnServer; } else { @@ -228,6 +228,7 @@ define('forum/account/edit', ['forum/account/header', 'translator', 'components' pictureCropper.show({ socketMethod: 'user.uploadCroppedPicture', + route: config.relative_path + '/api/user/' + ajaxify.data.userslug + '/uploadpicture', aspectRatio: 1 / 1, paramName: 'uid', paramValue: ajaxify.data.theirid, diff --git a/src/controllers/accounts/edit.js b/src/controllers/accounts/edit.js index 9e23d736fd..0f81163391 100644 --- a/src/controllers/accounts/edit.js +++ b/src/controllers/accounts/edit.js @@ -7,6 +7,7 @@ const helpers = require('../helpers'); const groups = require('../../groups'); const accountHelpers = require('./helpers'); const privileges = require('../../privileges'); +const file = require('../../file'); const editController = module.exports; @@ -124,3 +125,29 @@ async function getUserData(req) { userData.hasPassword = await user.hasPassword(userData.uid); return userData; } + +editController.uploadPicture = async function (req, res, next) { + const userPhoto = req.files.files[0]; + try { + const updateUid = await user.getUidByUserslug(req.params.userslug); + const isAllowed = await privileges.users.canEdit(req.uid, updateUid); + if (!isAllowed) { + return helpers.notAllowed(req, res); + } + await user.checkMinReputation(req.uid, updateUid, 'min:rep:profile-picture'); + + const image = await user.uploadCroppedPictureFile({ + uid: updateUid, + file: userPhoto, + }); + + res.json([{ + name: userPhoto.name, + url: image.url, + }]); + } catch (err) { + next(err); + } finally { + await file.delete(userPhoto.path); + } +}; diff --git a/src/routes/api.js b/src/routes/api.js index 1e94de1d96..bc66050358 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -34,4 +34,6 @@ module.exports = function (app, middleware, controllers) { var middlewares = [middleware.maintenanceMode, multipartMiddleware, middleware.validateFiles, middleware.applyCSRF]; router.post('/post/upload', middlewares, uploadsController.uploadPost); router.post('/topic/thumb/upload', middlewares, uploadsController.uploadThumb); + + router.post('/user/:userslug/uploadpicture', middlewares.concat([middleware.exposeUid, middleware.authenticate, middleware.canViewUsers, middleware.checkAccountPermissions]), controllers.accounts.edit.uploadPicture); }; diff --git a/src/user/picture.js b/src/user/picture.js index 5419b062e5..b1ae0f72e2 100644 --- a/src/user/picture.js +++ b/src/user/picture.js @@ -61,10 +61,52 @@ module.exports = function (User) { url: uploadData.url, }; } finally { - file.delete(picture.path); + await file.delete(picture.path); } }; + // uploads a image file as profile picture + User.uploadCroppedPictureFile = async function (data) { + const userPhoto = data.file; + if (!meta.config.allowProfileImageUploads) { + throw new Error('[[error:profile-image-uploads-disabled]]'); + } + + if (userPhoto.size > meta.config.maximumProfileImageSize * 1024) { + throw new Error('[[error:file-too-big, ' + meta.config.maximumProfileImageSize + ']]'); + } + + if (!userPhoto.type || !User.getAllowedImageTypes().includes(userPhoto.type)) { + throw new Error('[[error:invalid-image]]'); + } + + const extension = file.typeToExtension(userPhoto.type); + if (!extension) { + throw new Error('[[error:invalid-image-extension]]'); + } + + const newPath = await convertToPNG(userPhoto.path); + + await image.resizeImage({ + path: newPath, + width: meta.config.profileImageDimension, + height: meta.config.profileImageDimension, + }); + + const filename = generateProfileImageFilename(data.uid, extension); + const uploadedImage = await image.uploadImage(filename, 'profile', { + uid: data.uid, + path: newPath, + }); + + await User.setUserFields(data.uid, { + uploadedpicture: uploadedImage.url, + picture: uploadedImage.url, + }); + return uploadedImage; + }; + + // uploads image data in base64 as profile picture User.uploadCroppedPicture = async function (data) { const picture = { name: 'profileAvatar', @@ -101,7 +143,7 @@ module.exports = function (User) { }); return uploadedImage; } finally { - file.delete(picture.path); + await file.delete(picture.path); } }; @@ -126,7 +168,7 @@ module.exports = function (User) { return path; } const newPath = await image.normalise(path); - file.delete(path); + await file.delete(path); return newPath; } From 9b20d0ce2056156f16753a588f0a249416bf0c25 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Thu, 25 Jun 2020 09:07:32 +0000 Subject: [PATCH 02/28] Latest translations and fallbacks --- .../language/ar/admin/manage/categories.json | 1 + .../language/bg/admin/manage/categories.json | 1 + .../language/bn/admin/manage/categories.json | 1 + .../language/cs/admin/manage/categories.json | 1 + .../language/da/admin/manage/categories.json | 1 + .../language/de/admin/manage/categories.json | 1 + .../language/el/admin/manage/categories.json | 1 + .../en-US/admin/manage/categories.json | 1 + .../en-x-pirate/admin/manage/categories.json | 1 + .../language/es/admin/manage/categories.json | 1 + .../language/et/admin/manage/categories.json | 1 + .../fa-IR/admin/manage/categories.json | 1 + .../language/fi/admin/manage/categories.json | 1 + .../language/fr/admin/manage/categories.json | 1 + public/language/fr/user.json | 6 +++--- .../language/gl/admin/manage/categories.json | 1 + .../language/he/admin/advanced/database.json | 14 ++++++------- .../language/he/admin/manage/categories.json | 1 + .../language/he/admin/manage/privileges.json | 20 +++++++++---------- .../language/hr/admin/manage/categories.json | 1 + .../language/hu/admin/manage/categories.json | 1 + .../language/id/admin/manage/categories.json | 1 + .../language/it/admin/manage/categories.json | 1 + public/language/it/notifications.json | 6 +++--- public/language/it/user.json | 6 +++--- .../language/ja/admin/manage/categories.json | 1 + .../language/ko/admin/manage/categories.json | 1 + .../language/lt/admin/manage/categories.json | 1 + .../language/lv/admin/manage/categories.json | 1 + .../language/ms/admin/manage/categories.json | 1 + .../language/nb/admin/manage/categories.json | 1 + .../language/nl/admin/manage/categories.json | 1 + .../language/pl/admin/manage/categories.json | 1 + .../pt-BR/admin/manage/categories.json | 1 + .../pt-PT/admin/manage/categories.json | 1 + .../language/ro/admin/manage/categories.json | 1 + .../language/ru/admin/manage/categories.json | 1 + .../language/rw/admin/manage/categories.json | 1 + .../language/sc/admin/manage/categories.json | 1 + .../language/sk/admin/manage/categories.json | 1 + .../language/sl/admin/manage/categories.json | 1 + .../language/sr/admin/manage/categories.json | 1 + .../language/sv/admin/manage/categories.json | 1 + .../language/th/admin/manage/categories.json | 1 + .../language/tr/admin/manage/categories.json | 1 + .../language/uk/admin/manage/categories.json | 1 + .../language/vi/admin/manage/categories.json | 1 + .../zh-CN/admin/manage/categories.json | 1 + .../zh-TW/admin/manage/categories.json | 1 + 49 files changed, 70 insertions(+), 26 deletions(-) diff --git a/public/language/ar/admin/manage/categories.json b/public/language/ar/admin/manage/categories.json index 2db7556c2c..f41bd16382 100644 --- a/public/language/ar/admin/manage/categories.json +++ b/public/language/ar/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/bg/admin/manage/categories.json b/public/language/bg/admin/manage/categories.json index f18269d498..d0984f3ab4 100644 --- a/public/language/bg/admin/manage/categories.json +++ b/public/language/bg/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "Брой на скорошните отговори", "ext-link": "Външна връзка", "is-section": "Използване на тази категория като раздел", + "tag-whitelist": "Списък от разрешени етикети", "upload-image": "Качване на изображение", "delete-image": "Премахване", "category-image": "Изображение на категорията", diff --git a/public/language/bn/admin/manage/categories.json b/public/language/bn/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/bn/admin/manage/categories.json +++ b/public/language/bn/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/cs/admin/manage/categories.json b/public/language/cs/admin/manage/categories.json index 0d99dc005d..86f0c1d62b 100644 --- a/public/language/cs/admin/manage/categories.json +++ b/public/language/cs/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# posledních odpovědí", "ext-link": "Externí odkaz", "is-section": "Zacházet s kategorii jako se sekcí", + "tag-whitelist": "Tag Whitelist", "upload-image": "Nahrát obrázek", "delete-image": "Vyjmout", "category-image": "Obrázek kategorie", diff --git a/public/language/da/admin/manage/categories.json b/public/language/da/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/da/admin/manage/categories.json +++ b/public/language/da/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/de/admin/manage/categories.json b/public/language/de/admin/manage/categories.json index 18311a74b0..7acbf35a14 100644 --- a/public/language/de/admin/manage/categories.json +++ b/public/language/de/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "Anzahl neuer Antworten", "ext-link": "Externer Link", "is-section": "Behandle diese Kategorie als Abschnitt", + "tag-whitelist": "Tag Whitelist", "upload-image": "Bild hochladen", "delete-image": "Entfernen", "category-image": "Kategoriebild", diff --git a/public/language/el/admin/manage/categories.json b/public/language/el/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/el/admin/manage/categories.json +++ b/public/language/el/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/en-US/admin/manage/categories.json b/public/language/en-US/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/en-US/admin/manage/categories.json +++ b/public/language/en-US/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/en-x-pirate/admin/manage/categories.json b/public/language/en-x-pirate/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/en-x-pirate/admin/manage/categories.json +++ b/public/language/en-x-pirate/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/es/admin/manage/categories.json b/public/language/es/admin/manage/categories.json index bcf64a7920..2efd6d1b43 100644 --- a/public/language/es/admin/manage/categories.json +++ b/public/language/es/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# de Respuestas Recientes", "ext-link": "Enlace Externo", "is-section": "Tratar esta categoría como una sección", + "tag-whitelist": "Tag Whitelist", "upload-image": "Subir Imagen", "delete-image": "Eliminar", "category-image": "Imagen de Categoría", diff --git a/public/language/et/admin/manage/categories.json b/public/language/et/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/et/admin/manage/categories.json +++ b/public/language/et/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/fa-IR/admin/manage/categories.json b/public/language/fa-IR/admin/manage/categories.json index 331d193041..6b8abfef90 100644 --- a/public/language/fa-IR/admin/manage/categories.json +++ b/public/language/fa-IR/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/fi/admin/manage/categories.json b/public/language/fi/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/fi/admin/manage/categories.json +++ b/public/language/fi/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/fr/admin/manage/categories.json b/public/language/fr/admin/manage/categories.json index 927dc5747b..f3ccb18d72 100644 --- a/public/language/fr/admin/manage/categories.json +++ b/public/language/fr/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# de réponses récentes", "ext-link": "Lien externe", "is-section": "Traiter cette catégorie comme une section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Envoyer une image", "delete-image": "Enlever", "category-image": "Image de la catégorie", diff --git a/public/language/fr/user.json b/public/language/fr/user.json index b189a4ac8b..40569695c5 100644 --- a/public/language/fr/user.json +++ b/public/language/fr/user.json @@ -179,9 +179,9 @@ "consent.right_to_data_portability": "Vous avez la possibilité de portabilité des données.", "consent.right_to_data_portability_description": "Vous pouvez exporter de toutes vos données collectées. Vous pouvez le faire en cliquant sur le bouton ci-dessous.", "consent.export_profile": "Exporter Profile (.json)", - "consent.export-profile-success": "Exporting profile, you will get a notification when it is complete.", + "consent.export-profile-success": "Exportation du profil, vous recevrez une notification lorsqu'elle sera terminée.", "consent.export_uploads": "Exporter le contenu de vos fichiers envoyés (.zip)", - "consent.export-uploads-success": "Exporting uploads, you will get a notification when it is complete.", + "consent.export-uploads-success": "Exportation des envois, vous recevrez une notification lorsqu'elle sera terminée.", "consent.export_posts": "Exporter vos messages (.csv)", - "consent.export-posts-success": "Exporting posts, you will get a notification when it is complete." + "consent.export-posts-success": "Exportation des messages, vous recevrez une notification lorsqu'elle sera terminée." } \ No newline at end of file diff --git a/public/language/gl/admin/manage/categories.json b/public/language/gl/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/gl/admin/manage/categories.json +++ b/public/language/gl/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/he/admin/advanced/database.json b/public/language/he/admin/advanced/database.json index f395f51052..50389867f6 100644 --- a/public/language/he/admin/advanced/database.json +++ b/public/language/he/admin/advanced/database.json @@ -18,17 +18,17 @@ "mongo.resident-memory": "זכרון קיים", "mongo.virtual-memory": "זיכרון וירטואלי", "mongo.mapped-memory": "זיכרון ממופה", - "mongo.bytes-in": "Bytes In", - "mongo.bytes-out": "Bytes Out", + "mongo.bytes-in": "ביטים נכנסים", + "mongo.bytes-out": "ביטים יוצאים", "mongo.num-requests": "מספר בקשות", "mongo.raw-info": "מידע לא מעובד מMongoDB", "mongo.unauthorized": "NodeBB was unable to query the MongoDB database for relevant statistics. Please ensure that the user in use by NodeBB contains the "clusterMonitor" role for the "admin" database.", "redis": "Redis", "redis.version": "גרסת Redis", - "redis.keys": "Keys", - "redis.expires": "Expires", - "redis.avg-ttl": "Average TTL", + "redis.keys": "מפתחות", + "redis.expires": "פג תוקף", + "redis.avg-ttl": "זמן TTL ממוצע", "redis.connected-clients": "לקוחות מחוברים", "redis.connected-slaves": "לקוחות מחוברים", "redis.blocked-clients": "לקוחות חסומים", @@ -39,8 +39,8 @@ "redis.iops": "Instantaneous Ops. Per Second", "redis.iinput": "Instantaneous Input Per Second", "redis.ioutput": "Instantaneous Output Per Second", - "redis.total-input": "Total Input", - "redis.total-output": "Total Ouput", + "redis.total-input": "סך הכל מידע נכנס", + "redis.total-output": "סך הכל מידע יוצא", "redis.keyspace-hits": "Keyspace Hits", "redis.keyspace-misses": "Keyspace Misses", diff --git a/public/language/he/admin/manage/categories.json b/public/language/he/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/he/admin/manage/categories.json +++ b/public/language/he/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/he/admin/manage/privileges.json b/public/language/he/admin/manage/privileges.json index 24aa4b47bd..14d22ab23e 100644 --- a/public/language/he/admin/manage/privileges.json +++ b/public/language/he/admin/manage/privileges.json @@ -1,9 +1,9 @@ { "global": "כללי", "global.no-users": "אין הרשאות כלליות למשתמשים מסויימים", - "admin": "Admin", - "group-privileges": "Group Privileges", - "user-privileges": "User Privileges", + "admin": "מנהל", + "group-privileges": "הרשאות קבוצתיות", + "user-privileges": "הרשאות משתמש", "chat": "צ'אט", "upload-images": "העלאת תמונות", "upload-files": "העלאת קבצים", @@ -17,7 +17,7 @@ "view-groups": "צפייה בקבוצות", "allow-local-login": "התחברות מקומית", "allow-group-creation": "יצרת קבוצות", - "view-users-info": "View Users Info", + "view-users-info": "צפיה במידע משתמש", "find-category": "מציאת הקטגוריה", "access-category": "גישה לקטגוריה", "access-topics": "גישה לנושאים", @@ -30,13 +30,13 @@ "view_deleted": "הצגת פוסטים מחוקים", "upvote-posts": "Upvote Posts", "downvote-posts": "Downvote Posts", - "delete-topics": "Delete Topics", + "delete-topics": "מחיקת נושא", "purge": "Purge", "moderate": "Moderate", - "admin-dashboard": "Dashboard", - "admin-categories": "Categories", - "admin-privileges": "Privileges", - "admin-users": "Users", - "admin-settings": "Settings" + "admin-dashboard": "לוח מחוונים", + "admin-categories": "קטגוריות", + "admin-privileges": "הרשאות", + "admin-users": "משתמשים", + "admin-settings": "הגדרות" } \ No newline at end of file diff --git a/public/language/hr/admin/manage/categories.json b/public/language/hr/admin/manage/categories.json index a0346abd77..c27226e58c 100644 --- a/public/language/hr/admin/manage/categories.json +++ b/public/language/hr/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# nedavnih objava", "ext-link": "Vanjska poveznica", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Učitaj sliku", "delete-image": "Ukloni", "category-image": "Slika kategorije", diff --git a/public/language/hu/admin/manage/categories.json b/public/language/hu/admin/manage/categories.json index 0d78a254f1..ceb5f83827 100644 --- a/public/language/hu/admin/manage/categories.json +++ b/public/language/hu/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "Utóbbi válaszok száma", "ext-link": "Külső link", "is-section": "Ez a kategória legyen szakaszként kezelve", + "tag-whitelist": "Tag Whitelist", "upload-image": "Kép feltöltése", "delete-image": "Törlés", "category-image": "Kategóriakép", diff --git a/public/language/id/admin/manage/categories.json b/public/language/id/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/id/admin/manage/categories.json +++ b/public/language/id/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/it/admin/manage/categories.json b/public/language/it/admin/manage/categories.json index 9a0407d8f2..f4e0ff37b9 100644 --- a/public/language/it/admin/manage/categories.json +++ b/public/language/it/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# di Repliche Recenti", "ext-link": "Link esterni", "is-section": "Tratta questa categoria come una sezione", + "tag-whitelist": "Tag Whitelist", "upload-image": "Caricamento Immagine", "delete-image": "Rimuove", "category-image": "Immagine di Categoria", diff --git a/public/language/it/notifications.json b/public/language/it/notifications.json index 97c0f1d94f..f00c72445e 100644 --- a/public/language/it/notifications.json +++ b/public/language/it/notifications.json @@ -43,9 +43,9 @@ "new_register_multiple": "Ci sono %1 richieste di registrazione che attendono di essere esaminate.", "flag_assigned_to_you": "Segnalazione %1 ti è stata assegnata", "post_awaiting_review": "Post in attesa di revisione", - "profile-exported": "%1 profile exported, click to download", - "posts-exported": "%1 posts exported, click to download", - "uploads-exported": "%1 uploads exported, click to download", + "profile-exported": "%1 profilo esportato, clicca per scaricare", + "posts-exported": "%1 post esportati, clicca per scaricare", + "uploads-exported": "%1 caricamenti esportati, clicca per scaricare", "email-confirmed": "Email Confermata", "email-confirmed-message": "Grazie per aver validato la tua email. Il tuo account è ora completamente attivato.", "email-confirm-error-message": "C'è stato un problema nella validazione del tuo indirizzo email. Potrebbe essere il codice non valido o scaduto.", diff --git a/public/language/it/user.json b/public/language/it/user.json index 6e6300c615..de2d360797 100644 --- a/public/language/it/user.json +++ b/public/language/it/user.json @@ -179,9 +179,9 @@ "consent.right_to_data_portability": "Hai i privilegi alla portabilità dei dati", "consent.right_to_data_portability_description": "Puoi richiedere da noi un'esportazione leggibile meccanicamente di tutti i dati raccolti su di te e sul tuo account. Puoi farlo facendo clic sul pulsante appropriato in basso.", "consent.export_profile": "Esporta profilo (.json)", - "consent.export-profile-success": "Exporting profile, you will get a notification when it is complete.", + "consent.export-profile-success": "Esportazione del profilo, riceverai una notifica al termine.", "consent.export_uploads": "Esporta i contenuti caricati (.zip)", - "consent.export-uploads-success": "Exporting uploads, you will get a notification when it is complete.", + "consent.export-uploads-success": "Esportazione dei caricamenti, riceverai una notifica al termine.", "consent.export_posts": "Esporta i post (.csv)", - "consent.export-posts-success": "Exporting posts, you will get a notification when it is complete." + "consent.export-posts-success": "Esportazione dei post, riceverai una notifica al termine." } \ No newline at end of file diff --git a/public/language/ja/admin/manage/categories.json b/public/language/ja/admin/manage/categories.json index 80810e29ab..4c0b462c4c 100644 --- a/public/language/ja/admin/manage/categories.json +++ b/public/language/ja/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# 最近の返信数", "ext-link": "外部リンク", "is-section": "このカテゴリをセクションとして扱う", + "tag-whitelist": "Tag Whitelist", "upload-image": "画像をアップロード", "delete-image": "削除", "category-image": "カテゴリ画像", diff --git a/public/language/ko/admin/manage/categories.json b/public/language/ko/admin/manage/categories.json index 56cec2f3c1..989548d4b7 100644 --- a/public/language/ko/admin/manage/categories.json +++ b/public/language/ko/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "최근 답장 갯수", "ext-link": "외부 링크", "is-section": "이 게시판을 섹션으로 취급", + "tag-whitelist": "Tag Whitelist", "upload-image": "이미지 업로드", "delete-image": "삭제", "category-image": "게시판 이미지", diff --git a/public/language/lt/admin/manage/categories.json b/public/language/lt/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/lt/admin/manage/categories.json +++ b/public/language/lt/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/lv/admin/manage/categories.json b/public/language/lv/admin/manage/categories.json index 849ee6f0b4..144ca15e7e 100644 --- a/public/language/lv/admin/manage/categories.json +++ b/public/language/lv/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "Neseno atbilžu skaits", "ext-link": "Ārējā saite", "is-section": "Izmantot kategoriju kā sadaļu", + "tag-whitelist": "Tag Whitelist", "upload-image": "Augšupielādēt bildi", "delete-image": "Noņemt", "category-image": "Kategorijas bilde", diff --git a/public/language/ms/admin/manage/categories.json b/public/language/ms/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/ms/admin/manage/categories.json +++ b/public/language/ms/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/nb/admin/manage/categories.json b/public/language/nb/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/nb/admin/manage/categories.json +++ b/public/language/nb/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/nl/admin/manage/categories.json b/public/language/nl/admin/manage/categories.json index ec4a6fe488..12f676edb9 100644 --- a/public/language/nl/admin/manage/categories.json +++ b/public/language/nl/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/pl/admin/manage/categories.json b/public/language/pl/admin/manage/categories.json index 50441f4f74..9240275e61 100644 --- a/public/language/pl/admin/manage/categories.json +++ b/public/language/pl/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# z ostatnich odpowiedzi", "ext-link": "Zewnętrzny odnośnik", "is-section": "Traktuj tę kategorię jako sekcję", + "tag-whitelist": "Tag Whitelist", "upload-image": "Prześlij obrazek", "delete-image": "Usuń", "category-image": "Obrazek kategorii", diff --git a/public/language/pt-BR/admin/manage/categories.json b/public/language/pt-BR/admin/manage/categories.json index 977b87d980..8dfa5ecdce 100644 --- a/public/language/pt-BR/admin/manage/categories.json +++ b/public/language/pt-BR/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# de Respostas Recentes", "ext-link": "Link Externo", "is-section": "Trate esta categoria como uma seção", + "tag-whitelist": "Tag Whitelist", "upload-image": "Enviar Imagem", "delete-image": "Remover", "category-image": "Imagem da Categoria", diff --git a/public/language/pt-PT/admin/manage/categories.json b/public/language/pt-PT/admin/manage/categories.json index 686d97d096..c911c1de23 100644 --- a/public/language/pt-PT/admin/manage/categories.json +++ b/public/language/pt-PT/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# de Respostas Recentes", "ext-link": "Link Externo", "is-section": "Tratar esta categoria como uma secção", + "tag-whitelist": "Tag Whitelist", "upload-image": "Enviar Imagem", "delete-image": "Remover", "category-image": "Imagem da Categoria", diff --git a/public/language/ro/admin/manage/categories.json b/public/language/ro/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/ro/admin/manage/categories.json +++ b/public/language/ro/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/ru/admin/manage/categories.json b/public/language/ru/admin/manage/categories.json index 6715885107..271c5da72a 100644 --- a/public/language/ru/admin/manage/categories.json +++ b/public/language/ru/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# последних ответов", "ext-link": "Внешняя ссылка", "is-section": "Рассматривать эту категорию как секцию", + "tag-whitelist": "Tag Whitelist", "upload-image": "Загрузить изображение", "delete-image": "Удалить", "category-image": "Изображение категории", diff --git a/public/language/rw/admin/manage/categories.json b/public/language/rw/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/rw/admin/manage/categories.json +++ b/public/language/rw/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/sc/admin/manage/categories.json b/public/language/sc/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/sc/admin/manage/categories.json +++ b/public/language/sc/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/sk/admin/manage/categories.json b/public/language/sk/admin/manage/categories.json index 53c7513d31..8b0f63ec73 100644 --- a/public/language/sk/admin/manage/categories.json +++ b/public/language/sk/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# posledných odpovedí", "ext-link": "Externý odkaz", "is-section": "Zaobchádzať s kategóriou ako so sekciou", + "tag-whitelist": "Tag Whitelist", "upload-image": "Nahrať obrázok", "delete-image": "Odobrať", "category-image": "Obrázok kategórie", diff --git a/public/language/sl/admin/manage/categories.json b/public/language/sl/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/sl/admin/manage/categories.json +++ b/public/language/sl/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/sr/admin/manage/categories.json b/public/language/sr/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/sr/admin/manage/categories.json +++ b/public/language/sr/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/sv/admin/manage/categories.json b/public/language/sv/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/sv/admin/manage/categories.json +++ b/public/language/sv/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/th/admin/manage/categories.json b/public/language/th/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/th/admin/manage/categories.json +++ b/public/language/th/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/tr/admin/manage/categories.json b/public/language/tr/admin/manage/categories.json index 308ca714f7..db8e42b006 100644 --- a/public/language/tr/admin/manage/categories.json +++ b/public/language/tr/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "Son Yanıtların # Tanesi", "ext-link": "Harici Bağlantı", "is-section": "Bu kategoriyi bir bölüm olarak değerlendir", + "tag-whitelist": "Tag Whitelist", "upload-image": "Görsel Yükle", "delete-image": "Sil", "category-image": "Kategori Görseli", diff --git a/public/language/uk/admin/manage/categories.json b/public/language/uk/admin/manage/categories.json index 62240a0edf..cc9ec25df5 100644 --- a/public/language/uk/admin/manage/categories.json +++ b/public/language/uk/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "Кількість свіжих відповідей", "ext-link": "Зовнішнє посилання", "is-section": "Вважати цю категорію розділом", + "tag-whitelist": "Tag Whitelist", "upload-image": "Завантажити зображення", "delete-image": "Видалити", "category-image": "Зображення категорії", diff --git a/public/language/vi/admin/manage/categories.json b/public/language/vi/admin/manage/categories.json index 1eda6ea080..a8949c654b 100644 --- a/public/language/vi/admin/manage/categories.json +++ b/public/language/vi/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "# of Recent Replies", "ext-link": "External Link", "is-section": "Treat this category as a section", + "tag-whitelist": "Tag Whitelist", "upload-image": "Upload Image", "delete-image": "Remove", "category-image": "Category Image", diff --git a/public/language/zh-CN/admin/manage/categories.json b/public/language/zh-CN/admin/manage/categories.json index edeb8c2b68..a760f1c3e5 100644 --- a/public/language/zh-CN/admin/manage/categories.json +++ b/public/language/zh-CN/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "最近回复数", "ext-link": "外部链接", "is-section": "将该版块作为段落", + "tag-whitelist": "Tag Whitelist", "upload-image": "上传图片", "delete-image": "移除", "category-image": "版块图片", diff --git a/public/language/zh-TW/admin/manage/categories.json b/public/language/zh-TW/admin/manage/categories.json index 8d40c98725..53e81a6124 100644 --- a/public/language/zh-TW/admin/manage/categories.json +++ b/public/language/zh-TW/admin/manage/categories.json @@ -11,6 +11,7 @@ "num-recent-replies": "最近回覆數", "ext-link": "外部連結", "is-section": "將該版面作為分段", + "tag-whitelist": "Tag Whitelist", "upload-image": "上傳圖片", "delete-image": "移除", "category-image": "版面圖片", From 023de94ef8bef7ad3af3e70da742f5265ee5e78e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 25 Jun 2020 17:08:09 -0400 Subject: [PATCH 03/28] fix: show controls @julianlam --- src/controllers/admin/dashboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/admin/dashboard.js b/src/controllers/admin/dashboard.js index bf9081ced9..89d8c1b222 100644 --- a/src/controllers/admin/dashboard.js +++ b/src/controllers/admin/dashboard.js @@ -21,7 +21,7 @@ dashboardController.get = async function (req, res) { getNotices(), getLatestVersion(), getLastRestart(), - user.isAdministrator(), + user.isAdministrator(req.uid), ]); const version = nconf.get('version'); From d40720f9e647bd84ae7156e0f3c63f5a88f058cd Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 26 Jun 2020 00:36:46 +0000 Subject: [PATCH 04/28] fix(deps): update dependency nodebb-plugin-mentions to v2.8.0 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index ffae5c5c68..8549e98d74 100644 --- a/install/package.json +++ b/install/package.json @@ -85,7 +85,7 @@ "nodebb-plugin-emoji": "^3.3.0", "nodebb-plugin-emoji-android": "2.0.0", "nodebb-plugin-markdown": "8.11.2", - "nodebb-plugin-mentions": "2.7.4", + "nodebb-plugin-mentions": "2.8.0", "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.7.2", "nodebb-rewards-essentials": "0.1.3", From 5c7d37c0ae0b4f29f10e1392478dba5261f023db Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Thu, 25 Jun 2020 22:38:58 -0400 Subject: [PATCH 05/28] Revert "fix(deps): update dependency nodebb-plugin-mentions to v2.8.0" This reverts commit d40720f9e647bd84ae7156e0f3c63f5a88f058cd. --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index 8549e98d74..ffae5c5c68 100644 --- a/install/package.json +++ b/install/package.json @@ -85,7 +85,7 @@ "nodebb-plugin-emoji": "^3.3.0", "nodebb-plugin-emoji-android": "2.0.0", "nodebb-plugin-markdown": "8.11.2", - "nodebb-plugin-mentions": "2.8.0", + "nodebb-plugin-mentions": "2.7.4", "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.7.2", "nodebb-rewards-essentials": "0.1.3", From c0857f6390733e7822b0ecf4767391cf55aa7fd7 Mon Sep 17 00:00:00 2001 From: "Misty (Bot)" Date: Fri, 26 Jun 2020 09:05:58 +0000 Subject: [PATCH 06/28] Latest translations and fallbacks --- public/language/fr/admin/manage/categories.json | 2 +- public/language/fr/notifications.json | 6 +++--- public/language/it/admin/manage/categories.json | 4 ++-- public/language/zh-CN/user.json | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/language/fr/admin/manage/categories.json b/public/language/fr/admin/manage/categories.json index f3ccb18d72..c716605965 100644 --- a/public/language/fr/admin/manage/categories.json +++ b/public/language/fr/admin/manage/categories.json @@ -11,7 +11,7 @@ "num-recent-replies": "# de réponses récentes", "ext-link": "Lien externe", "is-section": "Traiter cette catégorie comme une section", - "tag-whitelist": "Tag Whitelist", + "tag-whitelist": "Liste blanche de mots clés", "upload-image": "Envoyer une image", "delete-image": "Enlever", "category-image": "Image de la catégorie", diff --git a/public/language/fr/notifications.json b/public/language/fr/notifications.json index b51e163cda..913efafb54 100644 --- a/public/language/fr/notifications.json +++ b/public/language/fr/notifications.json @@ -43,9 +43,9 @@ "new_register_multiple": "%1 inscription(s) est en attente de validation.", "flag_assigned_to_you": "Drapeau %1 vous a été assigné", "post_awaiting_review": "Message en attente de validation", - "profile-exported": "%1 profile exported, click to download", - "posts-exported": "%1 posts exported, click to download", - "uploads-exported": "%1 uploads exported, click to download", + "profile-exported": "%1 profil exporté, cliquez pour le télécharger", + "posts-exported": "%1 messages exportés, cliquez pour les télécharger", + "uploads-exported": "%1 envois exportés, cliquez pour les télécharger", "email-confirmed": "Email vérifié", "email-confirmed-message": "Merci pour la validation de votre adresse email. Votre compte est désormais activé.", "email-confirm-error-message": "Il y a un un problème dans la vérification de votre adresse email. Le code est peut être invalide ou a expiré.", diff --git a/public/language/it/admin/manage/categories.json b/public/language/it/admin/manage/categories.json index f4e0ff37b9..41d0d6bcbb 100644 --- a/public/language/it/admin/manage/categories.json +++ b/public/language/it/admin/manage/categories.json @@ -5,13 +5,13 @@ "name": "Nome Categoria", "description": "Descrizione categoria", "bg-color": "Colore sfondo", - "text-color": "Colore del testo", + "text-color": "Colore testo", "bg-image-size": "Dimensione dell'immagine di sfondo", "custom-class": "Classe personalizzata", "num-recent-replies": "# di Repliche Recenti", "ext-link": "Link esterni", "is-section": "Tratta questa categoria come una sezione", - "tag-whitelist": "Tag Whitelist", + "tag-whitelist": "Whitelist tag", "upload-image": "Caricamento Immagine", "delete-image": "Rimuove", "category-image": "Immagine di Categoria", diff --git a/public/language/zh-CN/user.json b/public/language/zh-CN/user.json index 4fd74dd99f..2a5a9c7511 100644 --- a/public/language/zh-CN/user.json +++ b/public/language/zh-CN/user.json @@ -21,7 +21,7 @@ "delete_account_content_confirm": "Are you sure you want to delete this account's content (posts/topics/uploads)?
This action is irreversible and you will not be able to recover any data

", "delete_all_confirm": "Are you sure you want to delete this account and all of its content (posts/topics/uploads)?
This action is irreversible and you will not be able to recover any data

", "account-deleted": "帐号已删除", - "account-content-deleted": "Account content deleted", + "account-content-deleted": "账号内容已删除", "fullname": "姓名", "website": "网站", "location": "位置", From 903673d24c4a41d30ea90b0259f7ab182e351e6d Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Fri, 26 Jun 2020 16:20:50 +0000 Subject: [PATCH 07/28] Update dependency nodebb-plugin-mentions to v2.8.2 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index ffae5c5c68..047ddb75a3 100644 --- a/install/package.json +++ b/install/package.json @@ -85,7 +85,7 @@ "nodebb-plugin-emoji": "^3.3.0", "nodebb-plugin-emoji-android": "2.0.0", "nodebb-plugin-markdown": "8.11.2", - "nodebb-plugin-mentions": "2.7.4", + "nodebb-plugin-mentions": "2.8.2", "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.7.2", "nodebb-rewards-essentials": "0.1.3", From 2355d9d5dde02b9ed61ec1d80b10e5bde51e9b9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 26 Jun 2020 15:19:18 -0400 Subject: [PATCH 08/28] fix: escape navigation item fields, theme:id, category fields --- public/src/admin/settings/navigation.js | 19 ++++++------------- src/categories/data.js | 9 ++++++--- src/controllers/admin/settings.js | 4 +++- src/meta/themes.js | 7 ++++++- src/middleware/header.js | 3 ++- src/navigation/admin.js | 15 +++++++++------ src/navigation/index.js | 5 ----- 7 files changed, 32 insertions(+), 30 deletions(-) diff --git a/public/src/admin/settings/navigation.js b/public/src/admin/settings/navigation.js index cfb78cf754..2209bb4fd1 100644 --- a/public/src/admin/settings/navigation.js +++ b/public/src/admin/settings/navigation.js @@ -8,18 +8,11 @@ define('admin/settings/navigation', ['translator', 'iconSelect', 'benchpress', ' navigation.init = function () { available = ajaxify.data.available; - $('#enabled .unescape').each(function () { - $(this).val(translator.unescape($(this).val())); - }); - - translator.translate($('#available').html(), function (html) { - $('#available').html(translator.unescape(html)) - .find('li .drag-item').draggable({ - connectToSortable: '#active-navigation', - helper: 'clone', - distance: 10, - stop: drop, - }); + $('#available').find('li .drag-item').draggable({ + connectToSortable: '#active-navigation', + helper: 'clone', + distance: 10, + stop: drop, }); $('#active-navigation').sortable().droppable({ @@ -112,7 +105,7 @@ define('admin/settings/navigation', ['translator', 'iconSelect', 'benchpress', ' } data[input.name].push(input.value); } else { - data[input.name] = translator.escape(input.value); + data[input.name] = input.value; } }); diff --git a/src/categories/data.js b/src/categories/data.js index 07aa9eb3b9..ddbc6362e3 100644 --- a/src/categories/data.js +++ b/src/categories/data.js @@ -76,9 +76,12 @@ function modifyCategory(category, fields) { db.parseIntFields(category, intFields, fields); - if (category.hasOwnProperty('name')) { - category.name = validator.escape(String(category.name || '')); - } + const escapeFields = ['name', 'color', 'bgColor', 'imageClass', 'class', 'link']; + escapeFields.forEach((field) => { + if (category.hasOwnProperty(field)) { + category[field] = validator.escape(String(category[field] || '')); + } + }); if (category.hasOwnProperty('icon')) { category.icon = category.icon || 'hidden'; diff --git a/src/controllers/admin/settings.js b/src/controllers/admin/settings.js index f7b0d529e7..50ee575cea 100644 --- a/src/controllers/admin/settings.js +++ b/src/controllers/admin/settings.js @@ -10,6 +10,7 @@ const navigationAdmin = require('../../navigation/admin'); const social = require('../../social'); const helpers = require('../helpers'); +const translator = require('../../../public/src/modules/translator'); const settingsController = module.exports; settingsController.get = async function (req, res) { @@ -104,7 +105,8 @@ settingsController.navigation = async function (req, res) { admin.enabled.forEach(function (enabled, index) { enabled.index = index; enabled.selected = index === 0; - + enabled.title = translator.escape(enabled.title); + enabled.text = translator.escape(enabled.text); enabled.groups = admin.groups.map(function (group) { return { displayName: group.displayName, diff --git a/src/meta/themes.js b/src/meta/themes.js index 3710af3a2e..a5a2dd43ff 100644 --- a/src/meta/themes.js +++ b/src/meta/themes.js @@ -90,7 +90,12 @@ Themes.set = async (data) => { case 'local': { const current = await Meta.configs.get('theme:id'); if (current !== data.id) { - let config = await fsReadfile(path.join(nconf.get('themes_path'), data.id, 'theme.json'), 'utf8'); + const pathToThemeJson = path.join(nconf.get('themes_path'), data.id, 'theme.json'); + if (!pathToThemeJson.startsWith(nconf.get('themes_path'))) { + throw new Error('[[error:invalid-theme-id]]'); + } + + let config = await fsReadfile(pathToThemeJson, 'utf8'); config = JSON.parse(config); await db.sortedSetRemove('plugins:active', current); diff --git a/src/middleware/header.js b/src/middleware/header.js index ea208895ab..4873a210b2 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -3,6 +3,7 @@ var nconf = require('nconf'); var jsesc = require('jsesc'); var _ = require('lodash'); +const validator = require('validator'); var util = require('util'); var db = require('../database'); @@ -121,7 +122,7 @@ module.exports = function (middleware) { const tidsByFilter = results.unreadData.tidsByFilter; results.navigation = results.navigation.map(function (item) { function modifyNavItem(item, route, filter, content) { - if (item && item.originalRoute === route) { + if (item && validator.unescape(item.originalRoute) === route) { unreadData[filter] = _.zipObject(tidsByFilter[filter], tidsByFilter[filter].map(() => true)); item.content = content; if (unreadCounts[filter] > 0) { diff --git a/src/navigation/admin.js b/src/navigation/admin.js index 5398ac8375..499fd9c5ee 100644 --- a/src/navigation/admin.js +++ b/src/navigation/admin.js @@ -1,10 +1,10 @@ 'use strict'; const _ = require('lodash'); +const validator = require('validator'); const plugins = require('../plugins'); const db = require('../database'); -const translator = require('../translator'); const pubsub = require('../pubsub'); const admin = module.exports; @@ -17,11 +17,6 @@ pubsub.on('admin:navigation:save', function () { admin.save = async function (data) { const order = Object.keys(data); const items = data.map(function (item, index) { - for (var i in item) { - if (item.hasOwnProperty(i) && typeof item[i] === 'string' && (i === 'title' || i === 'text')) { - item[i] = translator.escape(item[i]); - } - } item.order = order[index]; return JSON.stringify(item); }); @@ -45,8 +40,16 @@ admin.get = async function () { return _.cloneDeep(cache); } const data = await db.getSortedSetRange('navigation:enabled', 0, -1); + const escapeFields = ['iconClass', 'class', 'route', 'id', 'text', 'textClass', 'title']; cache = data.map(function (item) { item = JSON.parse(item); + + escapeFields.forEach((field) => { + if (item.hasOwnProperty(field)) { + item[field] = validator.escape(String(item[field])); + } + }); + item.groups = item.groups || []; if (item.groups && !Array.isArray(item.groups)) { item.groups = [item.groups]; diff --git a/src/navigation/index.js b/src/navigation/index.js index cf47d3dd5c..f679cc29a3 100644 --- a/src/navigation/index.js +++ b/src/navigation/index.js @@ -2,7 +2,6 @@ const nconf = require('nconf'); const admin = require('./admin'); -const translator = require('../translator'); const groups = require('../groups'); const navigation = module.exports; @@ -17,10 +16,6 @@ navigation.get = async function (uid) { item.route = nconf.get('relative_path') + item.route; } - Object.keys(item).forEach(function (key) { - item[key] = translator.unescape(item[key]); - }); - return item; }); From f0ce309d034dcd87a7b696cddb49a74525bd5ee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 26 Jun 2020 15:26:15 -0400 Subject: [PATCH 09/28] fix: test --- test/controllers.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/controllers.js b/test/controllers.js index a6688da028..49a05d4703 100644 --- a/test/controllers.js +++ b/test/controllers.js @@ -2047,8 +2047,8 @@ describe('Controllers', function () { request(nconf.get('url') + '/api/category/' + category.slug, { jar: jar, json: true }, function (err, res, body) { assert.ifError(err); assert.equal(res.statusCode, 200); - assert.equal(res.headers['x-redirect'], 'https://nodebb.org'); - assert.equal(body, 'https://nodebb.org'); + assert.equal(res.headers['x-redirect'], 'https://nodebb.org'); + assert.equal(body, 'https://nodebb.org'); next(); }); }, From 37b6b8fd48a3be4f4b65a687b35ce366ff41ad5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 26 Jun 2020 18:08:34 -0400 Subject: [PATCH 10/28] fix: upgrade script to unescape navigation titles --- .../1.14.0/unescape_navigation_titles.js | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/upgrades/1.14.0/unescape_navigation_titles.js diff --git a/src/upgrades/1.14.0/unescape_navigation_titles.js b/src/upgrades/1.14.0/unescape_navigation_titles.js new file mode 100644 index 0000000000..38873c177c --- /dev/null +++ b/src/upgrades/1.14.0/unescape_navigation_titles.js @@ -0,0 +1,29 @@ +'use strict'; + +var async = require('async'); +var db = require('../../database'); + +module.exports = { + name: 'Unescape navigation titles', + timestamp: Date.UTC(2020, 5, 26), + method: async function () { + const data = await db.getSortedSetRangeWithScores('navigation:enabled', 0, -1); + const translator = require('../../translator'); + var order = []; + var items = []; + data.forEach(function (item) { + var navItem = JSON.parse(item.value); + var keys = Object.keys(navItem); + if (navItem.hasOwnProperty('title')) { + navItem.title = translator.unescape(navItem.title); + } + if (navItem.hasOwnProperty('text')) { + navItem.text = translator.unescape(navItem.text); + } + order.push(item.score); + items.push(JSON.stringify(navItem)); + }); + await db.delete('navigation:enabled'); + await db.sortedSetAdd('navigation:enabled', order, items); + }, +}; From 0d0b951380809f237b8077a9c9ab9c3015097831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 26 Jun 2020 18:25:42 -0400 Subject: [PATCH 11/28] fix: lint --- src/upgrades/1.14.0/unescape_navigation_titles.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/upgrades/1.14.0/unescape_navigation_titles.js b/src/upgrades/1.14.0/unescape_navigation_titles.js index 38873c177c..4ed10f1918 100644 --- a/src/upgrades/1.14.0/unescape_navigation_titles.js +++ b/src/upgrades/1.14.0/unescape_navigation_titles.js @@ -1,7 +1,6 @@ 'use strict'; -var async = require('async'); -var db = require('../../database'); +const db = require('../../database'); module.exports = { name: 'Unescape navigation titles', @@ -9,11 +8,10 @@ module.exports = { method: async function () { const data = await db.getSortedSetRangeWithScores('navigation:enabled', 0, -1); const translator = require('../../translator'); - var order = []; - var items = []; + const order = []; + const items = []; data.forEach(function (item) { - var navItem = JSON.parse(item.value); - var keys = Object.keys(navItem); + const navItem = JSON.parse(item.value); if (navItem.hasOwnProperty('title')) { navItem.title = translator.unescape(navItem.title); } From e09ab3dc19cc70bf3f41ef56720f406588226d4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Sat, 27 Jun 2020 18:11:27 -0400 Subject: [PATCH 12/28] feat: closes #8440, allow configuring max topic count --- install/data/defaults.json | 1 + public/language/en-GB/admin/settings/post.json | 1 + src/topics/sorted.js | 6 +++--- src/views/admin/settings/post.tpl | 4 ++++ 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/install/data/defaults.json b/install/data/defaults.json index 090a1d4026..8d0112ba74 100644 --- a/install/data/defaults.json +++ b/install/data/defaults.json @@ -112,6 +112,7 @@ "hideFullname": 0, "hideEmail": 0, "allowGuestHandles": 0, + "recentMaxTopics": 200, "disableRecentCategoryFilter": 0, "maximumRelatedTopics": 0, "disableEmailSubscriptions": 0, diff --git a/public/language/en-GB/admin/settings/post.json b/public/language/en-GB/admin/settings/post.json index da708f4c6c..a8d0046355 100644 --- a/public/language/en-GB/admin/settings/post.json +++ b/public/language/en-GB/admin/settings/post.json @@ -42,6 +42,7 @@ "unread.cutoff": "Unread cutoff days", "unread.min-track-last": "Minimum posts in topic before tracking last read", "recent": "Recent Settings", + "recent.max-topics": "Maximum topics on /recent", "recent.categoryFilter.disable": "Disable filtering of topics in ignored categories on the /recent page", "signature": "Signature Settings", "signature.disable": "Disable signatures", diff --git a/src/topics/sorted.js b/src/topics/sorted.js index 909f0dd250..28844ffee7 100644 --- a/src/topics/sorted.js +++ b/src/topics/sorted.js @@ -26,7 +26,7 @@ module.exports = function (Topics) { } data.tids = await getTids(params); data.tids = await sortTids(data.tids, params); - data.tids = await filterTids(data.tids.slice(0, 200), params); + data.tids = await filterTids(data.tids.slice(0, meta.config.recentMaxTopics), params); data.topicCount = data.tids.length; data.topics = await getTopics(data.tids, params); data.nextStart = params.stop + 1; @@ -49,7 +49,7 @@ module.exports = function (Topics) { } else if (params.cids) { tids = await getCidTids(params); } else { - tids = await db.getSortedSetRevRange('topics:' + params.sort, 0, 199); + tids = await db.getSortedSetRevRange('topics:' + params.sort, 0, meta.config.recentMaxTopics - 1); } return tids; @@ -67,7 +67,7 @@ module.exports = function (Topics) { pinnedSets.push('cid:' + cid + ':tids:pinned'); }); const [tids, pinnedTids] = await Promise.all([ - db.getSortedSetRevRange(sets, 0, 199), + db.getSortedSetRevRange(sets, 0, meta.config.recentMaxTopics - 1), db.getSortedSetRevRange(pinnedSets, 0, -1), ]); return pinnedTids.concat(tids); diff --git a/src/views/admin/settings/post.tpl b/src/views/admin/settings/post.tpl index 5ee1dbdc6c..082cd15973 100644 --- a/src/views/admin/settings/post.tpl +++ b/src/views/admin/settings/post.tpl @@ -210,6 +210,10 @@
[[admin/settings/post:recent]]
+
+ + +