Fix #514
authorAjay Bura <ajbura@gmail.com>
Sun, 1 May 2022 15:26:30 +0000 (20:56 +0530)
committerAjay Bura <ajbura@gmail.com>
Sun, 1 May 2022 15:26:30 +0000 (20:56 +0530)
src/app/organisms/emoji-verification/EmojiVerification.jsx
src/app/organisms/settings/KeyBackup.jsx

index f56a4672c25b2cf34e7444a2327222acfe402a2d..d1d332565aeb2968638c1ebf44fa851baa0aa74e 100644 (file)
@@ -7,6 +7,8 @@ import { twemojify } from '../../../util/twemojify';
 import initMatrix from '../../../client/initMatrix';
 import cons from '../../../client/state/cons';
 import navigation from '../../../client/state/navigation';
+import { hasPrivateKey } from '../../../client/state/secretStorageKeys';
+import { getDefaultSSKey, isCrossVerified } from '../../../util/matrixUtil';
 
 import Text from '../../atoms/text/Text';
 import IconButton from '../../atoms/button/IconButton';
@@ -16,35 +18,61 @@ import Dialog from '../../molecules/dialog/Dialog';
 
 import CrossIC from '../../../../public/res/ic/outlined/cross.svg';
 import { useStore } from '../../hooks/useStore';
+import { accessSecretStorage } from '../settings/SecretStorageAccess';
 
 function EmojiVerificationContent({ request, requestClose }) {
   const [sas, setSas] = useState(null);
   const [process, setProcess] = useState(false);
+  const mx = initMatrix.matrixClient;
   const mountStore = useStore();
-  mountStore.setItem(true);
-
-  const handleChange = () => {
-    if (request.done || request.cancelled) requestClose();
-  };
 
   useEffect(() => {
     mountStore.setItem(true);
+    const handleChange = () => {
+      if (request.done || request.cancelled) requestClose();
+    };
+
     if (request === null) return null;
     const req = request;
     req.on('change', handleChange);
-    return () => req.off('change', handleChange);
+    return () => {
+      req.off('change', handleChange);
+      if (!req.cancelled && !req.done) {
+        req.cancel();
+      }
+    };
   }, [request]);
 
   const acceptRequest = async () => {
+    if (isCrossVerified(mx.deviceId) && !hasPrivateKey(getDefaultSSKey())) {
+      const keyData = await accessSecretStorage('Session verification');
+      if (!keyData) {
+        request.cancel();
+        return;
+      }
+    }
     setProcess(true);
     await request.accept();
 
-    const verifier = request.beginKeyVerification('m.sas.v1');
-    verifier.on('show_sas', (data) => {
+    let targetDevice;
+    try {
+      targetDevice = request.targetDevice;
+    } catch {
+      targetDevice = {
+        userId: mx.getUserId(),
+        deviceId: request.channel.devices[0],
+      };
+    }
+
+    const verifier = request.beginKeyVerification('m.sas.v1', targetDevice);
+
+    const handleVerifier = (data) => {
+      verifier.off('show_sas', handleVerifier);
       if (!mountStore.getItem()) return;
       setSas(data);
       setProcess(false);
-    });
+    };
+    verifier.on('show_sas', handleVerifier);
     await verifier.verify();
   };
 
@@ -70,8 +98,9 @@ function EmojiVerificationContent({ request, requestClose }) {
       <div className="emoji-verification__content">
         <Text>Confirm the emoji below are displayed on both devices, in the same order:</Text>
         <div className="emoji-verification__emojis">
-          {sas.sas.emoji.map((emoji) => (
-            <div className="emoji-verification__emoji-block" key={emoji[1]}>
+          {sas.sas.emoji.map((emoji, i) => (
+            // eslint-disable-next-line react/no-array-index-key
+            <div className="emoji-verification__emoji-block" key={`${emoji[1]}-${i}`}>
               <Text variant="h1">{twemojify(emoji[0])}</Text>
               <Text>{emoji[1]}</Text>
             </div>
index 5d2f4ed7ac67c7e3a2f98fd9b67c47ab47ed5588..75f032bc32f52fe8ea2826a2e2f93e974e848318 100644 (file)
@@ -159,9 +159,9 @@ function DeleteKeyBackupDialog({ requestClose }) {
   const [isDeleting, setIsDeleting] = useState(false);
   const mx = initMatrix.matrixClient;
   const mountStore = useStore();
-  mountStore.setItem(true);
 
   const deleteBackup = async () => {
+    mountStore.setItem(true);
     setIsDeleting(true);
     try {
       const backupInfo = await mx.getKeyBackupVersion();