mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-12-24 09:20:32 +01:00
Compare commits
4 Commits
renovate/s
...
express5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8297f04469 | ||
|
|
7ce9fe6c94 | ||
|
|
880768b944 | ||
|
|
d98c3c00db |
@@ -68,7 +68,7 @@
|
||||
"daemon": "1.1.0",
|
||||
"diff": "7.0.0",
|
||||
"esbuild": "0.25.2",
|
||||
"express": "4.21.2",
|
||||
"express": "5.1.0",
|
||||
"express-session": "1.18.1",
|
||||
"express-useragent": "1.0.15",
|
||||
"fetch-cookie": "3.1.0",
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
'use strict';
|
||||
|
||||
const url = require('url');
|
||||
const querystring = require('querystring');
|
||||
|
||||
const plugins = require('../plugins');
|
||||
const meta = require('../meta');
|
||||
@@ -40,11 +41,11 @@ async function rewrite(req, res, next) {
|
||||
const { pathname } = parsedUrl;
|
||||
const hook = `action:homepage.get:${pathname}`;
|
||||
if (!plugins.hooks.hasListeners(hook)) {
|
||||
req.url = req.path + (!req.path.endsWith('/') ? '/' : '') + pathname;
|
||||
const queryString = querystring.stringify(req.query);
|
||||
req.url = req.path + (!req.path.endsWith('/') ? '/' : '') + pathname + (queryString ? `?${queryString}` : '');
|
||||
} else {
|
||||
res.locals.homePageRoute = pathname;
|
||||
}
|
||||
req.query = Object.assign(parsedUrl.query, req.query);
|
||||
|
||||
next();
|
||||
}
|
||||
|
||||
@@ -32,10 +32,11 @@ searchController.search = async function (req, res, next) {
|
||||
'search:content': privileges.global.can('search:content', req.uid),
|
||||
'search:tags': privileges.global.can('search:tags', req.uid),
|
||||
});
|
||||
req.query.in = req.query.in || meta.config.searchDefaultIn || 'titlesposts';
|
||||
let allowed = (req.query.in === 'users' && userPrivileges['search:users']) ||
|
||||
(req.query.in === 'tags' && userPrivileges['search:tags']) ||
|
||||
(req.query.in === 'categories') ||
|
||||
const query = { ...req.query };
|
||||
query.in = req.query.in || meta.config.searchDefaultIn || 'titlesposts';
|
||||
let allowed = (query.in === 'users' && userPrivileges['search:users']) ||
|
||||
(query.in === 'tags' && userPrivileges['search:tags']) ||
|
||||
(query.in === 'categories') ||
|
||||
(['titles', 'titlesposts', 'posts', 'bookmarks'].includes(req.query.in) && userPrivileges['search:content']);
|
||||
({ allowed } = await plugins.hooks.fire('filter:search.isAllowed', {
|
||||
uid: req.uid,
|
||||
@@ -47,20 +48,20 @@ searchController.search = async function (req, res, next) {
|
||||
}
|
||||
|
||||
if (req.query.categories && !Array.isArray(req.query.categories)) {
|
||||
req.query.categories = [req.query.categories];
|
||||
query.categories = [req.query.categories];
|
||||
}
|
||||
if (req.query.hasTags && !Array.isArray(req.query.hasTags)) {
|
||||
req.query.hasTags = [req.query.hasTags];
|
||||
query.hasTags = [req.query.hasTags];
|
||||
}
|
||||
|
||||
const data = {
|
||||
query: req.query.term,
|
||||
searchIn: req.query.in,
|
||||
searchIn: query.in,
|
||||
matchWords: req.query.matchWords || 'all',
|
||||
postedBy: req.query.by,
|
||||
categories: req.query.categories,
|
||||
categories: query.categories,
|
||||
searchChildren: req.query.searchChildren,
|
||||
hasTags: req.query.hasTags,
|
||||
hasTags: query.hasTags,
|
||||
replies: validator.escape(String(req.query.replies || '')),
|
||||
repliesFilter: validator.escape(String(req.query.repliesFilter || '')),
|
||||
timeRange: validator.escape(String(req.query.timeRange || '')),
|
||||
@@ -70,7 +71,7 @@ searchController.search = async function (req, res, next) {
|
||||
page: page,
|
||||
itemsPerPage: req.query.itemsPerPage,
|
||||
uid: req.uid,
|
||||
qs: req.query,
|
||||
qs: query,
|
||||
};
|
||||
|
||||
const [searchData] = await Promise.all([
|
||||
|
||||
@@ -59,8 +59,8 @@ unreadController.get = async function (req, res) {
|
||||
});
|
||||
|
||||
if (userSettings.usePagination && (page < 1 || page > data.pageCount)) {
|
||||
req.query.page = Math.max(1, Math.min(data.pageCount, page));
|
||||
return helpers.redirect(res, `/unread?${querystring.stringify(req.query)}`);
|
||||
const query = { ...req.query, page: Math.max(1, Math.min(data.pageCount, page))};
|
||||
return helpers.redirect(res, `/unread?${querystring.stringify(query)}`);
|
||||
}
|
||||
data.canPost = canPost;
|
||||
data.showSelect = true;
|
||||
|
||||
@@ -86,6 +86,7 @@ module.exports = function (middleware) {
|
||||
if (req.query.lang) {
|
||||
const langs = await listCodes();
|
||||
if (!langs.includes(req.query.lang)) {
|
||||
// TODO: cant set req.query.lang
|
||||
req.query.lang = meta.config.defaultLang;
|
||||
}
|
||||
return next();
|
||||
@@ -97,6 +98,7 @@ module.exports = function (middleware) {
|
||||
if (!lang) {
|
||||
return next();
|
||||
}
|
||||
// TODO: cant set req.query.lang
|
||||
req.query.lang = lang;
|
||||
}
|
||||
|
||||
|
||||
@@ -170,7 +170,8 @@ middleware.exposeUid = helpers.try(async (req, res, next) => {
|
||||
});
|
||||
|
||||
async function expose(exposedField, method, field, req, res, next) {
|
||||
if (!req.params.hasOwnProperty(field)) {
|
||||
const _params = { ...req.params };
|
||||
if (!_params.hasOwnProperty(field)) {
|
||||
return next();
|
||||
}
|
||||
const param = String(req.params[field]).toLowerCase();
|
||||
|
||||
@@ -15,7 +15,7 @@ module.exports = function (Posts) {
|
||||
|
||||
Posts.getRecentPosts = async function (uid, start, stop, term) {
|
||||
let min = 0;
|
||||
if (terms[term]) {
|
||||
if (terms.hasOwnProperty(term) && term[term]) {
|
||||
min = Date.now() - terms[term];
|
||||
}
|
||||
|
||||
|
||||
@@ -40,13 +40,13 @@ module.exports = function (app, middleware, controllers) {
|
||||
app.get('/post/:pid', [...middlewares, middleware.assert.post], controllers.activitypub.actors.note);
|
||||
app.get('/post/:pid/replies', [...middlewares, middleware.assert.post], controllers.activitypub.actors.replies);
|
||||
|
||||
app.get('/topic/:tid/:slug?', [...middlewares, middleware.assert.topic], controllers.activitypub.actors.topic);
|
||||
app.get('/topic/:tid{/:slug}', [...middlewares, middleware.assert.topic], controllers.activitypub.actors.topic);
|
||||
|
||||
app.get('/category/:cid/inbox', [...middlewares, middleware.assert.category], controllers.activitypub.getInbox);
|
||||
app.post('/category/:cid/inbox', [...inboxMiddlewares, middleware.assert.category, ...inboxMiddlewares], controllers.activitypub.postInbox);
|
||||
app.get('/category/:cid/outbox', [...middlewares, middleware.assert.category], controllers.activitypub.getCategoryOutbox);
|
||||
app.post('/category/:cid/outbox', [...middlewares, middleware.assert.category], controllers.activitypub.postOutbox);
|
||||
app.get('/category/:cid/:slug?', [...middlewares, middleware.assert.category], controllers.activitypub.actors.category);
|
||||
app.get('/category/:cid{/:slug}', [...middlewares, middleware.assert.category], controllers.activitypub.actors.category);
|
||||
|
||||
app.get('/message/:mid', [...middlewares, middleware.assert.message], controllers.activitypub.actors.message);
|
||||
};
|
||||
|
||||
@@ -18,7 +18,7 @@ module.exports = function (app, name, middleware, controllers) {
|
||||
helpers.setupAdminPageRoute(app, `/${name}/manage/categories/:category_id/analytics`, middlewares, controllers.admin.categories.getAnalytics);
|
||||
helpers.setupAdminPageRoute(app, `/${name}/manage/categories/:category_id/federation`, middlewares, controllers.admin.categories.getFederation);
|
||||
|
||||
helpers.setupAdminPageRoute(app, `/${name}/manage/privileges/:cid?`, middlewares, controllers.admin.privileges.get);
|
||||
helpers.setupAdminPageRoute(app, `/${name}/manage/privileges{/:cid}`, middlewares, controllers.admin.privileges.get);
|
||||
helpers.setupAdminPageRoute(app, `/${name}/manage/tags`, middlewares, controllers.admin.tags.get);
|
||||
|
||||
helpers.setupAdminPageRoute(app, `/${name}/manage/users`, middlewares, controllers.admin.users.index);
|
||||
|
||||
@@ -18,7 +18,7 @@ module.exports = function (app, middleware, controllers) {
|
||||
router.get('/user/email/:email', [...middlewares, middleware.canViewUsers], helpers.tryRoute(controllers.user.getUserByEmail));
|
||||
|
||||
router.get('/categories/:cid/moderators', [...middlewares], helpers.tryRoute(controllers.api.getModerators));
|
||||
router.get('/recent/posts/:term?', [...middlewares], helpers.tryRoute(controllers.posts.getRecentPosts));
|
||||
router.get('/recent/posts{/:term}', [...middlewares], helpers.tryRoute(controllers.posts.getRecentPosts));
|
||||
router.get('/unread/total', [...middlewares, middleware.ensureLoggedIn], helpers.tryRoute(controllers.unread.unreadTotal));
|
||||
router.get('/topic/teaser/:topic_id', [...middlewares], helpers.tryRoute(controllers.topics.teaser));
|
||||
router.get('/topic/pagination/:topic_id', [...middlewares], helpers.tryRoute(controllers.topics.pagination));
|
||||
|
||||
@@ -36,7 +36,7 @@ _mounts.main = (app, middleware, controllers) => {
|
||||
setupPageRoute(app, '/confirm/:code', [], controllers.confirmEmail);
|
||||
setupPageRoute(app, '/outgoing', [], controllers.outgoing);
|
||||
setupPageRoute(app, '/search', [], controllers.search.search);
|
||||
setupPageRoute(app, '/reset/:code?', [middleware.delayLoading], controllers.reset);
|
||||
setupPageRoute(app, '/reset{/:code}', [middleware.delayLoading], controllers.reset);
|
||||
setupPageRoute(app, '/tos', [], controllers.termsOfUse);
|
||||
|
||||
setupPageRoute(app, '/email/unsubscribe/:token', [], controllers.accounts.settings.unsubscribe);
|
||||
@@ -48,7 +48,7 @@ _mounts.main = (app, middleware, controllers) => {
|
||||
_mounts.mod = (app, middleware, controllers) => {
|
||||
setupPageRoute(app, '/flags', [], controllers.mods.flags.list);
|
||||
setupPageRoute(app, '/flags/:flagId', [], controllers.mods.flags.detail);
|
||||
setupPageRoute(app, '/post-queue/:id?', [], controllers.mods.postQueue);
|
||||
setupPageRoute(app, '/post-queue{/:id}', [], controllers.mods.postQueue);
|
||||
};
|
||||
|
||||
_mounts.globalMod = (app, middleware, controllers) => {
|
||||
@@ -57,8 +57,8 @@ _mounts.globalMod = (app, middleware, controllers) => {
|
||||
};
|
||||
|
||||
_mounts.topic = (app, name, middleware, controllers) => {
|
||||
setupPageRoute(app, `/${name}/:topic_id/:slug/:post_index?`, [], controllers.topics.get);
|
||||
setupPageRoute(app, `/${name}/:topic_id/:slug?`, [], controllers.topics.get);
|
||||
setupPageRoute(app, `/${name}/:topic_id/:slug{/:post_index}`, [], controllers.topics.get);
|
||||
setupPageRoute(app, `/${name}/:topic_id{/:slug}`, [], controllers.topics.get);
|
||||
};
|
||||
|
||||
_mounts.post = (app, name, middleware, controllers) => {
|
||||
@@ -86,7 +86,7 @@ _mounts.categories = (app, name, middleware, controllers) => {
|
||||
|
||||
_mounts.category = (app, name, middleware, controllers) => {
|
||||
setupPageRoute(app, `/${name}/:category_id/:slug/:topic_index`, [], controllers.category.get);
|
||||
setupPageRoute(app, `/${name}/:category_id/:slug?`, [], controllers.category.get);
|
||||
setupPageRoute(app, `/${name}/:category_id{/:slug}`, [], controllers.category.get);
|
||||
};
|
||||
|
||||
_mounts.users = (app, name, middleware, controllers) => {
|
||||
@@ -131,9 +131,15 @@ module.exports = async function (app, middleware) {
|
||||
}
|
||||
});
|
||||
|
||||
router.all('(/+api|/+api/*?)', middleware.prepareAPI);
|
||||
router.all(`(/+api/admin|/+api/admin/*?${mounts.admin !== 'admin' ? `|/+api/${mounts.admin}|/+api/${mounts.admin}/*?` : ''})`, middleware.authenticateRequest, middleware.ensureLoggedIn, middleware.admin.checkPrivileges);
|
||||
router.all(`(/+admin|/+admin/*?${mounts.admin !== 'admin' ? `|/+${mounts.admin}|/+${mounts.admin}/*?` : ''})`, middleware.ensureLoggedIn, middleware.applyCSRF, middleware.admin.checkPrivileges);
|
||||
// TODO: upgrade these routes to express 5.x
|
||||
// router.all('(/+api|/+api/*?)', middleware.prepareAPI);
|
||||
router.all(['/api/*splat', '/api'], middleware.prepareAPI);
|
||||
|
||||
// eslint-disable-next-line max-len
|
||||
// router.all(`(/+api/admin|/+api/admin/*?${mounts.admin !== 'admin' ? `|/+api/${mounts.admin}|/+api/${mounts.admin}/*?` : ''})`, middleware.authenticateRequest, middleware.ensureLoggedIn, middleware.admin.checkPrivileges);
|
||||
|
||||
// eslint-disable-next-line max-len
|
||||
// router.all(`(/+admin|/+admin/*?${mounts.admin !== 'admin' ? `|/+${mounts.admin}|/+${mounts.admin}/*?` : ''})`, middleware.ensureLoggedIn, middleware.applyCSRF, middleware.admin.checkPrivileges);
|
||||
|
||||
app.use(middleware.stripLeadingSlashes);
|
||||
|
||||
@@ -195,8 +201,8 @@ function addCoreRoutes(app, router, middleware, mounts) {
|
||||
res.redirect(`${relativePath}/assets/plugins${req.path}${req._parsedUrl.search || ''}`);
|
||||
});
|
||||
|
||||
app.use(`${relativePath}/assets/client-*.css`, middleware.buildSkinAsset);
|
||||
app.use(`${relativePath}/assets/client-*-rtl.css`, middleware.buildSkinAsset);
|
||||
app.use(`${relativePath}/assets/client-*splat.css`, middleware.buildSkinAsset);
|
||||
app.use(`${relativePath}/assets/client-*splat-rtl.css`, middleware.buildSkinAsset);
|
||||
|
||||
app.use(controllers['404'].handle404);
|
||||
app.use(controllers.errors.handleURIErrors);
|
||||
|
||||
@@ -17,8 +17,8 @@ module.exports = function (app, name, middleware, controllers) {
|
||||
];
|
||||
|
||||
setupPageRoute(app, '/me', [], middleware.redirectMeToUserslug);
|
||||
setupPageRoute(app, '/me/*', [], middleware.redirectMeToUserslug);
|
||||
setupPageRoute(app, '/uid/:uid*', [], middleware.redirectUidToUserslug);
|
||||
setupPageRoute(app, '/me/*splat', [], middleware.redirectMeToUserslug);
|
||||
setupPageRoute(app, '/uid{/:uid}', [], middleware.redirectUidToUserslug);
|
||||
|
||||
setupPageRoute(app, `/${name}/:userslug`, middlewares, controllers.accounts.profile.get);
|
||||
setupPageRoute(app, `/${name}/:userslug/following`, middlewares, controllers.accounts.follow.getFollowing);
|
||||
@@ -51,8 +51,8 @@ module.exports = function (app, name, middleware, controllers) {
|
||||
setupPageRoute(app, `/${name}/:userslug/sessions`, accountMiddlewares, controllers.accounts.sessions.get);
|
||||
|
||||
setupPageRoute(app, '/notifications', [middleware.ensureLoggedIn], controllers.accounts.notifications.get);
|
||||
setupPageRoute(app, `/${name}/:userslug/chats/:roomid?/:index?`, [middleware.exposeUid, middleware.canViewUsers], controllers.accounts.chats.get);
|
||||
setupPageRoute(app, '/chats/:roomid?/:index?', [middleware.ensureLoggedIn], controllers.accounts.chats.redirectToChat);
|
||||
setupPageRoute(app, `/${name}/:userslug/chats{/:roomid}{/:index}`, [middleware.exposeUid, middleware.canViewUsers], controllers.accounts.chats.get);
|
||||
setupPageRoute(app, '/chats{/:roomid}{/:index}', [middleware.ensureLoggedIn], controllers.accounts.chats.redirectToChat);
|
||||
|
||||
setupPageRoute(app, `/message/:mid`, [middleware.ensureLoggedIn], controllers.accounts.chats.redirectToMessage);
|
||||
};
|
||||
|
||||
@@ -26,7 +26,7 @@ module.exports = function (app, middleware, controllers) {
|
||||
});
|
||||
});
|
||||
|
||||
app.get('/nodeinfo/2.0(.json)?', helpers.tryRoute(async (req, res) => {
|
||||
app.get('/nodeinfo/2.0{.json}', helpers.tryRoute(async (req, res) => {
|
||||
const getDaysInMonth = (year, month) => new Date(year, month, 0).getDate();
|
||||
|
||||
function addMonths(input, months) {
|
||||
|
||||
@@ -42,7 +42,11 @@ module.exports = function () {
|
||||
setupApiRoute(router, 'get', '/:pid/replies', [middleware.assert.post], controllers.write.posts.getReplies);
|
||||
|
||||
// Shorthand route to access post routes by topic index
|
||||
router.all('/+byIndex/:index*?', [middleware.checkRequired.bind(null, ['tid'])], controllers.write.posts.redirectByIndex);
|
||||
// TODO: upgrade to express 5
|
||||
|
||||
// router.all('/+byIndex/:index*?', [
|
||||
// middleware.checkRequired.bind(null, ['tid']),
|
||||
// ], controllers.write.posts.redirectByIndex);
|
||||
|
||||
return router;
|
||||
};
|
||||
|
||||
@@ -62,7 +62,8 @@ function authenticatedRoutes() {
|
||||
setupApiRoute(router, 'post', '/:uid/exports/:type', [...middlewares, middleware.assert.user, middleware.checkAccountPermissions], controllers.write.users.generateExportsByType);
|
||||
|
||||
// Shorthand route to access user routes by userslug
|
||||
router.all('/+bySlug/:userslug*?', [], controllers.write.users.redirectBySlug);
|
||||
// TODO: upgrade to express 5
|
||||
// router.all('/+bySlug/:userslug*?', [], controllers.write.users.redirectBySlug);
|
||||
}
|
||||
|
||||
module.exports = function () {
|
||||
|
||||
@@ -362,6 +362,8 @@ describe('API', async () => {
|
||||
path: (prefix || '') + dispatch.route.path,
|
||||
};
|
||||
} else if (dispatch.name === 'router') {
|
||||
console.log(dispatch);
|
||||
// TODO: dispatch.regexp no longer exists
|
||||
const prefix = dispatch.regexp.toString().replace('/^', '').replace('\\/?(?=\\/|$)/i', '').replace(/\\\//g, '/');
|
||||
return buildPaths(dispatch.handle.stack, prefix);
|
||||
}
|
||||
@@ -373,7 +375,7 @@ describe('API', async () => {
|
||||
return _.flatten(paths);
|
||||
};
|
||||
|
||||
let paths = buildPaths(webserver.app._router.stack).filter(Boolean).map((pathObj) => {
|
||||
let paths = buildPaths(webserver.app.router.stack).filter(Boolean).map((pathObj) => {
|
||||
pathObj.path = pathObj.path.replace(/\/:([^\\/]+)/g, '/{$1}');
|
||||
return pathObj;
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user