Fix potential archive export error around username.

This commit is contained in:
Greyson Parrelli
2025-03-21 11:46:24 -04:00
parent 8b54cea119
commit f145c20508

View File

@@ -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
}
}