1
0
mirror of synced 2025-10-28 18:19:17 +00:00
This commit is contained in:
Valentin
2023-09-14 18:50:39 +02:00
parent 4d04f849dd
commit 05b4752183
10 changed files with 81 additions and 29 deletions

View File

@@ -27,6 +27,10 @@ User.init({
type: DataTypes.STRING, type: DataTypes.STRING,
required: true, required: true,
}, },
serverUsername : {
type: DataTypes.STRING,
required: true,
}
}, { }, {
sequelize, sequelize,
modelName: 'user' modelName: 'user'

View File

@@ -51,7 +51,10 @@ router.get("/", (req, res) => {
router.post("/add", (req, res) => { router.post("/add", (req, res) => {
try { try {
if (req.body.server_hostname && req.body.server_ip && req.body.server_username) { if (req.body.server_hostname && req.body.server_ip && req.body.server_multi && req.body.server_username) {
if (req.body.server_multi === 'true') {
req.body.server_username = "accessGateMultiuser"
}
serverService.addServer(req.body.server_hostname, req.body.server_ip, req.body.server_username).then((secret) => { serverService.addServer(req.body.server_hostname, req.body.server_ip, req.body.server_username).then((secret) => {
res.redirect(url.format({ res.redirect(url.format({
pathname:'/admin/servers', pathname:'/admin/servers',
@@ -60,7 +63,6 @@ router.post("/add", (req, res) => {
"alert": "secretDisplay" "alert": "secretDisplay"
} }
})); }));
}) })
} else { } else {
res.redirect(url.format({ res.redirect(url.format({

View File

@@ -22,6 +22,7 @@ router.get("/",async (req, res) => {
}) })
router.get("/delete/:userId", (req, res) => { router.get("/delete/:userId", (req, res) => {
try { try {
if (req.params.userId != req.session.user.id) { if (req.params.userId != req.session.user.id) {

View File

@@ -21,7 +21,7 @@ router.get("/callback", async (req, res) => {
req.session.admin = user.admin; req.session.admin = user.admin;
res.redirect("/"); res.redirect("/");
} else { } else {
res.send("An error occured"); res.send("An error occurred");
} }
} catch (e) { } catch (e) {
console.log(e) console.log(e)

View File

@@ -35,6 +35,25 @@ router.get("/:server", async (req, res) => {
} }
}); });
router.get("/update/:server", async (req, res) => {
try {
Server.findOne({ where: { hostname: req.params.server } }).then((server) => {
if (server) {
if (bcrypt.compareSync(req.body.secret, server.secret)) {
res.send(getServerUsers(req.params.server))
})
} else {
res.send("invalid request")
}
} else {
res.send("invalid request")
}
})
} catch (e) {
console.log(e)
}
});
module.exports = router; module.exports = router;

View File

@@ -32,19 +32,19 @@ async function syncUser(user) {
console.log('user ' + user.login + ' updated in database') console.log('user ' + user.login + ' updated in database')
}); });
} else { } else {
User.findAll().then((users) => {
User.create({ User.create({
id: user.id, id: user.id,
login: user.login, login: user.login,
avatar: user.avatar_url, avatar: user.avatar_url,
displayName: user.name displayName: user.name,
admin: (users.length === 1),
serverUsername: false,
}).then(() => { }).then(() => {
User.findAll().then((users) => {
if (users.length === 1) {
userService.makeAdmin(user.login)
}
})
console.log('user ' + user.login + ' added to database') console.log('user ' + user.login + ' added to database')
}); })
})
} }
}); });
} }

View File

@@ -84,6 +84,12 @@ async function getServerKeys(server) {
return result return result
} }
async function getServerUsers(server) {
const dump = await sequelize.query('SELECT DISTINCT serverUsername FROM servers JOIN users on users.id = members.userId JOIN accesses on accesses.serverHostname = servers.hostname JOIN members on members.groupName = accesses.groupName WHERE serverHostname = \'' + server + '\'', {});
return dump[0]
}
async function getServerListForUserId(userId) { async function getServerListForUserId(userId) {
const dump = await sequelize.query('SELECT hostname, username, ip, lastPull FROM servers JOIN accesses ON servers.hostname = accesses.serverHostname JOIN members ON members.groupName = accesses.groupName WHERE userId = \'' + userId + '\'', {}); const dump = await sequelize.query('SELECT hostname, username, ip, lastPull FROM servers JOIN accesses ON servers.hostname = accesses.serverHostname JOIN members ON members.groupName = accesses.groupName WHERE userId = \'' + userId + '\'', {});
result = {} result = {}
@@ -105,6 +111,7 @@ async function getServerListForUserId(userId) {
module.exports = { module.exports = {
getServerUsers,
addServer, addServer,
delServer, delServer,
getServerKeys, getServerKeys,

View File

@@ -2,7 +2,7 @@
<div class="container-fluid"> <div class="container-fluid">
<h3 class="text-dark mb-4"><a style="text-decoration: none" href="/admin/groups">Servers</a> / new </h3> <h3 class="text-dark mb-4"><a style="text-decoration: none" href="/admin/groups">Servers</a> / new </h3>
<div class="card shadow mb-5"> <div class="card shadow">
<div class="card-header py-3"> <div class="card-header py-3">
<p class="text-primary m-0 fw-bold">Server editing</p> <p class="text-primary m-0 fw-bold">Server editing</p>
</div> </div>
@@ -15,12 +15,32 @@
<div class="mb-3"><button class="btn btn-primary btn-sm" type="submit">Create server</button></div> <div class="mb-3"><button class="btn btn-primary btn-sm" type="submit">Create server</button></div>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"><label class="form-label"><strong>User</strong></label><input class="form-control" placeholder="root" type="text" name="server_username"></div> <div class="mb-3">
<label class="form-label"><strong>User configuration</strong></label>
<div class="form-check">
<input class="form-check-input" type="radio" value="true" name="server_multi" id="server_user_false" checked>
<label class="form-check-label" for="server_user_false">
Per user key
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" value="false" name="server_multi" id="server_user_true">
<label class="form-check-label" for="server_user_true">
Only one user key
</label>
</div>
<div id="inputOther" style="display: none">
<div class="mb-3"><label class="form-label"><strong>User</strong></label><input class="form-control" value="root" type="text" name="server_username"></div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
</div> </div>
<%- include('../footer'); %> <%- include('../footer'); %>

View File

@@ -30,6 +30,7 @@
<th>username</th> <th>username</th>
<th>id</th> <th>id</th>
<th>admin</th> <th>admin</th>
<th>server user</th>
<th>updated</th> <th>updated</th>
<th></th> <th></th>
</tr> </tr>
@@ -40,7 +41,8 @@
<td><img class="rounded-circle me-2" width="30" height="30" src="<%= user.avatar %>"><%= user.login %></td> <td><img class="rounded-circle me-2" width="30" height="30" src="<%= user.avatar %>"><%= user.login %></td>
<td><%= user.id %></td> <td><%= user.id %></td>
<td><%= user.admin %></td> <td><%= user.admin %></td>
<td><%= user.updatedAt %></td> <td><%= user.serverUsername %></td>
<td><%= new Date(user.updatedAt).toLocaleString() %></td>
<td style="text-align: right;"><a class="btn btn-sm btn-primary" href="/admin/users/<%= user.id %>"><i class="fas fa-key"></i></a> <a class="btn btn-sm btn-danger" href="/admin/users/delete/<%= user.id %>"><i class="far fa-trash-alt"></i></a></td> <td style="text-align: right;"><a class="btn btn-sm btn-primary" href="/admin/users/<%= user.id %>"><i class="fas fa-key"></i></a> <a class="btn btn-sm btn-danger" href="/admin/users/delete/<%= user.id %>"><i class="far fa-trash-alt"></i></a></td>
</tr> </tr>

View File

@@ -29,19 +29,16 @@
} }
function resizeTextArea(textarea) { $( "#server_user_false" ).on( "click", function() {
const { style, value } = textarea; document.getElementById("inputOther").style.display = "none";
style.height = style.minHeight = 'auto'; } );
style.minHeight = `${ Math.min(textarea.scrollHeight + 4, parseInt(textarea.style.maxHeight)) }px`; $( "#server_user_true" ).on( "click", function() {
style.height = `${ textarea.scrollHeight + 4 }px`; document.getElementById("inputOther").style.display = "";
} );
function fieldShow(value) {
console.log(value)
} }
const textarea = document.getElementById('textarea');
textarea.addEventListener('input', () => {
resizeTextArea(textarea);
});
</script> </script>
</body> </body>
</html> </html>