Skip to content

Commit b5e5350

Browse files
authored
Merge pull request #5369 from element-hq/feature/bma/requireClientSecret
Make PushData.clientSecret mandatory.
2 parents eef4527 + 1cc7afb commit b5e5350

File tree

5 files changed

+16
-84
lines changed

5 files changed

+16
-84
lines changed

libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/push/DefaultPushHandler.kt

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import io.element.android.features.call.api.ElementCallEntryPoint
1616
import io.element.android.libraries.core.log.logger.LoggerTag
1717
import io.element.android.libraries.core.meta.BuildMeta
1818
import io.element.android.libraries.di.annotations.AppCoroutineScope
19-
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
2019
import io.element.android.libraries.matrix.api.exception.NotificationResolverException
2120
import io.element.android.libraries.push.impl.history.PushHistoryService
2221
import io.element.android.libraries.push.impl.history.onDiagnosticPush
@@ -58,7 +57,6 @@ class DefaultPushHandler(
5857
private val userPushStoreFactory: UserPushStoreFactory,
5958
private val pushClientSecret: PushClientSecret,
6059
private val buildMeta: BuildMeta,
61-
private val matrixAuthenticationService: MatrixAuthenticationService,
6260
private val diagnosticPushHandler: DiagnosticPushHandler,
6361
private val elementCallEntryPoint: ElementCallEntryPoint,
6462
private val notificationChannels: NotificationChannels,
@@ -241,32 +239,15 @@ class DefaultPushHandler(
241239
} else {
242240
Timber.tag(loggerTag.value).d("## handleInternal()")
243241
}
244-
val clientSecret = pushData.clientSecret
245-
// clientSecret should not be null. If this happens, restore default session
246-
var reason = if (clientSecret == null) "No client secret" else ""
247-
val userId = clientSecret?.let {
248-
// Get userId from client secret
249-
pushClientSecret.getUserIdFromSecret(clientSecret).also {
250-
if (it == null) {
251-
reason = "Unable to get userId from client secret"
252-
}
253-
}
254-
}
255-
?: run {
256-
matrixAuthenticationService.getLatestSessionId().also {
257-
if (it == null) {
258-
if (reason.isNotEmpty()) reason += " - "
259-
reason += "Unable to get latest sessionId"
260-
}
261-
}
262-
}
242+
// Get userId from client secret
243+
val userId = pushClientSecret.getUserIdFromSecret(pushData.clientSecret)
263244
if (userId == null) {
264-
Timber.w("Unable to get a session")
245+
Timber.w("Unable to get userId from client secret")
265246
pushHistoryService.onUnableToRetrieveSession(
266247
providerInfo = providerInfo,
267248
eventId = pushData.eventId,
268249
roomId = pushData.roomId,
269-
reason = reason,
250+
reason = "Unable to get userId from client secret",
270251
)
271252
return
272253
}

libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/push/DefaultPushHandlerTest.kt

Lines changed: 3 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import com.google.common.truth.Truth.assertThat
1414
import io.element.android.features.call.api.CallType
1515
import io.element.android.features.call.test.FakeElementCallEntryPoint
1616
import io.element.android.libraries.core.meta.BuildMeta
17-
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
1817
import io.element.android.libraries.matrix.api.core.EventId
1918
import io.element.android.libraries.matrix.api.core.RoomId
2019
import io.element.android.libraries.matrix.api.core.SessionId
@@ -28,7 +27,6 @@ import io.element.android.libraries.matrix.test.A_ROOM_ID
2827
import io.element.android.libraries.matrix.test.A_SECRET
2928
import io.element.android.libraries.matrix.test.A_SESSION_ID
3029
import io.element.android.libraries.matrix.test.A_USER_ID
31-
import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService
3230
import io.element.android.libraries.matrix.test.core.aBuildMeta
3331
import io.element.android.libraries.push.impl.history.FakePushHistoryService
3432
import io.element.android.libraries.push.impl.history.PushHistoryService
@@ -181,7 +179,7 @@ class DefaultPushHandlerTest {
181179
}
182180

183181
@Test
184-
fun `when PushData is received, but client secret is not known, fallback the latest session`() =
182+
fun `when PushData is received, but client secret is not known, nothing happen`() =
185183
runTest {
186184
val aNotifiableMessageEvent = aNotifiableMessageEvent()
187185
val notifiableEventResult =
@@ -207,58 +205,6 @@ class DefaultPushHandlerTest {
207205
pushClientSecret = FakePushClientSecret(
208206
getUserIdFromSecretResult = { null }
209207
),
210-
matrixAuthenticationService = FakeMatrixAuthenticationService().apply {
211-
getLatestSessionIdLambda = { A_USER_ID }
212-
},
213-
incrementPushCounterResult = incrementPushCounterResult,
214-
pushHistoryService = pushHistoryService,
215-
)
216-
defaultPushHandler.handle(aPushData, A_PUSHER_INFO)
217-
218-
advanceTimeBy(300.milliseconds)
219-
220-
incrementPushCounterResult.assertions()
221-
.isCalledOnce()
222-
notifiableEventResult.assertions()
223-
.isCalledOnce()
224-
.with(value(A_USER_ID), any())
225-
onNotifiableEventsReceived.assertions()
226-
.isCalledOnce()
227-
.with(value(listOf(aNotifiableMessageEvent)))
228-
onPushReceivedResult.assertions()
229-
.isCalledOnce()
230-
}
231-
232-
@Test
233-
fun `when PushData is received, but client secret is not known, and there is no latest session, nothing happen`() =
234-
runTest {
235-
val aNotifiableMessageEvent = aNotifiableMessageEvent()
236-
val notifiableEventResult =
237-
lambdaRecorder<SessionId, List<NotificationEventRequest>, Result<Map<NotificationEventRequest, Result<ResolvedPushEvent>>>> { _, _ ->
238-
val request = NotificationEventRequest(A_SESSION_ID, A_ROOM_ID, AN_EVENT_ID, A_PUSHER_INFO)
239-
Result.success(mapOf(request to Result.success(ResolvedPushEvent.Event(aNotifiableMessageEvent))))
240-
}
241-
val onNotifiableEventsReceived = lambdaRecorder<List<NotifiableEvent>, Unit> {}
242-
val incrementPushCounterResult = lambdaRecorder<Unit> {}
243-
val aPushData = PushData(
244-
eventId = AN_EVENT_ID,
245-
roomId = A_ROOM_ID,
246-
unread = 0,
247-
clientSecret = A_SECRET,
248-
)
249-
val onPushReceivedResult = lambdaRecorder<String, EventId?, RoomId?, SessionId?, Boolean, Boolean, String?, Unit> { _, _, _, _, _, _, _ -> }
250-
val pushHistoryService = FakePushHistoryService(
251-
onPushReceivedResult = onPushReceivedResult,
252-
)
253-
val defaultPushHandler = createDefaultPushHandler(
254-
onNotifiableEventsReceived = onNotifiableEventsReceived,
255-
notifiableEventsResult = notifiableEventResult,
256-
pushClientSecret = FakePushClientSecret(
257-
getUserIdFromSecretResult = { null }
258-
),
259-
matrixAuthenticationService = FakeMatrixAuthenticationService().apply {
260-
getLatestSessionIdLambda = { null }
261-
},
262208
incrementPushCounterResult = incrementPushCounterResult,
263209
pushHistoryService = pushHistoryService,
264210
)
@@ -655,8 +601,8 @@ class DefaultPushHandlerTest {
655601
var receivedFallbackEvent = false
656602
val onPushReceivedResult =
657603
lambdaRecorder<String, EventId?, RoomId?, SessionId?, Boolean, Boolean, String?, Unit> { _, _, _, _, isResolved, _, comment ->
658-
receivedFallbackEvent = !isResolved && comment == "Unable to resolve event: ${aNotifiableFallbackEvent.cause}"
659-
}
604+
receivedFallbackEvent = !isResolved && comment == "Unable to resolve event: ${aNotifiableFallbackEvent.cause}"
605+
}
660606
val pushHistoryService = FakePushHistoryService(
661607
onPushReceivedResult = onPushReceivedResult,
662608
)
@@ -694,7 +640,6 @@ class DefaultPushHandlerTest {
694640
userPushStore: UserPushStore = FakeUserPushStore(),
695641
pushClientSecret: PushClientSecret = FakePushClientSecret(),
696642
buildMeta: BuildMeta = aBuildMeta(),
697-
matrixAuthenticationService: MatrixAuthenticationService = FakeMatrixAuthenticationService(),
698643
diagnosticPushHandler: DiagnosticPushHandler = DiagnosticPushHandler(),
699644
elementCallEntryPoint: FakeElementCallEntryPoint = FakeElementCallEntryPoint(),
700645
notificationChannels: FakeNotificationChannels = FakeNotificationChannels(),
@@ -712,7 +657,6 @@ class DefaultPushHandlerTest {
712657
userPushStoreFactory = FakeUserPushStoreFactory { userPushStore },
713658
pushClientSecret = pushClientSecret,
714659
buildMeta = buildMeta,
715-
matrixAuthenticationService = matrixAuthenticationService,
716660
diagnosticPushHandler = diagnosticPushHandler,
717661
elementCallEntryPoint = elementCallEntryPoint,
718662
notificationChannels = notificationChannels,

libraries/pushproviders/api/src/main/kotlin/io/element/android/libraries/pushproviders/api/PushData.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@ data class PushData(
2222
val eventId: EventId,
2323
val roomId: RoomId,
2424
val unread: Int?,
25-
val clientSecret: String?,
25+
val clientSecret: String,
2626
)

libraries/pushproviders/firebase/src/main/kotlin/io/element/android/libraries/pushproviders/firebase/PushDataFirebase.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,11 @@ data class PushDataFirebase(
3434
fun PushDataFirebase.toPushData(): PushData? {
3535
val safeEventId = eventId?.let(::EventId) ?: return null
3636
val safeRoomId = roomId?.let(::RoomId) ?: return null
37+
val safeClientSecret = clientSecret ?: return null
3738
return PushData(
3839
eventId = safeEventId,
3940
roomId = safeRoomId,
4041
unread = unread,
41-
clientSecret = clientSecret,
42+
clientSecret = safeClientSecret,
4243
)
4344
}

libraries/pushproviders/firebase/src/test/kotlin/io/element/android/libraries/pushproviders/firebase/FirebasePushParserTest.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@ class FirebasePushParserTest {
5959
assertThrowsInDebug { pushParser.parse(FIREBASE_PUSH_DATA.mutate("event_id", "")) }
6060
}
6161

62+
@Test
63+
fun `test empty client secret`() {
64+
val pushParser = FirebasePushParser()
65+
assertThat(pushParser.parse(FIREBASE_PUSH_DATA.mutate("cs", null))).isNull()
66+
}
67+
6268
@Test
6369
fun `test invalid eventId`() {
6470
val pushParser = FirebasePushParser()

0 commit comments

Comments
 (0)