You've already forked matrix-js-sdk
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:
@@ -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[];
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
1518
src/crypto/OlmDevice.ts
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user