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