{"version":3,"file":"CacheManager.js","sources":["../../src/cache/CacheManager.ts"],"sourcesContent":["/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AccountCache, AccountFilter, CredentialFilter, CredentialCache, ValidCredentialType, AppMetadataFilter, AppMetadataCache } from \"./utils/CacheTypes\";\r\nimport { CacheRecord } from \"./entities/CacheRecord\";\r\nimport { CacheSchemaType, CredentialType, Constants, APP_METADATA, THE_FAMILY_ID, AUTHORITY_METADATA_CONSTANTS, AuthenticationScheme } from \"../utils/Constants\";\r\nimport { CredentialEntity } from \"./entities/CredentialEntity\";\r\nimport { ScopeSet } from \"../request/ScopeSet\";\r\nimport { AccountEntity } from \"./entities/AccountEntity\";\r\nimport { AccessTokenEntity } from \"./entities/AccessTokenEntity\";\r\nimport { IdTokenEntity } from \"./entities/IdTokenEntity\";\r\nimport { RefreshTokenEntity } from \"./entities/RefreshTokenEntity\";\r\nimport { AuthError } from \"../error/AuthError\";\r\nimport { ICacheManager } from \"./interface/ICacheManager\";\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\nimport { AccountInfo } from \"../account/AccountInfo\";\r\nimport { AppMetadataEntity } from \"./entities/AppMetadataEntity\";\r\nimport { ServerTelemetryEntity } from \"./entities/ServerTelemetryEntity\";\r\nimport { ThrottlingEntity } from \"./entities/ThrottlingEntity\";\r\nimport { AuthToken } from \"../account/AuthToken\";\r\nimport { ICrypto } from \"../crypto/ICrypto\";\r\nimport { AuthorityMetadataEntity } from \"./entities/AuthorityMetadataEntity\";\r\nimport { BaseAuthRequest } from \"../request/BaseAuthRequest\";\r\n\r\n/**\r\n * Interface class which implement cache storage functions used by MSAL to perform validity checks, and store tokens.\r\n */\r\nexport abstract class CacheManager implements ICacheManager {\r\n protected clientId: string;\r\n protected cryptoImpl: ICrypto;\r\n\r\n constructor(clientId: string, cryptoImpl: ICrypto) {\r\n this.clientId = clientId;\r\n this.cryptoImpl = cryptoImpl;\r\n }\r\n\r\n /**\r\n * fetch the account entity from the platform cache\r\n * @param accountKey\r\n */\r\n abstract getAccount(accountKey: string): AccountEntity | null;\r\n\r\n /**\r\n * set account entity in the platform cache\r\n * @param account\r\n */\r\n abstract setAccount(account: AccountEntity): void;\r\n\r\n /**\r\n * fetch the idToken entity from the platform cache\r\n * @param idTokenKey\r\n */\r\n abstract getIdTokenCredential(idTokenKey: string): IdTokenEntity | null;\r\n\r\n /**\r\n * set idToken entity to the platform cache\r\n * @param idToken\r\n */\r\n abstract setIdTokenCredential(idToken: IdTokenEntity): void;\r\n\r\n /**\r\n * fetch the idToken entity from the platform cache\r\n * @param accessTokenKey\r\n */\r\n abstract getAccessTokenCredential(accessTokenKey: string): AccessTokenEntity | null;\r\n\r\n /**\r\n * set idToken entity to the platform cache\r\n * @param accessToken\r\n */\r\n abstract setAccessTokenCredential(accessToken: AccessTokenEntity): void;\r\n\r\n /**\r\n * fetch the idToken entity from the platform cache\r\n * @param refreshTokenKey\r\n */\r\n abstract getRefreshTokenCredential(refreshTokenKey: string): RefreshTokenEntity | null;\r\n\r\n /**\r\n * set idToken entity to the platform cache\r\n * @param refreshToken\r\n */\r\n abstract setRefreshTokenCredential(refreshToken: RefreshTokenEntity): void;\r\n\r\n /**\r\n * fetch appMetadata entity from the platform cache\r\n * @param appMetadataKey\r\n */\r\n abstract getAppMetadata(appMetadataKey: string): AppMetadataEntity | null;\r\n\r\n /**\r\n * set appMetadata entity to the platform cache\r\n * @param appMetadata\r\n */\r\n abstract setAppMetadata(appMetadata: AppMetadataEntity): void;\r\n\r\n /**\r\n * fetch server telemetry entity from the platform cache\r\n * @param serverTelemetryKey\r\n */\r\n abstract getServerTelemetry(serverTelemetryKey: string): ServerTelemetryEntity | null;\r\n\r\n /**\r\n * set server telemetry entity to the platform cache\r\n * @param serverTelemetryKey\r\n * @param serverTelemetry\r\n */\r\n abstract setServerTelemetry(serverTelemetryKey: string, serverTelemetry: ServerTelemetryEntity): void;\r\n\r\n /**\r\n * fetch cloud discovery metadata entity from the platform cache\r\n * @param key\r\n */\r\n abstract getAuthorityMetadata(key: string): AuthorityMetadataEntity | null;\r\n\r\n /**\r\n *\r\n */\r\n abstract getAuthorityMetadataKeys(): Array;\r\n\r\n /**\r\n * set cloud discovery metadata entity to the platform cache\r\n * @param key\r\n * @param value\r\n */\r\n abstract setAuthorityMetadata(key: string, value: AuthorityMetadataEntity): void;\r\n\r\n /**\r\n * fetch throttling entity from the platform cache\r\n * @param throttlingCacheKey\r\n */\r\n abstract getThrottlingCache(throttlingCacheKey: string): ThrottlingEntity | null;\r\n\r\n /**\r\n * set throttling entity to the platform cache\r\n * @param throttlingCacheKey\r\n * @param throttlingCache\r\n */\r\n abstract setThrottlingCache(throttlingCacheKey: string, throttlingCache: ThrottlingEntity): void;;\r\n\r\n /**\r\n * Function to remove an item from cache given its key.\r\n * @param key\r\n */\r\n abstract removeItem(key: string, type?: string): boolean;\r\n\r\n /**\r\n * Function which returns boolean whether cache contains a specific key.\r\n * @param key\r\n */\r\n abstract containsKey(key: string, type?: string): boolean;\r\n\r\n /**\r\n * Function which retrieves all current keys from the cache.\r\n */\r\n abstract getKeys(): string[];\r\n\r\n /**\r\n * Function which clears cache.\r\n */\r\n abstract clear(): Promise;\r\n\r\n /**\r\n * Function which updates an outdated credential cache key\r\n */\r\n abstract updateCredentialCacheKey(currentCacheKey: string, credential: ValidCredentialType): string;\r\n\r\n /**\r\n * Returns all accounts in cache\r\n */\r\n getAllAccounts(): AccountInfo[] {\r\n const currentAccounts: AccountCache = this.getAccountsFilteredBy();\r\n const accountValues: AccountEntity[] = Object.keys(currentAccounts).map(accountKey => currentAccounts[accountKey]);\r\n const numAccounts = accountValues.length;\r\n if (numAccounts < 1) {\r\n return [];\r\n } else {\r\n const allAccounts = accountValues.map((value) => {\r\n const accountEntity = CacheManager.toObject(new AccountEntity(), value);\r\n const accountInfo = accountEntity.getAccountInfo();\r\n const idToken = this.readIdTokenFromCache(this.clientId, accountInfo);\r\n if (idToken && !accountInfo.idTokenClaims) {\r\n accountInfo.idToken = idToken.secret;\r\n accountInfo.idTokenClaims = new AuthToken(idToken.secret, this.cryptoImpl).claims;\r\n }\r\n\r\n return accountInfo;\r\n\r\n });\r\n return allAccounts;\r\n }\r\n }\r\n\r\n /**\r\n * saves a cache record\r\n * @param cacheRecord\r\n */\r\n async saveCacheRecord(cacheRecord: CacheRecord): Promise {\r\n if (!cacheRecord) {\r\n throw ClientAuthError.createNullOrUndefinedCacheRecord();\r\n }\r\n\r\n if (!!cacheRecord.account) {\r\n this.setAccount(cacheRecord.account);\r\n }\r\n\r\n if (!!cacheRecord.idToken) {\r\n this.setIdTokenCredential(cacheRecord.idToken);\r\n }\r\n\r\n if (!!cacheRecord.accessToken) {\r\n await this.saveAccessToken(cacheRecord.accessToken);\r\n }\r\n\r\n if (!!cacheRecord.refreshToken) {\r\n this.setRefreshTokenCredential(cacheRecord.refreshToken);\r\n }\r\n\r\n if (!!cacheRecord.appMetadata) {\r\n this.setAppMetadata(cacheRecord.appMetadata);\r\n }\r\n }\r\n\r\n /**\r\n * saves access token credential\r\n * @param credential\r\n */\r\n private async saveAccessToken(credential: AccessTokenEntity): Promise {\r\n const currentTokenCache = this.getCredentialsFilteredBy({\r\n clientId: credential.clientId,\r\n credentialType: credential.credentialType,\r\n environment: credential.environment,\r\n homeAccountId: credential.homeAccountId,\r\n realm: credential.realm,\r\n tokenType: credential.tokenType,\r\n requestedClaimsHash: credential.requestedClaimsHash\r\n });\r\n\r\n const currentScopes = ScopeSet.fromString(credential.target);\r\n const currentAccessTokens: AccessTokenEntity[] = Object.keys(currentTokenCache.accessTokens).map(key => currentTokenCache.accessTokens[key]);\r\n\r\n if (currentAccessTokens) {\r\n const removedAccessTokens: Array> = [];\r\n currentAccessTokens.forEach((tokenEntity) => {\r\n const tokenScopeSet = ScopeSet.fromString(tokenEntity.target);\r\n if (tokenScopeSet.intersectingScopeSets(currentScopes)) {\r\n removedAccessTokens.push(this.removeCredential(tokenEntity));\r\n }\r\n });\r\n await Promise.all(removedAccessTokens);\r\n }\r\n this.setAccessTokenCredential(credential);\r\n }\r\n\r\n /**\r\n * retrieve accounts matching all provided filters; if no filter is set, get all accounts\r\n * not checking for casing as keys are all generated in lower case, remember to convert to lower case if object properties are compared\r\n * @param homeAccountId\r\n * @param environment\r\n * @param realm\r\n */\r\n getAccountsFilteredBy(accountFilter?: AccountFilter): AccountCache {\r\n return this.getAccountsFilteredByInternal(\r\n accountFilter ? accountFilter.homeAccountId : Constants.EMPTY_STRING,\r\n accountFilter ? accountFilter.environment : Constants.EMPTY_STRING,\r\n accountFilter ? accountFilter.realm : Constants.EMPTY_STRING,\r\n accountFilter ? accountFilter.nativeAccountId: Constants.EMPTY_STRING,\r\n );\r\n }\r\n\r\n /**\r\n * retrieve accounts matching all provided filters; if no filter is set, get all accounts\r\n * not checking for casing as keys are all generated in lower case, remember to convert to lower case if object properties are compared\r\n * @param homeAccountId\r\n * @param environment\r\n * @param realm\r\n */\r\n private getAccountsFilteredByInternal(\r\n homeAccountId?: string,\r\n environment?: string,\r\n realm?: string,\r\n nativeAccountId?: string,\r\n ): AccountCache {\r\n const allCacheKeys = this.getKeys();\r\n const matchingAccounts: AccountCache = {};\r\n\r\n allCacheKeys.forEach((cacheKey) => {\r\n const entity: AccountEntity | null = this.getAccount(cacheKey);\r\n\r\n if (!entity) {\r\n return;\r\n }\r\n\r\n if (!!homeAccountId && !this.matchHomeAccountId(entity, homeAccountId)) {\r\n return;\r\n }\r\n\r\n if (!!environment && !this.matchEnvironment(entity, environment)) {\r\n return;\r\n }\r\n\r\n if (!!realm && !this.matchRealm(entity, realm)) {\r\n return;\r\n }\r\n\r\n if (!!nativeAccountId && !this.matchNativeAccountId(entity, nativeAccountId)) {\r\n return;\r\n }\r\n\r\n matchingAccounts[cacheKey] = entity;\r\n });\r\n\r\n return matchingAccounts;\r\n }\r\n\r\n /**\r\n * retrieve credentails matching all provided filters; if no filter is set, get all credentials\r\n * @param homeAccountId\r\n * @param environment\r\n * @param credentialType\r\n * @param clientId\r\n * @param realm\r\n * @param target\r\n */\r\n getCredentialsFilteredBy(filter: CredentialFilter): CredentialCache {\r\n return this.getCredentialsFilteredByInternal(\r\n filter.homeAccountId,\r\n filter.environment,\r\n filter.credentialType,\r\n filter.clientId,\r\n filter.familyId,\r\n filter.realm,\r\n filter.target,\r\n filter.userAssertionHash,\r\n filter.tokenType,\r\n filter.keyId,\r\n filter.requestedClaimsHash\r\n );\r\n }\r\n\r\n /**\r\n * Support function to help match credentials\r\n * @param homeAccountId\r\n * @param environment\r\n * @param credentialType\r\n * @param clientId\r\n * @param realm\r\n * @param target\r\n * @param userAssertionHash\r\n * @param tokenType\r\n */\r\n private getCredentialsFilteredByInternal(\r\n homeAccountId?: string,\r\n environment?: string,\r\n credentialType?: string,\r\n clientId?: string,\r\n familyId?: string,\r\n realm?: string,\r\n target?: string,\r\n userAssertionHash?: string,\r\n tokenType?: AuthenticationScheme,\r\n keyId?: string,\r\n requestedClaimsHash?: string\r\n ): CredentialCache {\r\n const allCacheKeys = this.getKeys();\r\n const matchingCredentials: CredentialCache = {\r\n idTokens: {},\r\n accessTokens: {},\r\n refreshTokens: {},\r\n };\r\n\r\n allCacheKeys.forEach((cacheKey) => {\r\n // don't parse any non-credential type cache entities\r\n const credType = CredentialEntity.getCredentialType(cacheKey);\r\n\r\n if (credType === Constants.NOT_DEFINED) {\r\n return;\r\n }\r\n\r\n // Attempt retrieval\r\n const entity = this.getSpecificCredential(cacheKey, credType);\r\n\r\n if (!entity) {\r\n return;\r\n }\r\n\r\n if (!!userAssertionHash && !this.matchUserAssertionHash(entity, userAssertionHash)) {\r\n return;\r\n }\r\n\r\n /*\r\n * homeAccountId can undefined, and we want to filter out cached items that have a homeAccountId of \"\"\r\n * because we don't want a client_credential request to return a cached token that has a homeAccountId\r\n */\r\n if ((typeof homeAccountId === \"string\") && !this.matchHomeAccountId(entity, homeAccountId)) {\r\n return;\r\n }\r\n\r\n if (!!environment && !this.matchEnvironment(entity, environment)) {\r\n return;\r\n }\r\n\r\n if (!!realm && !this.matchRealm(entity, realm)) {\r\n return;\r\n }\r\n\r\n if (!!credentialType && !this.matchCredentialType(entity, credentialType)) {\r\n return;\r\n }\r\n\r\n if (!!clientId && !this.matchClientId(entity, clientId)) {\r\n return;\r\n }\r\n\r\n if (!!familyId && !this.matchFamilyId(entity, familyId)) {\r\n return;\r\n }\r\n\r\n /*\r\n * idTokens do not have \"target\", target specific refreshTokens do exist for some types of authentication\r\n * Resource specific refresh tokens case will be added when the support is deemed necessary\r\n */\r\n if (!!target && !this.matchTarget(entity, target)) {\r\n return;\r\n }\r\n\r\n // If request OR cached entity has requested Claims Hash, check if they match\r\n if (requestedClaimsHash || entity.requestedClaimsHash) {\r\n // Don't match if either is undefined or they are different\r\n if (entity.requestedClaimsHash !== requestedClaimsHash) {\r\n return;\r\n }\r\n }\r\n\r\n // Access Token with Auth Scheme specific matching\r\n if (credentialType === CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME) {\r\n if(!!tokenType && !this.matchTokenType(entity, tokenType)) {\r\n return;\r\n }\r\n\r\n // KeyId (sshKid) in request must match cached SSH certificate keyId because SSH cert is bound to a specific key\r\n if (tokenType === AuthenticationScheme.SSH) {\r\n if(keyId && !this.matchKeyId(entity, keyId)) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // At this point, the entity matches the request, update cache key if key schema has changed\r\n const updatedCacheKey = this.updateCredentialCacheKey(cacheKey, entity);\r\n\r\n switch (credType) {\r\n case CredentialType.ID_TOKEN:\r\n matchingCredentials.idTokens[updatedCacheKey] = entity as IdTokenEntity;\r\n break;\r\n case CredentialType.ACCESS_TOKEN:\r\n case CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME:\r\n matchingCredentials.accessTokens[updatedCacheKey] = entity as AccessTokenEntity;\r\n break;\r\n case CredentialType.REFRESH_TOKEN:\r\n matchingCredentials.refreshTokens[updatedCacheKey] = entity as RefreshTokenEntity;\r\n break;\r\n }\r\n });\r\n\r\n return matchingCredentials;\r\n }\r\n\r\n /**\r\n * retrieve appMetadata matching all provided filters; if no filter is set, get all appMetadata\r\n * @param filter\r\n */\r\n getAppMetadataFilteredBy(filter: AppMetadataFilter): AppMetadataCache {\r\n return this.getAppMetadataFilteredByInternal(\r\n filter.environment,\r\n filter.clientId,\r\n );\r\n }\r\n\r\n /**\r\n * Support function to help match appMetadata\r\n * @param environment\r\n * @param clientId\r\n */\r\n private getAppMetadataFilteredByInternal(\r\n environment?: string,\r\n clientId?: string\r\n ): AppMetadataCache {\r\n\r\n const allCacheKeys = this.getKeys();\r\n const matchingAppMetadata: AppMetadataCache = {};\r\n\r\n allCacheKeys.forEach((cacheKey) => {\r\n // don't parse any non-appMetadata type cache entities\r\n if (!this.isAppMetadata(cacheKey)) {\r\n return;\r\n }\r\n\r\n // Attempt retrieval\r\n const entity = this.getAppMetadata(cacheKey);\r\n\r\n if (!entity) {\r\n return;\r\n }\r\n\r\n if (!!environment && !this.matchEnvironment(entity, environment)) {\r\n return;\r\n }\r\n\r\n if (!!clientId && !this.matchClientId(entity, clientId)) {\r\n return;\r\n }\r\n\r\n matchingAppMetadata[cacheKey] = entity;\r\n\r\n });\r\n\r\n return matchingAppMetadata;\r\n }\r\n\r\n /**\r\n * retrieve authorityMetadata that contains a matching alias\r\n * @param filter\r\n */\r\n getAuthorityMetadataByAlias(host: string): AuthorityMetadataEntity | null {\r\n const allCacheKeys = this.getAuthorityMetadataKeys();\r\n let matchedEntity = null;\r\n\r\n allCacheKeys.forEach((cacheKey) => {\r\n // don't parse any non-authorityMetadata type cache entities\r\n if (!this.isAuthorityMetadata(cacheKey) || cacheKey.indexOf(this.clientId) === -1) {\r\n return;\r\n }\r\n\r\n // Attempt retrieval\r\n const entity = this.getAuthorityMetadata(cacheKey);\r\n\r\n if (!entity) {\r\n return;\r\n }\r\n\r\n if (entity.aliases.indexOf(host) === -1) {\r\n return;\r\n }\r\n\r\n matchedEntity = entity;\r\n\r\n });\r\n\r\n return matchedEntity;\r\n }\r\n\r\n /**\r\n * Removes all accounts and related tokens from cache.\r\n */\r\n async removeAllAccounts(): Promise {\r\n const allCacheKeys = this.getKeys();\r\n const removedAccounts: Array> = [];\r\n\r\n allCacheKeys.forEach((cacheKey) => {\r\n const entity = this.getAccount(cacheKey);\r\n if (!entity) {\r\n return;\r\n }\r\n removedAccounts.push(this.removeAccount(cacheKey));\r\n });\r\n\r\n await Promise.all(removedAccounts);\r\n return true;\r\n }\r\n\r\n /**\r\n * returns a boolean if the given account is removed\r\n * @param account\r\n */\r\n async removeAccount(accountKey: string): Promise {\r\n const account = this.getAccount(accountKey);\r\n if (!account) {\r\n throw ClientAuthError.createNoAccountFoundError();\r\n }\r\n return (await this.removeAccountContext(account) && this.removeItem(accountKey, CacheSchemaType.ACCOUNT));\r\n }\r\n\r\n /**\r\n * Removes credentials associated with the provided account\r\n * @param account\r\n */\r\n async removeAccountContext(account: AccountEntity): Promise {\r\n const allCacheKeys = this.getKeys();\r\n const accountId = account.generateAccountId();\r\n const removedCredentials: Array> = [];\r\n\r\n allCacheKeys.forEach((cacheKey) => {\r\n // don't parse any non-credential type cache entities\r\n const credType = CredentialEntity.getCredentialType(cacheKey);\r\n if (credType === Constants.NOT_DEFINED) {\r\n return;\r\n }\r\n\r\n const cacheEntity = this.getSpecificCredential(cacheKey, credType);\r\n if (!!cacheEntity && accountId === cacheEntity.generateAccountId()) {\r\n removedCredentials.push(this.removeCredential(cacheEntity));\r\n }\r\n });\r\n\r\n await Promise.all(removedCredentials);\r\n return true;\r\n }\r\n\r\n /**\r\n * returns a boolean if the given credential is removed\r\n * @param credential\r\n */\r\n async removeCredential(credential: CredentialEntity): Promise {\r\n const key = credential.generateCredentialKey();\r\n\r\n // Remove Token Binding Key from key store for PoP Tokens Credentials\r\n if (credential.credentialType.toLowerCase() === CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME.toLowerCase()) {\r\n if(credential.tokenType === AuthenticationScheme.POP) {\r\n const accessTokenWithAuthSchemeEntity = credential as AccessTokenEntity;\r\n const kid = accessTokenWithAuthSchemeEntity.keyId;\r\n\r\n if (kid) {\r\n try {\r\n await this.cryptoImpl.removeTokenBindingKey(kid);\r\n } catch (error) {\r\n throw ClientAuthError.createBindingKeyNotRemovedError();\r\n }\r\n }\r\n }\r\n }\r\n\r\n return this.removeItem(key, CacheSchemaType.CREDENTIAL);\r\n }\r\n\r\n /**\r\n * Removes all app metadata objects from cache.\r\n */\r\n removeAppMetadata(): boolean {\r\n const allCacheKeys = this.getKeys();\r\n allCacheKeys.forEach((cacheKey) => {\r\n if (this.isAppMetadata(cacheKey)) {\r\n this.removeItem(cacheKey, CacheSchemaType.APP_METADATA);\r\n }\r\n });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Retrieve the cached credentials into a cacherecord\r\n * @param account\r\n * @param clientId\r\n * @param scopes\r\n * @param environment\r\n * @param authScheme\r\n */\r\n readCacheRecord(account: AccountInfo, clientId: string, request: BaseAuthRequest, environment: string): CacheRecord {\r\n\r\n const cachedAccount = this.readAccountFromCache(account);\r\n const cachedIdToken = this.readIdTokenFromCache(clientId, account);\r\n const cachedAccessToken = this.readAccessTokenFromCache(clientId, account, request);\r\n const cachedRefreshToken = this.readRefreshTokenFromCache(clientId, account, false);\r\n const cachedAppMetadata = this.readAppMetadataFromCache(environment, clientId);\r\n\r\n if (cachedAccount && cachedIdToken) {\r\n cachedAccount.idTokenClaims = new AuthToken(cachedIdToken.secret, this.cryptoImpl).claims;\r\n }\r\n\r\n return {\r\n account: cachedAccount,\r\n idToken: cachedIdToken,\r\n accessToken: cachedAccessToken,\r\n refreshToken: cachedRefreshToken,\r\n appMetadata: cachedAppMetadata,\r\n };\r\n }\r\n\r\n /**\r\n * Retrieve AccountEntity from cache\r\n * @param account\r\n */\r\n readAccountFromCache(account: AccountInfo): AccountEntity | null {\r\n const accountKey: string = AccountEntity.generateAccountCacheKey(account);\r\n return this.getAccount(accountKey);\r\n }\r\n\r\n /**\r\n * Retrieve AccountEntity from cache\r\n * @param nativeAccountId\r\n * @returns AccountEntity or Null\r\n */\r\n readAccountFromCacheWithNativeAccountId(nativeAccountId: string): AccountEntity | null {\r\n // fetch account from memory\r\n const accountFilter: AccountFilter = {\r\n nativeAccountId\r\n };\r\n const accountCache: AccountCache = this.getAccountsFilteredBy(accountFilter);\r\n const accounts = Object.keys(accountCache).map((key) => accountCache[key]);\r\n\r\n if (accounts.length < 1) {\r\n return null;\r\n } else if (accounts.length > 1) {\r\n throw ClientAuthError.createMultipleMatchingAccountsInCacheError();\r\n }\r\n\r\n return accountCache[0];\r\n }\r\n\r\n /**\r\n * Retrieve IdTokenEntity from cache\r\n * @param clientId\r\n * @param account\r\n * @param inputRealm\r\n */\r\n readIdTokenFromCache(clientId: string, account: AccountInfo): IdTokenEntity | null {\r\n const idTokenFilter: CredentialFilter = {\r\n homeAccountId: account.homeAccountId,\r\n environment: account.environment,\r\n credentialType: CredentialType.ID_TOKEN,\r\n clientId: clientId,\r\n realm: account.tenantId,\r\n };\r\n\r\n const credentialCache: CredentialCache = this.getCredentialsFilteredBy(idTokenFilter);\r\n const idTokens = Object.keys(credentialCache.idTokens).map((key) => credentialCache.idTokens[key]);\r\n const numIdTokens = idTokens.length;\r\n\r\n if (numIdTokens < 1) {\r\n return null;\r\n } else if (numIdTokens > 1) {\r\n throw ClientAuthError.createMultipleMatchingTokensInCacheError();\r\n }\r\n\r\n return idTokens[0] as IdTokenEntity;\r\n }\r\n\r\n /**\r\n * Retrieve AccessTokenEntity from cache\r\n * @param clientId\r\n * @param account\r\n * @param scopes\r\n * @param authScheme\r\n */\r\n readAccessTokenFromCache(clientId: string, account: AccountInfo, request: BaseAuthRequest): AccessTokenEntity | null {\r\n const scopes = new ScopeSet(request.scopes || []);\r\n const authScheme = request.authenticationScheme || AuthenticationScheme.BEARER;\r\n /*\r\n * Distinguish between Bearer and PoP/SSH token cache types\r\n * Cast to lowercase to handle \"bearer\" from ADFS\r\n */\r\n const credentialType = (authScheme && authScheme.toLowerCase() !== AuthenticationScheme.BEARER.toLowerCase()) ? CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME : CredentialType.ACCESS_TOKEN;\r\n\r\n const accessTokenFilter: CredentialFilter = {\r\n homeAccountId: account.homeAccountId,\r\n environment: account.environment,\r\n credentialType: credentialType,\r\n clientId,\r\n realm: account.tenantId,\r\n target: scopes.printScopesLowerCase(),\r\n tokenType: authScheme,\r\n keyId: request.sshKid,\r\n requestedClaimsHash: request.requestedClaimsHash,\r\n };\r\n\r\n const credentialCache: CredentialCache = this.getCredentialsFilteredBy(accessTokenFilter);\r\n\r\n const accessTokens = Object.keys(credentialCache.accessTokens).map((key) => credentialCache.accessTokens[key]);\r\n\r\n const numAccessTokens = accessTokens.length;\r\n if (numAccessTokens < 1) {\r\n return null;\r\n } else if (numAccessTokens > 1) {\r\n throw ClientAuthError.createMultipleMatchingTokensInCacheError();\r\n }\r\n\r\n return accessTokens[0] as AccessTokenEntity;\r\n }\r\n\r\n /**\r\n * Helper to retrieve the appropriate refresh token from cache\r\n * @param clientId\r\n * @param account\r\n * @param familyRT\r\n */\r\n readRefreshTokenFromCache(clientId: string, account: AccountInfo, familyRT: boolean): RefreshTokenEntity | null {\r\n const id = familyRT ? THE_FAMILY_ID : undefined;\r\n const refreshTokenFilter: CredentialFilter = {\r\n homeAccountId: account.homeAccountId,\r\n environment: account.environment,\r\n credentialType: CredentialType.REFRESH_TOKEN,\r\n clientId: clientId,\r\n familyId: id,\r\n };\r\n\r\n const credentialCache: CredentialCache = this.getCredentialsFilteredBy(refreshTokenFilter);\r\n const refreshTokens = Object.keys(credentialCache.refreshTokens).map((key) => credentialCache.refreshTokens[key]);\r\n\r\n const numRefreshTokens = refreshTokens.length;\r\n if (numRefreshTokens < 1) {\r\n return null;\r\n }\r\n // address the else case after remove functions address environment aliases\r\n\r\n return refreshTokens[0] as RefreshTokenEntity;\r\n }\r\n\r\n /**\r\n * Retrieve AppMetadataEntity from cache\r\n */\r\n readAppMetadataFromCache(environment: string, clientId: string): AppMetadataEntity | null {\r\n const appMetadataFilter: AppMetadataFilter = {\r\n environment,\r\n clientId,\r\n };\r\n\r\n const appMetadata: AppMetadataCache = this.getAppMetadataFilteredBy(appMetadataFilter);\r\n const appMetadataEntries: AppMetadataEntity[] = Object.keys(appMetadata).map((key) => appMetadata[key]);\r\n\r\n const numAppMetadata = appMetadataEntries.length;\r\n if (numAppMetadata < 1) {\r\n return null;\r\n } else if (numAppMetadata > 1) {\r\n throw ClientAuthError.createMultipleMatchingAppMetadataInCacheError();\r\n }\r\n\r\n return appMetadataEntries[0] as AppMetadataEntity;\r\n }\r\n\r\n /**\r\n * Return the family_id value associated with FOCI\r\n * @param environment\r\n * @param clientId\r\n */\r\n isAppMetadataFOCI(environment: string, clientId: string): boolean {\r\n const appMetadata = this.readAppMetadataFromCache(environment, clientId);\r\n return !!(appMetadata && appMetadata.familyId === THE_FAMILY_ID);\r\n }\r\n\r\n /**\r\n * helper to match account ids\r\n * @param value\r\n * @param homeAccountId\r\n */\r\n private matchHomeAccountId(entity: AccountEntity | CredentialEntity, homeAccountId: string): boolean {\r\n return !!((typeof entity.homeAccountId === \"string\") && (homeAccountId === entity.homeAccountId));\r\n }\r\n\r\n /**\r\n * helper to match assertion\r\n * @param value\r\n * @param oboAssertion\r\n */\r\n private matchUserAssertionHash(entity: CredentialEntity, userAssertionHash: string): boolean {\r\n return !!(entity.userAssertionHash && userAssertionHash === entity.userAssertionHash);\r\n }\r\n\r\n /**\r\n * helper to match environment\r\n * @param value\r\n * @param environment\r\n */\r\n private matchEnvironment(entity: AccountEntity | CredentialEntity | AppMetadataEntity, environment: string): boolean {\r\n const cloudMetadata = this.getAuthorityMetadataByAlias(environment);\r\n if (cloudMetadata && cloudMetadata.aliases.indexOf(entity.environment) > -1) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * helper to match credential type\r\n * @param entity\r\n * @param credentialType\r\n */\r\n private matchCredentialType(entity: CredentialEntity, credentialType: string): boolean {\r\n return (entity.credentialType && credentialType.toLowerCase() === entity.credentialType.toLowerCase());\r\n }\r\n\r\n /**\r\n * helper to match client ids\r\n * @param entity\r\n * @param clientId\r\n */\r\n private matchClientId(entity: CredentialEntity | AppMetadataEntity, clientId: string): boolean {\r\n return !!(entity.clientId && clientId === entity.clientId);\r\n }\r\n\r\n /**\r\n * helper to match family ids\r\n * @param entity\r\n * @param familyId\r\n */\r\n private matchFamilyId(entity: CredentialEntity | AppMetadataEntity, familyId: string): boolean {\r\n return !!(entity.familyId && familyId === entity.familyId);\r\n }\r\n\r\n /**\r\n * helper to match realm\r\n * @param entity\r\n * @param realm\r\n */\r\n private matchRealm(entity: AccountEntity | CredentialEntity, realm: string): boolean {\r\n return !!(entity.realm && realm === entity.realm);\r\n }\r\n\r\n /**\r\n * helper to match nativeAccountId\r\n * @param entity\r\n * @param nativeAccountId\r\n * @returns boolean indicating the match result\r\n */\r\n private matchNativeAccountId(entity: AccountEntity, nativeAccountId: string): boolean {\r\n return !!(entity.nativeAccountId && nativeAccountId === entity.nativeAccountId);\r\n }\r\n\r\n /**\r\n * Returns true if the target scopes are a subset of the current entity's scopes, false otherwise.\r\n * @param entity\r\n * @param target\r\n */\r\n private matchTarget(entity: CredentialEntity, target: string): boolean {\r\n const isNotAccessTokenCredential = (entity.credentialType !== CredentialType.ACCESS_TOKEN && entity.credentialType !== CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME);\r\n\r\n if ( isNotAccessTokenCredential || !entity.target) {\r\n return false;\r\n }\r\n\r\n const entityScopeSet: ScopeSet = ScopeSet.fromString(entity.target);\r\n const requestTargetScopeSet: ScopeSet = ScopeSet.fromString(target);\r\n\r\n if (!requestTargetScopeSet.containsOnlyOIDCScopes()) {\r\n requestTargetScopeSet.removeOIDCScopes(); // ignore OIDC scopes\r\n } else {\r\n requestTargetScopeSet.removeScope(Constants.OFFLINE_ACCESS_SCOPE);\r\n }\r\n return entityScopeSet.containsScopeSet(requestTargetScopeSet);\r\n }\r\n\r\n /**\r\n * Returns true if the credential's tokenType or Authentication Scheme matches the one in the request, false otherwise\r\n * @param entity\r\n * @param tokenType\r\n */\r\n private matchTokenType(entity: CredentialEntity, tokenType: AuthenticationScheme): boolean {\r\n return !!(entity.tokenType && entity.tokenType === tokenType);\r\n }\r\n\r\n /**\r\n * Returns true if the credential's keyId matches the one in the request, false otherwise\r\n * @param entity\r\n * @param tokenType\r\n */\r\n private matchKeyId(entity: CredentialEntity, keyId: string): boolean {\r\n return !!(entity.keyId && entity.keyId === keyId);\r\n }\r\n\r\n /**\r\n * returns if a given cache entity is of the type appmetadata\r\n * @param key\r\n */\r\n private isAppMetadata(key: string): boolean {\r\n return key.indexOf(APP_METADATA) !== -1;\r\n }\r\n\r\n /**\r\n * returns if a given cache entity is of the type authoritymetadata\r\n * @param key\r\n */\r\n protected isAuthorityMetadata(key: string): boolean {\r\n return key.indexOf(AUTHORITY_METADATA_CONSTANTS.CACHE_KEY) !== -1;\r\n }\r\n\r\n /**\r\n * returns cache key used for cloud instance metadata\r\n */\r\n generateAuthorityMetadataCacheKey(authority: string): string {\r\n return `${AUTHORITY_METADATA_CONSTANTS.CACHE_KEY}-${this.clientId}-${authority}`;\r\n }\r\n\r\n /**\r\n * Returns the specific credential (IdToken/AccessToken/RefreshToken) from the cache\r\n * @param key\r\n * @param credType\r\n */\r\n private getSpecificCredential(key: string, credType: string): ValidCredentialType | null {\r\n switch (credType) {\r\n case CredentialType.ID_TOKEN: {\r\n return this.getIdTokenCredential(key);\r\n }\r\n case CredentialType.ACCESS_TOKEN:\r\n case CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME: {\r\n return this.getAccessTokenCredential(key);\r\n }\r\n case CredentialType.REFRESH_TOKEN: {\r\n return this.getRefreshTokenCredential(key);\r\n }\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Helper to convert serialized data to object\r\n * @param obj\r\n * @param json\r\n */\r\n static toObject(obj: T, json: object): T {\r\n for (const propertyName in json) {\r\n obj[propertyName] = json[propertyName];\r\n }\r\n return obj;\r\n }\r\n}\r\n\r\nexport class DefaultStorageClass extends CacheManager {\r\n setAccount(): void {\r\n const notImplErr = \"Storage interface - setAccount() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n getAccount(): AccountEntity {\r\n const notImplErr = \"Storage interface - getAccount() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n setIdTokenCredential(): void {\r\n const notImplErr = \"Storage interface - setIdTokenCredential() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n getIdTokenCredential(): IdTokenEntity {\r\n const notImplErr = \"Storage interface - getIdTokenCredential() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n setAccessTokenCredential(): void {\r\n const notImplErr = \"Storage interface - setAccessTokenCredential() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n getAccessTokenCredential(): AccessTokenEntity {\r\n const notImplErr = \"Storage interface - getAccessTokenCredential() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n setRefreshTokenCredential(): void {\r\n const notImplErr = \"Storage interface - setRefreshTokenCredential() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n getRefreshTokenCredential(): RefreshTokenEntity {\r\n const notImplErr = \"Storage interface - getRefreshTokenCredential() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n setAppMetadata(): void {\r\n const notImplErr = \"Storage interface - setAppMetadata() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n getAppMetadata(): AppMetadataEntity {\r\n const notImplErr = \"Storage interface - getAppMetadata() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n setServerTelemetry(): void {\r\n const notImplErr = \"Storage interface - setServerTelemetry() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n getServerTelemetry(): ServerTelemetryEntity {\r\n const notImplErr = \"Storage interface - getServerTelemetry() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n setAuthorityMetadata(): void {\r\n const notImplErr = \"Storage interface - setAuthorityMetadata() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n getAuthorityMetadata(): AuthorityMetadataEntity | null {\r\n const notImplErr = \"Storage interface - getAuthorityMetadata() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n getAuthorityMetadataKeys(): Array {\r\n const notImplErr = \"Storage interface - getAuthorityMetadataKeys() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n setThrottlingCache(): void {\r\n const notImplErr = \"Storage interface - setThrottlingCache() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n getThrottlingCache(): ThrottlingEntity {\r\n const notImplErr = \"Storage interface - getThrottlingCache() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n removeItem(): boolean {\r\n const notImplErr = \"Storage interface - removeItem() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n containsKey(): boolean {\r\n const notImplErr = \"Storage interface - containsKey() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n getKeys(): string[] {\r\n const notImplErr = \"Storage interface - getKeys() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n async clear(): Promise {\r\n const notImplErr = \"Storage interface - clear() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n updateCredentialCacheKey(): string {\r\n const notImplErr = \"Storage interface - updateCredentialCacheKey() has not been implemented for the cacheStorage interface.\";\r\n throw AuthError.createUnexpectedError(notImplErr);\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}