You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-desktop/ts/opengroup/opengroupV2/ApiUtil.ts

100 lines
2.9 KiB
TypeScript

import _ from 'underscore';
import { PubKey } from '../../session/types';
import { fromBase64ToArrayBuffer, fromHex } from '../../session/utils/String';
import { OpenGroupMessageV2 } from './OpenGroupMessageV2';
export const defaultServer = 'https://sessionopengroup.com';
export const defaultServerPublicKey =
'658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231b';
export type OpenGroupRequestCommonType = {
serverUrl: string;
roomId: string;
};
export type OpenGroupV2Request = {
method: 'GET' | 'POST' | 'DELETE' | 'PUT';
room: string;
server: string;
endpoint: string;
// queryParams are used for post or get, but not the same way
queryParams?: Record<string, string>;
headers?: Record<string, string>;
isAuthRequired: boolean;
};
export type OpenGroupV2CompactPollRequest = {
server: string;
endpoint: string;
body: string;
serverPubKey: string;
};
export type OpenGroupV2Info = {
id: string;
name: string;
imageId?: string;
};
/**
* Try to build an full url and check it for validity.
* @returns null if the check failed. the built URL otherwise
*/
export const buildUrl = (request: OpenGroupV2Request): URL | null => {
let rawURL = `${request.server}/${request.endpoint}`;
if (request.method === 'GET') {
const entries = Object.entries(request.queryParams || {});
if (entries.length) {
const queryString = entries.map(([key, value]) => `${key}=${value}`).join('&');
rawURL += `?${queryString}`;
}
}
// this just check that the URL is valid
try {
return new URL(`${rawURL}`);
} catch (error) {
return null;
}
};
export const parseMessages = async (
rawMessages: Array<Record<string, any>>
): Promise<Array<OpenGroupMessageV2>> => {
if (!rawMessages) {
window.log.info('no new messages');
return [];
}
const messages = await Promise.all(
rawMessages.map(async r => {
try {
const opengroupMessage = OpenGroupMessageV2.fromJson(r);
if (
!opengroupMessage?.serverId ||
!opengroupMessage.sentTimestamp ||
!opengroupMessage.base64EncodedData ||
!opengroupMessage.base64EncodedSignature
) {
window.log.warn('invalid open group message received');
return null;
}
// Validate the message signature
const senderPubKey = PubKey.cast(opengroupMessage.sender).withoutPrefix();
const signature = fromBase64ToArrayBuffer(opengroupMessage.base64EncodedSignature);
const messageData = fromBase64ToArrayBuffer(opengroupMessage.base64EncodedData);
// throws if signature failed
await window.libsignal.Curve.async.verifySignature(
fromHex(senderPubKey),
messageData,
signature
);
return opengroupMessage;
} catch (e) {
window.log.error('An error happened while fetching getMessages output:', e);
return null;
}
})
);
return _.compact(messages);
};