Private forum plugin
-
Hang on... you just want to redirect users to log in or register, right?
Why don't you just restrict category permissions to registered-users only? Then you can use some client-side logic in the custom JS to send users to
/login
or/register
ifapp.user.uid
is 0. -
@PitaJ I think I begin to understand the concept.
Using the following plugin.json my script can use the express object to intercept each requests?{ "id": "nodebb-plugin-private-forum", "url": "httls://github.com/..../.......", "library": "./private-forum.js", "hooks": [ { "hook": "static:app.load", "method": "init" } ] }
I am not sure about the hook configuration.
This is the kind of code I would like to use in my plugin:
app.use(function(req, res, next) { if (req.session.user == undefined) { return res.render('/login'); } else { next(); } });
-
@julian I tried this already.
But this is not secure, as the API can still be requested manually (for example user pages are public).Using a middleware I can filter all requests and only serve the login or register page.
Front code is not secure because the user can remove it.
-
@flex you're on the right track with what you have there. Try it out!
You'll probably want to redirect instead. Here's a helpful handler to assist:
https://github.com/NodeBB/NodeBB/blob/master/src/controllers/helpers.js#L107
-
Hello guys,
I am starting to develop the plugin, but I did not understand how to add my code as a middleware and use the
req
object.
For now it is not working because I don't know how to get thereq
object (undefinied).Here's my plugin:
'use strict'; const plugin = {}; var winston = module.parent.require('winston'); const helpers = require.main.require('./src/controllers/helpers'); plugin.init = function (params, callback) { const { app, middleware, router } = params; var allowedPages=["/login", "/register", "/reset"]; console.log("=================================="); console.log(" Plugin Private Forum Initialized "); console.log("=================================="); if (allowedPages.indexOf(req.url) < 0) { helpers.notAllowed(req, res, next); } else { console.log("PLUGIN PRIVATE FORUM: req.url="+req.url+", user is logged"); winston.log("PLUGIN PRIVATE FORUM: req.url="+req.url+", user is logged"); next(); } }; module.exports = plugin;
You can see it here: https://github.com/LM1LC3N7/nodebb-plugin-private-forum/blob/master/library.js
Of course there are errors:
2020-06-03T15:55:06.696Z [4567/1731] - verbose: [plugins/fireHook] static:app.load ================================== Plugin Private Forum Initialized ================================== 2020-06-03T15:55:06.733Z [4567/1731] - error: [plugins] Error executing 'static:app.load' in plugin 'nodebb-plugin-private-forum' 2020-06-03T15:55:06.734Z [4567/1731] - error: ReferenceError: req is not defined at Object.plugin.init [as method] (/etc/nodebb/nodebb-plugin-private-forum/library.js:16:27) at /nodebb/src/plugins/hooks.js:176:30 at /nodebb/node_modules/async/dist/async.js:2154:44 at eachOfArrayLike (/nodebb/node_modules/async/dist/async.js:500:13) at eachOf (/nodebb/node_modules/async/dist/async.js:551:16) at awaitable (/nodebb/node_modules/async/dist/async.js:208:32) at Object.eachLimit (/nodebb/node_modules/async/dist/async.js:2216:16) at /nodebb/node_modules/async/dist/async.js:216:25 at new Promise (<anonymous>) at Object.awaitable (/nodebb/node_modules/async/dist/async.js:211:20)
-
You need to wrap the middleware in a function and apply that function with app.use
-
@flex what do you mean by connected? You can check if a user is logged in by checking if
req.uid
is greater than (not equal to) 0. -
Thank you again, now it seems to work well!
Can you review the code and maybe test the module?
I would like to be sure that I have not forgot something.GitHub - LM1LC3N7/nodebb-plugin-private-forum: A NodeBB plugin to lockdown the forum to non-registered users.
A NodeBB plugin to lockdown the forum to non-registered users. - LM1LC3N7/nodebb-plugin-private-forum
GitHub (github.com)
-