feat: Added redirect after login for users.

This commit is contained in:
2025-05-24 11:27:12 +02:00
parent 432b4dc4e5
commit 4de7af4bc0
5 changed files with 29 additions and 20 deletions

View File

@@ -7,7 +7,7 @@ import session from "express-session";
import bcrypt from 'bcryptjs'; import bcrypt from 'bcryptjs';
import MongoStore from "connect-mongo"; import MongoStore from "connect-mongo";
import mongoose from "mongoose" import mongoose from "mongoose"
import User from "./schemas/User"; import User, { IUser } from "./schemas/User";
import routes from "./routes/index"; import routes from "./routes/index";
import process from "node:process" import process from "node:process"
import security from "./helpers/security"; import security from "./helpers/security";
@@ -20,13 +20,13 @@ if (!process.env.DOMAIN) {
declare global { declare global {
namespace Express { namespace Express {
export interface User { export interface User extends IUser {
_id: mongoose.Types.ObjectId; _id: mongoose.Types.ObjectId;
pass: string; // pass: string;
uname: string; // uname: string;
admin?: number; // admin?: number;
locked?: boolean; // locked?: boolean;
room?: string // room?: string
} }
} }
} }
@@ -87,7 +87,7 @@ passport.deserializeUser(async function(id, done) {
} }
}); });
app.listen(8080, async () => { var server = app.listen(8080, async () => {
await mongoose.connect(connectionString); await mongoose.connect(connectionString);
if (process.send) process.send("ready") if (process.send) process.send("ready")
}) })
@@ -95,5 +95,6 @@ app.listen(8080, async () => {
app.use('/', routes) app.use('/', routes)
process.on('SIGINT', () => { process.on('SIGINT', () => {
server.close()
mongoose.disconnect().then(() => process.exit(0), () => process.exit(1)) mongoose.disconnect().then(() => process.exit(0), () => process.exit(1))
}) })

View File

@@ -48,7 +48,7 @@ accsRouter.put('/:id', async (req, res)=> {
res.status(404).send("User not found") res.status(404).send("User not found")
return return
} }
if (req.body.flags != undefined) { if (req.body.flags) {
if (adminCond(req.user.admin, Perms.Superadmin)) { if (adminCond(req.user.admin, Perms.Superadmin)) {
if (adminCond(user.admin, Perms.Superadmin)) { if (adminCond(user.admin, Perms.Superadmin)) {
res.status(400).send("Cannot edit other superadmins") res.status(400).send("Cannot edit other superadmins")

View File

@@ -17,11 +17,7 @@ authRouter.post("/login", (req, res) => {
if (error) { if (error) {
res.status(500).send(error) res.status(500).send(error)
} else { } else {
if (req.user.admin != null) { res.send({status: 200, admin: req.user.admin || undefined, redirect: req.user.defaultPage})
res.send({status: 200, admin: req.user.admin})
} else {
res.send({status: 200})
}
} }
}) })
} else { } else {
@@ -83,10 +79,20 @@ authRouter.get("/check", islogged, (req, res, next) => {
if (req.user.locked) { if (req.user.locked) {
req.logout((err) => { req.logout((err) => {
if (err) next(err) if (err) next(err)
res.status(401).send("Your account has been locked.") res.status(401).send({status: 401, message: "Your account has been locked."})
}) })
} }
res.send({"admin": req.user.admin, "features": cap.flags, "room": req.user.room, "menu": {"defaultItems": usettings.settings.menu.defaultItems}, "vapid": vapidKeys.keys.publicKey}) res.send({"admin": req.user.admin, "features": cap.flags, "room": req.user.room, "menu": {"defaultItems": usettings.settings.menu.defaultItems}, "vapid": vapidKeys.keys.publicKey})
}) })
authRouter.put("/redirect", islogged, async (req, res) => {
if (["", "/", "/login", "/login/", "login"].find(v => v == req.body.redirect)) return res.status(400).send({status: 400, message: "Path in blacklist"})
const update = await User.findByIdAndUpdate(req.user._id, {defaultPage: req.body.redirect})
if (update) {
res.send({status: 200}).end()
} else {
res.status(500).send({status: 500}).end()
}
})
export { authRouter }; export { authRouter };

View File

@@ -12,18 +12,20 @@ export interface IUser {
surname?: string; surname?: string;
groups: Types.ObjectId[]; groups: Types.ObjectId[];
regDate: Date; regDate: Date;
defaultPage: string;
} }
const userSchema = new Schema<IUser>({ const userSchema = new Schema<IUser>({
uname: {type: String, required: true}, uname: {type: String, required: true},
pass: {type: String, required: true, default: "$2y$10$wxDhf.XiXkmdKrFqYUEa0.F4Bf.pDykZaMmgjvyLyeRP3E/Xy0hbC"}, pass: {type: String, required: true, default: "$2y$10$wxDhf.XiXkmdKrFqYUEa0.F4Bf.pDykZaMmgjvyLyeRP3E/Xy0hbC"},
room: String, room: {type: String, default: ""},
admin: Number, admin: Number,
locked: {type: Boolean, default: false}, locked: {type: Boolean, default: false},
fname: String, fname: {type: String, default: ""},
surname: String, surname: {type: String, default: ""},
groups: [{type: mongoose.Types.ObjectId, ref: "Group"}], groups: [{type: mongoose.Types.ObjectId, ref: "Group"}],
regDate: {type: Date, default: Date.now} regDate: {type: Date, default: Date.now},
defaultPage: {type: String, default: ""},
}) })
export default mongoose.model("logins", userSchema) export default mongoose.model("logins", userSchema)

View File

@@ -8,7 +8,7 @@ var islogged = (req: Request, res: Response, next: NextFunction) => {
} }
var isadmin = (req: Request, res: Response, next: NextFunction) => { var isadmin = (req: Request, res: Response, next: NextFunction) => {
if (req.user.admin != null) { if (req.user.admin) {
return next() return next()
} }
res.sendStatus(401) res.sendStatus(401)