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,
createOrUpdateSenderKeys,
removeAllClosedGroupRatchets,
};
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) {
if (currentVersion >= 4) {
return;

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

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

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

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

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

@ -13,7 +13,10 @@ import { BufferType } from '../session/utils/String';
import { MultiDeviceProtocol } from '../session/protocols';
import { ConversationModel } from '../../js/models/conversations';
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 fromHex = (d: string) => StringUtils.encode(d, 'hex');
@ -344,6 +347,18 @@ async function handleMediumGroupChange(
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);
}

@ -641,7 +641,8 @@ async function sendGroupUpdateForMedium(
getMessageQueue().events.addListener('success', async message => {
if (message.identifier === params.identifier) {
// 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) {
// nothing to do on desktop
} else {

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

Loading…
Cancel
Save