diff --git a/js/libtextsecure.js b/js/libtextsecure.js index 5c175c4f0..8609f6832 100644 --- a/js/libtextsecure.js +++ b/js/libtextsecure.js @@ -38308,6 +38308,30 @@ axolotlInternal.RecipientRecord = function() { }); }, + updateNumbers: function(groupId, numbers) { + return textsecure.storage.axolotl.getGroup(groupId).then(function(group) { + if (group === undefined) + throw new Error("Tried to update numbers for unknown group"); + + if (numbers.filter(function(number) { return !textsecure.utils.isNumberSane(number); }).length > 0) + throw new Error("Invalid number in new group members"); + + if (group.numbers.filter(function(number) { return numbers.indexOf(number) < 0 }).length > 0) + throw new Error("Attempted to remove numbers from group with an UPDATE"); + + var added = numbers.filter(function(number) { return group.numbers.indexOf(number) < 0; }); + + return textsecure.storage.groups.addNumbers(groupId, added).then(function(newGroup) { + if (newGroup.length != numbers.length || + newGroup.filter(function(number) { return numbers.indexOf(number) < 0; }).length != 0) { + throw new Error("Error calculating group member difference"); + } + + return added; + }); + }); + }, + needUpdateByDeviceRegistrationId: function(groupId, number, encodedNumber, registrationId) { return textsecure.storage.axolotl.getGroup(groupId).then(function(group) { if (group === undefined) @@ -38779,21 +38803,14 @@ function processDecrypted(decrypted, source) { if (decrypted.group.avatar !== null) promises.push(handleAttachment(decrypted.group.avatar)); - if (decrypted.group.members.filter(function(number) { return !textsecure.utils.isNumberSane(number); }).length != 0) - throw new Error("Invalid number in new group members"); + return textsecure.storage.groups.updateNumbers( + decrypted.group.id, decrypted.group.members + ).then(function(added) { + decrypted.group.added = added; - if (existingGroup.filter(function(number) { decrypted.group.members.indexOf(number) < 0 }).length != 0) - throw new Error("Attempted to remove numbers from group with an UPDATE"); - decrypted.group.added = decrypted.group.members.filter(function(number) { return existingGroup.indexOf(number) < 0; }); - - return textsecure.storage.groups.addNumbers(decrypted.group.id, decrypted.group.added).then(function(newGroup) { - if (newGroup.length != decrypted.group.members.length || - newGroup.filter(function(number) { return decrypted.group.members.indexOf(number) < 0; }).length != 0) { - throw new Error("Error calculating group member difference"); - } - - //TODO: Also follow this path if avatar + name haven't changed (ie we should start storing those) - if (decrypted.group.avatar === null && decrypted.group.added.length == 0 && decrypted.group.name === null) { + if (decrypted.group.avatar === null && + decrypted.group.added.length == 0 && + decrypted.group.name === null) { return; } @@ -39675,6 +39692,9 @@ function generateKeys(count, progressCallback) { groupDetails.members, groupDetails.id ); } else { + return textsecure.storage.groups.updateNumbers( + groupDetails.id, groupDetails.members + ); } }).then(function() { var ev = new Event('group'); diff --git a/libtextsecure/helpers.js b/libtextsecure/helpers.js index 49431f34a..90e50fdca 100644 --- a/libtextsecure/helpers.js +++ b/libtextsecure/helpers.js @@ -192,21 +192,14 @@ function processDecrypted(decrypted, source) { if (decrypted.group.avatar !== null) promises.push(handleAttachment(decrypted.group.avatar)); - if (decrypted.group.members.filter(function(number) { return !textsecure.utils.isNumberSane(number); }).length != 0) - throw new Error("Invalid number in new group members"); - - if (existingGroup.filter(function(number) { decrypted.group.members.indexOf(number) < 0 }).length != 0) - throw new Error("Attempted to remove numbers from group with an UPDATE"); - decrypted.group.added = decrypted.group.members.filter(function(number) { return existingGroup.indexOf(number) < 0; }); - - return textsecure.storage.groups.addNumbers(decrypted.group.id, decrypted.group.added).then(function(newGroup) { - if (newGroup.length != decrypted.group.members.length || - newGroup.filter(function(number) { return decrypted.group.members.indexOf(number) < 0; }).length != 0) { - throw new Error("Error calculating group member difference"); - } - - //TODO: Also follow this path if avatar + name haven't changed (ie we should start storing those) - if (decrypted.group.avatar === null && decrypted.group.added.length == 0 && decrypted.group.name === null) { + return textsecure.storage.groups.updateNumbers( + decrypted.group.id, decrypted.group.members + ).then(function(added) { + decrypted.group.added = added; + + if (decrypted.group.avatar === null && + decrypted.group.added.length == 0 && + decrypted.group.name === null) { return; } diff --git a/libtextsecure/message_receiver.js b/libtextsecure/message_receiver.js index 2b3c91445..6e29ea536 100644 --- a/libtextsecure/message_receiver.js +++ b/libtextsecure/message_receiver.js @@ -202,6 +202,9 @@ groupDetails.members, groupDetails.id ); } else { + return textsecure.storage.groups.updateNumbers( + groupDetails.id, groupDetails.members + ); } }).then(function() { var ev = new Event('group'); diff --git a/libtextsecure/storage/groups.js b/libtextsecure/storage/groups.js index 5cde3f1da..b626c0bc7 100644 --- a/libtextsecure/storage/groups.js +++ b/libtextsecure/storage/groups.js @@ -143,6 +143,30 @@ }); }, + updateNumbers: function(groupId, numbers) { + return textsecure.storage.axolotl.getGroup(groupId).then(function(group) { + if (group === undefined) + throw new Error("Tried to update numbers for unknown group"); + + if (numbers.filter(function(number) { return !textsecure.utils.isNumberSane(number); }).length > 0) + throw new Error("Invalid number in new group members"); + + if (group.numbers.filter(function(number) { return numbers.indexOf(number) < 0 }).length > 0) + throw new Error("Attempted to remove numbers from group with an UPDATE"); + + var added = numbers.filter(function(number) { return group.numbers.indexOf(number) < 0; }); + + return textsecure.storage.groups.addNumbers(groupId, added).then(function(newGroup) { + if (newGroup.length != numbers.length || + newGroup.filter(function(number) { return numbers.indexOf(number) < 0; }).length != 0) { + throw new Error("Error calculating group member difference"); + } + + return added; + }); + }); + }, + needUpdateByDeviceRegistrationId: function(groupId, number, encodedNumber, registrationId) { return textsecure.storage.axolotl.getGroup(groupId).then(function(group) { if (group === undefined)