import { ApiV2 } from '.'; import { getV2OpenGroupRoom } from '../../data/opengroups'; import { ConversationModel } from '../../models/conversation'; import { downloadAttachmentOpenGroupV2 } from '../../receiver/attachments'; import { sha256 } from '../../session/crypto'; import { fromArrayBufferToBase64 } from '../../session/utils/String'; import { arrayBufferFromFile } from '../../types/Attachment'; import { AttachmentUtil } from '../../util'; export async function updateOpenGroupV2(convo: ConversationModel, groupName: string, avatar: any) { if (avatar) { // I hate duplicating this... const readFile = async (attachment: any) => new Promise((resolve, reject) => { const fileReader = new FileReader(); fileReader.onload = (e: any) => { const data = e.target.result; resolve({ ...attachment, data, size: data.byteLength, }); }; fileReader.onerror = reject; fileReader.onabort = reject; fileReader.readAsArrayBuffer(attachment.file); }); const avatarAttachment: any = await readFile({ file: avatar }); // We want a square const withBlob = await AttachmentUtil.autoScale( { contentType: avatar.type, file: new Blob([avatarAttachment.data], { type: avatar.contentType, }), }, { maxSide: 640, maxSize: 1000 * 1024, } ); const dataResized = await arrayBufferFromFile(withBlob.file); const roomInfos = await getV2OpenGroupRoom(convo.id); if (!roomInfos || !dataResized.byteLength) { return false; } const uploadedFileDetails = await ApiV2.uploadImageForRoomOpenGroupV2( new Uint8Array(dataResized), roomInfos ); if (!uploadedFileDetails || !uploadedFileDetails.fileUrl) { window?.log?.warn('File opengroupv2 upload failed'); return; } let url: URL; try { url = new URL(uploadedFileDetails.fileUrl); const pathname = url.pathname; const downloaded = await downloadAttachmentOpenGroupV2(pathname, roomInfos); if (!(downloaded instanceof Uint8Array)) { const typeFound = typeof downloaded; throw new Error(`Expected a plain Uint8Array but got ${typeFound}`); } const upgraded = await window.Signal.Migrations.processNewAttachment({ data: downloaded.buffer, isRaw: true, url: pathname, }); const newHash = sha256(fromArrayBufferToBase64(downloaded.buffer)); await convo.setLokiProfile({ displayName: groupName || convo.get('name') || 'Unknown', avatar: upgraded.path, avatarHash: newHash, }); } catch (e) { window?.log?.error(`Could not decrypt profile image: ${e}`); } } return undefined; }