2020-12-15 07:15:00 +01:00
|
|
|
import _ from 'lodash';
|
2021-01-21 03:46:01 +01:00
|
|
|
import { UserUtils } from '.';
|
2021-02-15 05:16:38 +01:00
|
|
|
import { getItemById } from '../../../ts/data/data';
|
2021-01-21 03:46:01 +01:00
|
|
|
import { KeyPair } from '../../../libtextsecure/libsignal-protocol';
|
|
|
|
import { PubKey } from '../types';
|
|
|
|
import { toHex } from './String';
|
2021-02-26 01:48:08 +01:00
|
|
|
import { ConversationController } from '../conversations';
|
2021-01-21 03:46:01 +01:00
|
|
|
|
2021-01-29 01:29:24 +01:00
|
|
|
export type HexKeyPair = {
|
|
|
|
pubKey: string;
|
|
|
|
privKey: string;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check if this pubkey is us, using the cache.
|
2021-02-08 06:18:36 +01:00
|
|
|
* Throws an error if our pubkey is not set
|
2021-01-29 01:29:24 +01:00
|
|
|
*/
|
|
|
|
export function isUsFromCache(pubKey: string | PubKey | undefined): boolean {
|
2021-01-21 03:46:01 +01:00
|
|
|
if (!pubKey) {
|
|
|
|
throw new Error('pubKey is not set');
|
|
|
|
}
|
2021-01-29 01:29:24 +01:00
|
|
|
const ourNumber = UserUtils.getOurPubKeyStrFromCache();
|
2021-01-21 03:46:01 +01:00
|
|
|
const pubKeyStr = pubKey instanceof PubKey ? pubKey.key : pubKey;
|
|
|
|
return pubKeyStr === ourNumber;
|
|
|
|
}
|
2020-12-15 07:15:00 +01:00
|
|
|
|
2021-01-12 06:11:05 +01:00
|
|
|
/**
|
2021-01-29 01:29:24 +01:00
|
|
|
* Returns the public key of this current device as a STRING, or throws an error
|
2021-01-12 06:11:05 +01:00
|
|
|
*/
|
2021-01-29 01:29:24 +01:00
|
|
|
export function getOurPubKeyStrFromCache(): string {
|
|
|
|
const ourNumber = window.textsecure.storage.user.getNumber();
|
|
|
|
if (!ourNumber) {
|
|
|
|
throw new Error('ourNumber is not set');
|
|
|
|
}
|
|
|
|
return ourNumber;
|
2020-06-01 04:53:51 +02:00
|
|
|
}
|
|
|
|
|
2021-01-29 01:29:24 +01:00
|
|
|
/**
|
|
|
|
* Returns the public key of this current device as a PubKey, or throws an error
|
|
|
|
*/
|
|
|
|
export function getOurPubKeyFromCache(): PubKey {
|
|
|
|
const ourNumber = UserUtils.getOurPubKeyStrFromCache();
|
2021-01-21 03:46:01 +01:00
|
|
|
if (!ourNumber) {
|
2021-01-20 06:58:59 +01:00
|
|
|
throw new Error('ourNumber is not set');
|
|
|
|
}
|
|
|
|
return PubKey.cast(ourNumber);
|
|
|
|
}
|
|
|
|
|
2020-12-15 07:15:00 +01:00
|
|
|
/**
|
2021-01-05 04:48:46 +01:00
|
|
|
* This return the stored x25519 identity keypair for the current logged in user
|
2020-12-15 07:15:00 +01:00
|
|
|
*/
|
2020-06-01 04:53:51 +02:00
|
|
|
export async function getIdentityKeyPair(): Promise<KeyPair | undefined> {
|
|
|
|
const item = await getItemById('identityKey');
|
|
|
|
|
|
|
|
return item?.value;
|
|
|
|
}
|
2020-12-15 07:15:00 +01:00
|
|
|
|
|
|
|
export async function getUserED25519KeyPair(): Promise<HexKeyPair | undefined> {
|
|
|
|
// 'identityKey' keeps the ed25519KeyPair under a ed25519KeyPair field.
|
|
|
|
// it is only set if the user migrated to the ed25519 way of generating a key
|
|
|
|
const item = await getItemById('identityKey');
|
|
|
|
const ed25519KeyPair = item?.value?.ed25519KeyPair;
|
|
|
|
if (ed25519KeyPair?.publicKey && ed25519KeyPair?.privateKey) {
|
|
|
|
const pubKeyAsArray = _.map(ed25519KeyPair.publicKey, a => a);
|
|
|
|
const privKeyAsArray = _.map(ed25519KeyPair.privateKey, a => a);
|
|
|
|
return {
|
2021-01-21 03:46:01 +01:00
|
|
|
pubKey: toHex(new Uint8Array(pubKeyAsArray)),
|
|
|
|
privKey: toHex(new Uint8Array(privKeyAsArray)),
|
2020-12-15 07:15:00 +01:00
|
|
|
};
|
|
|
|
}
|
|
|
|
return undefined;
|
|
|
|
}
|
2021-02-23 04:22:01 +01:00
|
|
|
|
|
|
|
export function isRestoringFromSeed(): boolean {
|
2021-02-26 01:27:29 +01:00
|
|
|
return window.textsecure.storage.user.isRestoringFromSeed();
|
2021-02-23 04:22:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
export function setRestoringFromSeed(isRestoring: boolean) {
|
|
|
|
window.textsecure.storage.user.setRestoringFromSeed(isRestoring);
|
|
|
|
}
|
2021-02-26 01:48:08 +01:00
|
|
|
|
|
|
|
export interface OurLokiProfile {
|
|
|
|
displayName: string;
|
|
|
|
avatarPointer: string;
|
|
|
|
profileKey: Uint8Array | null;
|
|
|
|
}
|
|
|
|
|
2021-02-26 06:07:13 +01:00
|
|
|
export function getOurProfile(): OurLokiProfile | undefined {
|
2021-02-26 01:48:08 +01:00
|
|
|
try {
|
|
|
|
// Secondary devices have their profile stored
|
|
|
|
// in their primary device's conversation
|
|
|
|
const ourNumber = window.storage.get('primaryDevicePubKey');
|
|
|
|
const ourConversation = ConversationController.getInstance().get(ourNumber);
|
2021-02-26 06:07:13 +01:00
|
|
|
const profileKey = new Uint8Array(window.storage.get('profileKey'));
|
|
|
|
|
2021-02-26 01:48:08 +01:00
|
|
|
const avatarPointer = ourConversation.get('avatarPointer');
|
|
|
|
const { displayName } = ourConversation.getLokiProfile();
|
2021-02-26 06:07:13 +01:00
|
|
|
return {
|
|
|
|
displayName,
|
|
|
|
avatarPointer,
|
|
|
|
profileKey: profileKey.length ? profileKey : null,
|
|
|
|
};
|
2021-02-26 01:48:08 +01:00
|
|
|
} catch (e) {
|
|
|
|
window.log.error(`Failed to get our profile: ${e}`);
|
|
|
|
return undefined;
|
|
|
|
}
|
|
|
|
}
|