From a7bf19dc91d85f88df306812efc465eee3b7b8ad Mon Sep 17 00:00:00 2001 From: yostyle Date: Wed, 1 Mar 2023 19:07:33 +0100 Subject: [PATCH 1/4] Update member shield --- .../session/crypto/model/CryptoDeviceInfo.kt | 3 ++ .../devices/DeviceListBottomSheetViewModel.kt | 2 + .../devices/DeviceListEpoxyController.kt | 39 ++++++++++++++++--- .../devices/DeviceTrustInfoEpoxyController.kt | 26 +++++++++++-- 4 files changed, 60 insertions(+), 10 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/CryptoDeviceInfo.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/CryptoDeviceInfo.kt index 418b1e6ce33..a1c5866fffd 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/CryptoDeviceInfo.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/CryptoDeviceInfo.kt @@ -34,6 +34,9 @@ data class CryptoDeviceInfo( val isVerified: Boolean get() = trustLevel?.isVerified() == true + val isCrossSigningVerified: Boolean + get() = trustLevel?.isCrossSigningVerified() == true + val isUnknown: Boolean get() = trustLevel == null diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt index eb23c5654ea..683e4b4945c 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt @@ -45,6 +45,7 @@ data class DeviceListViewState( val allowDeviceAction: Boolean, val userItem: MatrixItem? = null, val memberCrossSigningKey: MXCrossSigningInfo? = null, + val myDeviceId: String = "", val cryptoDevices: Async> = Loading(), val selectedDevice: CryptoDeviceInfo? = null ) : MavericksState @@ -70,6 +71,7 @@ class DeviceListBottomSheetViewModel @AssistedInject constructor( userId = userId, allowDeviceAction = args.allowDeviceAction, userItem = session.getUserOrDefault(userId).toMatrixItem(), + myDeviceId = session.sessionParams.deviceId ?: "", ) } } diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListEpoxyController.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListEpoxyController.kt index 995de365ebb..c03c2e3b1ad 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListEpoxyController.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListEpoxyController.kt @@ -32,9 +32,13 @@ import im.vector.app.core.ui.list.genericItem import im.vector.app.core.ui.list.genericWithValueItem import im.vector.app.core.utils.DimensionConverter import im.vector.app.features.settings.VectorPreferences +import im.vector.app.features.settings.devices.TrustUtils import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence import me.gujun.android.span.span +import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo +import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel +import org.matrix.android.sdk.api.session.crypto.model.UserVerificationLevel import javax.inject.Inject class DeviceListEpoxyController @Inject constructor( @@ -68,10 +72,20 @@ class DeviceListEpoxyController @Inject constructor( it.isVerified } + val trustMSK = data.memberCrossSigningKey?.isTrusted().orFalse() + val legacyMode = data.memberCrossSigningKey == null + // Build top header - val allGreen = deviceList.fold(true, { prev, device -> - prev && device.isVerified - }) + val allGreen = deviceList.fold(true) { prev, device -> + val trustLevel = TrustUtils.shieldForTrust( + data.myDeviceId == device.deviceId, + trustMSK, + legacyMode, + device.trustLevel + ) + + prev && trustLevel == RoomEncryptionTrustLevel.Trusted + } genericItem { id("title") @@ -105,8 +119,21 @@ class DeviceListEpoxyController @Inject constructor( // Build list of device with status deviceList.forEach { device -> genericWithValueItem { + val trustLevel = TrustUtils.shieldForTrust( + data.myDeviceId == device.deviceId, + trustMSK, + legacyMode, + device.trustLevel + ) + val shield = when (trustLevel) { + RoomEncryptionTrustLevel.Default -> R.drawable.ic_shield_unknown + RoomEncryptionTrustLevel.Warning -> R.drawable.ic_shield_warning + RoomEncryptionTrustLevel.Trusted -> R.drawable.ic_shield_trusted + RoomEncryptionTrustLevel.E2EWithUnsupportedAlgorithm -> R.drawable.ic_warning_badge + } + id(device.deviceId) - titleIconResourceId(if (device.isVerified) R.drawable.ic_shield_trusted else R.drawable.ic_shield_warning) + titleIconResourceId(shield) apply { val title = if (host.vectorPreferences.developerMode()) { val seq = span { @@ -126,12 +153,12 @@ class DeviceListEpoxyController @Inject constructor( } value( host.stringProvider.getString( - if (device.isVerified) R.string.trusted else R.string.not_trusted + if (trustLevel == RoomEncryptionTrustLevel.Trusted) R.string.trusted else R.string.not_trusted ) ) valueColorInt( host.colorProvider.getColorFromAttribute( - if (device.isVerified) R.attr.colorPrimary else R.attr.colorError + if (trustLevel == RoomEncryptionTrustLevel.Trusted) R.attr.colorPrimary else R.attr.colorError ) ) itemClickAction { diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceTrustInfoEpoxyController.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceTrustInfoEpoxyController.kt index 569a7f980cd..20c388dd95a 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceTrustInfoEpoxyController.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceTrustInfoEpoxyController.kt @@ -27,9 +27,12 @@ import im.vector.app.core.ui.list.genericWithValueItem import im.vector.app.core.utils.DimensionConverter import im.vector.app.features.crypto.verification.epoxy.bottomSheetVerificationActionItem import im.vector.app.features.settings.VectorPreferences +import im.vector.app.features.settings.devices.TrustUtils import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence import me.gujun.android.span.span +import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo +import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel import javax.inject.Inject class DeviceTrustInfoEpoxyController @Inject constructor( @@ -49,11 +52,26 @@ class DeviceTrustInfoEpoxyController @Inject constructor( override fun buildModels(data: DeviceListViewState?) { val host = this data?.selectedDevice?.let { cryptoDeviceInfo -> - val isVerified = cryptoDeviceInfo.trustLevel?.isVerified() == true + val trustMSK = data.memberCrossSigningKey?.isTrusted().orFalse() + val legacyMode = data.memberCrossSigningKey == null + val isMyDevice = data.myDeviceId == cryptoDeviceInfo.deviceId + val trustLevel = TrustUtils.shieldForTrust( + isMyDevice, + trustMSK, + legacyMode, + cryptoDeviceInfo.trustLevel + ) + val isVerified = trustLevel == RoomEncryptionTrustLevel.Trusted + val shield = when (trustLevel) { + RoomEncryptionTrustLevel.Default -> R.drawable.ic_shield_unknown + RoomEncryptionTrustLevel.Warning -> R.drawable.ic_shield_warning + RoomEncryptionTrustLevel.Trusted -> R.drawable.ic_shield_trusted + RoomEncryptionTrustLevel.E2EWithUnsupportedAlgorithm -> R.drawable.ic_warning_badge + } genericItem { id("title") style(ItemStyle.BIG_TEXT) - titleIconResourceId(if (isVerified) R.drawable.ic_shield_trusted else R.drawable.ic_shield_warning) + titleIconResourceId(shield) title( host.stringProvider .getString(if (isVerified) R.string.verification_profile_verified else R.string.verification_profile_warning) @@ -90,7 +108,7 @@ class DeviceTrustInfoEpoxyController @Inject constructor( genericWithValueItem { id(cryptoDeviceInfo.deviceId) - titleIconResourceId(if (isVerified) R.drawable.ic_shield_trusted else R.drawable.ic_shield_warning) + titleIconResourceId(shield) title( span { +(cryptoDeviceInfo.displayName() ?: "") @@ -103,7 +121,7 @@ class DeviceTrustInfoEpoxyController @Inject constructor( ) } - if (!isVerified) { + if (!isVerified && !isMyDevice) { genericFooterItem { id("warn") centered(false) From a3f6d702123e2d55efa91b61b7f1ee4a5c0279dc Mon Sep 17 00:00:00 2001 From: yostyle Date: Thu, 2 Mar 2023 10:34:15 +0100 Subject: [PATCH 2/4] Update shields of member devices --- .../roommemberprofile/RoomMemberProfileController.kt | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileController.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileController.kt index bdf2978ccad..9585e6aaa15 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileController.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileController.kt @@ -107,16 +107,10 @@ class RoomMemberProfileController @Inject constructor( // Cross signing is enabled for this user if (state.userMXCrossSigningInfo.isTrusted()) { // User is trusted - val icon = if (state.allDevicesAreTrusted) { - R.drawable.ic_shield_trusted + val (icon, titleRes) = if (state.allDevicesAreCrossSignedTrusted) { + Pair(R.drawable.ic_shield_trusted, R.string.verification_profile_verified) } else { - R.drawable.ic_shield_warning - } - - val titleRes = if (state.allDevicesAreTrusted) { - R.string.verification_profile_verified - } else { - R.string.verification_profile_warning + Pair(R.drawable.ic_shield_warning, R.string.verification_profile_warning) } buildProfileAction( From 566f54118d8dba5a5a429e2a322183a82447323c Mon Sep 17 00:00:00 2001 From: yostyle Date: Thu, 2 Mar 2023 11:03:59 +0100 Subject: [PATCH 3/4] Add changelog --- changelog.d/8195.change | 1 + .../roommemberprofile/devices/DeviceListEpoxyController.kt | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 changelog.d/8195.change diff --git a/changelog.d/8195.change b/changelog.d/8195.change new file mode 100644 index 00000000000..72da824aa14 --- /dev/null +++ b/changelog.d/8195.change @@ -0,0 +1 @@ +Update room member shields behavior diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListEpoxyController.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListEpoxyController.kt index c03c2e3b1ad..764268e6a5a 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListEpoxyController.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListEpoxyController.kt @@ -38,7 +38,6 @@ import me.gujun.android.span.span import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel -import org.matrix.android.sdk.api.session.crypto.model.UserVerificationLevel import javax.inject.Inject class DeviceListEpoxyController @Inject constructor( From cafc6be06085d5690601e04a4759b0ba12eda3aa Mon Sep 17 00:00:00 2001 From: yostyle Date: Thu, 2 Mar 2023 11:14:21 +0100 Subject: [PATCH 4/4] Fix changelog extension --- changelog.d/{8195.change => 8195.bugfix} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename changelog.d/{8195.change => 8195.bugfix} (100%) diff --git a/changelog.d/8195.change b/changelog.d/8195.bugfix similarity index 100% rename from changelog.d/8195.change rename to changelog.d/8195.bugfix