mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-05-08 09:18:39 +01:00
Add backupV2 support for simple update messages.
This commit is contained in:
committed by
Cody Henthorne
parent
b540b5813e
commit
fb69fc5af2
+34
@@ -6,6 +6,7 @@
|
|||||||
package org.thoughtcrime.securesms.backup.v2.database
|
package org.thoughtcrime.securesms.backup.v2.database
|
||||||
|
|
||||||
import android.database.Cursor
|
import android.database.Cursor
|
||||||
|
import org.signal.core.util.Base64
|
||||||
import org.signal.core.util.logging.Log
|
import org.signal.core.util.logging.Log
|
||||||
import org.signal.core.util.requireBlob
|
import org.signal.core.util.requireBlob
|
||||||
import org.signal.core.util.requireBoolean
|
import org.signal.core.util.requireBoolean
|
||||||
@@ -13,12 +14,16 @@ import org.signal.core.util.requireInt
|
|||||||
import org.signal.core.util.requireLong
|
import org.signal.core.util.requireLong
|
||||||
import org.signal.core.util.requireString
|
import org.signal.core.util.requireString
|
||||||
import org.thoughtcrime.securesms.backup.v2.proto.ChatItem
|
import org.thoughtcrime.securesms.backup.v2.proto.ChatItem
|
||||||
|
import org.thoughtcrime.securesms.backup.v2.proto.ExpirationTimerChange
|
||||||
|
import org.thoughtcrime.securesms.backup.v2.proto.ProfileChange
|
||||||
import org.thoughtcrime.securesms.backup.v2.proto.Quote
|
import org.thoughtcrime.securesms.backup.v2.proto.Quote
|
||||||
import org.thoughtcrime.securesms.backup.v2.proto.Reaction
|
import org.thoughtcrime.securesms.backup.v2.proto.Reaction
|
||||||
import org.thoughtcrime.securesms.backup.v2.proto.RemoteDeletedMessage
|
import org.thoughtcrime.securesms.backup.v2.proto.RemoteDeletedMessage
|
||||||
import org.thoughtcrime.securesms.backup.v2.proto.SendStatus
|
import org.thoughtcrime.securesms.backup.v2.proto.SendStatus
|
||||||
|
import org.thoughtcrime.securesms.backup.v2.proto.SimpleUpdate
|
||||||
import org.thoughtcrime.securesms.backup.v2.proto.StandardMessage
|
import org.thoughtcrime.securesms.backup.v2.proto.StandardMessage
|
||||||
import org.thoughtcrime.securesms.backup.v2.proto.Text
|
import org.thoughtcrime.securesms.backup.v2.proto.Text
|
||||||
|
import org.thoughtcrime.securesms.backup.v2.proto.UpdateMessage
|
||||||
import org.thoughtcrime.securesms.database.GroupReceiptTable
|
import org.thoughtcrime.securesms.database.GroupReceiptTable
|
||||||
import org.thoughtcrime.securesms.database.MessageTable
|
import org.thoughtcrime.securesms.database.MessageTable
|
||||||
import org.thoughtcrime.securesms.database.MessageTypes
|
import org.thoughtcrime.securesms.database.MessageTypes
|
||||||
@@ -27,6 +32,7 @@ import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchSet
|
|||||||
import org.thoughtcrime.securesms.database.documents.NetworkFailureSet
|
import org.thoughtcrime.securesms.database.documents.NetworkFailureSet
|
||||||
import org.thoughtcrime.securesms.database.model.ReactionRecord
|
import org.thoughtcrime.securesms.database.model.ReactionRecord
|
||||||
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList
|
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList
|
||||||
|
import org.thoughtcrime.securesms.database.model.databaseprotos.ProfileChangeDetails
|
||||||
import org.thoughtcrime.securesms.mms.QuoteModel
|
import org.thoughtcrime.securesms.mms.QuoteModel
|
||||||
import org.thoughtcrime.securesms.util.JsonUtils
|
import org.thoughtcrime.securesms.util.JsonUtils
|
||||||
import java.io.Closeable
|
import java.io.Closeable
|
||||||
@@ -84,6 +90,34 @@ class ChatItemExportIterator(private val cursor: Cursor, private val batchSize:
|
|||||||
|
|
||||||
when {
|
when {
|
||||||
record.remoteDeleted -> builder.remoteDeletedMessage = RemoteDeletedMessage()
|
record.remoteDeleted -> builder.remoteDeletedMessage = RemoteDeletedMessage()
|
||||||
|
MessageTypes.isJoinedType(record.type) -> builder.updateMessage = UpdateMessage(simpleUpdate = SimpleUpdate(type = SimpleUpdate.Type.JOINED_SIGNAL))
|
||||||
|
MessageTypes.isIdentityUpdate(record.type) -> builder.updateMessage = UpdateMessage(simpleUpdate = SimpleUpdate(type = SimpleUpdate.Type.IDENTITY_UPDATE))
|
||||||
|
MessageTypes.isIdentityVerified(record.type) -> builder.updateMessage = UpdateMessage(simpleUpdate = SimpleUpdate(type = SimpleUpdate.Type.IDENTITY_VERIFIED))
|
||||||
|
MessageTypes.isIdentityDefault(record.type) -> builder.updateMessage = UpdateMessage(simpleUpdate = SimpleUpdate(type = SimpleUpdate.Type.IDENTITY_DEFAULT))
|
||||||
|
MessageTypes.isChangeNumber(record.type) -> builder.updateMessage = UpdateMessage(simpleUpdate = SimpleUpdate(type = SimpleUpdate.Type.CHANGE_NUMBER))
|
||||||
|
MessageTypes.isBoostRequest(record.type) -> builder.updateMessage = UpdateMessage(simpleUpdate = SimpleUpdate(type = SimpleUpdate.Type.BOOST_REQUEST))
|
||||||
|
MessageTypes.isEndSessionType(record.type) -> builder.updateMessage = UpdateMessage(simpleUpdate = SimpleUpdate(type = SimpleUpdate.Type.END_SESSION))
|
||||||
|
MessageTypes.isChatSessionRefresh(record.type) -> builder.updateMessage = UpdateMessage(simpleUpdate = SimpleUpdate(type = SimpleUpdate.Type.CHAT_SESSION_REFRESH))
|
||||||
|
MessageTypes.isBadDecryptType(record.type) -> builder.updateMessage = UpdateMessage(simpleUpdate = SimpleUpdate(type = SimpleUpdate.Type.BAD_DECRYPT))
|
||||||
|
MessageTypes.isPaymentsActivated(record.type) -> builder.updateMessage = UpdateMessage(simpleUpdate = SimpleUpdate(type = SimpleUpdate.Type.PAYMENTS_ACTIVATED))
|
||||||
|
MessageTypes.isPaymentsRequestToActivate(record.type) -> builder.updateMessage = UpdateMessage(simpleUpdate = SimpleUpdate(type = SimpleUpdate.Type.PAYMENT_ACTIVATION_REQUEST))
|
||||||
|
MessageTypes.isExpirationTimerUpdate(record.type) -> builder.updateMessage = UpdateMessage(expirationTimerChange = ExpirationTimerChange((record.expiresIn / 1000).toInt()))
|
||||||
|
MessageTypes.isProfileChange(record.type) -> {
|
||||||
|
builder.updateMessage = UpdateMessage(
|
||||||
|
profileChange = try {
|
||||||
|
val decoded: ByteArray = Base64.decode(record.body!!)
|
||||||
|
val profileChangeDetails = ProfileChangeDetails.ADAPTER.decode(decoded)
|
||||||
|
if (profileChangeDetails.profileNameChange != null) {
|
||||||
|
ProfileChange(previousName = profileChangeDetails.profileNameChange.previous, newName = profileChangeDetails.profileNameChange.newValue)
|
||||||
|
} else {
|
||||||
|
ProfileChange()
|
||||||
|
}
|
||||||
|
} catch (e: IOException) {
|
||||||
|
Log.w(TAG, "Profile name change details could not be read", e)
|
||||||
|
ProfileChange()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
else -> builder.standardMessage = record.toTextMessage(reactionsById[id])
|
else -> builder.standardMessage = record.toTextMessage(reactionsById[id])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+37
@@ -7,6 +7,7 @@ package org.thoughtcrime.securesms.backup.v2.database
|
|||||||
|
|
||||||
import android.content.ContentValues
|
import android.content.ContentValues
|
||||||
import androidx.core.content.contentValuesOf
|
import androidx.core.content.contentValuesOf
|
||||||
|
import org.signal.core.util.Base64
|
||||||
import org.signal.core.util.SqlUtil
|
import org.signal.core.util.SqlUtil
|
||||||
import org.signal.core.util.logging.Log
|
import org.signal.core.util.logging.Log
|
||||||
import org.signal.core.util.toInt
|
import org.signal.core.util.toInt
|
||||||
@@ -16,7 +17,9 @@ import org.thoughtcrime.securesms.backup.v2.proto.ChatItem
|
|||||||
import org.thoughtcrime.securesms.backup.v2.proto.Quote
|
import org.thoughtcrime.securesms.backup.v2.proto.Quote
|
||||||
import org.thoughtcrime.securesms.backup.v2.proto.Reaction
|
import org.thoughtcrime.securesms.backup.v2.proto.Reaction
|
||||||
import org.thoughtcrime.securesms.backup.v2.proto.SendStatus
|
import org.thoughtcrime.securesms.backup.v2.proto.SendStatus
|
||||||
|
import org.thoughtcrime.securesms.backup.v2.proto.SimpleUpdate
|
||||||
import org.thoughtcrime.securesms.backup.v2.proto.StandardMessage
|
import org.thoughtcrime.securesms.backup.v2.proto.StandardMessage
|
||||||
|
import org.thoughtcrime.securesms.backup.v2.proto.UpdateMessage
|
||||||
import org.thoughtcrime.securesms.database.GroupReceiptTable
|
import org.thoughtcrime.securesms.database.GroupReceiptTable
|
||||||
import org.thoughtcrime.securesms.database.MessageTable
|
import org.thoughtcrime.securesms.database.MessageTable
|
||||||
import org.thoughtcrime.securesms.database.MessageTypes
|
import org.thoughtcrime.securesms.database.MessageTypes
|
||||||
@@ -27,6 +30,7 @@ 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.NetworkFailureSet
|
import org.thoughtcrime.securesms.database.documents.NetworkFailureSet
|
||||||
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList
|
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList
|
||||||
|
import org.thoughtcrime.securesms.database.model.databaseprotos.ProfileChangeDetails
|
||||||
import org.thoughtcrime.securesms.mms.QuoteModel
|
import org.thoughtcrime.securesms.mms.QuoteModel
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient
|
import org.thoughtcrime.securesms.recipients.Recipient
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId
|
import org.thoughtcrime.securesms.recipients.RecipientId
|
||||||
@@ -208,6 +212,7 @@ class ChatItemImportInserter(
|
|||||||
when {
|
when {
|
||||||
this.standardMessage != null -> contentValues.addStandardMessage(this.standardMessage)
|
this.standardMessage != null -> contentValues.addStandardMessage(this.standardMessage)
|
||||||
this.remoteDeletedMessage != null -> contentValues.put(MessageTable.REMOTE_DELETED, 1)
|
this.remoteDeletedMessage != null -> contentValues.put(MessageTable.REMOTE_DELETED, 1)
|
||||||
|
this.updateMessage != null -> contentValues.addUpdateMessage(this.updateMessage)
|
||||||
}
|
}
|
||||||
|
|
||||||
return contentValues
|
return contentValues
|
||||||
@@ -303,6 +308,38 @@ class ChatItemImportInserter(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun ContentValues.addUpdateMessage(updateMessage: UpdateMessage) {
|
||||||
|
var typeFlags: Long = 0
|
||||||
|
when {
|
||||||
|
updateMessage.simpleUpdate != null -> {
|
||||||
|
typeFlags = when (updateMessage.simpleUpdate.type) {
|
||||||
|
SimpleUpdate.Type.JOINED_SIGNAL -> MessageTypes.JOINED_TYPE
|
||||||
|
SimpleUpdate.Type.IDENTITY_UPDATE -> MessageTypes.KEY_EXCHANGE_IDENTITY_UPDATE_BIT
|
||||||
|
SimpleUpdate.Type.IDENTITY_VERIFIED -> MessageTypes.KEY_EXCHANGE_IDENTITY_VERIFIED_BIT
|
||||||
|
SimpleUpdate.Type.IDENTITY_DEFAULT -> MessageTypes.KEY_EXCHANGE_IDENTITY_DEFAULT_BIT
|
||||||
|
SimpleUpdate.Type.CHANGE_NUMBER -> MessageTypes.CHANGE_NUMBER_TYPE
|
||||||
|
SimpleUpdate.Type.BOOST_REQUEST -> MessageTypes.BOOST_REQUEST_TYPE
|
||||||
|
SimpleUpdate.Type.END_SESSION -> MessageTypes.END_SESSION_BIT
|
||||||
|
SimpleUpdate.Type.CHAT_SESSION_REFRESH -> MessageTypes.ENCRYPTION_REMOTE_FAILED_BIT
|
||||||
|
SimpleUpdate.Type.BAD_DECRYPT -> MessageTypes.BAD_DECRYPT_TYPE
|
||||||
|
SimpleUpdate.Type.PAYMENTS_ACTIVATED -> MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATED
|
||||||
|
SimpleUpdate.Type.PAYMENT_ACTIVATION_REQUEST -> MessageTypes.SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updateMessage.expirationTimerChange != null -> {
|
||||||
|
typeFlags = MessageTypes.EXPIRATION_TIMER_UPDATE_BIT
|
||||||
|
put(MessageTable.EXPIRES_IN, updateMessage.expirationTimerChange.expiresIn.toLong() * 1000)
|
||||||
|
}
|
||||||
|
updateMessage.profileChange != null -> {
|
||||||
|
typeFlags = MessageTypes.PROFILE_CHANGE_TYPE
|
||||||
|
val profileChangeDetails = ProfileChangeDetails(profileNameChange = ProfileChangeDetails.StringChange(previous = updateMessage.profileChange.previousName, newValue = updateMessage.profileChange.newName))
|
||||||
|
.encode()
|
||||||
|
put(MessageTable.BODY, Base64.encodeWithPadding(profileChangeDetails))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.put(MessageTable.TYPE, getAsLong(MessageTable.TYPE) or typeFlags)
|
||||||
|
}
|
||||||
|
|
||||||
private fun ContentValues.addQuote(quote: Quote) {
|
private fun ContentValues.addQuote(quote: Quote) {
|
||||||
this.put(MessageTable.QUOTE_ID, quote.targetSentTimestamp)
|
this.put(MessageTable.QUOTE_ID, quote.targetSentTimestamp)
|
||||||
this.put(MessageTable.QUOTE_AUTHOR, backupState.backupToLocalRecipientId[quote.authorId]!!.serialize())
|
this.put(MessageTable.QUOTE_AUTHOR, backupState.backupToLocalRecipientId[quote.authorId]!!.serialize())
|
||||||
|
|||||||
@@ -504,6 +504,7 @@ message SimpleUpdate {
|
|||||||
PAYMENTS_ACTIVATED = 9;
|
PAYMENTS_ACTIVATED = 9;
|
||||||
PAYMENT_ACTIVATION_REQUEST = 10;
|
PAYMENT_ACTIVATION_REQUEST = 10;
|
||||||
}
|
}
|
||||||
|
Type type = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
message GroupDescriptionUpdate {
|
message GroupDescriptionUpdate {
|
||||||
|
|||||||
Reference in New Issue
Block a user