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 @@ -8,6 +8,7 @@ import { logOutActionTypes, useLogOut } from '../actions/user-actions.js'; import { useBroadcastDeviceListUpdates, + useBroadcastAccountDeletion, useGetAndUpdateDeviceListsForUsers, } from '../hooks/peer-list-hooks.js'; import { @@ -43,13 +44,22 @@ // is already handled by the primary device const primaryRequestLogoutOptions = Object.freeze({ skipIdentityLogOut: true }); +// When re-broadcasting, we want to do it only to foreign peers +// to avoid a vicious circle of deletion messages sent by own devices. +const accountDeletionBroadcastOptions = Object.freeze({ + broadcastToOwnDevices: false, +}); + // handles `peerToPeerMessageTypes.ENCRYPTED_MESSAGE` function useHandleOlmMessageToDevice() { const identityContext = React.useContext(IdentityClientContext); invariant(identityContext, 'Identity context should be set'); - const { identityClient } = identityContext; + const { identityClient, getAuthMetadata } = identityContext; const broadcastDeviceListUpdates = useBroadcastDeviceListUpdates(); + const reBroadcastAccountDeletion = useBroadcastAccountDeletion( + accountDeletionBroadcastOptions, + ); const allPeerDevices = useSelector(getAllPeerDevices); const dispatchActionPromise = useDispatchActionPromise(); @@ -92,6 +102,25 @@ userActionMessage.type === userActionsP2PMessageTypes.DM_OPERATION ) { await processDMOperation(userActionMessage.op); + } else if ( + userActionMessage.type === userActionsP2PMessageTypes.ACCOUNT_DELETION + ) { + const { userID: thisUserID } = await getAuthMetadata(); + if (!thisUserID) { + return; + } + // own devices re-broadcast account deletion to foreign peer devices + if (senderInfo.userID === thisUserID) { + await reBroadcastAccountDeletion(); + // we treat account deletion the same way as primary-device-requested + // logout + void dispatchActionPromise( + logOutActionTypes, + primaryDeviceRequestedLogOut(), + ); + } else { + // TODO: update peer list + } } else { console.warn( 'Unsupported P2P user action message:', @@ -103,9 +132,11 @@ allPeerDevices, broadcastDeviceListUpdates, dispatchActionPromise, + getAuthMetadata, identityClient, primaryDeviceRequestedLogOut, processDMOperation, + reBroadcastAccountDeletion, ], ); }