Update to the latest Backup.proto

This commit is contained in:
Greyson Parrelli
2025-03-05 11:03:26 -05:00
committed by Michelle Tang
parent 2ff4ea2832
commit 19bf6f95c7
479 changed files with 118 additions and 17 deletions

View File

@@ -55,6 +55,7 @@ fun RecipientTable.getContactsForBackup(selfId: Long): ContactArchiveExporter {
"${RecipientTable.TABLE_NAME}.${RecipientTable.MUTE_UNTIL}",
"${RecipientTable.TABLE_NAME}.${RecipientTable.CHAT_COLORS}",
"${RecipientTable.TABLE_NAME}.${RecipientTable.CUSTOM_CHAT_COLORS_ID}",
"${RecipientTable.TABLE_NAME}.${RecipientTable.AVATAR_COLOR}",
"${RecipientTable.TABLE_NAME}.${RecipientTable.EXTRAS}",
"${IdentityTable.TABLE_NAME}.${IdentityTable.IDENTITY_KEY}",
"${IdentityTable.TABLE_NAME}.${IdentityTable.VERIFIED}"
@@ -91,6 +92,7 @@ fun RecipientTable.getGroupsForBackup(selfAci: ServiceId.ACI): GroupArchiveExpor
"${RecipientTable.TABLE_NAME}.${RecipientTable.PROFILE_SHARING}",
"${RecipientTable.TABLE_NAME}.${RecipientTable.MUTE_UNTIL}",
"${RecipientTable.TABLE_NAME}.${RecipientTable.EXTRAS}",
"${RecipientTable.TABLE_NAME}.${RecipientTable.AVATAR_COLOR}",
"${GroupTable.TABLE_NAME}.${GroupTable.V2_MASTER_KEY}",
"${GroupTable.TABLE_NAME}.${GroupTable.SHOW_AS_STORY_STATE}",
"${GroupTable.TABLE_NAME}.${GroupTable.TITLE}",

View File

@@ -18,6 +18,8 @@ import org.thoughtcrime.securesms.backup.v2.ArchiveRecipient
import org.thoughtcrime.securesms.backup.v2.proto.Contact
import org.thoughtcrime.securesms.backup.v2.proto.Self
import org.thoughtcrime.securesms.backup.v2.util.clampToValidBackupRange
import org.thoughtcrime.securesms.backup.v2.util.toRemote
import org.thoughtcrime.securesms.conversation.colors.AvatarColor
import org.thoughtcrime.securesms.database.IdentityTable
import org.thoughtcrime.securesms.database.RecipientTable
import org.thoughtcrime.securesms.database.RecipientTableCursorUtil
@@ -49,7 +51,9 @@ class ContactArchiveExporter(private val cursor: Cursor, private val selfId: Lon
if (id == selfId) {
return ArchiveRecipient(
id = id,
self = Self()
self = Self(
avatarColor = cursor.requireString(RecipientTable.AVATAR_COLOR)?.let { AvatarColor.deserialize(it) }?.toRemote()
)
)
}
@@ -81,6 +85,7 @@ class ContactArchiveExporter(private val cursor: Cursor, private val selfId: Lon
.systemGivenName(cursor.requireString(RecipientTable.SYSTEM_GIVEN_NAME) ?: "")
.systemFamilyName(cursor.requireString(RecipientTable.SYSTEM_FAMILY_NAME) ?: "")
.systemNickname(cursor.requireString(RecipientTable.SYSTEM_NICKNAME) ?: "")
.avatarColor(cursor.requireString(RecipientTable.AVATAR_COLOR)?.let { AvatarColor.deserialize(it) }?.toRemote())
val registeredState = RecipientTable.RegisteredState.fromId(cursor.requireInt(RecipientTable.REGISTERED))
if (registeredState == RecipientTable.RegisteredState.REGISTERED) {

View File

@@ -12,6 +12,7 @@ import org.signal.core.util.requireBoolean
import org.signal.core.util.requireInt
import org.signal.core.util.requireLong
import org.signal.core.util.requireNonNullBlob
import org.signal.core.util.requireString
import org.signal.storageservice.protos.groups.AccessControl
import org.signal.storageservice.protos.groups.Member
import org.signal.storageservice.protos.groups.local.DecryptedBannedMember
@@ -23,6 +24,8 @@ import org.signal.storageservice.protos.groups.local.EnabledState
import org.thoughtcrime.securesms.backup.v2.ArchiveGroup
import org.thoughtcrime.securesms.backup.v2.ArchiveRecipient
import org.thoughtcrime.securesms.backup.v2.proto.Group
import org.thoughtcrime.securesms.backup.v2.util.toRemote
import org.thoughtcrime.securesms.conversation.colors.AvatarColor
import org.thoughtcrime.securesms.database.GroupTable
import org.thoughtcrime.securesms.database.RecipientTable
import org.thoughtcrime.securesms.database.RecipientTableCursorUtil
@@ -59,7 +62,8 @@ class GroupArchiveExporter(private val selfAci: ServiceId.ACI, private val curso
blocked = cursor.requireBoolean(RecipientTable.BLOCKED),
hideStory = extras?.hideStory() ?: false,
storySendMode = showAsStoryState.toRemote(),
snapshot = decryptedGroup.toRemote(isActive, selfAci)
snapshot = decryptedGroup.toRemote(isActive, selfAci),
avatarColor = cursor.requireString(RecipientTable.AVATAR_COLOR)?.let { AvatarColor.deserialize(it) }?.toRemote()
)
)
}

View File

@@ -11,6 +11,7 @@ import org.signal.core.util.insertInto
import org.signal.core.util.toInt
import org.signal.core.util.update
import org.thoughtcrime.securesms.backup.v2.proto.Contact
import org.thoughtcrime.securesms.backup.v2.util.toLocal
import org.thoughtcrime.securesms.database.IdentityTable
import org.thoughtcrime.securesms.database.RecipientTable
import org.thoughtcrime.securesms.database.SQLiteDatabase
@@ -54,7 +55,8 @@ object ContactArchiveImporter {
RecipientTable.NICKNAME_FAMILY_NAME to contact.nickname?.family,
RecipientTable.SYSTEM_GIVEN_NAME to contact.systemGivenName,
RecipientTable.SYSTEM_FAMILY_NAME to contact.systemFamilyName,
RecipientTable.SYSTEM_NICKNAME to contact.systemNickname
RecipientTable.SYSTEM_NICKNAME to contact.systemNickname,
RecipientTable.AVATAR_COLOR to contact.avatarColor?.toLocal()?.serialize()
)
if (contact.registered != null) {
@@ -111,6 +113,6 @@ private fun Contact.toLocalExtras(): RecipientExtras {
private val Contact.formattedE164: String?
get() {
return e164?.let {
SignalE164Util.formatAsE164(e164.toString())
SignalE164Util.formatAsE164("+$e164")
}
}

View File

@@ -21,6 +21,7 @@ import org.signal.storageservice.protos.groups.local.DecryptedTimer
import org.signal.storageservice.protos.groups.local.EnabledState
import org.thoughtcrime.securesms.backup.v2.ArchiveGroup
import org.thoughtcrime.securesms.backup.v2.proto.Group
import org.thoughtcrime.securesms.backup.v2.util.toLocal
import org.thoughtcrime.securesms.conversation.colors.AvatarColorHash
import org.thoughtcrime.securesms.database.GroupTable
import org.thoughtcrime.securesms.database.RecipientTable
@@ -56,6 +57,7 @@ object GroupArchiveImporter {
put(RecipientTable.BLOCKED, group.blocked.toInt())
put(RecipientTable.TYPE, RecipientTable.RecipientType.GV2.id)
put(RecipientTable.STORAGE_SERVICE_ID, Base64.encodeWithPadding(StorageSyncHelper.generateKey()))
put(RecipientTable.AVATAR_COLOR, group.avatarColor?.toLocal()?.serialize())
if (group.hideStory) {
val extras = RecipientExtras.Builder().hideStory(true).build()
put(RecipientTable.EXTRAS, extras.encode())

View File

@@ -68,6 +68,7 @@ object AccountDataArchiveProcessor {
givenName = selfRecord.signalProfileName.givenName,
familyName = selfRecord.signalProfileName.familyName,
avatarUrlPath = selfRecord.signalProfileAvatar ?: "",
svrPin = SignalStore.svr.pin ?: "",
username = selfRecord.username?.takeIf { it.isNotBlank() },
usernameLink = if (selfRecord.username.isNotNullOrBlank() && signalStore.accountValues.usernameLink != null) {
AccountData.UsernameLink(
@@ -114,6 +115,9 @@ object AccountDataArchiveProcessor {
SignalDatabase.recipients.restoreSelfFromBackup(accountData, selfId)
SignalStore.account.setRegistered(true)
if (accountData.svrPin.isNotBlank()) {
SignalStore.svr.setPin(accountData.svrPin)
}
val context = AppDependencies.application
val settings = accountData.accountSettings

View File

@@ -6,6 +6,7 @@
package org.thoughtcrime.securesms.backup.v2.processor
import org.signal.core.util.logging.Log
import org.signal.core.util.update
import org.thoughtcrime.securesms.backup.v2.ArchiveRecipient
import org.thoughtcrime.securesms.backup.v2.ExportState
import org.thoughtcrime.securesms.backup.v2.ImportState
@@ -21,6 +22,8 @@ import org.thoughtcrime.securesms.backup.v2.importer.GroupArchiveImporter
import org.thoughtcrime.securesms.backup.v2.proto.Frame
import org.thoughtcrime.securesms.backup.v2.proto.ReleaseNotes
import org.thoughtcrime.securesms.backup.v2.stream.BackupFrameEmitter
import org.thoughtcrime.securesms.backup.v2.util.toLocal
import org.thoughtcrime.securesms.database.RecipientTable
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.recipients.Recipient
@@ -99,9 +102,16 @@ object RecipientArchiveProcessor {
recipient.contact != null -> ContactArchiveImporter.import(recipient.contact)
recipient.group != null -> GroupArchiveImporter.import(recipient.group)
recipient.distributionList != null -> DistributionListArchiveImporter.import(recipient.distributionList, importState)
recipient.self != null -> Recipient.self().id
recipient.releaseNotes != null -> SignalDatabase.recipients.restoreReleaseNotes()
recipient.callLink != null -> CallLinkArchiveImporter.import(recipient.callLink)
recipient.self != null -> {
SignalDatabase.writableDatabase
.update(RecipientTable.TABLE_NAME)
.values(RecipientTable.AVATAR_COLOR to recipient.self.avatarColor?.toLocal()?.serialize())
.where("${RecipientTable.ID} = ?", Recipient.self().id)
.run()
Recipient.self().id
}
else -> {
Log.w(TAG, "Unrecognized recipient type!")
null

View File

@@ -18,6 +18,7 @@ import org.thoughtcrime.securesms.attachments.TombstoneAttachment
import org.thoughtcrime.securesms.backup.v2.BackupRepository.getMediaName
import org.thoughtcrime.securesms.backup.v2.ImportState
import org.thoughtcrime.securesms.backup.v2.proto.FilePointer
import org.thoughtcrime.securesms.conversation.colors.AvatarColor
import org.thoughtcrime.securesms.database.AttachmentTable
import org.thoughtcrime.securesms.stickers.StickerLocator
import org.whispersystems.signalservice.api.backup.MediaName
@@ -25,6 +26,7 @@ import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPoin
import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentRemoteId
import org.whispersystems.signalservice.api.util.UuidUtil
import java.util.Optional
import org.thoughtcrime.securesms.backup.v2.proto.AvatarColor as RemoteAvatarColor
/**
* Converts a [FilePointer] to a local [Attachment] object for inserting into the database.
@@ -176,3 +178,39 @@ fun DatabaseAttachment.toRemoteFilePointer(mediaArchiveEnabled: Boolean, content
fun Long.clampToValidBackupRange(): Long {
return this.coerceIn(0, 8640000000000000)
}
fun AvatarColor.toRemote(): RemoteAvatarColor {
return when (this) {
AvatarColor.A100 -> RemoteAvatarColor.A100
AvatarColor.A110 -> RemoteAvatarColor.A110
AvatarColor.A120 -> RemoteAvatarColor.A120
AvatarColor.A130 -> RemoteAvatarColor.A130
AvatarColor.A140 -> RemoteAvatarColor.A140
AvatarColor.A150 -> RemoteAvatarColor.A150
AvatarColor.A160 -> RemoteAvatarColor.A160
AvatarColor.A170 -> RemoteAvatarColor.A170
AvatarColor.A180 -> RemoteAvatarColor.A180
AvatarColor.A190 -> RemoteAvatarColor.A190
AvatarColor.A200 -> RemoteAvatarColor.A200
AvatarColor.A210 -> RemoteAvatarColor.A210
AvatarColor.UNKNOWN -> RemoteAvatarColor.A100
AvatarColor.ON_SURFACE_VARIANT -> RemoteAvatarColor.A100
}
}
fun RemoteAvatarColor.toLocal(): AvatarColor {
return when (this) {
RemoteAvatarColor.A100 -> AvatarColor.A100
RemoteAvatarColor.A110 -> AvatarColor.A110
RemoteAvatarColor.A120 -> AvatarColor.A120
RemoteAvatarColor.A130 -> AvatarColor.A130
RemoteAvatarColor.A140 -> AvatarColor.A140
RemoteAvatarColor.A150 -> AvatarColor.A150
RemoteAvatarColor.A160 -> AvatarColor.A160
RemoteAvatarColor.A170 -> AvatarColor.A170
RemoteAvatarColor.A180 -> AvatarColor.A180
RemoteAvatarColor.A190 -> AvatarColor.A190
RemoteAvatarColor.A200 -> AvatarColor.A200
RemoteAvatarColor.A210 -> AvatarColor.A210
}
}