From 98caed6e4aab398e5572f6eb05cb73b09fa4ed4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5var=20Aamb=C3=B8=20Fosstveit?= Date: Mon, 4 Nov 2019 23:29:54 +0100 Subject: [PATCH] Properly handle login/logout. --- app/src/RoomClient.js | 37 +++++++++++++++++++++++---------- app/src/actions/stateActions.js | 13 ++++++++++-- app/src/reducers/me.js | 14 ++++++++++++- server/httpHelper.js | 26 +++++++++++++++++++---- server/server.js | 13 +++++++----- 5 files changed, 80 insertions(+), 23 deletions(-) diff --git a/app/src/RoomClient.js b/app/src/RoomClient.js index 48627c6..404b487 100644 --- a/app/src/RoomClient.js +++ b/app/src/RoomClient.js @@ -317,34 +317,49 @@ export default class RoomClient { const url = `/auth/login?id=${this._peerId}`; - this._loginWindow = window.open(url, 'loginWindow'); + window.open(url, 'loginWindow'); } logout() { - window.location = '/auth/logout'; + window.open('/auth/logout', 'logoutWindow'); } - receiveFromChildWindow(data) + receiveLoginChildWindow(data) { logger.debug('receiveFromChildWindow() | [data:"%o"]', data); const { displayName, picture } = data; - store.dispatch(stateActions.setDisplayName(displayName)); - store.dispatch(stateActions.setPicture(picture)); - store.dispatch(stateActions.loggedIn()); + if (store.getState().room.state === 'connected') + { + this.changeDisplayName(displayName); + this.changePicture(picture); + } + else + { + store.dispatch(stateActions.setDisplayName(displayName)); + store.dispatch(stateActions.setPicture(picture)); + } + + store.dispatch(stateActions.loggedIn(true)); store.dispatch(requestActions.notify( { text : 'You are logged in.' })); + } - if (store.getState().room.state !== 'new') // no socket yet - { - this.changeDisplayName(displayName); - this.changePicture(picture); - } + receiveLogoutChildWindow() + { + logger.debug('receiveLogoutChildWindow()'); + + store.dispatch(stateActions.loggedIn(false)); + + store.dispatch(requestActions.notify( + { + text : 'You are logged out.' + })); } _soundNotification() diff --git a/app/src/actions/stateActions.js b/app/src/actions/stateActions.js index 55ba6fb..89bc05a 100644 --- a/app/src/actions/stateActions.js +++ b/app/src/actions/stateActions.js @@ -165,6 +165,14 @@ export const setDisplayName = (displayName) => }; }; +export const setDisplayNameInProgress = (flag) => +{ + return { + type : 'SET_DISPLAY_NAME_IN_PROGRESS', + payload : { flag } + }; +}; + export const toggleAdvancedMode = () => { return { @@ -641,9 +649,10 @@ export const setPeerPicture = (peerId, picture) => payload : { peerId, picture } }); -export const loggedIn = () => +export const loggedIn = (flag) => ({ - type : 'LOGGED_IN' + type : 'LOGGED_IN', + payload : { flag } }); export const toggleJoined = () => diff --git a/app/src/reducers/me.js b/app/src/reducers/me.js index 4297de2..13219b0 100644 --- a/app/src/reducers/me.js +++ b/app/src/reducers/me.js @@ -12,6 +12,7 @@ const initialState = webcamInProgress : false, audioInProgress : false, screenShareInProgress : false, + displayNameInProgress : false, loginEnabled : false, raiseHand : false, raiseHandInProgress : false, @@ -39,7 +40,11 @@ const me = (state = initialState, action) => } case 'LOGGED_IN': - return { ...state, loggedIn: true }; + { + const { flag } = action.payload; + + return { ...state, loggedIn: flag }; + } case 'USER_LOGOUT': return { ...state, loggedIn: false }; @@ -114,6 +119,13 @@ const me = (state = initialState, action) => return { ...state, raiseHandInProgress: flag }; } + case 'SET_DISPLAY_NAME_IN_PROGRESS': + { + const { flag } = action.payload; + + return { ...state, displayNameInProgress: flag }; + } + default: return state; } diff --git a/server/httpHelper.js b/server/httpHelper.js index c45c93a..a39bf17 100644 --- a/server/httpHelper.js +++ b/server/httpHelper.js @@ -1,4 +1,4 @@ -function httpHelper(data) +exports.loginHelper = function(data) { const html = ` @@ -10,7 +10,7 @@ function httpHelper(data) @@ -18,6 +18,24 @@ function httpHelper(data) `; return html; -} +}; -module.exports = httpHelper; \ No newline at end of file +exports.logoutHelper = function() +{ + const html = ` + + + + Multiparty Meeting + + + + + `; + + return html; +}; \ No newline at end of file diff --git a/server/server.js b/server/server.js index 5272f6e..f035a65 100755 --- a/server/server.js +++ b/server/server.js @@ -6,7 +6,6 @@ const config = require('./config/config'); const fs = require('fs'); const http = require('http'); const spdy = require('spdy'); -const { constants } = require('crypto'); const express = require('express'); const bodyParser = require('body-parser'); const cookieParser = require('cookie-parser'); @@ -18,7 +17,10 @@ const Room = require('./lib/Room'); const Peer = require('./lib/Peer'); const base64 = require('base-64'); const helmet = require('helmet'); -const httpHelper = require('./httpHelper'); +const { + loginHelper, + logoutHelper +} = require('./httpHelper'); // auth const passport = require('passport'); const redis = require('redis'); @@ -88,7 +90,8 @@ const session = expressSession({ store : new RedisStore({ client }), cookie : { secure : true, - httpOnly : true + httpOnly : true, + maxAge : 60 * 60 * 1000 // Expire after 1 hour since last request from user } }); @@ -268,7 +271,7 @@ async function setupAuth(oidcIssuer) app.get('/auth/logout', (req, res) => { req.logout(); - res.redirect('/'); + res.send(logoutHelper()); }); // callback @@ -301,7 +304,7 @@ async function setupAuth(oidcIssuer) peer && (peer.displayName = displayName); peer && (peer.picture = picture); - res.send(httpHelper({ + res.send(loginHelper({ displayName, picture }));