|
|
@ -18,6 +18,7 @@ import org.thoughtcrime.securesms.crypto.storage.TextSecureSessionStore;
|
|
|
|
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
|
|
|
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
|
|
|
import org.thoughtcrime.securesms.database.EncryptingSmsDatabase;
|
|
|
|
import org.thoughtcrime.securesms.database.EncryptingSmsDatabase;
|
|
|
|
import org.thoughtcrime.securesms.database.GroupDatabase;
|
|
|
|
import org.thoughtcrime.securesms.database.GroupDatabase;
|
|
|
|
|
|
|
|
import org.thoughtcrime.securesms.database.MessagingDatabase.InsertResult;
|
|
|
|
import org.thoughtcrime.securesms.database.MessagingDatabase.SyncMessageId;
|
|
|
|
import org.thoughtcrime.securesms.database.MessagingDatabase.SyncMessageId;
|
|
|
|
import org.thoughtcrime.securesms.database.MmsDatabase;
|
|
|
|
import org.thoughtcrime.securesms.database.MmsDatabase;
|
|
|
|
import org.thoughtcrime.securesms.database.NoSuchMessageException;
|
|
|
|
import org.thoughtcrime.securesms.database.NoSuchMessageException;
|
|
|
@ -196,24 +197,27 @@ public class PushDecryptJob extends ContextJob {
|
|
|
|
message.getTimestamp(),
|
|
|
|
message.getTimestamp(),
|
|
|
|
"", Optional.<SignalServiceGroup>absent(), 0);
|
|
|
|
"", Optional.<SignalServiceGroup>absent(), 0);
|
|
|
|
|
|
|
|
|
|
|
|
long threadId;
|
|
|
|
Long threadId;
|
|
|
|
|
|
|
|
|
|
|
|
if (!smsMessageId.isPresent()) {
|
|
|
|
if (!smsMessageId.isPresent()) {
|
|
|
|
IncomingEndSessionMessage incomingEndSessionMessage = new IncomingEndSessionMessage(incomingTextMessage);
|
|
|
|
IncomingEndSessionMessage incomingEndSessionMessage = new IncomingEndSessionMessage(incomingTextMessage);
|
|
|
|
Pair<Long, Long> messageAndThreadId = smsDatabase.insertMessageInbox(masterSecret, incomingEndSessionMessage);
|
|
|
|
Optional<InsertResult> insertResult = smsDatabase.insertMessageInbox(masterSecret, incomingEndSessionMessage);
|
|
|
|
|
|
|
|
|
|
|
|
threadId = messageAndThreadId.second;
|
|
|
|
if (insertResult.isPresent()) threadId = insertResult.get().getThreadId();
|
|
|
|
|
|
|
|
else threadId = null;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
smsDatabase.markAsEndSession(smsMessageId.get());
|
|
|
|
smsDatabase.markAsEndSession(smsMessageId.get());
|
|
|
|
threadId = smsDatabase.getThreadIdForMessage(smsMessageId.get());
|
|
|
|
threadId = smsDatabase.getThreadIdForMessage(smsMessageId.get());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (threadId != null) {
|
|
|
|
SessionStore sessionStore = new TextSecureSessionStore(context);
|
|
|
|
SessionStore sessionStore = new TextSecureSessionStore(context);
|
|
|
|
sessionStore.deleteAllSessions(envelope.getSource());
|
|
|
|
sessionStore.deleteAllSessions(envelope.getSource());
|
|
|
|
|
|
|
|
|
|
|
|
SecurityEvent.broadcastSecurityUpdateEvent(context);
|
|
|
|
SecurityEvent.broadcastSecurityUpdateEvent(context);
|
|
|
|
MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), threadId);
|
|
|
|
MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), threadId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void handleGroupMessage(@NonNull MasterSecretUnion masterSecret,
|
|
|
|
private void handleGroupMessage(@NonNull MasterSecretUnion masterSecret,
|
|
|
|
@NonNull SignalServiceEnvelope envelope,
|
|
|
|
@NonNull SignalServiceEnvelope envelope,
|
|
|
@ -363,13 +367,15 @@ public class PushDecryptJob extends ContextJob {
|
|
|
|
handleExpirationUpdate(masterSecret, envelope, message, Optional.<Long>absent());
|
|
|
|
handleExpirationUpdate(masterSecret, envelope, message, Optional.<Long>absent());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Pair<Long, Long> messageAndThreadId = database.insertSecureDecryptedMessageInbox(masterSecret, mediaMessage, -1);
|
|
|
|
Optional<InsertResult> insertResult = database.insertSecureDecryptedMessageInbox(masterSecret, mediaMessage, -1);
|
|
|
|
List<DatabaseAttachment> attachments = DatabaseFactory.getAttachmentDatabase(context).getAttachmentsForMessage(messageAndThreadId.first);
|
|
|
|
|
|
|
|
|
|
|
|
if (insertResult.isPresent()) {
|
|
|
|
|
|
|
|
List<DatabaseAttachment> attachments = DatabaseFactory.getAttachmentDatabase(context).getAttachmentsForMessage(insertResult.get().getMessageId());
|
|
|
|
|
|
|
|
|
|
|
|
for (DatabaseAttachment attachment : attachments) {
|
|
|
|
for (DatabaseAttachment attachment : attachments) {
|
|
|
|
ApplicationContext.getInstance(context)
|
|
|
|
ApplicationContext.getInstance(context)
|
|
|
|
.getJobManager()
|
|
|
|
.getJobManager()
|
|
|
|
.add(new AttachmentDownloadJob(context, messageAndThreadId.first,
|
|
|
|
.add(new AttachmentDownloadJob(context, insertResult.get().getMessageId(),
|
|
|
|
attachment.getAttachmentId()));
|
|
|
|
attachment.getAttachmentId()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -377,7 +383,8 @@ public class PushDecryptJob extends ContextJob {
|
|
|
|
DatabaseFactory.getSmsDatabase(context).deleteMessage(smsMessageId.get());
|
|
|
|
DatabaseFactory.getSmsDatabase(context).deleteMessage(smsMessageId.get());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), messageAndThreadId.second);
|
|
|
|
MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), insertResult.get().getThreadId());
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private long handleSynchronizeSentExpirationUpdate(@NonNull MasterSecretUnion masterSecret,
|
|
|
|
private long handleSynchronizeSentExpirationUpdate(@NonNull MasterSecretUnion masterSecret,
|
|
|
@ -466,10 +473,10 @@ public class PushDecryptJob extends ContextJob {
|
|
|
|
handleExpirationUpdate(masterSecret, envelope, message, Optional.<Long>absent());
|
|
|
|
handleExpirationUpdate(masterSecret, envelope, message, Optional.<Long>absent());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Pair<Long, Long> messageAndThreadId;
|
|
|
|
Long threadId;
|
|
|
|
|
|
|
|
|
|
|
|
if (smsMessageId.isPresent() && !message.getGroupInfo().isPresent()) {
|
|
|
|
if (smsMessageId.isPresent() && !message.getGroupInfo().isPresent()) {
|
|
|
|
messageAndThreadId = database.updateBundleMessageBody(masterSecret, smsMessageId.get(), body);
|
|
|
|
threadId = database.updateBundleMessageBody(masterSecret, smsMessageId.get(), body).second;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
IncomingTextMessage textMessage = new IncomingTextMessage(envelope.getSource(),
|
|
|
|
IncomingTextMessage textMessage = new IncomingTextMessage(envelope.getSource(),
|
|
|
|
envelope.getSourceDevice(),
|
|
|
|
envelope.getSourceDevice(),
|
|
|
@ -478,12 +485,17 @@ public class PushDecryptJob extends ContextJob {
|
|
|
|
message.getExpiresInSeconds() * 1000);
|
|
|
|
message.getExpiresInSeconds() * 1000);
|
|
|
|
|
|
|
|
|
|
|
|
textMessage = new IncomingEncryptedMessage(textMessage, body);
|
|
|
|
textMessage = new IncomingEncryptedMessage(textMessage, body);
|
|
|
|
messageAndThreadId = database.insertMessageInbox(masterSecret, textMessage);
|
|
|
|
Optional<InsertResult> insertResult = database.insertMessageInbox(masterSecret, textMessage);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (insertResult.isPresent()) threadId = insertResult.get().getThreadId();
|
|
|
|
|
|
|
|
else threadId = null;
|
|
|
|
|
|
|
|
|
|
|
|
if (smsMessageId.isPresent()) database.deleteMessage(smsMessageId.get());
|
|
|
|
if (smsMessageId.isPresent()) database.deleteMessage(smsMessageId.get());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), messageAndThreadId.second);
|
|
|
|
if (threadId != null) {
|
|
|
|
|
|
|
|
MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), threadId);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private long handleSynchronizeSentTextMessage(@NonNull MasterSecretUnion masterSecret,
|
|
|
|
private long handleSynchronizeSentTextMessage(@NonNull MasterSecretUnion masterSecret,
|
|
|
@ -527,9 +539,12 @@ public class PushDecryptJob extends ContextJob {
|
|
|
|
EncryptingSmsDatabase smsDatabase = DatabaseFactory.getEncryptingSmsDatabase(context);
|
|
|
|
EncryptingSmsDatabase smsDatabase = DatabaseFactory.getEncryptingSmsDatabase(context);
|
|
|
|
|
|
|
|
|
|
|
|
if (!smsMessageId.isPresent()) {
|
|
|
|
if (!smsMessageId.isPresent()) {
|
|
|
|
Pair<Long, Long> messageAndThreadId = insertPlaceholder(envelope);
|
|
|
|
Optional<InsertResult> insertResult = insertPlaceholder(envelope);
|
|
|
|
smsDatabase.markAsInvalidVersionKeyExchange(messageAndThreadId.first);
|
|
|
|
|
|
|
|
MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), messageAndThreadId.second);
|
|
|
|
if (insertResult.isPresent()) {
|
|
|
|
|
|
|
|
smsDatabase.markAsInvalidVersionKeyExchange(insertResult.get().getMessageId());
|
|
|
|
|
|
|
|
MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), insertResult.get().getThreadId());
|
|
|
|
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
smsDatabase.markAsInvalidVersionKeyExchange(smsMessageId.get());
|
|
|
|
smsDatabase.markAsInvalidVersionKeyExchange(smsMessageId.get());
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -542,9 +557,12 @@ public class PushDecryptJob extends ContextJob {
|
|
|
|
EncryptingSmsDatabase smsDatabase = DatabaseFactory.getEncryptingSmsDatabase(context);
|
|
|
|
EncryptingSmsDatabase smsDatabase = DatabaseFactory.getEncryptingSmsDatabase(context);
|
|
|
|
|
|
|
|
|
|
|
|
if (!smsMessageId.isPresent()) {
|
|
|
|
if (!smsMessageId.isPresent()) {
|
|
|
|
Pair<Long, Long> messageAndThreadId = insertPlaceholder(envelope);
|
|
|
|
Optional<InsertResult> insertResult = insertPlaceholder(envelope);
|
|
|
|
smsDatabase.markAsDecryptFailed(messageAndThreadId.first);
|
|
|
|
|
|
|
|
MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), messageAndThreadId.second);
|
|
|
|
if (insertResult.isPresent()) {
|
|
|
|
|
|
|
|
smsDatabase.markAsDecryptFailed(insertResult.get().getMessageId());
|
|
|
|
|
|
|
|
MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), insertResult.get().getThreadId());
|
|
|
|
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
smsDatabase.markAsDecryptFailed(smsMessageId.get());
|
|
|
|
smsDatabase.markAsDecryptFailed(smsMessageId.get());
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -557,9 +575,12 @@ public class PushDecryptJob extends ContextJob {
|
|
|
|
EncryptingSmsDatabase smsDatabase = DatabaseFactory.getEncryptingSmsDatabase(context);
|
|
|
|
EncryptingSmsDatabase smsDatabase = DatabaseFactory.getEncryptingSmsDatabase(context);
|
|
|
|
|
|
|
|
|
|
|
|
if (!smsMessageId.isPresent()) {
|
|
|
|
if (!smsMessageId.isPresent()) {
|
|
|
|
Pair<Long, Long> messageAndThreadId = insertPlaceholder(envelope);
|
|
|
|
Optional<InsertResult> insertResult = insertPlaceholder(envelope);
|
|
|
|
smsDatabase.markAsNoSession(messageAndThreadId.first);
|
|
|
|
|
|
|
|
MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), messageAndThreadId.second);
|
|
|
|
if (insertResult.isPresent()) {
|
|
|
|
|
|
|
|
smsDatabase.markAsNoSession(insertResult.get().getMessageId());
|
|
|
|
|
|
|
|
MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), insertResult.get().getThreadId());
|
|
|
|
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
smsDatabase.markAsNoSession(smsMessageId.get());
|
|
|
|
smsDatabase.markAsNoSession(smsMessageId.get());
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -572,9 +593,12 @@ public class PushDecryptJob extends ContextJob {
|
|
|
|
EncryptingSmsDatabase smsDatabase = DatabaseFactory.getEncryptingSmsDatabase(context);
|
|
|
|
EncryptingSmsDatabase smsDatabase = DatabaseFactory.getEncryptingSmsDatabase(context);
|
|
|
|
|
|
|
|
|
|
|
|
if (!smsMessageId.isPresent()) {
|
|
|
|
if (!smsMessageId.isPresent()) {
|
|
|
|
Pair<Long, Long> messageAndThreadId = insertPlaceholder(envelope);
|
|
|
|
Optional<InsertResult> insertResult = insertPlaceholder(envelope);
|
|
|
|
smsDatabase.markAsLegacyVersion(messageAndThreadId.first);
|
|
|
|
|
|
|
|
MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), messageAndThreadId.second);
|
|
|
|
if (insertResult.isPresent()) {
|
|
|
|
|
|
|
|
smsDatabase.markAsLegacyVersion(insertResult.get().getMessageId());
|
|
|
|
|
|
|
|
MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), insertResult.get().getThreadId());
|
|
|
|
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
smsDatabase.markAsLegacyVersion(smsMessageId.get());
|
|
|
|
smsDatabase.markAsLegacyVersion(smsMessageId.get());
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -614,10 +638,12 @@ public class PushDecryptJob extends ContextJob {
|
|
|
|
|
|
|
|
|
|
|
|
if (!smsMessageId.isPresent()) {
|
|
|
|
if (!smsMessageId.isPresent()) {
|
|
|
|
IncomingPreKeyBundleMessage bundleMessage = new IncomingPreKeyBundleMessage(textMessage, encoded);
|
|
|
|
IncomingPreKeyBundleMessage bundleMessage = new IncomingPreKeyBundleMessage(textMessage, encoded);
|
|
|
|
Pair<Long, Long> messageAndThreadId = database.insertMessageInbox(masterSecret, bundleMessage);
|
|
|
|
Optional<InsertResult> insertResult = database.insertMessageInbox(masterSecret, bundleMessage);
|
|
|
|
|
|
|
|
|
|
|
|
database.setMismatchedIdentity(messageAndThreadId.first, recipientId, identityKey);
|
|
|
|
if (insertResult.isPresent()) {
|
|
|
|
MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), messageAndThreadId.second);
|
|
|
|
database.setMismatchedIdentity(insertResult.get().getMessageId(), recipientId, identityKey);
|
|
|
|
|
|
|
|
MessageNotifier.updateNotification(context, masterSecret.getMasterSecret().orNull(), insertResult.get().getThreadId());
|
|
|
|
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
database.updateMessageBody(masterSecret, smsMessageId.get(), encoded);
|
|
|
|
database.updateMessageBody(masterSecret, smsMessageId.get(), encoded);
|
|
|
|
database.markAsPreKeyBundle(smsMessageId.get());
|
|
|
|
database.markAsPreKeyBundle(smsMessageId.get());
|
|
|
@ -628,7 +654,7 @@ public class PushDecryptJob extends ContextJob {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private Pair<Long, Long> insertPlaceholder(@NonNull SignalServiceEnvelope envelope) {
|
|
|
|
private Optional<InsertResult> insertPlaceholder(@NonNull SignalServiceEnvelope envelope) {
|
|
|
|
EncryptingSmsDatabase database = DatabaseFactory.getEncryptingSmsDatabase(context);
|
|
|
|
EncryptingSmsDatabase database = DatabaseFactory.getEncryptingSmsDatabase(context);
|
|
|
|
IncomingTextMessage textMessage = new IncomingTextMessage(envelope.getSource(), envelope.getSourceDevice(),
|
|
|
|
IncomingTextMessage textMessage = new IncomingTextMessage(envelope.getSource(), envelope.getSourceDevice(),
|
|
|
|
envelope.getTimestamp(), "",
|
|
|
|
envelope.getTimestamp(), "",
|
|
|
|