Browse Source

get secretkey on the fly when re-encrypting

master
PhilReact 1 week ago
parent
commit
540cb45d98
  1. 4
      src/components/Chat/ChatGroup.tsx
  2. 14
      src/components/Chat/ChatList.tsx
  3. 96
      src/components/Chat/CreateCommonSecret.tsx
  4. 5
      src/components/Group/Group.tsx

4
src/components/Chat/ChatGroup.tsx

@ -14,6 +14,7 @@ import { getBaseApiReactSocket, pauseAllQueues, resumeAllQueues } from '../../Ap
import { CustomizedSnackbars } from '../Snackbar/Snackbar' import { CustomizedSnackbars } from '../Snackbar/Snackbar'
import { PUBLIC_NOTIFICATION_CODE_FIRST_SECRET_KEY } from '../../constants/codes' import { PUBLIC_NOTIFICATION_CODE_FIRST_SECRET_KEY } from '../../constants/codes'
import { useMessageQueue } from '../../MessageQueueContext' import { useMessageQueue } from '../../MessageQueueContext'
import { executeEvent } from '../../utils/events'
@ -305,6 +306,9 @@ const clearEditorContent = () => {
} }
addToQueue(sendMessageFunc, messageObj, 'chat', addToQueue(sendMessageFunc, messageObj, 'chat',
selectedGroup ); selectedGroup );
setTimeout(() => {
executeEvent("sent-new-message-group", {})
}, 150);
clearEditorContent() clearEditorContent()
} }
// send chat message // send chat message

14
src/components/Chat/ChatList.tsx

