remove all ratchet when needed to get fresh senderKey from members

pull/1364/head
Audric Ackermann 5 years ago
parent 5d7d66f65a
commit e0e0830d3b
No known key found for this signature in database
GPG Key ID: 999F434D76324AD4

@ -171,6 +171,7 @@ module.exports = {
getSenderKeys, getSenderKeys,
createOrUpdateSenderKeys, createOrUpdateSenderKeys,
removeAllClosedGroupRatchets,
}; };
function generateUUID() { function generateUUID() {
@ -923,6 +924,12 @@ async function createOrUpdateSenderKeys(data) {
); );
} }
async function removeAllClosedGroupRatchets(groupId) {
await db.run(`DELETE FROM ${SENDER_KEYS_TABLE} WHERE groupId = $groupId;`, {
$groupId: groupId,
});
}
async function updateToLokiSchemaVersion4(currentVersion, instance) { async function updateToLokiSchemaVersion4(currentVersion, instance) {
if (currentVersion >= 4) { if (currentVersion >= 4) {
return; return;

@ -412,3 +412,4 @@ export function getMessagesWithFileAttachments(
// Sender Keys // Sender Keys
export function getSenderKeys(groupId: any, senderIdentity: any): Promise<any>; export function getSenderKeys(groupId: any, senderIdentity: any): Promise<any>;
export function createOrUpdateSenderKeys(data: any): Promise<void>; export function createOrUpdateSenderKeys(data: any): Promise<void>;
export function removeAllClosedGroupRatchets(groupId: string): Promise<void>;

@ -196,6 +196,7 @@ module.exports = {
getSenderKeys, getSenderKeys,
createOrUpdateSenderKeys, createOrUpdateSenderKeys,
removeAllClosedGroupRatchets,
}; };
function init() { function init() {
@ -704,6 +705,10 @@ async function createOrUpdateSenderKeys(data) {
await channels.createOrUpdateSenderKeys(data); await channels.createOrUpdateSenderKeys(data);
} }
async function removeAllClosedGroupRatchets(groupId) {
await channels.removeAllClosedGroupRatchets(groupId);
}
// Sessions // Sessions
async function createOrUpdateSession(data) { async function createOrUpdateSession(data) {

@ -307,12 +307,7 @@ export class LeftPaneMessageSection extends React.Component<Props, State> {
onButtonClick={async ( onButtonClick={async (
groupName: string, groupName: string,
groupMembers: Array<ContactType> groupMembers: Array<ContactType>
) => ) => this.onCreateClosedGroup(groupName, groupMembers)}
this.onCreateClosedGroup(
groupName,
groupMembers
)
}
searchTerm={searchTerm} searchTerm={searchTerm}
updateSearch={this.updateSearchBound} updateSearch={this.updateSearchBound}
showSpinner={loading} showSpinner={loading}
@ -497,13 +492,9 @@ export class LeftPaneMessageSection extends React.Component<Props, State> {
groupName: string, groupName: string,
groupMembers: Array<ContactType> groupMembers: Array<ContactType>
) { ) {
await MainViewController.createClosedGroup( await MainViewController.createClosedGroup(groupName, groupMembers, () => {
groupName,
groupMembers,
() => {
this.handleToggleOverlay(undefined); this.handleToggleOverlay(undefined);
} });
);
} }
private handleNewSessionButtonClick() { private handleNewSessionButtonClick() {

@ -19,7 +19,6 @@ import { BlockedNumberController } from '../util/blockedNumberController';
import { decryptWithSenderKey } from '../session/medium_group/ratchet'; import { decryptWithSenderKey } from '../session/medium_group/ratchet';
import { StringUtils } from '../session/utils'; import { StringUtils } from '../session/utils';
import { UserUtil } from '../util'; import { UserUtil } from '../util';
import { getMessageQueue } from '../session';
export async function handleContentMessage(envelope: EnvelopePlus) { export async function handleContentMessage(envelope: EnvelopePlus) {
try { try {
@ -310,7 +309,7 @@ async function decrypt(
const requestKeysMessage = new MediumGroupRequestKeysMessage(params); const requestKeysMessage = new MediumGroupRequestKeysMessage(params);
const sender = new PubKey(senderIdentity); const sender = new PubKey(senderIdentity);
void getMessageQueue().send(sender, requestKeysMessage); void libsession.getMessageQueue().send(sender, requestKeysMessage);
return; return;
} }

@ -279,10 +279,7 @@ export async function handleDataMessage(
envelope: EnvelopePlus, envelope: EnvelopePlus,
dataMessage: SignalService.IDataMessage dataMessage: SignalService.IDataMessage
): Promise<void> { ): Promise<void> {
window.log.info( window.log.info('data message from', getEnvelopeId(envelope));
'data message from',
getEnvelopeId(envelope)
);
if (dataMessage.mediumGroupUpdate) { if (dataMessage.mediumGroupUpdate) {
await handleMediumGroupUpdate(envelope, dataMessage.mediumGroupUpdate); await handleMediumGroupUpdate(envelope, dataMessage.mediumGroupUpdate);

@ -13,7 +13,10 @@ import { BufferType } from '../session/utils/String';
import { MultiDeviceProtocol } from '../session/protocols'; import { MultiDeviceProtocol } from '../session/protocols';
import { ConversationModel } from '../../js/models/conversations'; import { ConversationModel } from '../../js/models/conversations';
import { UserUtil } from '../util'; import { UserUtil } from '../util';
import { RatchetState } from '../session/medium_group/senderKeys'; import {
createSenderKeyForGroup,
RatchetState,
} from '../session/medium_group/senderKeys';
const toHex = (d: BufferType) => StringUtils.decode(d, 'hex'); const toHex = (d: BufferType) => StringUtils.decode(d, 'hex');
const fromHex = (d: string) => StringUtils.encode(d, 'hex'); const fromHex = (d: string) => StringUtils.encode(d, 'hex');
@ -344,6 +347,18 @@ async function handleMediumGroupChange(
await convo.commit(); await convo.commit();
if (diff.leavingMembers && diff.leavingMembers.length > 0) {
// Send out the user's new ratchet to all members (minus the removed ones) using established channels
const userSenderKey = await createSenderKeyForGroup(groupId, primary);
window.log.warn(
'Sharing our new senderKey with remainingMembers via message',
members,
userSenderKey
);
await shareSenderKeys(groupId, members, userSenderKey);
}
await removeFromCache(envelope); await removeFromCache(envelope);
} }

@ -641,7 +641,8 @@ async function sendGroupUpdateForMedium(
getMessageQueue().events.addListener('success', async message => { getMessageQueue().events.addListener('success', async message => {
if (message.identifier === params.identifier) { if (message.identifier === params.identifier) {
// console.log('Our first message encrypted with old sk is sent.'); // console.log('Our first message encrypted with old sk is sent.');
// TODO Delete all ratchets (it's important that this happens * after * sending out the update) // Delete all ratchets (it's important that this happens * after * sending out the update)
await Data.removeAllClosedGroupRatchets(groupId);
if (isUserLeaving) { if (isUserLeaving) {
// nothing to do on desktop // nothing to do on desktop
} else { } else {

@ -20,7 +20,8 @@ async function queueJobForNumber(number: string, runJob: any) {
// tslint:disable-next-line no-dynamic-delete // tslint:disable-next-line no-dynamic-delete
delete jobQueue[number]; delete jobQueue[number];
} }
}).catch((e: any) => { })
.catch((e: any) => {
window.log.error('queueJobForNumber() Caught error', e); window.log.error('queueJobForNumber() Caught error', e);
}); });
return runCurrent; return runCurrent;

Loading…
Cancel
Save