dynamic user for authorized keys and bug fix

pull/1/head
Valentin 2023-09-13 15:46:40 +02:00
parent 7b0a757fc7
commit 092ab264bc
10 changed files with 55 additions and 14 deletions

View File

@ -12,16 +12,13 @@ serverService = require("./services/server.service");
const User = require('./model/user.model') const User = require('./model/user.model')
const Key = require('./model/key.model') const Key = require('./model/key.model')
const Member = require("./model/member.model"); const Member = require("./model/member.model");
const {makeAdmin} = require("./services/users.service");
const app = express(); const app = express();
databaseService.sync().then(() => { databaseService.sync().then(() => {
console.log("Database ready"); console.log("Database ready");
}) })
app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json // parse application/json
@ -78,7 +75,7 @@ app.get("/login", (req, res) => {
res.render('login') res.render('login')
}); });
userService.makeAdmin("itsmrval")
app.use('/admin/', require('./routes/admin.route')); app.use('/admin/', require('./routes/admin.route'));
app.use('/auth/', require('./routes/auth.route')); app.use('/auth/', require('./routes/auth.route'));

View File

@ -20,7 +20,9 @@ router.get("/", (req, res) => {
if (server.hostname === req.query.server) { if (server.hostname === req.query.server) {
secret_display.content = server.tmp secret_display.content = server.tmp
secret_display.url = process.env.APP_URL secret_display.url = process.env.APP_URL
secret_display.name = server.hostname secret_display.name = server.hostname,
secret_display.user = server.username
} }
}) })
} }

View File

@ -19,6 +19,9 @@ router.get("/:server", async (req, res) => {
raw += '# ' + x + '\n' + result[x] + '\n\n' raw += '# ' + x + '\n' + result[x] + '\n\n'
} }
res.send(raw) res.send(raw)
server.lastPull =
server.save()
}) })
} else { } else {
res.send("invalid request") res.send("invalid request")

View File

@ -1,5 +1,6 @@
const {default: axios} = require("axios"); const {default: axios} = require("axios");
const User = require('../model/user.model') const User = require('../model/user.model')
const userService = require("./users.service");
async function getToken(code) { async function getToken(code) {
var client_id = process.env.GITHUB_CLIENT_ID var client_id = process.env.GITHUB_CLIENT_ID
@ -37,6 +38,11 @@ async function syncUser(user) {
avatar: user.avatar_url, avatar: user.avatar_url,
displayName: user.name displayName: user.name
}).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

@ -27,8 +27,6 @@ async function addGroup(name) {
}); });
} }
async function delGroup(name) { async function delGroup(name) {
Group.findOne({where: { name: name}}).then((result) => { Group.findOne({where: { name: name}}).then((result) => {
if (result && regexp_space.test(name)) { if (result && regexp_space.test(name)) {

View File

@ -17,7 +17,7 @@
⚠️ The installation command <b>will not be shown again later.</b> ⚠️ ⚠️ The installation command <b>will not be shown again later.</b> ⚠️
</div> </div>
<div class="alert alert-success" role="alert"> <div class="alert alert-success" role="alert">
Run the command below to login the server <br><code>bash <( curl -s https://raw.githubusercontent.com/itsmrval/accessgate/scripts/agent.sh ) '<%= locals.secret.url %>' <%= locals.secret.name %> <%= locals.secret.content %> </code> Run the command below to login the server <br><code>bash <( curl -s https://raw.githubusercontent.com/itsmrval/accessgate/scripts/agent.sh ) '<%= locals.secret.url %>' <%= locals.secret.name %> <%= locals.secret.content %> <%= locals.secret.user %> </code>
</div> </div>
<% } %> <% } %>
@ -54,7 +54,7 @@
<td><%= server.ip %></td> <td><%= server.ip %></td>
<td><%= server.username %></td> <td><%= server.username %></td>
<td><%= server.lastPull %> <% if (!server.lastPull) { %>never<% } %></td> <td><%= server.lastPull.toISOString().replace(/T/, ' ').replace(/\..+/, '') %> <% if (!server.lastPull) { %>never<% } %></td>
<td style="text-align: right;"> <a class="btn btn-sm btn-danger" href="/admin/servers/delete/<%= server.hostname %>"><i class="far fa-trash-alt"></i></a></td> <td style="text-align: right;"> <a class="btn btn-sm btn-danger" href="/admin/servers/delete/<%= server.hostname %>"><i class="far fa-trash-alt"></i></a></td>
</tr> </tr>
<% }) %> <% }) %>

View File

@ -26,9 +26,7 @@
<% keys.forEach(function (key) { %> <% keys.forEach(function (key) { %>
<tr> <tr>
<td><%= key.name %></td> <td><%= key.name %></td>
<td><%= key.content %></td> <td><%= key.content %></td>
<td style="text-align: right;"><a class="btn btn-sm btn-danger" href="/admin/users/<%= user.id %>/deleteKey/<%= key.name %>"><i class="far fa-trash-alt"></i></button></td> <td style="text-align: right;"><a class="btn btn-sm btn-danger" href="/admin/users/<%= user.id %>/deleteKey/<%= key.name %>"><i class="far fa-trash-alt"></i></button></td>
</tr> </tr>
<% }) %> <% }) %>
@ -45,6 +43,26 @@
<div class="mb-3"><button class="btn btn-primary btn-sm" type="submit">Add key</button></div> <div class="mb-3"><button class="btn btn-primary btn-sm" type="submit">Add key</button></div>
</form> </form>
</div> </div>
</div>
</div>
</div>
<div class="card shadow col-md-6">
<div class="card-header py-3">
<p class="text-primary m-0 fw-bold">Other</p>
</div>
<div class="card-body">
<div class="row">
<form method="POST" action="/admin/users/<%= user.id %>/updateRole/">
<div class="mb-3">
<input type="checkbox" id="admin" name="admin" <% if (user.admin) {%> checked <% }%> />
<label for="scales">Admin permissions</label>
</div>
<div class="mb-3"></div>
<div class="mb-3"><button class="btn btn-primary btn-sm" type="submit">Save</button></div>
</form>
</div> </div>
</div> </div>
</div> </div>

View File

@ -28,6 +28,20 @@
} }
} }
function resizeTextArea(textarea) {
const { style, value } = textarea;
style.height = style.minHeight = 'auto';
style.minHeight = `${ Math.min(textarea.scrollHeight + 4, parseInt(textarea.style.maxHeight)) }px`;
style.height = `${ textarea.scrollHeight + 4 }px`;
}
const textarea = document.getElementById('textarea');
textarea.addEventListener('input', () => {
resizeTextArea(textarea);
});
</script> </script>
</body> </body>
</html> </html>

