1
0
Fork 0
auth.rxbn.de/bin/web/routes/static.js

177 lines
4.0 KiB
JavaScript
Raw Normal View History

2019-06-18 22:44:35 +00:00
/*
* This file is part of the authRXBN single sign-on package.
*
* (c) Ruben Meyer <contact@rxbn.de>
*/
express = require('express');
route = express.Router();
asyncer = require('express-async-handler');
2019-06-18 22:44:35 +00:00
fs = require('fs');
path = require('path');
2019-09-12 21:44:31 +00:00
2020-08-14 21:40:19 +00:00
var cfg = require(global['__dirname']+'/bin/config');
let getRoutes = async () => {
let db = global['requireModule']('database');
await db.connect();
/**
* main page
* @url /
* @method all
*/
route.all('/', asyncer(async (req, res, next) => {
// TODO: show login page or dashboard
// res.end('login or dashboard');
apps = await db.getApps();
2019-11-23 23:37:01 +00:00
res.render('index', {
session: req.session,
2020-08-14 21:40:19 +00:00
apps: apps.reply,
cfg: cfg
2019-11-23 23:37:01 +00:00
});
}));
/**
* login page or apprequest page
* @url /
* @method GET
*/
route.get('/authenticate', asyncer(async (req, res) => {
if(req.session) {
// if there isnt an apprequest
if(!req.session.appRequest)
req.session.appRequest = {}; // TODO: data
}
// query apps
apps = await db.getApps();
2019-09-12 21:44:31 +00:00
2019-11-30 23:56:33 +00:00
// set appId in appRequest
if(req.query.appId) {
if(req.query.appId && typeof req.query.appId == "string") {
// req.query.appId
// verify appId (if in rep)
req.session.appRequest.appId = req.query.appId;
2019-09-12 21:44:31 +00:00
// TODO: on accept, setAuthCode and redirect with token
// on cancel, redirect to dashboard
}
}
2019-09-12 21:44:31 +00:00
2019-11-30 23:56:33 +00:00
// if user is logged in, show request page
if(req.session && req.session.user) {
res.render('request', {
session: req.session,
appRequest: req.session.appRequest,
2020-08-14 21:40:19 +00:00
apps: apps.reply,
cfg: cfg
});
2019-11-30 23:56:33 +00:00
// if user isnt logged in, show login page
} else {
2020-02-29 20:17:51 +00:00
if(!req.query.appId) req.session.appRequest = {};
let view_obj = { session: req.session };
if(req.query.appId) {
apps.reply.forEach((app) => {
2020-02-29 20:17:51 +00:00
if(app._id == req.query.appId)
view_obj["login_title"] = "Login to use "+app.name+" via authRxbn"; // appRequest app name
})
}
res.render('login', view_obj);
}
}));
2019-09-12 21:44:31 +00:00
/**
* all other routes
* @url /*
* @method all
* @TODO comments
*/
2020-08-14 21:40:19 +00:00
route.all('/*', asyncer(async (req, res, next) => {
// passthrough to next route
if(req.path.startsWith('/api'))
return next();
2019-06-18 22:44:35 +00:00
if(req.path == "/request") return res.render('error/404');
2019-09-12 21:44:31 +00:00
let pathRules = require("./rules");
2019-09-12 21:44:31 +00:00
let group = "anon";
if(req.session && req.session.user) {
group = "user";
if(req.session.user.group == 999) group = "admin";
}
2019-09-12 21:44:31 +00:00
pathRules.forEach((rule) => {
if(rule.rule == "block") {
if(group == rule.group) {
let regex = new RegExp(rule.expression, "g");
if(regex.test(req.path)) {
if(rule.type == "404") {
global['logs'].info("[web] (404) path not found: "+req.path);
return res.status(404).render('error/404', {
error_code: 404,
error_msg: 'msg.request.file.not_found',
2020-08-14 21:40:19 +00:00
session: req.session,
cfg: cfg
});
} else if(rule.type == "missing_permission") {
return res.status(401).render('error/permission', {
error_code: 401,
2020-08-14 21:40:19 +00:00
session: req.session,
cfg: cfg
});
} else if(rule.type == "login") {
return res.status(401).render('error/login', {
error_code: 401,
2020-08-14 21:40:19 +00:00
session: req.session,
cfg: cfg
});
} else {
return res.status(401).render('error/error', {
error_code: 401,
2020-08-14 21:40:19 +00:00
session: req.session,
cfg: cfg
});
}
2019-09-12 21:44:31 +00:00
}
}
}
});
2020-08-14 21:40:19 +00:00
2020-08-31 07:35:18 +00:00
let dir = global['__dirname'] + '/bin/web/views';
let path_j = path.join(dir, req.path.toLowerCase());
if(fs.existsSync(path_j+'.pug')) {
return res.render(req.path.replace(/^\//, ''), {
session: req.session,
2020-08-14 21:40:19 +00:00
apps: apps.reply,
cfg: cfg
});
} else {
global['logs'].info("[web] (404) path not found: "+req.path);
return res.status(404).render('error/404', {
error_code: 404,
error_msg: 'msg.request.file.not_found',
2020-08-14 21:40:19 +00:00
session: req.session,
cfg: cfg
});
2019-09-12 21:44:31 +00:00
}
// TODO: try to login
// TODO: role-based authorization
// TODO: show login page or page
2020-08-14 21:40:19 +00:00
}));
2019-09-12 21:44:31 +00:00
return route;
};
2019-06-18 22:44:35 +00:00
module.exports = {
getRoutes: getRoutes
};