/* global libsignal */ describe('AccountManager', () => { let accountManager; beforeEach(() => { accountManager = new window.textsecure.AccountManager(); }); describe('#cleanSignedPreKeys', () => { let originalProtocolStorage; let signedPreKeys; const DAY = 1000 * 60 * 60 * 24; beforeEach(async () => { const identityKey = await libsignal.KeyHelper.generateIdentityKeyPair(); originalProtocolStorage = window.textsecure.storage.protocol; window.textsecure.storage.protocol = { getIdentityKeyPair() { return identityKey; }, loadSignedPreKeys() { return Promise.resolve(signedPreKeys); }, }; }); afterEach(() => { window.textsecure.storage.protocol = originalProtocolStorage; }); describe('encrypted device name', () => { it('roundtrips', async () => { const deviceName = 'v2.5.0 on Ubunto 20.04'; const encrypted = await accountManager.encryptDeviceName(deviceName); assert.strictEqual(typeof encrypted, 'string'); const decrypted = await accountManager.decryptDeviceName(encrypted); assert.strictEqual(decrypted, deviceName); }); it('handles null deviceName', async () => { const encrypted = await accountManager.encryptDeviceName(null); assert.strictEqual(encrypted, null); }); }); it('keeps three confirmed keys even if over a week old', () => { const now = Date.now(); signedPreKeys = [ { keyId: 1, created_at: now - DAY * 21, confirmed: true, }, { keyId: 2, created_at: now - DAY * 14, confirmed: true, }, { keyId: 3, created_at: now - DAY * 18, confirmed: true, }, ]; // should be no calls to store.removeSignedPreKey, would cause crash return accountManager.cleanSignedPreKeys(); }); it('eliminates confirmed keys over a week old, if more than three', async () => { const now = Date.now(); signedPreKeys = [ { keyId: 1, created_at: now - DAY * 21, confirmed: true, }, { keyId: 2, created_at: now - DAY * 14, confirmed: true, }, { keyId: 3, created_at: now - DAY * 4, confirmed: true, }, { keyId: 4, created_at: now - DAY * 18, confirmed: true, }, { keyId: 5, created_at: now - DAY, confirmed: true, }, ]; let count = 0; window.textsecure.storage.protocol.removeSignedPreKey = keyId => { if (keyId !== 1 && keyId !== 4) { throw new Error(`Wrong keys were eliminated! ${keyId}`); } count += 1; }; await accountManager.cleanSignedPreKeys(); assert.strictEqual(count, 2); }); it('keeps at least three unconfirmed keys if no confirmed', async () => { const now = Date.now(); signedPreKeys = [ { keyId: 1, created_at: now - DAY * 14, }, { keyId: 2, created_at: now - DAY * 21, }, { keyId: 3, created_at: now - DAY * 18, }, { keyId: 4, created_at: now - DAY, }, ]; let count = 0; window.textsecure.storage.protocol.removeSignedPreKey = keyId => { if (keyId !== 2) { throw new Error(`Wrong keys were eliminated! ${keyId}`); } count += 1; }; await accountManager.cleanSignedPreKeys(); assert.strictEqual(count, 1); }); it('if some confirmed keys, keeps unconfirmed to addd up to three total', async () => { const now = Date.now(); signedPreKeys = [ { keyId: 1, created_at: now - DAY * 21, confirmed: true, }, { keyId: 2, created_at: now - DAY * 14, confirmed: true, }, { keyId: 3, created_at: now - DAY * 12, }, { keyId: 4, created_at: now - DAY * 8, }, ]; let count = 0; window.textsecure.storage.protocol.removeSignedPreKey = keyId => { if (keyId !== 3) { throw new Error(`Wrong keys were eliminated! ${keyId}`); } count += 1; }; await accountManager.cleanSignedPreKeys(); assert.strictEqual(count, 1); }); }); });