socket authentication
This commit is contained in:
12
TODO
12
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
|
||||
|
||||
@@ -15,6 +15,6 @@
|
||||
<div id="connection-state"></div>
|
||||
|
||||
|
||||
<script src="index.js"></script>
|
||||
<script src="init.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -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) => {
|
||||
@@ -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';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -98,5 +98,3 @@ function HandleLogin(req, res, next)
|
||||
// Continue to later middleware
|
||||
next();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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`)
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user