From 49a7313abb93b04de3fc360c809c0e303389d17c Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Mon, 9 Sep 2024 23:27:28 -0400 Subject: [PATCH] - Checkpoint Signed-off-by: Dave Richer --- certs/cert.pem | 20 ++++ certs/key.pem | 28 ++++++ client/.env.development.imex | 2 +- client/.env.development.promanager | 2 +- client/.env.development.rome | 2 +- client/cypress.config.js | 2 +- client/src/pages/dms/dms.container.jsx | 2 +- .../pages/manage/manage.page.component.jsx | 2 +- client/src/utils/CleanAxios.js | 2 +- client/vite.config.js | 6 +- server.js | 92 ++++++++++--------- 11 files changed, 108 insertions(+), 52 deletions(-) create mode 100644 certs/cert.pem create mode 100644 certs/key.pem diff --git a/certs/cert.pem b/certs/cert.pem new file mode 100644 index 000000000..b8c5d7d74 --- /dev/null +++ b/certs/cert.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDWzCCAkOgAwIBAgIUD/QBSAXy/AlJ/cS4DaPWJLpChxgwDQYJKoZIhvcNAQEL +BQAwPTELMAkGA1UEBhMCQ0ExCzAJBgNVBAgMAk9OMSEwHwYDVQQKDBhJbnRlcm5l +dCBXaWRnaXRzIFB0eSBMdGQwHhcNMjQwOTA5MTU0MjA1WhcNMjUwOTA5MTU0MjA1 +WjA9MQswCQYDVQQGEwJDQTELMAkGA1UECAwCT04xITAfBgNVBAoMGEludGVybmV0 +IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKSd0l7NJCNBwvtPU+dVPQkteg0AfC3sGqRnZMQteCRVa2oIgC4NoF3A9BK/yHbF +ZF25OnXTck5vzc8yb3v73ndfTD9ASKNoiaZE84/GFBsxqlKR8cs0qVwzuAsdijMv +vlMPNlMRyE1Rb7nR6HXGkPXNyxgMko03NXPkvIje9zRudm0Lf8L4q/hPyPkS7Mrm +/uQfAAJe+xFcupkEX2XY7r0x1C+z6E8lA1UcuhK3SHdW7CWYqp1vU5/dnnUiXwCa +GiC6Y1bCJB0pDAVISzy3JUDdINZdiqGR+y8ho3pstChf2mp/76s3N9eG9KA/qaFK +BrGk2PvCoZ8/Aj1aMsRYFHECAwEAAaNTMFEwHQYDVR0OBBYEFDLJ2fbWP4VUJgOp +PSs+NGHcVgRmMB8GA1UdIwQYMBaAFDLJ2fbWP4VUJgOpPSs+NGHcVgRmMA8GA1Ud +EwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBABfv5ut/y03atq0NMB0jeDY4 +AvW4ukk0k1svyqxFZCw9o7m2lHb/IjmVrZG1Sj4JWrrSv0s02ccb26/t6vazNa5L +Powe3eyfHgfjTZJmgs8hyeMwKS0wWk/SPuu9JDhIJakiquqD+UVBGkHpP+XYvhDv +vhS2XRlW+aEjpUmr1oCyyrc6WbzrYRNadqEsn/AxwcMyUbht3Ugjkg+OpidcTIQp +5lv63waKo6I1vQofzBQ3L7JYsKo8kC0vAP7wkLxvzBii335uZJzzpFYFVOyVNezi +dJdazPbRYbXz4LjltdEn/SNfRuKX8ZRiN2OSo7OfSrZaMTS87SfCSFJGgQM8Yrk= +-----END CERTIFICATE----- diff --git a/certs/key.pem b/certs/key.pem new file mode 100644 index 000000000..04aa05d66 --- /dev/null +++ b/certs/key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCkndJezSQjQcL7 +T1PnVT0JLXoNAHwt7BqkZ2TELXgkVWtqCIAuDaBdwPQSv8h2xWRduTp103JOb83P +Mm97+953X0w/QEijaImmRPOPxhQbMapSkfHLNKlcM7gLHYozL75TDzZTEchNUW+5 +0eh1xpD1zcsYDJKNNzVz5LyI3vc0bnZtC3/C+Kv4T8j5EuzK5v7kHwACXvsRXLqZ +BF9l2O69MdQvs+hPJQNVHLoSt0h3VuwlmKqdb1Of3Z51Il8AmhogumNWwiQdKQwF +SEs8tyVA3SDWXYqhkfsvIaN6bLQoX9pqf++rNzfXhvSgP6mhSgaxpNj7wqGfPwI9 +WjLEWBRxAgMBAAECggEAUNpHYlLFxh9dokujPUMreF+Cy/IKDBAkQc2au5RNpyLh +YDIOqw/8TTAhcTgLQPLQygvZP9f8E7RsVLFD+pSJ/v2qmIJ9au1Edor1Sg+S/oxV +SLrwFMunx2aLpcH7iAqSI3+cQg7A3+D4zD7iOz6tIl3Su9wo+v073tFhHKTOrEwv +Qgr9Jf3viIiKV1ym+uQEVQndocfsj46FnFpXTQ2qs7kAF6FgAOLDGfQQwzkiqEBD +NsqsDmbYIx6foZL+DEz1ZVO2M5B+xxpbNK82KwuQilVpimW8ui4LZHCe+RIFzt9+ +BK6KGlLpSEwTFliivI3nahy18JzskZsfyah0CPZlQQKBgQDVv+A0qIPGvOP3Sx+9 +HyeQCV23SkvvSvw8p8pMB0gvwv63YdJ7N/rJzBGS6YUHFWWZZgEeTgkJ6VJvoe0r +8JL1el9uSUa7f0eayjmFBOGuzpktNVdIn2Tg7A9MWA4JqPNNC69RMOh86ewGD4J3 +a8Hz2a1bHxAmy/AZt2ukypY6eQKBgQDFJ7kqeOPkRBz9WbALRgVIXo8YWf5di0sQ +r0HC03GAISHQ725A2IFBPHJWeqj0jaMiIZD0y+Obgp7KAskrJaLfsd7Ug775kFfw +oUI9UAl6kRuPKvm3BaVAm46SQm+56VsgxTi73YN0NUp75THHZgAJjepF9zSpVJxq +VY9DjEGruQKBgQCQCpGIatcCol/tUg69X7VFd0pULhkl1J5OMbQ9r9qRdRI5eg5h +QsQaIQ7mtb8TmvOwf/DY/zVQHI+U8sXlCmW+TwzoQTENQSR7xzMj1LpRFqBaustr +AR72A537kItFLzll/i3SxOam5uxK2UDOQSuerF4KPdCglGXkrpo3nt3F4QKBgQCa +RArPAOjQo7tLQfJN3+wiRFsTYtd1uphx5bA/EdOtvj8HjVFnzADXWsTchf3N3UXY +XwtdgGwIMpys1KEz8a8P+c2x26SDAj7NOmDqOMYx8Xju/WGHpBM6Cn30U6e4gK+d +ZLSPyzQgqdIuP5hDvbwpvbGiLVw3Ys1BJtGCuSxpgQJ/eHnRiuSi5Zq5jGg+GpA+ +FEEc9NCy772rR+4uzEOqyIwqewffqzSuVWuIsY/8MP3fh+NDxl/mU6cB5QVeD54Z +JZUKwmpM26muiM6WvVnM4ExPdSGA2+l4pZjby/KKd6F/w0tgZ1jb9Pb2/0vN3qVA +Y4U4XNTMt2fxUACqiL4SHA== +-----END PRIVATE KEY----- diff --git a/client/.env.development.imex b/client/.env.development.imex index 2f2d96aaf..de1bbecf3 100644 --- a/client/.env.development.imex +++ b/client/.env.development.imex @@ -8,7 +8,7 @@ VITE_APP_CLOUDINARY_API_KEY=957865933348715 VITE_APP_CLOUDINARY_THUMB_TRANSFORMATIONS=c_fill,h_250,w_250 VITE_APP_FIREBASE_PUBLIC_VAPID_KEY='BG3tzU7L2BXlGZ_3VLK4PNaRceoEXEnmHfxcVbRMF5o5g05ejslhVPki9kBM9cBBT-08Ad9kN3HSpS6JmrWD6h4' VITE_APP_STRIPE_PUBLIC_KEY=pk_test_51GqB4TJl3nQjrZ0wCQWAxAhlNF8jKe0tipIa6ExBaxwJGitwvFsIZUEua4dUzaMIAuXp4qwYHXx7lgjyQSwP0Pe900vzm38C7g -VITE_APP_AXIOS_BASE_API_URL=http://localhost:4000 +VITE_APP_AXIOS_BASE_API_URL=https://localhost:4000 VITE_APP_REPORTS_SERVER_URL=https://reports3.test.imex.online VITE_APP_SPLIT_API=ts615lqgnmk84thn72uk18uu5pgce6e0l4rc VITE_APP_INSTANCE=IMEX diff --git a/client/.env.development.promanager b/client/.env.development.promanager index d870802cc..6935a24b3 100644 --- a/client/.env.development.promanager +++ b/client/.env.development.promanager @@ -8,7 +8,7 @@ VITE_APP_CLOUDINARY_API_KEY=957865933348715 VITE_APP_CLOUDINARY_THUMB_TRANSFORMATIONS=c_fill,h_250,w_250 VITE_APP_FIREBASE_PUBLIC_VAPID_KEY='BG3tzU7L2BXlGZ_3VLK4PNaRceoEXEnmHfxcVbRMF5o5g05ejslhVPki9kBM9cBBT-08Ad9kN3HSpS6JmrWD6h4' VITE_APP_STRIPE_PUBLIC_KEY=pk_test_51GqB4TJl3nQjrZ0wCQWAxAhlNF8jKe0tipIa6ExBaxwJGitwvFsIZUEua4dUzaMIAuXp4qwYHXx7lgjyQSwP0Pe900vzm38C7g -VITE_APP_AXIOS_BASE_API_URL=http://localhost:4000 +VITE_APP_AXIOS_BASE_API_URL=https://localhost:4000 VITE_APP_REPORTS_SERVER_URL=https://reports3.test.imex.online VITE_APP_SPLIT_API=ts615lqgnmk84thn72uk18uu5pgce6e0l4rc VITE_APP_INSTANCE=PROMANAGER diff --git a/client/.env.development.rome b/client/.env.development.rome index c68088a98..f05224847 100644 --- a/client/.env.development.rome +++ b/client/.env.development.rome @@ -9,7 +9,7 @@ VITE_APP_CLOUDINARY_API_KEY=957865933348715 VITE_APP_CLOUDINARY_THUMB_TRANSFORMATIONS=c_fill,h_250,w_250 VITE_APP_FIREBASE_PUBLIC_VAPID_KEY='BP1B7ZTYpn-KMt6nOxlld6aS8Skt3Q7ZLEqP0hAvGHxG4UojPYiXZ6kPlzZkUC5jH-EcWXomTLtmadAIxurfcHo' VITE_APP_STRIPE_PUBLIC_KEY=pk_test_51GqB4TJl3nQjrZ0wCQWAxAhlNF8jKe0tipIa6ExBaxwJGitwvFsIZUEua4dUzaMIAuXp4qwYHXx7lgjyQSwP0Pe900vzm38C7g -VITE_APP_AXIOS_BASE_API_URL=http://localhost:4000 +VITE_APP_AXIOS_BASE_API_URL=https://localhost:4000 VITE_APP_REPORTS_SERVER_URL=https://reports3.test.imex.online VITE_APP_SPLIT_API=ts615lqgnmk84thn72uk18uu5pgce6e0l4rc VITE_APP_COUNTRY=USA diff --git a/client/cypress.config.js b/client/cypress.config.js index 1f2d28ce6..b000b5aac 100644 --- a/client/cypress.config.js +++ b/client/cypress.config.js @@ -12,6 +12,6 @@ module.exports = defineConfig({ setupNodeEvents(on, config) { return require("./cypress/plugins/index.js")(on, config); }, - baseUrl: "http://localhost:3000" + baseUrl: "https://localhost:3000" } }); diff --git a/client/src/pages/dms/dms.container.jsx b/client/src/pages/dms/dms.container.jsx index 504089fd8..29acbf084 100644 --- a/client/src/pages/dms/dms.container.jsx +++ b/client/src/pages/dms/dms.container.jsx @@ -34,7 +34,7 @@ const mapDispatchToProps = (dispatch) => ({ export default connect(mapStateToProps, mapDispatchToProps)(DmsContainer); export const socket = SocketIO( - import.meta.env.PROD ? import.meta.env.VITE_APP_AXIOS_BASE_API_URL : "http://localhost:4000", // for dev testing, + import.meta.env.PROD ? import.meta.env.VITE_APP_AXIOS_BASE_API_URL : "https://localhost:4000", // for dev testing, { path: "/ws", withCredentials: true, diff --git a/client/src/pages/manage/manage.page.component.jsx b/client/src/pages/manage/manage.page.component.jsx index af0cbb720..d2f4c65d0 100644 --- a/client/src/pages/manage/manage.page.component.jsx +++ b/client/src/pages/manage/manage.page.component.jsx @@ -115,7 +115,7 @@ export function Manage({ conflict, bodyshop }) { useEffect(() => { if (bodyshop && bodyshop.id) { - const endpoint = import.meta.env.PROD ? import.meta.env.VITE_APP_AXIOS_BASE_API_URL : "http://localhost:3000"; // Use Vite proxy in development + const endpoint = import.meta.env.PROD ? import.meta.env.VITE_APP_AXIOS_BASE_API_URL : "https://localhost:3000"; // Use Vite proxy in development const socketInstance = SocketIO(endpoint, { path: "/ws", // Ensure this matches the Vite proxy and backend path diff --git a/client/src/utils/CleanAxios.js b/client/src/utils/CleanAxios.js index 9ba93772d..7d4d47c74 100644 --- a/client/src/utils/CleanAxios.js +++ b/client/src/utils/CleanAxios.js @@ -4,7 +4,7 @@ import InstanceRenderManager from "./instanceRenderMgr"; axios.defaults.baseURL = import.meta.env.VITE_APP_AXIOS_BASE_API_URL || - (import.meta.env.MODE === "production" ? "https://api.imex.online/" : "http://localhost:4000/"); + (import.meta.env.MODE === "production" ? "https://api.imex.online/" : "https://localhost:4000/"); export const axiosAuthInterceptorId = axios.interceptors.request.use( async (config) => { diff --git a/client/vite.config.js b/client/vite.config.js index 7e4351383..f50d678ab 100644 --- a/client/vite.config.js +++ b/client/vite.config.js @@ -110,11 +110,15 @@ export default defineConfig({ proxy: { // Proxy for WebSocket server "/ws": { - target: "http://localhost:4000", + target: "https://localhost:4000", changeOrigin: true, secure: false, ws: true } + }, + https: { + key: await fsPromises.readFile("../certs/key.pem"), + cert: await fsPromises.readFile("../certs/cert.pem") } }, build: { diff --git a/server.js b/server.js index 2fdc9a75b..fe141093e 100644 --- a/server.js +++ b/server.js @@ -5,6 +5,8 @@ const path = require("path"); const compression = require("compression"); const cookieParser = require("cookie-parser"); const http = require("http"); +const https = require("https"); +const fs = require("fs"); const { Server } = require("socket.io"); const { createClient } = require("redis"); const { createAdapter } = require("@socket.io/redis-adapter"); @@ -24,28 +26,27 @@ require("dotenv").config({ * @type {string[][]} */ const SOCKETIO_CORS_ORIGIN = [ - [ - "https://test.imex.online", - "https://www.test.imex.online", - "http://localhost:3000", - "https://imex.online", - "https://www.imex.online", - "https://romeonline.io", - "https://www.romeonline.io", - "https://beta.test.romeonline.io", - "https://www.beta.test.romeonline.io", - "https://beta.romeonline.io", - "https://www.beta.romeonline.io", - "https://beta.test.imex.online", - "https://www.beta.test.imex.online", - "https://beta.imex.online", - "https://www.beta.imex.online", - "https://www.test.promanager.web-est.com", - "https://test.promanager.web-est.com", - "https://www.promanager.web-est.com", - "https://www.promanager.web-est.com", - "http://localhost:3000" - ] + "https://test.imex.online", + "https://www.test.imex.online", + "http://localhost:3000", + "https://imex.online", + "https://www.imex.online", + "https://romeonline.io", + "https://www.romeonline.io", + "https://beta.test.romeonline.io", + "https://www.beta.test.romeonline.io", + "https://beta.romeonline.io", + "https://www.beta.romeonline.io", + "https://beta.test.imex.online", + "https://www.beta.test.imex.online", + "https://beta.imex.online", + "https://www.beta.imex.online", + "https://www.test.promanager.web-est.com", + "https://test.promanager.web-est.com", + "https://www.promanager.web-est.com", + "https://www.promanager.web-est.com", + "http://localhost:3000", + "https://localhost:3000" ]; /** @@ -101,35 +102,49 @@ const applyRoutes = (app) => { * @returns {Promise} */ const main = async () => { - // Express app and server setup const app = express(); const port = process.env.PORT || 5000; - const server = http.createServer(app); + + let server; + + if (process.env.NODE_ENV === "development") { + console.log("Setting up HTTPS for Development"); + // In development, run HTTPS server + const sslKeyPath = path.resolve(__dirname, "./certs/key.pem"); + const sslCertPath = path.resolve(__dirname, "./certs/cert.pem"); + + const httpsOptions = { + key: fs.readFileSync(sslKeyPath), + cert: fs.readFileSync(sslCertPath) + }; + + server = https.createServer(httpsOptions, app); + logger.log(`[${process.env.NODE_ENV}] HTTPS Server will run on port ${port}`, "INFO", "api"); + } else { + // In production or default, use HTTP + server = http.createServer(app); + logger.log(`[${process.env.NODE_ENV}] HTTP Server will run on port ${port}`, "INFO", "api"); + } // Redis client setup for Pub/Sub and Key-Value Store const pubClient = createClient({ url: process.env.REDIS_URL || "redis://localhost:6379" }); const subClient = pubClient.duplicate(); - // Add Error listeners to Redis clients pubClient.on("error", (err) => logger.log(`Redis pubClient error: ${err}`, "ERROR", "redis")); subClient.on("error", (err) => logger.log(`Redis subClient error: ${err}`, "ERROR", "redis")); - // Connect Redis clients try { - console.log("Establishing Redis Connection..."); await Promise.all([pubClient.connect(), subClient.connect()]); + logger.log("Connected to Redis", "INFO", "redis"); } catch (redisError) { - logger.log(`Failed to connect to Redis`, "ERROR", "redis", redisError); + logger.log("Failed to connect to Redis", "ERROR", "redis", redisError); } - // Clean up on exit process.on("SIGINT", async () => { await Promise.all([pubClient.disconnect(), subClient.disconnect()]); process.exit(0); }); - // Redis Pub/Sub adapter for Socket.IO - // Export io and Redis client for external use exports.io = new Server(server, { path: "/ws", adapter: createAdapter(pubClient, subClient), @@ -141,31 +156,20 @@ const main = async () => { } }); - // Export Redis client for external use exports.redisClient = pubClient; - // Include the Socket IO references require("./server/web-sockets/web-socket"); - // Middleware applyMiddleware(app); - - // Route groupings applyRoutes(app); try { await server.listen(port); - logger.log(`[${process.env.NODE_ENV || "DEVELOPMENT"}] Server started on port ${port}`, "INFO", "api"); + logger.log(`[${process.env.NODE_ENV}] Server started on port ${port}`, "INFO", "api"); } catch (error) { - logger.log( - `[${process.env.NODE_ENV || "DEVELOPMENT"}] Server failed to start on port ${port}`, - "ERROR", - "api", - error - ); + logger.log(`[${process.env.NODE_ENV}] Server failed to start on port ${port}`, "ERROR", "api", error); } }; // Start server -// noinspection JSIgnoredPromiseFromCall main();