2022-09-16 22:40:43 +03:00
|
|
|
const { urlencoded: BP } = require('body-parser'),
|
|
|
|
{ mw: IP } = require('request-ip'),
|
|
|
|
RL = require('express-rate-limit'),
|
|
|
|
BAN = require('express-ip-block'),
|
|
|
|
SES = require('express-session');
|
|
|
|
|
|
|
|
const
|
|
|
|
{ def_theme, forum_name, description } = require("./config.json"),
|
2022-09-09 15:34:12 +03:00
|
|
|
{ UserModel, BanModel } = require("./models"),
|
2022-08-29 19:31:59 +03:00
|
|
|
port = process.env.PORT || 3000,
|
|
|
|
mongoose = require("mongoose"),
|
|
|
|
express = require('express'),
|
|
|
|
fs = require("fs"),
|
|
|
|
app = express();
|
2022-08-31 14:44:28 +03:00
|
|
|
|
2022-08-29 19:31:59 +03:00
|
|
|
app.ips = [];
|
2022-09-09 16:29:36 +03:00
|
|
|
|
2022-08-09 19:16:34 +03:00
|
|
|
require("dotenv").config();
|
2022-08-29 19:31:59 +03:00
|
|
|
mongoose.connect(process.env.MONGO_DB_URL,
|
2022-08-31 14:44:28 +03:00
|
|
|
async () => console.log("Database is connected with", (app.ips = await BanModel.find({})).length, "banned IPs"));
|
2022-04-06 21:14:46 +03:00
|
|
|
|
2022-03-13 16:16:46 +03:00
|
|
|
app.set("view engine", "ejs");
|
2022-08-29 19:31:59 +03:00
|
|
|
|
2022-09-16 22:40:43 +03:00
|
|
|
app.use(express.static("public"), express.json(), IP(), BAN(app.ips),
|
|
|
|
SES({ secret: 'secret', resave: true, saveUninitialized: true }),
|
2022-08-29 19:31:59 +03:00
|
|
|
async (req, res, next) => {
|
2022-09-16 22:26:03 +03:00
|
|
|
req.user = req.session.userID ? await UserModel.findOneAndUpdate({ id: req.session.userID }, {
|
|
|
|
lastSeen: Date.now(), $addToSet: { ips: req.clientIp }
|
|
|
|
}) : null;
|
2022-09-16 22:40:43 +03:00
|
|
|
|
2022-08-27 10:31:16 +03:00
|
|
|
res.reply = (page, options = {}, status = 200) => res.status(status)
|
2022-09-16 22:40:43 +03:00
|
|
|
.render(page, { user: req.user, theme: req.user?.theme || def_theme, forum_name, description, ...options });
|
2022-08-27 10:31:16 +03:00
|
|
|
|
|
|
|
res.error = (type, error) => res.reply("error", { type, error }, type);
|
|
|
|
|
2022-08-24 22:10:23 +03:00
|
|
|
if (req.user?.deleted) {
|
2022-08-29 19:31:59 +03:00
|
|
|
req.session.destroy();
|
|
|
|
return res.error(403, "Your account has been deleted.");
|
2022-08-24 22:09:21 +03:00
|
|
|
}
|
2022-08-11 03:12:40 +03:00
|
|
|
next();
|
2022-09-16 22:40:43 +03:00
|
|
|
}, RL({
|
2022-09-09 15:34:12 +03:00
|
|
|
windowMs: 60_000, max: 20,
|
2022-09-05 23:44:38 +03:00
|
|
|
handler: (req, res, next, opts) => !req.user?.admin ? res.error(opts.statusCode, "You are begin ratelimited") : next()
|
2022-09-16 22:40:43 +03:00
|
|
|
}), BP({ extended: true })
|
2022-08-29 19:31:59 +03:00
|
|
|
);
|
|
|
|
|
2022-03-22 00:10:29 +03:00
|
|
|
for (const file of fs.readdirSync("./routes"))
|
2022-08-29 19:31:59 +03:00
|
|
|
app.use("/" + file.replace(".js", ""), require(`./routes/${file}`));
|
2022-03-21 23:53:22 +03:00
|
|
|
|
2022-08-11 03:12:40 +03:00
|
|
|
app.all("*", (req, res) => res.error(404, "We have not got this page."));
|
2022-03-21 23:53:22 +03:00
|
|
|
|
2022-09-16 22:26:03 +03:00
|
|
|
app.listen(port, () => console.log(`${forum_name}-forum on port:`, port));
|