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 %}
+Login
+