From f145c2050807e76cd2ed6c7c81300641abb68d60 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 21 Mar 2025 11:46:24 -0400 Subject: [PATCH] Fix potential archive export error around username. --- .../v2/exporters/ContactArchiveExporter.kt | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ContactArchiveExporter.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ContactArchiveExporter.kt index 4c90fc677f..5fdd26f936 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ContactArchiveExporter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/exporters/ContactArchiveExporter.kt @@ -14,6 +14,8 @@ import org.signal.core.util.requireBoolean import org.signal.core.util.requireInt import org.signal.core.util.requireLong import org.signal.core.util.requireString +import org.signal.libsignal.usernames.BaseUsernameException +import org.signal.libsignal.usernames.Username import org.thoughtcrime.securesms.backup.v2.ArchiveRecipient import org.thoughtcrime.securesms.backup.v2.proto.Contact import org.thoughtcrime.securesms.backup.v2.proto.Self @@ -69,7 +71,7 @@ class ContactArchiveExporter(private val cursor: Cursor, private val selfId: Lon val contactBuilder = Contact.Builder() .aci(aci?.rawUuid?.toByteArray()?.toByteString()) .pni(pni?.rawUuid?.toByteArray()?.toByteString()) - .username(cursor.requireString(RecipientTable.USERNAME)) + .username(cursor.requireString(RecipientTable.USERNAME).takeIf { isValidUsername(it) }) .e164(cursor.requireString(RecipientTable.E164)?.e164ToLong()) .blocked(cursor.requireBoolean(RecipientTable.BLOCKED)) .visibility(Recipient.HiddenState.deserialize(cursor.requireInt(RecipientTable.HIDDEN)).toRemote()) @@ -144,3 +146,16 @@ private fun String.e164ToLong(): Long? { return fixed.toLongOrNull()?.takeUnless { it == 0L } } + +private fun isValidUsername(username: String?): Boolean { + if (username.isNullOrBlank()) { + return false + } + + return try { + Username(username) + true + } catch (e: BaseUsernameException) { + false + } +}