diff --git a/js/models/conversations.js b/js/models/conversations.js index 82035aef9..289b45697 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -653,7 +653,9 @@ await this.respondToAllPendingFriendRequests({ response: 'accepted', }); + return true; } + return false; }, async onFriendRequestTimeout() { // Unset the timer diff --git a/libloki/api.js b/libloki/api.js index a83e90c8e..6c5c8365f 100644 --- a/libloki/api.js +++ b/libloki/api.js @@ -1,27 +1,52 @@ -/* global window, textsecure */ +/* global window, textsecure, log */ // eslint-disable-next-line func-names (function() { window.libloki = window.libloki || {}; async function sendFriendRequestAccepted(pubKey) { - return sendEmptyMessage(pubKey); + return sendEmptyMessage(pubKey, true); } - async function sendEmptyMessage(pubKey) { + async function sendEmptyMessage(pubKey, sendContentMessage = false) { const options = {}; // send an empty message. - // The logic downstream will attach the prekeys and our profile. - await textsecure.messaging.sendMessageToNumber( - pubKey, // number - null, // messageText - [], // attachments - null, // quote - Date.now(), // timestamp - null, // expireTimer - null, // profileKey - options - ); + if (sendContentMessage) { + // The logic downstream will attach the prekeys and our profile. + await textsecure.messaging.sendMessageToNumber( + pubKey, // number + null, // messageText + [], // attachments + null, // quote + Date.now(), // timestamp + null, // expireTimer + null, // profileKey + options + ); + } else { + // empty content message + const content = new textsecure.protobuf.Content(); + + // will be called once the transmission succeeded or failed + const callback = res => { + if (res.errors.length > 0) { + res.errors.forEach(error => log.error(error)); + } else { + log.info('empty message sent successfully'); + } + }; + // send an empty message. The logic in ougoing_message will attach the prekeys. + const outgoingMessage = new textsecure.OutgoingMessage( + null, // server + Date.now(), // timestamp, + [pubKey], // numbers + content, // message + true, // silent + callback, // callback + options + ); + await outgoingMessage.sendToNumber(pubKey); + } } window.libloki.api = { diff --git a/libtextsecure/message_receiver.js b/libtextsecure/message_receiver.js index ade1ee659..313e6c430 100644 --- a/libtextsecure/message_receiver.js +++ b/libtextsecure/message_receiver.js @@ -948,8 +948,17 @@ MessageReceiver.prototype.extend({ ); return this.removeFromCache(envelope); } + if (!message.body) { - return null; + // Trigger conversation friend request event for empty message + if (conversation && !message.flags) { + const isFriendRequestAccept = await conversation.onFriendRequestAccepted(); + if (isFriendRequestAccept) { + await conversation.notifyFriendRequest(envelope.source, 'accepted'); + this.removeFromCache(envelope); + return null; + } + } } const ev = new Event('message'); @@ -1001,7 +1010,7 @@ MessageReceiver.prototype.extend({ if (content.syncMessage) return this.handleSyncMessage(envelope, content.syncMessage); if (content.dataMessage) - await this.handleDataMessage(envelope, content.dataMessage); + return this.handleDataMessage(envelope, content.dataMessage); if (content.nullMessage) return this.handleNullMessage(envelope, content.nullMessage); if (content.callMessage) @@ -1011,19 +1020,6 @@ MessageReceiver.prototype.extend({ if (content.typingMessage) return this.handleTypingMessage(envelope, content.typingMessage); - // Trigger conversation friend request event - if ( - envelope.type === textsecure.protobuf.Envelope.Type.PREKEY_BUNDLE && - (content.dataMessage === null || content.dataMessage.flags === null) - ) { - const conversation = window.ConversationController.get(envelope.source); - if (conversation) { - conversation.onFriendRequestAccepted(); - conversation.notifyFriendRequest(envelope.source, 'accepted'); - } - this.removeFromCache(envelope); - } - return null; }, handleCallMessage(envelope) {