From aa528722e199c7556f9d3d4b6d360e411039973b Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Wed, 14 Aug 2024 19:02:11 -0700 Subject: [PATCH 1/3] Updated parameters passed to for certificate check --- Server/controllers/monitorController.js | 3 ++- Server/middleware/handleErrors.js | 1 - Server/middleware/verifyOwnership.js | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Server/controllers/monitorController.js b/Server/controllers/monitorController.js index 28c33caeb..ac4e92da7 100644 --- a/Server/controllers/monitorController.js +++ b/Server/controllers/monitorController.js @@ -77,7 +77,8 @@ const getMonitorCertificate = async (req, res, next) => { } try { - const monitor = await req.db.getMonitorById(req, res); + const { monitorId } = req.params; + const monitor = await req.db.getMonitorById(monitorId); const monitorUrl = new URL(monitor.url); const certificate = await sslChecker(monitorUrl.hostname); if (certificate && certificate.validTo) { diff --git a/Server/middleware/handleErrors.js b/Server/middleware/handleErrors.js index 106100f41..1e1e955c5 100644 --- a/Server/middleware/handleErrors.js +++ b/Server/middleware/handleErrors.js @@ -2,7 +2,6 @@ const logger = require("../utils/logger"); const { errorMessages } = require("../utils/messages"); const handleErrors = (error, req, res, next) => { - console.log(error); const status = error.status || 500; const message = error.message || errorMessages.FRIENDLY_ERROR; const service = error.service || errorMessages.UNKNOWN_SERVICE; diff --git a/Server/middleware/verifyOwnership.js b/Server/middleware/verifyOwnership.js index 766e5545b..419115227 100644 --- a/Server/middleware/verifyOwnership.js +++ b/Server/middleware/verifyOwnership.js @@ -31,7 +31,6 @@ const verifyOwnership = (Model, paramName) => { // If the userID does not match the document's userID, return a 403 error if (userId.toString() !== doc.userId.toString()) { - console.log(userId.toString(), doc.userId.toString()); const error = new Error(errorMessages.VERIFY_OWNER_UNAUTHORIZED); error.status = 403; throw error; From 18e764fdc937a6feb91164fbdcc22aec8121ef37 Mon Sep 17 00:00:00 2001 From: Alexander Holliday Date: Thu, 15 Aug 2024 11:14:43 -0700 Subject: [PATCH 2/3] Revert "Added sorting ability by status" --- Client/package-lock.json | 8 ++-- Client/src/Pages/Monitors/index.jsx | 33 +++------------- Server/package-lock.json | 61 ++++++++++------------------- Server/package.json | 1 + 4 files changed, 31 insertions(+), 72 deletions(-) diff --git a/Client/package-lock.json b/Client/package-lock.json index 89a508703..44e276f63 100644 --- a/Client/package-lock.json +++ b/Client/package-lock.json @@ -2655,12 +2655,12 @@ } }, "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } diff --git a/Client/src/Pages/Monitors/index.jsx b/Client/src/Pages/Monitors/index.jsx index 11eeb0fb8..f8efd7fa3 100644 --- a/Client/src/Pages/Monitors/index.jsx +++ b/Client/src/Pages/Monitors/index.jsx @@ -9,7 +9,6 @@ import { useNavigate } from "react-router-dom"; import Button from "../../Components/Button"; import ServerStatus from "../../Components/Charts/Servers/ServerStatus"; import { useTheme } from "@emotion/react"; -import ArrowUpwardRoundedIcon from "@mui/icons-material/ArrowUpwardRounded"; import ArrowDownwardRoundedIcon from "@mui/icons-material/ArrowDownwardRounded"; import OpenInNewPage from "../../assets/icons/open-in-new-page.svg?react"; import Settings from "../../assets/icons/settings-bold.svg?react"; @@ -153,38 +152,17 @@ const Monitors = () => { const down = monitorState.monitors.length - up; - // State variable for sorting -> default of 1 for ascending - const [sortOrder, setSortOrder] = useState(1); - // State variable for updating sorting of default monitors - const [sortedMonitors, setSortedMonitors] = useState(monitorState.monitors); - // Bool for sorting arrow - const [isSorted, setIsSorted] = useState(false); - - - // Function to handle sorting on click of status text - const handleSort = () => { - setSortOrder(prevOrder => prevOrder * -1); - - // Sort existing monitors with start of ascending order - const monitors = [...monitorState.monitors].sort(a => { - return a.status ? -1 * sortOrder : 1 * sortOrder; - }); - - // Update state of monitors - setSortedMonitors(monitors); - // Trigger arrow visibility and direction - setIsSorted(true); - }; - const data = { cols: [ { id: 1, name: "Host" }, { id: 2, name: ( - + Status - {isSorted ? {sortOrder === -1 ? : } : null} + + + ), }, @@ -195,8 +173,7 @@ const Monitors = () => { rows: [], }; - // Render out sorted monitors/default monitors - data.rows = sortedMonitors.map((monitor, idx) => { + data.rows = monitorState.monitors.map((monitor, idx) => { const params = { url: monitor.url, title: monitor.name, diff --git a/Server/package-lock.json b/Server/package-lock.json index 88acafb10..d2ad88cff 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -9,8 +9,8 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@sendgrid/mail": "^7.7.0", - "axios": "^1.3.1", + "@sendgrid/mail": "^8.1.3", + "axios": "^1.7.2", "bcrypt": "^5.1.1", "bullmq": "5.7.15", "cors": "^2.8.5", @@ -773,50 +773,38 @@ } }, "node_modules/@sendgrid/client": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-7.7.0.tgz", - "integrity": "sha512-SxH+y8jeAQSnDavrTD0uGDXYIIkFylCo+eDofVmZLQ0f862nnqbC3Vd1ej6b7Le7lboyzQF6F7Fodv02rYspuA==", - "license": "MIT", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-8.1.3.tgz", + "integrity": "sha512-mRwTticRZIdUTsnyzvlK6dMu3jni9ci9J+dW/6fMMFpGRAJdCJlivFVYQvqk8kRS3RnFzS7sf6BSmhLl1ldDhA==", "dependencies": { - "@sendgrid/helpers": "^7.7.0", - "axios": "^0.26.0" + "@sendgrid/helpers": "^8.0.0", + "axios": "^1.6.8" }, "engines": { - "node": "6.* || 8.* || >=10.*" - } - }, - "node_modules/@sendgrid/client/node_modules/axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.8" + "node": ">=12.*" } }, "node_modules/@sendgrid/helpers": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-7.7.0.tgz", - "integrity": "sha512-3AsAxfN3GDBcXoZ/y1mzAAbKzTtUZ5+ZrHOmWQ279AuaFXUNCh9bPnRpN504bgveTqoW+11IzPg3I0WVgDINpw==", - "license": "MIT", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-8.0.0.tgz", + "integrity": "sha512-Ze7WuW2Xzy5GT5WRx+yEv89fsg/pgy3T1E3FS0QEx0/VvRmigMZ5qyVGhJz4SxomegDkzXv/i0aFPpHKN8qdAA==", "dependencies": { "deepmerge": "^4.2.2" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 12.0.0" } }, "node_modules/@sendgrid/mail": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-7.7.0.tgz", - "integrity": "sha512-5+nApPE9wINBvHSUxwOxkkQqM/IAAaBYoP9hw7WwgDNQPxraruVqHizeTitVtKGiqWCKm2mnjh4XGN3fvFLqaw==", - "license": "MIT", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-8.1.3.tgz", + "integrity": "sha512-Wg5iKSUOER83/cfY6rbPa+o3ChnYzWwv1OcsR8gCV8SKi+sUPIMroildimlnb72DBkQxcbylxng1W7f0RIX7MQ==", "dependencies": { - "@sendgrid/client": "^7.7.0", - "@sendgrid/helpers": "^7.7.0" + "@sendgrid/client": "^8.1.3", + "@sendgrid/helpers": "^8.0.0" }, "engines": { - "node": "6.* || 8.* || >=10.*" + "node": ">=12.*" } }, "node_modules/@sideway/address": { @@ -993,15 +981,14 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -1380,7 +1367,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1725,7 +1711,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1750,7 +1735,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -2086,7 +2070,6 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -2126,7 +2109,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -4634,8 +4616,7 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/pstree.remy": { "version": "1.1.8", diff --git a/Server/package.json b/Server/package.json index eb31dd480..6c383ce73 100644 --- a/Server/package.json +++ b/Server/package.json @@ -11,6 +11,7 @@ "author": "", "license": "ISC", "dependencies": { + "@sendgrid/mail": "^8.1.3", "axios": "^1.7.2", "bcrypt": "^5.1.1", "bullmq": "5.7.15", From ae46527965925944799595eea53d11c83199f2ec Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Thu, 15 Aug 2024 11:39:45 -0700 Subject: [PATCH 3/3] removed double login prevention --- Client/src/Components/Sidebar/index.jsx | 26 ++++--------------------- Client/src/Pages/Monitors/index.jsx | 24 +++++++++++++++++------ Server/controllers/authController.js | 22 --------------------- Server/middleware/verifyJWT.js | 24 ++++------------------- Server/models/user.js | 3 --- Server/routes/authRoute.js | 1 - Server/utils/messages.js | 1 - 7 files changed, 26 insertions(+), 75 deletions(-) diff --git a/Client/src/Components/Sidebar/index.jsx b/Client/src/Components/Sidebar/index.jsx index 5a5b1d980..33ccdafc9 100644 --- a/Client/src/Components/Sidebar/index.jsx +++ b/Client/src/Components/Sidebar/index.jsx @@ -78,28 +78,10 @@ function Sidebar() { * */ const logout = async () => { - try { - // Make request to BE to remove JWT from user - await axiosInstance.post( - "/auth/logout", - { email: authState.user.email }, - { - headers: { - Authorization: `Bearer ${authState.authToken}`, - "Content-Type": "application/json", - }, - } - ); - - // Clear auth state - dispatch(clearAuthState()); - dispatch(clearUptimeMonitorState()); - navigate("/login"); - } catch (error) { - createToast({ - body: error.message, - }); - } + // Clear auth state + dispatch(clearAuthState()); + dispatch(clearUptimeMonitorState()); + navigate("/login"); }; /** diff --git a/Client/src/Pages/Monitors/index.jsx b/Client/src/Pages/Monitors/index.jsx index 11eeb0fb8..590d5dca0 100644 --- a/Client/src/Pages/Monitors/index.jsx +++ b/Client/src/Pages/Monitors/index.jsx @@ -160,13 +160,12 @@ const Monitors = () => { // Bool for sorting arrow const [isSorted, setIsSorted] = useState(false); - // Function to handle sorting on click of status text const handleSort = () => { - setSortOrder(prevOrder => prevOrder * -1); - + setSortOrder((prevOrder) => prevOrder * -1); + // Sort existing monitors with start of ascending order - const monitors = [...monitorState.monitors].sort(a => { + const monitors = [...monitorState.monitors].sort((a) => { return a.status ? -1 * sortOrder : 1 * sortOrder; }); @@ -182,9 +181,21 @@ const Monitors = () => { { id: 2, name: ( - + Status - {isSorted ? {sortOrder === -1 ? : } : null} + {isSorted ? ( + + {sortOrder === -1 ? ( + + ) : ( + + )} + + ) : null} ), }, @@ -195,6 +206,7 @@ const Monitors = () => { rows: [], }; + console.log(monitorState.monitors); // Render out sorted monitors/default monitors data.rows = sortedMonitors.map((monitor, idx) => { const params = { diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index d4a77fe4d..93c83c6b8 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -136,10 +136,6 @@ const loginController = async (req, res, next) => { throw new Error(errorMessages.AUTH_INCORRECT_PASSWORD); } - if (user.authToken) { - throw new Error(errorMessages.AUTH_ALREADY_LOGGED_IN); - } - // Remove password from user object. Should this be abstracted to DB layer? const userWithoutPassword = { ...user._doc }; delete userWithoutPassword.password; @@ -164,23 +160,6 @@ const loginController = async (req, res, next) => { } }; -const logoutController = async (req, res, next) => { - try { - // Get user - const { email } = req.body; - const userToLogout = await req.db.getUserByEmail(email); - userToLogout.authToken = null; - await userToLogout.save(); - - return res - .status(200) - .json({ success: true, msg: successMessages.AUTH_LOGOUT_USER }); - } catch (error) { - error.service = SERVICE_NAME; - next(error); - } -}; - const userEditController = async (req, res, next) => { try { await editUserParamValidation.validateAsync(req.params); @@ -524,7 +503,6 @@ const getAllUsersController = async (req, res) => { module.exports = { registerController, loginController, - logoutController, userEditController, inviteController, inviteVerifyController, diff --git a/Server/middleware/verifyJWT.js b/Server/middleware/verifyJWT.js index cfbf4b46c..1c4231959 100644 --- a/Server/middleware/verifyJWT.js +++ b/Server/middleware/verifyJWT.js @@ -34,27 +34,11 @@ const verifyJWT = (req, res, next) => { const parsedToken = token.slice(TOKEN_PREFIX.length, token.length); // Verify the token's authenticity - jwt.verify(parsedToken, process.env.JWT_SECRET, async (err, decoded) => { + jwt.verify(parsedToken, process.env.JWT_SECRET, (err, decoded) => { if (err) { - try { - const userId = jwt.decode(parsedToken)._id; - await req.db.logoutUser(userId); - logger.error(errorMessages.INVALID_AUTH_TOKEN, { - service: SERVICE_NAME, - }); - return res - .status(401) - .json({ success: false, msg: errorMessages.INVALID_AUTH_TOKEN }); - } catch (error) { - logger.error(errorMessages.UNKNOWN_ERROR, { - service: SERVICE_NAME, - error: error, - }); - error.status = 401; - error.service = SERVICE_NAME; - next(error); - return; - } + return res + .status(401) + .json({ success: false, msg: errorMessages.INVALID_AUTH_TOKEN }); } //Add the user to the request object for use in the route req.user = decoded; diff --git a/Server/models/user.js b/Server/models/user.js index dee89b5f7..977cabc15 100644 --- a/Server/models/user.js +++ b/Server/models/user.js @@ -40,9 +40,6 @@ const UserSchema = mongoose.Schema( default: "user", enum: ["user", "admin"], }, - authToken: { - type: String, - }, }, { timestamps: true, diff --git a/Server/routes/authRoute.js b/Server/routes/authRoute.js index 224b4501f..201807121 100644 --- a/Server/routes/authRoute.js +++ b/Server/routes/authRoute.js @@ -24,7 +24,6 @@ const { //Auth routes router.post("/register", upload.single("profileImage"), registerController); router.post("/login", loginController); -router.post("/logout", logoutController); router.put( "/user/:userId", upload.single("profileImage"), diff --git a/Server/utils/messages.js b/Server/utils/messages.js index 92f568605..55f0fa7e9 100644 --- a/Server/utils/messages.js +++ b/Server/utils/messages.js @@ -7,7 +7,6 @@ const errorMessages = { UNAUTHORIZED: "Unauthorized access", AUTH_ADMIN_EXISTS: "Admin already exists", AUTH_INVITE_NOT_FOUND: "Invite not found", - AUTH_ALREADY_LOGGED_IN: "User already logged in", //Error handling middleware UNKNOWN_SERVICE: "Unknown service",