diff --git a/CHANGELOG.md b/CHANGELOG.md
index 207d4a7..7f701eb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+## v0.09 (dev)
+* Added authentication middleware to router.
+* Added gzip compression.
+* Added PM2 to dockerfile.
+
## v0.08 (Dec 15th 2023)
* Updates to compose file and instructions from [steveiliop56](https://github.com/steveiliop56)
* Added SECRET field to compose file as a basic security measure.
diff --git a/Dockerfile b/Dockerfile
index 23c58c9..f962484 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -2,19 +2,22 @@
FROM node:21-alpine
+ENV NODE_ENV=production
WORKDIR /app
+RUN npm install pm2 -g
RUN --mount=type=bind,source=package.json,target=package.json \
--mount=type=bind,source=package-lock.json,target=package-lock.json \
--mount=type=cache,target=/root/.npm \
npm ci --omit=dev
+
USER root
COPY . .
EXPOSE 8000
-CMD node app.js
\ No newline at end of file
+CMD ["pm2-runtime", "app.js"]
diff --git a/README.md b/README.md
index 7ba807c..1f5376b 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
# DweebUI
DweebUI is a simple Docker web interface created using Javascript, Node.JS, and Express.
-Pre-Pre-Pre-Pre-Pre Alpha v0.08 ( :fire: Experimental. Don't install on any servers you care about :fire: )
+Pre-Pre-Pre-Pre-Pre Alpha v0.09 ( :fire: Experimental. Don't install on any servers you care about :fire: )
[](https://github.com/lllllllillllllillll)
[](https://github.com/lllllllillllllillll)
@@ -45,7 +45,7 @@ services:
dweebui:
container_name: dweebui
- image: lllllllillllllillll/dweebui:v0.08
+ image: lllllllillllllillll/dweebui:v0.09-dev
# build:
# context: .
environment:
@@ -97,4 +97,7 @@ sudo ./setup.sh
* Dockerode and dockerode-compose by Apocas: https://github.com/apocas/dockerode
* UI was built using HTML and CSS elements from https://tabler.io/
* Apps template based on Portainer template provided by Lissy93: https://github.com/Lissy93/portainer-templates
-* Icons from Walkxcode with some renames and additions: https://github.com/walkxcode/dashboard-icons
\ No newline at end of file
+* Icons from Walkxcode with some renames and additions: https://github.com/walkxcode/dashboard-icons
+
+
+## Supporters
\ No newline at end of file
diff --git a/app.js b/app.js
index 6635f59..bca79e3 100644
--- a/app.js
+++ b/app.js
@@ -2,6 +2,7 @@
const express = require("express");
const app = express();
const session = require("express-session");
+const compression = require('compression');
const PORT = process.env.PORT || 8000;
// Router
@@ -30,6 +31,7 @@ const sessionMiddleware = session({
// Middleware
app.set('view engine', 'ejs');
app.use([
+ compression(),
express.static("public"),
express.json(),
express.urlencoded({ extended: true }),
diff --git a/controllers/auth.js b/controllers/auth.js
index f83cca3..a1f5fb9 100644
--- a/controllers/auth.js
+++ b/controllers/auth.js
@@ -29,11 +29,13 @@ exports.processLogin = async function(req,res){
// compare the password.
let match = await bcrypt.compare(password,existingUser.password);
if(match){
+
// set the session.
req.session.user = existingUser.username;
req.session.UUID = existingUser.UUID;
req.session.role = existingUser.role;
+
// Redirect to the home page.
res.redirect("/");
}else{
@@ -118,10 +120,16 @@ exports.processRegister = async function(req,res){
avatar: ``
});
- // set the session.
- req.session.user = user.username;
- req.session.UUID = user.UUID;
- req.session.role = user.role;
+ let newUser = await User.findOne({ where: {email:email}});
+
+ let match = await bcrypt.compare(password,newUser.password);
+ if(match){
+ console.log(`User session created for ${newUser.username}`)
+ req.session.user = newUser.username;
+ req.session.UUID = newUser.UUID;
+ req.session.role = newUser.role;
+ }
+
// Redirect to the home page.
res.redirect("/");
}
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 828837c..5a47141 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -2,10 +2,11 @@ version: "3.9"
services:
dweebui:
container_name: dweebui
- image: lllllllillllllillll/dweebui:v0.08
+ image: lllllllillllllillll/dweebui:v0.09-dev
# build:
# context: .
environment:
+ NODE_ENV: production
PORT: 8000
SECRET: MrWiskers
#Proxy_Manager: enabled
diff --git a/package-lock.json b/package-lock.json
index d552b0d..77fc3b7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,6 +11,7 @@
"dependencies": {
"bcrypt": "^5.1.0",
"child_process": "^1.0.2",
+ "compression": "^1.7.4",
"dockerode": "^4.0.0",
"dockerode-compose": "^1.4.0",
"ejs": "^3.1.9",
@@ -496,6 +497,60 @@
"color-support": "bin.js"
}
},
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+ "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+ "dependencies": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.16",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/compression/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
diff --git a/package.json b/package.json
index 1e8b47f..65741c8 100644
--- a/package.json
+++ b/package.json
@@ -8,6 +8,7 @@
"dependencies": {
"bcrypt": "^5.1.0",
"child_process": "^1.0.2",
+ "compression": "^1.7.4",
"dockerode": "^4.0.0",
"dockerode-compose": "^1.4.0",
"ejs": "^3.1.9",
diff --git a/routes/index.js b/routes/index.js
index 0fac784..abd12ab 100644
--- a/routes/index.js
+++ b/routes/index.js
@@ -9,40 +9,47 @@ const { Users } = require("../controllers/users");
const { Account } = require("../controllers/account");
const { Settings } = require("../controllers/settings");
+// Authentication middleware
+const authenticate = (req, res, next) => {
+ if (req.session && req.session.user) {
+ console.log("User:", req.session.user);
+ console.log("UUID:", req.session.UUID);
+ console.log("Role:", req.session.role);
+ console.log("Page:", req.originalUrl);
+ next();
+ } else {
+ res.redirect("/login");
+ }
+};
// Dashboard
-router.get("/", Dashboard);
-router.post("/addsite", AddSite)
-router.post("/removesite", RemoveSite)
-router.get("/refreshsites", RefreshSites)
-router.post("/disablesite", DisableSite)
-router.post("/enablesite", EnableSite)
+router.get("/", authenticate, Dashboard);
+router.post("/addsite", authenticate, AddSite);
+router.post("/removesite", authenticate, RemoveSite);
+router.get("/refreshsites", authenticate, RefreshSites);
+router.post("/disablesite", authenticate, DisableSite);
+router.post("/enablesite", authenticate, EnableSite);
// Auth
-router.get("/login",Login);
-router.post("/login",processLogin);
+router.get("/login", Login);
+router.post("/login", processLogin);
router.get("/register", Register);
-router.post("/register",processRegister);
-router.get("/logout",Logout);
+router.post("/register", processRegister);
+router.get("/logout", Logout);
// Apps page
-router.get("/apps", Apps);
-router.get("/apps/:page", Apps);
-router.get("/apps/:template/:page", Apps);
-router.post("/apps", searchApps);
-
-
+router.get("/apps", authenticate, Apps);
+router.get("/apps/:page", authenticate, Apps);
+router.get("/apps/:template/:page", authenticate, Apps);
+router.post("/apps", authenticate, searchApps);
// Settings page
-router.get("/settings", Settings);
-router.get("/account", Account);
+router.get("/settings", authenticate, Settings);
+router.get("/account", authenticate, Account);
+router.post("/install", authenticate, Install);
+router.post("/uninstall", authenticate, Uninstall);
-
-router.post("/install", Install)
-router.post("/uninstall", Uninstall)
-
-router.get("/users", Users);
-
+router.get("/users", authenticate, Users);
module.exports = router;
\ No newline at end of file
diff --git a/views/partials/footer.ejs b/views/partials/footer.ejs
index 2ae8f80..8a52e05 100644
--- a/views/partials/footer.ejs
+++ b/views/partials/footer.ejs
@@ -24,7 +24,7 @@