Updated admin and mod flag system

This commit is contained in:
2021-03-24 08:22:47 +11:00
parent f60833ec17
commit e597974581
12 changed files with 134 additions and 47 deletions
-20
View File
@@ -1,20 +0,0 @@
const { accounts } = require('../database/models');
//auth/account/privilege
const route = async (req, res) => {
const updated = await accounts.update({
privilege: req.body.privilege
}, {
where: {
username: req.body.username
}
});
if (updated < 1) {
return res.status(403).send(`Unknown account`);
}
return res.status(200).end();
};
module.exports = route;
+5 -3
View File
@@ -20,16 +20,18 @@ module.exports = async () => {
//check for an existing admin account
const adminRecord = await accounts.findOne({
where: {
privilege: 'administrator'
admin: true
}
});
if (adminRecord == null) {
await accounts.create({
privilege: 'administrator',
email: `${process.env.ADMIN_DEFAULT_USERNAME}@${process.env.WEB_ADDRESS}`,
username: `${process.env.ADMIN_DEFAULT_USERNAME}`,
hash: await bcrypt.hash(`${process.env.ADMIN_DEFAULT_PASSWORD}`, await bcrypt.genSalt(11))
hash: await bcrypt.hash(`${process.env.ADMIN_DEFAULT_PASSWORD}`, await bcrypt.genSalt(11)),
type: 'normal',
admin: true,
mod: true
});
console.warn(`Created default admin account (email: ${process.env.ADMIN_DEFAULT_USERNAME}@${process.env.WEB_ADDRESS}; password: ${process.env.ADMIN_DEFAULT_PASSWORD})`);
+25
View File
@@ -0,0 +1,25 @@
const { accounts } = require('../database/models');
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
//admin/admin
const route = async (req, res) => {
const updated = await accounts.update({
admin: true,
mod: true
}, {
where: {
username: {
[Op.eq]: req.body.username
}
}
});
if (!updated[0]) {
return res.status(500).send('Failed to set admin status');
}
res.status(200).end();
};
module.exports = route;
+24
View File
@@ -0,0 +1,24 @@
const { accounts } = require('../database/models');
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
//admin/mod
const route = async (req, res) => {
const updated = await accounts.update({
mod: true
}, {
where: {
username: {
[Op.eq]: req.body.username
}
}
});
if (!updated[0]) {
return res.status(500).send('Failed to set mod status');
}
res.status(200).end();
};
module.exports = route;
+7 -4
View File
@@ -6,9 +6,9 @@ const tokenAuth = require('../utilities/token-auth');
router.use(tokenAuth);
router.use((req, res, next) => {
//check the user's privilege
if (req.user.privilege != 'administrator') {
return res.status(401).send('Admins only');
//check the user's admin status
if (!req.user.admin) {
return res.status(401).send('Admin only');
}
next();
@@ -17,6 +17,9 @@ router.use((req, res, next) => {
require('./default-account')(); //generate the default accouunt
//basic route management
router.patch('/privilege', require('./account-privilege'));
router.post('/admin', require('./grant-admin'));
router.delete('/admin', require('./remove-admin'));
router.post('/mod', require('./grant-mod'));
router.delete('/mod', require('./remove-mod'));
module.exports = router;
+24
View File
@@ -0,0 +1,24 @@
const { accounts } = require('../database/models');
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
//admin/admin
const route = async (req, res) => {
const updated = await accounts.update({
admin: false
}, {
where: {
username: {
[Op.eq]: req.body.username
}
}
});
if (!updated[0]) {
return res.status(500).send('Failed to set admin status');
}
res.status(200).end();
};
module.exports = route;
+25
View File
@@ -0,0 +1,25 @@
const { accounts } = require('../database/models');
const Sequelize = require('sequelize');
const Op = Sequelize.Op;
//admin/admin
const route = async (req, res) => {
const updated = await accounts.update({
admin: false,
mod: false
}, {
where: {
username: {
[Op.eq]: req.body.username
}
}
});
if (!updated[0]) {
return res.status(500).send('Failed to set mod status');
}
res.status(200).end();
};
module.exports = route;
+1 -1
View File
@@ -43,7 +43,7 @@ const route = async (req, res) => {
});
//generate the JWT
const tokens = generate(account.id, account.username, account.privilege);
const tokens = generate(account.id, account.username, account.type, account.admin, account.mod);
//finally
res.status(200).json(tokens);
+18 -6
View File
@@ -10,12 +10,6 @@ module.exports = sequelize.define('accounts', {
unique: true
},
privilege: {
type: Sequelize.ENUM,
values: ['administrator', 'moderator', 'alpha', 'beta', 'gamma', 'normal'],
defaultValue: 'normal'
},
email: {
type: 'varchar(320)',
unique: true
@@ -28,6 +22,24 @@ module.exports = sequelize.define('accounts', {
hash: 'varchar(100)', //for passwords
type: {
type: Sequelize.ENUM,
values: ['normal', 'alpha', 'beta', 'gamma'],
defaultValue: 'normal'
},
admin: {
type: Sequelize.BOOLEAN,
allowNull: false,
defaultValue: false
},
mod: {
type: Sequelize.BOOLEAN,
allowNull: false,
defaultValue: false
},
contact: {
type: Sequelize.BOOLEAN,
allowNull: false,
+4 -2
View File
@@ -2,11 +2,13 @@ const jwt = require('jsonwebtoken');
const { tokens } = require('../database/models');
//generates a JWT token based on the given arguments
module.exports = (id, username, privilege) => {
module.exports = (id, username, type, admin, mod) => {
const content = {
id,
username,
privilege
type,
admin,
mod,
};
const accessToken = jwt.sign(content, process.env.SECRET_ACCESS, { expiresIn: '10m' });
+1 -1
View File
@@ -24,7 +24,7 @@ module.exports = (token, callback) => {
return callback(403);
}
const result = generate(user.id, user.username, user.privilege);
const result = generate(user.id, user.username, user.type, user.admin, user.mod);
destroy(token);