1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-11-25 05:23:13 +03:00

Convert OlmDevice to Typescript

This commit is contained in:
Michael Telatynski
2021-09-07 13:22:27 +01:00
parent 324f9e58ea
commit 666e471369
14 changed files with 1545 additions and 1496 deletions

View File

@@ -82,11 +82,3 @@ export enum HistoryVisibility {
Shared = "shared", Shared = "shared",
WorldReadable = "world_readable", WorldReadable = "world_readable",
} }
// XXX move to OlmDevice when converted
export interface InboundGroupSessionData {
room_id: string; // eslint-disable-line camelcase
session: string;
keysClaimed: Record<string, string>;
forwardingCurve25519KeyChain: string[];
}

View File

@@ -34,6 +34,7 @@ import { IActionsObject, PushProcessor } from "./pushprocessor";
import { AutoDiscovery } from "./autodiscovery"; import { AutoDiscovery } from "./autodiscovery";
import * as olmlib from "./crypto/olmlib"; import * as olmlib from "./crypto/olmlib";
import { decodeBase64, encodeBase64 } from "./crypto/olmlib"; import { decodeBase64, encodeBase64 } from "./crypto/olmlib";
import { IExportedDevice as IOlmDevice } from "./crypto/OlmDevice";
import { ReEmitter } from './ReEmitter'; import { ReEmitter } from './ReEmitter';
import { IRoomEncryption, RoomList } from './crypto/RoomList'; import { IRoomEncryption, RoomList } from './crypto/RoomList';
import { logger } from './logger'; import { logger } from './logger';
@@ -74,7 +75,6 @@ import {
IKeyBackupPrepareOpts, IKeyBackupPrepareOpts,
IKeyBackupRestoreOpts, IKeyBackupRestoreOpts,
IKeyBackupRestoreResult, IKeyBackupRestoreResult,
IKeyBackupSession,
} from "./crypto/keybackup"; } from "./crypto/keybackup";
import { IIdentityServerProvider } from "./@types/IIdentityServerProvider"; import { IIdentityServerProvider } from "./@types/IIdentityServerProvider";
import type Request from "request"; import type Request from "request";
@@ -156,12 +156,6 @@ export const CRYPTO_ENABLED: boolean = isCryptoAvailable();
const CAPABILITIES_CACHE_MS = 21600000; // 6 hours - an arbitrary value const CAPABILITIES_CACHE_MS = 21600000; // 6 hours - an arbitrary value
const TURN_CHECK_INTERVAL = 10 * 60 * 1000; // poll for turn credentials every 10 minutes const TURN_CHECK_INTERVAL = 10 * 60 * 1000; // poll for turn credentials every 10 minutes
interface IOlmDevice {
pickledAccount: string;
sessions: Array<Record<string, IKeyBackupSession>>;
pickleKey: string;
}
interface IExportedDevice { interface IExportedDevice {
olmDevice: IOlmDevice; olmDevice: IOlmDevice;
userId: string; userId: string;
@@ -678,7 +672,7 @@ export class MatrixClient extends EventEmitter {
public static readonly RESTORE_BACKUP_ERROR_BAD_KEY = 'RESTORE_BACKUP_ERROR_BAD_KEY'; public static readonly RESTORE_BACKUP_ERROR_BAD_KEY = 'RESTORE_BACKUP_ERROR_BAD_KEY';
public reEmitter = new ReEmitter(this); public reEmitter = new ReEmitter(this);
public olmVersion: string = null; // populated after initCrypto public olmVersion: [number, number, number] = null; // populated after initCrypto
public usingExternalCrypto = false; public usingExternalCrypto = false;
public store: Store; public store: Store;
public deviceId?: string; public deviceId?: string;

View File

@@ -713,7 +713,7 @@ export function createCryptoStoreCacheCallbacks(store: CryptoStore, olmDevice: O
}); });
if (key && key.ciphertext) { if (key && key.ciphertext) {
const pickleKey = Buffer.from(olmDevice._pickleKey); const pickleKey = Buffer.from(olmDevice.pickleKey);
const decrypted = await decryptAES(key, pickleKey, type); const decrypted = await decryptAES(key, pickleKey, type);
return decodeBase64(decrypted); return decodeBase64(decrypted);
} else { } else {
@@ -726,7 +726,7 @@ export function createCryptoStoreCacheCallbacks(store: CryptoStore, olmDevice: O
`storeCrossSigningKeyCache expects Uint8Array, got ${key}`, `storeCrossSigningKeyCache expects Uint8Array, got ${key}`,
); );
} }
const pickleKey = Buffer.from(olmDevice._pickleKey); const pickleKey = Buffer.from(olmDevice.pickleKey);
const encryptedKey = await encryptAES(encodeBase64(key), pickleKey, type); const encryptedKey = await encryptAES(encodeBase64(key), pickleKey, type);
return store.doTxn( return store.doTxn(
'readwrite', 'readwrite',

File diff suppressed because it is too large Load Diff

1518
src/crypto/OlmDevice.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -67,7 +67,7 @@ export interface IOlmDevice<T = DeviceInfo> {
} }
/* eslint-disable camelcase */ /* eslint-disable camelcase */
interface IOutboundGroupSessionKey { export interface IOutboundGroupSessionKey {
chain_index: number; chain_index: number;
key: string; key: string;
} }
@@ -887,9 +887,7 @@ class MegolmEncryption extends EncryptionAlgorithm {
} }
const filteredFailedDevices = const filteredFailedDevices =
await this.olmDevice.filterOutNotifiedErrorDevices( await this.olmDevice.filterOutNotifiedErrorDevices(failedDevices);
failedDevices,
);
logger.debug( logger.debug(
`Filtered down to ${filteredFailedDevices.length} error devices ` + `Filtered down to ${filteredFailedDevices.length} error devices ` +
`in ${this.roomId}`, `in ${this.roomId}`,
@@ -1391,7 +1389,7 @@ class MegolmDecryption extends DecryptionAlgorithm {
* *
* @param {module:models/event.MatrixEvent} event key event * @param {module:models/event.MatrixEvent} event key event
*/ */
public onRoomKeyEvent(event: MatrixEvent): void { public onRoomKeyEvent(event: MatrixEvent): Promise<void> {
const content = event.getContent(); const content = event.getContent();
const sessionId = content.session_id; const sessionId = content.session_id;
let senderKey = event.getSenderKey(); let senderKey = event.getSenderKey();

View File

@@ -36,7 +36,7 @@ import { IEventDecryptionResult } from "../index";
const DeviceVerification = DeviceInfo.DeviceVerification; const DeviceVerification = DeviceInfo.DeviceVerification;
interface IMessage { interface IMessage {
type: number | string; type: number;
body: string; body: string;
} }
@@ -269,11 +269,11 @@ class OlmDecryption extends DecryptionAlgorithm {
// not a prekey message: we can safely just try & decrypt it // not a prekey message: we can safely just try & decrypt it
return this.reallyDecryptMessage(theirDeviceIdentityKey, message); return this.reallyDecryptMessage(theirDeviceIdentityKey, message);
} else { } else {
const myPromise = this.olmDevice._olmPrekeyPromise.then(() => { const myPromise = this.olmDevice.olmPrekeyPromise.then(() => {
return this.reallyDecryptMessage(theirDeviceIdentityKey, message); return this.reallyDecryptMessage(theirDeviceIdentityKey, message);
}); });
// we want the error, but don't propagate it to the next decryption // we want the error, but don't propagate it to the next decryption
this.olmDevice._olmPrekeyPromise = myPromise.catch(() => {}); this.olmDevice.olmPrekeyPromise = myPromise.catch(() => {});
return await myPromise; return await myPromise;
} }
} }

View File

@@ -130,13 +130,14 @@ export interface IRoomKeyRequestBody extends IRoomKey {
} }
export interface IMegolmSessionData { export interface IMegolmSessionData {
[key: string]: any;
sender_key: string; sender_key: string;
forwarding_curve25519_key_chain: string[]; forwarding_curve25519_key_chain: string[];
sender_claimed_keys: Record<string, string>; sender_claimed_keys: Record<string, string>;
room_id: string; room_id: string;
session_id: string; session_id: string;
session_key: string; session_key: string;
algorithm: string; algorithm?: string;
untrusted?: boolean; untrusted?: boolean;
} }
/* eslint-enable camelcase */ /* eslint-enable camelcase */
@@ -192,7 +193,7 @@ export class Crypto extends EventEmitter {
/** /**
* @return {string} The version of Olm. * @return {string} The version of Olm.
*/ */
static getOlmVersion(): string { static getOlmVersion(): [number, number, number] {
return OlmDevice.getOlmVersion(); return OlmDevice.getOlmVersion();
} }
@@ -1097,7 +1098,7 @@ export class Crypto extends EventEmitter {
await this.storeSessionBackupPrivateKey(key); await this.storeSessionBackupPrivateKey(key);
} }
if (key && key.ciphertext) { if (key && key.ciphertext) {
const pickleKey = Buffer.from(this.olmDevice._pickleKey); const pickleKey = Buffer.from(this.olmDevice.pickleKey);
const decrypted = await decryptAES(key, pickleKey, "m.megolm_backup.v1"); const decrypted = await decryptAES(key, pickleKey, "m.megolm_backup.v1");
key = olmlib.decodeBase64(decrypted); key = olmlib.decodeBase64(decrypted);
} }
@@ -1113,7 +1114,7 @@ export class Crypto extends EventEmitter {
if (!(key instanceof Uint8Array)) { if (!(key instanceof Uint8Array)) {
throw new Error(`storeSessionBackupPrivateKey expects Uint8Array, got ${key}`); throw new Error(`storeSessionBackupPrivateKey expects Uint8Array, got ${key}`);
} }
const pickleKey = Buffer.from(this.olmDevice._pickleKey); const pickleKey = Buffer.from(this.olmDevice.pickleKey);
const encryptedKey = await encryptAES(olmlib.encodeBase64(key), pickleKey, "m.megolm_backup.v1"); const encryptedKey = await encryptAES(olmlib.encodeBase64(key), pickleKey, "m.megolm_backup.v1");
return this.cryptoStore.doTxn( return this.cryptoStore.doTxn(
'readwrite', 'readwrite',
@@ -1912,7 +1913,7 @@ export class Crypto extends EventEmitter {
const fallbackJson: Record<string, IOneTimeKey> = {}; const fallbackJson: Record<string, IOneTimeKey> = {};
if (this.getNeedsNewFallback()) { if (this.getNeedsNewFallback()) {
const fallbackKeys = await this.olmDevice.getFallbackKey() as Record<string, Record<string, string>>; const fallbackKeys = await this.olmDevice.getFallbackKey();
for (const [keyId, key] of Object.entries(fallbackKeys.curve25519)) { for (const [keyId, key] of Object.entries(fallbackKeys.curve25519)) {
const k = { key, fallback: true }; const k = { key, fallback: true };
fallbackJson["signed_curve25519:" + keyId] = k; fallbackJson["signed_curve25519:" + keyId] = k;

View File

@@ -24,7 +24,7 @@ import anotherjson from "another-json";
import type { PkSigning } from "@matrix-org/olm"; import type { PkSigning } from "@matrix-org/olm";
import { Logger } from "loglevel"; import { Logger } from "loglevel";
import OlmDevice from "./OlmDevice"; import { OlmDevice } from "./OlmDevice";
import { DeviceInfo } from "./deviceinfo"; import { DeviceInfo } from "./deviceinfo";
import { logger } from '../logger'; import { logger } from '../logger';
import * as utils from "../utils"; import * as utils from "../utils";
@@ -252,13 +252,13 @@ export async function ensureOlmSessionsForDevices(
continue; continue;
} }
if (!olmDevice._sessionsInProgress[key]) { if (!olmDevice.sessionsInProgress[key]) {
// pre-emptively mark the session as in-progress to avoid race // pre-emptively mark the session as in-progress to avoid race
// conditions. If we find that we already have a session, then // conditions. If we find that we already have a session, then
// we'll resolve // we'll resolve
olmDevice._sessionsInProgress[key] = new Promise(resolve => { olmDevice.sessionsInProgress[key] = new Promise(resolve => {
resolveSession[key] = (v: any) => { resolveSession[key] = (v: any) => {
delete olmDevice._sessionsInProgress[key]; delete olmDevice.sessionsInProgress[key];
resolve(v); resolve(v);
}; };
}); });
@@ -291,9 +291,7 @@ export async function ensureOlmSessionsForDevices(
} }
const forWhom = `for ${key} (${userId}:${deviceId})`; const forWhom = `for ${key} (${userId}:${deviceId})`;
const sessionId = await olmDevice.getSessionIdForDevice( const sessionId = await olmDevice.getSessionIdForDevice(key, !!resolveSession[key], log);
key, resolveSession[key], log,
);
if (sessionId !== null && resolveSession[key]) { if (sessionId !== null && resolveSession[key]) {
// we found a session, but we had marked the session as // we found a session, but we had marked the session as
// in-progress, so resolve it now, which will unmark it and // in-progress, so resolve it now, which will unmark it and

View File

@@ -23,7 +23,7 @@ import { IRoomEncryption } from "../RoomList";
import { IDevice } from "../deviceinfo"; import { IDevice } from "../deviceinfo";
import { ICrossSigningInfo } from "../CrossSigning"; import { ICrossSigningInfo } from "../CrossSigning";
import { PrefixedLogger } from "../../logger"; import { PrefixedLogger } from "../../logger";
import { InboundGroupSessionData } from "../../@types/partials"; import { InboundGroupSessionData } from "../OlmDevice";
import { IEncryptedPayload } from "../aes"; import { IEncryptedPayload } from "../aes";
/** /**
@@ -125,7 +125,7 @@ export interface CryptoStore {
addSharedHistoryInboundGroupSession(roomId: string, senderKey: string, sessionId: string, txn?: unknown): void; addSharedHistoryInboundGroupSession(roomId: string, senderKey: string, sessionId: string, txn?: unknown): void;
getSharedHistoryInboundGroupSessions( getSharedHistoryInboundGroupSessions(
roomId: string, roomId: string,
txn?: IDBTransaction, txn?: unknown,
): Promise<[senderKey: string, sessionId: string][]>; ): Promise<[senderKey: string, sessionId: string][]>;
// Session key backups // Session key backups

View File

@@ -30,7 +30,7 @@ import { IRoomKeyRequestBody } from "../index";
import { ICrossSigningKey } from "../../client"; import { ICrossSigningKey } from "../../client";
import { IOlmDevice } from "../algorithms/megolm"; import { IOlmDevice } from "../algorithms/megolm";
import { IRoomEncryption } from "../RoomList"; import { IRoomEncryption } from "../RoomList";
import { InboundGroupSessionData } from "../../@types/partials"; import { InboundGroupSessionData } from "../OlmDevice";
import { IEncryptedPayload } from "../aes"; import { IEncryptedPayload } from "../aes";
export const VERSION = 10; export const VERSION = 10;

View File

@@ -34,7 +34,7 @@ import { IRoomKeyRequestBody } from "../index";
import { ICrossSigningKey } from "../../client"; import { ICrossSigningKey } from "../../client";
import { IOlmDevice } from "../algorithms/megolm"; import { IOlmDevice } from "../algorithms/megolm";
import { IRoomEncryption } from "../RoomList"; import { IRoomEncryption } from "../RoomList";
import { InboundGroupSessionData } from "../../@types/partials"; import { InboundGroupSessionData } from "../OlmDevice";
import { IEncryptedPayload } from "../aes"; import { IEncryptedPayload } from "../aes";
/** /**

View File

@@ -20,7 +20,7 @@ import { IDeviceData, IProblem, ISession, ISessionInfo, IWithheld, Mode } from "
import { IOlmDevice } from "../algorithms/megolm"; import { IOlmDevice } from "../algorithms/megolm";
import { IRoomEncryption } from "../RoomList"; import { IRoomEncryption } from "../RoomList";
import { ICrossSigningKey } from "../../client"; import { ICrossSigningKey } from "../../client";
import { InboundGroupSessionData } from "../../@types/partials"; import { InboundGroupSessionData } from "../OlmDevice";
import { IEncryptedPayload } from "../aes"; import { IEncryptedPayload } from "../aes";
/** /**

View File

@@ -30,7 +30,7 @@ import { IRoomKeyRequestBody } from "../index";
import { ICrossSigningKey } from "../../client"; import { ICrossSigningKey } from "../../client";
import { IOlmDevice } from "../algorithms/megolm"; import { IOlmDevice } from "../algorithms/megolm";
import { IRoomEncryption } from "../RoomList"; import { IRoomEncryption } from "../RoomList";
import { InboundGroupSessionData } from "../../@types/partials"; import { InboundGroupSessionData } from "../OlmDevice";
import { IEncryptedPayload } from "../aes"; import { IEncryptedPayload } from "../aes";
/** /**