@ -1,6 +1,7 @@
import React, { useCallback, useState, useEffect, useRef, useMemo } from 'react'; import React, { useCallback, useState, useEffect, useRef, useMemo } from 'react';
import { List, AutoSizer, CellMeasurerCache, CellMeasurer } from 'react-virtualized'; import { List, AutoSizer, CellMeasurerCache, CellMeasurer } from 'react-virtualized';
import { MessageItem } from './MessageItem'; import { MessageItem } from './MessageItem';
import { subscribeToEvent, unsubscribeFromEvent } from '../../utils/events';
const cache = new CellMeasurerCache({ const cache = new CellMeasurerCache({
fixedWidth: true, fixedWidth: true,
@ -70,6 +71,19 @@ export const ChatList = ({ initialMessages, myAddress, tempMessages }) => {
} }
}; };
const sentNewMessageGroupFunc = ()=> {
scrollToBottom()
}
useEffect(() => {
subscribeToEvent("sent-new-message-group", sentNewMessageGroupFunc);
return () => {
unsubscribeFromEvent("sent-new-message-group", sentNewMessageGroupFunc);
};
}, [messages]);
const rowRenderer = ({ index, key, parent, style }) => { const rowRenderer = ({ index, key, parent, style }) => {

96
src/components/Chat/CreateCommonSecret.tsx

@ -2,15 +2,95 @@ import { Box, Button, Typography } from '@mui/material'
import React, { useContext } from 'react' import React, { useContext } from 'react'
import { CustomizedSnackbars } from '../Snackbar/Snackbar'; import { CustomizedSnackbars } from '../Snackbar/Snackbar';
import { LoadingButton } from '@mui/lab'; import { LoadingButton } from '@mui/lab';
import { MyContext } from '../../App'; import { MyContext, getBaseApiReact, pauseAllQueues } from '../../App';
import { getFee } from '../../background'; import { getFee } from '../../background';
import { decryptResource, getGroupAdimns, validateSecretKey } from '../Group/Group';
import { base64ToUint8Array } from '../../qdn/encryption/group-encryption';
import { uint8ArrayToObject } from '../../backgroundFunctions/encryption';
export const CreateCommonSecret = ({groupId, secretKey, isOwner, myAddress, secretKeyDetails, userInfo, noSecretKey}) => { export const CreateCommonSecret = ({groupId, secretKey, isOwner, myAddress, secretKeyDetails, userInfo, noSecretKey}) => {
const { show, setTxList } = useContext(MyContext); const { show, setTxList } = useContext(MyContext);
const [openSnack, setOpenSnack] = React.useState(false); const [openSnack, setOpenSnack] = React.useState(false);
const [infoSnack, setInfoSnack] = React.useState(null); const [infoSnack, setInfoSnack] = React.useState(null);
const [isLoading, setIsLoading] = React.useState(false) const [isLoading, setIsLoading] = React.useState(false)
const getPublishesFromAdmins = async (admins: string[]) => {
// const validApi = await findUsableApi();
const queryString = admins.map((name) => `name=${name}`).join("&");
const url = `${getBaseApiReact()}/arbitrary/resources/search?mode=ALL&service=DOCUMENT_PRIVATE&identifier=symmetric-qchat-group-${
groupId
}&exactmatchnames=true&limit=0&reverse=true&${queryString}`;
const response = await fetch(url);
if(!response.ok){
throw new Error('network error')
}
const adminData = await response.json();
const filterId = adminData.filter(
(data: any) =>
data.identifier === `symmetric-qchat-group-${groupId}`
);
if (filterId?.length === 0) {
return false;
}
const sortedData = filterId.sort((a: any, b: any) => {
// Get the most recent date for both a and b
const dateA = a.updated ? new Date(a.updated) : new Date(a.created);
const dateB = b.updated ? new Date(b.updated) : new Date(b.created);
// Sort by most recent
return dateB.getTime() - dateA.getTime();
});
return sortedData[0];
};
const getSecretKey = async (loadingGroupParam?: boolean, secretKeyToPublish?: boolean) => {
try {
pauseAllQueues()
const groupAdmins = await getGroupAdimns(groupId);
if(!groupAdmins.length){
throw new Error('Network error')
}
const publish = await getPublishesFromAdmins(groupAdmins);
if (publish === false) {
return false;
}
const res = await fetch(
`${getBaseApiReact()}/arbitrary/DOCUMENT_PRIVATE/${publish.name}/${
publish.identifier
}?encoding=base64`
);
const data = await res.text();
const decryptedKey: any = await decryptResource(data);
const dataint8Array = base64ToUint8Array(decryptedKey.data);
const decryptedKeyToObject = uint8ArrayToObject(dataint8Array);
if (!validateSecretKey(decryptedKeyToObject))
throw new Error("SecretKey is not valid");
if (decryptedKeyToObject) {
return decryptedKeyToObject;
} else {
}
} catch (error) {
} finally {
}
};
const createCommonSecret = async ()=> { const createCommonSecret = async ()=> {
try { try {
const fee = await getFee('ARBITRARY') const fee = await getFee('ARBITRARY')
@ -18,12 +98,18 @@ export const CreateCommonSecret = ({groupId, secretKey, isOwner, myAddress, secr
message: "Would you like to perform an ARBITRARY transaction?" , message: "Would you like to perform an ARBITRARY transaction?" ,
publishFee: fee.fee + ' QORT' publishFee: fee.fee + ' QORT'
}) })
setIsLoading(true) setIsLoading(true)
const secretKey2 = await getSecretKey()
if((!secretKey2 && secretKey2 !== false)) throw new Error('invalid secret key')
if (secretKey2 && !validateSecretKey(secretKey2)) throw new Error('invalid secret key')
const secretKeyToSend = !secretKey2 ? null : secretKey2
chrome.runtime.sendMessage({ action: "encryptAndPublishSymmetricKeyGroupChat", payload: { chrome.runtime.sendMessage({ action: "encryptAndPublishSymmetricKeyGroupChat", payload: {
groupId: groupId, groupId: groupId,
previousData: secretKey previousData: secretKeyToSend
} }, (response) => { } }, (response) => {
if (!response?.error) { if (!response?.error) {
setInfoSnack({ setInfoSnack({

5
src/components/Group/Group.tsx

@ -148,7 +148,7 @@ export const getGroupMembers = async (groupNumber: number) => {
return groupData; return groupData;
}; };
const decryptResource = async (data: string) => { export const decryptResource = async (data: string) => {
try { try {
return new Promise((res, rej) => { return new Promise((res, rej) => {
chrome.runtime.sendMessage( chrome.runtime.sendMessage(
@ -532,7 +532,7 @@ export const Group = ({
settimeoutForRefetchSecretKey.current = setTimeout(() => { settimeoutForRefetchSecretKey.current = setTimeout(() => {
getSecretKey(); getSecretKey();
}, 120000); }, 120000);
return; return false;
} }
setSecretKeyPublishDate(publish?.updated || publish?.created); setSecretKeyPublishDate(publish?.updated || publish?.created);
@ -1671,6 +1671,7 @@ export const Group = ({
!secretKey && !secretKey &&
triedToFetchSecretKey triedToFetchSecretKey
} }
/> />
)} )}
</Box> </Box>

Loading…
Cancel
Save