mirror of
https://github.com/bitwarden/browser
synced 2025-12-19 17:53:39 +00:00
* PM-10684 - ServiceContainer - Add better docs * PM-10684 - UserAutoUnlockKeyService - setUserKeyInMemoryIfAutoUserKeySet - refactor method to return a bool instead of nothing so users can know if a user key was retrieved & set without another call. * PM-10684 - Remove async code ( Program.ts) responsible for setting the auto user key from the session option handler (event emitter which fires when a user passes --session <sessionKey> to a command). Returning this to synchronous execution prevents a race condition between the setting of the user key and the command executing the exitIfLocked logic in the base-program which would check if the user key had been set to determine if the command should be allowed to execute or if the user was locked. When running a loop from a script, the command would often trigger the exitIfLocked before the auto user key could be set in state from the option:session session. * PM-10684 - Clean up missed item per PR feedback
39 lines
1.6 KiB
TypeScript
39 lines
1.6 KiB
TypeScript
import { UserId } from "../../types/guid";
|
|
import { CryptoService } from "../abstractions/crypto.service";
|
|
import { KeySuffixOptions } from "../enums";
|
|
|
|
// TODO: this is a half measure improvement which allows us to reduce some side effects today (cryptoService.getUserKey setting user key in memory if auto key exists)
|
|
// but ideally, in the future, we would be able to put this logic into the cryptoService
|
|
// after the vault timeout settings service is transitioned to state provider so that
|
|
// the getUserKey logic can simply go to the correct location based on the vault timeout settings
|
|
// similar to the TokenService (it would either go to secure storage for the auto user key or memory for the user key)
|
|
|
|
export class UserAutoUnlockKeyService {
|
|
constructor(private cryptoService: CryptoService) {}
|
|
|
|
/**
|
|
* The presence of the user key in memory dictates whether the user's vault is locked or unlocked.
|
|
* However, for users that have the auto unlock user key set, we need to set the user key in memory
|
|
* on application bootstrap and on active account changes so that the user's vault loads unlocked.
|
|
* @param userId - The user id to check for an auto user key.
|
|
* @returns True if the auto user key is set successfully, false otherwise.
|
|
*/
|
|
async setUserKeyInMemoryIfAutoUserKeySet(userId: UserId): Promise<boolean> {
|
|
if (userId == null) {
|
|
return false;
|
|
}
|
|
|
|
const autoUserKey = await this.cryptoService.getUserKeyFromStorage(
|
|
KeySuffixOptions.Auto,
|
|
userId,
|
|
);
|
|
|
|
if (autoUserKey == null) {
|
|
return false;
|
|
}
|
|
|
|
await this.cryptoService.setUserKey(autoUserKey, userId);
|
|
return true;
|
|
}
|
|
}
|