Update libsignal-net integration to match libsignal v0.62.0.

This commit is contained in:
andrew-signal 2024-11-14 09:15:28 -05:00 committed by Greyson Parrelli
parent e82dfea93c
commit bf3012bd8a
10 changed files with 46 additions and 50 deletions

View file

@ -90,7 +90,8 @@ class InstrumentationApplicationDependencyProvider(val application: Application,
signalProxy = Optional.empty(),
zkGroupServerPublicParams = Base64.decode(BuildConfig.ZKGROUP_SERVER_PUBLIC_PARAMS),
genericServerPublicParams = Base64.decode(BuildConfig.GENERIC_SERVER_PUBLIC_PARAMS),
backupServerPublicParams = Base64.decode(BuildConfig.BACKUP_SERVER_PUBLIC_PARAMS)
backupServerPublicParams = Base64.decode(BuildConfig.BACKUP_SERVER_PUBLIC_PARAMS),
censored = false
)
serviceNetworkAccessMock = mock {

View file

@ -435,8 +435,7 @@ public class ApplicationDependencyProvider implements AppDependencies.Provider {
return new LibSignalChatConnection(
"libsignal-unauth",
LibSignalNetworkExtensions.createChatService(network, null, Stories.isFeatureEnabled()),
healthMonitor,
false);
healthMonitor);
} else {
return new OkHttpWebSocketConnection("unidentified",
signalServiceConfigurationSupplier.get(),

View file

@ -189,7 +189,8 @@ open class SignalServiceNetworkAccess(context: Context) {
signalProxy = Optional.empty(),
zkGroupServerPublicParams = zkGroupServerPublicParams,
genericServerPublicParams = genericServerPublicParams,
backupServerPublicParams = backupServerPublicParams
backupServerPublicParams = backupServerPublicParams,
censored = true
)
private val censorshipConfiguration: Map<Int, SignalServiceConfiguration> = mapOf(
@ -247,7 +248,8 @@ open class SignalServiceNetworkAccess(context: Context) {
signalProxy = if (SignalStore.proxy.isProxyEnabled) Optional.ofNullable(SignalStore.proxy.proxy) else Optional.empty(),
zkGroupServerPublicParams = zkGroupServerPublicParams,
genericServerPublicParams = genericServerPublicParams,
backupServerPublicParams = backupServerPublicParams
backupServerPublicParams = backupServerPublicParams,
censored = false
)
open fun getConfiguration(): SignalServiceConfiguration {
@ -316,7 +318,8 @@ open class SignalServiceNetworkAccess(context: Context) {
signalProxy = Optional.empty(),
zkGroupServerPublicParams = zkGroupServerPublicParams,
genericServerPublicParams = genericServerPublicParams,
backupServerPublicParams = backupServerPublicParams
backupServerPublicParams = backupServerPublicParams,
censored = true
)
}

View file

@ -15,7 +15,7 @@ dependencyResolutionManagement {
version("exoplayer", "2.19.0")
version("glide", "4.15.1")
version("kotlin", "1.9.20")
version("libsignal-client", "0.60.1")
version("libsignal-client", "0.62.0")
version("mp4parser", "1.9.39")
version("android-gradle-plugin", "8.4.0")
version("accompanist", "0.28.0")

View file

@ -8971,20 +8971,20 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="cf341613dbc8aa7107f9971bfd25c51fc7ea8e789890d643b0015b8ce33c1558" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.signal" name="libsignal-android" version="0.60.1">
<artifact name="libsignal-android-0.60.1.aar">
<sha256 value="883fe0df856f88889024dc83a14c0ccda8ddb181b4adcfbb087e10eeb1e9a25b" origin="Generated by Gradle"/>
<component group="org.signal" name="libsignal-android" version="0.62.0">
<artifact name="libsignal-android-0.62.0.aar">
<sha256 value="5bfd9f822274a2dc5e79ef7799acc415cda6f9672233b450be5666797e4d8e35" origin="Generated by Gradle"/>
</artifact>
<artifact name="libsignal-android-0.60.1.module">
<sha256 value="20589d089af667c5fddba272f0bb391413b0b41b157cebb92dfafc15092def02" origin="Generated by Gradle"/>
<artifact name="libsignal-android-0.62.0.module">
<sha256 value="cf08e06a2f6ea745cb486757a596d4a7d6dd01d6e5dcd2597d6a38d090da9730" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.signal" name="libsignal-client" version="0.60.1">
<artifact name="libsignal-client-0.60.1.jar">
<sha256 value="0d2fe21579b89bd39466df3cf3b4ecce828dcda7f99ddb3d9bbef0a8a0b01173" origin="Generated by Gradle"/>
<component group="org.signal" name="libsignal-client" version="0.62.0">
<artifact name="libsignal-client-0.62.0.jar">
<sha256 value="b4397fe8695698a626e818b2cbfced78f33e27f7acd7fb540684f32d37495c86" origin="Generated by Gradle"/>
</artifact>
<artifact name="libsignal-client-0.60.1.module">
<sha256 value="ac7b7726438d72e962a0329d481c0d1c5ac6ee73589a1b51b298bbb4eced22bd" origin="Generated by Gradle"/>
<artifact name="libsignal-client-0.62.0.module">
<sha256 value="c2eb94fc6c54a63257a888796d7abd05cd1b04fd22440462aabfb2f4834cdcd2" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.signal" name="ringrtc-android" version="2.48.4">

View file

@ -19,7 +19,8 @@ data class SignalServiceConfiguration(
val signalProxy: Optional<SignalProxy>,
val zkGroupServerPublicParams: ByteArray,
val genericServerPublicParams: ByteArray,
val backupServerPublicParams: ByteArray
val backupServerPublicParams: ByteArray,
val censored: Boolean
) {
/** Convenience operator overload for combining the URL lists. Does not add the other fields together, as those wouldn't make sense. */

View file

@ -11,7 +11,9 @@ import io.reactivex.rxjava3.schedulers.Schedulers
import io.reactivex.rxjava3.subjects.BehaviorSubject
import io.reactivex.rxjava3.subjects.SingleSubject
import org.signal.core.util.logging.Log
import org.signal.libsignal.net.AuthenticatedChatService
import org.signal.libsignal.net.ChatService
import org.signal.libsignal.net.UnauthenticatedChatService
import org.whispersystems.signalservice.api.websocket.HealthMonitor
import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState
import org.whispersystems.signalservice.internal.util.whenComplete
@ -37,8 +39,7 @@ import org.signal.libsignal.net.ChatService.Response as LibSignalResponse
class LibSignalChatConnection(
name: String,
private val chatService: ChatService,
private val healthMonitor: HealthMonitor,
val isAuthenticated: Boolean
private val healthMonitor: HealthMonitor
) : WebSocketConnection {
companion object {
@ -86,12 +87,7 @@ class LibSignalChatConnection(
override fun connect(): Observable<WebSocketConnectionState> {
Log.i(TAG, "$name Connecting...")
state.onNext(WebSocketConnectionState.CONNECTING)
val connect = if (isAuthenticated) {
chatService::connectAuthenticated
} else {
chatService::connectUnauthenticated
}
connect()
chatService.connect()
.whenComplete(
onSuccess = { debugInfo ->
Log.i(TAG, "$name Connected")
@ -128,12 +124,7 @@ class LibSignalChatConnection(
override fun sendRequest(request: WebSocketRequestMessage): Single<WebsocketResponse> {
val single = SingleSubject.create<WebsocketResponse>()
val internalRequest = request.toLibSignalRequest()
val send = if (isAuthenticated) {
throw NotImplementedError("Authenticated socket is not yet supported")
} else {
chatService::unauthenticatedSend
}
send(internalRequest)
chatService.send(internalRequest)
.whenComplete(
onSuccess = { response ->
when (response!!.status) {
@ -143,7 +134,7 @@ class LibSignalChatConnection(
}
// Here success means "we received the response" even if it is reporting an error.
// This is consistent with the behavior of the OkHttpWebSocketConnection.
single.onSuccess(response.toWebsocketResponse(isUnidentified = !isAuthenticated))
single.onSuccess(response.toWebsocketResponse(isUnidentified = (chatService is UnauthenticatedChatService)))
},
onFailure = { throwable ->
Log.i(TAG, "$name sendRequest failed", throwable)
@ -155,12 +146,7 @@ class LibSignalChatConnection(
override fun sendKeepAlive() {
Log.i(TAG, "$name Sending keep alive...")
val send = if (isAuthenticated) {
throw NotImplementedError("Authenticated socket is not yet supported")
} else {
chatService::unauthenticatedSendAndDebug
}
send(KEEP_ALIVE_REQUEST)
chatService.sendAndDebug(KEEP_ALIVE_REQUEST)
.whenComplete(
onSuccess = { debugResponse ->
Log.i(TAG, "$name Keep alive - success")
@ -174,7 +160,7 @@ class LibSignalChatConnection(
}
in 400..599 -> {
healthMonitor.onMessageError(debugResponse.response.status, isAuthenticated)
healthMonitor.onMessageError(debugResponse.response.status, (chatService is AuthenticatedChatService))
}
else -> {

View file

@ -21,7 +21,11 @@ fun Network.createChatService(
): ChatService {
val username = credentialsProvider?.username ?: ""
val password = credentialsProvider?.password ?: ""
return this.createChatService(username, password, receiveStories)
return if (username.isEmpty() && password.isEmpty()) {
this.createUnauthChatService(null)
} else {
this.createAuthChatService(username, password, receiveStories, null)
}
}
/**
@ -35,4 +39,6 @@ fun Network.applyConfiguration(config: SignalServiceConfiguration) {
} else {
this.setProxy(proxy.host, proxy.port)
}
this.setCensorshipCircumventionEnabled(config.censored)
}

View file

@ -70,7 +70,7 @@ class ShadowingWebSocketConnection(
override fun connect(): Observable<WebSocketConnectionState> {
executor.submit {
chatService.connectUnauthenticated().whenComplete(
chatService.connect().whenComplete(
onSuccess = {
canShadow.set(true)
Log.i(TAG, "Shadow socket connected.")
@ -140,7 +140,7 @@ class ShadowingWebSocketConnection(
ByteArray(0),
KEEP_ALIVE_TIMEOUT.inWholeMilliseconds.toInt()
)
chatService.unauthenticatedSendAndDebug(request)
chatService.sendAndDebug(request)
.whenComplete(
onSuccess = {
stats.requestsCompared.incrementAndGet()

View file

@ -25,7 +25,7 @@ class LibSignalChatConnectionTest {
private val executor: ExecutorService = Executors.newSingleThreadExecutor()
private val healthMonitor = mockk<HealthMonitor>()
private val chatService = mockk<ChatService>()
private val connection = LibSignalChatConnection("test", chatService, healthMonitor, isAuthenticated = false)
private val connection = LibSignalChatConnection("test", chatService, healthMonitor)
@Before
fun before() {
@ -38,7 +38,7 @@ class LibSignalChatConnectionTest {
fun orderOfStatesOnSuccessfulConnect() {
val latch = CountDownLatch(1)
every { chatService.connectUnauthenticated() } answers {
every { chatService.connect() } answers {
delay {
it.complete(DEBUG_INFO)
latch.countDown()
@ -65,7 +65,7 @@ class LibSignalChatConnectionTest {
val connectionException = RuntimeException("connect failed")
val latch = CountDownLatch(1)
every { chatService.connectUnauthenticated() } answers {
every { chatService.connect() } answers {
delay {
it.completeExceptionally(connectionException)
}
@ -91,7 +91,7 @@ class LibSignalChatConnectionTest {
val connectLatch = CountDownLatch(1)
val disconnectLatch = CountDownLatch(1)
every { chatService.connectUnauthenticated() } answers {
every { chatService.connect() } answers {
delay {
it.complete(DEBUG_INFO)
connectLatch.countDown()
@ -155,7 +155,7 @@ class LibSignalChatConnectionTest {
fun keepAliveSuccess() {
val latch = CountDownLatch(1)
every { chatService.unauthenticatedSendAndDebug(any()) } answers {
every { chatService.sendAndDebug(any()) } answers {
delay {
it.complete(make_debug_response(RESPONSE_SUCCESS))
latch.countDown()
@ -179,7 +179,7 @@ class LibSignalChatConnectionTest {
for (response in listOf(RESPONSE_ERROR, RESPONSE_SERVER_ERROR)) {
val latch = CountDownLatch(1)
every { chatService.unauthenticatedSendAndDebug(any()) } answers {
every { chatService.sendAndDebug(any()) } answers {
delay {
it.complete(make_debug_response(response))
}
@ -203,7 +203,7 @@ class LibSignalChatConnectionTest {
val latch = CountDownLatch(1)
every {
chatService.unauthenticatedSendAndDebug(any())
chatService.sendAndDebug(any())
} answers {
delay {
it.completeExceptionally(connectionFailure)