From b6867e412d15fcecfa24df14c187a0041c7df7dd Mon Sep 17 00:00:00 2001 From: Benjamin Kyd Date: Wed, 10 Feb 2021 23:20:55 +0000 Subject: [PATCH] socket authentication --- TODO | 12 +++--- client/public/{lobby => game}/index.html | 2 +- .../public/{lobby/index.js => game/init.js} | 31 ++++++++++--- client/public/index.js | 2 +- server/src/game-registrar.js | 43 ++++++++++++------- server/src/logger.js | 8 ++-- server/src/router.js | 2 - server/src/socketserver.js | 20 ++++++--- 8 files changed, 80 insertions(+), 40 deletions(-) rename client/public/{lobby => game}/index.html (92%) rename client/public/{lobby/index.js => game/init.js} (56%) diff --git a/TODO b/TODO index 238f17d..0bc72bc 100644 --- a/TODO +++ b/TODO @@ -1,14 +1,14 @@ [ ] SERVER [ ] Socket user identifying + [x] User login checks if there's an active socket + [ ] If there's no active socket, delete the user and allow new user to connect [ ] Fix user timeouts / deletion - [ ] User login checks if there's an active socket - [ ] If there's no active socket, delete the user and allow new user to connect - [ ] User sockets, or "users" are made innactive after timeout on socket - - Prevents softlock of users and stops socket spamming - [ ] 1v1 game framework that allows spectators# + [ ] User sockets, or "users" are made innactive after timeout on socket + - Prevents softlock of users and stops socket spamming + [ ] 1v1 game framework that allows spectators [ ] [ ] Game logic implementation [ ] CLIENT [ ] Save username and re-request automatically if uid changed [ ] Display and save last error on main screen - + [ ] Error reporting for the user diff --git a/client/public/lobby/index.html b/client/public/game/index.html similarity index 92% rename from client/public/lobby/index.html rename to client/public/game/index.html index f848645..897fe05 100644 --- a/client/public/lobby/index.html +++ b/client/public/game/index.html @@ -15,6 +15,6 @@
- + \ No newline at end of file diff --git a/client/public/lobby/index.js b/client/public/game/init.js similarity index 56% rename from client/public/lobby/index.js rename to client/public/game/init.js index 63b79fb..c4e22c1 100644 --- a/client/public/lobby/index.js +++ b/client/public/game/init.js @@ -10,24 +10,41 @@ socket.on('connect', (...args) => { ConnectionState.innerHTML = 'Waiting for identify' }); +socket.on('disconnect', (...args) => { + console.log('Socket Disconnected'); + ConnectionState.innerHTML = 'Disconnected' +}); + socket.on('identify', (...args) => { ConnectionState.innerHTML = 'Identify recived' + if (!sessionStorage.user) { - socket.emit('identify', { playerid: 'none' }); - ConnectionState.innerHTML = 'Identify cannot proceed'; + socket.disconnect(); + ConnectionState.innerHTML = 'Identify cannot proceed, no user'; document.location.href = document.location.href + '../'; return; } - const user = JSON.parse(sessionStorage.user); - // If, for some reason, the user in sessionstorage was corrupted + // TODO: Session storage error object to display on the login screen + let user = {}; + try + { + user = JSON.parse(sessionStorage.user); + } catch (e) + { + socket.disconnect(); + ConnectionState.innerHTML = 'Identify cannot proceed, corrupted user'; + document.location.href = document.location.href + '../'; + return; + } + if (!user.uid) { - socket.emit('identify', { playerid: 'none' }); - ConnectionState.innerHTML = 'Identify cannot proceed'; + socket.disconnect(); + ConnectionState.innerHTML = 'Identify cannot proceed, corrupted user'; document.location.href = document.location.href + '../'; return; } @@ -36,8 +53,10 @@ socket.on('identify', (...args) => { ConnectionState.innerHTML = 'Identify response'; }); + socket.on('identify-success', (...args) => { console.log(args); + ConnectionState.innerHTML = JSON.stringify(args[0]); }); socket.on('identify-error', (...args) => { diff --git a/client/public/index.js b/client/public/index.js index e8bed2b..fdaf250 100644 --- a/client/public/index.js +++ b/client/public/index.js @@ -47,6 +47,6 @@ async function onUsernameSubmit(e) sessionStorage.setItem('user', JSON.stringify(body.login.user)); console.log(sessionStorage.user) ClientID.innerHTML = `ClientID: ${JSON.parse(sessionStorage.user).uid}`; - document.location.href = document.location.href + '/lobby'; + document.location.href = document.location.href + '/game'; } } diff --git a/server/src/game-registrar.js b/server/src/game-registrar.js index 39f8e78..273d8ca 100644 --- a/server/src/game-registrar.js +++ b/server/src/game-registrar.js @@ -21,7 +21,7 @@ let OnlineUsers = []; // TODO: This won't scale very well lol -function CheckUsernameAvailability(username) +function CheckUsernameAvailability(username) { for (const user in OnlineUsers) if (OnlineUsers[user].username == username) @@ -38,14 +38,15 @@ function CountIPs(ip) { let count = 0; for (const user in OnlineUsers) - if (OnlineUsers[user].ip == ip) + if (OnlineUsers[user].ip === ip) count++ return count; } function ValidUsername(username) { - if (username.match(/[^A-Za-z0-9_-]/)) { + if (username.match(/[^A-Za-z0-9_-]/)) + { return false; } return true; @@ -59,7 +60,7 @@ function GetUserByUID(uid) function GetUserByUsername(username) { for (const user in OnlineUsers) - if (OnlineUsers[user].username == username) + if (OnlineUsers[user].username === username) return OnlineUsers[user]; } @@ -67,25 +68,35 @@ function GetUserByUsername(username) function RegisterUser(username, ip) { // TODO: Don't assume this is unique, even with Crypto, UUIDv4? - const id = Crypto.randomBytes(32).toString("hex"); + const uid = Crypto.randomBytes(32).toString("hex"); - OnlineUsers[id] = { + OnlineUsers[uid] = { username: username, - uid: id, - ip: ip + uid: uid, + ip: ip, + // REGISTERED, CONNECTED, DISCONNECTED + state: 'REGISTERED', + // Doesn't update if state changes + connectionid: 'none', }; - Logger.info(`${id}: REGISTERING`); + Logger.info(`${uid} REGISTERING`); - return OnlineUsers[id]; + return OnlineUsers[uid]; } -function UserConnect() + +// Can return string errors, or true if success +// yes multiple return types i know its bad +function UserConnect(userid, connectionid) { + if (OnlineUsers[userid].state === 'CONNECTED') return 'User Connected'; + + return true; } -function UserDisconnect() +function UserDisconnect(userid, connectionid) { } @@ -97,11 +108,13 @@ module.exports = { CheckUsernameAvailability: CheckUsernameAvailability, CheckValidUID: CheckValidUID, CountIPs: CountIPs, + ValidUsername: ValidUsername, GetUserByUID: GetUserByUID, GetUserByUsername: GetUserByUsername, - ValidUsername: ValidUsername, - - RegisterUser: RegisterUser + RegisterUser: RegisterUser, + + UserConnect: UserConnect, + UserDisconnect: UserDisconnect } diff --git a/server/src/logger.js b/server/src/logger.js index ae85271..30c7b91 100644 --- a/server/src/logger.js +++ b/server/src/logger.js @@ -84,23 +84,23 @@ module.exports.warn = function(message) { let d = moment().format(dateFormat); fs.appendFileSync(logPath, `[${d.toLocaleString()}] [WARN] ${message} \n`); if (LogLevel > 3) return; - console.log('[' + d.toLocaleString() + '] [' + console.warn('[' + d.toLocaleString() + '] [' + colours.yellow('WARN') + '] ' + message); } module.exports.error = function(message) { let d = moment().format(dateFormat); fs.appendFileSync(logPath, `[${d.toLocaleString()}] [ERROR] ${message} \n`); - console.log('[' + d.toLocaleString() + '] [' + console.error('[' + d.toLocaleString() + '] [' + colours.red('ERROR') + '] ' + message); } module.exports.panic = function(message) { let d = moment().format(dateFormat); fs.appendFileSync(logPath, `[${d.toLocaleString()}] [PANIC] ${message} \n`); - console.log('[' + d.toLocaleString() + '] [' + console.error('[' + d.toLocaleString() + '] [' + colours.red('PANIC') + '] ' + message); - console.log('[' + d.toLocaleString() + '] [' + console.error('[' + d.toLocaleString() + '] [' + colours.red('PANIC') + '] ABORTING...'); process.exit(); } diff --git a/server/src/router.js b/server/src/router.js index 83f1cdd..3f53d59 100644 --- a/server/src/router.js +++ b/server/src/router.js @@ -98,5 +98,3 @@ function HandleLogin(req, res, next) // Continue to later middleware next(); } - - diff --git a/server/src/socketserver.js b/server/src/socketserver.js index 2b3239b..570e5fe 100644 --- a/server/src/socketserver.js +++ b/server/src/socketserver.js @@ -55,22 +55,32 @@ function ClientIdentify(socket, userid) const user = Game.Registrar.GetUserByUID(userid); - console.log(user); - if (!user) { err.addError(403, 'Forbidden', 'Unknown uid'); socket.emit('identify-error', err.toError); return; } + + console.log(user); + + const status = Game.Registrar.UserConnect(userid, socket.id); - - + if (status === true) + { + socket.emit('identify-success', {connected: true, user: user}); + return; + } else + { + err.addError(500, 'Internal Server Error', 'Socket busy'); + socket.emit('identify-error', err.toError); + return; + } } function HandleDisconnect(socket, args) { - + Logger.debug(`${socket.id} DISCONNECTED`) }