From cf94bde3a332f60c937aa52cdd4244ee0590418b Mon Sep 17 00:00:00 2001 From: Gregory Ballantine Date: Tue, 24 May 2022 23:50:49 -0400 Subject: [PATCH] Added the start of the login page --- archon.js | 20 +++++++ package-lock.json | 94 ++++++++++++++++++++++++++++++++ package.json | 1 + routes/auth.js | 3 + src/middleware/authMiddleware.js | 15 +++++ views/auth/login.twig | 38 +++++++++++++ 6 files changed, 171 insertions(+) create mode 100644 routes/auth.js create mode 100644 src/middleware/authMiddleware.js create mode 100644 views/auth/login.twig diff --git a/archon.js b/archon.js index c51116b..879f2c4 100644 --- a/archon.js +++ b/archon.js @@ -1,18 +1,38 @@ const express = require('express'); +const session = require('express-session'); + const app = express(); const port = 3000; +// Start creating our session config +var sess = { + secret: 'dark archon', // will need to change this later + cookie: {} +} +if (app.get('env') === 'production') { + app.set('trust proxy', 1) // trust first proxy + sess.cookie.secure = true // serve secure cookies +} +// Enable the Express.js session handling +app.use(session(sess)) + // Initialize the Twig template engine - this might get swapped for Twing later. app.set('view engine', 'twig'); // Service static files from public/ app.use(express.static('public')); +// Load middleware +authMiddleware = require('./src/middleware/authMiddleware'); +app.use('/', authMiddleware.authProtected); + // Load in route handlers indexRoutes = require('./routes/index'); +authRoutes = require('./routes/auth'); // Assign routes to handlers app.get('/', indexRoutes.home); +app.get('/auth/login', authRoutes.getLogin); app.listen(port, () => { console.log(`Example app listening on port ${port}`) diff --git a/package-lock.json b/package-lock.json index c33c598..ae1a145 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "BSD-2-Clause", "dependencies": { "express": "^4.18.1", + "express-session": "^1.17.3", "grunt-dart-sass": "^2.0.1", "twig": "^1.15.4" }, @@ -506,6 +507,32 @@ "node": ">= 0.10.0" } }, + "node_modules/express-session": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", + "dependencies": { + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -1622,6 +1649,14 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1785,6 +1820,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -2123,6 +2166,17 @@ "node": ">= 0.6" } }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -2647,6 +2701,28 @@ "vary": "~1.1.2" } }, + "express-session": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", + "requires": { + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "dependencies": { + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -3502,6 +3578,11 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3623,6 +3704,11 @@ "side-channel": "^1.0.4" } }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -3879,6 +3965,14 @@ "mime-types": "~2.1.24" } }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" + } + }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", diff --git a/package.json b/package.json index e733713..207c15a 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "license": "BSD-2-Clause", "dependencies": { "express": "^4.18.1", + "express-session": "^1.17.3", "grunt-dart-sass": "^2.0.1", "twig": "^1.15.4" }, diff --git a/routes/auth.js b/routes/auth.js new file mode 100644 index 0000000..7368080 --- /dev/null +++ b/routes/auth.js @@ -0,0 +1,3 @@ +exports.getLogin = (req, res, next) => { + res.render('auth/login'); +}; diff --git a/src/middleware/authMiddleware.js b/src/middleware/authMiddleware.js new file mode 100644 index 0000000..f292e79 --- /dev/null +++ b/src/middleware/authMiddleware.js @@ -0,0 +1,15 @@ +exports.authProtected = (req, res, next) => { + + // Extra check to make sure this isn't performed on the login page + doNotProtect = ['/auth/login']; + if (doNotProtect.includes(req.path)) { + return next(); + } + + if (!('ldap_bind_dn' in req.session)) { + return res.redirect('/auth/login'); + } else { + return next(); + } + +}; diff --git a/views/auth/login.twig b/views/auth/login.twig new file mode 100644 index 0000000..b8ec88c --- /dev/null +++ b/views/auth/login.twig @@ -0,0 +1,38 @@ +{% extends 'layout.twig' %} + +{% block content %} + + +
+
+
+ +
+ +
+ + + +
+ +
+
+ +
+
+
+
+{% endblock %}