fix: delete messages on group delete (after leaveMsg sent)

pull/3281/head
Audric Ackermann 5 months ago
parent 17deaf42c0
commit aa8c8a2ad8
No known key found for this signature in database

@ -293,10 +293,11 @@ class ConvoController {
// this is caught and is adding an interaction notification message
throw new Error('Failed to send our leaving message to 03 group');
}
// now that we know we've sent the leave message, delete any remaining messages
await this.deleteConvoInitialChecks(groupPk, 'Group', false);
}
// now that we know we've sent the leave message, delete any remaining messages
await this.deleteConvoInitialChecks(groupPk, 'Group', false);
// a group 03 can be removed fully or kept empty as kicked.
// when it was pendingInvite, we delete it fully,
// when it was not, we empty the group but keep it with the "you have been kicked" message
@ -330,49 +331,59 @@ class ConvoController {
}
}
} else {
// Let's check if we still have a MetaGroupWrapper for this group. If we don't we won't be able to do anything..
let metaGroupWrapperExists = false;
try {
const us = UserUtils.getOurPubKeyStrFromCache();
const allMembers = await MetaGroupWrapperActions.memberGetAll(groupPk);
const otherAdminsCount = allMembers
.filter(m => m.nominatedAdmin)
.filter(m => m.pubkeyHex !== us).length;
const weAreLastAdmin = otherAdminsCount === 0;
const infos = await MetaGroupWrapperActions.infoGet(groupPk);
const fromUserGroup = await UserGroupsWrapperActions.getGroup(groupPk);
if (!infos || !fromUserGroup || isEmpty(infos) || isEmpty(fromUserGroup)) {
throw new Error('deleteGroup: some required data not present');
}
const { secretKey } = fromUserGroup;
// check if we are the last admin
if (secretKey && !isEmpty(secretKey) && (weAreLastAdmin || forceDestroyForAllMembers)) {
const deleteAllMessagesSubRequest = deleteAllMessagesOnSwarm
? new DeleteAllFromGroupMsgNodeSubRequest({
groupPk,
secretKey,
})
: undefined;
// this marks the group info as deleted. We need to push those details
await MetaGroupWrapperActions.infoDestroy(groupPk);
const lastPushResult = await GroupSync.pushChangesToGroupSwarmIfNeeded({
groupPk,
deleteAllMessagesSubRequest,
extraStoreRequests: [],
});
await LibSessionUtil.saveDumpsToDb(groupPk);
if (lastPushResult !== RunJobResult.Success) {
throw new Error(`Failed to destroyGroupDetails for pk ${ed25519Str(groupPk)}`);
await MetaGroupWrapperActions.infoGet(groupPk);
metaGroupWrapperExists = true;
} catch {
window.log.warn(`deleteGroup: MetaGroupWrapperActions for ${groupPk} does not exist.`);
}
if (metaGroupWrapperExists) {
try {
const us = UserUtils.getOurPubKeyStrFromCache();
const allMembers = await MetaGroupWrapperActions.memberGetAll(groupPk);
const otherAdminsCount = allMembers
.filter(m => m.nominatedAdmin)
.filter(m => m.pubkeyHex !== us).length;
const weAreLastAdmin = otherAdminsCount === 0;
const infos = await MetaGroupWrapperActions.infoGet(groupPk);
const fromUserGroup = await UserGroupsWrapperActions.getGroup(groupPk);
if (!infos || !fromUserGroup || isEmpty(infos) || isEmpty(fromUserGroup)) {
throw new Error('deleteGroup: some required data not present');
}
const { secretKey } = fromUserGroup;
// check if we are the last admin
if (secretKey && !isEmpty(secretKey) && (weAreLastAdmin || forceDestroyForAllMembers)) {
const deleteAllMessagesSubRequest = deleteAllMessagesOnSwarm
? new DeleteAllFromGroupMsgNodeSubRequest({
groupPk,
secretKey,
})
: undefined;
// this marks the group info as deleted. We need to push those details
await MetaGroupWrapperActions.infoDestroy(groupPk);
const lastPushResult = await GroupSync.pushChangesToGroupSwarmIfNeeded({
groupPk,
deleteAllMessagesSubRequest,
extraStoreRequests: [],
});
await LibSessionUtil.saveDumpsToDb(groupPk);
if (lastPushResult !== RunJobResult.Success) {
throw new Error(`Failed to destroyGroupDetails for pk ${ed25519Str(groupPk)}`);
}
}
} catch (e) {
// if that group was already freed this will happen.
// we still want to delete it entirely though
window.log.warn(
`deleteGroup: MetaGroupWrapperActions failed with: ${e.message}... Keeping it as this should be a retryable error`
);
throw e;
}
} catch (e) {
// if that group was already freed this will happen.
// we still want to delete it entirely though
window.log.warn(
`deleteGroup: MetaGroupWrapperActions failed with: ${e.message}... Keeping it as this should be a retryable error`
);
throw e;
}
// this deletes the secretKey if we had it. If we need it for something, it has to be done before this call.

Loading…
Cancel
Save