ensure ageLocalTs is set
This commit is contained in:
parent
b07e0a47e8
commit
622ada7125
|
@ -62,7 +62,7 @@ internal class VerificationMessageProcessor @Inject constructor(
|
||||||
// If the request is in the future by more than 5 minutes or more than 10 minutes in the past,
|
// If the request is in the future by more than 5 minutes or more than 10 minutes in the past,
|
||||||
// the message should be ignored by the receiver.
|
// the message should be ignored by the receiver.
|
||||||
|
|
||||||
if (event.ageLocalTs != null && !VerificationService.isValidRequest(event.ageLocalTs, clock.epochMillis())) return Unit.also {
|
if (!VerificationService.isValidRequest(event.ageLocalTs, clock.epochMillis())) return Unit.also {
|
||||||
Timber.d("## SAS Verification live observer: msgId: ${event.eventId} is outdated age:$event.ageLocalTs ms")
|
Timber.d("## SAS Verification live observer: msgId: ${event.eventId} is outdated age:$event.ageLocalTs ms")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -271,7 +271,7 @@ private fun HashMap<String, RoomMemberContent?>.addSenderState(realm: Realm, roo
|
||||||
* Create an EventEntity for the root thread event or get an existing one.
|
* Create an EventEntity for the root thread event or get an existing one.
|
||||||
*/
|
*/
|
||||||
private fun createEventEntity(realm: Realm, roomId: String, event: Event, currentTimeMillis: Long): EventEntity {
|
private fun createEventEntity(realm: Realm, roomId: String, event: Event, currentTimeMillis: Long): EventEntity {
|
||||||
val ageLocalTs = event.unsignedData?.age?.let { currentTimeMillis - it }
|
val ageLocalTs = event.unsignedData?.age?.let { currentTimeMillis - it } ?: currentTimeMillis
|
||||||
return event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, EventInsertType.PAGINATION)
|
return event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, EventInsertType.PAGINATION)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,7 @@ internal fun EventEntity.asDomain(castJsonNumbers: Boolean = false): Event {
|
||||||
internal fun Event.toEntity(
|
internal fun Event.toEntity(
|
||||||
roomId: String,
|
roomId: String,
|
||||||
sendState: SendState,
|
sendState: SendState,
|
||||||
ageLocalTs: Long?,
|
ageLocalTs: Long,
|
||||||
contentToInject: String? = null
|
contentToInject: String? = null
|
||||||
): EventEntity {
|
): EventEntity {
|
||||||
return EventMapper.map(this, roomId).apply {
|
return EventMapper.map(this, roomId).apply {
|
||||||
|
|
|
@ -114,7 +114,7 @@ internal class DefaultLoadRoomMembersTask @Inject constructor(
|
||||||
if (roomMemberEvent.eventId == null || roomMemberEvent.stateKey == null || roomMemberEvent.type == null) {
|
if (roomMemberEvent.eventId == null || roomMemberEvent.stateKey == null || roomMemberEvent.type == null) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
val ageLocalTs = roomMemberEvent.unsignedData?.age?.let { now - it }
|
val ageLocalTs = roomMemberEvent.unsignedData?.age?.let { now - it } ?: now
|
||||||
val eventEntity = roomMemberEvent.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, EventInsertType.PAGINATION)
|
val eventEntity = roomMemberEvent.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, EventInsertType.PAGINATION)
|
||||||
CurrentStateEventEntity.getOrCreate(
|
CurrentStateEventEntity.getOrCreate(
|
||||||
realm,
|
realm,
|
||||||
|
|
|
@ -209,7 +209,8 @@ internal class DefaultFetchThreadTimelineTask @Inject constructor(
|
||||||
* Create an EventEntity to be added in the TimelineEventEntity.
|
* Create an EventEntity to be added in the TimelineEventEntity.
|
||||||
*/
|
*/
|
||||||
private fun createEventEntity(roomId: String, event: Event, realm: Realm): EventEntity {
|
private fun createEventEntity(roomId: String, event: Event, realm: Realm): EventEntity {
|
||||||
val ageLocalTs = event.unsignedData?.age?.let { clock.epochMillis() - it }
|
val now = clock.epochMillis()
|
||||||
|
val ageLocalTs = event.unsignedData?.age?.let { now - it } ?: now
|
||||||
return event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, EventInsertType.PAGINATION)
|
return event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, EventInsertType.PAGINATION)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,7 +142,7 @@ internal class TokenChunkEventPersistor @Inject constructor(
|
||||||
val now = clock.epochMillis()
|
val now = clock.epochMillis()
|
||||||
|
|
||||||
stateEvents?.forEach { stateEvent ->
|
stateEvents?.forEach { stateEvent ->
|
||||||
val ageLocalTs = stateEvent.unsignedData?.age?.let { now - it }
|
val ageLocalTs = stateEvent.unsignedData?.age?.let { now - it } ?: now
|
||||||
val stateEventEntity = stateEvent.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, EventInsertType.PAGINATION)
|
val stateEventEntity = stateEvent.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, EventInsertType.PAGINATION)
|
||||||
currentChunk.addStateEvent(roomId, stateEventEntity, direction)
|
currentChunk.addStateEvent(roomId, stateEventEntity, direction)
|
||||||
if (stateEvent.type == EventType.STATE_ROOM_MEMBER && stateEvent.stateKey != null) {
|
if (stateEvent.type == EventType.STATE_ROOM_MEMBER && stateEvent.stateKey != null) {
|
||||||
|
@ -155,7 +155,7 @@ internal class TokenChunkEventPersistor @Inject constructor(
|
||||||
if (event.eventId == null || event.senderId == null) {
|
if (event.eventId == null || event.senderId == null) {
|
||||||
return@forEach
|
return@forEach
|
||||||
}
|
}
|
||||||
val ageLocalTs = event.unsignedData?.age?.let { now - it }
|
val ageLocalTs = event.unsignedData?.age?.let { now - it } ?: now
|
||||||
val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, EventInsertType.PAGINATION)
|
val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, EventInsertType.PAGINATION)
|
||||||
if (event.type == EventType.STATE_ROOM_MEMBER && event.stateKey != null) {
|
if (event.type == EventType.STATE_ROOM_MEMBER && event.stateKey != null) {
|
||||||
val contentToUse = if (direction == PaginationDirection.BACKWARDS) {
|
val contentToUse = if (direction == PaginationDirection.BACKWARDS) {
|
||||||
|
|
|
@ -244,7 +244,7 @@ internal class RoomSyncHandler @Inject constructor(
|
||||||
if (event.eventId == null || event.stateKey == null || event.type == null) {
|
if (event.eventId == null || event.stateKey == null || event.type == null) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it }
|
val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it } ?: syncLocalTimestampMillis
|
||||||
val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, insertType)
|
val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, insertType)
|
||||||
Timber.v("## received state event ${event.type} and key ${event.stateKey}")
|
Timber.v("## received state event ${event.type} and key ${event.stateKey}")
|
||||||
CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply {
|
CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply {
|
||||||
|
@ -306,7 +306,7 @@ internal class RoomSyncHandler @Inject constructor(
|
||||||
if (event.stateKey == null || event.type == null) {
|
if (event.stateKey == null || event.type == null) {
|
||||||
return@forEach
|
return@forEach
|
||||||
}
|
}
|
||||||
val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it }
|
val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it } ?: syncLocalTimestampMillis
|
||||||
val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, insertType)
|
val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, insertType)
|
||||||
CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply {
|
CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply {
|
||||||
eventId = eventEntity.eventId
|
eventId = eventEntity.eventId
|
||||||
|
@ -336,7 +336,7 @@ internal class RoomSyncHandler @Inject constructor(
|
||||||
if (event.eventId == null || event.stateKey == null || event.type == null) {
|
if (event.eventId == null || event.stateKey == null || event.type == null) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it }
|
val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it } ?: syncLocalTimestampMillis
|
||||||
val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, insertType)
|
val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, insertType)
|
||||||
CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply {
|
CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply {
|
||||||
eventId = event.eventId
|
eventId = event.eventId
|
||||||
|
@ -348,7 +348,7 @@ internal class RoomSyncHandler @Inject constructor(
|
||||||
if (event.eventId == null || event.senderId == null || event.type == null) {
|
if (event.eventId == null || event.senderId == null || event.type == null) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it }
|
val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it } ?: syncLocalTimestampMillis
|
||||||
val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, insertType)
|
val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs).copyToRealmOrIgnore(realm, insertType)
|
||||||
if (event.stateKey != null) {
|
if (event.stateKey != null) {
|
||||||
CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply {
|
CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply {
|
||||||
|
@ -401,7 +401,10 @@ internal class RoomSyncHandler @Inject constructor(
|
||||||
for (rawEvent in eventList) {
|
for (rawEvent in eventList) {
|
||||||
// It's annoying roomId is not there, but lot of code rely on it.
|
// It's annoying roomId is not there, but lot of code rely on it.
|
||||||
// And had to do it now as copy would delete all decryption results..
|
// And had to do it now as copy would delete all decryption results..
|
||||||
val event = rawEvent.copy(roomId = roomId)
|
val ageLocalTs = rawEvent.unsignedData?.age?.let { syncLocalTimestampMillis - it } ?: syncLocalTimestampMillis
|
||||||
|
val event = rawEvent.copy(roomId = roomId).also {
|
||||||
|
it.ageLocalTs = ageLocalTs
|
||||||
|
}
|
||||||
if (event.eventId == null || event.senderId == null || event.type == null) {
|
if (event.eventId == null || event.senderId == null || event.type == null) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -423,7 +426,6 @@ internal class RoomSyncHandler @Inject constructor(
|
||||||
contentToInject = threadsAwarenessHandler.makeEventThreadAware(realm, roomId, event)
|
contentToInject = threadsAwarenessHandler.makeEventThreadAware(realm, roomId, event)
|
||||||
}
|
}
|
||||||
|
|
||||||
val ageLocalTs = event.unsignedData?.age?.let { syncLocalTimestampMillis - it }
|
|
||||||
val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs, contentToInject).copyToRealmOrIgnore(realm, insertType)
|
val eventEntity = event.toEntity(roomId, SendState.SYNCED, ageLocalTs, contentToInject).copyToRealmOrIgnore(realm, insertType)
|
||||||
if (event.stateKey != null) {
|
if (event.stateKey != null) {
|
||||||
CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply {
|
CurrentStateEventEntity.getOrCreate(realm, roomId, event.stateKey, event.type).apply {
|
||||||
|
|
|
@ -53,6 +53,7 @@ import org.matrix.android.sdk.internal.session.permalinks.PermalinkFactory
|
||||||
import org.matrix.android.sdk.internal.session.room.send.LocalEchoEventFactory
|
import org.matrix.android.sdk.internal.session.room.send.LocalEchoEventFactory
|
||||||
import org.matrix.android.sdk.internal.session.room.timeline.GetEventTask
|
import org.matrix.android.sdk.internal.session.room.timeline.GetEventTask
|
||||||
import org.matrix.android.sdk.internal.util.awaitTransaction
|
import org.matrix.android.sdk.internal.util.awaitTransaction
|
||||||
|
import org.matrix.android.sdk.internal.util.time.Clock
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -64,7 +65,8 @@ internal class ThreadsAwarenessHandler @Inject constructor(
|
||||||
private val permalinkFactory: PermalinkFactory,
|
private val permalinkFactory: PermalinkFactory,
|
||||||
@SessionDatabase private val monarchy: Monarchy,
|
@SessionDatabase private val monarchy: Monarchy,
|
||||||
private val lightweightSettingsStorage: LightweightSettingsStorage,
|
private val lightweightSettingsStorage: LightweightSettingsStorage,
|
||||||
private val getEventTask: GetEventTask
|
private val getEventTask: GetEventTask,
|
||||||
|
private val clock: Clock,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
// This caching is responsible to improve the performance when we receive a root event
|
// This caching is responsible to improve the performance when we receive a root event
|
||||||
|
@ -120,7 +122,7 @@ internal class ThreadsAwarenessHandler @Inject constructor(
|
||||||
private suspend fun fetchThreadsEvents(threadsToFetch: Map<String, String>) {
|
private suspend fun fetchThreadsEvents(threadsToFetch: Map<String, String>) {
|
||||||
val eventEntityList = threadsToFetch.mapNotNull { (eventId, roomId) ->
|
val eventEntityList = threadsToFetch.mapNotNull { (eventId, roomId) ->
|
||||||
fetchEvent(eventId, roomId)?.let {
|
fetchEvent(eventId, roomId)?.let {
|
||||||
it.toEntity(roomId, SendState.SYNCED, it.ageLocalTs)
|
it.toEntity(roomId, SendState.SYNCED, it.ageLocalTs ?: clock.epochMillis())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue