From 85e32b757f49497630e0884975dfb05efc4822c6 Mon Sep 17 00:00:00 2001 From: Pedro Cardona <pedropca@stud.ntnu.no> Date: Tue, 28 Nov 2023 13:34:45 +0100 Subject: [PATCH 1/4] Change country endpoint was added --- controllers/user.controller.js | 22 ++++++++++++++++++++++ routes/user.router.js | 22 ++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/controllers/user.controller.js b/controllers/user.controller.js index 27d0548..9d2ef61 100644 --- a/controllers/user.controller.js +++ b/controllers/user.controller.js @@ -335,6 +335,27 @@ async function getUsersByPartialName(partialName) { } } +async function changeCountry(country, token) { + let client; + try { + client = await connectToDatabase(); + const db = client.db("TrioTech"); + const userCollection = db.collection("users"); + const id = await getUserId(token); + if (!id) throw new Error("Invalid user data"); + const user = await userCollection.findOne({ _id: new ObjectId(id) }); + if (!user) throw new Error("User not found"); + await userCollection.updateOne({ _id: new ObjectId(id) }, { $set: { country: country } }); + return true; + } catch (error) { + throw error; + } finally { + if (client) { + await client.close(); + } + } +} + module.exports = { createUser, getUser, @@ -345,4 +366,5 @@ module.exports = { changeAvatar, getActiveUser, getUsersByPartialName, + changeCountry, }; diff --git a/routes/user.router.js b/routes/user.router.js index 2eea741..5c3333b 100644 --- a/routes/user.router.js +++ b/routes/user.router.js @@ -411,4 +411,26 @@ router.get("/getUsers/:name", async (req, res) => { } }); +router.put("/changeCountry", async (req, res) => { + try { + if (await routersUtils.validateToken(res, req.cookies.jwt)) return; + if(!req.body.country) { + logger.warn("No country provided to change user country"); + return res.status(400).send("No country provided"); + } + logger.info("User id was requested successfully."); + res.status(200).send(await usersController.changeCountry(req.body.country, req.cookies.jwt)); + } catch (err) { + logger.error("User id was requested but failed with error: " + err); + let code = 500; + if (err.message == "Invalid user data") { + code = 400; + } + if (err.message == "User not found") { + code = 404; + } + res.status(code).send(err); + } +}); + module.exports = router; -- GitLab From d2b8f25a334ccd5eef38c7969821720e57ec3aaa Mon Sep 17 00:00:00 2001 From: Magnus Lutro Allison <magnulal@stud.ntnu.no> Date: Thu, 30 Nov 2023 10:22:57 +0100 Subject: [PATCH 2/4] Added metmask user check to endpoints --- controllers/authentication.controller.js | 2 +- controllers/metamask.controller.js | 8 +++++++- controllers/user.controller.js | 2 -- images/1701260292099-1e1c2f41.png | Bin 0 -> 30435 bytes images/1701266730269-539f81d1.png | Bin 0 -> 23427 bytes images/1701335380805-bf0dce56.png | Bin 0 -> 2859 bytes routes/authority.router.js | 2 ++ routes/twoFactor.router.js | 3 +++ routes/user.router.js | 9 +++++++-- utils/routersUtils.js | 22 +++++++++++++++++++++- 10 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 images/1701260292099-1e1c2f41.png create mode 100644 images/1701266730269-539f81d1.png create mode 100644 images/1701335380805-bf0dce56.png diff --git a/controllers/authentication.controller.js b/controllers/authentication.controller.js index 978d727..40bbc5a 100644 --- a/controllers/authentication.controller.js +++ b/controllers/authentication.controller.js @@ -194,7 +194,7 @@ async function generateJWT(fingerprint, token_header) { { $set: { last_active: new Date() } }, ); user.last_active = new Date(); - const generateJWT = await jwt.sign(user, JWT_SECRET, { expiresIn: "1h" }); + const generateJWT = await jwt.sign(user, JWT_SECRET, { expiresIn: "1h" }); //TODO: make util method return generateJWT; } catch (error) { throw error; diff --git a/controllers/metamask.controller.js b/controllers/metamask.controller.js index e6f7fa9..3383a88 100644 --- a/controllers/metamask.controller.js +++ b/controllers/metamask.controller.js @@ -34,8 +34,14 @@ async function metamaskOneTimeLogin(requestBody) { "timestamp": requestBody.timestamp, "avatar_url": "/images/MetaMask_fox.svg", "last_active": requestBody.timestamp, - "style": "linear-gradient(60deg, #70FFA6 0%, #70D6FF 100%)" + "style": "linear-gradient(60deg, #70FFA6 0%, #70D6FF 100%)", + "metamask": true, } + + //TODO: +//IMPLEMENT CHECKPOINT FOR verifying that the user is a metamask user (the flag seen in localstorage) + + return { jwt_token: jwt.sign({ tempUser }, JWT_SECRET, { expiresIn: "1h" }), user: tempUser, diff --git a/controllers/user.controller.js b/controllers/user.controller.js index 594a5e5..15fdba7 100644 --- a/controllers/user.controller.js +++ b/controllers/user.controller.js @@ -212,8 +212,6 @@ async function changeStyle(style, token) { async function getUserId(token) { if (!token) throw new Error("Invalid token: Token is missing."); const decodedToken = await decryptToken(token); - console.log("Decoded token: "); - console.log(decodedToken); const userId = decodedToken.user?._id ?? decodedToken._id; return userId; } diff --git a/images/1701260292099-1e1c2f41.png b/images/1701260292099-1e1c2f41.png new file mode 100644 index 0000000000000000000000000000000000000000..27d36488c9aad481783d989cd3afad6b9dd6396d GIT binary patch literal 30435 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 literal 0 HcmV?d00001 diff --git a/images/1701266730269-539f81d1.png b/images/1701266730269-539f81d1.png new file mode 100644 index 0000000000000000000000000000000000000000..e09968d1e15a7d5342bb6e034948f46ed32757b5 GIT binary patch literal 23427 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 Kvh<;8(Ek9Zf(n)Z literal 0 HcmV?d00001 diff --git a/images/1701335380805-bf0dce56.png b/images/1701335380805-bf0dce56.png new file mode 100644 index 0000000000000000000000000000000000000000..147f498d0015a6c16c8ab3d0a2f2b15b9edfa8ae GIT binary patch literal 2859 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&zE~)R&4Yzkn25lDE4H!+#K5uy^@n1_rJN zo-U3d6?5L+Io~z6T=w|K_cLdj%!-i7^yXE%(Zn5Cc(GMPM<c3=eJ}IDRDq9tA~9XD zRjhg};&G1Mt|bqTDJ;DjqOro$;K(0C<CikxjH)VARW8p=_q(_L`l}CTD&_1p&ocjP zZM^!k__f!J3_;tb$uTg<*fTOPI07Bl#KOS9!pXqEA;iESpu)hQ;K9J)FoA)gL19$E z5DbShP~_U|y1M51ZvB5x7T&8ii2nT9{{M%0*}%9qyO4G5^O=|X?XOf{-@NPnEM;P% zJ!<a$4RQLmObitz=jZ*q?YuYNcJ<Dp-#@F@{R}_AuwkLz{eN$g?`tzKB&40I{j|Qg z?Dwxr#(llO6g2bav*P{p^yk#3zmz=g#=wx%FugqeT#o+UM+euvIsfP3txMV!AxsPj z%r&oP&U`*Es_JO--ePBl9Hn|TjsZ`b3+66mXDB$b?qBk=aQof=e}(Te{Cp|<`2Kcb zM_>TI<g=Tzv-I!3*T1We?{5`8EQpkeo)|MQ`0tt<Y<#}<-@n)MZ`uCSog)GA=AMuL z&U|}S_`a^}S@!+<57Y0}-bw#={@=le^ACO$W?+zhaBJ>T@efNrN)i(-lxNplkyQ)~ z>eo;2_SUzso8R}>rKff`gUy<&XZF<Py%atE{MDH^y0(ubESb>Cf}a8k3}?=~tI1Eh z)?ad7`u+JoPoG_UW0?g^U}?|Z-M3vM_p<Nn85x<A(-uGHpkD#=R>zj%hR*u)`f1sG z)8-vitTmWF+x+>|rRf`hC7I2n_2=_h4+uZ#|D4JwKu>28U9@i5{DpzRZ=H8FFgk92 z<C_-u;Rmp2=HD`Jru_cxU%2|Zh{~;$CyU`_LPqJoLsfgfa3mDZnK|3r|3UJHhdJlp zTJHVABL)iagw1#67<>CO*s=8u_Not*T|ZomtNk~<I4isUrKI%BwchK`ZnfU+eZE21 zo8bWGx2t#WpMANuUf(uZ`R~8^>p2*H*vl{ur^*~$CLfrbmu>p_%eTAN|L-y`-tcD5 zOkm+#@Z{Xwc|Q+wm&gBqv3KU_>eKIL76NmRXB{&GgZrCH_s;n1->a=Ht-q-GUzLI3 zLC0I!GckL%e(9>lDBXz8uLRplp!D@%@!r~}w~Mp3)~`t4^JV7tXTrD5`S(6;j@CbO zR65?~OL5=nUTc4STSh+<Mh5j8x2Nwfev!VX;+y~G-&dwO+dseiI)2vun7XeQ&NKS8 sUH!@Z`s*cShK9#afmO`VX{^1l-`C%+nj^dd*rEi+iL0N>I;Vst03S$jg#Z8m literal 0 HcmV?d00001 diff --git a/routes/authority.router.js b/routes/authority.router.js index dd51368..9346136 100644 --- a/routes/authority.router.js +++ b/routes/authority.router.js @@ -9,6 +9,7 @@ router.get("/get", async (req, res) => { if (await routersUtils.validateToken(res, req.cookies.jwt)) { return; } + if(await routersUtils.isMetamaskUser(res, req.cookies.jwt)) return; const authority = await authorityController.getAuthority(req.cookies.jwt); if (!authority) { logger.warn("The authority was requested but not found"); @@ -30,6 +31,7 @@ router.put("/setAdmin", async (req, res) => { if (await routersUtils.validateAuthority(res, req.cookies.jwt)) { return; } + if(await routersUtils.isMetamaskUser(res, req.cookies.jwt)) return; if(!req.body.username){ logger.warn("No body provided to set admin"); return res.status(400).send("No body provided"); diff --git a/routes/twoFactor.router.js b/routes/twoFactor.router.js index 503164b..1545de8 100644 --- a/routes/twoFactor.router.js +++ b/routes/twoFactor.router.js @@ -47,6 +47,7 @@ const routersUtils = require("../utils/routersUtils"); router.post("/add", async (req, res) => { try { if (await routersUtils.validateToken(res, req.cookies.jwt)) return; + if(await routersUtils.isMetamaskUser(res, req.cookies.jwt)) return; const twoFactor = await twoFactorController.addTwoFactor(req.cookies.jwt); console.log(twoFactor); if (!twoFactor) { @@ -72,6 +73,7 @@ router.post("/add", async (req, res) => { router.get("/has2fa", async (req, res) => { try { if (await routersUtils.validateToken(res, req.cookies.jwt)) return; + if(await routersUtils.isMetamaskUser(res, req.cookies.jwt)) return; if(await twoFactorController.hasTwoFactorEnabled(req.cookies.jwt)){ logger.info("The user has two factor enabled"); res.status(200).send("true"); @@ -97,6 +99,7 @@ router.get("/has2fa", async (req, res) => { router.delete("/delete", async (req, res) => { try { if (await routersUtils.validateToken(res, req.cookies.jwt)) return; + if(await routersUtils.isMetamaskUser(res, req.cookies.jwt)) return; res.status(200).json(await twoFactorController.removeTwoFactor(req.cookies.jwt)); } catch (err) { let code = 500; diff --git a/routes/user.router.js b/routes/user.router.js index 4570e3c..e3e180b 100644 --- a/routes/user.router.js +++ b/routes/user.router.js @@ -58,7 +58,7 @@ const routersUtils = require("../utils/routersUtils"); * error: * type: string */ -router.get("/id/:name", async (req, res) => { +router.get("/id/:name", async (req, res) => { //TODO: eval removal try { const user = await usersController.getUser(req.params.name); if (!user) { @@ -228,11 +228,12 @@ router.get("/image/:name", async (req, res) => { */ router.put("/style", async (req, res) => { try { + if (await routersUtils.validateToken(res, req.cookies.jwt)) return; + if(await routersUtils.isMetamaskUser(res, req.cookies.jwt)) return; if(!req.body.style) { logger.warn("No style provided to change user style"); return res.status(400).send("No style provided"); } - if (await routersUtils.validateToken(res, req.cookies.jwt)) return; res.status(200).send(await usersController.changeStyle(req.body.style, req.cookies.jwt)); } catch (err) { let code = 500; @@ -311,6 +312,7 @@ router.get("/userId", async (req, res) => { router.put("/changePassword", async (req, res) => { try { if (await routersUtils.validateToken(res, req.cookies.jwt)) return; + if(await routersUtils.isMetamaskUser(res, req.cookies.jwt)) return; if (!req.body || !req.body.old || !req.body.updated) { logger.warn("No password provided to change user password"); return res.status(400).send("No password provided"); @@ -351,6 +353,7 @@ router.put("/changePassword", async (req, res) => { router.put("/changeAvatar", async (req, res) => { try { if( await routersUtils.validateToken(res, req.cookies.jwt)) return; + if(await routersUtils.isMetamaskUser(res, req.cookies.jwt)) return; logger.info("User id was requested successfully."); res.status(200).send(await usersController.changeAvatar(req.cookies.jwt)); } catch (err) { @@ -397,7 +400,9 @@ router.get("/activeUsers", async (req, res) => { router.get("/getUsers/:name", async (req, res) => { try { if (await routersUtils.validateToken(res, req.cookies.jwt)) return; + if(await routersUtils.isMetamaskUser(res, req.cookies.jwt)) return; if (await routersUtils.validateAuthority(res, req.cookies.jwt)) return; + if(!req.params.name) { logger.warn("No name provided to get users"); return res.status(400).send("No name provided"); diff --git a/utils/routersUtils.js b/utils/routersUtils.js index 5bfa391..4c61afe 100644 --- a/utils/routersUtils.js +++ b/utils/routersUtils.js @@ -31,7 +31,27 @@ async function validateAuthority(res,jwt){ return false; } +async function isMetamaskUser(res,jwt){ //TODO; register person in blockchain when logging in as metamask user + try { + const decodedToken = await verifyJWT(jwt); + console.log(decodedToken); + const isMetamaskUser = decodedToken.tempUser.metamask; + if(isMetamaskUser){ + console.log("is metamask user"); + logger.error("Invalid authority"); + res.status(423).send("Invalid authority"); + return true; + } + return false; + }catch(error){ + logger.error("Invalid authority due to error: " + error.message); + res.status(423).send("Invalid authority due to error: " + error.message); + return true; + } +} + module.exports = { validateToken, - validateAuthority + validateAuthority, + isMetamaskUser, } -- GitLab From 7a31dcf63f1375f02b0b83d5188d608beff413f6 Mon Sep 17 00:00:00 2001 From: Magnus Lutro Allison <magnulal@stud.ntnu.no> Date: Thu, 30 Nov 2023 10:25:34 +0100 Subject: [PATCH 3/4] Add check for Metamask user in changeCountry route --- routes/user.router.js | 1 + 1 file changed, 1 insertion(+) diff --git a/routes/user.router.js b/routes/user.router.js index ad1f8e3..146b9ef 100644 --- a/routes/user.router.js +++ b/routes/user.router.js @@ -419,6 +419,7 @@ router.get("/getUsers/:name", async (req, res) => { router.put("/changeCountry", async (req, res) => { try { if (await routersUtils.validateToken(res, req.cookies.jwt)) return; + if(await routersUtils.isMetamaskUser(res, req.cookies.jwt)) return; if(!req.body.country) { logger.warn("No country provided to change user country"); return res.status(400).send("No country provided"); -- GitLab From 453233d0e72b8c666b1b4fd8a3ae8e5adf1d85ff Mon Sep 17 00:00:00 2001 From: Magnus Lutro Allison <magnulal@stud.ntnu.no> Date: Thu, 30 Nov 2023 11:19:32 +0100 Subject: [PATCH 4/4] Added ? operator to make isMetamaskUser func solid --- utils/routersUtils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/routersUtils.js b/utils/routersUtils.js index 4c61afe..35c1130 100644 --- a/utils/routersUtils.js +++ b/utils/routersUtils.js @@ -35,7 +35,7 @@ async function isMetamaskUser(res,jwt){ //TODO; register person in blockchain wh try { const decodedToken = await verifyJWT(jwt); console.log(decodedToken); - const isMetamaskUser = decodedToken.tempUser.metamask; + const isMetamaskUser = decodedToken.tempUser?.metamask; if(isMetamaskUser){ console.log("is metamask user"); logger.error("Invalid authority"); -- GitLab