mirror of
https://github.com/oxen-io/session-android.git
synced 2025-02-21 10:08:27 +00:00
Clean ClosedGroupsProtocol ahead of SSK changes
This commit is contained in:
parent
9c3814df9c
commit
c2d1953116
@ -1166,7 +1166,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
builder.setMessage(getString(R.string.ConversationActivity_are_you_sure_you_want_to_leave_this_group));
|
builder.setMessage(getString(R.string.ConversationActivity_are_you_sure_you_want_to_leave_this_group));
|
||||||
builder.setPositiveButton(R.string.yes, (dialog, which) -> {
|
builder.setPositiveButton(R.string.yes, (dialog, which) -> {
|
||||||
Recipient groupRecipient = getRecipient();
|
Recipient groupRecipient = getRecipient();
|
||||||
if (ClosedGroupsProtocol.leaveGroup(this, groupRecipient)) {
|
if (ClosedGroupsProtocol.leaveLegacyGroup(this, groupRecipient)) {
|
||||||
initializeEnabledCheck();
|
initializeEnabledCheck();
|
||||||
} else {
|
} else {
|
||||||
Toast.makeText(this, R.string.ConversationActivity_error_leaving_group, Toast.LENGTH_LONG).show();
|
Toast.makeText(this, R.string.ConversationActivity_error_leaving_group, Toast.LENGTH_LONG).show();
|
||||||
|
@ -97,11 +97,6 @@ public class GroupMessageProcessor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loki - Ignore message if needed
|
|
||||||
if (ClosedGroupsProtocol.shouldIgnoreGroupCreatedMessage(context, group)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Loki - Parse admins
|
// Loki - Parse admins
|
||||||
if (group.getAdmins().isPresent()) {
|
if (group.getAdmins().isPresent()) {
|
||||||
for (String admin : group.getAdmins().get()) {
|
for (String admin : group.getAdmins().get()) {
|
||||||
|
@ -1454,7 +1454,7 @@ public class PushDecryptJob extends BaseJob implements InjectableType {
|
|||||||
boolean isGroupActive = groupId.isPresent() && groupDatabase.isActive(groupId.get());
|
boolean isGroupActive = groupId.isPresent() && groupDatabase.isActive(groupId.get());
|
||||||
boolean isLeaveMessage = message.getGroupInfo().isPresent() && message.getGroupInfo().get().getType() == SignalServiceGroup.Type.QUIT;
|
boolean isLeaveMessage = message.getGroupInfo().isPresent() && message.getGroupInfo().get().getType() == SignalServiceGroup.Type.QUIT;
|
||||||
|
|
||||||
boolean shouldIgnoreContentMessage = ClosedGroupsProtocol.shouldIgnoreContentMessage(context, conversation, groupId.orNull(), content);
|
boolean shouldIgnoreContentMessage = ClosedGroupsProtocol.shouldIgnoreContentMessage(context, conversation.getAddress(), groupId.orNull(), content.getSender());
|
||||||
return (isContentMessage && !isGroupActive) || (sender.isBlocked() && !isLeaveMessage) || (isContentMessage && shouldIgnoreContentMessage);
|
return (isContentMessage && !isGroupActive) || (sender.isBlocked() && !isLeaveMessage) || (isContentMessage && shouldIgnoreContentMessage);
|
||||||
} else {
|
} else {
|
||||||
return sender.isBlocked();
|
return sender.isBlocked();
|
||||||
|
@ -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 = ClosedGroupsProtocol.getDestinations(message.getRecipient().getAddress().toGroupString(), context).get();
|
else targets = ClosedGroupsProtocol.getMessageDestinations(context, message.getRecipient().getAddress().toGroupString());
|
||||||
|
|
||||||
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();
|
||||||
|
@ -31,7 +31,6 @@ import org.thoughtcrime.securesms.database.DatabaseFactory
|
|||||||
import org.thoughtcrime.securesms.database.ThreadDatabase
|
import org.thoughtcrime.securesms.database.ThreadDatabase
|
||||||
import org.thoughtcrime.securesms.database.model.ThreadRecord
|
import org.thoughtcrime.securesms.database.model.ThreadRecord
|
||||||
import org.thoughtcrime.securesms.jobs.MultiDeviceBlockedUpdateJob
|
import org.thoughtcrime.securesms.jobs.MultiDeviceBlockedUpdateJob
|
||||||
import org.thoughtcrime.securesms.loki.database.LokiAPIDatabase
|
|
||||||
import org.thoughtcrime.securesms.loki.dialogs.ConversationOptionsBottomSheet
|
import org.thoughtcrime.securesms.loki.dialogs.ConversationOptionsBottomSheet
|
||||||
import org.thoughtcrime.securesms.loki.dialogs.MultiDeviceRemovalBottomSheet
|
import org.thoughtcrime.securesms.loki.dialogs.MultiDeviceRemovalBottomSheet
|
||||||
import org.thoughtcrime.securesms.loki.protocol.ClosedGroupsProtocol
|
import org.thoughtcrime.securesms.loki.protocol.ClosedGroupsProtocol
|
||||||
@ -333,7 +332,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity, ConversationClickListe
|
|||||||
val isClosedGroup = recipient.address.isClosedGroup
|
val isClosedGroup = recipient.address.isClosedGroup
|
||||||
// Send a leave group message if this is an active closed group
|
// Send a leave group message if this is an active closed group
|
||||||
if (isClosedGroup && DatabaseFactory.getGroupDatabase(this).isActive(recipient.address.toGroupString())) {
|
if (isClosedGroup && DatabaseFactory.getGroupDatabase(this).isActive(recipient.address.toGroupString())) {
|
||||||
if (!ClosedGroupsProtocol.leaveGroup(this, recipient)) {
|
if (!ClosedGroupsProtocol.leaveLegacyGroup(this, recipient)) {
|
||||||
Toast.makeText(this, R.string.activity_home_leaving_group_failed_message, Toast.LENGTH_LONG).show()
|
Toast.makeText(this, R.string.activity_home_leaving_group_failed_message, Toast.LENGTH_LONG).show()
|
||||||
return@setPositiveButton
|
return@setPositiveButton
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package org.thoughtcrime.securesms.loki.protocol
|
package org.thoughtcrime.securesms.loki.protocol
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.util.Log
|
||||||
import nl.komponents.kovenant.Promise
|
import nl.komponents.kovenant.Promise
|
||||||
import nl.komponents.kovenant.functional.map
|
import nl.komponents.kovenant.functional.map
|
||||||
import org.thoughtcrime.securesms.ApplicationContext
|
import org.thoughtcrime.securesms.ApplicationContext
|
||||||
@ -24,39 +25,27 @@ import java.util.*
|
|||||||
|
|
||||||
object ClosedGroupsProtocol {
|
object ClosedGroupsProtocol {
|
||||||
|
|
||||||
/**
|
|
||||||
* Blocks the calling thread.
|
|
||||||
*/
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun shouldIgnoreContentMessage(context: Context, conversation: Recipient, groupID: String?, content: SignalServiceContent): Boolean {
|
fun shouldIgnoreContentMessage(context: Context, address: Address, groupID: String?, senderPublicKey: String): Boolean {
|
||||||
if (!conversation.address.isClosedGroup || groupID == null) { return false }
|
if (!address.isClosedGroup || groupID == null) { return false }
|
||||||
// A closed group's members should never include slave devices
|
/*
|
||||||
val senderPublicKey = content.sender
|
|
||||||
FileServerAPI.shared.getDeviceLinks(senderPublicKey).timeout(6000).get()
|
FileServerAPI.shared.getDeviceLinks(senderPublicKey).timeout(6000).get()
|
||||||
val senderMasterPublicKey = MultiDeviceProtocol.shared.getMasterDevice(senderPublicKey)
|
val senderMasterPublicKey = MultiDeviceProtocol.shared.getMasterDevice(senderPublicKey)
|
||||||
val publicKeyToCheckFor = senderMasterPublicKey ?: senderPublicKey
|
val publicKeyToCheckFor = senderMasterPublicKey ?: senderPublicKey
|
||||||
|
*/
|
||||||
val members = DatabaseFactory.getGroupDatabase(context).getGroupMembers(groupID, true)
|
val members = DatabaseFactory.getGroupDatabase(context).getGroupMembers(groupID, true)
|
||||||
return !members.contains(recipient(context, publicKeyToCheckFor))
|
return !members.contains(recipient(context, senderPublicKey))
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun shouldIgnoreGroupCreatedMessage(context: Context, group: SignalServiceGroup): Boolean {
|
fun getMessageDestinations(context: Context, groupID: String): List<Address> {
|
||||||
val members = group.members
|
if (GroupUtil.isRSSFeed(groupID)) { return listOf() }
|
||||||
val masterPublicKeyOrNull = TextSecurePreferences.getMasterHexEncodedPublicKey(context)
|
|
||||||
val masterPublicKey = masterPublicKeyOrNull ?: TextSecurePreferences.getLocalNumber(context)
|
|
||||||
return !members.isPresent || !members.get().contains(masterPublicKey)
|
|
||||||
}
|
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
fun getDestinations(groupID: String, context: Context): Promise<List<Address>, Exception> {
|
|
||||||
if (GroupUtil.isRSSFeed(groupID)) { return Promise.of(listOf()) }
|
|
||||||
if (GroupUtil.isOpenGroup(groupID)) {
|
if (GroupUtil.isOpenGroup(groupID)) {
|
||||||
val result = mutableListOf<Address>()
|
return listOf( Address.fromSerialized(groupID) )
|
||||||
result.add(Address.fromSerialized(groupID))
|
|
||||||
return Promise.of(result)
|
|
||||||
} else {
|
} else {
|
||||||
// A closed group's members should never include slave devices
|
// TODO: Shared sender keys
|
||||||
val members = DatabaseFactory.getGroupDatabase(context).getGroupMembers(groupID, false)
|
return DatabaseFactory.getGroupDatabase(context).getGroupMembers(groupID, false).map { it.address }
|
||||||
|
/*
|
||||||
return FileServerAPI.shared.getDeviceLinks(members.map { it.address.serialize() }.toSet()).map {
|
return FileServerAPI.shared.getDeviceLinks(members.map { it.address.serialize() }.toSet()).map {
|
||||||
val result = members.flatMap { member ->
|
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) }
|
||||||
@ -71,29 +60,33 @@ object ClosedGroupsProtocol {
|
|||||||
}
|
}
|
||||||
result.toList()
|
result.toList()
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun leaveGroup(context: Context, recipient: Recipient): Boolean {
|
fun leaveLegacyGroup(context: Context, recipient: Recipient): Boolean {
|
||||||
if (!recipient.address.isClosedGroup) { return true }
|
if (!recipient.address.isClosedGroup) { return true }
|
||||||
val threadID = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipient)
|
val threadID = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipient)
|
||||||
val message = GroupUtil.createGroupLeaveMessage(context, recipient)
|
val message = GroupUtil.createGroupLeaveMessage(context, recipient).orNull()
|
||||||
if (threadID < 0 || !message.isPresent) { return false }
|
if (threadID < 0 || message == null) { return false }
|
||||||
MessageSender.send(context, message.get(), threadID, false, null)
|
MessageSender.send(context, message, threadID, false, null)
|
||||||
// Remove the master device from the group (a closed group's members should never include slave devices)
|
/*
|
||||||
val masterPublicKey = TextSecurePreferences.getMasterHexEncodedPublicKey(context)
|
val masterPublicKey = TextSecurePreferences.getMasterHexEncodedPublicKey(context)
|
||||||
val publicKeyToRemove = masterPublicKey ?: TextSecurePreferences.getLocalNumber(context)
|
val publicKeyToRemove = masterPublicKey ?: TextSecurePreferences.getLocalNumber(context)
|
||||||
|
*/
|
||||||
|
val userPublicKey = TextSecurePreferences.getLocalNumber(context)
|
||||||
val groupDatabase = DatabaseFactory.getGroupDatabase(context)
|
val groupDatabase = DatabaseFactory.getGroupDatabase(context)
|
||||||
val groupID = recipient.address.toGroupString()
|
val groupID = recipient.address.toGroupString()
|
||||||
groupDatabase.setActive(groupID, false)
|
groupDatabase.setActive(groupID, false)
|
||||||
groupDatabase.remove(groupID, Address.fromSerialized(publicKeyToRemove))
|
groupDatabase.remove(groupID, Address.fromSerialized(userPublicKey))
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun establishSessionsWithMembersIfNeeded(context: Context, members: List<String>) {
|
fun establishSessionsWithMembersIfNeeded(context: Context, members: List<String>) {
|
||||||
// A closed group's members should never include slave devices
|
@Suppress("NAME_SHADOWING") val members = members.toMutableSet()
|
||||||
|
/*
|
||||||
val allDevices = members.flatMap { member ->
|
val allDevices = members.flatMap { member ->
|
||||||
MultiDeviceProtocol.shared.getAllLinkedDevices(member)
|
MultiDeviceProtocol.shared.getAllLinkedDevices(member)
|
||||||
}.toMutableSet()
|
}.toMutableSet()
|
||||||
@ -101,12 +94,13 @@ object ClosedGroupsProtocol {
|
|||||||
if (userMasterPublicKey != null && allDevices.contains(userMasterPublicKey)) {
|
if (userMasterPublicKey != null && allDevices.contains(userMasterPublicKey)) {
|
||||||
allDevices.remove(userMasterPublicKey)
|
allDevices.remove(userMasterPublicKey)
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
val userPublicKey = TextSecurePreferences.getLocalNumber(context)
|
val userPublicKey = TextSecurePreferences.getLocalNumber(context)
|
||||||
if (userPublicKey != null && allDevices.contains(userPublicKey)) {
|
if (userPublicKey != null && members.contains(userPublicKey)) {
|
||||||
allDevices.remove(userPublicKey)
|
members.remove(userPublicKey)
|
||||||
}
|
}
|
||||||
for (device in allDevices) {
|
for (member in members) {
|
||||||
ApplicationContext.getInstance(context).sendSessionRequestIfNeeded(device)
|
ApplicationContext.getInstance(context).sendSessionRequestIfNeeded(member)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user