do not try to do an unsend request on a group swarm

pull/1986/head
Audric Ackermann 4 years ago
parent 4e4f7a61f1
commit ce16066313
No known key found for this signature in database
GPG Key ID: 999F434D76324AD4

@ -7,6 +7,7 @@ import { ApiV2 } from '../../opengroup/opengroupV2';
import { getMessageQueue } from '../../session'; import { getMessageQueue } from '../../session';
import { getConversationController } from '../../session/conversations'; import { getConversationController } from '../../session/conversations';
import { UnsendMessage } from '../../session/messages/outgoing/controlMessage/UnsendMessage'; import { UnsendMessage } from '../../session/messages/outgoing/controlMessage/UnsendMessage';
import { ed25519Str } from '../../session/onions/onionPath';
import { networkDeleteMessages } from '../../session/snode_api/SNodeAPI'; import { networkDeleteMessages } from '../../session/snode_api/SNodeAPI';
import { PubKey } from '../../session/types'; import { PubKey } from '../../session/types';
import { ToastUtils, UserUtils } from '../../session/utils'; import { ToastUtils, UserUtils } from '../../session/utils';
@ -51,11 +52,12 @@ async function unsendMessagesForEveryone(
} else if (conversation.isClosedGroup()) { } else if (conversation.isClosedGroup()) {
// sending to recipient all the messages separately for now // sending to recipient all the messages separately for now
await Promise.all( await Promise.all(
unsendMsgObjects.map(unsendObject => unsendMsgObjects.map(unsendObject => {
console.warn('sending unsend message', unsendObject);
getMessageQueue() getMessageQueue()
.sendToGroup(unsendObject, undefined, new PubKey(destinationId)) .sendToGroup(unsendObject, undefined, new PubKey(destinationId))
.catch(window?.log?.error) .catch(window?.log?.error);
) })
); );
} }
await deleteMessagesFromSwarmAndCompletelyLocally(conversation, msgsToDelete); await deleteMessagesFromSwarmAndCompletelyLocally(conversation, msgsToDelete);
@ -92,18 +94,24 @@ function getUnsendMessagesObjects(messages: Array<MessageModel>) {
* Do a single request to the swarm with all the message hashes to delete from the swarm. * Do a single request to the swarm with all the message hashes to delete from the swarm.
* *
* It does not delete anything locally. * It does not delete anything locally.
*
* Returns true if no errors happened, false in an error happened
*/ */
export async function deleteMessagesFromSwarmOnly(messages: Array<MessageModel>) { export async function deleteMessagesFromSwarmOnly(messages: Array<MessageModel>) {
try { try {
const deletionMessageHashes = _.compact(messages.map(m => m.get('messageHash'))); const deletionMessageHashes = _.compact(messages.map(m => m.get('messageHash')));
if (deletionMessageHashes.length > 0) { if (deletionMessageHashes.length > 0) {
await networkDeleteMessages(deletionMessageHashes); const errorOnSnode = await networkDeleteMessages(deletionMessageHashes);
return errorOnSnode === null || errorOnSnode.length === 0;
} }
window.log?.warn(
'deleteMessagesFromSwarmOnly: We do not have hashes for some of those messages'
);
return false;
} catch (e) { } catch (e) {
window.log?.error('Error deleting message from swarm', e); window.log?.error('deleteMessagesFromSwarmOnly: Error deleting message from swarm', e);
return false; return false;
} }
return true;
} }
/** /**
@ -114,10 +122,25 @@ export async function deleteMessagesFromSwarmAndCompletelyLocally(
conversation: ConversationModel, conversation: ConversationModel,
messages: Array<MessageModel> messages: Array<MessageModel>
) { ) {
if (conversation.isMediumGroup()) {
window.log.info('Cannot delete message from a closed group swarm, so we just complete delete.');
await Promise.all(
messages.map(async message => {
return deleteMessageLocallyOnly({ conversation, message, deletionType: 'complete' });
})
);
return;
}
window.log.warn(
'Deleting from swarm of ',
ed25519Str(conversation.id),
' hashes: ',
messages.map(m => m.get('messageHash'))
);
const deletedFromSwarm = await deleteMessagesFromSwarmOnly(messages); const deletedFromSwarm = await deleteMessagesFromSwarmOnly(messages);
if (!deletedFromSwarm) { if (!deletedFromSwarm) {
window.log.warn( window.log.warn(
'deleteMessagesFromSwarmAndCompletelyLocally: some messages failed to be deleted ' 'deleteMessagesFromSwarmAndCompletelyLocally: some messages failed to be deleted. Maybe they were already deleted?'
); );
} }
await Promise.all( await Promise.all(
@ -135,6 +158,15 @@ export async function deleteMessagesFromSwarmAndMarkAsDeletedLocally(
conversation: ConversationModel, conversation: ConversationModel,
messages: Array<MessageModel> messages: Array<MessageModel>
) { ) {
if (conversation.isMediumGroup()) {
window.log.info('Cannot delete messages from a closed group swarm, so we just markDeleted.');
await Promise.all(
messages.map(async message => {
return deleteMessageLocallyOnly({ conversation, message, deletionType: 'markDeleted' });
})
);
return;
}
const deletedFromSwarm = await deleteMessagesFromSwarmOnly(messages); const deletedFromSwarm = await deleteMessagesFromSwarmOnly(messages);
if (!deletedFromSwarm) { if (!deletedFromSwarm) {
window.log.warn( window.log.warn(

@ -16,7 +16,6 @@ import {
export async function removeFromCache(envelope: EnvelopePlus) { export async function removeFromCache(envelope: EnvelopePlus) {
const { id } = envelope; const { id } = envelope;
window?.log?.info(`removing from cache envelope: ${id}`); window?.log?.info(`removing from cache envelope: ${id}`);
return removeUnprocessed(id); return removeUnprocessed(id);
} }

@ -512,16 +512,22 @@ async function handleUnsendMessage(envelope: EnvelopePlus, unsendMessage: Signal
if (!unsendMessage) { if (!unsendMessage) {
//#region early exit conditions //#region early exit conditions
window?.log?.error('handleUnsendMessage: Invalid parameters -- dropping message.'); window?.log?.error('handleUnsendMessage: Invalid parameters -- dropping message.');
await removeFromCache(envelope);
return;
} }
if (!timestamp) { if (!timestamp) {
window?.log?.error('handleUnsendMessage: Invalid timestamp -- dropping message'); window?.log?.error('handleUnsendMessage: Invalid timestamp -- dropping message');
await removeFromCache(envelope);
return;
} }
const messageToDelete = await getMessageBySenderAndTimestamp({ const messageToDelete = await getMessageBySenderAndTimestamp({
source: messageAuthor, source: messageAuthor,
timestamp: Lodash.toNumber(timestamp), timestamp: Lodash.toNumber(timestamp),
}); });
const messageHash = messageToDelete?.getPropsForMessage().messageHash; const messageHash = messageToDelete?.get('messageHash');
//#endregion //#endregion
//#region executing deletion //#region executing deletion
@ -539,6 +545,13 @@ async function handleUnsendMessage(envelope: EnvelopePlus, unsendMessage: Signal
} else { } else {
void deleteMessagesFromSwarmAndMarkAsDeletedLocally(conversation, [messageToDelete]); void deleteMessagesFromSwarmAndMarkAsDeletedLocally(conversation, [messageToDelete]);
} }
} else {
window.log.info(
'handleUnsendMessage: got a request to delete an unknown messageHash:',
messageHash,
' and found messageToDelete:',
messageToDelete?.id
);
} }
await removeFromCache(envelope); await removeFromCache(envelope);

@ -21,7 +21,7 @@ import { getMessageById } from '../../../ts/data/data';
import { SNodeAPI } from '../snode_api'; import { SNodeAPI } from '../snode_api';
import { getConversationController } from '../conversations'; import { getConversationController } from '../conversations';
const DEFAULT_CONNECTIONS = 3; const DEFAULT_CONNECTIONS = 1;
// ================ SNODE STORE ================ // ================ SNODE STORE ================

@ -694,7 +694,9 @@ export const TEST_getMinTimeout = () => 500;
* Locally deletes message and deletes message on the network (all nodes that contain the message) * Locally deletes message and deletes message on the network (all nodes that contain the message)
*/ */
// tslint:disable-next-line: max-func-body-length // tslint:disable-next-line: max-func-body-length
export const networkDeleteMessages = async (hashes: Array<string>): Promise<any> => { export const networkDeleteMessages = async (
hashes: Array<string>,
): Promise<Array<string> | null> => {
const sodium = await getSodium(); const sodium = await getSodium();
const userX25519PublicKey = UserUtils.getOurPubKeyStrFromCache(); const userX25519PublicKey = UserUtils.getOurPubKeyStrFromCache();
@ -778,7 +780,7 @@ export const networkDeleteMessages = async (hashes: Array<string>): Promise<any>
const statusCode = snodeJson.code; const statusCode = snodeJson.code;
if (reason && statusCode) { if (reason && statusCode) {
window?.log?.warn( window?.log?.warn(
`Could not delete data from ${ed25519Str( `Could not delete msgs from ${ed25519Str(
snodeToMakeRequestTo.pubkey_ed25519 snodeToMakeRequestTo.pubkey_ed25519
)} due to error: ${reason}: ${statusCode}` )} due to error: ${reason}: ${statusCode}`
); );
@ -789,8 +791,8 @@ export const networkDeleteMessages = async (hashes: Array<string>): Promise<any>
); );
} }
} else { } else {
window?.log?.warn( window?.log?.info(
`Could not delete data from ${ed25519Str( `Could not delete msgs from ${ed25519Str(
snodeToMakeRequestTo.pubkey_ed25519 snodeToMakeRequestTo.pubkey_ed25519
)}` )}`
); );

Loading…
Cancel
Save