From aed2941da7bded940051db1a6dead97fae248900 Mon Sep 17 00:00:00 2001 From: Ryan ZHAO Date: Mon, 24 Aug 2020 11:41:39 +1000 Subject: [PATCH] show session reset done message --- res/values/strings.xml | 1 + .../securesms/conversation/ConversationFragment.java | 2 +- .../conversation/ConversationUpdateItem.java | 1 + .../securesms/database/MmsSmsColumns.java | 5 +++++ .../thoughtcrime/securesms/database/SmsDatabase.java | 4 ++++ .../securesms/database/model/DisplayRecord.java | 2 ++ .../securesms/database/model/MessageRecord.java | 2 +- .../securesms/database/model/SmsMessageRecord.java | 2 ++ .../securesms/database/model/ThreadRecord.java | 2 ++ .../loki/protocol/SessionResetImplementation.kt | 12 +++++++++++- 10 files changed, 30 insertions(+), 3 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 32907f5304..da2f419b43 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -737,6 +737,7 @@ Bad encrypted message Message encrypted for non-existing session You have sent a session restoration request to %s + Secure session reset done Bad encrypted MMS message diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java index 97a7364366..eeb1c3cc0a 100644 --- a/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/src/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -358,7 +358,7 @@ public class ConversationFragment extends Fragment if (messageRecord.isGroupAction() || messageRecord.isCallLog() || messageRecord.isJoined() || messageRecord.isExpirationTimerUpdate() || messageRecord.isEndSession() || messageRecord.isIdentityUpdate() || - messageRecord.isIdentityVerified() || messageRecord.isIdentityDefault() || messageRecord.isLokiSessionRestoreSent()) + messageRecord.isIdentityVerified() || messageRecord.isIdentityDefault() || messageRecord.isLokiSessionRestoreSent() || messageRecord.isLokiSessionRestoreDone()) { actionMessage = true; } diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java b/src/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java index 008d4e79f7..b7e61d34b8 100644 --- a/src/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java +++ b/src/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java @@ -114,6 +114,7 @@ public class ConversationUpdateItem extends LinearLayout else if (messageRecord.isIdentityVerified() || messageRecord.isIdentityDefault()) setIdentityVerifyUpdate(messageRecord); else if (messageRecord.isLokiSessionRestoreSent()) setTextMessageRecord(messageRecord); + else if (messageRecord.isLokiSessionRestoreDone()) setTextMessageRecord(messageRecord); else throw new AssertionError("Neither group nor log nor joined."); if (batchSelected.contains(messageRecord)) setSelected(true); diff --git a/src/org/thoughtcrime/securesms/database/MmsSmsColumns.java b/src/org/thoughtcrime/securesms/database/MmsSmsColumns.java index af3e881a29..d6e365f36c 100644 --- a/src/org/thoughtcrime/securesms/database/MmsSmsColumns.java +++ b/src/org/thoughtcrime/securesms/database/MmsSmsColumns.java @@ -84,6 +84,7 @@ public interface MmsSmsColumns { // Loki protected static final long ENCRYPTION_LOKI_SESSION_RESTORE_SENT_BIT = 0x01000000; + protected static final long ENCRYPTION_LOKI_SESSION_RESTORE_DONE_BIT = 0x00100000; public static boolean isDraftMessageType(long type) { return (type & BASE_TYPE_MASK) == BASE_DRAFT_TYPE; @@ -237,6 +238,10 @@ public interface MmsSmsColumns { return (type & ENCRYPTION_LOKI_SESSION_RESTORE_SENT_BIT) != 0; } + public static boolean isLokiSessionRestoreDoneType(long type) { + return (type & ENCRYPTION_LOKI_SESSION_RESTORE_DONE_BIT) != 0; + } + public static boolean isLegacyType(long type) { return (type & ENCRYPTION_REMOTE_LEGACY_BIT) != 0 || (type & ENCRYPTION_REMOTE_BIT) != 0; diff --git a/src/org/thoughtcrime/securesms/database/SmsDatabase.java b/src/org/thoughtcrime/securesms/database/SmsDatabase.java index 308b948ed9..1727d5e86d 100644 --- a/src/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -255,6 +255,10 @@ public class SmsDatabase extends MessagingDatabase { updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_LOKI_SESSION_RESTORE_SENT_BIT); } + public void markAsLokiSessionRestorationDone(long id) { + updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_LOKI_SESSION_RESTORE_DONE_BIT); + } + public void markAsLegacyVersion(long id) { updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_LEGACY_BIT); } diff --git a/src/org/thoughtcrime/securesms/database/model/DisplayRecord.java b/src/org/thoughtcrime/securesms/database/model/DisplayRecord.java index 12be5f89a5..567f03e26b 100644 --- a/src/org/thoughtcrime/securesms/database/model/DisplayRecord.java +++ b/src/org/thoughtcrime/securesms/database/model/DisplayRecord.java @@ -107,6 +107,8 @@ public abstract class DisplayRecord { public boolean isLokiSessionRestoreSent() { return SmsDatabase.Types.isLokiSessionRestoreSentType(type); } + public boolean isLokiSessionRestoreDone() { return SmsDatabase.Types.isLokiSessionRestoreDoneType(type); } + public boolean isGroupUpdate() { return SmsDatabase.Types.isGroupUpdate(type); } diff --git a/src/org/thoughtcrime/securesms/database/model/MessageRecord.java b/src/org/thoughtcrime/securesms/database/model/MessageRecord.java index 1718d14451..2e54b9d65e 100644 --- a/src/org/thoughtcrime/securesms/database/model/MessageRecord.java +++ b/src/org/thoughtcrime/securesms/database/model/MessageRecord.java @@ -180,7 +180,7 @@ public abstract class MessageRecord extends DisplayRecord { public boolean isUpdate() { return isGroupAction() || isJoined() || isExpirationTimerUpdate() || isCallLog() || - isEndSession() || isIdentityUpdate() || isIdentityVerified() || isIdentityDefault() || isLokiSessionRestoreSent(); + isEndSession() || isIdentityUpdate() || isIdentityVerified() || isIdentityDefault() || isLokiSessionRestoreSent() || isLokiSessionRestoreDone(); } public boolean isMediaPending() { diff --git a/src/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java b/src/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java index df7bce7ef3..273bbd6c89 100644 --- a/src/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java +++ b/src/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java @@ -83,6 +83,8 @@ public class SmsMessageRecord extends MessageRecord { return emphasisAdded(context.getString(R.string.MessageDisplayHelper_message_encrypted_for_non_existing_session)); } else if (isLokiSessionRestoreSent()) { return emphasisAdded(context.getString(R.string.SmsMessageRecord_secure_session_reset)); + } else if (isLokiSessionRestoreDone()) { + return emphasisAdded(context.getString(R.string.MessageRecord_session_restore_done)); } else if (isEndSession() && isOutgoing()) { return emphasisAdded(context.getString(R.string.SmsMessageRecord_secure_session_reset)); } else if (isEndSession()) { diff --git a/src/org/thoughtcrime/securesms/database/model/ThreadRecord.java b/src/org/thoughtcrime/securesms/database/model/ThreadRecord.java index c0eb4ca611..081340fcd5 100644 --- a/src/org/thoughtcrime/securesms/database/model/ThreadRecord.java +++ b/src/org/thoughtcrime/securesms/database/model/ThreadRecord.java @@ -84,6 +84,8 @@ public class ThreadRecord extends DisplayRecord { return emphasisAdded(context.getString(R.string.MessageDisplayHelper_message_encrypted_for_non_existing_session)); } else if (isLokiSessionRestoreSent()) { return emphasisAdded(context.getString(R.string.SmsMessageRecord_secure_session_reset)); + } else if (isLokiSessionRestoreDone()) { + return emphasisAdded(context.getString(R.string.MessageRecord_session_restore_done)); } else if (SmsDatabase.Types.isEndSessionType(type)) { return emphasisAdded(context.getString(R.string.ThreadRecord_secure_session_reset)); } else if (MmsSmsColumns.Types.isLegacyType(type)) { diff --git a/src/org/thoughtcrime/securesms/loki/protocol/SessionResetImplementation.kt b/src/org/thoughtcrime/securesms/loki/protocol/SessionResetImplementation.kt index 1c8a283125..b8e0fa8e87 100644 --- a/src/org/thoughtcrime/securesms/loki/protocol/SessionResetImplementation.kt +++ b/src/org/thoughtcrime/securesms/loki/protocol/SessionResetImplementation.kt @@ -2,7 +2,10 @@ package org.thoughtcrime.securesms.loki.protocol import android.content.Context import org.thoughtcrime.securesms.ApplicationContext +import org.thoughtcrime.securesms.database.Address import org.thoughtcrime.securesms.database.DatabaseFactory +import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.sms.OutgoingTextMessage import org.whispersystems.libsignal.loki.SessionResetProtocol import org.whispersystems.libsignal.loki.SessionResetStatus import org.whispersystems.libsignal.protocol.PreKeySignalMessage @@ -22,7 +25,14 @@ class SessionResetImplementation(private val context: Context) : SessionResetPro val job = NullMessageSendJob(publicKey) ApplicationContext.getInstance(context).jobManager.add(job) } - // TODO: Show session reset succeed message + val smsDB = DatabaseFactory.getSmsDatabase(context) + val recipient = Recipient.from(context, Address.fromSerialized(publicKey), false) + val threadID = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipient) + val infoMessage = OutgoingTextMessage(recipient, "", 0, 0) + val infoMessageID = smsDB.insertMessageOutbox(threadID, infoMessage, false, System.currentTimeMillis(), null) + if (infoMessageID > -1) { + smsDB.markAsLokiSessionRestorationDone(infoMessageID) + } } override fun validatePreKeySignalMessage(publicKey: String, message: PreKeySignalMessage) {