Migrate to libsignal deleteUsernameHash.

Co-authored-by: Cody Henthorne <cody@signal.org>
This commit is contained in:
andrew-signal
2026-07-17 12:07:59 -04:00
committed by Greyson Parrelli
parent 7e79dfa57f
commit 35ca16f294
2 changed files with 20 additions and 9 deletions
@@ -536,8 +536,8 @@ object UsernameRepository {
return UsernameDeleteResult.NETWORK_ERROR
}
return when (val result = SignalNetwork.account.deleteUsername()) {
is NetworkResult.Success -> {
return when (val result = SignalNetwork.account.deleteUsernameHash()) {
is RequestResult.Success -> {
SignalDatabase.recipients.setUsername(Recipient.self().id, null)
SignalStore.account.username = null
SignalStore.account.usernameLink = null
@@ -553,10 +553,15 @@ object UsernameRepository {
Log.i(TAG, "[deleteUsername] Successfully deleted the username.")
UsernameDeleteResult.SUCCESS
}
else -> {
Log.w(TAG, "[deleteUsername] Generic network exception.", result.getCause())
is RequestResult.RetryableNetworkError -> {
Log.w(TAG, "[deleteUsername] Generic network exception.", result.networkError)
UsernameDeleteResult.NETWORK_ERROR
}
is RequestResult.ApplicationError -> throw result.cause
is RequestResult.NonSuccess -> error("Code branch is unreachable")
}
}
@@ -9,6 +9,7 @@ import kotlinx.coroutines.runBlocking
import org.signal.core.util.Base64
import org.signal.core.util.Base64.encodeUrlSafeWithoutPadding
import org.signal.libsignal.net.AuthDevicesService
import org.signal.libsignal.net.AuthUsernamesService
import org.signal.libsignal.net.RequestResult
import org.signal.libsignal.usernames.BaseUsernameException
import org.signal.libsignal.usernames.Username
@@ -215,12 +216,17 @@ class AccountApi(private val authWebSocket: SignalWebSocket.AuthenticatedWebSock
}
/**
* DELETE /v1/accounts/username_hash
* - 204: Success
* Clears the current username hash, ciphertext, and link for the authenticated account.
*
* This also succeeds if the account has no username set, so a caller retrying a deletion sees
* the same result as the original call.
*/
fun deleteUsername(): NetworkResult<Unit> {
val request = WebSocketRequestMessage.delete("/v1/accounts/username_hash")
return NetworkResult.fromWebSocketRequest(authWebSocket, request)
fun deleteUsernameHash(): RequestResult<Unit, Nothing> {
return runBlocking {
authWebSocket.runCatchingWithChatConnection { connection ->
AuthUsernamesService(connection).deleteUsernameHash()
}
}
}
/**