// node main.js
const fs = require("fs");
const crypto = require('crypto');
const express = require('express');
const escape = require('escape-html')
var favicon = require('serve-favicon');
const app = express();
app.use(favicon('favicon.ico'));
app.set('view engine', 'ejs');
app.use(express.static('public'));
app.get('/login', async (req, res) => {
try {
const { username, password,ㅤ} = req.query;
// We changed all those passwords after Mr. Martin left the company
const validUsers = [
'admin:W7tgTzWTFBDedWf+OhrrqfLgYAh7blYh0RuhakKLKqQ=',
'alice:K9gGyX8OAK8aH8Myj6djqSaXI8jbj6xPk69x2xhtbpA=',
'bob:WsOfjLfA9phADg4FnzcUrtKOXc4hByHUsBpX02PvrSM=',ㅤ
];
const hash = crypto.createHash('sha256').update(password).digest('base64');
const check = username + ":" + hash;
var login = "";
validUsers.forEach(validPair => {
if (check == validPair) {
login = validPair.split(":")[0];
}
});
if (login == "") {
res.status(403);
res.render("pages/feedback", {
type: "warning",
msg: "Authentication failed.",
});
return res.end();
}
if (login == "admin") {
var flag = fs.readFileSync("flag.txt");
res.status(200);
res.render("pages/feedback", {
type: "success",
msg: "Welcome back admin! " + flag,
});
return res.end();
}
res.status(200);
res.render("pages/feedback", {
type: "success",
msg: "Welcome back " + login + "!",
});
return res.end();
} catch (e) {
return res.redirect("/");
}
});
app.get('/source', async (req, res) => {
const source = fs.readFileSync(__filename);
res.render("pages/source", {
source: escape(source),
});
return res.end();
});
app.get('/', async (req, res) => {
res.render("pages/index");
return res.end();
});
app.use(function(req, res, next) {
res.status(404);
res.render("pages/feedback", {
type: "warning",
msg: "This page does not exist.",
});
res.end();
return next();
});
app.listen(8000);