fix profile updates when flag is set (do not drop message)

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

@ -23,7 +23,7 @@ function MessageReceiver() {
// bind events // bind events
lokiPublicChatAPI.on( lokiPublicChatAPI.on(
'publicMessage', 'publicMessage',
window.NewReceiver.handleUnencryptedMessage window.NewReceiver.handlePublicMessage
); );
openGroupBound = true; openGroupBound = true;
} }

@ -297,9 +297,13 @@ export async function handleDataMessage(
const message = await processDecrypted(envelope, dataMessage); const message = await processDecrypted(envelope, dataMessage);
const ourPubKey = window.textsecure.storage.user.getNumber(); const ourPubKey = window.textsecure.storage.user.getNumber();
const source = envelope.source;
const senderPubKey = envelope.senderIdentity || envelope.source; const senderPubKey = envelope.senderIdentity || envelope.source;
const isMe = senderPubKey === ourPubKey; const isMe = senderPubKey === ourPubKey;
const conversation = ConversationController.getInstance().get(senderPubKey); const senderConversation = await ConversationController.getInstance().getOrCreateAndWait(
senderPubKey,
'private'
);
const { UNPAIRING_REQUEST } = SignalService.DataMessage.Flags; const { UNPAIRING_REQUEST } = SignalService.DataMessage.Flags;
@ -311,18 +315,22 @@ export async function handleDataMessage(
} }
// Check if we need to update any profile names // Check if we need to update any profile names
if (!isMe && conversation && message.profile) { if (!isMe && senderConversation && message.profile) {
await updateProfile(conversation, message.profile, message.profileKey); await updateProfile(
senderConversation,
message.profile,
message.profileKey
);
} }
if (isMessageEmpty(message)) { if (isMessageEmpty(message)) {
window.log.warn(`Message ${getEnvelopeId(envelope)} ignored; it was empty`); window.log.warn(`Message ${getEnvelopeId(envelope)} ignored; it was empty`);
return removeFromCache(envelope); return removeFromCache(envelope);
} }
const source = envelope.senderIdentity || senderPubKey; const ownDevice = await MultiDeviceProtocol.isOurDevice(senderPubKey);
const ownDevice = await MultiDeviceProtocol.isOurDevice(source);
const ownMessage = conversation?.isMediumGroup() && ownDevice; const sourceConversation = ConversationController.getInstance().get(source);
const ownMessage = sourceConversation?.isMediumGroup() && ownDevice;
const ev: any = {}; const ev: any = {};
if (ownMessage) { if (ownMessage) {
@ -342,7 +350,7 @@ export async function handleDataMessage(
ev.confirm = () => removeFromCache(envelope); ev.confirm = () => removeFromCache(envelope);
ev.data = { ev.data = {
source, source: senderPubKey,
sourceDevice: envelope.sourceDevice, sourceDevice: envelope.sourceDevice,
timestamp: _.toNumber(envelope.timestamp), timestamp: _.toNumber(envelope.timestamp),
receivedAt: envelope.receivedAt, receivedAt: envelope.receivedAt,
@ -599,20 +607,14 @@ export async function handleMessageEvent(event: MessageEvent): Promise<void> {
? ConversationType.GROUP ? ConversationType.GROUP
: ConversationType.PRIVATE; : ConversationType.PRIVATE;
const { PROFILE_KEY_UPDATE } = SignalService.DataMessage.Flags;
// tslint:disable-next-line: no-bitwise
const isProfileUpdate = Boolean(message.flags & PROFILE_KEY_UPDATE);
let conversationId = isIncoming ? source : destination; let conversationId = isIncoming ? source : destination;
if (isProfileUpdate) { if (message.profileKey?.length) {
await handleProfileUpdate( await handleProfileUpdate(
message.profileKey, message.profileKey,
conversationId, conversationId,
type, type,
isIncoming isIncoming
); );
confirm();
return;
} }
const msg = createMessage(data, isIncoming); const msg = createMessage(data, isIncoming);

@ -276,7 +276,7 @@ async function handleDecryptedEnvelope(
} }
} }
export async function handleUnencryptedMessage({ message: outerMessage }: any) { export async function handlePublicMessage({ message: outerMessage }: any) {
const { source } = outerMessage; const { source } = outerMessage;
const { group, profile, profileKey } = outerMessage.message; const { group, profile, profileKey } = outerMessage.message;
@ -295,9 +295,15 @@ export async function handleUnencryptedMessage({ message: outerMessage }: any) {
const isPublicChatMessage = const isPublicChatMessage =
group && group.id && !!group.id.match(/^publicChat:/); group && group.id && !!group.id.match(/^publicChat:/);
if (!isPublicChatMessage) {
throw new Error(
'handlePublicMessage Should only be called with public message groups'
);
}
const ev = { const ev = {
// Public chat messages from ourselves should be outgoing // Public chat messages from ourselves should be outgoing
type: isPublicChatMessage && isOurDevice ? 'sent' : 'message', type: isOurDevice ? 'sent' : 'message',
data: outerMessage, data: outerMessage,
confirm: () => { confirm: () => {
/* do nothing */ /* do nothing */

Loading…
Cancel
Save