diff --git a/keeperapi/package-lock.json b/keeperapi/package-lock.json index cd731ff2..9239e9cd 100644 --- a/keeperapi/package-lock.json +++ b/keeperapi/package-lock.json @@ -1,12 +1,12 @@ { "name": "@keeper-security/keeperapi", - "version": "16.0.78", + "version": "16.0.80", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@keeper-security/keeperapi", - "version": "16.0.78", + "version": "16.0.80", "license": "ISC", "dependencies": { "asmcrypto.js": "^2.3.2", diff --git a/keeperapi/package.json b/keeperapi/package.json index 4ceb5234..0a6d604f 100644 --- a/keeperapi/package.json +++ b/keeperapi/package.json @@ -1,7 +1,7 @@ { "name": "@keeper-security/keeperapi", "description": "Keeper API Javascript SDK", - "version": "16.0.79", + "version": "16.0.80", "browser": "dist/index.es.js", "main": "dist/index.cjs.js", "types": "dist/node/index.d.ts", diff --git a/keeperapi/src/browser/platform.ts b/keeperapi/src/browser/platform.ts index 50cc5790..a5cf27e4 100644 --- a/keeperapi/src/browser/platform.ts +++ b/keeperapi/src/browser/platform.ts @@ -133,6 +133,23 @@ export const browserPlatform: Platform = class { keyBytesCache = {} } + static unloadNonUserKeys(): void { + cryptoKeysCache = { + cbc: { + data: cryptoKeysCache.cbc.data + }, + gcm: { + data: cryptoKeysCache.gcm.data + }, + ecc: { + pk_ecc: cryptoKeysCache.ecc.pk_ecc + }, + } + keyBytesCache = { + pk_rsa: keyBytesCache.pk_rsa + } + } + static getStorageKeyId(keyId: string, keyType: EncryptionType): string { switch (keyType) { case 'cbc': diff --git a/keeperapi/src/node/platform.ts b/keeperapi/src/node/platform.ts index d351afa0..db334f28 100644 --- a/keeperapi/src/node/platform.ts +++ b/keeperapi/src/node/platform.ts @@ -79,6 +79,14 @@ export const nodePlatform: Platform = class { keyCache = {} } + static unloadNonUserKeys(): void { + keyCache = { + data: keyCache.data, + pk_ecc: keyCache.pk_ecc, + pk_rsa: keyCache.pk_rsa, + } + } + static async unwrapKeys(keys: UnwrapKeyMap, storage?: KeyStorage): Promise { for (const task of Object.values(keys)) { try { diff --git a/keeperapi/src/platform.ts b/keeperapi/src/platform.ts index b7bc71f3..1b620f3c 100644 --- a/keeperapi/src/platform.ts +++ b/keeperapi/src/platform.ts @@ -27,8 +27,14 @@ export interface Platform { importKeyRSA(keyId: string, key: Uint8Array, storage?: KeyStorage, canExport?: boolean): Promise + // Removes all keys stored in the local cache, including user keys, record keys, etc. + // A typical use case is during logout, when you want to completely clear the cached keys. unloadKeys(): void + // Clears all cached keys except user keys. + // A good use case is a manual full sync while the user is still logged in. + unloadNonUserKeys(): void + unwrapKey(key: Uint8Array, keyId: string, unwrappingKeyId: string, encryptionType: EncryptionType, unwrappedType: UnwrappedKeyType, storage?: KeyStorage, canExport?: boolean): Promise unwrapKeys(keys: UnwrapKeyMap, storage?: KeyStorage): Promise diff --git a/keeperapi/src/vault.ts b/keeperapi/src/vault.ts index 7866aa7b..6cf1aeb5 100644 --- a/keeperapi/src/vault.ts +++ b/keeperapi/src/vault.ts @@ -1057,6 +1057,7 @@ export const syncDown = async (options: SyncDownOptions): Promise => addCounts(totalCounts, counts) logProtobuf(resp, options.logFormat || '!', result.pageCount, counts) if (resp.cacheStatus == CacheStatus.CLEAR) { + platform.unloadNonUserKeys() await storage.clear() result.fullSync = true }