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;
} catch (error) {
if (
error &&
(error instanceof textsecure.SenderKeyMissing ||
error instanceof DOMException)
) {
if (error && error instanceof textsecure.SenderKeyMissing) {
const groupId = envelope.source;
const { senderIdentity } = error;
if (senderIdentity) {

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

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

@ -2,6 +2,8 @@ import { PubKey } from '../types';
import * as Data from '../../../js/modules/data';
import { saveSenderKeysInner } from './index';
import { StringUtils } from '../utils';
import { MediumGroupRequestKeysMessage } from '../messages/outgoing';
import { getMessageQueue } from '..';
const toHex = (buffer: ArrayBuffer) => StringUtils.decode(buffer, '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);
// I probably want a better error handling than this
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;
@ -269,11 +276,19 @@ async function decryptWithSenderKeyInner(
return null;
}
// TODO: this might fail, handle this
const plaintext = await window.libloki.crypto.DecryptGCM(
messageKey,
ciphertext
);
return plaintext;
try {
const plaintext = await window.libloki.crypto.DecryptGCM(
messageKey,
ciphertext
);
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) {
this.groupPubkeys.push(pubkey);
if (this.groupPubkeys.findIndex(m => m.key === pubkey.key) === -1) {
this.groupPubkeys.push(pubkey);
}
}
public addPubkey(pk: PubKey | string) {
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) {

Loading…
Cancel
Save