From 34ecc5a75148dff7fb2517828a8c1f7b3ffeeb30 Mon Sep 17 00:00:00 2001 From: Vincent Date: Thu, 21 May 2020 13:55:28 +1000 Subject: [PATCH] Finalisation; working FRs from secondary; --- libtextsecure/message_receiver.js | 39 +++++++++++++++++++ .../session/LeftPaneMessageSection.tsx | 2 +- ts/state/selectors/conversations.ts | 17 ++++---- 3 files changed, 50 insertions(+), 8 deletions(-) diff --git a/libtextsecure/message_receiver.js b/libtextsecure/message_receiver.js index de913df47..ef34a500d 100644 --- a/libtextsecure/message_receiver.js +++ b/libtextsecure/message_receiver.js @@ -1045,6 +1045,45 @@ MessageReceiver.prototype.extend({ return this.handlePairingRequest(envelope, pairingAuthorisation); }, + async handleSecondaryDeviceFriendRequest(pubKey, deviceMapping) { + if (!deviceMapping) { + return false; + } + // Only handle secondary pubkeys + if (deviceMapping.isPrimary === '1' || !deviceMapping.authorisations) { + return false; + } + const { authorisations } = deviceMapping; + // Secondary devices should only have 1 authorisation from a primary device + if (authorisations.length !== 1) { + return false; + } + const authorisation = authorisations[0]; + if (!authorisation) { + return false; + } + if (!authorisation.grantSignature) { + return false; + } + const isValid = await libloki.crypto.validateAuthorisation(authorisation); + if (!isValid) { + return false; + } + const correctSender = pubKey === authorisation.secondaryDevicePubKey; + if (!correctSender) { + return false; + } + const { primaryDevicePubKey } = authorisation; + // ensure the primary device is a friend + const c = window.ConversationController.get(primaryDevicePubKey); + if (!c || await !c.isFriendWithAnyDevice()) { + return false; + } + await libloki.storage.savePairingAuthorisation(authorisation); + + return true; + }, + async updateProfile(conversation, profile, profileKey) { // Retain old values unless changed: const newProfile = conversation.get('profile') || {}; diff --git a/ts/components/session/LeftPaneMessageSection.tsx b/ts/components/session/LeftPaneMessageSection.tsx index 11f683ef9..14ac3a709 100644 --- a/ts/components/session/LeftPaneMessageSection.tsx +++ b/ts/components/session/LeftPaneMessageSection.tsx @@ -97,7 +97,7 @@ export class LeftPaneMessageSection extends React.Component { if (conversationList !== undefined) { conversationList = conversationList.filter( conversation => - !conversation.isPendingFriendRequest + !conversation.isPendingFriendRequest && !conversation.isSecondary ); } diff --git a/ts/state/selectors/conversations.ts b/ts/state/selectors/conversations.ts index 3ed5638b4..1f3b5174d 100644 --- a/ts/state/selectors/conversations.ts +++ b/ts/state/selectors/conversations.ts @@ -129,7 +129,11 @@ export const _getLeftPaneLists = ( } if (conversation.hasReceivedFriendRequest) { - allReceivedFriendsRequest.push(conversation); + // Friend requests should always appear as coming from primary + const primaryConversation = conversations.find(c => c.id === conversation.primaryDevice) || conversation; + primaryConversation.hasReceivedFriendRequest = conversation.hasReceivedFriendRequest; + primaryConversation.isPendingFriendRequest = conversation.isPendingFriendRequest; + allReceivedFriendsRequest.push(primaryConversation); } else if ( unreadCount < 9 && conversation.isFriend && @@ -160,28 +164,28 @@ export const _getLeftPaneLists = ( group: Array ): T => { const secondariesToRemove: Array = []; + group.forEach(device => { if (!device.isSecondary) { return; } const devicePrimary = group.find(c => c.id === device.primaryDevice); + // Remove secondary where primary already exists in group if (group.some(c => c === devicePrimary)) { secondariesToRemove.push(device.id); } + }); - // tslint:disable-next-line: no-unnecessary-local-variable - const filteredGroup = group.filter( + const filteredGroup = [...new Set(group.filter( c => !secondariesToRemove.find(s => s === c.id) - ); + ))]; return filteredGroup as T; }; - - const friends: Array = filterToPrimary(allFriends); const receivedFriendsRequest: Array< ConversationListItemPropsType @@ -200,7 +204,6 @@ export const _getLeftPaneLists = ( - return { conversations, archivedConversations,