Skip to content

Commit

Permalink
Prevent UUID-only contacts from being added to GV1 groups.
Browse files Browse the repository at this point in the history
  • Loading branch information
greyson-signal committed Jul 30, 2020
1 parent cc84901 commit 550b121
Show file tree
Hide file tree
Showing 10 changed files with 94 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,9 @@ public void onRefresh() {
}

@Override
public void onContactSelected(Optional<RecipientId> recipientId, String number) {}
public boolean onContactSelected(Optional<RecipientId> recipientId, String number) {
return true;
}

@Override
public void onContactDeselected(Optional<RecipientId> recipientId, String number) {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -473,11 +473,15 @@ public void onItemClick(ContactSelectionListItem contact) {
if (uuid.isPresent()) {
Recipient recipient = Recipient.externalUsername(requireContext(), uuid.get(), contact.getNumber());
SelectedContact selected = SelectedContact.forUsername(recipient.getId(), contact.getNumber());
markContactSelected(selected);
cursorRecyclerViewAdapter.notifyItemChanged(recyclerView.getChildAdapterPosition(contact), ContactSelectionListAdapter.PAYLOAD_SELECTION_CHANGE);

if (onContactSelectedListener != null) {
onContactSelectedListener.onContactSelected(Optional.of(recipient.getId()), null);
if (onContactSelectedListener.onContactSelected(Optional.of(recipient.getId()), null)) {
markContactSelected(selected);
cursorRecyclerViewAdapter.notifyItemChanged(recyclerView.getChildAdapterPosition(contact), ContactSelectionListAdapter.PAYLOAD_SELECTION_CHANGE);
}
} else {
markContactSelected(selected);
cursorRecyclerViewAdapter.notifyItemChanged(recyclerView.getChildAdapterPosition(contact), ContactSelectionListAdapter.PAYLOAD_SELECTION_CHANGE);
}
} else {
new AlertDialog.Builder(requireContext())
Expand All @@ -488,11 +492,14 @@ public void onItemClick(ContactSelectionListItem contact) {
}
});
} else {
markContactSelected(selectedContact);
cursorRecyclerViewAdapter.notifyItemChanged(recyclerView.getChildAdapterPosition(contact), ContactSelectionListAdapter.PAYLOAD_SELECTION_CHANGE);

if (onContactSelectedListener != null) {
onContactSelectedListener.onContactSelected(contact.getRecipientId(), contact.getNumber());
if (onContactSelectedListener.onContactSelected(contact.getRecipientId(), contact.getNumber())) {
markContactSelected(selectedContact);
cursorRecyclerViewAdapter.notifyItemChanged(recyclerView.getChildAdapterPosition(contact), ContactSelectionListAdapter.PAYLOAD_SELECTION_CHANGE);
}
} else {
markContactSelected(selectedContact);
cursorRecyclerViewAdapter.notifyItemChanged(recyclerView.getChildAdapterPosition(contact), ContactSelectionListAdapter.PAYLOAD_SELECTION_CHANGE);
}
}
} else {
Expand Down Expand Up @@ -624,7 +631,8 @@ private void smoothScrollChipsToEnd() {
}

public interface OnContactSelectedListener {
void onContactSelected(Optional<RecipientId> recipientId, String number);
/** @return True if the contact is allowed to be selected, otherwise false. */
boolean onContactSelected(Optional<RecipientId> recipientId, String number);
void onContactDeselected(Optional<RecipientId> recipientId, String number);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,9 @@ private Animation loadAnimation(@AnimRes int animResId) {
}

@Override
public void onContactSelected(Optional<RecipientId> recipientId, String number) {
public boolean onContactSelected(Optional<RecipientId> recipientId, String number) {
updateSmsButtonText();
return true;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public void onCreate(Bundle bundle, boolean ready) {
}

@Override
public void onContactSelected(Optional<RecipientId> recipientId, String number) {
public boolean onContactSelected(Optional<RecipientId> recipientId, String number) {
if (recipientId.isPresent()) {
launch(Recipient.resolved(recipientId.get()));
} else {
Expand Down Expand Up @@ -92,6 +92,8 @@ public void onContactSelected(Optional<RecipientId> recipientId, String number)
launch(Recipient.external(this, number));
}
}

return true;
}

private void launch(Recipient recipient) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
Expand Down Expand Up @@ -58,14 +59,19 @@ protected void initializeToolbar() {
}

@Override
public void onContactSelected(Optional<RecipientId> recipientId, String number) {
public boolean onContactSelected(Optional<RecipientId> recipientId, String number) {
if (getGroupId().isV1() && recipientId.isPresent() && !Recipient.resolved(recipientId.get()).hasE164()) {
Toast.makeText(this, R.string.AddMembersActivity__this_person_cant_be_added_to_legacy_groups, Toast.LENGTH_SHORT).show();
return false;
}

if (contactsFragment.hasQueryFilter()) {
getToolbar().clear();
}

if (contactsFragment.getSelectedContactsCount() >= 1) {
enableDone();
}
enableDone();

return true;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,18 @@ void onContinueWithSelection(@NonNull List<RecipientId> groupRecipientIds) {
events.postValue(new Event.CloseEvent());
} else if (groupRecipientIds.size() == 1) {
SignalExecutors.BOUNDED.execute(() -> {
Recipient recipient = Recipient.resolved(recipientId);
Recipient groupRecipient = Recipient.resolved(groupRecipientIds.get(0));
String recipientName = Recipient.resolved(recipientId).getDisplayName(context);
String recipientName = recipient.getDisplayName(context);
String groupName = groupRecipient.getDisplayName(context);

events.postValue(new Event.AddToSingleGroupConfirmationEvent(context.getResources().getString(R.string.AddToGroupActivity_add_member),
context.getResources().getString(R.string.AddToGroupActivity_add_s_to_s, recipientName, groupName),
groupRecipient, recipientName, groupName));
if (groupRecipient.getGroupId().get().isV1() && !recipient.hasE164()) {
events.postValue(new Event.LegacyGroupDenialEvent());
} else {
events.postValue(new Event.AddToSingleGroupConfirmationEvent(context.getResources().getString(R.string.AddToGroupActivity_add_member),
context.getResources().getString(R.string.AddToGroupActivity_add_s_to_s, recipientName, groupName),
groupRecipient, recipientName, groupName));
}
});
} else {
throw new AssertionError("Does not support multi-select");
Expand Down Expand Up @@ -107,6 +112,9 @@ String getMessage() {
return message;
}
}

static class LegacyGroupDenialEvent extends Event {
}
}

public static class Factory implements ViewModelProvider.Factory {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ public void onCreate(Bundle bundle, boolean ready) {
.setPositiveButton(android.R.string.ok, (dialog, which) -> viewModel.onAddToGroupsConfirmed(addEvent))
.setNegativeButton(android.R.string.cancel, null)
.show();
} else if (event instanceof Event.LegacyGroupDenialEvent) {
Toast.makeText(this, R.string.AddToGroupActivity_this_person_cant_be_added_to_legacy_groups, Toast.LENGTH_SHORT).show();
} else {
throw new AssertionError();
}
Expand All @@ -112,20 +114,23 @@ public boolean onOptionsItemSelected(MenuItem item) {
}

@Override
public void onContactSelected(Optional<RecipientId> recipientId, String number) {
public boolean onContactSelected(Optional<RecipientId> recipientId, String number) {
if (contactsFragment.isMulti()) {
if (contactsFragment.hasQueryFilter()) {
getToolbar().clear();
}

if (contactsFragment.getSelectedContactsCount() >= MINIMUM_GROUP_SELECT_SIZE) {
enableNext();
}
throw new UnsupportedOperationException("Not yet built to handle multi-select.");
// if (contactsFragment.hasQueryFilter()) {
// getToolbar().clear();
// }
//
// if (contactsFragment.getSelectedContactsCount() >= MINIMUM_GROUP_SELECT_SIZE) {
// enableNext();
// }
} else {
if (recipientId.isPresent()) {
viewModel.onContinueWithSelection(Collections.singletonList(recipientId.get()));
}
}

return true;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;

import com.annimon.stream.Stream;

Expand All @@ -30,6 +31,8 @@
import org.whispersystems.libsignal.util.guava.Optional;

import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

public class CreateGroupActivity extends ContactSelectionActivity {
Expand Down Expand Up @@ -90,14 +93,14 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten
}

@Override
public void onContactSelected(Optional<RecipientId> recipientId, String number) {
public boolean onContactSelected(Optional<RecipientId> recipientId, String number) {
if (contactsFragment.hasQueryFilter()) {
getToolbar().clear();
}

if (contactsFragment.getSelectedContactsCount() >= MINIMUM_GROUP_SIZE) {
enableNext();
}
enableNext();

return true;
}

@Override
Expand Down Expand Up @@ -160,13 +163,31 @@ private void handleNextPressed() {

stopwatch.split("capabilities");

resolved = Recipient.resolvedList(ids);

if (Stream.of(resolved).anyMatch(r -> r.getGroupsV2Capability() != Recipient.Capability.SUPPORTED) &&
Stream.of(resolved).anyMatch(r -> !r.hasE164()))
{
Log.w(TAG, "Invalid GV1 group...");
ids = Collections.emptyList();
}

stopwatch.split("gv1-check");

return ids;
}, ids -> {
dismissibleDialog.dismiss();

stopwatch.stop(TAG);

startActivityForResult(AddGroupDetailsActivity.newIntent(this, ids), REQUEST_CODE_ADD_DETAILS);
if (ids.isEmpty()) {
new AlertDialog.Builder(this)
.setMessage(R.string.CreateGroupActivity_some_contacts_cannot_be_in_legacy_groups)
.setPositiveButton(android.R.string.ok, (d, w) -> d.dismiss())
.show();
} else {
startActivityForResult(AddGroupDetailsActivity.newIntent(this, ids), REQUEST_CODE_ADD_DETAILS);
}
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,9 @@ public void onBackPressed() {
else super.onBackPressed();
}


@Override
public void onContactSelected(Optional<RecipientId> recipientId, String number) {
public boolean onContactSelected(Optional<RecipientId> recipientId, String number) {
SimpleTask.run(this.getLifecycle(), () -> {
Recipient recipient;
if (recipientId.isPresent()) {
Expand All @@ -162,6 +163,8 @@ public void onContactSelected(Optional<RecipientId> recipientId, String number)
long existingThread = DatabaseFactory.getThreadDatabase(this).getThreadIdIfExistsFor(recipient);
return new Pair<>(existingThread, recipient);
}, result -> onDestinationChosen(result.first(), result.second().getId()));

return true;
}

@Override
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,9 @@
<string name="ConversationTitleView_verified">Verified</string>
<string name="ConversationTitleView_you">You</string>

<!-- CreateGroupActivity -->
<string name="CreateGroupActivity_some_contacts_cannot_be_in_legacy_groups">Some contacts cannot be in legacy groups.</string>

<!-- CreateProfileActivity -->
<string name="CreateProfileActivity__profile">Profile</string>
<string name="CreateProfileActivity_error_setting_profile_photo">Error setting profile photo</string>
Expand Down Expand Up @@ -444,6 +447,7 @@
<string name="AddToGroupActivity_s_added_to_s">\"%1$s\" added to \"%2$s\".</string>
<string name="AddToGroupActivity_add_to_group">Add to group</string>
<string name="AddToGroupActivity_add_to_groups">Add to groups</string>
<string name="AddToGroupActivity_this_person_cant_be_added_to_legacy_groups">This person can\'t be added to legacy groups.</string>

<!-- ChooseNewAdminActivity -->
<string name="ChooseNewAdminActivity_choose_new_admin">Choose new admin</string>
Expand Down Expand Up @@ -502,6 +506,7 @@

<!-- AddMembersActivity -->
<string name="AddMembersActivity__done">Done</string>
<string name="AddMembersActivity__this_person_cant_be_added_to_legacy_groups">This person can\'t be added to legacy groups.</string>
<plurals name="AddMembersActivity__add_d_members_to_s">
<item quantity="one">Add \"%1$s\" to \"%2$s\"?</item>
<item quantity="other">Add %3$d members to \"%2$s\"?</item>
Expand Down

0 comments on commit 550b121

Please sign in to comment.