mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-02-26 16:41:21 +01:00
Merge branch 'develop' into bootstrap5
This commit is contained in:
88
CHANGELOG.md
88
CHANGELOG.md
@@ -1,23 +1,47 @@
|
||||
#### v2.5.8 (2022-11-09)
|
||||
|
||||
##### Chores
|
||||
|
||||
* really fix indents this time (c2024f34)
|
||||
* fix indents (d50512e7)
|
||||
* add bootstrap5 to test runner for now (be5d6d29)
|
||||
* incrementing version number - v2.5.7 (5836bf4a)
|
||||
* update changelog for v2.5.7 (17e948ab)
|
||||
|
||||
##### New Features
|
||||
|
||||
* new search hooks (b5d38bc6)
|
||||
* add search data to filter:search.inContent (e3f21562)
|
||||
|
||||
##### Bug Fixes
|
||||
|
||||
* pass csrf_token into calls to /register/abort, #11017 (2f9d8c35)
|
||||
* check for csrf token on /register/abort, + theme changes for v2.x branches of themes (55a197a7)
|
||||
* upgrade script to work from 0.x to 2.x (a31ba824)
|
||||
* #10519, image height in emails (673261ff)
|
||||
* fallback language strings for #10987 (b9c8c02f)
|
||||
* #10993, apply autoLocale middleware to guests only (6f673f80)
|
||||
* check cid as well as template (9227b82e)
|
||||
* revert breaking change, add back SocketUser.emailConfirm (9ee30fe7)
|
||||
* in appropriately named language key `email-confirm-email2` (09f3ac65)
|
||||
* correctly pass dev flag to package installer (7672194c)
|
||||
* use `--omit=dev` flag for npm instead of `--production` (09cfd0bd)
|
||||
|
||||
##### Refactors
|
||||
|
||||
* use utils.debounce (d264c6ac)
|
||||
|
||||
##### Tests
|
||||
|
||||
* fix tests again (06d15391)
|
||||
* fix test (c833d3cd)
|
||||
|
||||
#### v2.5.7 (2022-10-14)
|
||||
|
||||
##### Chores
|
||||
|
||||
* incrementing version number - v2.5.6 (c7bd7dbf)
|
||||
* update changelog for v2.5.6 (e92238d0)
|
||||
* incrementing version number - v2.5.5 (3509ed94)
|
||||
* incrementing version number - v2.5.4 (e83260ca)
|
||||
* incrementing version number - v2.5.3 (7e922936)
|
||||
* incrementing version number - v2.5.2 (babcd17e)
|
||||
* incrementing version number - v2.5.1 (ce3aa950)
|
||||
* incrementing version number - v2.5.0 (01d276cb)
|
||||
* incrementing version number - v2.4.5 (dd3e1a28)
|
||||
* incrementing version number - v2.4.4 (d5525c87)
|
||||
* incrementing version number - v2.4.3 (9c647c6c)
|
||||
* incrementing version number - v2.4.2 (3aa7b855)
|
||||
* incrementing version number - v2.4.1 (60cbd148)
|
||||
* incrementing version number - v2.4.0 (4834cde3)
|
||||
* incrementing version number - v2.3.1 (d2425942)
|
||||
* incrementing version number - v2.3.0 (046ea120)
|
||||
|
||||
##### Performance Improvements
|
||||
|
||||
@@ -29,19 +53,6 @@
|
||||
|
||||
* incrementing version number - v2.5.5 (3509ed94)
|
||||
* update changelog for v2.5.5 (e7d0040d)
|
||||
* incrementing version number - v2.5.4 (e83260ca)
|
||||
* incrementing version number - v2.5.3 (7e922936)
|
||||
* incrementing version number - v2.5.2 (babcd17e)
|
||||
* incrementing version number - v2.5.1 (ce3aa950)
|
||||
* incrementing version number - v2.5.0 (01d276cb)
|
||||
* incrementing version number - v2.4.5 (dd3e1a28)
|
||||
* incrementing version number - v2.4.4 (d5525c87)
|
||||
* incrementing version number - v2.4.3 (9c647c6c)
|
||||
* incrementing version number - v2.4.2 (3aa7b855)
|
||||
* incrementing version number - v2.4.1 (60cbd148)
|
||||
* incrementing version number - v2.4.0 (4834cde3)
|
||||
* incrementing version number - v2.3.1 (d2425942)
|
||||
* incrementing version number - v2.3.0 (046ea120)
|
||||
|
||||
##### Bug Fixes
|
||||
|
||||
@@ -55,18 +66,6 @@
|
||||
* up plugins (b91ef6dd)
|
||||
* incrementing version number - v2.5.4 (e83260ca)
|
||||
* update changelog for v2.5.4 (aabf073c)
|
||||
* incrementing version number - v2.5.3 (7e922936)
|
||||
* incrementing version number - v2.5.2 (babcd17e)
|
||||
* incrementing version number - v2.5.1 (ce3aa950)
|
||||
* incrementing version number - v2.5.0 (01d276cb)
|
||||
* incrementing version number - v2.4.5 (dd3e1a28)
|
||||
* incrementing version number - v2.4.4 (d5525c87)
|
||||
* incrementing version number - v2.4.3 (9c647c6c)
|
||||
* incrementing version number - v2.4.2 (3aa7b855)
|
||||
* incrementing version number - v2.4.1 (60cbd148)
|
||||
* incrementing version number - v2.4.0 (4834cde3)
|
||||
* incrementing version number - v2.3.1 (d2425942)
|
||||
* incrementing version number - v2.3.0 (046ea120)
|
||||
|
||||
#### v2.5.4 (2022-10-11)
|
||||
|
||||
@@ -75,17 +74,6 @@
|
||||
* 🤔 (7240e8ce)
|
||||
* incrementing version number - v2.5.3 (7e922936)
|
||||
* update changelog for v2.5.3 (fdf240f6)
|
||||
* incrementing version number - v2.5.2 (babcd17e)
|
||||
* incrementing version number - v2.5.1 (ce3aa950)
|
||||
* incrementing version number - v2.5.0 (01d276cb)
|
||||
* incrementing version number - v2.4.5 (dd3e1a28)
|
||||
* incrementing version number - v2.4.4 (d5525c87)
|
||||
* incrementing version number - v2.4.3 (9c647c6c)
|
||||
* incrementing version number - v2.4.2 (3aa7b855)
|
||||
* incrementing version number - v2.4.1 (60cbd148)
|
||||
* incrementing version number - v2.4.0 (4834cde3)
|
||||
* incrementing version number - v2.3.1 (d2425942)
|
||||
* incrementing version number - v2.3.0 (046ea120)
|
||||
|
||||
##### Continuous Integration
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
"@adactive/bootstrap-tagsinput": "0.8.2",
|
||||
"@isaacs/ttlcache": "1.2.1",
|
||||
"@popperjs/core": "2.11.6",
|
||||
"ace-builds": "1.13.0",
|
||||
"ace-builds": "1.13.1",
|
||||
"archiver": "5.3.1",
|
||||
"async": "3.2.4",
|
||||
"autoprefixer": "10.4.13",
|
||||
@@ -52,7 +52,7 @@
|
||||
"connect-flash": "0.1.1",
|
||||
"connect-mongo": "4.6.0",
|
||||
"connect-multiparty": "2.2.0",
|
||||
"connect-pg-simple": "7.0.0",
|
||||
"connect-pg-simple": "8.0.0",
|
||||
"connect-redis": "6.1.3",
|
||||
"cookie-parser": "1.4.6",
|
||||
"cron": "2.1.0",
|
||||
@@ -60,7 +60,7 @@
|
||||
"csurf": "1.11.0",
|
||||
"daemon": "1.1.0",
|
||||
"diff": "5.1.0",
|
||||
"esbuild": "0.15.13",
|
||||
"esbuild": "0.15.14",
|
||||
"express": "4.18.2",
|
||||
"express-session": "1.17.3",
|
||||
"express-useragent": "1.0.15",
|
||||
@@ -170,6 +170,9 @@
|
||||
"optionalDependencies": {
|
||||
"sass-embedded": "1.55.0"
|
||||
},
|
||||
"resolutions": {
|
||||
"timeago/jquery": "3.6.0"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/NodeBB/NodeBB/issues"
|
||||
},
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"maintenance-mode.help": "Quando il forum è in modalità manutenzione, tutte le richieste saranno reindirizzate ad una pagina di attesa statica. Gli amministratori sono esenti da questo reindirizzamento e sono in grado di accedere al sito normalmente.",
|
||||
"maintenance-mode.status": "Codice stato modalità manutenzione",
|
||||
"maintenance-mode.message": "Messaggio di manutenzione",
|
||||
"maintenance-mode.groups-exempt-from-maintenance-mode": "Select groups that should be exempt from maintenance mode",
|
||||
"maintenance-mode.groups-exempt-from-maintenance-mode": "Seleziona i gruppi che dovrebbero essere esenti dalla modalità di manutenzione",
|
||||
"headers": "Intestazioni",
|
||||
"headers.allow-from": "Imposta ALLOW-FROM per posizionare NodeBBB in un iFrame",
|
||||
"headers.csp-frame-ancestors": "Imposta l'intestazione Content-Security-Policy frame-ancestors su Place NodeBB in un iFrame",
|
||||
|
||||
@@ -13,7 +13,7 @@ const events = require('../events');
|
||||
exports.setDefaultPostData = function (reqOrSocket, data) {
|
||||
data.uid = reqOrSocket.uid;
|
||||
data.req = exports.buildReqObject(reqOrSocket, { ...data });
|
||||
data.timestamp = parseInt(data.timestamp, 10) || Date.now();
|
||||
data.timestamp = Date.now();
|
||||
data.fromQueue = false;
|
||||
};
|
||||
|
||||
|
||||
@@ -40,13 +40,19 @@ topicsAPI.create = async function (caller, data) {
|
||||
const payload = { ...data };
|
||||
payload.tags = payload.tags || [];
|
||||
apiHelpers.setDefaultPostData(caller, payload);
|
||||
const isScheduling = parseInt(data.timestamp, 10) > payload.timestamp;
|
||||
if (isScheduling) {
|
||||
if (await privileges.categories.can('topics:schedule', data.cid, caller.uid)) {
|
||||
payload.timestamp = parseInt(data.timestamp, 10);
|
||||
} else {
|
||||
throw new Error('[[error:no-privileges]]');
|
||||
}
|
||||
}
|
||||
|
||||
// Blacklist & Post Queue
|
||||
await meta.blacklist.test(caller.ip);
|
||||
const shouldQueue = await posts.shouldQueue(caller.uid, payload);
|
||||
if (shouldQueue) {
|
||||
const queueObj = await posts.addToQueue(payload);
|
||||
return queueObj;
|
||||
return await posts.addToQueue(payload);
|
||||
}
|
||||
|
||||
const result = await topics.post(payload);
|
||||
@@ -66,12 +72,10 @@ topicsAPI.reply = async function (caller, data) {
|
||||
const payload = { ...data };
|
||||
apiHelpers.setDefaultPostData(caller, payload);
|
||||
|
||||
// Blacklist & Post Queue
|
||||
await meta.blacklist.test(caller.ip);
|
||||
const shouldQueue = await posts.shouldQueue(caller.uid, payload);
|
||||
if (shouldQueue) {
|
||||
const queueObj = await posts.addToQueue(payload);
|
||||
return queueObj;
|
||||
return await posts.addToQueue(payload);
|
||||
}
|
||||
|
||||
const postData = await topics.reply(payload); // postData seems to be a subset of postObj, refactor?
|
||||
|
||||
@@ -106,6 +106,11 @@ Data.getStaticDirectories = async function (pluginData) {
|
||||
return;
|
||||
}
|
||||
const dirPath = await resolveModulePath(pluginData.path, pluginData.staticDirs[route]);
|
||||
if (!dirPath) {
|
||||
winston.warn(`[plugins/${pluginData.id}] Invalid mapped path specified: ${
|
||||
route} => ${pluginData.staticDirs[route]}`);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const stats = await fs.promises.stat(dirPath);
|
||||
if (!stats.isDirectory()) {
|
||||
|
||||
@@ -18,7 +18,7 @@ module.exports = function (User) {
|
||||
return;
|
||||
}
|
||||
const [userData, isAdminOrMod] = await Promise.all([
|
||||
User.getUserFields(uid, ['uid', 'banned', 'mutedUntil', 'joindate', 'email', 'reputation'].concat([field])),
|
||||
User.getUserFields(uid, ['uid', 'mutedUntil', 'joindate', 'email', 'reputation'].concat([field])),
|
||||
privileges.categories.isAdminOrMod(cid, uid),
|
||||
]);
|
||||
|
||||
@@ -30,10 +30,6 @@ module.exports = function (User) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (userData.banned) {
|
||||
throw new Error('[[error:user-banned]]');
|
||||
}
|
||||
|
||||
const now = Date.now();
|
||||
if (userData.mutedUntil > now) {
|
||||
let muteLeft = ((userData.mutedUntil - now) / (1000 * 60));
|
||||
|
||||
41
test/user.js
41
test/user.js
@@ -24,6 +24,7 @@ const file = require('../src/file');
|
||||
const socketUser = require('../src/socket.io/user');
|
||||
const apiUser = require('../src/api/users');
|
||||
const utils = require('../src/utils');
|
||||
const privileges = require('../src/privileges');
|
||||
|
||||
describe('User', () => {
|
||||
let userData;
|
||||
@@ -1436,6 +1437,32 @@ describe('User', () => {
|
||||
assert.strictEqual(membership.get('verified-users'), true);
|
||||
assert.strictEqual(membership.get('unverified-users'), false);
|
||||
});
|
||||
|
||||
it('should be able to post in category for banned users', async () => {
|
||||
const { cid } = await Categories.create({
|
||||
name: 'Test Category',
|
||||
description: 'A test',
|
||||
order: 1,
|
||||
});
|
||||
const testUid = await User.create({ username: userData.username });
|
||||
await User.bans.ban(testUid);
|
||||
let _err;
|
||||
try {
|
||||
await Topics.post({ title: 'banned topic', content: 'tttttttttttt', cid: cid, uid: testUid });
|
||||
} catch (err) {
|
||||
_err = err;
|
||||
}
|
||||
assert.strictEqual(_err && _err.message, '[[error:no-privileges]]');
|
||||
|
||||
await Promise.all([
|
||||
privileges.categories.give(['groups:topics:create', 'groups:topics:reply'], cid, 'banned-users'),
|
||||
privileges.categories.rescind(['groups:topics:create', 'groups:topics:reply'], cid, 'registered-users'),
|
||||
]);
|
||||
|
||||
const result = await Topics.post({ title: 'banned topic', content: 'tttttttttttt', cid: cid, uid: testUid });
|
||||
assert(result);
|
||||
assert.strictEqual(result.topicData.title, 'banned topic');
|
||||
});
|
||||
});
|
||||
|
||||
describe('Digest.getSubscribers', () => {
|
||||
@@ -1901,7 +1928,7 @@ describe('User', () => {
|
||||
|
||||
it('should get unread count for user', async () => {
|
||||
const count = await socketUser.getUnreadCount({ uid: testUid });
|
||||
assert.strictEqual(count, 2);
|
||||
assert.strictEqual(count, 3);
|
||||
});
|
||||
|
||||
it('should get unread chat count 0 for guest', async () => {
|
||||
@@ -1924,15 +1951,15 @@ describe('User', () => {
|
||||
assert.deepStrictEqual(counts, {
|
||||
unreadChatCount: 0,
|
||||
unreadCounts: {
|
||||
'': 2,
|
||||
new: 2,
|
||||
unreplied: 2,
|
||||
'': 3,
|
||||
new: 3,
|
||||
unreplied: 3,
|
||||
watched: 0,
|
||||
},
|
||||
unreadNewTopicCount: 2,
|
||||
unreadNewTopicCount: 3,
|
||||
unreadNotificationCount: 0,
|
||||
unreadTopicCount: 2,
|
||||
unreadUnrepliedTopicCount: 2,
|
||||
unreadTopicCount: 3,
|
||||
unreadUnrepliedTopicCount: 3,
|
||||
unreadWatchedTopicCount: 0,
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user