Fix closed group multi device message sending

This commit is contained in:
nielsandriesse 2020-05-22 11:14:36 +10:00
parent f015339fc5
commit 7d5114b595
2 changed files with 24 additions and 22 deletions

View File

@ -154,7 +154,7 @@ public class PushGroupSendJob extends PushSendJob implements InjectableType {
if (filterAddress != null) targets = Collections.singletonList(Address.fromSerialized(filterAddress)); if (filterAddress != null) targets = Collections.singletonList(Address.fromSerialized(filterAddress));
else if (!existingNetworkFailures.isEmpty()) targets = Stream.of(existingNetworkFailures).map(NetworkFailure::getAddress).toList(); else if (!existingNetworkFailures.isEmpty()) targets = Stream.of(existingNetworkFailures).map(NetworkFailure::getAddress).toList();
else targets = getGroupMessageRecipients(message.getRecipient().getAddress().toGroupString(), messageId); else targets = ClosedGroupsProtocol.getDestinations(message.getRecipient().getAddress().toGroupString(), context).get();
List<SendMessageResult> results = deliver(message, targets); List<SendMessageResult> results = deliver(message, targets);
List<NetworkFailure> networkFailures = Stream.of(results).filter(SendMessageResult::isNetworkFailure).map(result -> new NetworkFailure(Address.fromSerialized(result.getAddress().getNumber()))).toList(); List<NetworkFailure> networkFailures = Stream.of(results).filter(SendMessageResult::isNetworkFailure).map(result -> new NetworkFailure(Address.fromSerialized(result.getAddress().getNumber()))).toList();
@ -205,7 +205,7 @@ public class PushGroupSendJob extends PushSendJob implements InjectableType {
database.markAsSentFailed(messageId); database.markAsSentFailed(messageId);
notifyMediaMessageDeliveryFailed(context, messageId); notifyMediaMessageDeliveryFailed(context, messageId);
} }
} catch (UntrustedIdentityException | UndeliverableMessageException e) { } catch (Exception e) {
warn(TAG, e); warn(TAG, e);
database.markAsSentFailed(messageId); database.markAsSentFailed(messageId);
notifyMediaMessageDeliveryFailed(context, messageId); notifyMediaMessageDeliveryFailed(context, messageId);
@ -231,7 +231,9 @@ public class PushGroupSendJob extends PushSendJob implements InjectableType {
Address address = message.getRecipient().getAddress(); Address address = message.getRecipient().getAddress();
if (address.isRSSFeed()) { if (address.isRSSFeed()) {
List<SendMessageResult> results = new ArrayList<>(); List<SendMessageResult> results = new ArrayList<>();
for (Address destination : destinations) results.add(SendMessageResult.networkFailure(new SignalServiceAddress(destination.toPhoneString()))); for (Address destination : destinations) {
results.add(SendMessageResult.networkFailure(new SignalServiceAddress(destination.toPhoneString())));
}
return results; return results;
} }
@ -263,7 +265,6 @@ public class PushGroupSendJob extends PushSendJob implements InjectableType {
SignalServiceDataMessage groupDataMessage = SignalServiceDataMessage.newBuilder() SignalServiceDataMessage groupDataMessage = SignalServiceDataMessage.newBuilder()
.withTimestamp(message.getSentTimeMillis()) .withTimestamp(message.getSentTimeMillis())
.withExpiration(message.getRecipient().getExpireMessages()) .withExpiration(message.getRecipient().getExpireMessages())
.withBody(message.getBody())
.asGroupMessage(group) .asGroupMessage(group)
.build(); .build();
@ -288,10 +289,6 @@ public class PushGroupSendJob extends PushSendJob implements InjectableType {
} }
} }
private @NonNull List<Address> getGroupMessageRecipients(String groupId, long messageId) {
return ClosedGroupsProtocol.getDestinations(groupId, context);
}
public static class Factory implements Job.Factory<PushGroupSendJob> { public static class Factory implements Job.Factory<PushGroupSendJob> {
@Override @Override
public @NonNull PushGroupSendJob create(@NonNull Parameters parameters, @NonNull org.thoughtcrime.securesms.jobmanager.Data data) { public @NonNull PushGroupSendJob create(@NonNull Parameters parameters, @NonNull org.thoughtcrime.securesms.jobmanager.Data data) {

View File

@ -1,6 +1,8 @@
package org.thoughtcrime.securesms.loki.protocol package org.thoughtcrime.securesms.loki.protocol
import android.content.Context import android.content.Context
import nl.komponents.kovenant.Promise
import nl.komponents.kovenant.functional.map
import org.thoughtcrime.securesms.ApplicationContext import org.thoughtcrime.securesms.ApplicationContext
import org.thoughtcrime.securesms.crypto.storage.TextSecureSessionStore import org.thoughtcrime.securesms.crypto.storage.TextSecureSessionStore
import org.thoughtcrime.securesms.database.Address import org.thoughtcrime.securesms.database.Address
@ -14,6 +16,7 @@ import org.whispersystems.libsignal.SignalProtocolAddress
import org.whispersystems.signalservice.api.messages.SignalServiceContent import org.whispersystems.signalservice.api.messages.SignalServiceContent
import org.whispersystems.signalservice.api.messages.SignalServiceGroup import org.whispersystems.signalservice.api.messages.SignalServiceGroup
import org.whispersystems.signalservice.api.push.SignalServiceAddress import org.whispersystems.signalservice.api.push.SignalServiceAddress
import org.whispersystems.signalservice.loki.api.fileserver.LokiFileServerAPI
import org.whispersystems.signalservice.loki.protocol.multidevice.MultiDeviceProtocol import org.whispersystems.signalservice.loki.protocol.multidevice.MultiDeviceProtocol
import java.util.* import java.util.*
@ -38,27 +41,29 @@ object ClosedGroupsProtocol {
} }
@JvmStatic @JvmStatic
fun getDestinations(groupID: String, context: Context): List<Address> { fun getDestinations(groupID: String, context: Context): Promise<List<Address>, Exception> {
if (GroupUtil.isRSSFeed(groupID)) { return listOf() } if (GroupUtil.isRSSFeed(groupID)) { return Promise.of(listOf()) }
if (GroupUtil.isOpenGroup(groupID)) { if (GroupUtil.isOpenGroup(groupID)) {
val result = mutableListOf<Address>() val result = mutableListOf<Address>()
result.add(Address.fromSerialized(groupID)) result.add(Address.fromSerialized(groupID))
return result return Promise.of(result)
} else { } else {
// A closed group's members should never include slave devices // A closed group's members should never include slave devices
val members = DatabaseFactory.getGroupDatabase(context).getGroupMembers(groupID, false) val members = DatabaseFactory.getGroupDatabase(context).getGroupMembers(groupID, false)
val destinations = members.flatMap { member -> return LokiFileServerAPI.shared.getDeviceLinks(members.map { it.address.serialize() }.toSet()).map {
val result = members.flatMap { member ->
MultiDeviceProtocol.shared.getAllLinkedDevices(member.address.serialize()).map { Address.fromSerialized(it) } MultiDeviceProtocol.shared.getAllLinkedDevices(member.address.serialize()).map { Address.fromSerialized(it) }
}.toMutableSet() }.toMutableSet()
val userMasterPublicKey = TextSecurePreferences.getMasterHexEncodedPublicKey(context) val userMasterPublicKey = TextSecurePreferences.getMasterHexEncodedPublicKey(context)
if (userMasterPublicKey != null && destinations.contains(Address.fromSerialized(userMasterPublicKey))) { if (userMasterPublicKey != null && result.contains(Address.fromSerialized(userMasterPublicKey))) {
destinations.remove(Address.fromSerialized(userMasterPublicKey)) result.remove(Address.fromSerialized(userMasterPublicKey))
} }
val userPublicKey = TextSecurePreferences.getLocalNumber(context) val userPublicKey = TextSecurePreferences.getLocalNumber(context)
if (userPublicKey != null && destinations.contains(Address.fromSerialized(userPublicKey))) { if (userPublicKey != null && result.contains(Address.fromSerialized(userPublicKey))) {
destinations.remove(Address.fromSerialized(userPublicKey)) result.remove(Address.fromSerialized(userPublicKey))
}
result.toList()
} }
return destinations.toList()
} }
} }