Skip to content

Commit 9d29735

Browse files
committed
Better separation of concerns. No one calls SessionDirectly except the clients.
1 parent a697d2e commit 9d29735

File tree

25 files changed

+220
-233
lines changed

25 files changed

+220
-233
lines changed

app/src/main/java/org/session/libsession/messaging/MessagingModuleConfiguration.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import org.session.libsession.messaging.groups.GroupManagerV2
99
import org.session.libsession.messaging.groups.LegacyGroupDeprecationManager
1010
import org.session.libsession.messaging.jobs.MessageSendJob
1111
import org.session.libsession.messaging.notifications.TokenFetcher
12-
import org.session.libsession.network.SessionNetwork
12+
import org.session.libsession.network.ServerClient
1313
import org.session.libsession.network.SnodeClock
1414
import org.session.libsession.network.onion.PathManager
1515
import org.session.libsession.utilities.ConfigFactoryProtocol
@@ -38,7 +38,7 @@ class MessagingModuleConfiguration @Inject constructor(
3838
val messageSendJobFactory: MessageSendJob.Factory,
3939
val json: Json,
4040
val snodeClock: SnodeClock,
41-
val sessionNetwork: SessionNetwork,
41+
val serverClient: ServerClient,
4242
val pathManager: PathManager
4343
) {
4444

app/src/main/java/org/session/libsession/messaging/file_server/FileServerApi.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import okhttp3.MediaType.Companion.toMediaType
1010
import okhttp3.RequestBody
1111
import okhttp3.RequestBody.Companion.toRequestBody
1212
import org.session.libsession.database.StorageProtocol
13-
import org.session.libsession.network.SessionNetwork
13+
import org.session.libsession.network.ServerClient
1414
import org.session.libsignal.utilities.ByteArraySlice
1515
import org.session.libsignal.utilities.HTTP
1616
import org.session.libsignal.utilities.Hex
@@ -28,7 +28,7 @@ import kotlin.time.Duration.Companion.milliseconds
2828
@Singleton
2929
class FileServerApi @Inject constructor(
3030
private val storage: StorageProtocol,
31-
private val sessionNetwork: SessionNetwork
31+
private val serverClient: ServerClient
3232
) {
3333

3434
companion object {
@@ -94,7 +94,7 @@ class FileServerApi @Inject constructor(
9494
}
9595
return if (request.useOnionRouting) {
9696
try {
97-
val response = sessionNetwork.sendToServer(
97+
val response = serverClient.send(
9898
request = requestBuilder.build(),
9999
serverBaseUrl = request.fileServer.url.host,
100100
x25519PublicKey =

app/src/main/java/org/session/libsession/messaging/jobs/NotifyPNServerJob.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import org.session.libsession.messaging.MessagingModuleConfiguration
1010
import org.session.libsession.messaging.jobs.Job.Companion.MAX_BUFFER_SIZE_BYTES
1111
import org.session.libsession.messaging.sending_receiving.notifications.Server
1212
import org.session.libsession.messaging.utilities.Data
13-
import org.session.libsession.network.SessionNetwork
13+
import org.session.libsession.network.ServerClient
1414
import org.session.libsession.network.onion.Version
1515
import org.session.libsession.snode.SnodeMessage
1616
import org.session.libsignal.utilities.JsonUtil
@@ -25,8 +25,8 @@ class NotifyPNServerJob(val message: SnodeMessage) : Job {
2525

2626
override val maxFailureCount: Int = 20
2727

28-
private val sessionNetwork: SessionNetwork by lazy {
29-
MessagingModuleConfiguration.shared.sessionNetwork
28+
private val serverClient: ServerClient by lazy {
29+
MessagingModuleConfiguration.shared.serverClient
3030
}
3131

3232
companion object {
@@ -46,7 +46,7 @@ class NotifyPNServerJob(val message: SnodeMessage) : Job {
4646
try {
4747
// High-level application retry (4 attempts)
4848
retryWithUniformInterval(maxRetryCount = 4) {
49-
sessionNetwork.sendToServer(
49+
serverClient.send(
5050
request = request,
5151
serverBaseUrl = server.url,
5252
x25519PublicKey = server.publicKey,

app/src/main/java/org/session/libsession/messaging/open_groups/OpenGroupApi.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ object OpenGroupApi {
410410

411411
if (request.useOnionRouting) {
412412
try {
413-
return MessagingModuleConfiguration.shared.sessionNetwork.sendToServer(
413+
return MessagingModuleConfiguration.shared.serverClient.send(
414414
request = requestBuilder.build(),
415415
serverBaseUrl = request.server,
416416
x25519PublicKey = serverPublicKey

app/src/main/java/org/session/libsession/messaging/sending_receiving/MessageSender.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import org.session.libsession.messaging.messages.visible.VisibleMessage
2828
import org.session.libsession.messaging.open_groups.OpenGroupApi
2929
import org.session.libsession.messaging.open_groups.OpenGroupApi.Capability
3030
import org.session.libsession.messaging.open_groups.OpenGroupMessage
31-
import org.session.libsession.network.SessionClient
31+
import org.session.libsession.network.SnodeClient
3232
import org.session.libsession.network.SnodeClock
3333
import org.session.libsession.snode.SnodeMessage
3434
import org.session.libsession.utilities.Address
@@ -62,7 +62,7 @@ class MessageSender @Inject constructor(
6262
private val messageSendJobFactory: MessageSendJob.Factory,
6363
private val messageExpirationManager: ExpiringMessageManager,
6464
private val snodeClock: SnodeClock,
65-
private val sessionClient: SessionClient,
65+
private val snodeClient: SnodeClient,
6666
@param:ManagerScope private val scope: CoroutineScope,
6767
) {
6868

@@ -247,14 +247,14 @@ class MessageSender @Inject constructor(
247247
"Unable to authorize group message send"
248248
}
249249

250-
sessionClient.sendMessage(
250+
snodeClient.sendMessage(
251251
auth = groupAuth,
252252
message = snodeMessage,
253253
namespace = Namespace.GROUP_MESSAGES(),
254254
)
255255
}
256256
is Destination.Contact -> {
257-
sessionClient.sendMessage(snodeMessage, auth = null, namespace = Namespace.DEFAULT())
257+
snodeClient.sendMessage(snodeMessage, auth = null, namespace = Namespace.DEFAULT())
258258
}
259259
is Destination.OpenGroup,
260260
is Destination.OpenGroupInbox -> throw IllegalStateException("Destination should not be an open group.")

app/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageProcessor.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import org.session.libsession.messaging.open_groups.OpenGroupApi
2929
import org.session.libsession.messaging.sending_receiving.data_extraction.DataExtractionNotificationInfoMessage
3030
import org.session.libsession.messaging.sending_receiving.notifications.MessageNotifier
3131
import org.session.libsession.messaging.utilities.WebRtcUtils
32-
import org.session.libsession.network.SessionClient
32+
import org.session.libsession.network.SnodeClient
3333
import org.session.libsession.utilities.Address
3434
import org.session.libsession.utilities.Address.Companion.toAddress
3535
import org.session.libsession.utilities.ConfigFactoryProtocol
@@ -77,7 +77,7 @@ class ReceivedMessageProcessor @Inject constructor(
7777
private val visibleMessageHandler: Provider<VisibleMessageHandler>,
7878
private val blindMappingRepository: BlindMappingRepository,
7979
private val messageParser: MessageParser,
80-
private val sessionClient: SessionClient
80+
private val snodeClient: SnodeClient
8181
) {
8282
private val threadMutexes = ConcurrentHashMap<Address.Conversable, ReentrantLock>()
8383

@@ -454,7 +454,7 @@ class ReceivedMessageProcessor @Inject constructor(
454454
messageDataProvider.getServerHashForMessage(messageIdToDelete)?.let { serverHash ->
455455
scope.launch(Dispatchers.IO) { // using scope as we are slowly migrating to coroutines but we can't migrate everything at once
456456
try {
457-
sessionClient.deleteMessage(author, userAuth, listOf(serverHash))
457+
snodeClient.deleteMessage(author, userAuth, listOf(serverHash))
458458
} catch (e: Exception) {
459459
Log.e("Loki", "Failed to delete message", e)
460460
}

app/src/main/java/org/session/libsession/messaging/sending_receiving/notifications/PushRegistryV1.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ object PushRegistryV1 {
6262

6363
try {
6464
retryWithUniformInterval(MAX_RETRY_COUNT) {
65-
MessagingModuleConfiguration.shared.sessionNetwork.sendToServer(
65+
MessagingModuleConfiguration.shared.serverClient.send(
6666
request = request,
6767
serverBaseUrl = server.url,
6868
x25519PublicKey = server.publicKey,

app/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/Poller.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import org.session.libsession.database.userAuth
3030
import org.session.libsession.messaging.messages.Message.Companion.senderOrSync
3131
import org.session.libsession.messaging.sending_receiving.MessageParser
3232
import org.session.libsession.messaging.sending_receiving.ReceivedMessageProcessor
33-
import org.session.libsession.network.SessionClient
33+
import org.session.libsession.network.SnodeClient
3434
import org.session.libsession.network.SnodeClock
3535
import org.session.libsession.network.snode.SwarmStorage
3636
import org.session.libsession.snode.model.RetrieveMessageResponse
@@ -64,7 +64,7 @@ class Poller @AssistedInject constructor(
6464
private val receivedMessageHashDatabase: ReceivedMessageHashDatabase,
6565
private val processor: ReceivedMessageProcessor,
6666
private val messageParser: MessageParser,
67-
private val sessionClient: SessionClient,
67+
private val snodeClient: SnodeClient,
6868
private val swarmStorage: SwarmStorage,
6969
@Assisted scope: CoroutineScope
7070
) {
@@ -305,7 +305,7 @@ class Poller @AssistedInject constructor(
305305

306306
// Get messages call wrapped in an async
307307
val fetchMessageTask = if (!pollOnlyUserProfileConfig) {
308-
val request = sessionClient.buildAuthenticatedRetrieveBatchRequest(
308+
val request = snodeClient.buildAuthenticatedRetrieveBatchRequest(
309309
lastHash = lokiApiDatabase.getLastMessageHashValue(
310310
snode = snode,
311311
publicKey = userAuth.accountId.hexString,
@@ -316,7 +316,7 @@ class Poller @AssistedInject constructor(
316316

317317
this.async {
318318
runCatching {
319-
sessionClient.sendBatchRequest(
319+
snodeClient.sendBatchRequest(
320320
snode = snode,
321321
publicKey = userPublicKey,
322322
request = request,
@@ -341,7 +341,7 @@ class Poller @AssistedInject constructor(
341341
.map { type ->
342342
val config = configs.getConfig(type)
343343
hashesToExtend += config.activeHashes()
344-
val request = sessionClient.buildAuthenticatedRetrieveBatchRequest(
344+
val request = snodeClient.buildAuthenticatedRetrieveBatchRequest(
345345
lastHash = lokiApiDatabase.getLastMessageHashValue(
346346
snode = snode,
347347
publicKey = userAuth.accountId.hexString,
@@ -354,7 +354,7 @@ class Poller @AssistedInject constructor(
354354

355355
this.async {
356356
type to runCatching {
357-
sessionClient.sendBatchRequest(
357+
snodeClient.sendBatchRequest(
358358
snode = snode,
359359
publicKey = userPublicKey,
360360
request = request,
@@ -368,10 +368,10 @@ class Poller @AssistedInject constructor(
368368
if (hashesToExtend.isNotEmpty()) {
369369
launch {
370370
try {
371-
sessionClient.sendBatchRequest(
371+
snodeClient.sendBatchRequest(
372372
snode,
373373
userPublicKey,
374-
sessionClient.buildAuthenticatedAlterTtlBatchRequest(
374+
snodeClient.buildAuthenticatedAlterTtlBatchRequest(
375375
messageHashes = hashesToExtend.toList(),
376376
auth = userAuth,
377377
newExpiry = snodeClock.currentTimeMills() + 14.days.inWholeMilliseconds,
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package org.session.libsession.network
2+
3+
import okhttp3.Request
4+
import org.session.libsession.network.model.OnionDestination
5+
import org.session.libsession.network.model.OnionResponse
6+
import org.session.libsession.network.onion.Version
7+
import org.session.libsession.network.utilities.getBodyForOnionRequest
8+
import org.session.libsession.network.utilities.getHeadersForOnionRequest
9+
import org.session.libsignal.utilities.JsonUtil
10+
import javax.inject.Inject
11+
import javax.inject.Singleton
12+
13+
/**
14+
* Responsible for encoding HTTP requests into the onion format (v3/v4)
15+
* and sending them via the network.
16+
*/
17+
@Singleton
18+
class ServerClient @Inject constructor(
19+
private val sessionNetwork: SessionNetwork
20+
) {
21+
suspend fun send(
22+
request: Request,
23+
serverBaseUrl: String,
24+
x25519PublicKey: String,
25+
version: Version = Version.V4
26+
): OnionResponse {
27+
val url = request.url
28+
val payload = generatePayload(request, serverBaseUrl, version)
29+
30+
val destination = OnionDestination.ServerDestination(
31+
host = url.host,
32+
target = version.value,
33+
x25519PublicKey = x25519PublicKey,
34+
scheme = url.scheme,
35+
port = url.port
36+
)
37+
38+
return sessionNetwork.sendWithRetry(
39+
destination = destination,
40+
payload = payload,
41+
version = version,
42+
snodeToExclude = null,
43+
targetSnode = null,
44+
publicKey = null
45+
)
46+
}
47+
48+
private fun generatePayload(request: Request, server: String, version: Version): ByteArray {
49+
val headers = request.getHeadersForOnionRequest().toMutableMap()
50+
val url = request.url
51+
val urlAsString = url.toString()
52+
val body = request.getBodyForOnionRequest() ?: "null"
53+
54+
val endpoint = if (server.length < urlAsString.length) {
55+
urlAsString.substringAfter(server)
56+
} else {
57+
""
58+
}
59+
60+
return if (version == Version.V4) {
61+
if (request.body != null &&
62+
headers.keys.none { it.equals("Content-Type", ignoreCase = true) }
63+
) {
64+
headers["Content-Type"] = "application/json"
65+
}
66+
67+
val requestPayload = mapOf(
68+
"endpoint" to endpoint,
69+
"method" to request.method,
70+
"headers" to headers
71+
)
72+
73+
val requestData = JsonUtil.toJson(requestPayload).toByteArray()
74+
val prefixData = "l${requestData.size}:".toByteArray(Charsets.US_ASCII)
75+
val suffixData = "e".toByteArray(Charsets.US_ASCII)
76+
77+
if (request.body != null) {
78+
val bodyData = if (body is ByteArray) body else body.toString().toByteArray()
79+
val bodyLengthData = "${bodyData.size}:".toByteArray(Charsets.US_ASCII)
80+
prefixData + requestData + bodyLengthData + bodyData + suffixData
81+
} else {
82+
prefixData + requestData + suffixData
83+
}
84+
} else {
85+
val payload = mapOf(
86+
"body" to body,
87+
"endpoint" to endpoint.removePrefix("/"),
88+
"method" to request.method,
89+
"headers" to headers
90+
)
91+
JsonUtil.toJson(payload).toByteArray()
92+
}
93+
}
94+
}

0 commit comments

Comments
 (0)