socket authentication

This commit is contained in:
Benjamin Kyd
2021-02-10 23:20:55 +00:00
parent 3337972535
commit b6867e412d
8 changed files with 80 additions and 40 deletions

12
TODO
View File

@@ -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

View File

@@ -15,6 +15,6 @@
<div id="connection-state"></div>
<script src="index.js"></script>
<script src="init.js"></script>
</body>
</html>

View File

@@ -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) => {

View File

@@ -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';
}
}

View File

@@ -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
}

View File

@@ -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();
}

View File

@@ -98,5 +98,3 @@ function HandleLogin(req, res, next)
// Continue to later middleware
next();
}

View File

@@ -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`)
}