CI / Build & Quality Checks (push) Skipped
CI / Secret scan (gitleaks) (push) Skipped
CI / Playwright smoke (e2e) (push) Skipped
CI / Build & Quality Checks (pull_request) Successful in 3m32s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 16s
CI / Playwright smoke (e2e) (pull_request) Successful in 24m32s
secretStorageKeys was untyped JS, passed to createClient behind `as any`, which hid that getSecretStorageKey returned undefined where the SDK type says null. Now TypeScript against the SDK's CryptoCallbacks, returns null, and storePrivateKey keeps its own copy of the key. Unit test added. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
27 lines
1020 B
TypeScript
27 lines
1020 B
TypeScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { clearSecretStorageKeys, cryptoCallbacks, storePrivateKey } from './secretStorageKeys';
|
|
|
|
const ask = (...ids: string[]) =>
|
|
cryptoCallbacks.getSecretStorageKey!(
|
|
{ keys: Object.fromEntries(ids.map((id) => [id, {} as never])) },
|
|
'm.cross_signing.master',
|
|
);
|
|
|
|
test('[#210] secret storage key cache: null when unknown, key when stored, copies input', async () => {
|
|
clearSecretStorageKeys();
|
|
assert.equal(await ask('k1'), null);
|
|
|
|
const key = new Uint8Array([1, 2, 3]);
|
|
storePrivateKey('k1', key);
|
|
key[0] = 9; // the cache keeps its own copy
|
|
assert.deepEqual(await ask('k0', 'k1'), ['k1', new Uint8Array([1, 2, 3])]);
|
|
|
|
cryptoCallbacks.cacheSecretStorageKey!('k2', {} as never, new Uint8Array([7]));
|
|
assert.deepEqual(await ask('k2'), ['k2', new Uint8Array([7])]);
|
|
|
|
clearSecretStorageKeys();
|
|
assert.equal(await ask('k1', 'k2'), null);
|
|
assert.throws(() => storePrivateKey('k3', 'nope' as never), /invalid/);
|
|
});
|