From 02304cdd1877a23cfb02358e99a6911f3c1b623b Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 20 Sep 2022 16:46:55 +0200 Subject: [PATCH] Added a setting to force secure chat rooms --- .../main/chat/fragments/ChatRoomCreationFragment.kt | 7 +++++++ .../main/chat/fragments/GroupInfoFragment.kt | 3 ++- .../chat/viewmodels/ChatRoomCreationViewModel.kt | 13 ++++++++++--- .../main/chat/viewmodels/GroupInfoViewModel.kt | 6 +++--- .../main/contact/data/ContactNumberOrAddressData.kt | 2 ++ .../main/history/viewmodels/CallLogViewModel.kt | 2 ++ .../main/viewmodels/SharedMainViewModel.kt | 3 ++- .../main/java/org/linphone/core/CorePreferences.kt | 3 +++ .../main/res/layout/chat_room_creation_fragment.xml | 2 +- app/src/main/res/layout/contact_detail_cell.xml | 2 +- app/src/main/res/layout/history_detail_fragment.xml | 10 +++++----- 11 files changed, 38 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt index c4e8ca6d4..2d086f796 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/ChatRoomCreationFragment.kt @@ -36,6 +36,7 @@ import org.linphone.contact.ContactsSelectionAdapter import org.linphone.core.tools.Log import org.linphone.databinding.ChatRoomCreationFragmentBinding import org.linphone.utils.AppUtils +import org.linphone.utils.LinphoneUtils import org.linphone.utils.PermissionHelper class ChatRoomCreationFragment : SecureFragment() { @@ -174,6 +175,12 @@ class ChatRoomCreationFragment : SecureFragment } } + override fun onResume() { + super.onResume() + + viewModel.secureChatAvailable.value = LinphoneUtils.isEndToEndEncryptedChatAvailable() + } + private fun addParticipantsFromSharedViewModel() { val participants = sharedViewModel.chatRoomParticipants.value if (participants != null && participants.size > 0) { diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt index 08a2f0d3a..aa330f2c8 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/GroupInfoFragment.kt @@ -24,6 +24,7 @@ import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager +import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.activities.main.MainActivity import org.linphone.activities.main.chat.GroupChatRoomMember @@ -132,7 +133,7 @@ class GroupInfoFragment : SecureFragment() { } binding.setParticipantsClickListener { - sharedViewModel.createEncryptedChatRoom = viewModel.isEncrypted.value == true + sharedViewModel.createEncryptedChatRoom = corePreferences.forceEndToEndEncryptedChat || viewModel.isEncrypted.value == true val list = arrayListOf
() for (participant in viewModel.participants.value.orEmpty()) { diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomCreationViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomCreationViewModel.kt index 98b18b56c..579911067 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomCreationViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/ChatRoomCreationViewModel.kt @@ -41,7 +41,9 @@ class ChatRoomCreationViewModel : ContactsSelectionViewModel() { val waitForChatRoomCreation = MutableLiveData() - val secureChatAvailable: Boolean = LinphoneUtils.isEndToEndEncryptedChatAvailable() + val secureChatAvailable = MutableLiveData() + + val secureChatMandatory: Boolean = corePreferences.forceEndToEndEncryptedChat private val listener = object : ChatRoomListenerStub() { override fun onStateChanged(room: ChatRoom, state: ChatRoom.State) { @@ -59,11 +61,16 @@ class ChatRoomCreationViewModel : ContactsSelectionViewModel() { init { createGroupChat.value = false - isEncrypted.value = false + isEncrypted.value = secureChatMandatory waitForChatRoomCreation.value = false + secureChatAvailable.value = LinphoneUtils.isEndToEndEncryptedChatAvailable() } fun updateEncryption(encrypted: Boolean) { + if (!encrypted && secureChatMandatory) { + Log.w("[Chat Room Creation] Something tries to force plain text chat room even if secureChatMandatory is enabled!") + return + } isEncrypted.value = encrypted } @@ -80,7 +87,7 @@ class ChatRoomCreationViewModel : ContactsSelectionViewModel() { return } - val encrypted = isEncrypted.value == true + val encrypted = secureChatMandatory || isEncrypted.value == true val params: ChatRoomParams = coreContext.core.createDefaultChatRoomParams() params.backend = ChatRoomBackend.Basic params.isGroupEnabled = false diff --git a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/GroupInfoViewModel.kt b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/GroupInfoViewModel.kt index ac464a44a..e308ec32e 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/viewmodels/GroupInfoViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/viewmodels/GroupInfoViewModel.kt @@ -99,7 +99,7 @@ class GroupInfoViewModel(val chatRoom: ChatRoom?) : MessageNotifierViewModel() { subject.value = chatRoom?.subject isMeAdmin.value = chatRoom == null || (chatRoom.me?.isAdmin == true && !chatRoom.isReadOnly) canLeaveGroup.value = chatRoom != null && !chatRoom.isReadOnly - isEncrypted.value = chatRoom?.hasCapability(ChatRoomCapabilities.Encrypted.toInt()) + isEncrypted.value = corePreferences.forceEndToEndEncryptedChat || chatRoom?.hasCapability(ChatRoomCapabilities.Encrypted.toInt()) == true if (chatRoom != null) updateParticipants() @@ -117,9 +117,9 @@ class GroupInfoViewModel(val chatRoom: ChatRoom?) : MessageNotifierViewModel() { fun createChatRoom() { waitForChatRoomCreation.value = true val params: ChatRoomParams = coreContext.core.createDefaultChatRoomParams() - params.isEncryptionEnabled = isEncrypted.value == true + params.isEncryptionEnabled = corePreferences.forceEndToEndEncryptedChat || isEncrypted.value == true params.isGroupEnabled = true - if (isEncrypted.value == true) { + if (params.isEncryptionEnabled) { params.ephemeralMode = if (corePreferences.useEphemeralPerDeviceMode) ChatRoomEphemeralMode.DeviceManaged else diff --git a/app/src/main/java/org/linphone/activities/main/contact/data/ContactNumberOrAddressData.kt b/app/src/main/java/org/linphone/activities/main/contact/data/ContactNumberOrAddressData.kt index fb5ed0d79..93f709d5e 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/data/ContactNumberOrAddressData.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/data/ContactNumberOrAddressData.kt @@ -35,6 +35,8 @@ class ContactNumberOrAddressData( val chatAllowed = !corePreferences.disableChat + val hidePlainChat = corePreferences.forceEndToEndEncryptedChat + fun startCall() { address ?: return listener.onCall(address) diff --git a/app/src/main/java/org/linphone/activities/main/history/viewmodels/CallLogViewModel.kt b/app/src/main/java/org/linphone/activities/main/history/viewmodels/CallLogViewModel.kt index e8a1ff40a..5d6ed9416 100644 --- a/app/src/main/java/org/linphone/activities/main/history/viewmodels/CallLogViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/history/viewmodels/CallLogViewModel.kt @@ -99,6 +99,8 @@ class CallLogViewModel(val callLog: CallLog, private val isRelated: Boolean = fa val chatAllowed = !corePreferences.disableChat + val hidePlainChat = corePreferences.forceEndToEndEncryptedChat + val secureChatAllowed = LinphoneUtils.isEndToEndEncryptedChatAvailable() && (contact.value?.getPresenceModelForUriOrTel(peerSipUri)?.hasCapability(FriendCapability.LimeX3Dh) ?: false) val relatedCallLogs = MutableLiveData>() diff --git a/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt b/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt index 3e3d0f5b7..9db0a6c70 100644 --- a/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt @@ -22,6 +22,7 @@ package org.linphone.activities.main.viewmodels import android.net.Uri import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.activities.main.history.data.GroupedCallLogData import org.linphone.core.* import org.linphone.utils.Event @@ -59,7 +60,7 @@ class SharedMainViewModel : ViewModel() { val contentToOpen = MutableLiveData() - var createEncryptedChatRoom: Boolean = false + var createEncryptedChatRoom: Boolean = corePreferences.forceEndToEndEncryptedChat val chatRoomParticipants = MutableLiveData>() diff --git a/app/src/main/java/org/linphone/core/CorePreferences.kt b/app/src/main/java/org/linphone/core/CorePreferences.kt index c86c7b111..0e9794e39 100644 --- a/app/src/main/java/org/linphone/core/CorePreferences.kt +++ b/app/src/main/java/org/linphone/core/CorePreferences.kt @@ -455,6 +455,9 @@ class CorePreferences constructor(private val context: Context) { val disableChat: Boolean get() = config.getBool("app", "disable_chat_feature", false) + val forceEndToEndEncryptedChat: Boolean + get() = config.getBool("app", "force_lime_chat_rooms", false) + // This will prevent UI from showing up, except for the launcher & the foreground service notification val preventInterfaceFromShowingUp: Boolean get() = config.getBool("app", "keep_app_invisible", false) diff --git a/app/src/main/res/layout/chat_room_creation_fragment.xml b/app/src/main/res/layout/chat_room_creation_fragment.xml index d35e61cb2..b9a14c5f5 100644 --- a/app/src/main/res/layout/chat_room_creation_fragment.xml +++ b/app/src/main/res/layout/chat_room_creation_fragment.xml @@ -42,7 +42,7 @@ android:src="@drawable/back" /> + android:contentDescription="@string/content_description_start_chat" + android:onClick="@{() -> viewModel.startChat(false)}" + android:src="@drawable/chat_start_default" + android:visibility="@{viewModel.chatAllowed && !viewModel.hidePlainChat ? View.VISIBLE : View.GONE}" />