From 221a4b24a061bc318135a2044180a239466ff657 Mon Sep 17 00:00:00 2001 From: Valentin PUCCETTI Date: Mon, 11 Sep 2023 16:28:18 +0200 Subject: [PATCH] link between servers & groups, clean, bug fix --- index.js | 20 ++- model/access.model.js | 20 +++ model/server.model.js | 2 + model/user.model.js | 1 + routes/admin.route.js | 2 + routes/admin/accesses.route.js | 30 ++++ routes/admin/groups.route.js | 20 ++- routes/admin/members.route.js | 7 +- routes/admin/servers.route.js | 5 +- routes/admin/users.route.js | 7 +- routes/keys.route.js | 1 + services/accesses.service.js | 52 +++++++ .../{group.service.js => groups.service.js} | 46 ++++++- services/keys.service.js | 6 +- services/members.service.js | 2 - services/server.service.js | 13 +- services/users.service.js | 5 +- views/admin/group_edit.ejs | 128 +++++++++++++----- views/footer.ejs | 7 +- 19 files changed, 298 insertions(+), 76 deletions(-) create mode 100644 model/access.model.js create mode 100644 routes/admin/accesses.route.js create mode 100644 services/accesses.service.js rename services/{group.service.js => groups.service.js} (61%) diff --git a/index.js b/index.js index 61647a1..a760524 100644 --- a/index.js +++ b/index.js @@ -1,19 +1,19 @@ -const { default: axios } = require("axios"); -const express = require("express"); -const app = express(); const session = require('express-session'); -const databaseService = require('./services/database.service'); const bodyParser = require('body-parser'); +const express = require("express"); + +const databaseService = require('./services/database.service'); + +require('dotenv').config() userService = require("./services/users.service"); -const groupService = require("./services/group.service"); - const User = require('./model/user.model') const Key = require('./model/key.model') -const {makeAdmin} = require("./services/users.service"); const Member = require("./model/member.model"); -const Group = require("./model/group.model"); + +const app = express(); + databaseService.sync().then(() => { console.log("Database ready"); @@ -76,10 +76,6 @@ app.get("/login", (req, res) => { res.render('login') }); -try { - userService.makeAdmin(43043885) -} catch (e) { -} app.use('/admin/', require('./routes/admin.route')); app.use('/auth/', require('./routes/auth.route')); diff --git a/model/access.model.js b/model/access.model.js new file mode 100644 index 0000000..bcbe867 --- /dev/null +++ b/model/access.model.js @@ -0,0 +1,20 @@ +const { Model, DataTypes} = require('sequelize'); +const sequelize = require('../services/database.service'); + +class Access extends Model {} + +Access.init({ + serverHostname: { + type: DataTypes.STRING, + required: true, + }, + groupName: { + type: DataTypes.INTEGER, + required: true, + } +}, { + sequelize, + modelName: 'access' +}) + +module.exports = Access; \ No newline at end of file diff --git a/model/server.model.js b/model/server.model.js index 12ff14b..4944752 100644 --- a/model/server.model.js +++ b/model/server.model.js @@ -7,6 +7,8 @@ Server.init({ hostname: { type: DataTypes.STRING, required: true, + unique: true, + primaryKey: true, }, ip: { type: DataTypes.STRING, diff --git a/model/user.model.js b/model/user.model.js index ba00100..c925538 100644 --- a/model/user.model.js +++ b/model/user.model.js @@ -7,6 +7,7 @@ User.init({ id: { type: DataTypes.INTEGER, primaryKey: true, + unique: true, required: true, }, admin: { diff --git a/routes/admin.route.js b/routes/admin.route.js index 88638a0..7161432 100644 --- a/routes/admin.route.js +++ b/routes/admin.route.js @@ -1,5 +1,6 @@ const express = require('express'); const User = require("../model/user.model") + var router = express.Router(); router.use('*', (req, res, next) => { @@ -20,5 +21,6 @@ router.use('/users/', require('../routes/admin/users.route')); router.use('/members/', require('../routes/admin/members.route')); router.use('/groups/', require('../routes/admin/groups.route')); router.use('/servers/', require('../routes/admin/servers.route')); +router.use('/accesses', require('../routes/admin/accesses.route')) module.exports = router; \ No newline at end of file diff --git a/routes/admin/accesses.route.js b/routes/admin/accesses.route.js new file mode 100644 index 0000000..b453588 --- /dev/null +++ b/routes/admin/accesses.route.js @@ -0,0 +1,30 @@ +const express = require('express'); +groupService = require("../../services/groups.service"); +memberService = require("../../services/members.service"); +accessesService = require("../../services/accesses.service"); + +var router = express.Router(); + +router.get('/:name/add/:server', (req, res) => { + try { + accessesService.addAccess(req.params.server, req.params.name).then((result) => { + res.redirect('/admin/groups/' + req.params.name) + }); + } catch(e) { + console.log(e) + } +}) + +router.get('/:name/delete/:server', (req, res) => { + try { + accessesService.delAccess(req.params.server, req.params.name).then((result) => { + res.redirect('/admin/groups/' + req.params.name) + }); + } catch(e) { + console.log(e) + } +}) + + + +module.exports = router; \ No newline at end of file diff --git a/routes/admin/groups.route.js b/routes/admin/groups.route.js index cdc8d44..2d3cd5b 100644 --- a/routes/admin/groups.route.js +++ b/routes/admin/groups.route.js @@ -1,10 +1,13 @@ const express = require('express'); + const User = require("../../model/user.model"); const Group = require("../../model/group.model"); -groupService = require("../../services/group.service"); -memberService = require("../../services/members.service"); -var router = express.Router(); +const Server = require("../../model/server.model"); +groupService = require("../../services/groups.service"); +memberService = require("../../services/members.service"); + +var router = express.Router(); router.get("/", (req, res) => { try { @@ -52,7 +55,16 @@ router.get("/:name", async (req, res) => { delete users[user] } } - res.render('admin/group_edit', { "group": group, "inGroup": result, "outGroup": users }) + groupService.groupServerList(req.params.name).then((result2) => { + Server.findAll().then((servers) => { + for (server in servers) { + if (JSON.stringify(result2).includes(servers[server].dataValues.hostname)) { + delete servers[server] + } + } + res.render('admin/group_edit', { "group": group, "inGroup": result, "outGroup": users, "inServer": result2, "outServer": servers}); + }); + }) }); }) }); diff --git a/routes/admin/members.route.js b/routes/admin/members.route.js index 1b550ea..ae31e00 100644 --- a/routes/admin/members.route.js +++ b/routes/admin/members.route.js @@ -1,9 +1,8 @@ const express = require('express'); -const User = require("../../model/user.model"); -const Group = require("../../model/group.model"); -groupService = require("../../services/group.service"); -const Member = require("../../model/member.model"); + +groupService = require("../../services/groups.service"); memberService = require("../../services/members.service"); + var router = express.Router(); router.get('/:name/add/:user', (req, res) => { diff --git a/routes/admin/servers.route.js b/routes/admin/servers.route.js index 3c15158..a0a2ac7 100644 --- a/routes/admin/servers.route.js +++ b/routes/admin/servers.route.js @@ -1,9 +1,10 @@ const express = require('express'); -const User = require("../../model/user.model"); -const Group = require("../../model/group.model"); + const Server = require("../../model/server.model"); + memberService = require("../../services/members.service"); serverService = require("../../services/server.service"); + var router = express.Router(); diff --git a/routes/admin/users.route.js b/routes/admin/users.route.js index 0d59a1a..52d22f2 100644 --- a/routes/admin/users.route.js +++ b/routes/admin/users.route.js @@ -1,11 +1,12 @@ const express = require('express'); const User = require("../../model/user.model"); -const Group = require("../../model/group.model"); const Key = require("../../model/key.model"); -const keyService = require("../../services/keys.service"); -groupService = require("../../services/group.service"); + +keyService = require("../../services/keys.service"); +groupService = require("../../services/groups.service"); memberService = require("../../services/members.service"); userService = require("../../services/users.service"); + var router = express.Router(); diff --git a/routes/keys.route.js b/routes/keys.route.js index c04ff6a..78633ae 100644 --- a/routes/keys.route.js +++ b/routes/keys.route.js @@ -1,4 +1,5 @@ const express = require('express'); + const keyService = require("../services/keys.service"); const Key = require("../model/key.model"); diff --git a/services/accesses.service.js b/services/accesses.service.js new file mode 100644 index 0000000..2e9b865 --- /dev/null +++ b/services/accesses.service.js @@ -0,0 +1,52 @@ +const Group = require("../model/group.model"); +const Access = require("../model/access.model"); +const Server = require("../model/server.model"); + +async function addAccess(serverHostname, groupName) { + Group.findOne({ where: { name: groupName} }).then((result) => { + if (result) { + Server.findOne({ where: { hostname: serverHostname } }).then((server) => { + if (server) { + Access.findOne({ where: { groupName: result.name, serverHostname: server.hostname } }).then((access) => { + if (!access) { + Access.create({ + serverHostname: server.hostname, + groupName: result.name + }).then((access) => { + console.log('access added to database' + '(' + access.serverHostname + ',' + access.groupName + ')') + }); + } + }) + } + + }) + } + + }) +} + +async function delAccess(serverHostname, groupName) { + Group.findOne({ where: { name: groupName} }).then((result) => { + if (result) { + Server.findOne({ where: { hostname: serverHostname } }).then((server) => { + if (user) { + Access.findOne({ where: { groupName: result.name, serverHostname: server.hostname } }).then((access) => { + if (access) { + access.destroy() + .then(() => { + console.log('access deleted from database' + '(' + access.serverHostname + ',' + access.groupName + ')') + }); + } + }) + } + + }) + } + + }) +} + +module.exports = { + addAccess, + delAccess +}; \ No newline at end of file diff --git a/services/group.service.js b/services/groups.service.js similarity index 61% rename from services/group.service.js rename to services/groups.service.js index 0803d5a..b971765 100644 --- a/services/group.service.js +++ b/services/groups.service.js @@ -1,14 +1,18 @@ const Group = require('../model/group.model') const Member = require('../model/member.model') -const regexp = /^\S*$/; const User = require('../model/user.model') +const Server = require('../model/server.model') +const Access = require('../model/access.model') + +const regexp_space = /^\S*$/; + async function addGroup(name) { Group.findOne({where: { name: name}}).then((result) => { if (result) { return false; } else { - if (name && regexp.test(name)) { + if (name && regexp_space.test(name)) { Group.create({ name: name.toLowerCase(), }).then((result) => { @@ -26,7 +30,7 @@ async function addGroup(name) { async function delGroup(name) { Group.findOne({where: { name: name}}).then((result) => { - if (result && regexp.test(name)) { + if (result && regexp_space.test(name)) { result.destroy() .then(() => { console.log('group ' + result.name + ' added to database') @@ -37,6 +41,13 @@ async function delGroup(name) { }) } }); + Access.findAll({where: { groupName: name}}).then((accesses) => { + for (x in accesses) { + accesses[x].destroy().then(() => { + console.log('access ' + accesses[x].userId + ' deleted from database') + }) + } + }); }); } else { return false; @@ -51,6 +62,8 @@ async function getGroupsWithMembers() { return count } + + async function groupUserList(groupName) { User.hasMany(Member); Member.belongsTo(User); @@ -69,10 +82,35 @@ async function groupUserList(groupName) { return result }; + +async function groupServerList(groupName) { + Server.hasMany(Access); + Access.belongsTo(Server); + const servers = await Server.findAll({ include: Access }); + var result = [] + for (x in servers) { + try { + for (y in servers[x].dataValues.accesses) { + if (servers[x].dataValues.accesses[y].dataValues.groupName === groupName) { + result[x] = (servers[x].dataValues) + } + } + + } catch (error) { + }} + return result +}; + +groupServerList('group1').then( + (result) => { + console.log(result) + } +) module.exports = { addGroup, delGroup, groupUserList, - getGroupsWithMembers + getGroupsWithMembers, + groupServerList }; \ No newline at end of file diff --git a/services/keys.service.js b/services/keys.service.js index be0bdc5..34fa849 100644 --- a/services/keys.service.js +++ b/services/keys.service.js @@ -1,13 +1,13 @@ const Key = require('../model/key.model') -const regexp = /^\S*$/; +const regexp_space = /^\S*$/; async function addKey(content, name, idOwner) { Key.findOne({where: { idOwner: idOwner, name: name}}).then((result) => { if (result) { return false; } else { - if (content && name && idOwner && regexp.test(name, idOwner, content)) { + if (content && name && idOwner && regexp_space.test(name, idOwner, content)) { Key.create({ idOwner: idOwner, content: content, @@ -25,7 +25,7 @@ async function addKey(content, name, idOwner) { async function delKey(name, idOwner) { Key.findOne({where: { name: name, idOwner: idOwner}}).then((result) => { - if (result && regexp.test(name, idOwner)) { + if (result && regexp_space.test(name, idOwner)) { result.destroy() .then(() => { console.log('key for ' + result.idOwner + ' deleted from database') diff --git a/services/members.service.js b/services/members.service.js index 0c10743..7c14f47 100644 --- a/services/members.service.js +++ b/services/members.service.js @@ -2,8 +2,6 @@ const Member = require('../model/member.model') const Group = require("../model/group.model"); const User = require("../model/user.model"); -const regexp = /^\S*$/; - async function addMember(userId, groupName) { Group.findOne({ where: { name: groupName} }).then((result) => { if (result) { diff --git a/services/server.service.js b/services/server.service.js index 5ead6c3..bf8af4b 100644 --- a/services/server.service.js +++ b/services/server.service.js @@ -1,10 +1,8 @@ -const Group = require('../model/group.model') -const Member = require('../model/member.model') -const User = require('../model/user.model') const Server = require('../model/server.model') +const Access = require("../model/access.model"); const regexp_space = /^\S*$/; -const regexp_ip = /^((25[0–5]|2[0–4][0–9]|[01]?[0–9][0–9]?).(25[0–5]|2[0–4][0–9]|[01]?[0–9][0–9]?).(25[0–5]|2[0–4][0–9]|[01]?[0–9][0–9]?).(25[0–5]|2[0–4][0–9]|[01]?[0–9][0–9]?))|((([0–9A-Fa-f]{1,4}:){7}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){6}:[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){5}:([0–9A-Fa-f]{1,4}:)?[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){4}:([0–9A-Fa-f]{1,4}:){0,2}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){3}:([0–9A-Fa-f]{1,4}:){0,3}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){2}:([0–9A-Fa-f]{1,4}:){0,4}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){6}((b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b).){3}(b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b))|(([0–9A-Fa-f]{1,4}:){0,5}:((b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b).){3}(b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b))|(::([0–9A-Fa-f]{1,4}:){0,5}((b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b).){3}(b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b))|([0–9A-Fa-f]{1,4}::([0–9A-Fa-f]{1,4}:){0,5}[0–9A-Fa-f]{1,4})|(::([0–9A-Fa-f]{1,4}:){0,6}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){1,7}:))$/ +const regexp_ip = /((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$))/ async function addServer(hostname, ip, username) { Server.findOne({where: { hostname: hostname}}).then((result) => { @@ -33,6 +31,13 @@ async function delServer(hostname) { result.destroy() .then(() => { console.log('server ' + result.hostname + ' deleted from database') + Access.findAll({where: { serverHostname: hostname}}).then((accesses) => { + for (x in accesses) { + accesses[x].destroy().then(() => { + console.log('access ' + accesses[x].userId + ' deleted from database') + }) + } + }); }); } else { return false; diff --git a/services/users.service.js b/services/users.service.js index 31ca3de..9a8b64f 100644 --- a/services/users.service.js +++ b/services/users.service.js @@ -1,7 +1,6 @@ const User = require('../model/user.model') -const Key = require("../model/key.model"); -const regexp = /^\S*$/; +const regexp_space = /^\S*$/; async function userList(code) { @@ -22,7 +21,7 @@ function makeAdmin(userId) { async function delUser(id) { User.findOne({where: { id: id}}).then((result) => { - if (result && regexp.test(id)) { + if (result && regexp_space.test(id)) { result.destroy() .then(() => { console.log('user ' + id + ' deleted from database') diff --git a/views/admin/group_edit.ejs b/views/admin/group_edit.ejs index e751a30..672b354 100644 --- a/views/admin/group_edit.ejs +++ b/views/admin/group_edit.ejs @@ -3,9 +3,82 @@

Groups / <%= group.name %>

-

Group editing

+

User access

+
+
+
+
+
+
+
+
+ +
+
+ + + + + + + + + + <% outGroup.forEach(function (member) { %> + + + + + + <% }) %> + + + + +
Usernameid
<%= member.login %><%= member.id %>
+
+ +
+
+
+
+
+
+
+ + + + + + + + + + <% inGroup.forEach(function (member) { %> + + + + + + + <% }) %> + + + + +
usernameid
<%= member.login %><%= member.id %>
+
+
+
+
+
+
+
+

Server linked

-
@@ -15,27 +88,25 @@  
-
-
-
-
- +
- - + + + - <% outGroup.forEach(function (member) { %> + <% outServer.forEach(function (access) { %> - - - + + + + + <% }) %> @@ -48,32 +119,26 @@
-
-
+
-
-
-
-
-
-
+
Usernameidhostnameipuser
<%= member.login %><%= member.id %><%= access.hostname %><%= access.ip %><%= access.user %>
- - + + + - <% inGroup.forEach(function (member) { %> + <% inServer.forEach(function (access) { %> - - - + + + + <% }) %> @@ -86,7 +151,6 @@ - diff --git a/views/footer.ejs b/views/footer.ejs index ea29d4d..d25af83 100644 --- a/views/footer.ejs +++ b/views/footer.ejs @@ -9,11 +9,11 @@ \ No newline at end of file
usernameidhostnameipuser
<%= member.login %><%= member.id %><%= access.hostname %><%= access.ip %><%= access.user %>