const crypto = require("crypto"); const redis = require("../Miscellaneous/redis"); const Game = require("../Game/Game"); const HTTP_BAD_REQUEST = "403"; function badRequest(res) { res.cork(() => res.isAborted ? null : res .writeStatus(HTTP_BAD_REQUEST) .end()); }; module.exports = async function (res, req, context) { const cookieHeader = req.getHeader("cookie"); const cookie = cookieHeader.split("ps=")[1]; res.onAborted(() => { res.isAborted = true; console.info("ABORTED!!!"); }); if (!cookie) { console.info("upgrade 1") return badRequest(res); }; const secWebSocketKey = req.getHeader("sec-websocket-key"); const secWebSocketProtocol = req.getHeader("sec-websocket-protocol"); const secWebSocketExtensions = req.getHeader("sec-websocket-extensions"); const userAgent = req.getHeader("user-agent"); const ip = req.getHeader("x-forwarded-for"); const formattedCookie = cookie.split(".")[0].slice(4); const cookieInDB = await redis.get(`sess:${formattedCookie}`); if (!cookieInDB) { console.info("upgrade 2") return badRequest(res); }; const parsedCookie = JSON.parse(cookieInDB); if (!parsedCookie.accountID) { console.info("upgrade 3") return badRequest(res); }; const hash = crypto.createHash("md5") .update(userAgent) .update(ip) .digest("hex"); // if (hash !== parsedCookie.fingerprint) return badRequest(res); const { accountID, username, isAdmin } = parsedCookie; console.info("Before upgrading connection for", username); res.cork(() => res.upgrade({ accountID, username, cookie, isAdmin }, secWebSocketKey, secWebSocketProtocol, secWebSocketExtensions, context)); };