mirror of
https://github.com/element-hq/element-android
synced 2024-11-28 13:38:49 +03:00
only converting encrypted events to NotifiableMessageEvent if the decrypted type is also a message
- fixes the app displaying encrypted non message events as notification messages
This commit is contained in:
parent
55c0f1fcb3
commit
41ae67d214
1 changed files with 57 additions and 50 deletions
|
@ -66,12 +66,10 @@ class NotifiableEventResolver @Inject constructor(
|
||||||
return resolveStateRoomEvent(event, session, canBeReplaced = false, isNoisy = isNoisy)
|
return resolveStateRoomEvent(event, session, canBeReplaced = false, isNoisy = isNoisy)
|
||||||
}
|
}
|
||||||
val timelineEvent = session.getRoom(roomID)?.getTimeLineEvent(eventId) ?: return null
|
val timelineEvent = session.getRoom(roomID)?.getTimeLineEvent(eventId) ?: return null
|
||||||
when (event.getClearType()) {
|
return when (event.getClearType()) {
|
||||||
EventType.MESSAGE -> {
|
EventType.MESSAGE,
|
||||||
return resolveMessageEvent(timelineEvent, session, canBeReplaced = false, isNoisy = isNoisy)
|
|
||||||
}
|
|
||||||
EventType.ENCRYPTED -> {
|
EventType.ENCRYPTED -> {
|
||||||
return resolveMessageEvent(timelineEvent, session, canBeReplaced = false, isNoisy = isNoisy)
|
resolveMessageEvent(timelineEvent, session, canBeReplaced = false, isNoisy = isNoisy)
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
// If the event can be displayed, display it as is
|
// If the event can be displayed, display it as is
|
||||||
|
@ -79,7 +77,7 @@ class NotifiableEventResolver @Inject constructor(
|
||||||
// TODO Better event text display
|
// TODO Better event text display
|
||||||
val bodyPreview = event.type ?: EventType.MISSING_TYPE
|
val bodyPreview = event.type ?: EventType.MISSING_TYPE
|
||||||
|
|
||||||
return SimpleNotifiableEvent(
|
SimpleNotifiableEvent(
|
||||||
session.myUserId,
|
session.myUserId,
|
||||||
eventId = event.eventId!!,
|
eventId = event.eventId!!,
|
||||||
editedEventId = timelineEvent.getEditedEventId(),
|
editedEventId = timelineEvent.getEditedEventId(),
|
||||||
|
@ -126,18 +124,18 @@ class NotifiableEventResolver @Inject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun resolveMessageEvent(event: TimelineEvent, session: Session, canBeReplaced: Boolean, isNoisy: Boolean): NotifiableEvent {
|
private suspend fun resolveMessageEvent(event: TimelineEvent, session: Session, canBeReplaced: Boolean, isNoisy: Boolean): NotifiableEvent? {
|
||||||
// The event only contains an eventId, and roomId (type is m.room.*) , we need to get the displayable content (names, avatar, text, etc...)
|
// The event only contains an eventId, and roomId (type is m.room.*) , we need to get the displayable content (names, avatar, text, etc...)
|
||||||
val room = session.getRoom(event.root.roomId!! /*roomID cannot be null*/)
|
val room = session.getRoom(event.root.roomId!! /*roomID cannot be null*/)
|
||||||
|
|
||||||
if (room == null) {
|
return if (room == null) {
|
||||||
Timber.e("## Unable to resolve room for eventId [$event]")
|
Timber.e("## Unable to resolve room for eventId [$event]")
|
||||||
// Ok room is not known in store, but we can still display something
|
// Ok room is not known in store, but we can still display something
|
||||||
val body = displayableEventFormatter.format(event, isDm = false, appendAuthor = false)
|
val body = displayableEventFormatter.format(event, isDm = false, appendAuthor = false)
|
||||||
val roomName = stringProvider.getString(R.string.notification_unknown_room_name)
|
val roomName = stringProvider.getString(R.string.notification_unknown_room_name)
|
||||||
val senderDisplayName = event.senderInfo.disambiguatedDisplayName
|
val senderDisplayName = event.senderInfo.disambiguatedDisplayName
|
||||||
|
|
||||||
return NotifiableMessageEvent(
|
NotifiableMessageEvent(
|
||||||
eventId = event.root.eventId!!,
|
eventId = event.root.eventId!!,
|
||||||
editedEventId = event.getEditedEventId(),
|
editedEventId = event.getEditedEventId(),
|
||||||
canBeReplaced = canBeReplaced,
|
canBeReplaced = canBeReplaced,
|
||||||
|
@ -152,26 +150,15 @@ class NotifiableEventResolver @Inject constructor(
|
||||||
matrixID = session.myUserId
|
matrixID = session.myUserId
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
if (event.root.isEncrypted() && event.root.mxDecryptionResult == null) {
|
event.attemptToDecryptIfNeeded(session)
|
||||||
// TODO use a global event decryptor? attache to session and that listen to new sessionId?
|
// only convert encrypted messages to NotifiableMessageEvents
|
||||||
// for now decrypt sync
|
when (event.root.getClearType()) {
|
||||||
try {
|
EventType.MESSAGE -> {
|
||||||
val result = session.cryptoService().decryptEvent(event.root, event.root.roomId + UUID.randomUUID().toString())
|
|
||||||
event.root.mxDecryptionResult = OlmDecryptionResult(
|
|
||||||
payload = result.clearEvent,
|
|
||||||
senderKey = result.senderCurve25519Key,
|
|
||||||
keysClaimed = result.claimedEd25519Key?.let { mapOf("ed25519" to it) },
|
|
||||||
forwardingCurve25519KeyChain = result.forwardingCurve25519KeyChain
|
|
||||||
)
|
|
||||||
} catch (e: MXCryptoError) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val body = displayableEventFormatter.format(event, isDm = room.roomSummary()?.isDirect.orFalse(), appendAuthor = false).toString()
|
val body = displayableEventFormatter.format(event, isDm = room.roomSummary()?.isDirect.orFalse(), appendAuthor = false).toString()
|
||||||
val roomName = room.roomSummary()?.displayName ?: ""
|
val roomName = room.roomSummary()?.displayName ?: ""
|
||||||
val senderDisplayName = event.senderInfo.disambiguatedDisplayName
|
val senderDisplayName = event.senderInfo.disambiguatedDisplayName
|
||||||
|
|
||||||
return NotifiableMessageEvent(
|
NotifiableMessageEvent(
|
||||||
eventId = event.root.eventId!!,
|
eventId = event.root.eventId!!,
|
||||||
editedEventId = event.getEditedEventId(),
|
editedEventId = event.getEditedEventId(),
|
||||||
canBeReplaced = canBeReplaced,
|
canBeReplaced = canBeReplaced,
|
||||||
|
@ -198,6 +185,26 @@ class NotifiableEventResolver @Inject constructor(
|
||||||
soundName = null
|
soundName = null
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun TimelineEvent.attemptToDecryptIfNeeded(session: Session) {
|
||||||
|
if (root.isEncrypted() && root.mxDecryptionResult == null) {
|
||||||
|
// TODO use a global event decryptor? attache to session and that listen to new sessionId?
|
||||||
|
// for now decrypt sync
|
||||||
|
try {
|
||||||
|
val result = session.cryptoService().decryptEvent(root, root.roomId + UUID.randomUUID().toString())
|
||||||
|
root.mxDecryptionResult = OlmDecryptionResult(
|
||||||
|
payload = result.clearEvent,
|
||||||
|
senderKey = result.senderCurve25519Key,
|
||||||
|
keysClaimed = result.claimedEd25519Key?.let { mapOf("ed25519" to it) },
|
||||||
|
forwardingCurve25519KeyChain = result.forwardingCurve25519KeyChain
|
||||||
|
)
|
||||||
|
} catch (e: MXCryptoError) {
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun TimelineEvent.fetchImageIfPresent(session: Session): Uri? {
|
private suspend fun TimelineEvent.fetchImageIfPresent(session: Session): Uri? {
|
||||||
|
|
Loading…
Reference in a new issue