From 3dc89c8d879cccc8309fc60a1f75d50a51da4405 Mon Sep 17 00:00:00 2001 From: Valere Date: Thu, 13 Feb 2020 12:45:42 +0100 Subject: [PATCH] Update Self Verification BottomSheet for quads --- .../crosssigning/CrossSigningService.kt | 2 + .../DefaultCrossSigningService.kt | 9 ++++- .../internal/crypto/store/IMXCryptoStore.kt | 2 + .../crypto/store/db/RealmCryptoStore.kt | 18 +++++++++ .../DefaultQrCodeVerificationTransaction.kt | 21 +++++++---- .../crypto/verification/VerificationAction.kt | 1 + .../verification/VerificationBottomSheet.kt | 22 ++++++++--- .../VerificationBottomSheetViewModel.kt | 15 +++++--- .../request/VerificationRequestController.kt | 26 ++++++++++++- .../request/VerificationRequestFragment.kt | 7 ++++ .../riotx/features/home/HomeActivity.kt | 37 ++----------------- .../features/navigation/DefaultNavigator.kt | 8 +--- .../res/layout/bottom_sheet_verification.xml | 2 +- vector/src/main/res/values-eu/strings.xml | 1 - vector/src/main/res/values-fr/strings.xml | 1 - vector/src/main/res/values-hu/strings.xml | 1 - vector/src/main/res/values-it/strings.xml | 1 - vector/src/main/res/values-sq/strings.xml | 1 - vector/src/main/res/values-zh-rTW/strings.xml | 1 - vector/src/main/res/values/strings.xml | 3 +- vector/src/main/res/values/strings_riotX.xml | 3 ++ 21 files changed, 112 insertions(+), 70 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/crypto/crosssigning/CrossSigningService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/crypto/crosssigning/CrossSigningService.kt index b7bc20a1dc..7bec095b86 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/crypto/crosssigning/CrossSigningService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/crypto/crosssigning/CrossSigningService.kt @@ -53,6 +53,8 @@ interface CrossSigningService { fun trustUser(otherUserId: String, callback: MatrixCallback) + fun markMyMasterKeyAsTrusted() + /** * Sign one of your devices and upload the signature */ diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/crosssigning/DefaultCrossSigningService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/crosssigning/DefaultCrossSigningService.kt index 7fc3c0a549..55f7b260a1 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/crosssigning/DefaultCrossSigningService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/crosssigning/DefaultCrossSigningService.kt @@ -374,7 +374,9 @@ internal class DefaultCrossSigningService @Inject constructor( ?.fromBase64NoPadding() var isMaterKeyTrusted = false - if (masterPrivateKey != null) { + if (myMasterKey.trustLevel?.locallyVerified == true) { + isMaterKeyTrusted = true + } else if (masterPrivateKey != null) { // Check if private match public var olmPkSigning: OlmPkSigning? = null try { @@ -507,6 +509,11 @@ internal class DefaultCrossSigningService @Inject constructor( }.executeBy(taskExecutor) } + override fun markMyMasterKeyAsTrusted() { + cryptoStore.markMyMasterKeyAsLocallyTrusted(true) + checkSelfTrust() + } + override fun signDevice(deviceId: String, callback: MatrixCallback) { // This device should be yours val device = cryptoStore.getUserDevice(userId, deviceId) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/IMXCryptoStore.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/IMXCryptoStore.kt index 7262eb5bb1..53950e0fcc 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/IMXCryptoStore.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/IMXCryptoStore.kt @@ -413,6 +413,8 @@ internal interface IMXCryptoStore { fun getLiveCrossSigningInfo(userId: String) : LiveData> fun setCrossSigningInfo(userId: String, info: MXCrossSigningInfo?) + fun markMyMasterKeyAsLocallyTrusted(trusted: Boolean) + fun storePrivateKeysInfo(msk: String?, usk: String?, ssk: String?) fun getCrossSigningPrivateKeys() : PrivateKeysInfo? diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/RealmCryptoStore.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/RealmCryptoStore.kt index 8552868252..53a2a99332 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/RealmCryptoStore.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/RealmCryptoStore.kt @@ -1094,6 +1094,24 @@ internal class RealmCryptoStore @Inject constructor( } } + override fun markMyMasterKeyAsLocallyTrusted(trusted: Boolean) { + doRealmTransaction(realmConfiguration) { realm -> + realm.where().findFirst()?.userId?.let { myUserId -> + CrossSigningInfoEntity.get(realm, myUserId)?.getMasterKey()?.let { xInfoEntity -> + val level = xInfoEntity.trustLevelEntity + if (level == null) { + val newLevel = realm.createObject(TrustLevelEntity::class.java) + newLevel.locallyVerified = trusted + xInfoEntity.trustLevelEntity = newLevel + } else { + level.locallyVerified = trusted + } + } + + } + } + } + private fun addOrUpdateCrossSigningInfo(realm: Realm, userId: String, info: MXCrossSigningInfo?): CrossSigningInfoEntity? { var existing = CrossSigningInfoEntity.get(realm, userId) if (info == null) { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/qrcode/DefaultQrCodeVerificationTransaction.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/qrcode/DefaultQrCodeVerificationTransaction.kt index 743100ee45..53ad1b0ab2 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/qrcode/DefaultQrCodeVerificationTransaction.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/qrcode/DefaultQrCodeVerificationTransaction.kt @@ -222,14 +222,19 @@ internal class DefaultQrCodeVerificationTransaction( private fun trust(canTrustOtherUserMasterKey: Boolean, toVerifyDeviceIds: List) { // If not me sign his MSK and upload the signature - if (otherUserId != userId && canTrustOtherUserMasterKey) { - // we should trust this master key - // And check verification MSK -> SSK? - crossSigningService.trustUser(otherUserId, object : MatrixCallback { - override fun onFailure(failure: Throwable) { - Timber.e(failure, "## QR Verification: Failed to trust User $otherUserId") - } - }) + if (canTrustOtherUserMasterKey) { + if (otherUserId != userId ) { + // we should trust this master key + // And check verification MSK -> SSK? + crossSigningService.trustUser(otherUserId, object : MatrixCallback { + override fun onFailure(failure: Throwable) { + Timber.e(failure, "## QR Verification: Failed to trust User $otherUserId") + } + }) + } else { + //Mark my keys as trusted locally + crossSigningService.markMyMasterKeyAsTrusted() + } } if (otherUserId == userId) { diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationAction.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationAction.kt index 74c85a75c6..111328b0b1 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationAction.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationAction.kt @@ -28,4 +28,5 @@ sealed class VerificationAction : VectorViewModelAction { data class SASMatchAction(val otherUserId: String, val sasTransactionId: String) : VerificationAction() data class SASDoNotMatchAction(val otherUserId: String, val sasTransactionId: String) : VerificationAction() object GotItConclusion : VerificationAction() + object SkipVerification : VerificationAction() } diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt index 75983a1969..554344b06f 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt @@ -29,6 +29,7 @@ import butterknife.BindView import com.airbnb.mvrx.MvRx import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState +import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.crypto.sas.VerificationTxState import im.vector.riotx.R import im.vector.riotx.core.di.ScreenComponent @@ -54,8 +55,8 @@ class VerificationBottomSheet : VectorBaseBottomSheetDialogFragment() { val otherUserId: String, val verificationId: String? = null, val roomId: String? = null, - // Special mode where UX should show loading wheel until other user sends a request/tx - val waitForIncomingRequest: Boolean = false + // Special mode where UX should show loading wheel until other session sends a request/tx + val selfVerificationMode: Boolean = false ) : Parcelable @Inject @@ -183,7 +184,7 @@ class VerificationBottomSheet : VectorBaseBottomSheetDialogFragment() { } // If it's an outgoing - if (state.pendingRequest.invoke() == null || state.pendingRequest.invoke()?.isIncoming == false || state.waitForOtherUserMode) { + if (state.pendingRequest.invoke() == null || state.pendingRequest.invoke()?.isIncoming == false || state.selfVerificationMode) { Timber.v("## SAS show bottom sheet for outgoing request") if (state.pendingRequest.invoke()?.isReady == true) { Timber.v("## SAS show bottom sheet for outgoing and ready request") @@ -230,14 +231,25 @@ class VerificationBottomSheet : VectorBaseBottomSheetDialogFragment() { } companion object { - fun withArgs(roomId: String?, otherUserId: String, transactionId: String? = null, waitForIncomingRequest: Boolean = false): VerificationBottomSheet { + fun withArgs(roomId: String?, otherUserId: String, transactionId: String? = null): VerificationBottomSheet { return VerificationBottomSheet().apply { arguments = Bundle().apply { putParcelable(MvRx.KEY_ARG, VerificationArgs( otherUserId = otherUserId, roomId = roomId, verificationId = transactionId, - waitForIncomingRequest = waitForIncomingRequest + selfVerificationMode = false + )) + } + } + } + + fun forSelfVerification(session: Session) : VerificationBottomSheet{ + return VerificationBottomSheet().apply { + arguments = Bundle().apply { + putParcelable(MvRx.KEY_ARG, VerificationArgs( + otherUserId = session.myUserId, + selfVerificationMode = true )) } } diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt index 343f58b20c..7ae3cf29eb 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt @@ -52,7 +52,7 @@ data class VerificationBottomSheetViewState( val qrTransactionState: VerificationTxState? = null, val transactionId: String? = null, // true when we display the loading and we wait for the other (incoming request) - val waitForOtherUserMode: Boolean = false, + val selfVerificationMode: Boolean = false, val isMe: Boolean = false ) : MvRxState @@ -67,10 +67,10 @@ class VerificationBottomSheetViewModel @AssistedInject constructor(@Assisted ini val userItem = session.getUser(args.otherUserId) - val isWaitingForOtherMode = args.waitForIncomingRequest + val selfVerificationMode = args.selfVerificationMode var autoReady = false - val pr = if (isWaitingForOtherMode) { + val pr = if (selfVerificationMode) { // See if active tx for this user and take it session.cryptoService().verificationService().getExistingVerificationRequest(args.otherUserId) @@ -100,7 +100,7 @@ class VerificationBottomSheetViewModel @AssistedInject constructor(@Assisted ini qrTransactionState = qrTx?.state, transactionId = pr?.transactionId ?: args.verificationId, pendingRequest = if (pr != null) Success(pr) else Uninitialized, - waitForOtherUserMode = isWaitingForOtherMode, + selfVerificationMode = selfVerificationMode, roomId = args.roomId, isMe = args.otherUserId == session.myUserId ) @@ -250,6 +250,9 @@ class VerificationBottomSheetViewModel @AssistedInject constructor(@Assisted ini is VerificationAction.GotItConclusion -> { _viewEvents.post(VerificationBottomSheetViewEvents.Dismiss) } + is VerificationAction.SkipVerification -> { + _viewEvents.post(VerificationBottomSheetViewEvents.Dismiss) + } }.exhaustive } @@ -258,7 +261,7 @@ class VerificationBottomSheetViewModel @AssistedInject constructor(@Assisted ini } override fun transactionUpdated(tx: VerificationTransaction) = withState { state -> - if (state.waitForOtherUserMode && state.transactionId == null) { + if (state.selfVerificationMode && state.transactionId == null) { // is this an incoming with that user if (tx.isIncoming && tx.otherUserId == state.otherUserMxItem?.id) { // Also auto accept incoming if needed! @@ -308,7 +311,7 @@ class VerificationBottomSheetViewModel @AssistedInject constructor(@Assisted ini override fun verificationRequestUpdated(pr: PendingVerificationRequest) = withState { state -> - if (state.waitForOtherUserMode && state.pendingRequest.invoke() == null && state.transactionId == null) { + if (state.selfVerificationMode && state.pendingRequest.invoke() == null && state.transactionId == null) { // is this an incoming with that user if (pr.isIncoming && pr.otherUserId == state.otherUserMxItem?.id) { if (!pr.isReady) { diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/request/VerificationRequestController.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/request/VerificationRequestController.kt index 9c4a5a870f..dbf4359624 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/request/VerificationRequestController.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/request/VerificationRequestController.kt @@ -50,7 +50,7 @@ class VerificationRequestController @Inject constructor( val state = viewState ?: return val matrixItem = viewState?.otherUserMxItem ?: return - if (state.waitForOtherUserMode) { + if (state.selfVerificationMode) { bottomSheetVerificationNoticeItem { id("notice") notice(stringProvider.getString(R.string.verification_open_other_to_verify)) @@ -62,8 +62,28 @@ class VerificationRequestController @Inject constructor( bottomSheetVerificationWaitingItem { id("waiting") - title(stringProvider.getString(R.string.verification_request_waiting_for, matrixItem.getBestName())) + title(stringProvider.getString(R.string.verification_request_waiting, matrixItem.getBestName())) } + + bottomSheetVerificationActionItem { + id("passphrase") + title(stringProvider.getString(R.string.verification_cannot_access_other_session)) + titleColor(colorProvider.getColorFromAttribute(R.attr.riotx_text_primary)) + subTitle(stringProvider.getString(R.string.verification_use_passphrase)) + iconRes(R.drawable.ic_arrow_right) + iconColor(colorProvider.getColorFromAttribute(R.attr.riotx_text_primary)) + listener { listener?.onClickRecoverFromPassphrase() } + } + bottomSheetVerificationActionItem { + id("skip") + title(stringProvider.getString(R.string.skip)) + titleColor(colorProvider.getColor(R.color.riotx_destructive_accent)) +// subTitle(stringProvider.getString(R.string.verification_use_passphrase)) + iconRes(R.drawable.ic_arrow_right) + iconColor(colorProvider.getColor(R.color.riotx_destructive_accent)) + listener { listener?.onClickDismiss() } + } + } else { val styledText = matrixItem.let { stringProvider.getString(R.string.verification_request_notice, it.id) @@ -112,5 +132,7 @@ class VerificationRequestController @Inject constructor( interface Listener { fun onClickOnVerificationStart() + fun onClickRecoverFromPassphrase() + fun onClickDismiss() } } diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/request/VerificationRequestFragment.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/request/VerificationRequestFragment.kt index 8231242d08..0cc7a2beab 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/request/VerificationRequestFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/request/VerificationRequestFragment.kt @@ -61,4 +61,11 @@ class VerificationRequestFragment @Inject constructor( viewModel.handle(VerificationAction.RequestVerificationByDM(otherUserId, state.roomId)) } } + + override fun onClickRecoverFromPassphrase() { + } + + override fun onClickDismiss() { + viewModel.handle(VerificationAction.SkipVerification) + } } diff --git a/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt index 2eac4e946e..55e217670e 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt @@ -145,41 +145,12 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable { val crossSigningEnabledOnAccount = myCrossSigningKeys != null if (crossSigningEnabledOnAccount && myCrossSigningKeys?.isTrusted() == false) { + // We need to ask sharedActionViewModel.hasDisplayedCompleteSecurityPrompt = true - PopupAlertManager.postVectorAlert( - PopupAlertManager.VectorAlert( - uid = "completeSecurity", - title = getString(R.string.crosssigning_verify_this_session), - description = getString(R.string.crosssigning_other_user_not_trust), - iconId = R.drawable.ic_shield_warning - ).apply { - colorInt = ContextCompat.getColor(this@HomeActivity, R.color.riotx_positive_accent) - contentAction = Runnable { - Runnable { - (weakCurrentActivity?.get() as? VectorBaseActivity)?.let { - it.navigator.waitSessionVerification(it) - } - } - } - dismissedAction = Runnable { - // tx.cancel() - } - addButton( - getString(R.string.later), - Runnable { - } - ) - addButton( - getString(R.string.verification_profile_verify), - Runnable { - (weakCurrentActivity?.get() as? VectorBaseActivity)?.let { - it.navigator.waitSessionVerification(it) - } - } - ) - } - ) + navigator.waitSessionVerification(this) + } else { + // TODO upgrade security -> bootstrap cross signing } } diff --git a/vector/src/main/java/im/vector/riotx/features/navigation/DefaultNavigator.kt b/vector/src/main/java/im/vector/riotx/features/navigation/DefaultNavigator.kt index 2925c3cefe..1bd30f0f25 100644 --- a/vector/src/main/java/im/vector/riotx/features/navigation/DefaultNavigator.kt +++ b/vector/src/main/java/im/vector/riotx/features/navigation/DefaultNavigator.kt @@ -95,12 +95,8 @@ class DefaultNavigator @Inject constructor( override fun waitSessionVerification(context: Context) { val session = sessionHolder.getSafeActiveSession() ?: return if (context is VectorBaseActivity) { - VerificationBottomSheet.withArgs( - roomId = null, - otherUserId = session.myUserId, - waitForIncomingRequest = true - - ).show(context.supportFragmentManager, VerificationBottomSheet.WAITING_SELF_VERIF_TAG) + VerificationBottomSheet.forSelfVerification(session) + .show(context.supportFragmentManager, VerificationBottomSheet.WAITING_SELF_VERIF_TAG) } } diff --git a/vector/src/main/res/layout/bottom_sheet_verification.xml b/vector/src/main/res/layout/bottom_sheet_verification.xml index 7ed760b45a..6e4a952e69 100644 --- a/vector/src/main/res/layout/bottom_sheet_verification.xml +++ b/vector/src/main/res/layout/bottom_sheet_verification.xml @@ -60,7 +60,7 @@ android:id="@+id/bottomSheetFragmentContainer" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="16dp" + android:layout_marginTop="8dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/verificationRequestAvatar" /> diff --git a/vector/src/main/res/values-eu/strings.xml b/vector/src/main/res/values-eu/strings.xml index 86fb1e0e12..78c262c82a 100644 --- a/vector/src/main/res/values-eu/strings.xml +++ b/vector/src/main/res/values-eu/strings.xml @@ -2140,7 +2140,6 @@ Abisua: Fitxategi hau ezabatu daiteke aplikazioa desinstalatzen bada. %d saio aktibo - Egiaztatu saio hau Beste erabiltzaile batzuk ez fidagarritzat jo lezakete Bete segurtasuna diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml index 959266b9b7..71178e2531 100644 --- a/vector/src/main/res/values-fr/strings.xml +++ b/vector/src/main/res/values-fr/strings.xml @@ -2148,7 +2148,6 @@ Si vous n’avez pas configuré de nouvelle méthode de récupération, un attaq %d sessions actives - Vérifier cette session Les autres utilisateurs ne lui font peut-être pas confiance Compléter la sécurité diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml index 64eee79075..13566f4ce9 100644 --- a/vector/src/main/res/values-hu/strings.xml +++ b/vector/src/main/res/values-hu/strings.xml @@ -2143,7 +2143,6 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró %d munkamenet használatban - Munkamenet ellenőrzése Más felhasználók lehet, hogy nem bíznak benne Biztonság beállítása diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml index 4d1ac8edaf..a29ff4ae98 100644 --- a/vector/src/main/res/values-it/strings.xml +++ b/vector/src/main/res/values-it/strings.xml @@ -2193,7 +2193,6 @@ %d sessioni attive - Verifica questa sessione Gli altri utenti potrebbero non fidarsi Completa la sicurezza diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml index a8af77d59b..b21a9ad800 100644 --- a/vector/src/main/res/values-sq/strings.xml +++ b/vector/src/main/res/values-sq/strings.xml @@ -2062,7 +2062,6 @@ Që të garantoni se s’ju shpëton gjë, thjesht mbajeni të aktivizuar mekani %d sesione aktive - Verifikoni këtë sesion Përdorues të tjerë mund të mos e besojnë Siguri e Plotë diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml index d285c364b2..fbe47a5053 100644 --- a/vector/src/main/res/values-zh-rTW/strings.xml +++ b/vector/src/main/res/values-zh-rTW/strings.xml @@ -2093,7 +2093,6 @@ Matrix 中的消息可見度類似于電子郵件。我們忘記您的郵件意 %d 活躍的工作階段 - 驗證此工作階段 其他使用者可能不會信任它 全面的安全性 diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 29fff11230..6c2caedd01 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -2121,11 +2121,10 @@ Not all features in Riot are implemented in RiotX yet. Main missing (and coming %d active sessions - Verify this session Other users may not trust it Complete Security - Open an existing session & use it to verify this one, granting it access to encrypted messages. If you can’t access one, use your recovery key or passphrase. + Open an existing session & use it to verify this one, granting it access to encrypted messages. Verify diff --git a/vector/src/main/res/values/strings_riotX.xml b/vector/src/main/res/values/strings_riotX.xml index 402c65e95f..082ce235bb 100644 --- a/vector/src/main/res/values/strings_riotX.xml +++ b/vector/src/main/res/values/strings_riotX.xml @@ -18,6 +18,9 @@ Selected Option Creates a simple poll + + Can‘t access an existing session? + Use your recovery key or passphrase