mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-05-31 12:33:12 +01:00
Move a bunch of files into the network modules.
This commit is contained in:
committed by
Michelle Tang
parent
6339b38dee
commit
4dd57460de
@@ -114,6 +114,7 @@ dependencies {
|
||||
implementation(libs.kotlinx.coroutines.core)
|
||||
implementation(libs.kotlinx.coroutines.core.jvm)
|
||||
|
||||
api(project(":core:network"))
|
||||
implementation(project(":core:util-jvm"))
|
||||
implementation(project(":core:models-jvm"))
|
||||
|
||||
|
||||
-522
@@ -1,522 +0,0 @@
|
||||
/*
|
||||
* Copyright 2023 Signal Messenger, LLC
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
package org.whispersystems.signalservice.api
|
||||
|
||||
import io.reactivex.rxjava3.core.Single
|
||||
import org.signal.core.util.concurrent.safeBlockingGet
|
||||
import org.whispersystems.signalservice.api.NetworkResult.ApplicationError
|
||||
import org.whispersystems.signalservice.api.NetworkResult.Companion.fromWebSocket
|
||||
import org.whispersystems.signalservice.api.NetworkResult.StatusCodeError
|
||||
import org.whispersystems.signalservice.api.push.exceptions.MalformedRequestException
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException
|
||||
import org.whispersystems.signalservice.api.websocket.SignalWebSocket
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketConnection
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage
|
||||
import org.whispersystems.signalservice.internal.websocket.WebsocketResponse
|
||||
import java.io.IOException
|
||||
import java.util.concurrent.TimeoutException
|
||||
import kotlin.reflect.KClass
|
||||
import kotlin.reflect.cast
|
||||
import kotlin.time.Duration
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
|
||||
typealias StatusCodeErrorAction = (StatusCodeError<*>) -> Unit
|
||||
typealias ApplicationErrorAction = (ApplicationError<*>) -> Unit
|
||||
|
||||
/**
|
||||
* A helper class that wraps the result of a network request, turning common exceptions
|
||||
* into sealed classes, with optional request chaining.
|
||||
*
|
||||
* This was designed to be a middle ground between the heavy reliance on specific exceptions
|
||||
* in old network code (which doesn't translate well to kotlin not having checked exceptions)
|
||||
* and plain rx, which still doesn't free you from having to catch exceptions and translate
|
||||
* things to sealed classes yourself.
|
||||
*
|
||||
* If you have a very complicated network request with lots of different possible response types
|
||||
* based on specific errors, this isn't for you. You're likely better off writing your own
|
||||
* sealed class. However, for the majority of requests which just require getting a model from
|
||||
* the success case and the status code of the error, this can be quite convenient.
|
||||
*/
|
||||
sealed class NetworkResult<T>(
|
||||
private val statusCodeErrorActions: MutableSet<StatusCodeErrorAction> = mutableSetOf(),
|
||||
private val applicationErrorActions: MutableSet<ApplicationErrorAction> = mutableSetOf()
|
||||
) {
|
||||
companion object {
|
||||
/**
|
||||
* A convenience method to capture the common case of making a request.
|
||||
* Perform the network action in the [fetcher], returning your result.
|
||||
* Common exceptions will be caught and translated to errors.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun <T> fromFetch(fetcher: Fetcher<T>): NetworkResult<T> = try {
|
||||
Success(fetcher.fetch())
|
||||
} catch (e: NonSuccessfulResponseCodeException) {
|
||||
StatusCodeError(e)
|
||||
} catch (e: IOException) {
|
||||
NetworkError(e)
|
||||
} catch (e: Throwable) {
|
||||
ApplicationError(e)
|
||||
}
|
||||
|
||||
/**
|
||||
* A convenience method to convert a websocket request into a network result, parsing the body into type [T].
|
||||
*
|
||||
* Common HTTP errors will be translated to [StatusCodeError]s.
|
||||
*/
|
||||
inline fun <reified T : Any> fromWebSocket(fetcher: Fetcher<Single<WebsocketResponse>>): NetworkResult<T> {
|
||||
return fromWebSocket(DefaultWebSocketConverter(T::class), fetcher)
|
||||
}
|
||||
|
||||
/**
|
||||
* A convenience method to convert a websocket request into a network result, using the provided
|
||||
* [webSocketResponseConverter] to parse the response into type [T].
|
||||
*
|
||||
* Common HTTP errors will be translated to [StatusCodeError]s.
|
||||
*/
|
||||
fun <T> fromWebSocket(
|
||||
webSocketResponseConverter: WebSocketResponseConverter<T>,
|
||||
fetcher: Fetcher<Single<WebsocketResponse>>
|
||||
): NetworkResult<T> {
|
||||
return try {
|
||||
val result: Result<NetworkResult<T>> = fetcher.fetch()
|
||||
.map { response: WebsocketResponse -> Result.success(webSocketResponseConverter.convert(response)) }
|
||||
.onErrorReturn { Result.failure(it) }
|
||||
.safeBlockingGet()
|
||||
|
||||
result.getOrThrow()
|
||||
} catch (e: NonSuccessfulResponseCodeException) {
|
||||
StatusCodeError(e)
|
||||
} catch (e: IOException) {
|
||||
NetworkError(e)
|
||||
} catch (e: TimeoutException) {
|
||||
NetworkError(PushNetworkException(e))
|
||||
} catch (e: InterruptedException) {
|
||||
NetworkError(PushNetworkException(e))
|
||||
} catch (e: Throwable) {
|
||||
ApplicationError(e)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A convenience method to convert a websocket request into a network result.
|
||||
* Common HTTP errors will be translated to [StatusCodeError]s.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun fromWebSocketRequest(
|
||||
signalWebSocket: SignalWebSocket,
|
||||
request: WebSocketRequestMessage,
|
||||
timeout: Duration = WebSocketConnection.DEFAULT_SEND_TIMEOUT
|
||||
): NetworkResult<Unit> = fromWebSocketRequest(
|
||||
signalWebSocket = signalWebSocket,
|
||||
request = request,
|
||||
timeout = timeout,
|
||||
clazz = Unit::class
|
||||
)
|
||||
|
||||
/**
|
||||
* A convenience method to convert a websocket request into a network result with simple conversion of the response body to the desired class.
|
||||
* Common HTTP errors will be translated to [StatusCodeError]s.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun <T : Any> fromWebSocketRequest(
|
||||
signalWebSocket: SignalWebSocket,
|
||||
request: WebSocketRequestMessage,
|
||||
clazz: KClass<T>,
|
||||
timeout: Duration = WebSocketConnection.DEFAULT_SEND_TIMEOUT
|
||||
): NetworkResult<T> {
|
||||
return fromWebSocketRequest(
|
||||
signalWebSocket = signalWebSocket,
|
||||
request = request,
|
||||
timeout = timeout,
|
||||
webSocketResponseConverter = DefaultWebSocketConverter(clazz)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* A convenience method to convert a websocket request into a network result with the ability to fully customize the conversion of the response.
|
||||
* Common HTTP errors will be translated to [StatusCodeError]s.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun <T : Any> fromWebSocketRequest(
|
||||
signalWebSocket: SignalWebSocket,
|
||||
request: WebSocketRequestMessage,
|
||||
timeout: Duration = WebSocketConnection.DEFAULT_SEND_TIMEOUT,
|
||||
webSocketResponseConverter: WebSocketResponseConverter<T>
|
||||
): NetworkResult<T> {
|
||||
return fromWebSocket(webSocketResponseConverter) { signalWebSocket.request(request, timeout) }
|
||||
}
|
||||
|
||||
/**
|
||||
* Coroutine-friendly variant of the [fromWebSocket] overload that takes a [WebSocketResponseConverter].
|
||||
*/
|
||||
suspend fun <T> fromWebSocketSuspend(
|
||||
webSocketResponseConverter: WebSocketResponseConverter<T>,
|
||||
fetcher: suspend () -> WebsocketResponse
|
||||
): NetworkResult<T> {
|
||||
return try {
|
||||
webSocketResponseConverter.convert(fetcher())
|
||||
} catch (e: kotlinx.coroutines.CancellationException) {
|
||||
throw e
|
||||
} catch (e: NonSuccessfulResponseCodeException) {
|
||||
StatusCodeError(e)
|
||||
} catch (e: IOException) {
|
||||
NetworkError(e)
|
||||
} catch (e: TimeoutException) {
|
||||
NetworkError(PushNetworkException(e))
|
||||
} catch (e: InterruptedException) {
|
||||
NetworkError(PushNetworkException(e))
|
||||
} catch (e: Throwable) {
|
||||
ApplicationError(e)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Wraps a local operation, [block], that may throw an exception that should be wrapped in an [ApplicationError]
|
||||
* and abort downstream network requests that directly depend on the output of the local operation. Should
|
||||
* be used almost exclusively prior to a [then].
|
||||
*/
|
||||
fun <T : Any> fromLocal(block: () -> T): NetworkResult<T> {
|
||||
return try {
|
||||
Success(block())
|
||||
} catch (e: Throwable) {
|
||||
ApplicationError(e)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs [operation] to perform a network call. If [shouldRetry] returns false for the result, then returns it. Otherwise will call [operation] repeatedly
|
||||
* until [shouldRetry] returns false or is called [maxAttempts] number of times.
|
||||
*
|
||||
* @param maxAttempts Max attempts to try the network operation, must be 1 or more, default is 5
|
||||
* @param shouldRetry Predicate to determine if network operation should be retried, default is any [NetworkError] result is retried
|
||||
* @param logAttempt Log each attempt before [operation] is called, default is noop
|
||||
* @param operation Network operation that can be called repeatedly for each attempt
|
||||
*/
|
||||
fun <T : Any?> withRetry(
|
||||
maxAttempts: Int = 5,
|
||||
shouldRetry: (NetworkResult<T>) -> Boolean = { it is NetworkError },
|
||||
logAttempt: (attempt: Int, maxAttempts: Int) -> Unit = { _, _ -> },
|
||||
operation: () -> NetworkResult<T>
|
||||
): NetworkResult<T> {
|
||||
require(maxAttempts > 0)
|
||||
|
||||
lateinit var result: NetworkResult<T>
|
||||
for (attempt in 0 until maxAttempts) {
|
||||
logAttempt(attempt, maxAttempts)
|
||||
result = operation()
|
||||
|
||||
if (!shouldRetry(result)) {
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
/** Indicates the request was successful */
|
||||
data class Success<T>(val result: T) : NetworkResult<T>()
|
||||
|
||||
/** Indicates a generic network error occurred before we were able to process a response. */
|
||||
data class NetworkError<T>(val exception: IOException) : NetworkResult<T>()
|
||||
|
||||
/** Indicates we got a response, but it was a non-2xx response. */
|
||||
data class StatusCodeError<T>(val code: Int, val stringBody: String?, val binaryBody: ByteArray?, private val headers: Map<String, String>, val exception: NonSuccessfulResponseCodeException) : NetworkResult<T>() {
|
||||
constructor(e: NonSuccessfulResponseCodeException) : this(e.code, e.stringBody, e.binaryBody, e.headers, e)
|
||||
constructor(result: StatusCodeError<*>) : this(result.code, result.stringBody, result.binaryBody, result.headers, result.exception)
|
||||
|
||||
inline fun <reified T> parseJsonBody(): T? {
|
||||
return try {
|
||||
if (stringBody != null) {
|
||||
JsonUtil.fromJsonResponse(stringBody, T::class.java)
|
||||
} else if (binaryBody != null) {
|
||||
JsonUtil.fromJsonResponse(binaryBody, T::class.java)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
} catch (_: MalformedRequestException) {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
fun header(key: String): String? {
|
||||
return headers[key.lowercase()]
|
||||
}
|
||||
|
||||
fun retryAfter(): Duration? {
|
||||
return header("retry-after")?.toLongOrNull()?.seconds
|
||||
}
|
||||
}
|
||||
|
||||
/** Indicates that the application somehow failed in a way unrelated to network activity. Usually a runtime crash. */
|
||||
data class ApplicationError<T>(val throwable: Throwable) : NetworkResult<T>()
|
||||
|
||||
/**
|
||||
* Returns the result if successful, otherwise turns the result back into an exception and throws it.
|
||||
*
|
||||
* Useful for bridging to Java, where you may want to use try-catch.
|
||||
*/
|
||||
@Throws(NonSuccessfulResponseCodeException::class, IOException::class, Throwable::class)
|
||||
fun successOrThrow(): T {
|
||||
when (this) {
|
||||
is Success -> return result
|
||||
is NetworkError -> throw exception
|
||||
is StatusCodeError -> throw exception
|
||||
is ApplicationError -> throw throwable
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the result if successful, otherwise null.
|
||||
*/
|
||||
fun successOrNull(): T? {
|
||||
return when (this) {
|
||||
is Success -> result
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the [Throwable] associated with the result, or null if the result is successful.
|
||||
*/
|
||||
fun getCause(): Throwable? {
|
||||
return when (this) {
|
||||
is Success -> null
|
||||
is NetworkError -> exception
|
||||
is StatusCodeError -> exception
|
||||
is ApplicationError -> throwable
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes the output of one [NetworkResult] and transforms it into another if the operation is successful.
|
||||
* If it's non-successful, [transform] lambda is not run, and instead the original failure will be propagated.
|
||||
* Useful for changing the type of a result.
|
||||
*
|
||||
* If an exception is thrown during [transform], this is mapped to an [ApplicationError].
|
||||
*
|
||||
* ```kotlin
|
||||
* val user: NetworkResult<LocalUserModel> = NetworkResult
|
||||
* .fromFetch { fetchRemoteUserModel() }
|
||||
* .map { it.toLocalUserModel() }
|
||||
* ```
|
||||
*/
|
||||
fun <R> map(transform: (T) -> R): NetworkResult<R> {
|
||||
val map = when (this) {
|
||||
is Success -> {
|
||||
try {
|
||||
Success(transform(this.result))
|
||||
} catch (e: Throwable) {
|
||||
ApplicationError<R>(e)
|
||||
}
|
||||
}
|
||||
|
||||
is NetworkError -> NetworkError<R>(exception)
|
||||
is ApplicationError -> ApplicationError<R>(throwable)
|
||||
is StatusCodeError -> StatusCodeError<R>(this)
|
||||
}
|
||||
|
||||
return map.runOnStatusCodeError(statusCodeErrorActions).runOnApplicationError(applicationErrorActions)
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides the ability to fallback to [fallback] if the current [NetworkResult] is non-successful.
|
||||
*
|
||||
* The [fallback] will only be triggered on non-[Success] results. You can provide a [predicate] to limit what kinds of errors you fallback on
|
||||
* (the default is to fallback on every error).
|
||||
*
|
||||
* This primary usecase of this is to make an unauth websocket request and fallback to auth websocket upon failure.
|
||||
*
|
||||
* ```kotlin
|
||||
* val user: NetworkResult<LocalUserModel> = NetworkResult
|
||||
* .fromWebSocket { unauthWebSocket.request(request, sealedSenderAccess) }
|
||||
* .fallback { NetworkResult.fromWebSocket { authWebSocket.request(request) } }
|
||||
* ```
|
||||
*
|
||||
* @param predicate If this lambda returns true, the fallback will be triggered.
|
||||
*/
|
||||
fun fallback(predicate: (NetworkResult<T>) -> Boolean = { true }, fallback: () -> NetworkResult<T>): NetworkResult<T> {
|
||||
if (this is Success) {
|
||||
return this
|
||||
}
|
||||
|
||||
return if (predicate(this)) {
|
||||
fallback()
|
||||
} else {
|
||||
this
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* See [fallback].
|
||||
*/
|
||||
suspend fun fallbackSuspend(predicate: (NetworkResult<T>) -> Boolean = { true }, fallback: suspend () -> NetworkResult<T>): NetworkResult<T> {
|
||||
if (this is Success) {
|
||||
return this
|
||||
}
|
||||
|
||||
return if (predicate(this)) {
|
||||
fallback()
|
||||
} else {
|
||||
this
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes the output of one [NetworkResult] and passes it as the input to another if the operation is successful.
|
||||
* If it's non-successful, the [result] lambda is not run, and instead the original failure will be propagated.
|
||||
* Useful for chaining operations together.
|
||||
*
|
||||
* ```kotlin
|
||||
* val networkResult: NetworkResult<MyData> = NetworkResult
|
||||
* .fromFetch { fetchAuthCredential() }
|
||||
* .then {
|
||||
* NetworkResult.fromFetch { credential -> fetchData(credential) }
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
fun <R> then(result: (T) -> NetworkResult<R>): NetworkResult<R> {
|
||||
val then = when (this) {
|
||||
is Success -> result(this.result)
|
||||
is NetworkError -> NetworkError<R>(exception)
|
||||
is ApplicationError -> ApplicationError<R>(throwable)
|
||||
is StatusCodeError -> StatusCodeError<R>(this)
|
||||
}
|
||||
|
||||
return then.runOnStatusCodeError(statusCodeErrorActions).runOnApplicationError(applicationErrorActions)
|
||||
}
|
||||
|
||||
/**
|
||||
* Will perform an operation if the result at this point in the chain is successful. Note that it runs if the chain is _currently_ successful. It does not
|
||||
* depend on anything further down the chain.
|
||||
*
|
||||
* ```kotlin
|
||||
* val networkResult: NetworkResult<MyData> = NetworkResult
|
||||
* .fromFetch { fetchAuthCredential() }
|
||||
* .runIfSuccessful { storeMyCredential(it) }
|
||||
* ```
|
||||
*/
|
||||
fun runIfSuccessful(result: (T) -> Unit): NetworkResult<T> {
|
||||
if (this is Success) {
|
||||
result(this.result)
|
||||
}
|
||||
return this
|
||||
}
|
||||
|
||||
/**
|
||||
* Specify an action to be run when a status code error occurs. When a result is a [StatusCodeError] or is transformed into one further down the chain via
|
||||
* a future [map] or [then], this code will be run. There can only ever be a single status code error in a chain, and therefore this lambda will only ever
|
||||
* be run a single time.
|
||||
*
|
||||
* This is a low-visibility way of doing things, so use sparingly.
|
||||
*
|
||||
* ```kotlin
|
||||
* val result = NetworkResult
|
||||
* .fromFetch { getAuth() }
|
||||
* .runOnStatusCodeError { error -> logError(error) }
|
||||
* .then { credential ->
|
||||
* NetworkResult.fromFetch { fetchUserDetails(credential) }
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
fun runOnStatusCodeError(action: StatusCodeErrorAction): NetworkResult<T> {
|
||||
return runOnStatusCodeError(setOf(action))
|
||||
}
|
||||
|
||||
private fun runOnStatusCodeError(actions: Collection<StatusCodeErrorAction>): NetworkResult<T> {
|
||||
if (actions.isEmpty()) {
|
||||
return this
|
||||
}
|
||||
|
||||
statusCodeErrorActions += actions
|
||||
|
||||
if (this is StatusCodeError) {
|
||||
statusCodeErrorActions.forEach { it.invoke(this) }
|
||||
statusCodeErrorActions.clear()
|
||||
}
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
/**
|
||||
* Specify an action to be run when a application error occurs. When a result is a [ApplicationErrorAction] or is transformed into one further down the chain via
|
||||
* a future [map] or [then], this code will be run. There can only ever be a single application error in a chain, and therefore this lambda will only ever
|
||||
* be run a single time.
|
||||
*
|
||||
* This is a low-visibility way of doing things, so use sparingly.
|
||||
*
|
||||
* ```kotlin
|
||||
* val result = NetworkResult
|
||||
* .fromFetch { getAuth() }
|
||||
* .runOnApplicationError { error -> logError(error) }
|
||||
* .then { credential ->
|
||||
* NetworkResult.fromFetch { fetchUserDetails(credential) }
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
fun runOnApplicationError(action: ApplicationErrorAction): NetworkResult<T> {
|
||||
return runOnApplicationError(setOf(action))
|
||||
}
|
||||
|
||||
private fun runOnApplicationError(actions: Collection<ApplicationErrorAction>): NetworkResult<T> {
|
||||
if (actions.isEmpty()) {
|
||||
return this
|
||||
}
|
||||
|
||||
applicationErrorActions += actions
|
||||
|
||||
if (this is ApplicationError) {
|
||||
applicationErrorActions.forEach { it.invoke(this) }
|
||||
applicationErrorActions.clear()
|
||||
}
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
fun interface Fetcher<T> {
|
||||
@Throws(Exception::class)
|
||||
fun fetch(): T
|
||||
}
|
||||
|
||||
fun interface WebSocketResponseConverter<T> {
|
||||
@Throws(Exception::class)
|
||||
fun convert(response: WebsocketResponse): NetworkResult<T>
|
||||
|
||||
fun <T : Any> WebsocketResponse.toStatusCodeError(): NetworkResult<T> {
|
||||
return StatusCodeError(NonSuccessfulResponseCodeException(this.status, "", this.body, this.headers))
|
||||
}
|
||||
|
||||
fun <T : Any> WebsocketResponse.toSuccess(responseJsonClass: KClass<T>): NetworkResult<T> {
|
||||
return when (responseJsonClass) {
|
||||
Unit::class -> Success(responseJsonClass.cast(Unit))
|
||||
String::class -> Success(responseJsonClass.cast(this.body))
|
||||
else -> Success(JsonUtil.fromJson(this.body, responseJsonClass.java))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class DefaultWebSocketConverter<T : Any>(private val responseJsonClass: KClass<T>) : WebSocketResponseConverter<T> {
|
||||
override fun convert(response: WebsocketResponse): NetworkResult<T> {
|
||||
return if (response.status < 200 || response.status > 299) {
|
||||
response.toStatusCodeError()
|
||||
} else {
|
||||
response.toSuccess(responseJsonClass)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class LongPollingWebSocketConverter<T : Any>(private val responseJsonClass: KClass<T>) : WebSocketResponseConverter<T> {
|
||||
override fun convert(response: WebsocketResponse): NetworkResult<T> {
|
||||
return if (response.status == 204 || response.status < 200 || response.status > 299) {
|
||||
response.toStatusCodeError()
|
||||
} else {
|
||||
response.toSuccess(responseJsonClass)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright 2026 Signal Messenger, LLC
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
package org.whispersystems.signalservice.api
|
||||
|
||||
import org.signal.network.NetworkResult
|
||||
import org.signal.network.websocket.WebSocketRequestMessage
|
||||
import org.whispersystems.signalservice.api.websocket.SignalWebSocket
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketConnection
|
||||
import kotlin.reflect.KClass
|
||||
import kotlin.time.Duration
|
||||
|
||||
/**
|
||||
* A convenience method to convert a websocket request into a network result.
|
||||
* Common HTTP errors will be translated to [NetworkResult.StatusCodeError]s.
|
||||
*/
|
||||
fun NetworkResult.Companion.fromWebSocketRequest(
|
||||
signalWebSocket: SignalWebSocket,
|
||||
request: WebSocketRequestMessage,
|
||||
timeout: Duration = WebSocketConnection.DEFAULT_SEND_TIMEOUT
|
||||
): NetworkResult<Unit> = fromWebSocketRequest(
|
||||
signalWebSocket = signalWebSocket,
|
||||
request = request,
|
||||
timeout = timeout,
|
||||
clazz = Unit::class
|
||||
)
|
||||
|
||||
/**
|
||||
* A convenience method to convert a websocket request into a network result with simple conversion of the response body to the desired class.
|
||||
* Common HTTP errors will be translated to [NetworkResult.StatusCodeError]s.
|
||||
*/
|
||||
fun <T : Any> NetworkResult.Companion.fromWebSocketRequest(
|
||||
signalWebSocket: SignalWebSocket,
|
||||
request: WebSocketRequestMessage,
|
||||
clazz: KClass<T>,
|
||||
timeout: Duration = WebSocketConnection.DEFAULT_SEND_TIMEOUT
|
||||
): NetworkResult<T> {
|
||||
return fromWebSocketRequest(
|
||||
signalWebSocket = signalWebSocket,
|
||||
request = request,
|
||||
timeout = timeout,
|
||||
webSocketResponseConverter = NetworkResult.DefaultWebSocketConverter(clazz)
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* A convenience method to convert a websocket request into a network result with the ability to fully customize the conversion of the response.
|
||||
* Common HTTP errors will be translated to [NetworkResult.StatusCodeError]s.
|
||||
*/
|
||||
fun <T : Any> NetworkResult.Companion.fromWebSocketRequest(
|
||||
signalWebSocket: SignalWebSocket,
|
||||
request: WebSocketRequestMessage,
|
||||
timeout: Duration = WebSocketConnection.DEFAULT_SEND_TIMEOUT,
|
||||
webSocketResponseConverter: NetworkResult.WebSocketResponseConverter<T>
|
||||
): NetworkResult<T> {
|
||||
return NetworkResult.fromWebSocket(webSocketResponseConverter) { signalWebSocket.request(request, timeout) }
|
||||
}
|
||||
+2
-1
@@ -5,8 +5,9 @@
|
||||
|
||||
package org.whispersystems.signalservice.api
|
||||
|
||||
import org.signal.network.NetworkResult
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NotFoundException
|
||||
import org.whispersystems.signalservice.api.push.exceptions.ProofRequiredException
|
||||
import org.whispersystems.signalservice.api.push.exceptions.RateLimitException
|
||||
|
||||
+2
@@ -6,6 +6,8 @@
|
||||
|
||||
package org.whispersystems.signalservice.api;
|
||||
|
||||
import org.signal.network.NetworkResult;
|
||||
|
||||
import org.signal.core.util.StreamUtil;
|
||||
import org.signal.libsignal.protocol.InvalidMessageException;
|
||||
import org.signal.libsignal.zkgroup.profiles.ProfileKey;
|
||||
|
||||
+5
-3
@@ -5,6 +5,8 @@
|
||||
*/
|
||||
package org.whispersystems.signalservice.api;
|
||||
|
||||
import org.signal.network.NetworkResult;
|
||||
|
||||
import org.signal.core.models.ServiceId;
|
||||
import org.signal.core.models.ServiceId.PNI;
|
||||
import org.signal.core.util.Base64;
|
||||
@@ -84,9 +86,9 @@ import org.whispersystems.signalservice.api.messages.shared.SharedContact;
|
||||
import org.whispersystems.signalservice.api.push.DistributionId;
|
||||
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.ProofRequiredException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException;
|
||||
import org.signal.network.exceptions.PushNetworkException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.RateLimitException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.RetryNetworkException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.ServerRejectedException;
|
||||
@@ -94,7 +96,7 @@ import org.whispersystems.signalservice.api.push.exceptions.UnknownGroupSendExce
|
||||
import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException;
|
||||
import org.whispersystems.signalservice.api.util.AttachmentPointerUtil;
|
||||
import org.whispersystems.signalservice.api.util.CredentialsProvider;
|
||||
import org.whispersystems.signalservice.api.util.Preconditions;
|
||||
import org.signal.network.util.Preconditions;
|
||||
import org.whispersystems.signalservice.api.util.Uint64RangeException;
|
||||
import org.whispersystems.signalservice.api.util.Uint64Util;
|
||||
import org.whispersystems.signalservice.api.websocket.WebSocketUnavailableException;
|
||||
|
||||
+6
-5
@@ -9,11 +9,14 @@ import org.signal.core.util.Base64
|
||||
import org.signal.core.util.Base64.encodeUrlSafeWithoutPadding
|
||||
import org.signal.libsignal.usernames.BaseUsernameException
|
||||
import org.signal.libsignal.usernames.Username
|
||||
import org.whispersystems.signalservice.api.NetworkResult
|
||||
import org.signal.network.NetworkResult
|
||||
import org.signal.network.websocket.WebSocketRequestMessage
|
||||
import org.signal.network.websocket.delete
|
||||
import org.signal.network.websocket.get
|
||||
import org.signal.network.websocket.put
|
||||
import org.whispersystems.signalservice.api.fromWebSocketRequest
|
||||
import org.whispersystems.signalservice.api.push.UsernameLinkComponents
|
||||
import org.whispersystems.signalservice.api.websocket.SignalWebSocket
|
||||
import org.whispersystems.signalservice.internal.delete
|
||||
import org.whispersystems.signalservice.internal.get
|
||||
import org.whispersystems.signalservice.internal.push.ConfirmUsernameRequest
|
||||
import org.whispersystems.signalservice.internal.push.ConfirmUsernameResponse
|
||||
import org.whispersystems.signalservice.internal.push.GcmRegistrationId
|
||||
@@ -24,8 +27,6 @@ import org.whispersystems.signalservice.internal.push.SetUsernameLinkRequestBody
|
||||
import org.whispersystems.signalservice.internal.push.SetUsernameLinkResponseBody
|
||||
import org.whispersystems.signalservice.internal.push.VerifyAccountResponse
|
||||
import org.whispersystems.signalservice.internal.push.WhoAmIResponse
|
||||
import org.whispersystems.signalservice.internal.put
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage
|
||||
import java.security.SecureRandom
|
||||
import java.util.UUID
|
||||
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@ import org.signal.libsignal.protocol.IdentityKey;
|
||||
import org.whispersystems.signalservice.api.push.SignedPreKeyEntity;
|
||||
import org.whispersystems.signalservice.internal.push.KyberPreKeyEntity;
|
||||
import org.whispersystems.signalservice.internal.push.OutgoingPushMessage;
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil;
|
||||
import org.signal.network.util.JsonUtil;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@ import org.signal.libsignal.protocol.IdentityKey;
|
||||
import org.whispersystems.signalservice.api.push.SignedPreKeyEntity;
|
||||
import org.whispersystems.signalservice.internal.push.KyberPreKeyEntity;
|
||||
import org.whispersystems.signalservice.internal.push.OutgoingPushMessage;
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil;
|
||||
import org.signal.network.util.JsonUtil;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ import org.signal.core.util.logging.Log
|
||||
import org.signal.libsignal.net.AuthMessagesService
|
||||
import org.signal.libsignal.net.RequestResult
|
||||
import org.signal.libsignal.net.UploadTooLargeException
|
||||
import org.whispersystems.signalservice.api.NetworkResult
|
||||
import org.signal.network.NetworkResult
|
||||
import org.whispersystems.signalservice.api.crypto.AttachmentCipherStreamUtil
|
||||
import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentRemoteId
|
||||
import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream
|
||||
|
||||
+2
-2
@@ -9,14 +9,14 @@ import org.signal.libsignal.net.CdsiLookupRequest;
|
||||
import org.signal.libsignal.net.CdsiLookupResponse;
|
||||
import org.signal.libsignal.net.Network;
|
||||
import org.signal.libsignal.zkgroup.profiles.ProfileKey;
|
||||
import org.whispersystems.signalservice.api.NetworkResult;
|
||||
import org.signal.network.NetworkResult;
|
||||
import org.signal.core.models.ServiceId;
|
||||
import org.signal.core.models.ServiceId.ACI;
|
||||
import org.signal.core.models.ServiceId.PNI;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.CdsiInvalidArgumentException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.CdsiInvalidTokenException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.CdsiResourceExhaustedException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
|
||||
+8
-7
@@ -10,8 +10,14 @@ import org.signal.core.util.urlEncode
|
||||
import org.signal.libsignal.zkgroup.receipts.ReceiptCredentialPresentation
|
||||
import org.signal.libsignal.zkgroup.receipts.ReceiptCredentialRequest
|
||||
import org.signal.libsignal.zkgroup.receipts.ReceiptCredentialResponse
|
||||
import org.whispersystems.signalservice.api.NetworkResult
|
||||
import org.whispersystems.signalservice.api.push.exceptions.MalformedResponseException
|
||||
import org.signal.network.NetworkResult
|
||||
import org.signal.network.exceptions.MalformedResponseException
|
||||
import org.signal.network.websocket.WebSocketRequestMessage
|
||||
import org.signal.network.websocket.delete
|
||||
import org.signal.network.websocket.get
|
||||
import org.signal.network.websocket.post
|
||||
import org.signal.network.websocket.put
|
||||
import org.whispersystems.signalservice.api.fromWebSocketRequest
|
||||
import org.whispersystems.signalservice.api.subscriptions.ActiveSubscription
|
||||
import org.whispersystems.signalservice.api.subscriptions.PayPalConfirmPaymentIntentResponse
|
||||
import org.whispersystems.signalservice.api.subscriptions.PayPalCreatePaymentIntentResponse
|
||||
@@ -19,14 +25,9 @@ import org.whispersystems.signalservice.api.subscriptions.PayPalCreatePaymentMet
|
||||
import org.whispersystems.signalservice.api.subscriptions.StripeClientSecret
|
||||
import org.whispersystems.signalservice.api.subscriptions.SubscriberId
|
||||
import org.whispersystems.signalservice.api.websocket.SignalWebSocket
|
||||
import org.whispersystems.signalservice.internal.delete
|
||||
import org.whispersystems.signalservice.internal.get
|
||||
import org.whispersystems.signalservice.internal.post
|
||||
import org.whispersystems.signalservice.internal.push.BankMandate
|
||||
import org.whispersystems.signalservice.internal.push.DonationProcessor
|
||||
import org.whispersystems.signalservice.internal.push.SubscriptionsConfiguration
|
||||
import org.whispersystems.signalservice.internal.put
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage
|
||||
import java.util.Locale
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -22,7 +22,7 @@ import org.signal.storageservice.storage.protos.groups.GroupResponse;
|
||||
import org.signal.storageservice.storage.protos.groups.local.DecryptedGroup;
|
||||
import org.signal.storageservice.storage.protos.groups.local.DecryptedGroupChange;
|
||||
import org.signal.storageservice.storage.protos.groups.local.DecryptedGroupJoinInfo;
|
||||
import org.whispersystems.signalservice.api.NetworkResult;
|
||||
import org.signal.network.NetworkResult;
|
||||
import org.signal.core.models.ServiceId.ACI;
|
||||
import org.signal.core.models.ServiceId.PNI;
|
||||
import org.whispersystems.signalservice.api.websocket.SignalWebSocket;
|
||||
|
||||
+4
-3
@@ -5,10 +5,11 @@
|
||||
|
||||
package org.whispersystems.signalservice.api.groupsv2
|
||||
|
||||
import org.whispersystems.signalservice.api.NetworkResult
|
||||
import org.signal.network.NetworkResult
|
||||
import org.signal.network.websocket.WebSocketRequestMessage
|
||||
import org.signal.network.websocket.get
|
||||
import org.whispersystems.signalservice.api.fromWebSocketRequest
|
||||
import org.whispersystems.signalservice.api.websocket.SignalWebSocket
|
||||
import org.whispersystems.signalservice.internal.get
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage
|
||||
import java.io.IOException
|
||||
import kotlin.time.Duration.Companion.days
|
||||
|
||||
|
||||
+6
-5
@@ -14,24 +14,25 @@ import org.signal.libsignal.protocol.ecc.ECPublicKey
|
||||
import org.signal.libsignal.protocol.kem.KEMPublicKey
|
||||
import org.signal.libsignal.protocol.state.PreKeyBundle
|
||||
import org.signal.libsignal.protocol.state.PreKeyRecord
|
||||
import org.signal.network.NetworkResult
|
||||
import org.signal.network.websocket.WebSocketRequestMessage
|
||||
import org.signal.network.websocket.get
|
||||
import org.signal.network.websocket.post
|
||||
import org.signal.network.websocket.put
|
||||
import org.whispersystems.signalservice.api.InvalidPreKeyException
|
||||
import org.whispersystems.signalservice.api.NetworkResult
|
||||
import org.whispersystems.signalservice.api.account.PreKeyUpload
|
||||
import org.whispersystems.signalservice.api.crypto.SealedSenderAccess
|
||||
import org.whispersystems.signalservice.api.fromWebSocketRequest
|
||||
import org.whispersystems.signalservice.api.push.ServiceIdType
|
||||
import org.whispersystems.signalservice.api.push.SignalServiceAddress
|
||||
import org.whispersystems.signalservice.api.push.SignedPreKeyEntity
|
||||
import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException
|
||||
import org.whispersystems.signalservice.api.websocket.SignalWebSocket
|
||||
import org.whispersystems.signalservice.internal.get
|
||||
import org.whispersystems.signalservice.internal.post
|
||||
import org.whispersystems.signalservice.internal.push.CheckRepeatedUsedPreKeysRequest
|
||||
import org.whispersystems.signalservice.internal.push.KyberPreKeyEntity
|
||||
import org.whispersystems.signalservice.internal.push.PreKeyEntity
|
||||
import org.whispersystems.signalservice.internal.push.PreKeyResponse
|
||||
import org.whispersystems.signalservice.internal.push.PreKeyState
|
||||
import org.whispersystems.signalservice.internal.put
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage
|
||||
import java.security.MessageDigest
|
||||
import java.util.LinkedList
|
||||
|
||||
|
||||
+1
-1
@@ -19,7 +19,7 @@ import org.signal.libsignal.protocol.SessionBuilder
|
||||
import org.signal.libsignal.protocol.SignalProtocolAddress
|
||||
import org.signal.libsignal.protocol.UntrustedIdentityException
|
||||
import org.signal.libsignal.protocol.state.PreKeyBundle
|
||||
import org.whispersystems.signalservice.api.NetworkResult
|
||||
import org.signal.network.NetworkResult
|
||||
import org.whispersystems.signalservice.api.SignalServiceAccountDataStore
|
||||
import org.whispersystems.signalservice.api.SignalSessionLock
|
||||
import org.whispersystems.signalservice.api.crypto.SealedSenderAccess
|
||||
|
||||
+6
-5
@@ -12,15 +12,16 @@ import org.signal.libsignal.net.MultiRecipientSendAuthorization
|
||||
import org.signal.libsignal.net.MultiRecipientSendFailure
|
||||
import org.signal.libsignal.net.RequestResult
|
||||
import org.signal.libsignal.net.UnauthMessagesService
|
||||
import org.whispersystems.signalservice.api.NetworkResult
|
||||
import org.signal.network.NetworkResult
|
||||
import org.signal.network.websocket.WebSocketRequestMessage
|
||||
import org.signal.network.websocket.WebsocketResponse
|
||||
import org.signal.network.websocket.post
|
||||
import org.signal.network.websocket.put
|
||||
import org.whispersystems.signalservice.api.crypto.SealedSenderAccess
|
||||
import org.whispersystems.signalservice.api.fromWebSocketRequest
|
||||
import org.whispersystems.signalservice.api.websocket.SignalWebSocket
|
||||
import org.whispersystems.signalservice.internal.post
|
||||
import org.whispersystems.signalservice.internal.push.OutgoingPushMessageList
|
||||
import org.whispersystems.signalservice.internal.push.SendMessageResponse
|
||||
import org.whispersystems.signalservice.internal.put
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage
|
||||
import org.whispersystems.signalservice.internal.websocket.WebsocketResponse
|
||||
|
||||
/**
|
||||
* Collection of endpoints for operating on messages.
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
package org.whispersystems.signalservice.api.messages
|
||||
|
||||
import org.signal.network.websocket.WebSocketRequestMessage
|
||||
import org.whispersystems.signalservice.internal.push.Envelope
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage
|
||||
|
||||
/**
|
||||
* Represents an envelope off the wire, paired with the metadata needed to process it.
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@ package org.whispersystems.signalservice.api.messages;
|
||||
|
||||
import org.signal.libsignal.zkgroup.InvalidInputException;
|
||||
import org.signal.libsignal.zkgroup.groups.GroupMasterKey;
|
||||
import org.whispersystems.signalservice.api.util.Preconditions;
|
||||
import org.signal.network.util.Preconditions;
|
||||
import org.whispersystems.signalservice.internal.push.GroupContextV2;
|
||||
|
||||
import io.reactivex.rxjava3.annotations.NonNull;
|
||||
|
||||
+7
-6
@@ -13,22 +13,23 @@ import org.signal.libsignal.zkgroup.profiles.ClientZkProfileOperations
|
||||
import org.signal.libsignal.zkgroup.profiles.ExpiringProfileKeyCredential
|
||||
import org.signal.libsignal.zkgroup.profiles.ProfileKey
|
||||
import org.signal.libsignal.zkgroup.profiles.ProfileKeyCredentialRequestContext
|
||||
import org.whispersystems.signalservice.api.NetworkResult
|
||||
import org.signal.network.NetworkResult
|
||||
import org.signal.network.util.JsonUtil
|
||||
import org.signal.network.websocket.WebSocketRequestMessage
|
||||
import org.signal.network.websocket.WebsocketResponse
|
||||
import org.signal.network.websocket.get
|
||||
import org.signal.network.websocket.put
|
||||
import org.whispersystems.signalservice.api.crypto.ProfileCipher
|
||||
import org.whispersystems.signalservice.api.crypto.ProfileCipherOutputStream
|
||||
import org.whispersystems.signalservice.api.crypto.SealedSenderAccess
|
||||
import org.whispersystems.signalservice.api.fromWebSocketRequest
|
||||
import org.whispersystems.signalservice.api.services.ProfileService
|
||||
import org.whispersystems.signalservice.api.websocket.SignalWebSocket
|
||||
import org.whispersystems.signalservice.internal.get
|
||||
import org.whispersystems.signalservice.internal.push.PaymentAddress
|
||||
import org.whispersystems.signalservice.internal.push.ProfileAvatarData
|
||||
import org.whispersystems.signalservice.internal.push.ProfileAvatarUploadAttributes
|
||||
import org.whispersystems.signalservice.internal.push.PushServiceSocket
|
||||
import org.whispersystems.signalservice.internal.push.http.ProfileCipherOutputStreamFactory
|
||||
import org.whispersystems.signalservice.internal.put
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage
|
||||
import org.whispersystems.signalservice.internal.websocket.WebsocketResponse
|
||||
import java.security.SecureRandom
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ import org.signal.core.util.logging.Log
|
||||
import org.signal.libsignal.zkgroup.VerificationFailedException
|
||||
import org.signal.libsignal.zkgroup.profiles.ExpiringProfileKeyCredential
|
||||
import org.signal.libsignal.zkgroup.profiles.ProfileKey
|
||||
import org.whispersystems.signalservice.api.NetworkResult
|
||||
import org.signal.network.NetworkResult
|
||||
import org.whispersystems.signalservice.api.crypto.SealedSenderAccess
|
||||
import org.whispersystems.signalservice.api.push.exceptions.RateLimitException
|
||||
import kotlin.time.Duration
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ import org.signal.libsignal.protocol.logging.Log;
|
||||
import org.signal.libsignal.zkgroup.InvalidInputException;
|
||||
import org.signal.libsignal.zkgroup.profiles.ExpiringProfileKeyCredentialResponse;
|
||||
import org.signal.core.models.ServiceId;
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil;
|
||||
import org.signal.network.util.JsonUtil;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
+14
-11
@@ -25,6 +25,9 @@ import okio.ByteString.Companion.toByteString
|
||||
import org.signal.core.util.Base64
|
||||
import org.signal.core.util.logging.Log
|
||||
import org.signal.libsignal.protocol.IdentityKeyPair
|
||||
import org.signal.network.websocket.WebSocketMessage
|
||||
import org.signal.network.websocket.WebSocketRequestMessage
|
||||
import org.signal.network.websocket.WebSocketResponseMessage
|
||||
import org.signal.registration.proto.RegistrationProvisionEnvelope
|
||||
import org.whispersystems.signalservice.api.buildOkHttpClient
|
||||
import org.whispersystems.signalservice.api.chooseUrl
|
||||
@@ -32,9 +35,6 @@ import org.whispersystems.signalservice.internal.configuration.SignalServiceConf
|
||||
import org.whispersystems.signalservice.internal.crypto.SecondaryProvisioningCipher
|
||||
import org.whispersystems.signalservice.internal.push.ProvisionEnvelope
|
||||
import org.whispersystems.signalservice.internal.push.ProvisioningAddress
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketMessage
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketResponseMessage
|
||||
import java.io.Closeable
|
||||
import java.io.IOException
|
||||
import java.net.SocketTimeoutException
|
||||
@@ -179,17 +179,19 @@ class ProvisioningSocket<T> private constructor(
|
||||
override fun onMessage(webSocket: WebSocket, bytes: ByteString) {
|
||||
val message: WebSocketMessage = WebSocketMessage.ADAPTER.decode(bytes)
|
||||
|
||||
if (message.response != null && message.response.id == lastKeepAliveId) {
|
||||
val response = message.response
|
||||
if (response != null && response.id == lastKeepAliveId) {
|
||||
Log.d(TAG, "[$id] [onMessage] Keep alive received")
|
||||
return
|
||||
}
|
||||
|
||||
if (message.request == null) {
|
||||
val request = message.request
|
||||
if (request == null) {
|
||||
Log.w(TAG, "[$id] [onMessage] Received null request")
|
||||
return
|
||||
}
|
||||
|
||||
val success = webSocket.send(message.request.toResponse().encode().toByteString())
|
||||
val success = webSocket.send(request.toResponse().encode().toByteString())
|
||||
|
||||
if (!success) {
|
||||
Log.w(TAG, "[$id] [onMessage] Failed to send response")
|
||||
@@ -199,10 +201,11 @@ class ProvisioningSocket<T> private constructor(
|
||||
|
||||
Log.d(TAG, "[$id] [onMessage] Processing request")
|
||||
|
||||
if (message.request.verb == "PUT" && message.request.body != null) {
|
||||
when (message.request.path) {
|
||||
val body = request.body
|
||||
if (request.verb == "PUT" && body != null) {
|
||||
when (request.path) {
|
||||
"/v1/address" -> {
|
||||
val address = ProvisioningAddress.ADAPTER.decode(message.request.body).address
|
||||
val address = ProvisioningAddress.ADAPTER.decode(body).address
|
||||
if (address != null) {
|
||||
provisioningUrlDeferral.complete(generateProvisioningUrl(address))
|
||||
} else {
|
||||
@@ -212,8 +215,8 @@ class ProvisioningSocket<T> private constructor(
|
||||
|
||||
"/v1/message" -> {
|
||||
when (mode) {
|
||||
Mode.REREG -> provisioningMessageDeferral.complete(cipher.decrypt(RegistrationProvisionEnvelope.ADAPTER.decode(message.request.body)) as SecondaryProvisioningCipher.ProvisioningDecryptResult<T>)
|
||||
Mode.LINK -> provisioningMessageDeferral.complete(cipher.decrypt(ProvisionEnvelope.ADAPTER.decode(message.request.body)) as SecondaryProvisioningCipher.ProvisioningDecryptResult<T>)
|
||||
Mode.REREG -> provisioningMessageDeferral.complete(cipher.decrypt(RegistrationProvisionEnvelope.ADAPTER.decode(body)) as SecondaryProvisioningCipher.ProvisioningDecryptResult<T>)
|
||||
Mode.LINK -> provisioningMessageDeferral.complete(cipher.decrypt(ProvisionEnvelope.ADAPTER.decode(body)) as SecondaryProvisioningCipher.ProvisioningDecryptResult<T>)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@ package org.whispersystems.signalservice.api.push;
|
||||
|
||||
import org.signal.core.models.ServiceId;
|
||||
import org.whispersystems.signalservice.api.util.OptionalUtil;
|
||||
import org.whispersystems.signalservice.api.util.Preconditions;
|
||||
import org.signal.network.util.Preconditions;
|
||||
import org.signal.core.util.UuidUtil;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
|
||||
class AlreadyVerifiedException : NonSuccessfulResponseCodeException(409)
|
||||
|
||||
+2
@@ -6,6 +6,8 @@
|
||||
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
public class AuthorizationFailedException extends NonSuccessfulResponseCodeException {
|
||||
public AuthorizationFailedException(int code, String s) {
|
||||
super(code, s);
|
||||
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
|
||||
/**
|
||||
* Indicates that something about our request was wrong. Could be:
|
||||
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
|
||||
/**
|
||||
* Indicates that you provided a bad token to CDSI.
|
||||
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
/**
|
||||
* A 4008 responses from CDSI indicating we've exhausted our quota.
|
||||
*/
|
||||
|
||||
+1
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.whispersystems.signalservice.api.push.exceptions
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.whispersystems.signalservice.internal.push.RegistrationSessionMetadataResponse
|
||||
|
||||
/**
|
||||
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
/**
|
||||
* Represents a 409 http conflict error.
|
||||
*/
|
||||
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
public class DeprecatedVersionException extends NonSuccessfulResponseCodeException {
|
||||
public DeprecatedVersionException() {
|
||||
super(499);
|
||||
|
||||
+2
@@ -5,6 +5,8 @@
|
||||
*/
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
public class ExpectationFailedException extends NonSuccessfulResponseCodeException {
|
||||
public ExpectationFailedException() {
|
||||
super(417);
|
||||
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
|
||||
/**
|
||||
* known possible values for @property[reason]:
|
||||
* providerRejected - indicates that the provider understood the request, but declined to deliver a verification SMS/call (potentially due to fraud prevention rules)
|
||||
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
|
||||
class HttpConflictException : NonSuccessfulResponseCodeException(409)
|
||||
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
/**
|
||||
* An exception indicating that the server believes the number provided is 'impossible', meaning it fails the most basic libphonenumber checks.
|
||||
*/
|
||||
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
|
||||
class IncorrectCodeException : NonSuccessfulResponseCodeException(403)
|
||||
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
|
||||
class IncorrectRegistrationRecoveryPasswordException : NonSuccessfulResponseCodeException(403)
|
||||
|
||||
+2
@@ -5,4 +5,6 @@
|
||||
|
||||
package org.whispersystems.signalservice.api.push.exceptions
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
|
||||
class InvalidRegistrationSessionIdException : NonSuccessfulResponseCodeException(400)
|
||||
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
|
||||
class InvalidTransportModeException : NonSuccessfulResponseCodeException(400)
|
||||
|
||||
-8
@@ -1,8 +0,0 @@
|
||||
/*
|
||||
* Copyright 2023 Signal Messenger, LLC
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
package org.whispersystems.signalservice.api.push.exceptions
|
||||
|
||||
class MalformedRequestException : NonSuccessfulResponseCodeException(400)
|
||||
-17
@@ -1,17 +0,0 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Indicates that a response is malformed or otherwise in an unexpected format.
|
||||
*/
|
||||
public class MalformedResponseException extends IOException {
|
||||
|
||||
public MalformedResponseException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public MalformedResponseException(String message, IOException e) {
|
||||
super(message, e);
|
||||
}
|
||||
}
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
|
||||
class MustRequestNewCodeException : NonSuccessfulResponseCodeException(409)
|
||||
|
||||
+2
@@ -6,6 +6,8 @@
|
||||
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
public class NoContentException extends NonSuccessfulResponseCodeException {
|
||||
public NoContentException(String s) {
|
||||
super(204, s);
|
||||
|
||||
+2
@@ -1,3 +1,5 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
|
||||
class NoSuchSessionException : NonSuccessfulResponseCodeException(404)
|
||||
|
||||
+5
-1
@@ -1,8 +1,12 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.MalformedResponseException;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil;
|
||||
import org.signal.network.util.JsonUtil;
|
||||
|
||||
import io.reactivex.rxjava3.annotations.NonNull;
|
||||
|
||||
|
||||
-57
@@ -1,57 +0,0 @@
|
||||
/**
|
||||
* Copyright (C) 2014-2016 Open Whisper Systems
|
||||
*
|
||||
* Licensed according to the LICENSE file in this repository.
|
||||
*/
|
||||
package org.whispersystems.signalservice.api.push.exceptions
|
||||
|
||||
import java.io.IOException
|
||||
|
||||
/**
|
||||
* Indicates a server response that is not successful, typically something outside the 2xx range.
|
||||
*/
|
||||
open class NonSuccessfulResponseCodeException : IOException {
|
||||
@JvmField
|
||||
val code: Int
|
||||
val stringBody: String?
|
||||
val binaryBody: ByteArray?
|
||||
val headers: Map<String, String>
|
||||
|
||||
constructor(code: Int) : super("StatusCode: $code") {
|
||||
this.code = code
|
||||
this.stringBody = null
|
||||
this.binaryBody = null
|
||||
this.headers = emptyMap()
|
||||
}
|
||||
|
||||
constructor(code: Int, message: String) : super("[$code] $message") {
|
||||
this.code = code
|
||||
this.stringBody = null
|
||||
this.binaryBody = null
|
||||
this.headers = emptyMap()
|
||||
}
|
||||
|
||||
@JvmOverloads
|
||||
constructor(code: Int, message: String, body: String?, headers: Map<String, String> = emptyMap()) : super("[$code] $message") {
|
||||
this.code = code
|
||||
this.stringBody = body
|
||||
this.binaryBody = null
|
||||
this.headers = headers.mapKeys { it.key.lowercase() }
|
||||
}
|
||||
|
||||
@JvmOverloads
|
||||
constructor(code: Int, message: String, body: ByteArray?, headers: Map<String, String> = emptyMap()) : super("[$code] $message") {
|
||||
this.code = code
|
||||
this.stringBody = null
|
||||
this.binaryBody = body
|
||||
this.headers = headers.mapKeys { it.key.lowercase() }
|
||||
}
|
||||
|
||||
fun is4xx(): Boolean {
|
||||
return code >= 400 && code < 500
|
||||
}
|
||||
|
||||
fun is5xx(): Boolean {
|
||||
return code >= 500 && code < 600
|
||||
}
|
||||
}
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
public class NonSuccessfulResumableUploadResponseCodeException extends NonSuccessfulResponseCodeException {
|
||||
public NonSuccessfulResumableUploadResponseCodeException(int code, String s) {
|
||||
super(code, s);
|
||||
|
||||
+2
@@ -6,6 +6,8 @@
|
||||
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
public class NotFoundException extends NonSuccessfulResponseCodeException {
|
||||
public NotFoundException(String s) {
|
||||
super(404, s);
|
||||
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
import org.signal.libsignal.protocol.logging.Log;
|
||||
import org.whispersystems.signalservice.internal.push.ProofRequiredResponse;
|
||||
|
||||
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
/**
|
||||
* Copyright (C) 2014-2016 Open Whisper Systems
|
||||
*
|
||||
* Licensed according to the LICENSE file in this repository.
|
||||
*/
|
||||
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class PushNetworkException extends IOException {
|
||||
|
||||
public PushNetworkException(Exception exception) {
|
||||
super(exception);
|
||||
}
|
||||
|
||||
public PushNetworkException(String s) {
|
||||
super(s);
|
||||
}
|
||||
|
||||
}
|
||||
+2
@@ -6,6 +6,8 @@
|
||||
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
public final class RangeException extends NonSuccessfulResponseCodeException {
|
||||
|
||||
public RangeException(long requested) {
|
||||
|
||||
+2
@@ -6,6 +6,8 @@
|
||||
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
|
||||
+2
@@ -6,6 +6,8 @@
|
||||
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
public class RemoteAttestationResponseExpiredException extends NonSuccessfulResponseCodeException {
|
||||
public RemoteAttestationResponseExpiredException(String message) {
|
||||
super(409, message);
|
||||
|
||||
+1
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.whispersystems.signalservice.api.push.exceptions
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.whispersystems.signalservice.internal.push.RegistrationSessionMetadataResponse
|
||||
|
||||
/**
|
||||
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
/**
|
||||
* Indicates the server has rejected the request and we should stop retrying.
|
||||
*/
|
||||
|
||||
+1
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.whispersystems.signalservice.api.push.exceptions
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.whispersystems.signalservice.internal.push.RegistrationSessionMetadataResponse
|
||||
|
||||
/**
|
||||
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
|
||||
/**
|
||||
* Exception representing that the submitted information was not accepted (e.g. the push challenge token or captcha did not match)
|
||||
*/
|
||||
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
public class UsernameIsNotReservedException extends NonSuccessfulResponseCodeException {
|
||||
public UsernameIsNotReservedException() {
|
||||
super(409, "The given username is not associated with an account.");
|
||||
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
public class UsernameMalformedException extends NonSuccessfulResponseCodeException {
|
||||
public UsernameMalformedException() {
|
||||
super(400);
|
||||
|
||||
+2
@@ -1,5 +1,7 @@
|
||||
package org.whispersystems.signalservice.api.push.exceptions;
|
||||
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
public class UsernameTakenException extends NonSuccessfulResponseCodeException {
|
||||
public UsernameTakenException() {
|
||||
super(409);
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
|
||||
package org.whispersystems.signalservice.api.registration
|
||||
|
||||
import org.whispersystems.signalservice.api.NetworkResult
|
||||
import org.signal.network.NetworkResult
|
||||
import org.whispersystems.signalservice.api.account.AccountAttributes
|
||||
import org.whispersystems.signalservice.api.account.PreKeyCollection
|
||||
import org.whispersystems.signalservice.api.messages.multidevice.RegisterAsSecondaryDeviceResponse
|
||||
|
||||
+2
-2
@@ -4,10 +4,10 @@ import org.signal.libsignal.protocol.logging.Log;
|
||||
import org.signal.libsignal.zkgroup.receipts.ReceiptCredentialPresentation;
|
||||
import org.signal.libsignal.zkgroup.receipts.ReceiptCredentialRequest;
|
||||
import org.signal.libsignal.zkgroup.receipts.ReceiptCredentialResponse;
|
||||
import org.whispersystems.signalservice.api.NetworkResult;
|
||||
import org.signal.network.NetworkResult;
|
||||
import org.whispersystems.signalservice.api.NetworkResultUtil;
|
||||
import org.whispersystems.signalservice.api.donations.DonationsApi;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.whispersystems.signalservice.api.subscriptions.ActiveSubscription;
|
||||
import org.whispersystems.signalservice.api.subscriptions.PayPalConfirmPaymentIntentResponse;
|
||||
import org.whispersystems.signalservice.api.subscriptions.PayPalCreatePaymentIntentResponse;
|
||||
|
||||
+3
-3
@@ -16,7 +16,7 @@ import org.whispersystems.signalservice.api.profiles.SignalServiceProfile;
|
||||
import org.signal.core.models.ServiceId;
|
||||
import org.signal.core.models.ServiceId.ACI;
|
||||
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.MalformedResponseException;
|
||||
import org.signal.network.exceptions.MalformedResponseException;
|
||||
import org.whispersystems.signalservice.api.websocket.SignalWebSocket;
|
||||
import org.whispersystems.signalservice.internal.ServiceResponse;
|
||||
import org.whispersystems.signalservice.internal.ServiceResponseProcessor;
|
||||
@@ -24,10 +24,10 @@ import org.whispersystems.signalservice.internal.push.IdentityCheckRequest;
|
||||
import org.whispersystems.signalservice.internal.push.IdentityCheckRequest.ServiceIdFingerprintPair;
|
||||
import org.whispersystems.signalservice.internal.push.IdentityCheckResponse;
|
||||
import org.whispersystems.signalservice.internal.push.http.AcceptLanguagesUtil;
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil;
|
||||
import org.signal.network.util.JsonUtil;
|
||||
import org.whispersystems.signalservice.internal.websocket.DefaultResponseMapper;
|
||||
import org.whispersystems.signalservice.internal.websocket.ResponseMapper;
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage;
|
||||
import org.signal.network.websocket.WebSocketRequestMessage;
|
||||
|
||||
import java.security.SecureRandom;
|
||||
import java.util.Collections;
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
package org.whispersystems.signalservice.api.storage;
|
||||
|
||||
|
||||
import org.whispersystems.signalservice.api.util.Preconditions;
|
||||
import org.signal.network.util.Preconditions;
|
||||
import org.whispersystems.signalservice.internal.storage.protos.ManifestRecord;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
+4
-3
@@ -6,15 +6,16 @@
|
||||
package org.whispersystems.signalservice.api.storage
|
||||
|
||||
import okhttp3.Credentials
|
||||
import org.whispersystems.signalservice.api.NetworkResult
|
||||
import org.signal.network.NetworkResult
|
||||
import org.signal.network.websocket.WebSocketRequestMessage
|
||||
import org.signal.network.websocket.get
|
||||
import org.whispersystems.signalservice.api.fromWebSocketRequest
|
||||
import org.whispersystems.signalservice.api.websocket.SignalWebSocket
|
||||
import org.whispersystems.signalservice.internal.get
|
||||
import org.whispersystems.signalservice.internal.push.PushServiceSocket
|
||||
import org.whispersystems.signalservice.internal.storage.protos.ReadOperation
|
||||
import org.whispersystems.signalservice.internal.storage.protos.StorageItems
|
||||
import org.whispersystems.signalservice.internal.storage.protos.StorageManifest
|
||||
import org.whispersystems.signalservice.internal.storage.protos.WriteOperation
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage
|
||||
|
||||
/**
|
||||
* Class to interact with storage service endpoints.
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@ package org.whispersystems.signalservice.api.subscriptions;
|
||||
|
||||
|
||||
import org.signal.core.util.Base64;
|
||||
import org.whispersystems.signalservice.api.util.Preconditions;
|
||||
import org.signal.network.util.Preconditions;
|
||||
|
||||
import java.security.SecureRandom;
|
||||
import java.util.Arrays;
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@ package org.whispersystems.signalservice.api.subscriptions;
|
||||
|
||||
|
||||
import org.signal.core.util.Base64;
|
||||
import org.whispersystems.signalservice.api.util.Preconditions;
|
||||
import org.signal.network.util.Preconditions;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.security.SecureRandom;
|
||||
|
||||
+6
-5
@@ -8,15 +8,19 @@ import org.signal.core.models.MasterKey
|
||||
import org.signal.core.util.Hex
|
||||
import org.signal.libsignal.protocol.logging.Log
|
||||
import org.signal.libsignal.svr2.PinHash
|
||||
import org.signal.network.NetworkResult
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.signal.network.util.JsonUtil
|
||||
import org.signal.network.websocket.WebSocketRequestMessage
|
||||
import org.signal.network.websocket.get
|
||||
import org.signal.svr2.proto.BackupRequest
|
||||
import org.signal.svr2.proto.DeleteRequest
|
||||
import org.signal.svr2.proto.ExposeRequest
|
||||
import org.signal.svr2.proto.Request
|
||||
import org.signal.svr2.proto.RestoreRequest
|
||||
import org.whispersystems.signalservice.api.NetworkResult
|
||||
import org.whispersystems.signalservice.api.crypto.InvalidCiphertextException
|
||||
import org.whispersystems.signalservice.api.fromWebSocketRequest
|
||||
import org.whispersystems.signalservice.api.kbs.PinHashUtil
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.whispersystems.signalservice.api.svr.SecureValueRecovery.BackupResponse
|
||||
import org.whispersystems.signalservice.api.svr.SecureValueRecovery.DeleteResponse
|
||||
import org.whispersystems.signalservice.api.svr.SecureValueRecovery.InvalidRequestException
|
||||
@@ -25,10 +29,7 @@ import org.whispersystems.signalservice.api.svr.SecureValueRecovery.RestoreRespo
|
||||
import org.whispersystems.signalservice.api.svr.SecureValueRecovery.SvrVersion
|
||||
import org.whispersystems.signalservice.api.websocket.SignalWebSocket
|
||||
import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration
|
||||
import org.whispersystems.signalservice.internal.get
|
||||
import org.whispersystems.signalservice.internal.push.AuthCredentials
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage
|
||||
import java.io.IOException
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
import org.signal.svr2.proto.BackupResponse as ProtoBackupResponse
|
||||
|
||||
+6
-5
@@ -11,20 +11,21 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize
|
||||
import org.signal.core.models.MasterKey
|
||||
import org.signal.core.util.logging.Log
|
||||
import org.signal.libsignal.net.Network
|
||||
import org.whispersystems.signalservice.api.NetworkResult
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.signal.network.NetworkResult
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.signal.network.util.JsonUtil
|
||||
import org.signal.network.websocket.WebSocketRequestMessage
|
||||
import org.signal.network.websocket.get
|
||||
import org.whispersystems.signalservice.api.fromWebSocketRequest
|
||||
import org.whispersystems.signalservice.api.svr.SecureValueRecovery.BackupResponse
|
||||
import org.whispersystems.signalservice.api.svr.SecureValueRecovery.DeleteResponse
|
||||
import org.whispersystems.signalservice.api.svr.SecureValueRecovery.PinChangeSession
|
||||
import org.whispersystems.signalservice.api.svr.SecureValueRecovery.RestoreResponse
|
||||
import org.whispersystems.signalservice.api.svr.SecureValueRecovery.SvrVersion
|
||||
import org.whispersystems.signalservice.api.websocket.SignalWebSocket
|
||||
import org.whispersystems.signalservice.internal.get
|
||||
import org.whispersystems.signalservice.internal.push.AuthCredentials
|
||||
import org.whispersystems.signalservice.internal.push.ByteArrayDeserializerBase64
|
||||
import org.whispersystems.signalservice.internal.push.ByteArraySerializerBase64NoPadding
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage
|
||||
import java.io.IOException
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -11,9 +11,9 @@ import org.signal.libsignal.attest.AttestationDataException
|
||||
import org.signal.libsignal.protocol.logging.Log
|
||||
import org.signal.libsignal.sgxsession.SgxCommunicationFailureException
|
||||
import org.signal.libsignal.svr2.Svr2Client
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.whispersystems.signalservice.api.buildOkHttpClient
|
||||
import org.whispersystems.signalservice.api.chooseUrl
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration
|
||||
import org.whispersystems.signalservice.internal.configuration.SignalSvr2Url
|
||||
import org.whispersystems.signalservice.internal.push.AuthCredentials
|
||||
|
||||
-41
@@ -1,41 +0,0 @@
|
||||
package org.whispersystems.signalservice.api.util;
|
||||
|
||||
/**
|
||||
* Convenient ways to assert expected state.
|
||||
*/
|
||||
public final class Preconditions {
|
||||
|
||||
private Preconditions() {}
|
||||
|
||||
public static void checkArgument(boolean state) {
|
||||
checkArgument(state, "Condition must be true!");
|
||||
}
|
||||
|
||||
public static void checkArgument(boolean state, String message) {
|
||||
if (!state) {
|
||||
throw new IllegalArgumentException(message);
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkState(boolean state) {
|
||||
checkState(state, "Condition must be true!");
|
||||
}
|
||||
|
||||
public static void checkState(boolean state, String message) {
|
||||
if (!state) {
|
||||
throw new IllegalStateException(message);
|
||||
}
|
||||
}
|
||||
|
||||
public static <E> E checkNotNull(E object) {
|
||||
return checkNotNull(object, "Must not be null!");
|
||||
}
|
||||
|
||||
public static <E> E checkNotNull(E object, String message) {
|
||||
if (object == null) {
|
||||
throw new NullPointerException(message);
|
||||
} else {
|
||||
return object;
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -26,15 +26,15 @@ import org.signal.libsignal.net.BadRequestError
|
||||
import org.signal.libsignal.net.ChatConnection
|
||||
import org.signal.libsignal.net.RequestResult
|
||||
import org.signal.libsignal.net.UnauthenticatedChatConnection
|
||||
import org.signal.network.websocket.WebSocketRequestMessage
|
||||
import org.signal.network.websocket.WebSocketResponseMessage
|
||||
import org.signal.network.websocket.WebsocketResponse
|
||||
import org.whispersystems.signalservice.api.crypto.SealedSenderAccess
|
||||
import org.whispersystems.signalservice.api.messages.EnvelopeResponse
|
||||
import org.whispersystems.signalservice.api.util.SleepTimer
|
||||
import org.whispersystems.signalservice.internal.push.Envelope
|
||||
import org.whispersystems.signalservice.internal.util.awaitRequest
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketConnection
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketResponseMessage
|
||||
import org.whispersystems.signalservice.internal.websocket.WebsocketResponse
|
||||
import java.io.IOException
|
||||
import java.util.concurrent.CancellationException
|
||||
import java.util.concurrent.CompletionException
|
||||
|
||||
+4
-4
@@ -2,10 +2,10 @@ package org.whispersystems.signalservice.internal;
|
||||
|
||||
|
||||
|
||||
import org.whispersystems.signalservice.api.NetworkResult;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException;
|
||||
import org.whispersystems.signalservice.api.util.Preconditions;
|
||||
import org.signal.network.NetworkResult;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.PushNetworkException;
|
||||
import org.signal.network.util.Preconditions;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Optional;
|
||||
|
||||
+2
-2
@@ -2,9 +2,9 @@ package org.whispersystems.signalservice.internal;
|
||||
|
||||
|
||||
import org.signal.libsignal.net.ChatServiceException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.whispersystems.signalservice.api.util.OptionalUtil;
|
||||
import org.whispersystems.signalservice.api.util.Preconditions;
|
||||
import org.signal.network.util.Preconditions;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
-81
@@ -1,81 +0,0 @@
|
||||
/*
|
||||
* Copyright 2025 Signal Messenger, LLC
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
package org.whispersystems.signalservice.internal
|
||||
|
||||
import okio.ByteString.Companion.toByteString
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil
|
||||
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage
|
||||
import java.security.SecureRandom
|
||||
|
||||
/**
|
||||
* Create a basic GET web socket request
|
||||
*/
|
||||
fun WebSocketRequestMessage.Companion.get(path: String, headers: Map<String, String> = emptyMap()): WebSocketRequestMessage {
|
||||
return WebSocketRequestMessage(
|
||||
verb = "GET",
|
||||
path = path,
|
||||
headers = headers.toHeaderList(),
|
||||
id = SecureRandom().nextLong()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a basic POST web socket request
|
||||
*/
|
||||
fun WebSocketRequestMessage.Companion.post(path: String, body: Any?, headers: Map<String, String> = emptyMap()): WebSocketRequestMessage {
|
||||
return WebSocketRequestMessage(
|
||||
verb = "POST",
|
||||
path = path,
|
||||
body = body?.let { JsonUtil.toJsonByteString(body) },
|
||||
headers = (if (body != null) listOf("content-type:application/json") else emptyList()) + headers.toHeaderList(),
|
||||
id = SecureRandom().nextLong()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a basic DELETE web socket request
|
||||
*/
|
||||
fun WebSocketRequestMessage.Companion.delete(path: String, headers: Map<String, String> = emptyMap()): WebSocketRequestMessage {
|
||||
return WebSocketRequestMessage(
|
||||
verb = "DELETE",
|
||||
path = path,
|
||||
headers = headers.toHeaderList(),
|
||||
id = SecureRandom().nextLong()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a basic PUT web socket request, where body is JSON-ified.
|
||||
*/
|
||||
fun WebSocketRequestMessage.Companion.put(path: String, body: Any, headers: Map<String, String> = emptyMap()): WebSocketRequestMessage {
|
||||
return WebSocketRequestMessage(
|
||||
verb = "PUT",
|
||||
path = path,
|
||||
headers = listOf("content-type:application/json") + headers.toHeaderList(),
|
||||
body = when (body) {
|
||||
is String -> body.toByteArray().toByteString()
|
||||
else -> JsonUtil.toJsonByteString(body)
|
||||
},
|
||||
id = SecureRandom().nextLong()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a custom PUT web socket request, where body and content type header are provided by caller.
|
||||
*/
|
||||
fun WebSocketRequestMessage.Companion.putCustom(path: String, body: ByteArray, headers: Map<String, String>): WebSocketRequestMessage {
|
||||
return WebSocketRequestMessage(
|
||||
verb = "PUT",
|
||||
path = path,
|
||||
headers = headers.toHeaderList(),
|
||||
body = body.toByteString(),
|
||||
id = SecureRandom().nextLong()
|
||||
)
|
||||
}
|
||||
|
||||
private fun Map<String, String>.toHeaderList(): List<String> {
|
||||
return map { (key, value) -> "$key:$value" }
|
||||
}
|
||||
+1
-1
@@ -2,7 +2,7 @@ package org.whispersystems.signalservice.internal.push
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty
|
||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil
|
||||
import org.signal.network.util.JsonUtil
|
||||
import java.util.UUID
|
||||
|
||||
/** Response body for confirming a username reservation. */
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
package org.whispersystems.signalservice.internal.push;
|
||||
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
public class DeviceLimitExceededException extends NonSuccessfulResponseCodeException {
|
||||
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
|
||||
import org.signal.libsignal.protocol.IdentityKey;
|
||||
import org.signal.core.models.ServiceId;
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil;
|
||||
import org.signal.network.util.JsonUtil;
|
||||
import org.signal.core.util.Base64;
|
||||
|
||||
import java.security.MessageDigest;
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||
|
||||
import org.signal.libsignal.protocol.IdentityKey;
|
||||
import org.signal.core.models.ServiceId;
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil;
|
||||
import org.signal.network.util.JsonUtil;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
package org.whispersystems.signalservice.internal.push;
|
||||
|
||||
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.whispersystems.signalservice.api.svr.Svr3Credentials;
|
||||
|
||||
public final class LockedException extends NonSuccessfulResponseCodeException {
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
|
||||
import org.signal.libsignal.protocol.IdentityKey;
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil;
|
||||
import org.signal.network.util.JsonUtil;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
|
||||
import org.signal.libsignal.protocol.IdentityKey;
|
||||
import org.whispersystems.signalservice.api.push.SignedPreKeyEntity;
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil;
|
||||
import org.signal.network.util.JsonUtil;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
+6
-6
@@ -23,7 +23,7 @@ import org.signal.storageservice.storage.protos.groups.GroupChanges;
|
||||
import org.signal.storageservice.storage.protos.groups.GroupJoinInfo;
|
||||
import org.signal.storageservice.storage.protos.groups.GroupResponse;
|
||||
import org.signal.storageservice.storage.protos.groups.Member;
|
||||
import org.whispersystems.signalservice.api.NetworkResult;
|
||||
import org.signal.network.NetworkResult;
|
||||
import org.whispersystems.signalservice.api.account.AccountAttributes;
|
||||
import org.whispersystems.signalservice.api.account.PreKeyCollection;
|
||||
import org.whispersystems.signalservice.api.crypto.SealedSenderAccess;
|
||||
@@ -47,17 +47,17 @@ import org.whispersystems.signalservice.api.push.exceptions.HttpConflictExceptio
|
||||
import org.whispersystems.signalservice.api.push.exceptions.IncorrectRegistrationRecoveryPasswordException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.InvalidRegistrationSessionIdException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.InvalidTransportModeException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.MalformedRequestException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.MalformedResponseException;
|
||||
import org.signal.network.exceptions.MalformedRequestException;
|
||||
import org.signal.network.exceptions.MalformedResponseException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.MissingConfigurationException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.MustRequestNewCodeException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NoContentException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NoSuchSessionException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResumableUploadResponseCodeException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NotFoundException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.ProofRequiredException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException;
|
||||
import org.signal.network.exceptions.PushNetworkException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.RangeException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.RateLimitException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.RequestVerificationCodeRateLimitException;
|
||||
@@ -94,7 +94,7 @@ import org.whispersystems.signalservice.internal.storage.protos.StorageItems;
|
||||
import org.whispersystems.signalservice.internal.storage.protos.StorageManifest;
|
||||
import org.whispersystems.signalservice.internal.storage.protos.WriteOperation;
|
||||
import org.whispersystems.signalservice.internal.util.BlacklistingTrustManager;
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil;
|
||||
import org.signal.network.util.JsonUtil;
|
||||
import org.whispersystems.signalservice.internal.util.Util;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@ package org.whispersystems.signalservice.internal.push
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty
|
||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
|
||||
import org.whispersystems.signalservice.internal.util.JsonUtil.UuidDeserializer
|
||||
import org.signal.network.util.JsonUtil.UuidDeserializer
|
||||
import java.util.UUID
|
||||
|
||||
/** Response body for setting a username link on the service. */
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
|
||||
package org.whispersystems.signalservice.internal.push.exceptions
|
||||
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
|
||||
/**
|
||||
* Indicates that the captcha we submitted was not accepted by the server.
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
package org.whispersystems.signalservice.internal.push.exceptions;
|
||||
|
||||
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
package org.whispersystems.signalservice.internal.push.exceptions;
|
||||
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
public final class GroupExistsException extends NonSuccessfulResponseCodeException {
|
||||
public GroupExistsException() {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
package org.whispersystems.signalservice.internal.push.exceptions;
|
||||
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.whispersystems.signalservice.internal.push.GroupMismatchedDevices;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
package org.whispersystems.signalservice.internal.push.exceptions;
|
||||
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
public final class GroupNotFoundException extends NonSuccessfulResponseCodeException {
|
||||
public GroupNotFoundException() {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
package org.whispersystems.signalservice.internal.push.exceptions;
|
||||
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
package org.whispersystems.signalservice.internal.push.exceptions;
|
||||
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.whispersystems.signalservice.internal.push.GroupStaleDevices;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
package org.whispersystems.signalservice.internal.push.exceptions;
|
||||
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
public final class GroupTerminatedException extends NonSuccessfulResponseCodeException {
|
||||
public GroupTerminatedException() {
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
package org.whispersystems.signalservice.internal.push.exceptions
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonCreator
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.whispersystems.signalservice.api.subscriptions.ActiveSubscription.ChargeFailure
|
||||
import org.whispersystems.signalservice.api.subscriptions.ActiveSubscription.Processor
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
package org.whispersystems.signalservice.internal.push.exceptions
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonCreator
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.whispersystems.signalservice.api.subscriptions.ActiveSubscription.ChargeFailure
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
package org.whispersystems.signalservice.internal.push.exceptions;
|
||||
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
/**
|
||||
* Indicates that the unidentified authorization header provided to the multi_recipient endpoint
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
|
||||
package org.whispersystems.signalservice.internal.push.exceptions;
|
||||
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.whispersystems.signalservice.internal.push.MismatchedDevices;
|
||||
|
||||
public class MismatchedDevicesException extends NonSuccessfulResponseCodeException {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
package org.whispersystems.signalservice.internal.push.exceptions;
|
||||
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
public final class NotInGroupException extends NonSuccessfulResponseCodeException {
|
||||
public NotInGroupException() {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
package org.whispersystems.signalservice.internal.push.exceptions;
|
||||
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
|
||||
package org.whispersystems.signalservice.internal.push.exceptions;
|
||||
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.signal.network.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.whispersystems.signalservice.internal.push.StaleDevices;
|
||||
|
||||
public class StaleDevicesException extends NonSuccessfulResponseCodeException {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user