session-desktop/ts/session/utils/User.ts

134 lines
4.3 KiB
TypeScript
Raw Normal View History

import _ from 'lodash';
import { UserUtils } from '.';
2021-02-15 05:16:38 +01:00
import { getItemById } from '../../../ts/data/data';
import { KeyPair } from '../../../libtextsecure/libsignal-protocol';
import { PubKey } from '../types';
import { fromHexToArray, toHex } from './String';
import { getConversationController } from '../conversations';
import { LokiProfile } from '../../types/Message';
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 {
if (!pubKey) {
throw new Error('pubKey is not set');
}
2021-01-29 01:29:24 +01:00
const ourNumber = UserUtils.getOurPubKeyStrFromCache();
const pubKeyStr = pubKey instanceof PubKey ? pubKey.key : pubKey;
return pubKeyStr === ourNumber;
}
/**
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-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;
}
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();
if (!ourNumber) {
2021-01-20 06:58:59 +01:00
throw new Error('ourNumber is not set');
}
return PubKey.cast(ourNumber);
}
let cachedIdentityKeyPair: KeyPair | undefined;
/**
* This return the stored x25519 identity keypair for the current logged in user
*/
export async function getIdentityKeyPair(): Promise<KeyPair | undefined> {
if (cachedIdentityKeyPair) {
return cachedIdentityKeyPair;
}
const item = await getItemById('identityKey');
cachedIdentityKeyPair = item?.value;
return cachedIdentityKeyPair;
}
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 {
pubKey: toHex(new Uint8Array(pubKeyAsArray)),
privKey: toHex(new Uint8Array(privKeyAsArray)),
};
}
return undefined;
}
2021-02-23 04:22:01 +01:00
export function isSignInByLinking(): boolean {
return window.textsecure.storage.user.isSignInByLinking();
2021-02-23 04:22:01 +01:00
}
export function setSignInByLinking(isLinking: boolean) {
window.textsecure.storage.user.setSignInByLinking(isLinking);
2021-02-23 04:22:01 +01:00
}
export function isSignWithRecoveryPhrase(): boolean {
return window.textsecure.storage.user.isSignWithRecoveryPhrase();
}
export function setSignWithRecoveryPhrase(isLinking: boolean) {
window.textsecure.storage.user.setSignWithRecoveryPhrase(isLinking);
}
export function getOurProfile(): LokiProfile | undefined {
try {
// Secondary devices have their profile stored
// in their primary device's conversation
const ourNumber = window.storage.get('primaryDevicePubKey');
const ourConversation = getConversationController().get(ourNumber);
const ourProfileKeyHex = ourConversation.get('profileKey');
const profileKeyAsBytes = ourProfileKeyHex ? fromHexToArray(ourProfileKeyHex) : null;
2021-02-26 06:07:13 +01:00
const avatarPointer = ourConversation.get('avatarPointer');
const { displayName } = ourConversation.getLokiProfile();
2021-02-26 06:07:13 +01:00
return {
displayName,
avatarPointer,
profileKey: profileKeyAsBytes?.length ? profileKeyAsBytes : null,
2021-02-26 06:07:13 +01:00
};
} catch (e) {
window?.log?.error(`Failed to get our profile: ${e}`);
return undefined;
}
}
export function getLastProfileUpdateTimestamp(): number | undefined {
return window.textsecure.storage.user.getLastProfileUpdateTimestamp();
}
export function setLastProfileUpdateTimestamp(lastUpdateTimestamp: number) {
2021-04-22 10:03:58 +02:00
return window.textsecure.storage.user.setLastProfileUpdateTimestamp(lastUpdateTimestamp);
}
2021-03-01 00:16:15 +01:00
export function getCurrentRecoveryPhrase() {
return window.textsecure.storage.get('mnemonic');
}
export function saveRecoveryPhrase(mnemonic: string) {
return window.textsecure.storage.put('mnemonic', mnemonic);
}