Dedupe network and identity failures.

fork-5.53.8
Greyson Parrelli 2021-10-01 14:21:41 -04:00 zatwierdzone przez Cody Henthorne
rodzic e01381379c
commit a385cb0b68
19 zmienionych plików z 133 dodań i 130 usunięć

Wyświetl plik

@ -17,7 +17,7 @@ import net.sqlcipher.database.SQLiteStatement;
import org.signal.core.util.logging.Log; import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.documents.Document; import org.thoughtcrime.securesms.database.documents.Document;
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchList; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchSet;
import org.thoughtcrime.securesms.database.documents.NetworkFailure; import org.thoughtcrime.securesms.database.documents.NetworkFailure;
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
import org.thoughtcrime.securesms.database.model.MessageId; import org.thoughtcrime.securesms.database.model.MessageId;
@ -138,7 +138,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
public abstract @NonNull List<MarkedMessageInfo> setIncomingMessagesViewed(@NonNull List<Long> messageIds); public abstract @NonNull List<MarkedMessageInfo> setIncomingMessagesViewed(@NonNull List<Long> messageIds);
public abstract void addFailures(long messageId, List<NetworkFailure> failure); public abstract void addFailures(long messageId, List<NetworkFailure> failure);
public abstract void removeFailure(long messageId, NetworkFailure failure); public abstract void setNetworkFailures(long messageId, Set<NetworkFailure> failures);
public abstract @NonNull Pair<Long, Long> insertReceivedCall(@NonNull RecipientId address, boolean isVideoOffer); public abstract @NonNull Pair<Long, Long> insertReceivedCall(@NonNull RecipientId address, boolean isVideoOffer);
public abstract @NonNull Pair<Long, Long> insertOutgoingCall(@NonNull RecipientId address, boolean isVideoOffer); public abstract @NonNull Pair<Long, Long> insertOutgoingCall(@NonNull RecipientId address, boolean isVideoOffer);
@ -395,7 +395,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
try { try {
addToDocument(messageId, MISMATCHED_IDENTITIES, addToDocument(messageId, MISMATCHED_IDENTITIES,
new IdentityKeyMismatch(recipientId, identityKey), new IdentityKeyMismatch(recipientId, identityKey),
IdentityKeyMismatchList.class); IdentityKeyMismatchSet.class);
} catch (IOException e) { } catch (IOException e) {
Log.w(TAG, e); Log.w(TAG, e);
} }
@ -405,7 +405,15 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
try { try {
removeFromDocument(messageId, MISMATCHED_IDENTITIES, removeFromDocument(messageId, MISMATCHED_IDENTITIES,
new IdentityKeyMismatch(recipientId, identityKey), new IdentityKeyMismatch(recipientId, identityKey),
IdentityKeyMismatchList.class); IdentityKeyMismatchSet.class);
} catch (IOException e) {
Log.w(TAG, e);
}
}
public void setMismatchedIdentities(long messageId, @NonNull Set<IdentityKeyMismatch> mismatches) {
try {
setDocument(databaseHelper.getSignalWritableDatabase(), messageId, MISMATCHED_IDENTITIES, new IdentityKeyMismatchSet(mismatches));
} catch (IOException e) { } catch (IOException e) {
Log.w(TAG, e); Log.w(TAG, e);
} }
@ -458,7 +466,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
try { try {
D document = getDocument(database, messageId, column, clazz); D document = getDocument(database, messageId, column, clazz);
Iterator<I> iterator = document.getList().iterator(); Iterator<I> iterator = document.getItems().iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
I item = iterator.next(); I item = iterator.next();
@ -490,7 +498,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
try { try {
T document = getDocument(database, messageId, column, clazz); T document = getDocument(database, messageId, column, clazz);
document.getList().addAll(objects); document.getItems().addAll(objects);
setDocument(database, messageId, column, document); setDocument(database, messageId, column, document);
database.setTransactionSuccessful(); database.setTransactionSuccessful();
@ -499,7 +507,7 @@ public abstract class MessageDatabase extends Database implements MmsSmsColumns
} }
} }
private void setDocument(SQLiteDatabase database, long messageId, String column, Document document) throws IOException { protected void setDocument(SQLiteDatabase database, long messageId, String column, Document document) throws IOException {
ContentValues contentValues = new ContentValues(); ContentValues contentValues = new ContentValues();
if (document == null || document.size() == 0) { if (document == null || document.size() == 0) {

Wyświetl plik

@ -41,9 +41,9 @@ import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
import org.thoughtcrime.securesms.attachments.MmsNotificationAttachment; import org.thoughtcrime.securesms.attachments.MmsNotificationAttachment;
import org.thoughtcrime.securesms.contactshare.Contact; import org.thoughtcrime.securesms.contactshare.Contact;
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchList; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchSet;
import org.thoughtcrime.securesms.database.documents.NetworkFailure; import org.thoughtcrime.securesms.database.documents.NetworkFailure;
import org.thoughtcrime.securesms.database.documents.NetworkFailureList; import org.thoughtcrime.securesms.database.documents.NetworkFailureSet;
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord; import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord;
import org.thoughtcrime.securesms.database.model.Mention; import org.thoughtcrime.securesms.database.model.Mention;
@ -56,7 +56,6 @@ import org.thoughtcrime.securesms.database.model.SmsMessageRecord;
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList; import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange; import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange;
import org.thoughtcrime.securesms.jobs.ThreadUpdateJob;
import org.thoughtcrime.securesms.jobs.TrimThreadJob; import org.thoughtcrime.securesms.jobs.TrimThreadJob;
import org.thoughtcrime.securesms.linkpreview.LinkPreview; import org.thoughtcrime.securesms.linkpreview.LinkPreview;
import org.thoughtcrime.securesms.mms.IncomingMediaMessage; import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
@ -603,16 +602,16 @@ public class MmsDatabase extends MessageDatabase {
@Override @Override
public void addFailures(long messageId, List<NetworkFailure> failure) { public void addFailures(long messageId, List<NetworkFailure> failure) {
try { try {
addToDocument(messageId, NETWORK_FAILURE, failure, NetworkFailureList.class); addToDocument(messageId, NETWORK_FAILURE, failure, NetworkFailureSet.class);
} catch (IOException e) { } catch (IOException e) {
Log.w(TAG, e); Log.w(TAG, e);
} }
} }
@Override @Override
public void removeFailure(long messageId, NetworkFailure failure) { public void setNetworkFailures(long messageId, Set<NetworkFailure> failures) {
try { try {
removeFromDocument(messageId, NETWORK_FAILURE, failure, NetworkFailureList.class); setDocument(databaseHelper.getSignalWritableDatabase(), messageId, NETWORK_FAILURE, new NetworkFailureSet(failures));
} catch (IOException e) { } catch (IOException e) {
Log.w(TAG, e); Log.w(TAG, e);
} }
@ -1176,8 +1175,8 @@ public class MmsDatabase extends MessageDatabase {
.map(a -> (Attachment)a).toList(); .map(a -> (Attachment)a).toList();
Recipient recipient = Recipient.resolved(RecipientId.from(recipientId)); Recipient recipient = Recipient.resolved(RecipientId.from(recipientId));
List<NetworkFailure> networkFailures = new LinkedList<>(); Set<NetworkFailure> networkFailures = new HashSet<>();
List<IdentityKeyMismatch> mismatches = new LinkedList<>(); Set<IdentityKeyMismatch> mismatches = new HashSet<>();
QuoteModel quote = null; QuoteModel quote = null;
if (quoteId > 0 && quoteAuthor > 0 && (!TextUtils.isEmpty(quoteText) || !quoteAttachments.isEmpty())) { if (quoteId > 0 && quoteAuthor > 0 && (!TextUtils.isEmpty(quoteText) || !quoteAttachments.isEmpty())) {
@ -1186,7 +1185,7 @@ public class MmsDatabase extends MessageDatabase {
if (!TextUtils.isEmpty(mismatchDocument)) { if (!TextUtils.isEmpty(mismatchDocument)) {
try { try {
mismatches = JsonUtils.fromJson(mismatchDocument, IdentityKeyMismatchList.class).getList(); mismatches = JsonUtils.fromJson(mismatchDocument, IdentityKeyMismatchSet.class).getItems();
} catch (IOException e) { } catch (IOException e) {
Log.w(TAG, e); Log.w(TAG, e);
} }
@ -1194,7 +1193,7 @@ public class MmsDatabase extends MessageDatabase {
if (!TextUtils.isEmpty(networkDocument)) { if (!TextUtils.isEmpty(networkDocument)) {
try { try {
networkFailures = JsonUtils.fromJson(networkDocument, NetworkFailureList.class).getList(); networkFailures = JsonUtils.fromJson(networkDocument, NetworkFailureSet.class).getItems();
} catch (IOException e) { } catch (IOException e) {
Log.w(TAG, e); Log.w(TAG, e);
} }
@ -1975,8 +1974,8 @@ public class MmsDatabase extends MessageDatabase {
slideDeck, slideDeck,
slideDeck.getSlides().size(), slideDeck.getSlides().size(),
message.isSecure() ? MmsSmsColumns.Types.getOutgoingEncryptedMessageType() : MmsSmsColumns.Types.getOutgoingSmsMessageType(), message.isSecure() ? MmsSmsColumns.Types.getOutgoingEncryptedMessageType() : MmsSmsColumns.Types.getOutgoingSmsMessageType(),
new LinkedList<>(), Collections.emptySet(),
new LinkedList<>(), Collections.emptySet(),
message.getSubscriptionId(), message.getSubscriptionId(),
message.getExpiresIn(), message.getExpiresIn(),
System.currentTimeMillis(), System.currentTimeMillis(),
@ -2111,8 +2110,8 @@ public class MmsDatabase extends MessageDatabase {
} }
Recipient recipient = Recipient.live(RecipientId.from(recipientId)).get(); Recipient recipient = Recipient.live(RecipientId.from(recipientId)).get();
List<IdentityKeyMismatch> mismatches = getMismatchedIdentities(mismatchDocument); Set<IdentityKeyMismatch> mismatches = getMismatchedIdentities(mismatchDocument);
List<NetworkFailure> networkFailures = getFailures(networkDocument); Set<NetworkFailure> networkFailures = getFailures(networkDocument);
List<DatabaseAttachment> attachments = DatabaseFactory.getAttachmentDatabase(context).getAttachments(cursor); List<DatabaseAttachment> attachments = DatabaseFactory.getAttachmentDatabase(context).getAttachments(cursor);
List<Contact> contacts = getSharedContacts(cursor, attachments); List<Contact> contacts = getSharedContacts(cursor, attachments);
Set<Attachment> contactAttachments = Stream.of(contacts).map(Contact::getAvatarAttachment).withoutNulls().collect(Collectors.toSet()); Set<Attachment> contactAttachments = Stream.of(contacts).map(Contact::getAvatarAttachment).withoutNulls().collect(Collectors.toSet());
@ -2129,28 +2128,28 @@ public class MmsDatabase extends MessageDatabase {
remoteDelete, mentionsSelf, notifiedTimestamp, viewedReceiptCount, receiptTimestamp); remoteDelete, mentionsSelf, notifiedTimestamp, viewedReceiptCount, receiptTimestamp);
} }
private List<IdentityKeyMismatch> getMismatchedIdentities(String document) { private Set<IdentityKeyMismatch> getMismatchedIdentities(String document) {
if (!TextUtils.isEmpty(document)) { if (!TextUtils.isEmpty(document)) {
try { try {
return JsonUtils.fromJson(document, IdentityKeyMismatchList.class).getList(); return JsonUtils.fromJson(document, IdentityKeyMismatchSet.class).getItems();
} catch (IOException e) { } catch (IOException e) {
Log.w(TAG, e); Log.w(TAG, e);
} }
} }
return new LinkedList<>(); return Collections.emptySet();
} }
private List<NetworkFailure> getFailures(String document) { private Set<NetworkFailure> getFailures(String document) {
if (!TextUtils.isEmpty(document)) { if (!TextUtils.isEmpty(document)) {
try { try {
return JsonUtils.fromJson(document, NetworkFailureList.class).getList(); return JsonUtils.fromJson(document, NetworkFailureSet.class).getItems();
} catch (IOException ioe) { } catch (IOException ioe) {
Log.w(TAG, ioe); Log.w(TAG, ioe);
} }
} }
return new LinkedList<>(); return Collections.emptySet();
} }
public static SlideDeck buildSlideDeck(@NonNull Context context, @NonNull List<DatabaseAttachment> attachments) { public static SlideDeck buildSlideDeck(@NonNull Context context, @NonNull List<DatabaseAttachment> attachments) {

Wyświetl plik

@ -33,7 +33,7 @@ import net.sqlcipher.database.SQLiteStatement;
import org.signal.core.util.logging.Log; import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchList; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchSet;
import org.thoughtcrime.securesms.database.documents.NetworkFailure; import org.thoughtcrime.securesms.database.documents.NetworkFailure;
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
import org.thoughtcrime.securesms.database.model.GroupCallUpdateDetailsUtil; import org.thoughtcrime.securesms.database.model.GroupCallUpdateDetailsUtil;
@ -45,7 +45,6 @@ import org.thoughtcrime.securesms.database.model.databaseprotos.GroupCallUpdateD
import org.thoughtcrime.securesms.database.model.databaseprotos.ProfileChangeDetails; import org.thoughtcrime.securesms.database.model.databaseprotos.ProfileChangeDetails;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange; import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange;
import org.thoughtcrime.securesms.jobs.ThreadUpdateJob;
import org.thoughtcrime.securesms.jobs.TrimThreadJob; import org.thoughtcrime.securesms.jobs.TrimThreadJob;
import org.thoughtcrime.securesms.mms.IncomingMediaMessage; import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
import org.thoughtcrime.securesms.mms.MmsException; import org.thoughtcrime.securesms.mms.MmsException;
@ -1548,7 +1547,7 @@ public class SmsDatabase extends MessageDatabase {
} }
@Override @Override
public void removeFailure(long messageId, NetworkFailure failure) { public void setNetworkFailures(long messageId, Set<NetworkFailure> failures) {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
@ -1642,7 +1641,7 @@ public class SmsDatabase extends MessageDatabase {
message.isSecureMessage() ? MmsSmsColumns.Types.getOutgoingEncryptedMessageType() : MmsSmsColumns.Types.getOutgoingSmsMessageType(), message.isSecureMessage() ? MmsSmsColumns.Types.getOutgoingEncryptedMessageType() : MmsSmsColumns.Types.getOutgoingSmsMessageType(),
threadId, threadId,
0, 0,
new LinkedList<>(), new HashSet<>(),
message.getSubscriptionId(), message.getSubscriptionId(),
message.getExpiresIn(), message.getExpiresIn(),
System.currentTimeMillis(), System.currentTimeMillis(),
@ -1704,7 +1703,7 @@ public class SmsDatabase extends MessageDatabase {
readReceiptCount = 0; readReceiptCount = 0;
} }
List<IdentityKeyMismatch> mismatches = getMismatches(mismatchDocument); Set<IdentityKeyMismatch> mismatches = getMismatches(mismatchDocument);
Recipient recipient = Recipient.live(RecipientId.from(recipientId)).get(); Recipient recipient = Recipient.live(RecipientId.from(recipientId)).get();
return new SmsMessageRecord(messageId, body, recipient, return new SmsMessageRecord(messageId, body, recipient,
@ -1717,16 +1716,16 @@ public class SmsDatabase extends MessageDatabase {
notifiedTimestamp, receiptTimestamp); notifiedTimestamp, receiptTimestamp);
} }
private List<IdentityKeyMismatch> getMismatches(String document) { private Set<IdentityKeyMismatch> getMismatches(String document) {
try { try {
if (!TextUtils.isEmpty(document)) { if (!TextUtils.isEmpty(document)) {
return JsonUtils.fromJson(document, IdentityKeyMismatchList.class).getList(); return JsonUtils.fromJson(document, IdentityKeyMismatchSet.class).getItems();
} }
} catch (IOException e) { } catch (IOException e) {
Log.w(TAG, e); Log.w(TAG, e);
} }
return new LinkedList<>(); return Collections.emptySet();
} }
@Override @Override

Wyświetl plik

@ -1,10 +1,8 @@
package org.thoughtcrime.securesms.database.documents; package org.thoughtcrime.securesms.database.documents;
import java.util.List; import java.util.Set;
public interface Document<T> { public interface Document<T> {
int size();
public int size(); Set<T> getItems();
public List<T> getList();
} }

Wyświetl plik

@ -3,19 +3,21 @@ package org.thoughtcrime.securesms.database.documents;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set;
public class IdentityKeyMismatchList implements Document<IdentityKeyMismatch> { public class IdentityKeyMismatchSet implements Document<IdentityKeyMismatch> {
@JsonProperty(value = "m") @JsonProperty(value = "m")
private List<IdentityKeyMismatch> mismatches; private Set<IdentityKeyMismatch> mismatches;
public IdentityKeyMismatchList() { public IdentityKeyMismatchSet() {
this.mismatches = new LinkedList<>(); this.mismatches = new HashSet<>();
} }
public IdentityKeyMismatchList(List<IdentityKeyMismatch> mismatches) { public IdentityKeyMismatchSet(Set<IdentityKeyMismatch> mismatches) {
this.mismatches = mismatches; this.mismatches = mismatches;
} }
@ -27,7 +29,7 @@ public class IdentityKeyMismatchList implements Document<IdentityKeyMismatch> {
@Override @Override
@JsonIgnore @JsonIgnore
public List<IdentityKeyMismatch> getList() { public Set<IdentityKeyMismatch> getItems() {
return mismatches; return mismatches;
} }
} }

Wyświetl plik

@ -3,19 +3,21 @@ package org.thoughtcrime.securesms.database.documents;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set;
public class NetworkFailureList implements Document<NetworkFailure> { public class NetworkFailureSet implements Document<NetworkFailure> {
@JsonProperty(value = "l") @JsonProperty(value = "l")
private List<NetworkFailure> failures; private Set<NetworkFailure> failures;
public NetworkFailureList() { public NetworkFailureSet() {
this.failures = new LinkedList<>(); this.failures = new HashSet<>();
} }
public NetworkFailureList(List<NetworkFailure> failures) { public NetworkFailureSet(Set<NetworkFailure> failures) {
this.failures = failures; this.failures = failures;
} }
@ -27,7 +29,7 @@ public class NetworkFailureList implements Document<NetworkFailure> {
@Override @Override
@JsonIgnore @JsonIgnore
public List<NetworkFailure> getList() { public Set<NetworkFailure> getItems() {
return failures; return failures;
} }
} }

Wyświetl plik

@ -40,8 +40,8 @@ public class InMemoryMessageRecord extends MessageRecord {
0, 0,
0, 0,
type, type,
Collections.emptyList(), Collections.emptySet(),
Collections.emptyList(), Collections.emptySet(),
-1, -1,
0, 0,
System.currentTimeMillis(), System.currentTimeMillis(),

Wyświetl plik

@ -72,8 +72,8 @@ public class MediaMmsMessageRecord extends MmsMessageRecord {
@NonNull SlideDeck slideDeck, @NonNull SlideDeck slideDeck,
int partCount, int partCount,
long mailbox, long mailbox,
List<IdentityKeyMismatch> mismatches, Set<IdentityKeyMismatch> mismatches,
List<NetworkFailure> failures, Set<NetworkFailure> failures,
int subscriptionId, int subscriptionId,
long expiresIn, long expiresIn,
long expireStarted, long expireStarted,

Wyświetl plik

@ -61,6 +61,7 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Set;
import java.util.UUID; import java.util.UUID;
/** /**
@ -78,8 +79,8 @@ public abstract class MessageRecord extends DisplayRecord {
private final Recipient individualRecipient; private final Recipient individualRecipient;
private final int recipientDeviceId; private final int recipientDeviceId;
private final long id; private final long id;
private final List<IdentityKeyMismatch> mismatches; private final Set<IdentityKeyMismatch> mismatches;
private final List<NetworkFailure> networkFailures; private final Set<NetworkFailure> networkFailures;
private final int subscriptionId; private final int subscriptionId;
private final long expiresIn; private final long expiresIn;
private final long expireStarted; private final long expireStarted;
@ -94,8 +95,8 @@ public abstract class MessageRecord extends DisplayRecord {
Recipient individualRecipient, int recipientDeviceId, Recipient individualRecipient, int recipientDeviceId,
long dateSent, long dateReceived, long dateServer, long threadId, long dateSent, long dateReceived, long dateServer, long threadId,
int deliveryStatus, int deliveryReceiptCount, long type, int deliveryStatus, int deliveryReceiptCount, long type,
List<IdentityKeyMismatch> mismatches, Set<IdentityKeyMismatch> mismatches,
List<NetworkFailure> networkFailures, Set<NetworkFailure> networkFailures,
int subscriptionId, long expiresIn, long expireStarted, int subscriptionId, long expiresIn, long expireStarted,
int readReceiptCount, boolean unidentified, int readReceiptCount, boolean unidentified,
@NonNull List<ReactionRecord> reactions, boolean remoteDelete, long notifiedTimestamp, @NonNull List<ReactionRecord> reactions, boolean remoteDelete, long notifiedTimestamp,
@ -512,11 +513,11 @@ public abstract class MessageRecord extends DisplayRecord {
return type; return type;
} }
public List<IdentityKeyMismatch> getIdentityKeyMismatches() { public Set<IdentityKeyMismatch> getIdentityKeyMismatches() {
return mismatches; return mismatches;
} }
public List<NetworkFailure> getNetworkFailures() { public Set<NetworkFailure> getNetworkFailures() {
return networkFailures; return networkFailures;
} }

Wyświetl plik

@ -14,6 +14,7 @@ import org.thoughtcrime.securesms.recipients.Recipient;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set;
public abstract class MmsMessageRecord extends MessageRecord { public abstract class MmsMessageRecord extends MessageRecord {
@ -27,8 +28,8 @@ public abstract class MmsMessageRecord extends MessageRecord {
MmsMessageRecord(long id, String body, Recipient conversationRecipient, MmsMessageRecord(long id, String body, Recipient conversationRecipient,
Recipient individualRecipient, int recipientDeviceId, long dateSent, Recipient individualRecipient, int recipientDeviceId, long dateSent,
long dateReceived, long dateServer, long threadId, int deliveryStatus, int deliveryReceiptCount, long dateReceived, long dateServer, long threadId, int deliveryStatus, int deliveryReceiptCount,
long type, List<IdentityKeyMismatch> mismatches, long type, Set<IdentityKeyMismatch> mismatches,
List<NetworkFailure> networkFailures, int subscriptionId, long expiresIn, Set<NetworkFailure> networkFailures, int subscriptionId, long expiresIn,
long expireStarted, boolean viewOnce, long expireStarted, boolean viewOnce,
@NonNull SlideDeck slideDeck, int readReceiptCount, @NonNull SlideDeck slideDeck, int readReceiptCount,
@Nullable Quote quote, @NonNull List<Contact> contacts, @Nullable Quote quote, @NonNull List<Contact> contacts,

Wyświetl plik

@ -28,6 +28,7 @@ import org.thoughtcrime.securesms.mms.SlideDeck;
import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.Recipient;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
/** /**
@ -56,7 +57,7 @@ public class NotificationMmsMessageRecord extends MmsMessageRecord {
{ {
super(id, "", conversationRecipient, individualRecipient, recipientDeviceId, super(id, "", conversationRecipient, individualRecipient, recipientDeviceId,
dateSent, dateReceived, -1, threadId, Status.STATUS_NONE, deliveryReceiptCount, mailbox, dateSent, dateReceived, -1, threadId, Status.STATUS_NONE, deliveryReceiptCount, mailbox,
new LinkedList<>(), new LinkedList<>(), subscriptionId, new HashSet<>(), new HashSet<>(), subscriptionId,
0, 0, false, slideDeck, readReceiptCount, null, Collections.emptyList(), Collections.emptyList(), false, 0, 0, false, slideDeck, readReceiptCount, null, Collections.emptyList(), Collections.emptyList(), false,
Collections.emptyList(), false, 0, viewedReceiptCount, receiptTimestamp); Collections.emptyList(), false, 0, viewedReceiptCount, receiptTimestamp);

Wyświetl plik

@ -29,8 +29,10 @@ import org.thoughtcrime.securesms.database.SmsDatabase;
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.Recipient;
import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* The message record model which represents standard SMS messages. * The message record model which represents standard SMS messages.
@ -48,7 +50,7 @@ public class SmsMessageRecord extends MessageRecord {
long dateSent, long dateReceived, long dateServer, long dateSent, long dateReceived, long dateServer,
int deliveryReceiptCount, int deliveryReceiptCount,
long type, long threadId, long type, long threadId,
int status, List<IdentityKeyMismatch> mismatches, int status, Set<IdentityKeyMismatch> mismatches,
int subscriptionId, long expiresIn, long expireStarted, int subscriptionId, long expiresIn, long expireStarted,
int readReceiptCount, boolean unidentified, int readReceiptCount, boolean unidentified,
@NonNull List<ReactionRecord> reactions, boolean remoteDelete, @NonNull List<ReactionRecord> reactions, boolean remoteDelete,
@ -56,7 +58,7 @@ public class SmsMessageRecord extends MessageRecord {
{ {
super(id, body, recipient, individualRecipient, recipientDeviceId, super(id, body, recipient, individualRecipient, recipientDeviceId,
dateSent, dateReceived, dateServer, threadId, status, deliveryReceiptCount, type, dateSent, dateReceived, dateServer, threadId, status, deliveryReceiptCount, type,
mismatches, new LinkedList<>(), subscriptionId, mismatches, new HashSet<>(), subscriptionId,
expiresIn, expireStarted, readReceiptCount, unidentified, reactions, remoteDelete, notifiedTimestamp, 0, receiptTimestamp); expiresIn, expireStarted, readReceiptCount, unidentified, reactions, remoteDelete, notifiedTimestamp, 0, receiptTimestamp);
} }

Wyświetl plik

@ -153,8 +153,8 @@ public final class PushGroupSendJob extends PushSendJob {
MessageDatabase database = DatabaseFactory.getMmsDatabase(context); MessageDatabase database = DatabaseFactory.getMmsDatabase(context);
OutgoingMediaMessage message = database.getOutgoingMessage(messageId); OutgoingMediaMessage message = database.getOutgoingMessage(messageId);
long threadId = database.getMessageRecord(messageId).getThreadId(); long threadId = database.getMessageRecord(messageId).getThreadId();
List<NetworkFailure> existingNetworkFailures = message.getNetworkFailures(); Set<NetworkFailure> existingNetworkFailures = message.getNetworkFailures();
List<IdentityKeyMismatch> existingIdentityMismatches = message.getIdentityKeyMismatches(); Set<IdentityKeyMismatch> existingIdentityMismatches = message.getIdentityKeyMismatches();
ApplicationDependencies.getJobManager().cancelAllInQueue(TypingSendJob.getQueue(threadId)); ApplicationDependencies.getJobManager().cancelAllInQueue(TypingSendJob.getQueue(threadId));
@ -183,8 +183,8 @@ public final class PushGroupSendJob extends PushSendJob {
List<Recipient> target; List<Recipient> target;
if (filterRecipient != null) target = Collections.singletonList(Recipient.resolved(filterRecipient)); if (filterRecipient != null) target = Collections.singletonList(Recipient.resolved(filterRecipient));
else if (!existingNetworkFailures.isEmpty()) target = Stream.of(existingNetworkFailures).map(nf -> Recipient.resolved(nf.getRecipientId(context))).toList(); else if (!existingNetworkFailures.isEmpty()) target = Stream.of(existingNetworkFailures).map(nf -> nf.getRecipientId(context)).distinct().map(Recipient::resolved).toList();
else target = getGroupMessageRecipients(groupRecipient.requireGroupId(), messageId); else target = Stream.of(getGroupMessageRecipients(groupRecipient.requireGroupId(), messageId)).distinctBy(Recipient::getId).toList();
RecipientAccessList accessList = new RecipientAccessList(target); RecipientAccessList accessList = new RecipientAccessList(target);
@ -206,23 +206,11 @@ public final class PushGroupSendJob extends PushSendJob {
recipientDatabase.markUnregistered(unregistered.getId()); recipientDatabase.markUnregistered(unregistered.getId());
} }
for (NetworkFailure resolvedFailure : resolvedNetworkFailures) { existingNetworkFailures.removeAll(resolvedNetworkFailures);
database.removeFailure(messageId, resolvedFailure); database.setNetworkFailures(messageId, existingNetworkFailures);
existingNetworkFailures.remove(resolvedFailure);
}
for (IdentityKeyMismatch resolvedIdentity : resolvedIdentityFailures) { existingIdentityMismatches.removeAll(resolvedIdentityFailures);
database.removeMismatchedIdentity(messageId, resolvedIdentity.getRecipientId(context), resolvedIdentity.getIdentityKey()); database.setMismatchedIdentities(messageId, existingIdentityMismatches);
existingIdentityMismatches.remove(resolvedIdentity);
}
if (!networkFailures.isEmpty()) {
database.addFailures(messageId, networkFailures);
}
for (IdentityKeyMismatch mismatch : identityMismatches) {
database.addMismatchedIdentity(messageId, mismatch.getRecipientId(context), mismatch.getIdentityKey());
}
DatabaseFactory.getGroupReceiptDatabase(context).setUnidentified(successUnidentifiedStatus, messageId); DatabaseFactory.getGroupReceiptDatabase(context).setUnidentified(successUnidentifiedStatus, messageId);

Wyświetl plik

@ -201,7 +201,7 @@ class MediaSelectionRepository(context: Context) {
isViewOnce, isViewOnce,
ThreadDatabase.DistributionTypes.DEFAULT, ThreadDatabase.DistributionTypes.DEFAULT,
null, emptyList(), emptyList(), null, emptyList(), emptyList(),
mentions, emptyList(), emptyList() mentions, mutableSetOf(), mutableSetOf()
) )
messages.add(OutgoingSecureMediaMessage(message)) messages.add(OutgoingSecureMediaMessage(message))

Wyświetl plik

@ -1359,7 +1359,7 @@ public final class MessageContentProcessor {
sharedContacts.or(Collections.emptyList()), sharedContacts.or(Collections.emptyList()),
previews.or(Collections.emptyList()), previews.or(Collections.emptyList()),
mentions.or(Collections.emptyList()), mentions.or(Collections.emptyList()),
Collections.emptyList(), Collections.emptyList()); Collections.emptySet(), Collections.emptySet());
mediaMessage = new OutgoingSecureMediaMessage(mediaMessage); mediaMessage = new OutgoingSecureMediaMessage(mediaMessage);

Wyświetl plik

@ -13,8 +13,10 @@ import org.thoughtcrime.securesms.database.model.Mention;
import org.thoughtcrime.securesms.linkpreview.LinkPreview; import org.thoughtcrime.securesms.linkpreview.LinkPreview;
import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.Recipient;
import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set;
public class OutgoingMediaMessage { public class OutgoingMediaMessage {
@ -28,8 +30,8 @@ public class OutgoingMediaMessage {
private final boolean viewOnce; private final boolean viewOnce;
private final QuoteModel outgoingQuote; private final QuoteModel outgoingQuote;
private final List<NetworkFailure> networkFailures = new LinkedList<>(); private final Set<NetworkFailure> networkFailures = new HashSet<>();
private final List<IdentityKeyMismatch> identityKeyMismatches = new LinkedList<>(); private final Set<IdentityKeyMismatch> identityKeyMismatches = new HashSet<>();
private final List<Contact> contacts = new LinkedList<>(); private final List<Contact> contacts = new LinkedList<>();
private final List<LinkPreview> linkPreviews = new LinkedList<>(); private final List<LinkPreview> linkPreviews = new LinkedList<>();
private final List<Mention> mentions = new LinkedList<>(); private final List<Mention> mentions = new LinkedList<>();
@ -42,8 +44,8 @@ public class OutgoingMediaMessage {
@NonNull List<Contact> contacts, @NonNull List<Contact> contacts,
@NonNull List<LinkPreview> linkPreviews, @NonNull List<LinkPreview> linkPreviews,
@NonNull List<Mention> mentions, @NonNull List<Mention> mentions,
@NonNull List<NetworkFailure> networkFailures, @NonNull Set<NetworkFailure> networkFailures,
@NonNull List<IdentityKeyMismatch> identityKeyMismatches) @NonNull Set<IdentityKeyMismatch> identityKeyMismatches)
{ {
this.recipient = recipient; this.recipient = recipient;
this.body = message; this.body = message;
@ -75,7 +77,7 @@ public class OutgoingMediaMessage {
slideDeck.asAttachments(), slideDeck.asAttachments(),
sentTimeMillis, subscriptionId, sentTimeMillis, subscriptionId,
expiresIn, viewOnce, distributionType, outgoingQuote, expiresIn, viewOnce, distributionType, outgoingQuote,
contacts, linkPreviews, mentions, new LinkedList<>(), new LinkedList<>()); contacts, linkPreviews, mentions, new HashSet<>(), new HashSet<>());
} }
public OutgoingMediaMessage(OutgoingMediaMessage that) { public OutgoingMediaMessage(OutgoingMediaMessage that) {
@ -175,11 +177,11 @@ public class OutgoingMediaMessage {
return mentions; return mentions;
} }
public @NonNull List<NetworkFailure> getNetworkFailures() { public @NonNull Set<NetworkFailure> getNetworkFailures() {
return networkFailures; return networkFailures;
} }
public @NonNull List<IdentityKeyMismatch> getIdentityKeyMismatches() { public @NonNull Set<IdentityKeyMismatch> getIdentityKeyMismatches() {
return identityKeyMismatches; return identityKeyMismatches;
} }

Wyświetl plik

@ -25,7 +25,7 @@ public class OutgoingSecureMediaMessage extends OutgoingMediaMessage {
@NonNull List<LinkPreview> previews, @NonNull List<LinkPreview> previews,
@NonNull List<Mention> mentions) @NonNull List<Mention> mentions)
{ {
super(recipient, body, attachments, sentTimeMillis, -1, expiresIn, viewOnce, distributionType, quote, contacts, previews, mentions, Collections.emptyList(), Collections.emptyList()); super(recipient, body, attachments, sentTimeMillis, -1, expiresIn, viewOnce, distributionType, quote, contacts, previews, mentions, Collections.emptySet(), Collections.emptySet());
} }
public OutgoingSecureMediaMessage(OutgoingMediaMessage base) { public OutgoingSecureMediaMessage(OutgoingMediaMessage base) {

Wyświetl plik

@ -90,8 +90,8 @@ public class RemoteReplyReceiver extends BroadcastReceiver {
Collections.emptyList(), Collections.emptyList(),
Collections.emptyList(), Collections.emptyList(),
Collections.emptyList(), Collections.emptyList(),
Collections.emptyList(), Collections.emptySet(),
Collections.emptyList()); Collections.emptySet());
threadId = MessageSender.send(context, reply, -1, false, null, null); threadId = MessageSender.send(context, reply, -1, false, null, null);
break; break;
} }

Wyświetl plik

@ -38,8 +38,8 @@ object TestMms {
emptyList(), emptyList(),
emptyList(), emptyList(),
emptyList(), emptyList(),
emptyList(), emptySet(),
emptyList() emptySet()
) )
return insertMmsMessage( return insertMmsMessage(