diff --git a/app/src/RoomClient.js b/app/src/RoomClient.js index 4edc5c3..3188526 100644 --- a/app/src/RoomClient.js +++ b/app/src/RoomClient.js @@ -391,7 +391,7 @@ export default class RoomClient login() { - const url = `/auth/login?id=${this._peerId}`; + const url = `/auth/login?peerId=${this._peerId}&roomId=${this._roomId}`; window.open(url, 'loginWindow'); } diff --git a/server/config/config.example.js b/server/config/config.example.js index ee225b1..5c7291d 100644 --- a/server/config/config.example.js +++ b/server/config/config.example.js @@ -52,12 +52,13 @@ module.exports = // use case: loadbalancer backend httpOnly : false, // This function will be called on successful login through oidc. - // Use this function to map your oidc userinfo to the Peer object, - // see examples below. + // Use this function to map your oidc userinfo to the Peer object. + // The roomId is equal to the room name. + // See examples below. // Examples: /* // All authenicated users will be MODERATOR and AUTHENTICATED - userMapping : async ({ peer, userinfo }) => + userMapping : async ({ peer, roomId, userinfo }) => { peer.addRole(userRoles.MODERATOR); peer.addRole(userRoles.AUTHENTICATED); @@ -65,7 +66,7 @@ module.exports = // All authenicated users will be AUTHENTICATED, // and those with the moderator role set in the userinfo // will also be MODERATOR - userMapping : async ({ peer, userinfo }) => + userMapping : async ({ peer, roomId, userinfo }) => { if ( Array.isArray(userinfo.meet_roles) && @@ -88,7 +89,7 @@ module.exports = // All authenicated users will be AUTHENTICATED, // and those with email ending with @example.com // will also be MODERATOR - userMapping : async ({ peer, userinfo }) => + userMapping : async ({ peer, roomId, userinfo }) => { if (userinfo.email && userinfo.email.endsWith('@example.com')) { @@ -96,8 +97,21 @@ module.exports = } peer.addRole(userRoles.AUTHENTICATED); - },*/ - userMapping : async ({ peer, userinfo }) => + } + // All authenicated users will be AUTHENTICATED, + // and those with email ending with @example.com + // will also be MODERATOR + userMapping : async ({ peer, roomId, userinfo }) => + { + if (userinfo.email && userinfo.email.endsWith('@example.com')) + { + peer.addRole(userRoles.MODERATOR); + } + + peer.addRole(userRoles.AUTHENTICATED); + }, + */ + userMapping : async ({ peer, roomId, userinfo }) => { if (userinfo.picture != null) { diff --git a/server/lib/Peer.js b/server/lib/Peer.js index 2b63c87..1affec9 100644 --- a/server/lib/Peer.js +++ b/server/lib/Peer.js @@ -1,19 +1,20 @@ const EventEmitter = require('events').EventEmitter; const userRoles = require('../userRoles'); -const config = require('../config/config'); const Logger = require('./Logger'); const logger = new Logger('Peer'); class Peer extends EventEmitter { - constructor({ id, socket }) + constructor({ id, roomId, socket }) { logger.info('constructor() [id:"%s", socket:"%s"]', id, socket.id); super(); this._id = id; + this._roomId = roomId; + this._authId = null; this._socket = socket; @@ -87,6 +88,16 @@ class Peer extends EventEmitter this._id = id; } + get roomId() + { + return this._roomId; + } + + set roomId(roomId) + { + this._roomId = roomId; + } + get authId() { return this._authId; diff --git a/server/server.js b/server/server.js index 43b888b..4d08c09 100755 --- a/server/server.js +++ b/server/server.js @@ -279,7 +279,8 @@ async function setupAuth() { passport.authenticate('oidc', { state : base64.encode(JSON.stringify({ - id : req.query.id + peerId : req.query.peerId, + roomId : req.query.roomId })) })(req, res, next); }); @@ -324,14 +325,21 @@ async function setupAuth() picture = '/static/media/buddy.403cb9f6.svg'; } - const peer = peers.get(state.id); + const peer = peers.get(state.peerId); + + if (peer && peer.roomId !== state.roomId) // The peer is mischievous + throw new Error('peer authenticated with wrong room'); peer && (peer.displayName = displayName); peer && (peer.picture = picture); if (peer && typeof config.userMapping === 'function') { - await config.userMapping({ peer, userinfo: req.user._userinfo }); + await config.userMapping({ + peer, + roomId : state.roomId, + userinfo : req.user._userinfo + }); } res.send(loginHelper({ @@ -454,7 +462,7 @@ async function runWebSocketServer() queue.push(async () => { const room = await getOrCreateRoom({ roomId }); - const peer = new Peer({ id: peerId, socket }); + const peer = new Peer({ id: peerId, roomId, socket }); peers.set(peerId, peer); @@ -480,7 +488,7 @@ async function runWebSocketServer() if (typeof config.userMapping === 'function') { - await config.userMapping({ peer, userinfo: _userinfo }); + await config.userMapping({ peer, roomId, userinfo: _userinfo }); } }