From f05815d7da84284bd9d7c1ce5b808acd675f2a3e Mon Sep 17 00:00:00 2001 From: Benjamin Auder <benjamin.auder@somewhere> Date: Wed, 20 Mar 2019 17:20:22 +0100 Subject: [PATCH] Small fixes + add some debug traces --- client/src/components/UpsertUser.vue | 233 ++++++++++++++------------- client/src/views/Hall.vue | 32 ++-- server/config/parameters.js.dist | 2 +- server/models/Challenge.js | 6 +- server/routes/challenges.js | 2 +- server/routes/users.js | 6 +- 6 files changed, 150 insertions(+), 131 deletions(-) diff --git a/client/src/components/UpsertUser.vue b/client/src/components/UpsertUser.vue index 5ea93a05..86f8558d 100644 --- a/client/src/components/UpsertUser.vue +++ b/client/src/components/UpsertUser.vue @@ -34,120 +34,129 @@ div <script> import { store } from "@/store"; +import { checkNameEmail } from "@/data/userCheck"; +import { ajax } from "@/utils/ajax"; export default { name: 'my-upsert-user', - data: function() { - return { - user: store.state.user, //initialized with global user object - nameOrEmail: "", //for login - stage: (!store.state.user.id ? "Login" : "Update"), - infoMsg: "", - enterTime: Number.MAX_SAFE_INTEGER, //for a basic anti-bot strategy - }; - }, - computed: { - submitMessage: function() { - switch (this.stage) - { - case "Login": - return "Go"; - case "Register": - return "Send"; - case "Update": - return "Apply"; - } - }, - displayInfo: function() { - return (this.infoMsg.length > 0 ? "block" : "none"); - }, - }, - methods: { - trySetEnterTime: function(event) { - if (!!event.target.checked) - this.enterTime = Date.now(); - }, - toggleStage: function() { - // Loop login <--> register (update is for logged-in users) - this.stage = (this.stage == "Login" ? "Register" : "Login"); - }, - ajaxUrl: function() { - switch (this.stage) - { - case "Login": - return "/sendtoken"; - case "Register": - return "/register"; - case "Update": - return "/update"; - } - }, - ajaxMethod: function() { - switch (this.stage) - { - case "Login": - return "GET"; - case "Register": - return "POST"; - case "Update": - return "PUT"; - } - }, - infoMessage: function() { - switch (this.stage) - { - case "Login": - return "Connection token sent. Check your emails!"; - case "Register": - return "Registration complete! Please check your emails."; - case "Update": - return "Modifications applied!"; - } - }, - onSubmit: function() { - // Basic anti-bot strategy: - const exitTime = Date.now(); - if (this.stage == "Register" && exitTime - this.enterTime < 5000) - return; //silently return, in (curious) case of it was legitimate - let error = undefined; - if (this.stage == 'Login') - { - const type = (this.nameOrEmail.indexOf('@') >= 0 ? "email" : "name"); - error = checkNameEmail({[type]: this.nameOrEmail}); - } - else - error = checkNameEmail(this.user); - if (!!error) - return alert(error); - this.infoMsg = "Processing... Please wait"; - ajax(this.ajaxUrl(), this.ajaxMethod(), - this.stage == "Login" ? { nameOrEmail: this.nameOrEmail } : this.user, - res => { - this.infoMsg = this.infoMessage(); - if (this.stage != "Update") - { - this.nameOrEmail = ""; - this.user["email"] = ""; - this.user["name"] = ""; - // Store our identifiers in local storage (by little anticipation...) - localStorage["myid"] = res.id; - localStorage["myname"] = res.name; + data: function() { + return { + user: store.state.user, //initialized with global user object + nameOrEmail: "", //for login + stage: (!store.state.user.id ? "Login" : "Update"), + infoMsg: "", + enterTime: Number.MAX_SAFE_INTEGER, //for a basic anti-bot strategy + }; + }, + computed: { + submitMessage: function() { + switch (this.stage) + { + case "Login": + return "Go"; + case "Register": + return "Send"; + case "Update": + return "Apply"; + } + }, + displayInfo: function() { + return (this.infoMsg.length > 0 ? "block" : "none"); + }, + }, + methods: { + trySetEnterTime: function(event) { + if (!!event.target.checked) + this.enterTime = Date.now(); + }, + toggleStage: function() { + // Loop login <--> register (update is for logged-in users) + this.stage = (this.stage == "Login" ? "Register" : "Login"); + }, + ajaxUrl: function() { + switch (this.stage) + { + case "Login": + return "/sendtoken"; + case "Register": + return "/register"; + case "Update": + return "/update"; + } + }, + ajaxMethod: function() { + switch (this.stage) + { + case "Login": + return "GET"; + case "Register": + return "POST"; + case "Update": + return "PUT"; + } + }, + infoMessage: function() { + switch (this.stage) + { + case "Login": + return "Connection token sent. Check your emails!"; + case "Register": + return "Registration complete! Please check your emails."; + case "Update": + return "Modifications applied!"; + } + }, + onSubmit: function() { + // Basic anti-bot strategy: + const exitTime = Date.now(); + if (this.stage == "Register" && exitTime - this.enterTime < 5000) + return; //silently return, in (curious) case of it was legitimate + let error = undefined; + if (this.stage == 'Login') + { + const type = (this.nameOrEmail.indexOf('@') >= 0 ? "email" : "name"); + error = checkNameEmail({[type]: this.nameOrEmail}); + } + else + error = checkNameEmail(this.user); + if (!!error) + return alert(error); + this.infoMsg = "Processing... Please wait"; + ajax(this.ajaxUrl(), this.ajaxMethod(), + this.stage == "Login" ? { nameOrEmail: this.nameOrEmail } : this.user, + res => { + + console.log("receive login infos"); + console.log(res); + + this.infoMsg = this.infoMessage(); + if (this.stage != "Update") + { + this.nameOrEmail = ""; + this.user["email"] = ""; + this.user["name"] = ""; + + debugger; //TODO: 2 passages ici au lieu d'1 lors du register + + // Store our identifiers in local storage (by little anticipation...) + localStorage["myid"] = res.id; + localStorage["myname"] = res.name; // Also in global object - this.$user.id = res.id; - this.$user.name = res.name; - } - setTimeout(() => { - this.infoMsg = ""; - if (this.stage == "Register") - this.stage = "Login"; - document.getElementById("modalUser").checked = false; - }, 2000); - }, - err => { - this.infoMsg = ""; - alert(err); - } - ); - }, - }, + this.st.user.id = res.id; + this.st.user.name = res.name; + } + setTimeout(() => { + this.infoMsg = ""; + if (this.stage == "Register") + this.stage = "Login"; + document.getElementById("modalUser").checked = false; + }, 2000); + }, + err => { + this.infoMsg = ""; + alert(err); + } + ); + }, + }, }; </script> diff --git a/client/src/views/Hall.vue b/client/src/views/Hall.vue index e499d7ec..77ca7718 100644 --- a/client/src/views/Hall.vue +++ b/client/src/views/Hall.vue @@ -125,6 +125,8 @@ export default { created: function() { // Always add myself to players' list this.players.push(this.st.user); + if (this.st.user.id > 0) + { // Ask server for current corr games (all but mines) // ajax( // "/games", @@ -134,17 +136,18 @@ export default { // this.games = this.games.concat(response.games); // } // ); - // Also ask for corr challenges (open + personal to me) - ajax( - "/challenges", - "GET", - {uid: this.st.user.id}, - response => { - console.log(response.challenges); - // TODO: post-treatment on challenges ? - this.challenges = this.challenges.concat(response.challenges); - } - ); + // Also ask for corr challenges (open + sent to me) + ajax( + "/challenges", + "GET", + {uid: this.st.user.id}, + response => { + console.log(response.challenges); + // TODO: post-treatment on challenges ? + this.challenges = this.challenges.concat(response.challenges); + } + ); + } // 0.1] Ask server for room composition: const socketOpenListener = () => { this.st.conn.send(JSON.stringify({code:"pollclients"})); @@ -394,8 +397,8 @@ export default { { this.players.push({name:"", id:0, sid:data.sid}); this.st.conn.send(JSON.stringify({code:"askidentity", target:data.sid})); - this.st.conn.send(JSON.stringify({code:"askchallenge", target:sid})); - this.st.conn.send(JSON.stringify({code:"askgame", target:sid})); + this.st.conn.send(JSON.stringify({code:"askchallenge", target:data.sid})); + this.st.conn.send(JSON.stringify({code:"askgame", target:data.sid})); break; } case "disconnect": @@ -549,8 +552,7 @@ export default { } } }, - // c.type == corr alors use id...sinon sid (figés) - // NOTE: only for live games ? + // NOTE: for live games only (corr games are launched on server) launchGame: async function(c) { // Just assign colors and pass the message const vname = this.getVname(c.vid); diff --git a/server/config/parameters.js.dist b/server/config/parameters.js.dist index 2b0a6e7f..14c100a2 100644 --- a/server/config/parameters.js.dist +++ b/server/config/parameters.js.dist @@ -1,7 +1,7 @@ module.exports = { // For mail sending. NOTE: *no trailing slash* - siteURL: "http://localhost:3000", + siteURL: "http://localhost:8080", // To know in which environment the code run env: process.env.NODE_ENV || 'development', diff --git a/server/models/Challenge.js b/server/models/Challenge.js index 6f8ba0be..a5fbf63e 100644 --- a/server/models/Challenge.js +++ b/server/models/Challenge.js @@ -78,12 +78,15 @@ const ChallengeModel = db.get(query, (err,challengeInfo) => { if (!!err) return cb(err); + let condition = ""; + if (!!challengeInfo.to[0]) + condition = " AND u.name in (" + challengeInfo.to.join(",") + ")"; query = "SELECT w.uid AS id, u.name " + "FROM WillPlay w " + "JOIN Users u " + " ON w.uid = u.id " + - "WHERE w.cid = " + id; + "WHERE w.cid = " + id + condition; db.run(query, (err2,players) => { if (!!err2) return cb(err2); @@ -113,6 +116,7 @@ const ChallengeModel = db.run(query, (err,challIds) => { if (!!err) return cb(err); + challIds = challIds || []; let challenges = []; challIds.forEach(cidRow => { ChallengeModel.getOne(cidRow["cid"], (err2,chall) => { diff --git a/server/routes/challenges.js b/server/routes/challenges.js index 84b2c83b..3f6840c0 100644 --- a/server/routes/challenges.js +++ b/server/routes/challenges.js @@ -5,7 +5,7 @@ const access = require("../utils/access"); const ChallengeModel = require("../models/Challenge"); const UserModel = require("../models/User"); //for name check -router.get("/challenges", access.logged, access.ajax, (req,res) => { +router.get("/challenges", (req,res) => { ChallengeModel.getByUser(req.query["uid"], (err,challenges) => { res.json(err || {challenges:challenges}); }); diff --git a/server/routes/users.js b/server/routes/users.js index 8df0c43e..1d9b0423 100644 --- a/server/routes/users.js +++ b/server/routes/users.js @@ -21,7 +21,11 @@ function setAndSendLoginToken(subject, to, res) params.siteURL + "/authenticate?token=" + token + "\\n" + "Token will expire in " + params.token.expire/(1000*60) + " minutes." sendEmail(params.mail.noreply, to.email, subject, body, err => { - // "id" is generally the only info missing on client side, + + console.log("send login infos ::"); + console.log(to); + + // "id" is generally the only info missing on client side, // but the name is also unknown if log-in with the email. res.json(err || {id: to.id, name: to.name}); }); -- 2.44.0