diff --git a/lib/tunnelbroker/use-peer-to-peer-message-handler.js b/lib/tunnelbroker/use-peer-to-peer-message-handler.js --- a/lib/tunnelbroker/use-peer-to-peer-message-handler.js +++ b/lib/tunnelbroker/use-peer-to-peer-message-handler.js @@ -22,7 +22,11 @@ peerToPeerMessageTypes, type PeerToPeerMessage, } from '../types/tunnelbroker/peer-to-peer-message-types.js'; -import { secondaryDeviceLogoutP2PMessageValidator } from '../types/tunnelbroker/user-actions-peer-to-peer-message-types.js'; +import { + userActionsP2PMessageTypes, + userActionP2PMessageValidator, + type UserActionP2PMessage, +} from '../types/tunnelbroker/user-actions-peer-to-peer-message-types.js'; import { getConfig } from '../utils/config.js'; import { getContentSigningKey } from '../utils/crypto-utils.js'; import { getMessageForException } from '../utils/errors.js'; @@ -134,22 +138,41 @@ try { const parsedMessageToDevice = JSON.parse(decrypted); + if (!userActionP2PMessageValidator.is(parsedMessageToDevice)) { + return; + } + const userActionMessage: UserActionP2PMessage = + parsedMessageToDevice; + if ( - !secondaryDeviceLogoutP2PMessageValidator.is( - parsedMessageToDevice, - ) + userActionMessage.type === + userActionsP2PMessageTypes.LOG_OUT_PRIMARY_DEVICE ) { - return; + console.log( + 'Received primary device logout message from', + message.senderInfo.deviceID, + ); + } else if ( + userActionMessage.type === + userActionsP2PMessageTypes.LOG_OUT_SECONDARY_DEVICE + ) { + const { userID, deviceID: deviceIDToLogOut } = message.senderInfo; + await removeDeviceFromDeviceList( + identityClient, + userID, + deviceIDToLogOut, + ); + await broadcastDeviceListUpdates( + allPeerDevices.filter( + deviceID => deviceID !== deviceIDToLogOut, + ), + ); + } else { + console.warn( + 'Unsupported P2P user action message:', + userActionMessage.type, + ); } - const { userID, deviceID: deviceIDToLogOut } = message.senderInfo; - await removeDeviceFromDeviceList( - identityClient, - userID, - deviceIDToLogOut, - ); - await broadcastDeviceListUpdates( - allPeerDevices.filter(deviceID => deviceID !== deviceIDToLogOut), - ); } catch (e) { console.log(e); } diff --git a/lib/types/tunnelbroker/user-actions-peer-to-peer-message-types.js b/lib/types/tunnelbroker/user-actions-peer-to-peer-message-types.js --- a/lib/types/tunnelbroker/user-actions-peer-to-peer-message-types.js +++ b/lib/types/tunnelbroker/user-actions-peer-to-peer-message-types.js @@ -1,13 +1,22 @@ // @flow -import type { TInterface } from 'tcomb'; +import t, { type TInterface, type TUnion } from 'tcomb'; import { tShape, tString } from '../../utils/validation-utils.js'; export const userActionsP2PMessageTypes = Object.freeze({ + LOG_OUT_PRIMARY_DEVICE: 'LOG_OUT_PRIMARY_DEVICE', LOG_OUT_SECONDARY_DEVICE: 'LOG_OUT_SECONDARY_DEVICE', }); +export type PrimaryDeviceLogoutP2PMessage = { + +type: 'LOG_OUT_PRIMARY_DEVICE', +}; +export const primaryDeviceLogoutP2PMessageValidator: TInterface = + tShape({ + type: tString(userActionsP2PMessageTypes.LOG_OUT_PRIMARY_DEVICE), + }); + export type SecondaryDeviceLogoutP2PMessage = { +type: 'LOG_OUT_SECONDARY_DEVICE', // there is `senderID` so we don't have to add deviceID here @@ -17,7 +26,12 @@ type: tString(userActionsP2PMessageTypes.LOG_OUT_SECONDARY_DEVICE), }); -export type UserActionP2PMessage = SecondaryDeviceLogoutP2PMessage; +export type UserActionP2PMessage = + | PrimaryDeviceLogoutP2PMessage + | SecondaryDeviceLogoutP2PMessage; -export const userActionP2PMessageValidator: TInterface = - secondaryDeviceLogoutP2PMessageValidator; +export const userActionP2PMessageValidator: TUnion = + t.union([ + primaryDeviceLogoutP2PMessageValidator, + secondaryDeviceLogoutP2PMessageValidator, + ]);