Merge pull request #1370 from Bilb/fix-medium-groups

pull/1373/head
Audric Ackermann 5 years ago committed by GitHub
commit 7a8a22701b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -287,11 +287,7 @@ async function decrypt(
return plaintext; return plaintext;
} catch (error) { } catch (error) {
if ( if (error && error instanceof textsecure.SenderKeyMissing) {
error &&
(error instanceof textsecure.SenderKeyMissing ||
error instanceof DOMException)
) {
const groupId = envelope.source; const groupId = envelope.source;
const { senderIdentity } = error; const { senderIdentity } = error;
if (senderIdentity) { if (senderIdentity) {

@ -337,6 +337,8 @@ async function handleMediumGroupChange(
// Enable typing: // Enable typing:
maybeConvo.set('isKickedFromGroup', false); maybeConvo.set('isKickedFromGroup', false);
maybeConvo.set('left', false); maybeConvo.set('left', false);
// Subscribe to this group id
window.SwarmPolling.addGroupId(new PubKey(groupId));
maybeConvo.updateTextInputState(); maybeConvo.updateTextInputState();
} }
} }
@ -348,8 +350,7 @@ async function handleMediumGroupChange(
const userSenderKey = await createSenderKeyForGroup(groupId, primary); const userSenderKey = await createSenderKeyForGroup(groupId, primary);
window.log.warn( window.log.warn(
'Sharing our new senderKey with remainingMembers via message', 'Sharing our new senderKey with remainingMembers via message',
members, members
userSenderKey
); );
await shareSenderKeys(groupId, members, userSenderKey); await shareSenderKeys(groupId, members, userSenderKey);

@ -269,26 +269,14 @@ async function getExistingSenderKeysForGroup(
// as they each member need to regenerate a new senderkey // as they each member need to regenerate a new senderkey
async function getOrUpdateSenderKeysForJoiningMembers( async function getOrUpdateSenderKeysForJoiningMembers(
groupId: string, groupId: string,
members: Array<string>, members: Array<string>
diff?: GroupDiff,
joiningMembersSenderKeys?: Array<RatchetState>
): Promise<Array<RatchetState>> { ): Promise<Array<RatchetState>> {
const leavingMembers = diff?.leavingMembers || [];
const joiningMembers = diff?.joiningMembers || [];
const existingMembers = _.difference(members, joiningMembers);
// get all devices for members // get all devices for members
const allDevices = _.flatten( const allDevices = _.flatten(
await Promise.all( await Promise.all(members.map(m => MultiDeviceProtocol.getAllDevices(m)))
existingMembers.map(m => MultiDeviceProtocol.getAllDevices(m))
)
); );
let existingKeys: Array<RatchetState> = []; return getExistingSenderKeysForGroup(groupId, allDevices);
if (leavingMembers.length === 0) {
existingKeys = await getExistingSenderKeysForGroup(groupId, allDevices);
}
return _.union(joiningMembersSenderKeys, existingKeys);
} }
async function getGroupSecretKey(groupId: string): Promise<Uint8Array> { async function getGroupSecretKey(groupId: string): Promise<Uint8Array> {

@ -2,6 +2,8 @@ import { PubKey } from '../types';
import * as Data from '../../../js/modules/data'; import * as Data from '../../../js/modules/data';
import { saveSenderKeysInner } from './index'; import { saveSenderKeysInner } from './index';
import { StringUtils } from '../utils'; import { StringUtils } from '../utils';
import { MediumGroupRequestKeysMessage } from '../messages/outgoing';
import { getMessageQueue } from '..';
const toHex = (buffer: ArrayBuffer) => StringUtils.decode(buffer, 'hex'); const toHex = (buffer: ArrayBuffer) => StringUtils.decode(buffer, 'hex');
const fromHex = (hex: string) => StringUtils.encode(hex, 'hex'); const fromHex = (hex: string) => StringUtils.encode(hex, 'hex');
@ -202,6 +204,11 @@ async function advanceRatchet(
log.error('[idx] not found key for idx: ', idx); log.error('[idx] not found key for idx: ', idx);
// I probably want a better error handling than this // I probably want a better error handling than this
return null; return null;
} else if (idx === ratchet.keyIdx) {
log.error(
`advanceRatchet() called with idx:${idx}, current ratchetIdx:${ratchet.keyIdx}. We already burnt that keyIdx before.`
);
return null;
} }
const { messageKeys } = ratchet; const { messageKeys } = ratchet;
@ -269,11 +276,19 @@ async function decryptWithSenderKeyInner(
return null; return null;
} }
// TODO: this might fail, handle this try {
const plaintext = await window.libloki.crypto.DecryptGCM( const plaintext = await window.libloki.crypto.DecryptGCM(
messageKey, messageKey,
ciphertext ciphertext
); );
return plaintext;
return plaintext; } catch (e) {
window.log.error('Got error during DecryptGCM()', e);
if (e instanceof DOMException) {
window.log.error(
'Got DOMException during DecryptGCM(). Rethrowing as SenderKeyMissing '
);
throw new window.textsecure.SenderKeyMissing(senderIdentity);
}
}
} }

@ -51,12 +51,16 @@ export class SwarmPolling {
} }
public addGroupId(pubkey: PubKey) { public addGroupId(pubkey: PubKey) {
this.groupPubkeys.push(pubkey); if (this.groupPubkeys.findIndex(m => m.key === pubkey.key) === -1) {
this.groupPubkeys.push(pubkey);
}
} }
public addPubkey(pk: PubKey | string) { public addPubkey(pk: PubKey | string) {
const pubkey = PubKey.cast(pk); const pubkey = PubKey.cast(pk);
this.pubkeys.push(pubkey); if (this.pubkeys.findIndex(m => m.key === pubkey.key) === -1) {
this.pubkeys.push(pubkey);
}
} }
public removePubkey(pk: PubKey | string) { public removePubkey(pk: PubKey | string) {

Loading…
Cancel
Save