From 9b61e1c85c41f8299b6aeb60a35b2b05bc482e3b Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 30 Jul 2020 16:17:23 -0400 Subject: [PATCH] Show a message request for certain GV2 adds. --- .../securesms/database/ThreadDatabase.java | 13 +++++-- .../v2/processing/GroupsV2StateProcessor.java | 34 ++++++++++++++++--- .../MessageRequestRepository.java | 7 +--- .../MessageRequestsBottomView.java | 6 +--- app/src/main/res/values/strings.xml | 1 - 5 files changed, 43 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java index 517800d76e..a364adad39 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -33,6 +33,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import net.sqlcipher.database.SQLiteDatabase; import org.signal.storageservice.protos.groups.local.DecryptedGroup; +import org.signal.storageservice.protos.groups.local.DecryptedMember; import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo; import org.thoughtcrime.securesms.database.RecipientDatabase.RecipientSettings; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; @@ -55,6 +56,7 @@ import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupUtil; +import org.whispersystems.signalservice.api.util.UuidUtil; import java.io.Closeable; import java.io.IOException; @@ -964,9 +966,16 @@ public class ThreadDatabase extends Database { DecryptedGroup decryptedGroup = DatabaseFactory.getGroupDatabase(context).requireGroup(resolved.requireGroupId().requireV2()).requireV2GroupProperties().getDecryptedGroup(); Optional inviter = DecryptedGroupUtil.findInviter(decryptedGroup.getPendingMembersList(), Recipient.self().getUuid().get()); - RecipientId recipientId = inviter.isPresent() ? RecipientId.from(inviter.get(), null) : RecipientId.UNKNOWN; + if (inviter.isPresent()) { + RecipientId recipientId = RecipientId.from(inviter.get(), null); + return Extra.forGroupV2invite(recipientId); + } else if (decryptedGroup.getRevision() == 0) { + Optional foundingMember = DecryptedGroupUtil.firstMember(decryptedGroup.getMembersList()); - return Extra.forGroupV2invite(recipientId); + if (foundingMember.isPresent()) { + return Extra.forGroupMessageRequest(RecipientId.from(UuidUtil.fromByteString(foundingMember.get().getUuid()), null)); + } + } } else { RecipientId recipientId = DatabaseFactory.getMmsSmsDatabase(context).getGroupAddedBy(record.getThreadId()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java index eb710d4126..933110e7be 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java @@ -7,12 +7,17 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; +import com.google.protobuf.ByteString; + import org.signal.storageservice.protos.groups.local.DecryptedGroup; import org.signal.storageservice.protos.groups.local.DecryptedGroupChange; +import org.signal.storageservice.protos.groups.local.DecryptedMember; import org.signal.storageservice.protos.groups.local.DecryptedPendingMember; import org.signal.zkgroup.VerificationFailedException; import org.signal.zkgroup.groups.GroupMasterKey; import org.signal.zkgroup.groups.GroupSecretParams; +import org.signal.zkgroup.util.UUIDUtil; +import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.database.MmsDatabase; @@ -152,8 +157,8 @@ public final class GroupsV2StateProcessor { .transform(g -> g.requireV2GroupProperties().getDecryptedGroup()) .orNull(); - if (signedGroupChange != null && - localState != null && + if (signedGroupChange != null && + localState != null && localState.getRevision() + 1 == signedGroupChange.getRevision() && revision == signedGroupChange.getRevision()) { @@ -274,9 +279,30 @@ public final class GroupsV2StateProcessor { jobManager.add(new AvatarGroupsV2DownloadJob(groupId, newLocalState.getAvatar())); } - final boolean fullMemberPostUpdate = GroupProtoUtil.isMember(Recipient.self().getUuid().get(), newLocalState.getMembersList()); - if (fullMemberPostUpdate) { + boolean fullMemberPostUpdate = GroupProtoUtil.isMember(Recipient.self().getUuid().get(), newLocalState.getMembersList()); + boolean trustedAdder = false; + + if (newLocalState.getRevision() == 0) { + Optional foundingMember = DecryptedGroupUtil.firstMember(newLocalState.getMembersList()); + + if (foundingMember.isPresent()) { + UUID foundingMemberUuid = UuidUtil.fromByteString(foundingMember.get().getUuid()); + Recipient foundingRecipient = Recipient.externalPush(context, foundingMemberUuid, null, false); + + if (foundingRecipient.isSystemContact() || foundingRecipient.isProfileSharing()) { + Log.i(TAG, "Group 'adder' is trusted. contact: " + foundingRecipient.isSystemContact() + ", profileSharing: " + foundingRecipient.isProfileSharing()); + trustedAdder = true; + } + } else { + Log.i(TAG, "Could not find founding member during gv2 create. Not enabling profile sharing."); + } + } + + if (fullMemberPostUpdate && trustedAdder) { + Log.i(TAG, "Added to a group and auto-enabling profile sharing"); recipientDatabase.setProfileSharing(Recipient.externalGroup(context, groupId).getId(), true); + } else { + Log.i(TAG, "Added to a group, but not enabling profile sharing. fullMember: " + fullMemberPostUpdate + ", trustedAdded: " + trustedAdder); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java index dcc400f683..645977f8ba 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java @@ -68,12 +68,7 @@ final class MessageRequestRepository { void getMessageRequestState(@NonNull Recipient recipient, long threadId, @NonNull Consumer state) { executor.execute(() -> { - if (recipient.isPushV2Group()) { - boolean pendingMember = DatabaseFactory.getGroupDatabase(context) - .isPendingMember(recipient.requireGroupId().requireV2(), Recipient.self()); - state.accept(pendingMember ? MessageRequestState.UNACCEPTED - : MessageRequestState.ACCEPTED); - } else if (!RecipientUtil.isMessageRequestAccepted(context, threadId)) { + if (!RecipientUtil.isMessageRequestAccepted(context, threadId)) { state.accept(MessageRequestState.UNACCEPTED); } else if (RecipientUtil.isPreMessageRequestThread(context, threadId) && !RecipientUtil.isLegacyProfileSharingAccepted(recipient)) { state.accept(MessageRequestState.LEGACY); diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java index b183cde972..cf18d39465 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java @@ -71,11 +71,7 @@ public class MessageRequestsBottomView extends ConstraintLayout { setActiveInactiveGroups(blockedButtons, normalButtons); } else { if (recipient.isGroup()) { - if (recipient.isPushV2Group()) { - question.setText(HtmlCompat.fromHtml(getContext().getString(R.string.MessageRequestBottomView_you_were_invited_to_join_the_group_s, HtmlUtil.bold(recipient.getDisplayName(getContext()))), 0)); - } else { - question.setText(R.string.MessageRequestBottomView_do_you_want_to_join_this_group_they_wont_know_youve_seen_their_messages_until_you_accept); - } + question.setText(R.string.MessageRequestBottomView_do_you_want_to_join_this_group_they_wont_know_youve_seen_their_messages_until_you_accept); } else { String name = recipient.getShortDisplayName(getContext()); question.setText(HtmlCompat.fromHtml(getContext().getString(R.string.MessageRequestBottomView_do_you_want_to_let_s_message_you_they_wont_know_youve_seen_their_messages_until_you_accept, HtmlUtil.bold(name)), 0)); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 48536459cd..c596d6e832 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -895,7 +895,6 @@ Let %1$s message you and share your name and photo with them? They won\'t know you\'ve seen their message until you accept. Let %1$s message you and share your name and photo with them? You won\'t receive any messages until you unblock them. Join this group and share your name and photo with its members? They won\'t know you\'ve seen their messages until you accept. - You were invited to join the group %1$s. Do you want to let members of this group message you? Unblock this group and share your name and photo with its members? You won\'t receive any messages until you unblock them. Member of %1$s Member of %1$s and %2$s