Add support for user roles
This commit is contained in:
+26
-15
@@ -75,11 +75,15 @@ class Lobby extends EventEmitter
|
||||
if (peer)
|
||||
{
|
||||
peer.socket.removeListener('request', peer.socketRequestHandler);
|
||||
peer.removeListener('authenticationChanged', peer.authenticationHandler);
|
||||
peer.removeListener('rolesChange', peer.roleChangeHandler);
|
||||
peer.removeListener('displayNameChanged', peer.displayNameChangeHandler);
|
||||
peer.removeListener('pictureChanged', peer.pictureChangeHandler);
|
||||
peer.removeListener('close', peer.closeHandler);
|
||||
|
||||
peer.socketRequestHandler = null;
|
||||
peer.authenticationHandler = null;
|
||||
peer.roleChangeHandler = null;
|
||||
peer.displayNameChangeHandler = null;
|
||||
peer.pictureChangeHandler = null;
|
||||
peer.closeHandler = null;
|
||||
|
||||
this.emit('promotePeer', peer);
|
||||
@@ -112,16 +116,25 @@ class Lobby extends EventEmitter
|
||||
});
|
||||
};
|
||||
|
||||
peer.authenticationHandler = () =>
|
||||
peer.roleChangeHandler = () =>
|
||||
{
|
||||
logger.info('parkPeer() | authenticationChange [peer:"%s"]', peer.id);
|
||||
logger.info('parkPeer() | rolesChange [peer:"%s"]', peer.id);
|
||||
|
||||
if (peer.authenticated)
|
||||
{
|
||||
this.emit('changeDisplayName', peer);
|
||||
this.emit('changePicture', peer);
|
||||
this.emit('peerAuthenticated', peer);
|
||||
}
|
||||
this.emit('peerRolesChanged', peer);
|
||||
};
|
||||
|
||||
peer.displayNameChangeHandler = () =>
|
||||
{
|
||||
logger.info('parkPeer() | displayNameChange [peer:"%s"]', peer.id);
|
||||
|
||||
this.emit('changeDisplayName', peer);
|
||||
};
|
||||
|
||||
peer.pictureChangeHandler = () =>
|
||||
{
|
||||
logger.info('parkPeer() | pictureChange [peer:"%s"]', peer.id);
|
||||
|
||||
this.emit('changePicture', peer);
|
||||
};
|
||||
|
||||
peer.closeHandler = () =>
|
||||
@@ -143,7 +156,9 @@ class Lobby extends EventEmitter
|
||||
|
||||
this._peers.set(peer.id, peer);
|
||||
|
||||
peer.on('authenticationChanged', peer.authenticationHandler);
|
||||
peer.on('rolesChange', peer.roleChangeHandler);
|
||||
peer.on('displayNameChanged', peer.displayNameChangeHandler);
|
||||
peer.on('pictureChanged', peer.pictureChangeHandler);
|
||||
|
||||
peer.socket.on('request', peer.socketRequestHandler);
|
||||
|
||||
@@ -169,8 +184,6 @@ class Lobby extends EventEmitter
|
||||
|
||||
peer.displayName = displayName;
|
||||
|
||||
this.emit('changeDisplayName', peer);
|
||||
|
||||
cb();
|
||||
|
||||
break;
|
||||
@@ -181,8 +194,6 @@ class Lobby extends EventEmitter
|
||||
|
||||
peer.picture = picture;
|
||||
|
||||
this.emit('changePicture', peer);
|
||||
|
||||
cb();
|
||||
|
||||
break;
|
||||
|
||||
+34
-51
@@ -1,4 +1,6 @@
|
||||
const EventEmitter = require('events').EventEmitter;
|
||||
const userRoles = require('../userRoles');
|
||||
const config = require('../config/config');
|
||||
const Logger = require('./Logger');
|
||||
|
||||
const logger = new Logger('Peer');
|
||||
@@ -22,7 +24,7 @@ class Peer extends EventEmitter
|
||||
|
||||
this._inLobby = false;
|
||||
|
||||
this._authenticated = false;
|
||||
this._roles = [ userRoles.ALL ];
|
||||
|
||||
this._displayName = false;
|
||||
|
||||
@@ -40,8 +42,6 @@ class Peer extends EventEmitter
|
||||
|
||||
this._consumers = new Map();
|
||||
|
||||
this._checkAuthentication();
|
||||
|
||||
this._handlePeer();
|
||||
}
|
||||
|
||||
@@ -66,13 +66,6 @@ class Peer extends EventEmitter
|
||||
|
||||
_handlePeer()
|
||||
{
|
||||
this.socket.use((packet, next) =>
|
||||
{
|
||||
this._checkAuthentication();
|
||||
|
||||
return next();
|
||||
});
|
||||
|
||||
this.socket.on('disconnect', () =>
|
||||
{
|
||||
if (this.closed)
|
||||
@@ -84,33 +77,6 @@ class Peer extends EventEmitter
|
||||
});
|
||||
}
|
||||
|
||||
_checkAuthentication()
|
||||
{
|
||||
if (
|
||||
Boolean(this.socket.handshake.session.passport) &&
|
||||
Boolean(this.socket.handshake.session.passport.user)
|
||||
)
|
||||
{
|
||||
const {
|
||||
id,
|
||||
displayName,
|
||||
picture,
|
||||
email
|
||||
} = this.socket.handshake.session.passport.user;
|
||||
|
||||
id && (this.authId = id);
|
||||
displayName && (this.displayName = displayName);
|
||||
picture && (this.picture = picture);
|
||||
email && (this.email = email);
|
||||
|
||||
this.authenticated = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.authenticated = false;
|
||||
}
|
||||
}
|
||||
|
||||
get id()
|
||||
{
|
||||
return this._id;
|
||||
@@ -166,21 +132,9 @@ class Peer extends EventEmitter
|
||||
this._inLobby = inLobby;
|
||||
}
|
||||
|
||||
get authenticated()
|
||||
get roles()
|
||||
{
|
||||
return this._authenticated;
|
||||
}
|
||||
|
||||
set authenticated(authenticated)
|
||||
{
|
||||
if (authenticated !== this._authenticated)
|
||||
{
|
||||
const oldAuthenticated = this._authenticated;
|
||||
|
||||
this._authenticated = authenticated;
|
||||
|
||||
this.emit('authenticationChanged', { oldAuthenticated });
|
||||
}
|
||||
return this._roles;
|
||||
}
|
||||
|
||||
get displayName()
|
||||
@@ -262,6 +216,35 @@ class Peer extends EventEmitter
|
||||
return this._consumers;
|
||||
}
|
||||
|
||||
addRole(newRole)
|
||||
{
|
||||
if (!this._roles.includes(newRole))
|
||||
{
|
||||
this._roles.push(newRole);
|
||||
|
||||
logger.info('addRole() | [newRole:"%s]"', newRole);
|
||||
|
||||
this.emit('rolesChange', { newRole });
|
||||
}
|
||||
}
|
||||
|
||||
removeRole(oldRole)
|
||||
{
|
||||
if (this._roles.includes(oldRole))
|
||||
{
|
||||
this._roles = this._roles.filter((role) => role !== oldRole);
|
||||
|
||||
logger.info('removeRole() | [oldRole:"%s]"', oldRole);
|
||||
|
||||
this.emit('rolesChange', { oldRole });
|
||||
}
|
||||
}
|
||||
|
||||
hasRole(role)
|
||||
{
|
||||
return this._roles.includes(role);
|
||||
}
|
||||
|
||||
addTransport(id, transport)
|
||||
{
|
||||
this.transports.set(id, transport);
|
||||
|
||||
+31
-20
@@ -1,6 +1,7 @@
|
||||
const EventEmitter = require('events').EventEmitter;
|
||||
const Logger = require('./Logger');
|
||||
const Lobby = require('./Lobby');
|
||||
const userRoles = require('../userRoles');
|
||||
const config = require('../config/config');
|
||||
|
||||
const logger = new Logger('Room');
|
||||
@@ -117,9 +118,8 @@ class Room extends EventEmitter
|
||||
|
||||
handlePeer(peer)
|
||||
{
|
||||
logger.info('handlePeer() [peer:"%s"]', peer.id);
|
||||
logger.info('handlePeer() [peer:"%s", roles:"%s"]', peer.id, peer.roles);
|
||||
|
||||
// This will allow reconnects to join despite lock
|
||||
if (this._peers[peer.id])
|
||||
{
|
||||
logger.warn(
|
||||
@@ -130,13 +130,16 @@ class Room extends EventEmitter
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Always let ADMIN in, even if locked
|
||||
if (peer.roles.includes(userRoles.ADMIN))
|
||||
this._peerJoining(peer);
|
||||
else if (this._locked)
|
||||
{
|
||||
this._parkPeer(peer);
|
||||
}
|
||||
else
|
||||
{
|
||||
peer.authenticated ?
|
||||
// If the user has a role in config.requiredRolesForAccess, let them in
|
||||
peer.roles.some((role) => config.requiredRolesForAccess.includes(role)) ?
|
||||
this._peerJoining(peer) :
|
||||
this._handleGuest(peer);
|
||||
}
|
||||
@@ -144,21 +147,12 @@ class Room extends EventEmitter
|
||||
|
||||
_handleGuest(peer)
|
||||
{
|
||||
if (config.requireSignInToAccess)
|
||||
{
|
||||
if (config.activateOnHostJoin && !this.checkEmpty())
|
||||
{
|
||||
this._peerJoining(peer);
|
||||
}
|
||||
else
|
||||
{
|
||||
this._parkPeer(peer);
|
||||
this._notification(peer.socket, 'signInRequired');
|
||||
}
|
||||
}
|
||||
if (config.activateOnHostJoin && !this.checkEmpty())
|
||||
this._peerJoining(peer);
|
||||
else
|
||||
{
|
||||
this._peerJoining(peer);
|
||||
this._parkPeer(peer);
|
||||
this._notification(peer.socket, 'signInRequired');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -178,9 +172,26 @@ class Room extends EventEmitter
|
||||
}
|
||||
});
|
||||
|
||||
this._lobby.on('peerAuthenticated', (peer) =>
|
||||
this._lobby.on('peerRolesChanged', (peer) =>
|
||||
{
|
||||
!this._locked && this._lobby.promotePeer(peer.id);
|
||||
// Always let admin in, even if locked
|
||||
if (peer.roles.includes(userRoles.ADMIN))
|
||||
{
|
||||
this._lobby.promotePeer(peer.id);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// If the user has a role in config.requiredRolesForAccess, let them in
|
||||
if (
|
||||
!this._locked &&
|
||||
peer.roles.some((role) => config.requiredRolesForAccess.includes(role))
|
||||
)
|
||||
{
|
||||
this._lobby.promotePeer(peer.id);
|
||||
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
this._lobby.on('changeDisplayName', (changedPeer) =>
|
||||
|
||||
Reference in New Issue
Block a user