From c7586feebc920ea95625a08f5f671794575ef4ca Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Sun, 16 Jun 2024 21:18:36 +0200 Subject: [PATCH] Fixed group chat room security level indicator over avatar --- .../ui/main/chat/model/ConversationModel.kt | 1 + .../viewmodel/ConversationInfoViewModel.kt | 1 + .../chat/viewmodel/ConversationViewModel.kt | 1 + .../main/contacts/model/ContactAvatarModel.kt | 38 +++++++++++++++++++ 4 files changed, 41 insertions(+) diff --git a/app/src/main/java/org/linphone/ui/main/chat/model/ConversationModel.kt b/app/src/main/java/org/linphone/ui/main/chat/model/ConversationModel.kt index fb05106f1..228694993 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/model/ConversationModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/model/ConversationModel.kt @@ -335,6 +335,7 @@ class ConversationModel @WorkerThread constructor(val chatRoom: ChatRoom) { fakeFriend.name = chatRoom.subject val model = ContactAvatarModel(fakeFriend) model.defaultToConversationIcon.postValue(true) + model.updateSecurityLevelUsingConversation(chatRoom) avatarModel.postValue(model) } else { avatarModel.postValue( diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt index 909c39d7c..d84b39838 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationInfoViewModel.kt @@ -601,6 +601,7 @@ class ConversationInfoViewModel @UiThread constructor() : AbstractConversationVi fakeFriend.name = chatRoom.subject val model = ContactAvatarModel(fakeFriend) model.defaultToConversationIcon.postValue(true) + model.updateSecurityLevelUsingConversation(chatRoom) model } else { participantsList.first().avatarModel diff --git a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt index c629187f8..ed6c26e32 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/viewmodel/ConversationViewModel.kt @@ -563,6 +563,7 @@ class ConversationViewModel @UiThread constructor() : AbstractConversationViewMo val fakeFriend = coreContext.core.createFriend() fakeFriend.name = chatRoom.subject val model = ContactAvatarModel(fakeFriend) + model.updateSecurityLevelUsingConversation(chatRoom) model } else { coreContext.contactsManager.getContactAvatarModelForAddress(address) diff --git a/app/src/main/java/org/linphone/ui/main/contacts/model/ContactAvatarModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/model/ContactAvatarModel.kt index 3d9031c33..03202c77a 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/model/ContactAvatarModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/model/ContactAvatarModel.kt @@ -22,13 +22,16 @@ package org.linphone.ui.main.contacts.model import android.net.Uri import androidx.annotation.WorkerThread import androidx.lifecycle.MutableLiveData +import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.contacts.AbstractAvatarModel import org.linphone.contacts.getNativeContactPictureUri import org.linphone.core.Address +import org.linphone.core.ChatRoom import org.linphone.core.ConsolidatedPresence import org.linphone.core.Friend import org.linphone.core.FriendListenerStub +import org.linphone.core.SecurityLevel import org.linphone.core.tools.Log import org.linphone.utils.AppUtils import org.linphone.utils.TimestampUtils @@ -92,6 +95,41 @@ class ContactAvatarModel @WorkerThread constructor(val friend: Friend, val addre computePresence(address) } + @WorkerThread + fun updateSecurityLevelUsingConversation(chatRoom: ChatRoom) { + /* + // Don't do that, as chatRoom securityLevel is taking into account the security level + // between the device and the other devices that shares the same SIP identity + val securityLevel = when (chatRoom.securityLevel) { + ChatRoom.SecurityLevel.Unsafe -> { + SecurityLevel.Unsafe + } + ChatRoom.SecurityLevel.Encrypted -> { + SecurityLevel.EndToEndEncrypted + } + ChatRoom.SecurityLevel.Safe -> { + SecurityLevel.EndToEndEncryptedAndVerified + } + else -> SecurityLevel.None + }*/ + + var lowestSecurityLevel = SecurityLevel.EndToEndEncryptedAndVerified + for (participant in chatRoom.participants) { + val friend = coreContext.contactsManager.findContactByAddress(participant.address) + if (friend == null || friend.securityLevel == SecurityLevel.None) { + lowestSecurityLevel = SecurityLevel.None + } else if (friend.securityLevel == SecurityLevel.Unsafe) { + lowestSecurityLevel = SecurityLevel.Unsafe + break + } else if (friend.securityLevel == SecurityLevel.EndToEndEncrypted || friend.securityLevel == SecurityLevel.PointToPointEncrypted) { + if (lowestSecurityLevel != SecurityLevel.None) { + lowestSecurityLevel = SecurityLevel.EndToEndEncrypted + } + } + } + trust.postValue(lowestSecurityLevel) + } + @WorkerThread fun updateSecurityLevel(address: Address?) { if (address == null) {