mirror of
https://github.com/bitwarden/browser
synced 2025-12-15 07:43:35 +00:00
* added master password unlock and decryption option fields into identity token connect response * incorrect master password unlock response parsing * use sdk * use sdk * better type checking on response parsing * not using sdk * revert of bad merge conflicts * revert of bad merge conflicts * master password unlock setter in state * unit test coverage for responses processing * master password unlock in identity user decryption options * unit test coverage * unit test coverage * unit test coverage * unit test coverage * lint error * set master password unlock data in state on identity response and sync response * revert change in auth's user decryption options * remove unnecessary cast * better docs * change to relative imports * MasterPasswordUnlockData serialization issue * explicit undefined type for `syncUserDecryption` * incorrect identity token response tests
86 lines
3.5 KiB
TypeScript
86 lines
3.5 KiB
TypeScript
// FIXME: Update this file to be type safe and remove this and next line
|
|
// @ts-strict-ignore
|
|
// This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop.
|
|
// eslint-disable-next-line no-restricted-imports
|
|
import { Argon2KdfConfig, KdfConfig, KdfType, PBKDF2KdfConfig } from "@bitwarden/key-management";
|
|
|
|
import { EncString } from "../../../key-management/crypto/models/enc-string";
|
|
import { BaseResponse } from "../../../models/response/base.response";
|
|
|
|
import { MasterPasswordPolicyResponse } from "./master-password-policy.response";
|
|
import { UserDecryptionOptionsResponse } from "./user-decryption-options/user-decryption-options.response";
|
|
|
|
export class IdentityTokenResponse extends BaseResponse {
|
|
accessToken: string;
|
|
expiresIn?: number;
|
|
refreshToken?: string;
|
|
tokenType: string;
|
|
|
|
resetMasterPassword: boolean;
|
|
privateKey: string; // userKeyEncryptedPrivateKey
|
|
key?: EncString; // masterKeyEncryptedUserKey
|
|
twoFactorToken: string;
|
|
kdfConfig: KdfConfig;
|
|
forcePasswordReset: boolean;
|
|
masterPasswordPolicy: MasterPasswordPolicyResponse;
|
|
apiUseKeyConnector: boolean;
|
|
keyConnectorUrl: string;
|
|
|
|
userDecryptionOptions?: UserDecryptionOptionsResponse;
|
|
|
|
constructor(response: unknown) {
|
|
super(response);
|
|
|
|
const accessToken = this.getResponseProperty("access_token");
|
|
if (accessToken == null || typeof accessToken !== "string") {
|
|
throw new Error("Identity response does not contain a valid access token");
|
|
}
|
|
const tokenType = this.getResponseProperty("token_type");
|
|
if (tokenType == null || typeof tokenType !== "string") {
|
|
throw new Error("Identity response does not contain a valid token type");
|
|
}
|
|
this.accessToken = accessToken;
|
|
this.tokenType = tokenType;
|
|
|
|
const expiresIn = this.getResponseProperty("expires_in");
|
|
if (expiresIn != null && typeof expiresIn === "number") {
|
|
this.expiresIn = expiresIn;
|
|
}
|
|
const refreshToken = this.getResponseProperty("refresh_token");
|
|
if (refreshToken != null && typeof refreshToken === "string") {
|
|
this.refreshToken = refreshToken;
|
|
}
|
|
|
|
this.resetMasterPassword = this.getResponseProperty("ResetMasterPassword");
|
|
this.privateKey = this.getResponseProperty("PrivateKey");
|
|
const key = this.getResponseProperty("Key");
|
|
if (key) {
|
|
this.key = new EncString(key);
|
|
}
|
|
this.twoFactorToken = this.getResponseProperty("TwoFactorToken");
|
|
const kdf = this.getResponseProperty("Kdf");
|
|
const kdfIterations = this.getResponseProperty("KdfIterations");
|
|
const kdfMemory = this.getResponseProperty("KdfMemory");
|
|
const kdfParallelism = this.getResponseProperty("KdfParallelism");
|
|
this.kdfConfig =
|
|
kdf == KdfType.PBKDF2_SHA256
|
|
? new PBKDF2KdfConfig(kdfIterations)
|
|
: new Argon2KdfConfig(kdfIterations, kdfMemory, kdfParallelism);
|
|
this.forcePasswordReset = this.getResponseProperty("ForcePasswordReset");
|
|
this.apiUseKeyConnector = this.getResponseProperty("ApiUseKeyConnector");
|
|
this.keyConnectorUrl = this.getResponseProperty("KeyConnectorUrl");
|
|
this.masterPasswordPolicy = new MasterPasswordPolicyResponse(
|
|
this.getResponseProperty("MasterPasswordPolicy"),
|
|
);
|
|
|
|
const userDecryptionOptions = this.getResponseProperty("UserDecryptionOptions");
|
|
if (userDecryptionOptions != null && typeof userDecryptionOptions === "object") {
|
|
this.userDecryptionOptions = new UserDecryptionOptionsResponse(userDecryptionOptions);
|
|
}
|
|
}
|
|
|
|
hasMasterKeyEncryptedUserKey(): boolean {
|
|
return Boolean(this.key);
|
|
}
|
|
}
|