View File

@ -63,7 +63,10 @@
<div class="col me-2"> <div class="col me-2">
<h6 class="mb-0 text-primary"><strong><%= x %></strong></h6><span class="text-xs"><i class="fas fa-clock"> </i> <b>Last pull:</b> <%= servers[x].lastPull %></span> <h6 class="mb-0 text-primary"><strong><%= x %></strong></h6><span class="text-xs"><i class="fas fa-clock"> </i> <b>Last pull:</b> <%= servers[x].lastPull %></span>
</div> </div>
<div class="col-auto"><code><%= servers[x].username %>@<%= servers[x].ip %></code></div> <div class="col"><code><%= servers[x].username %>@<%= servers[x].ip %></code></div>
<div class="col-auto"><a href="ssh://<%= servers[x].username %>@<%= servers[x].ip %>" class="btn btn-sm btn-primary"><i class="fas fa-terminal"></i> Connect</a></div>
</div> </div>
</li> </li>
<% } %> <% } %>

View File

@ -27,7 +27,7 @@
<tr> <tr>
<td><%= key.name %></td> <td><%= key.name %></td>
<td><%= key.content %></td> <td><textarea class="form-control" rows="1" disabled><%= key.content %></textarea></td>
<td style="text-align: right;"><a class="btn btn-sm btn-danger" href="/keys/delete/<%= key.name %>"><i class="far fa-trash-alt"></i></button></td> <td style="text-align: right;"><a class="btn btn-sm btn-danger" href="/keys/delete/<%= key.name %>"><i class="far fa-trash-alt"></i></button></td>
</tr> </tr>