Commit 3a84cbd5 authored by Ahmet Turan Koçak's avatar Ahmet Turan Koçak
Browse files

Initial commit

parents
/*! @azure/msal-browser v2.32.1 2022-12-07 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { BrowserAuthError, BrowserAuthErrorMessage } from '../error/BrowserAuthError.js';
import { DatabaseStorage } from './DatabaseStorage.js';
import { MemoryStorage } from './MemoryStorage.js';
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
/**
* This class allows MSAL to store artifacts asynchronously using the DatabaseStorage IndexedDB wrapper,
* backed up with the more volatile MemoryStorage object for cases in which IndexedDB may be unavailable.
*/
var AsyncMemoryStorage = /** @class */ (function () {
function AsyncMemoryStorage(logger, storeName) {
this.inMemoryCache = new MemoryStorage();
this.indexedDBCache = new DatabaseStorage();
this.logger = logger;
this.storeName = storeName;
}
AsyncMemoryStorage.prototype.handleDatabaseAccessError = function (error) {
if (error instanceof BrowserAuthError && error.errorCode === BrowserAuthErrorMessage.databaseUnavailable.code) {
this.logger.error("Could not access persistent storage. This may be caused by browser privacy features which block persistent storage in third-party contexts.");
}
else {
throw error;
}
};
/**
* Get the item matching the given key. Tries in-memory cache first, then in the asynchronous
* storage object if item isn't found in-memory.
* @param key
*/
AsyncMemoryStorage.prototype.getItem = function (key) {
return __awaiter(this, void 0, void 0, function () {
var item, e_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
item = this.inMemoryCache.getItem(key);
if (!!item) return [3 /*break*/, 4];
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
this.logger.verbose("Queried item not found in in-memory cache, now querying persistent storage.");
return [4 /*yield*/, this.indexedDBCache.getItem(key)];
case 2: return [2 /*return*/, _a.sent()];
case 3:
e_1 = _a.sent();
this.handleDatabaseAccessError(e_1);
return [3 /*break*/, 4];
case 4: return [2 /*return*/, item];
}
});
});
};
/**
* Sets the item in the in-memory cache and then tries to set it in the asynchronous
* storage object with the given key.
* @param key
* @param value
*/
AsyncMemoryStorage.prototype.setItem = function (key, value) {
return __awaiter(this, void 0, void 0, function () {
var e_2;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
this.inMemoryCache.setItem(key, value);
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, this.indexedDBCache.setItem(key, value)];
case 2:
_a.sent();
return [3 /*break*/, 4];
case 3:
e_2 = _a.sent();
this.handleDatabaseAccessError(e_2);
return [3 /*break*/, 4];
case 4: return [2 /*return*/];
}
});
});
};
/**
* Removes the item matching the key from the in-memory cache, then tries to remove it from the asynchronous storage object.
* @param key
*/
AsyncMemoryStorage.prototype.removeItem = function (key) {
return __awaiter(this, void 0, void 0, function () {
var e_3;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
this.inMemoryCache.removeItem(key);
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, this.indexedDBCache.removeItem(key)];
case 2:
_a.sent();
return [3 /*break*/, 4];
case 3:
e_3 = _a.sent();
this.handleDatabaseAccessError(e_3);
return [3 /*break*/, 4];
case 4: return [2 /*return*/];
}
});
});
};
/**
* Get all the keys from the in-memory cache as an iterable array of strings. If no keys are found, query the keys in the
* asynchronous storage object.
*/
AsyncMemoryStorage.prototype.getKeys = function () {
return __awaiter(this, void 0, void 0, function () {
var cacheKeys, e_4;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
cacheKeys = this.inMemoryCache.getKeys();
if (!(cacheKeys.length === 0)) return [3 /*break*/, 4];
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
this.logger.verbose("In-memory cache is empty, now querying persistent storage.");
return [4 /*yield*/, this.indexedDBCache.getKeys()];
case 2: return [2 /*return*/, _a.sent()];
case 3:
e_4 = _a.sent();
this.handleDatabaseAccessError(e_4);
return [3 /*break*/, 4];
case 4: return [2 /*return*/, cacheKeys];
}
});
});
};
/**
* Returns true or false if the given key is present in the cache.
* @param key
*/
AsyncMemoryStorage.prototype.containsKey = function (key) {
return __awaiter(this, void 0, void 0, function () {
var containsKey, e_5;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
containsKey = this.inMemoryCache.containsKey(key);
if (!!containsKey) return [3 /*break*/, 4];
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
this.logger.verbose("Key not found in in-memory cache, now querying persistent storage.");
return [4 /*yield*/, this.indexedDBCache.containsKey(key)];
case 2: return [2 /*return*/, _a.sent()];
case 3:
e_5 = _a.sent();
this.handleDatabaseAccessError(e_5);
return [3 /*break*/, 4];
case 4: return [2 /*return*/, containsKey];
}
});
});
};
/**
* Clears in-memory Map
*/
AsyncMemoryStorage.prototype.clearInMemory = function () {
// InMemory cache is a Map instance, clear is straightforward
this.logger.verbose("Deleting in-memory keystore " + this.storeName);
this.inMemoryCache.clear();
this.logger.verbose("In-memory keystore " + this.storeName + " deleted");
};
/**
* Tries to delete the IndexedDB database
* @returns
*/
AsyncMemoryStorage.prototype.clearPersistent = function () {
return __awaiter(this, void 0, void 0, function () {
var dbDeleted, e_6;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
this.logger.verbose("Deleting persistent keystore");
return [4 /*yield*/, this.indexedDBCache.deleteDatabase()];
case 1:
dbDeleted = _a.sent();
if (dbDeleted) {
this.logger.verbose("Persistent keystore deleted");
}
return [2 /*return*/, dbDeleted];
case 2:
e_6 = _a.sent();
this.handleDatabaseAccessError(e_6);
return [2 /*return*/, false];
case 3: return [2 /*return*/];
}
});
});
};
return AsyncMemoryStorage;
}());
export { AsyncMemoryStorage };
//# sourceMappingURL=AsyncMemoryStorage.js.map
{"version":3,"file":"AsyncMemoryStorage.js","sources":["../../src/cache/AsyncMemoryStorage.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Logger } from \"@azure/msal-common\";\nimport { BrowserAuthError, BrowserAuthErrorMessage } from \"../error/BrowserAuthError\";\nimport { DatabaseStorage } from \"./DatabaseStorage\";\nimport { IAsyncStorage } from \"./IAsyncMemoryStorage\";\nimport { MemoryStorage } from \"./MemoryStorage\";\n\n/**\n * This class allows MSAL to store artifacts asynchronously using the DatabaseStorage IndexedDB wrapper,\n * backed up with the more volatile MemoryStorage object for cases in which IndexedDB may be unavailable.\n */\nexport class AsyncMemoryStorage<T> implements IAsyncStorage<T> {\n private inMemoryCache: MemoryStorage<T>;\n private indexedDBCache: DatabaseStorage<T>;\n private logger: Logger;\n private storeName: string;\n\n constructor(logger: Logger, storeName: string) {\n this.inMemoryCache = new MemoryStorage<T>();\n this.indexedDBCache = new DatabaseStorage<T>();\n this.logger = logger;\n this.storeName = storeName;\n }\n\n private handleDatabaseAccessError(error: unknown): void {\n if (error instanceof BrowserAuthError && error.errorCode === BrowserAuthErrorMessage.databaseUnavailable.code) {\n this.logger.error(\"Could not access persistent storage. This may be caused by browser privacy features which block persistent storage in third-party contexts.\");\n } else {\n throw error;\n }\n }\n /**\n * Get the item matching the given key. Tries in-memory cache first, then in the asynchronous\n * storage object if item isn't found in-memory.\n * @param key \n */\n async getItem(key: string): Promise<T | null> {\n const item = this.inMemoryCache.getItem(key);\n if(!item) {\n try {\n this.logger.verbose(\"Queried item not found in in-memory cache, now querying persistent storage.\");\n return await this.indexedDBCache.getItem(key);\n } catch (e) {\n this.handleDatabaseAccessError(e);\n }\n }\n return item;\n }\n\n /**\n * Sets the item in the in-memory cache and then tries to set it in the asynchronous\n * storage object with the given key.\n * @param key \n * @param value \n */\n async setItem(key: string, value: T): Promise<void> {\n this.inMemoryCache.setItem(key, value);\n try {\n await this.indexedDBCache.setItem(key, value);\n } catch (e) {\n this.handleDatabaseAccessError(e);\n }\n }\n\n /**\n * Removes the item matching the key from the in-memory cache, then tries to remove it from the asynchronous storage object.\n * @param key \n */\n async removeItem(key: string): Promise<void> {\n this.inMemoryCache.removeItem(key);\n try {\n await this.indexedDBCache.removeItem(key);\n } catch (e) {\n this.handleDatabaseAccessError(e);\n }\n }\n\n /**\n * Get all the keys from the in-memory cache as an iterable array of strings. If no keys are found, query the keys in the \n * asynchronous storage object.\n */\n async getKeys(): Promise<string[]> {\n const cacheKeys = this.inMemoryCache.getKeys();\n if (cacheKeys.length === 0) {\n try {\n this.logger.verbose(\"In-memory cache is empty, now querying persistent storage.\");\n return await this.indexedDBCache.getKeys();\n } catch (e) {\n this.handleDatabaseAccessError(e);\n }\n }\n return cacheKeys;\n }\n\n /**\n * Returns true or false if the given key is present in the cache.\n * @param key \n */\n async containsKey(key: string): Promise<boolean> {\n const containsKey = this.inMemoryCache.containsKey(key);\n if(!containsKey) {\n try {\n this.logger.verbose(\"Key not found in in-memory cache, now querying persistent storage.\");\n return await this.indexedDBCache.containsKey(key);\n } catch (e) {\n this.handleDatabaseAccessError(e);\n }\n }\n return containsKey;\n }\n\n /**\n * Clears in-memory Map\n */\n clearInMemory(): void {\n // InMemory cache is a Map instance, clear is straightforward\n this.logger.verbose(`Deleting in-memory keystore ${this.storeName}`);\n this.inMemoryCache.clear();\n this.logger.verbose(`In-memory keystore ${this.storeName} deleted`);\n }\n\n /**\n * Tries to delete the IndexedDB database\n * @returns\n */\n async clearPersistent(): Promise<boolean> {\n try {\n this.logger.verbose(\"Deleting persistent keystore\");\n const dbDeleted = await this.indexedDBCache.deleteDatabase();\n if (dbDeleted) {\n this.logger.verbose(\"Persistent keystore deleted\");\n }\n \n return dbDeleted;\n } catch (e) {\n this.handleDatabaseAccessError(e);\n return false;\n }\n }\n}\n"],"names":[],"mappings":"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"}
\ No newline at end of file
import { CommonAuthorizationCodeRequest, ICrypto, AccountEntity, IdTokenEntity, AccessTokenEntity, RefreshTokenEntity, AppMetadataEntity, CacheManager, ServerTelemetryEntity, ThrottlingEntity, Logger, AuthorityMetadataEntity, AccountInfo, ValidCredentialType } from "@azure/msal-common";
import { CacheOptions } from "../config/Configuration";
import { BrowserCacheLocation, InteractionType } from "../utils/BrowserConstants";
import { MemoryStorage } from "./MemoryStorage";
import { IWindowStorage } from "./IWindowStorage";
import { NativeTokenRequest } from "../broker/nativeBroker/NativeRequest";
/**
* This class implements the cache storage interface for MSAL through browser local or session storage.
* Cookies are only used if storeAuthStateInCookie is true, and are only used for
* parameters such as state and nonce, generally.
*/
export declare class BrowserCacheManager extends CacheManager {
protected cacheConfig: Required<CacheOptions>;
protected browserStorage: IWindowStorage<string>;
protected internalStorage: MemoryStorage<string>;
protected temporaryCacheStorage: IWindowStorage<string>;
protected logger: Logger;
protected readonly COOKIE_LIFE_MULTIPLIER: number;
constructor(clientId: string, cacheConfig: Required<CacheOptions>, cryptoImpl: ICrypto, logger: Logger);
/**
* Returns a window storage class implementing the IWindowStorage interface that corresponds to the configured cacheLocation.
* @param cacheLocation
*/
protected setupBrowserStorage(cacheLocation: BrowserCacheLocation | string): IWindowStorage<string>;
/**
*
* @param cacheLocation
*/
protected setupTemporaryCacheStorage(cacheLocation: BrowserCacheLocation | string): IWindowStorage<string>;
/**
* Migrate all old cache entries to new schema. No rollback supported.
* @param storeAuthStateInCookie
*/
protected migrateCacheEntries(): void;
/**
* Utility function to help with migration.
* @param newKey
* @param value
* @param storeAuthStateInCookie
*/
protected migrateCacheEntry(newKey: string, value: string | null): void;
/**
* Parses passed value as JSON object, JSON.parse() will throw an error.
* @param input
*/
protected validateAndParseJson(jsonValue: string): object | null;
/**
* fetches the entry from the browser storage based off the key
* @param key
*/
getItem(key: string): string | null;
/**
* sets the entry in the browser storage
* @param key
* @param value
*/
setItem(key: string, value: string): void;
/**
* fetch the account entity from the platform cache
* @param accountKey
*/
getAccount(accountKey: string): AccountEntity | null;
/**
* set account entity in the platform cache
* @param key
* @param value
*/
setAccount(account: AccountEntity): void;
/**
* generates idToken entity from a string
* @param idTokenKey
*/
getIdTokenCredential(idTokenKey: string): IdTokenEntity | null;
/**
* set IdToken credential to the platform cache
* @param idToken
*/
setIdTokenCredential(idToken: IdTokenEntity): void;
/**
* generates accessToken entity from a string
* @param key
*/
getAccessTokenCredential(accessTokenKey: string): AccessTokenEntity | null;
/**
* set accessToken credential to the platform cache
* @param accessToken
*/
setAccessTokenCredential(accessToken: AccessTokenEntity): void;
/**
* generates refreshToken entity from a string
* @param refreshTokenKey
*/
getRefreshTokenCredential(refreshTokenKey: string): RefreshTokenEntity | null;
/**
* set refreshToken credential to the platform cache
* @param refreshToken
*/
setRefreshTokenCredential(refreshToken: RefreshTokenEntity): void;
/**
* fetch appMetadata entity from the platform cache
* @param appMetadataKey
*/
getAppMetadata(appMetadataKey: string): AppMetadataEntity | null;
/**
* set appMetadata entity to the platform cache
* @param appMetadata
*/
setAppMetadata(appMetadata: AppMetadataEntity): void;
/**
* fetch server telemetry entity from the platform cache
* @param serverTelemetryKey
*/
getServerTelemetry(serverTelemetryKey: string): ServerTelemetryEntity | null;
/**
* set server telemetry entity to the platform cache
* @param serverTelemetryKey
* @param serverTelemetry
*/
setServerTelemetry(serverTelemetryKey: string, serverTelemetry: ServerTelemetryEntity): void;
/**
*
*/
getAuthorityMetadata(key: string): AuthorityMetadataEntity | null;
/**
*
*/
getAuthorityMetadataKeys(): Array<string>;
/**
* Sets wrapper metadata in memory
* @param wrapperSKU
* @param wrapperVersion
*/
setWrapperMetadata(wrapperSKU: string, wrapperVersion: string): void;
/**
* Returns wrapper metadata from in-memory storage
*/
getWrapperMetadata(): [string, string];
/**
*
* @param entity
*/
setAuthorityMetadata(key: string, entity: AuthorityMetadataEntity): void;
/**
* Gets the active account
*/
getActiveAccount(): AccountInfo | null;
/**
* Sets the active account's localAccountId in cache
* @param account
*/
setActiveAccount(account: AccountInfo | null): void;
/**
* Gets a list of accounts that match all of the filters provided
* @param account
*/
getAccountInfoByFilter(accountFilter: Partial<Omit<AccountInfo, "idTokenClaims" | "name">>): AccountInfo[];
/**
* Checks the cache for accounts matching loginHint or SID
* @param loginHint
* @param sid
*/
getAccountInfoByHints(loginHint?: string, sid?: string): AccountInfo | null;
/**
* fetch throttling entity from the platform cache
* @param throttlingCacheKey
*/
getThrottlingCache(throttlingCacheKey: string): ThrottlingEntity | null;
/**
* set throttling entity to the platform cache
* @param throttlingCacheKey
* @param throttlingCache
*/
setThrottlingCache(throttlingCacheKey: string, throttlingCache: ThrottlingEntity): void;
/**
* Gets cache item with given key.
* Will retrieve from cookies if storeAuthStateInCookie is set to true.
* @param key
*/
getTemporaryCache(cacheKey: string, generateKey?: boolean): string | null;
/**
* Sets the cache item with the key and value given.
* Stores in cookie if storeAuthStateInCookie is set to true.
* This can cause cookie overflow if used incorrectly.
* @param key
* @param value
*/
setTemporaryCache(cacheKey: string, value: string, generateKey?: boolean): void;
/**
* Removes the cache item with the given key.
* Will also clear the cookie item if storeAuthStateInCookie is set to true.
* @param key
*/
removeItem(key: string): boolean;
/**
* Checks whether key is in cache.
* @param key
*/
containsKey(key: string): boolean;
/**
* Gets all keys in window.
*/
getKeys(): string[];
/**
* Clears all cache entries created by MSAL.
*/
clear(): Promise<void>;
/**
* Add value to cookies
* @param cookieName
* @param cookieValue
* @param expires
*/
setItemCookie(cookieName: string, cookieValue: string, expires?: number): void;
/**
* Get one item by key from cookies
* @param cookieName
*/
getItemCookie(cookieName: string): string;
/**
* Clear all msal-related cookies currently set in the browser. Should only be used to clear temporary cache items.
*/
clearMsalCookies(): void;
/**
* Clear an item in the cookies by key
* @param cookieName
*/
clearItemCookie(cookieName: string): void;
/**
* Get cookie expiration time
* @param cookieLifeDays
*/
getCookieExpirationTime(cookieLifeDays: number): string;
/**
* Gets the cache object referenced by the browser
*/
getCache(): object;
/**
* interface compat, we cannot overwrite browser cache; Functionality is supported by individual entities in browser
*/
setCache(): void;
/**
* Prepend msal.<client-id> to each key; Skip for any JSON object as Key (defined schemas do not need the key appended: AccessToken Keys or the upcoming schema)
* @param key
* @param addInstanceId
*/
generateCacheKey(key: string): string;
/**
* Create authorityKey to cache authority
* @param state
*/
generateAuthorityKey(stateString: string): string;
/**
* Create Nonce key to cache nonce
* @param state
*/
generateNonceKey(stateString: string): string;
/**
* Creates full cache key for the request state
* @param stateString State string for the request
*/
generateStateKey(stateString: string): string;
/**
* Gets the cached authority based on the cached state. Returns empty if no cached state found.
*/
getCachedAuthority(cachedState: string): string | null;
/**
* Updates account, authority, and state in cache
* @param serverAuthenticationRequest
* @param account
*/
updateCacheEntries(state: string, nonce: string, authorityInstance: string, loginHint: string, account: AccountInfo | null): void;
/**
* Reset all temporary cache items
* @param state
*/
resetRequestCache(state: string): void;
/**
* Removes temporary cache for the provided state
* @param stateString
*/
cleanRequestByState(stateString: string): void;
/**
* Looks in temporary cache for any state values with the provided interactionType and removes all temporary cache items for that state
* Used in scenarios where temp cache needs to be cleaned but state is not known, such as clicking browser back button.
* @param interactionType
*/
cleanRequestByInteractionType(interactionType: InteractionType): void;
cacheCodeRequest(authCodeRequest: CommonAuthorizationCodeRequest, browserCrypto: ICrypto): void;
/**
* Gets the token exchange parameters from the cache. Throws an error if nothing is found.
*/
getCachedRequest(state: string, browserCrypto: ICrypto): CommonAuthorizationCodeRequest;
/**
* Gets cached native request for redirect flows
*/
getCachedNativeRequest(): NativeTokenRequest | null;
isInteractionInProgress(matchClientId?: boolean): boolean;
getInteractionInProgress(): string | null;
setInteractionInProgress(inProgress: boolean): void;
/**
* Returns username retrieved from ADAL or MSAL v1 idToken
*/
getLegacyLoginHint(): string | null;
/**
* Updates a credential's cache key if the current cache key is outdated
*/
updateCredentialCacheKey(currentCacheKey: string, credential: ValidCredentialType): string;
/**
* Returns application id as redirect context during AcquireTokenRedirect flow.
*/
getRedirectRequestContext(): string | null;
/**
* Sets application id as the redirect context during AcquireTokenRedirect flow.
* @param value
*/
setRedirectRequestContext(value: string): void;
}
export declare const DEFAULT_BROWSER_CACHE_MANAGER: (clientId: string, logger: Logger) => BrowserCacheManager;
//# sourceMappingURL=BrowserCacheManager.d.ts.map
\ No newline at end of file
{"version":3,"file":"BrowserCacheManager.d.ts","sourceRoot":"","sources":["../../src/cache/BrowserCacheManager.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
/*! @azure/msal-browser v2.32.1 2022-12-07 */
'use strict';
import { __extends, __spread, __awaiter, __generator } from '../_virtual/_tslib.js';
import { AccountEntity, CacheManager, IdTokenEntity, AccessTokenEntity, RefreshTokenEntity, AppMetadataEntity, ServerTelemetryEntity, AuthorityMetadataEntity, Constants, PersistentCacheKeys, ClientAuthError, ThrottlingEntity, StringUtils, ProtocolUtils, CcsCredentialType, IdToken, DEFAULT_CRYPTO_IMPLEMENTATION } from '@azure/msal-common';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { BrowserCacheLocation, InMemoryCacheKeys, TemporaryCacheKeys } from '../utils/BrowserConstants.js';
import { BrowserStorage } from './BrowserStorage.js';
import { MemoryStorage } from './MemoryStorage.js';
import { BrowserProtocolUtils } from '../utils/BrowserProtocolUtils.js';
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
/**
* This class implements the cache storage interface for MSAL through browser local or session storage.
* Cookies are only used if storeAuthStateInCookie is true, and are only used for
* parameters such as state and nonce, generally.
*/
var BrowserCacheManager = /** @class */ (function (_super) {
__extends(BrowserCacheManager, _super);
function BrowserCacheManager(clientId, cacheConfig, cryptoImpl, logger) {
var _this = _super.call(this, clientId, cryptoImpl) || this;
// Cookie life calculation (hours * minutes * seconds * ms)
_this.COOKIE_LIFE_MULTIPLIER = 24 * 60 * 60 * 1000;
_this.cacheConfig = cacheConfig;
_this.logger = logger;
_this.internalStorage = new MemoryStorage();
_this.browserStorage = _this.setupBrowserStorage(_this.cacheConfig.cacheLocation);
_this.temporaryCacheStorage = _this.setupTemporaryCacheStorage(_this.cacheConfig.cacheLocation);
// Migrate any cache entries from older versions of MSAL.
_this.migrateCacheEntries();
return _this;
}
/**
* Returns a window storage class implementing the IWindowStorage interface that corresponds to the configured cacheLocation.
* @param cacheLocation
*/
BrowserCacheManager.prototype.setupBrowserStorage = function (cacheLocation) {
switch (cacheLocation) {
case BrowserCacheLocation.LocalStorage:
case BrowserCacheLocation.SessionStorage:
try {
// Temporary cache items will always be stored in session storage to mitigate problems caused by multiple tabs
return new BrowserStorage(cacheLocation);
}
catch (e) {
this.logger.verbose(e);
break;
}
}
this.cacheConfig.cacheLocation = BrowserCacheLocation.MemoryStorage;
return new MemoryStorage();
};
/**
*
* @param cacheLocation
*/
BrowserCacheManager.prototype.setupTemporaryCacheStorage = function (cacheLocation) {
switch (cacheLocation) {
case BrowserCacheLocation.LocalStorage:
case BrowserCacheLocation.SessionStorage:
try {
// Temporary cache items will always be stored in session storage to mitigate problems caused by multiple tabs
return new BrowserStorage(BrowserCacheLocation.SessionStorage);
}
catch (e) {
this.logger.verbose(e);
return this.internalStorage;
}
case BrowserCacheLocation.MemoryStorage:
default:
return this.internalStorage;
}
};
/**
* Migrate all old cache entries to new schema. No rollback supported.
* @param storeAuthStateInCookie
*/
BrowserCacheManager.prototype.migrateCacheEntries = function () {
var _this = this;
var idTokenKey = Constants.CACHE_PREFIX + "." + PersistentCacheKeys.ID_TOKEN;
var clientInfoKey = Constants.CACHE_PREFIX + "." + PersistentCacheKeys.CLIENT_INFO;
var errorKey = Constants.CACHE_PREFIX + "." + PersistentCacheKeys.ERROR;
var errorDescKey = Constants.CACHE_PREFIX + "." + PersistentCacheKeys.ERROR_DESC;
var idTokenValue = this.browserStorage.getItem(idTokenKey);
var clientInfoValue = this.browserStorage.getItem(clientInfoKey);
var errorValue = this.browserStorage.getItem(errorKey);
var errorDescValue = this.browserStorage.getItem(errorDescKey);
var values = [idTokenValue, clientInfoValue, errorValue, errorDescValue];
var keysToMigrate = [PersistentCacheKeys.ID_TOKEN, PersistentCacheKeys.CLIENT_INFO, PersistentCacheKeys.ERROR, PersistentCacheKeys.ERROR_DESC];
keysToMigrate.forEach(function (cacheKey, index) { return _this.migrateCacheEntry(cacheKey, values[index]); });
};
/**
* Utility function to help with migration.
* @param newKey
* @param value
* @param storeAuthStateInCookie
*/
BrowserCacheManager.prototype.migrateCacheEntry = function (newKey, value) {
if (value) {
this.setTemporaryCache(newKey, value, true);
}
};
/**
* Parses passed value as JSON object, JSON.parse() will throw an error.
* @param input
*/
BrowserCacheManager.prototype.validateAndParseJson = function (jsonValue) {
try {
var parsedJson = JSON.parse(jsonValue);
/**
* There are edge cases in which JSON.parse will successfully parse a non-valid JSON object
* (e.g. JSON.parse will parse an escaped string into an unescaped string), so adding a type check
* of the parsed value is necessary in order to be certain that the string represents a valid JSON object.
*
*/
return (parsedJson && typeof parsedJson === "object") ? parsedJson : null;
}
catch (error) {
return null;
}
};
/**
* fetches the entry from the browser storage based off the key
* @param key
*/
BrowserCacheManager.prototype.getItem = function (key) {
return this.browserStorage.getItem(key);
};
/**
* sets the entry in the browser storage
* @param key
* @param value
*/
BrowserCacheManager.prototype.setItem = function (key, value) {
this.browserStorage.setItem(key, value);
};
/**
* fetch the account entity from the platform cache
* @param accountKey
*/
BrowserCacheManager.prototype.getAccount = function (accountKey) {
var account = this.getItem(accountKey);
if (!account) {
return null;
}
var parsedAccount = this.validateAndParseJson(account);
if (!parsedAccount || !AccountEntity.isAccountEntity(parsedAccount)) {
return null;
}
return CacheManager.toObject(new AccountEntity(), parsedAccount);
};
/**
* set account entity in the platform cache
* @param key
* @param value
*/
BrowserCacheManager.prototype.setAccount = function (account) {
this.logger.trace("BrowserCacheManager.setAccount called");
var key = account.generateAccountKey();
this.setItem(key, JSON.stringify(account));
};
/**
* generates idToken entity from a string
* @param idTokenKey
*/
BrowserCacheManager.prototype.getIdTokenCredential = function (idTokenKey) {
var value = this.getItem(idTokenKey);
if (!value) {
this.logger.trace("BrowserCacheManager.getIdTokenCredential: called, no cache hit");
return null;
}
var parsedIdToken = this.validateAndParseJson(value);
if (!parsedIdToken || !IdTokenEntity.isIdTokenEntity(parsedIdToken)) {
this.logger.trace("BrowserCacheManager.getIdTokenCredential: called, no cache hit");
return null;
}
this.logger.trace("BrowserCacheManager.getIdTokenCredential: cache hit");
return CacheManager.toObject(new IdTokenEntity(), parsedIdToken);
};
/**
* set IdToken credential to the platform cache
* @param idToken
*/
BrowserCacheManager.prototype.setIdTokenCredential = function (idToken) {
this.logger.trace("BrowserCacheManager.setIdTokenCredential called");
var idTokenKey = idToken.generateCredentialKey();
this.setItem(idTokenKey, JSON.stringify(idToken));
};
/**
* generates accessToken entity from a string
* @param key
*/
BrowserCacheManager.prototype.getAccessTokenCredential = function (accessTokenKey) {
var value = this.getItem(accessTokenKey);
if (!value) {
this.logger.trace("BrowserCacheManager.getAccessTokenCredential: called, no cache hit");
return null;
}
var parsedAccessToken = this.validateAndParseJson(value);
if (!parsedAccessToken || !AccessTokenEntity.isAccessTokenEntity(parsedAccessToken)) {
this.logger.trace("BrowserCacheManager.getAccessTokenCredential: called, no cache hit");
return null;
}
this.logger.trace("BrowserCacheManager.getAccessTokenCredential: cache hit");
return CacheManager.toObject(new AccessTokenEntity(), parsedAccessToken);
};
/**
* set accessToken credential to the platform cache
* @param accessToken
*/
BrowserCacheManager.prototype.setAccessTokenCredential = function (accessToken) {
this.logger.trace("BrowserCacheManager.setAccessTokenCredential called");
var accessTokenKey = accessToken.generateCredentialKey();
this.setItem(accessTokenKey, JSON.stringify(accessToken));
};
/**
* generates refreshToken entity from a string
* @param refreshTokenKey
*/
BrowserCacheManager.prototype.getRefreshTokenCredential = function (refreshTokenKey) {
var value = this.getItem(refreshTokenKey);
if (!value) {
this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: called, no cache hit");
return null;
}
var parsedRefreshToken = this.validateAndParseJson(value);
if (!parsedRefreshToken || !RefreshTokenEntity.isRefreshTokenEntity(parsedRefreshToken)) {
this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: called, no cache hit");
return null;
}
this.logger.trace("BrowserCacheManager.getRefreshTokenCredential: cache hit");
return CacheManager.toObject(new RefreshTokenEntity(), parsedRefreshToken);
};
/**
* set refreshToken credential to the platform cache
* @param refreshToken
*/
BrowserCacheManager.prototype.setRefreshTokenCredential = function (refreshToken) {
this.logger.trace("BrowserCacheManager.setRefreshTokenCredential called");
var refreshTokenKey = refreshToken.generateCredentialKey();
this.setItem(refreshTokenKey, JSON.stringify(refreshToken));
};
/**
* fetch appMetadata entity from the platform cache
* @param appMetadataKey
*/
BrowserCacheManager.prototype.getAppMetadata = function (appMetadataKey) {
var value = this.getItem(appMetadataKey);
if (!value) {
this.logger.trace("BrowserCacheManager.getAppMetadata: called, no cache hit");
return null;
}
var parsedMetadata = this.validateAndParseJson(value);
if (!parsedMetadata || !AppMetadataEntity.isAppMetadataEntity(appMetadataKey, parsedMetadata)) {
this.logger.trace("BrowserCacheManager.getAppMetadata: called, no cache hit");
return null;
}
this.logger.trace("BrowserCacheManager.getAppMetadata: cache hit");
return CacheManager.toObject(new AppMetadataEntity(), parsedMetadata);
};
/**
* set appMetadata entity to the platform cache
* @param appMetadata
*/
BrowserCacheManager.prototype.setAppMetadata = function (appMetadata) {
this.logger.trace("BrowserCacheManager.setAppMetadata called");
var appMetadataKey = appMetadata.generateAppMetadataKey();
this.setItem(appMetadataKey, JSON.stringify(appMetadata));
};
/**
* fetch server telemetry entity from the platform cache
* @param serverTelemetryKey
*/
BrowserCacheManager.prototype.getServerTelemetry = function (serverTelemetryKey) {
var value = this.getItem(serverTelemetryKey);
if (!value) {
this.logger.trace("BrowserCacheManager.getServerTelemetry: called, no cache hit");
return null;
}
var parsedMetadata = this.validateAndParseJson(value);
if (!parsedMetadata || !ServerTelemetryEntity.isServerTelemetryEntity(serverTelemetryKey, parsedMetadata)) {
this.logger.trace("BrowserCacheManager.getServerTelemetry: called, no cache hit");
return null;
}
this.logger.trace("BrowserCacheManager.getServerTelemetry: cache hit");
return CacheManager.toObject(new ServerTelemetryEntity(), parsedMetadata);
};
/**
* set server telemetry entity to the platform cache
* @param serverTelemetryKey
* @param serverTelemetry
*/
BrowserCacheManager.prototype.setServerTelemetry = function (serverTelemetryKey, serverTelemetry) {
this.logger.trace("BrowserCacheManager.setServerTelemetry called");
this.setItem(serverTelemetryKey, JSON.stringify(serverTelemetry));
};
/**
*
*/
BrowserCacheManager.prototype.getAuthorityMetadata = function (key) {
var value = this.internalStorage.getItem(key);
if (!value) {
this.logger.trace("BrowserCacheManager.getAuthorityMetadata: called, no cache hit");
return null;
}
var parsedMetadata = this.validateAndParseJson(value);
if (parsedMetadata && AuthorityMetadataEntity.isAuthorityMetadataEntity(key, parsedMetadata)) {
this.logger.trace("BrowserCacheManager.getAuthorityMetadata: cache hit");
return CacheManager.toObject(new AuthorityMetadataEntity(), parsedMetadata);
}
return null;
};
/**
*
*/
BrowserCacheManager.prototype.getAuthorityMetadataKeys = function () {
var _this = this;
var allKeys = this.internalStorage.getKeys();
return allKeys.filter(function (key) {
return _this.isAuthorityMetadata(key);
});
};
/**
* Sets wrapper metadata in memory
* @param wrapperSKU
* @param wrapperVersion
*/
BrowserCacheManager.prototype.setWrapperMetadata = function (wrapperSKU, wrapperVersion) {
this.internalStorage.setItem(InMemoryCacheKeys.WRAPPER_SKU, wrapperSKU);
this.internalStorage.setItem(InMemoryCacheKeys.WRAPPER_VER, wrapperVersion);
};
/**
* Returns wrapper metadata from in-memory storage
*/
BrowserCacheManager.prototype.getWrapperMetadata = function () {
var sku = this.internalStorage.getItem(InMemoryCacheKeys.WRAPPER_SKU) || Constants.EMPTY_STRING;
var version = this.internalStorage.getItem(InMemoryCacheKeys.WRAPPER_VER) || Constants.EMPTY_STRING;
return [sku, version];
};
/**
*
* @param entity
*/
BrowserCacheManager.prototype.setAuthorityMetadata = function (key, entity) {
this.logger.trace("BrowserCacheManager.setAuthorityMetadata called");
this.internalStorage.setItem(key, JSON.stringify(entity));
};
/**
* Gets the active account
*/
BrowserCacheManager.prototype.getActiveAccount = function () {
var activeAccountKeyFilters = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS);
var activeAccountValueFilters = this.getItem(activeAccountKeyFilters);
if (!activeAccountValueFilters) {
// if new active account cache type isn't found, it's an old version, so look for that instead
this.logger.trace("No active account filters cache schema found, looking for legacy schema");
var activeAccountKeyLocal = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT);
var activeAccountValueLocal = this.getItem(activeAccountKeyLocal);
if (!activeAccountValueLocal) {
this.logger.trace("No active account found");
return null;
}
var activeAccount = this.getAccountInfoByFilter({ localAccountId: activeAccountValueLocal })[0] || null;
if (activeAccount) {
this.logger.trace("Legacy active account cache schema found");
this.logger.trace("Adding active account filters cache schema");
this.setActiveAccount(activeAccount);
return activeAccount;
}
return null;
}
var activeAccountValueObj = this.validateAndParseJson(activeAccountValueFilters);
if (activeAccountValueObj) {
this.logger.trace("Active account filters schema found");
return this.getAccountInfoByFilter({
homeAccountId: activeAccountValueObj.homeAccountId,
localAccountId: activeAccountValueObj.localAccountId
})[0] || null;
}
this.logger.trace("No active account found");
return null;
};
/**
* Sets the active account's localAccountId in cache
* @param account
*/
BrowserCacheManager.prototype.setActiveAccount = function (account) {
var activeAccountKey = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS);
var activeAccountKeyLocal = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT);
if (account) {
this.logger.verbose("setActiveAccount: Active account set");
var activeAccountValue = {
homeAccountId: account.homeAccountId,
localAccountId: account.localAccountId
};
this.browserStorage.setItem(activeAccountKey, JSON.stringify(activeAccountValue));
this.browserStorage.setItem(activeAccountKeyLocal, account.localAccountId);
}
else {
this.logger.verbose("setActiveAccount: No account passed, active account not set");
this.browserStorage.removeItem(activeAccountKey);
this.browserStorage.removeItem(activeAccountKeyLocal);
}
};
/**
* Gets a list of accounts that match all of the filters provided
* @param account
*/
BrowserCacheManager.prototype.getAccountInfoByFilter = function (accountFilter) {
var allAccounts = this.getAllAccounts();
return allAccounts.filter(function (accountObj) {
if (accountFilter.username && accountFilter.username.toLowerCase() !== accountObj.username.toLowerCase()) {
return false;
}
if (accountFilter.homeAccountId && accountFilter.homeAccountId !== accountObj.homeAccountId) {
return false;
}
if (accountFilter.localAccountId && accountFilter.localAccountId !== accountObj.localAccountId) {
return false;
}
if (accountFilter.tenantId && accountFilter.tenantId !== accountObj.tenantId) {
return false;
}
if (accountFilter.environment && accountFilter.environment !== accountObj.environment) {
return false;
}
return true;
});
};
/**
* Checks the cache for accounts matching loginHint or SID
* @param loginHint
* @param sid
*/
BrowserCacheManager.prototype.getAccountInfoByHints = function (loginHint, sid) {
var matchingAccounts = this.getAllAccounts().filter(function (accountInfo) {
if (sid) {
var accountSid = accountInfo.idTokenClaims && accountInfo.idTokenClaims["sid"];
return sid === accountSid;
}
if (loginHint) {
return loginHint === accountInfo.username;
}
return false;
});
if (matchingAccounts.length === 1) {
return matchingAccounts[0];
}
else if (matchingAccounts.length > 1) {
throw ClientAuthError.createMultipleMatchingAccountsInCacheError();
}
return null;
};
/**
* fetch throttling entity from the platform cache
* @param throttlingCacheKey
*/
BrowserCacheManager.prototype.getThrottlingCache = function (throttlingCacheKey) {
var value = this.getItem(throttlingCacheKey);
if (!value) {
this.logger.trace("BrowserCacheManager.getThrottlingCache: called, no cache hit");
return null;
}
var parsedThrottlingCache = this.validateAndParseJson(value);
if (!parsedThrottlingCache || !ThrottlingEntity.isThrottlingEntity(throttlingCacheKey, parsedThrottlingCache)) {
this.logger.trace("BrowserCacheManager.getThrottlingCache: called, no cache hit");
return null;
}
this.logger.trace("BrowserCacheManager.getThrottlingCache: cache hit");
return CacheManager.toObject(new ThrottlingEntity(), parsedThrottlingCache);
};
/**
* set throttling entity to the platform cache
* @param throttlingCacheKey
* @param throttlingCache
*/
BrowserCacheManager.prototype.setThrottlingCache = function (throttlingCacheKey, throttlingCache) {
this.logger.trace("BrowserCacheManager.setThrottlingCache called");
this.setItem(throttlingCacheKey, JSON.stringify(throttlingCache));
};
/**
* Gets cache item with given key.
* Will retrieve from cookies if storeAuthStateInCookie is set to true.
* @param key
*/
BrowserCacheManager.prototype.getTemporaryCache = function (cacheKey, generateKey) {
var key = generateKey ? this.generateCacheKey(cacheKey) : cacheKey;
if (this.cacheConfig.storeAuthStateInCookie) {
var itemCookie = this.getItemCookie(key);
if (itemCookie) {
this.logger.trace("BrowserCacheManager.getTemporaryCache: storeAuthStateInCookies set to true, retrieving from cookies");
return itemCookie;
}
}
var value = this.temporaryCacheStorage.getItem(key);
if (!value) {
// If temp cache item not found in session/memory, check local storage for items set by old versions
if (this.cacheConfig.cacheLocation === BrowserCacheLocation.LocalStorage) {
var item = this.browserStorage.getItem(key);
if (item) {
this.logger.trace("BrowserCacheManager.getTemporaryCache: Temporary cache item found in local storage");
return item;
}
}
this.logger.trace("BrowserCacheManager.getTemporaryCache: No cache item found in local storage");
return null;
}
this.logger.trace("BrowserCacheManager.getTemporaryCache: Temporary cache item returned");
return value;
};
/**
* Sets the cache item with the key and value given.
* Stores in cookie if storeAuthStateInCookie is set to true.
* This can cause cookie overflow if used incorrectly.
* @param key
* @param value
*/
BrowserCacheManager.prototype.setTemporaryCache = function (cacheKey, value, generateKey) {
var key = generateKey ? this.generateCacheKey(cacheKey) : cacheKey;
this.temporaryCacheStorage.setItem(key, value);
if (this.cacheConfig.storeAuthStateInCookie) {
this.logger.trace("BrowserCacheManager.setTemporaryCache: storeAuthStateInCookie set to true, setting item cookie");
this.setItemCookie(key, value);
}
};
/**
* Removes the cache item with the given key.
* Will also clear the cookie item if storeAuthStateInCookie is set to true.
* @param key
*/
BrowserCacheManager.prototype.removeItem = function (key) {
this.browserStorage.removeItem(key);
this.temporaryCacheStorage.removeItem(key);
if (this.cacheConfig.storeAuthStateInCookie) {
this.logger.trace("BrowserCacheManager.removeItem: storeAuthStateInCookie is true, clearing item cookie");
this.clearItemCookie(key);
}
return true;
};
/**
* Checks whether key is in cache.
* @param key
*/
BrowserCacheManager.prototype.containsKey = function (key) {
return this.browserStorage.containsKey(key) || this.temporaryCacheStorage.containsKey(key);
};
/**
* Gets all keys in window.
*/
BrowserCacheManager.prototype.getKeys = function () {
return __spread(this.browserStorage.getKeys(), this.temporaryCacheStorage.getKeys());
};
/**
* Clears all cache entries created by MSAL.
*/
BrowserCacheManager.prototype.clear = function () {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
// Removes all accounts and their credentials
return [4 /*yield*/, this.removeAllAccounts()];
case 1:
// Removes all accounts and their credentials
_a.sent();
this.removeAppMetadata();
// Removes all remaining MSAL cache items
this.getKeys().forEach(function (cacheKey) {
// Check if key contains msal prefix; For now, we are clearing all the cache items created by MSAL.js
if ((_this.browserStorage.containsKey(cacheKey) || _this.temporaryCacheStorage.containsKey(cacheKey)) && ((cacheKey.indexOf(Constants.CACHE_PREFIX) !== -1) || (cacheKey.indexOf(_this.clientId) !== -1))) {
_this.removeItem(cacheKey);
}
});
this.internalStorage.clear();
return [2 /*return*/];
}
});
});
};
/**
* Add value to cookies
* @param cookieName
* @param cookieValue
* @param expires
*/
BrowserCacheManager.prototype.setItemCookie = function (cookieName, cookieValue, expires) {
var cookieStr = encodeURIComponent(cookieName) + "=" + encodeURIComponent(cookieValue) + ";path=/;SameSite=Lax;";
if (expires) {
var expireTime = this.getCookieExpirationTime(expires);
cookieStr += "expires=" + expireTime + ";";
}
if (this.cacheConfig.secureCookies) {
cookieStr += "Secure;";
}
document.cookie = cookieStr;
};
/**
* Get one item by key from cookies
* @param cookieName
*/
BrowserCacheManager.prototype.getItemCookie = function (cookieName) {
var name = encodeURIComponent(cookieName) + "=";
var cookieList = document.cookie.split(";");
for (var i = 0; i < cookieList.length; i++) {
var cookie = cookieList[i];
while (cookie.charAt(0) === " ") {
cookie = cookie.substring(1);
}
if (cookie.indexOf(name) === 0) {
return decodeURIComponent(cookie.substring(name.length, cookie.length));
}
}
return Constants.EMPTY_STRING;
};
/**
* Clear all msal-related cookies currently set in the browser. Should only be used to clear temporary cache items.
*/
BrowserCacheManager.prototype.clearMsalCookies = function () {
var _this = this;
var cookiePrefix = Constants.CACHE_PREFIX + "." + this.clientId;
var cookieList = document.cookie.split(";");
cookieList.forEach(function (cookie) {
while (cookie.charAt(0) === " ") {
// eslint-disable-next-line no-param-reassign
cookie = cookie.substring(1);
}
if (cookie.indexOf(cookiePrefix) === 0) {
var cookieKey = cookie.split("=")[0];
_this.clearItemCookie(cookieKey);
}
});
};
/**
* Clear an item in the cookies by key
* @param cookieName
*/
BrowserCacheManager.prototype.clearItemCookie = function (cookieName) {
this.setItemCookie(cookieName, Constants.EMPTY_STRING, -1);
};
/**
* Get cookie expiration time
* @param cookieLifeDays
*/
BrowserCacheManager.prototype.getCookieExpirationTime = function (cookieLifeDays) {
var today = new Date();
var expr = new Date(today.getTime() + cookieLifeDays * this.COOKIE_LIFE_MULTIPLIER);
return expr.toUTCString();
};
/**
* Gets the cache object referenced by the browser
*/
BrowserCacheManager.prototype.getCache = function () {
return this.browserStorage;
};
/**
* interface compat, we cannot overwrite browser cache; Functionality is supported by individual entities in browser
*/
BrowserCacheManager.prototype.setCache = function () {
// sets nothing
};
/**
* Prepend msal.<client-id> to each key; Skip for any JSON object as Key (defined schemas do not need the key appended: AccessToken Keys or the upcoming schema)
* @param key
* @param addInstanceId
*/
BrowserCacheManager.prototype.generateCacheKey = function (key) {
var generatedKey = this.validateAndParseJson(key);
if (!generatedKey) {
if (StringUtils.startsWith(key, Constants.CACHE_PREFIX) || StringUtils.startsWith(key, PersistentCacheKeys.ADAL_ID_TOKEN)) {
return key;
}
return Constants.CACHE_PREFIX + "." + this.clientId + "." + key;
}
return JSON.stringify(key);
};
/**
* Create authorityKey to cache authority
* @param state
*/
BrowserCacheManager.prototype.generateAuthorityKey = function (stateString) {
var stateId = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString).libraryState.id;
return this.generateCacheKey(TemporaryCacheKeys.AUTHORITY + "." + stateId);
};
/**
* Create Nonce key to cache nonce
* @param state
*/
BrowserCacheManager.prototype.generateNonceKey = function (stateString) {
var stateId = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString).libraryState.id;
return this.generateCacheKey(TemporaryCacheKeys.NONCE_IDTOKEN + "." + stateId);
};
/**
* Creates full cache key for the request state
* @param stateString State string for the request
*/
BrowserCacheManager.prototype.generateStateKey = function (stateString) {
// Use the library state id to key temp storage for uniqueness for multiple concurrent requests
var stateId = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString).libraryState.id;
return this.generateCacheKey(TemporaryCacheKeys.REQUEST_STATE + "." + stateId);
};
/**
* Gets the cached authority based on the cached state. Returns empty if no cached state found.
*/
BrowserCacheManager.prototype.getCachedAuthority = function (cachedState) {
var stateCacheKey = this.generateStateKey(cachedState);
var state = this.getTemporaryCache(stateCacheKey);
if (!state) {
return null;
}
var authorityCacheKey = this.generateAuthorityKey(state);
return this.getTemporaryCache(authorityCacheKey);
};
/**
* Updates account, authority, and state in cache
* @param serverAuthenticationRequest
* @param account
*/
BrowserCacheManager.prototype.updateCacheEntries = function (state, nonce, authorityInstance, loginHint, account) {
this.logger.trace("BrowserCacheManager.updateCacheEntries called");
// Cache the request state
var stateCacheKey = this.generateStateKey(state);
this.setTemporaryCache(stateCacheKey, state, false);
// Cache the nonce
var nonceCacheKey = this.generateNonceKey(state);
this.setTemporaryCache(nonceCacheKey, nonce, false);
// Cache authorityKey
var authorityCacheKey = this.generateAuthorityKey(state);
this.setTemporaryCache(authorityCacheKey, authorityInstance, false);
if (account) {
var ccsCredential = {
credential: account.homeAccountId,
type: CcsCredentialType.HOME_ACCOUNT_ID
};
this.setTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, JSON.stringify(ccsCredential), true);
}
else if (!StringUtils.isEmpty(loginHint)) {
var ccsCredential = {
credential: loginHint,
type: CcsCredentialType.UPN
};
this.setTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, JSON.stringify(ccsCredential), true);
}
};
/**
* Reset all temporary cache items
* @param state
*/
BrowserCacheManager.prototype.resetRequestCache = function (state) {
var _this = this;
this.logger.trace("BrowserCacheManager.resetRequestCache called");
// check state and remove associated cache items
if (!StringUtils.isEmpty(state)) {
this.getKeys().forEach(function (key) {
if (key.indexOf(state) !== -1) {
_this.removeItem(key);
}
});
}
// delete generic interactive request parameters
if (state) {
this.removeItem(this.generateStateKey(state));
this.removeItem(this.generateNonceKey(state));
this.removeItem(this.generateAuthorityKey(state));
}
this.removeItem(this.generateCacheKey(TemporaryCacheKeys.REQUEST_PARAMS));
this.removeItem(this.generateCacheKey(TemporaryCacheKeys.ORIGIN_URI));
this.removeItem(this.generateCacheKey(TemporaryCacheKeys.URL_HASH));
this.removeItem(this.generateCacheKey(TemporaryCacheKeys.CORRELATION_ID));
this.removeItem(this.generateCacheKey(TemporaryCacheKeys.CCS_CREDENTIAL));
this.removeItem(this.generateCacheKey(TemporaryCacheKeys.NATIVE_REQUEST));
this.setInteractionInProgress(false);
};
/**
* Removes temporary cache for the provided state
* @param stateString
*/
BrowserCacheManager.prototype.cleanRequestByState = function (stateString) {
this.logger.trace("BrowserCacheManager.cleanRequestByState called");
// Interaction is completed - remove interaction status.
if (stateString) {
var stateKey = this.generateStateKey(stateString);
var cachedState = this.temporaryCacheStorage.getItem(stateKey);
this.logger.infoPii("BrowserCacheManager.cleanRequestByState: Removing temporary cache items for state: " + cachedState);
this.resetRequestCache(cachedState || Constants.EMPTY_STRING);
}
this.clearMsalCookies();
};
/**
* Looks in temporary cache for any state values with the provided interactionType and removes all temporary cache items for that state
* Used in scenarios where temp cache needs to be cleaned but state is not known, such as clicking browser back button.
* @param interactionType
*/
BrowserCacheManager.prototype.cleanRequestByInteractionType = function (interactionType) {
var _this = this;
this.logger.trace("BrowserCacheManager.cleanRequestByInteractionType called");
// Loop through all keys to find state key
this.getKeys().forEach(function (key) {
// If this key is not the state key, move on
if (key.indexOf(TemporaryCacheKeys.REQUEST_STATE) === -1) {
return;
}
// Retrieve state value, return if not a valid value
var stateValue = _this.temporaryCacheStorage.getItem(key);
if (!stateValue) {
return;
}
// Extract state and ensure it matches given InteractionType, then clean request cache
var parsedState = BrowserProtocolUtils.extractBrowserRequestState(_this.cryptoImpl, stateValue);
if (parsedState && parsedState.interactionType === interactionType) {
_this.logger.infoPii("BrowserCacheManager.cleanRequestByInteractionType: Removing temporary cache items for state: " + stateValue);
_this.resetRequestCache(stateValue);
}
});
this.clearMsalCookies();
this.setInteractionInProgress(false);
};
BrowserCacheManager.prototype.cacheCodeRequest = function (authCodeRequest, browserCrypto) {
this.logger.trace("BrowserCacheManager.cacheCodeRequest called");
var encodedValue = browserCrypto.base64Encode(JSON.stringify(authCodeRequest));
this.setTemporaryCache(TemporaryCacheKeys.REQUEST_PARAMS, encodedValue, true);
};
/**
* Gets the token exchange parameters from the cache. Throws an error if nothing is found.
*/
BrowserCacheManager.prototype.getCachedRequest = function (state, browserCrypto) {
this.logger.trace("BrowserCacheManager.getCachedRequest called");
// Get token request from cache and parse as TokenExchangeParameters.
var encodedTokenRequest = this.getTemporaryCache(TemporaryCacheKeys.REQUEST_PARAMS, true);
if (!encodedTokenRequest) {
throw BrowserAuthError.createNoTokenRequestCacheError();
}
var parsedRequest = this.validateAndParseJson(browserCrypto.base64Decode(encodedTokenRequest));
if (!parsedRequest) {
throw BrowserAuthError.createUnableToParseTokenRequestCacheError();
}
this.removeItem(this.generateCacheKey(TemporaryCacheKeys.REQUEST_PARAMS));
// Get cached authority and use if no authority is cached with request.
if (StringUtils.isEmpty(parsedRequest.authority)) {
var authorityCacheKey = this.generateAuthorityKey(state);
var cachedAuthority = this.getTemporaryCache(authorityCacheKey);
if (!cachedAuthority) {
throw BrowserAuthError.createNoCachedAuthorityError();
}
parsedRequest.authority = cachedAuthority;
}
return parsedRequest;
};
/**
* Gets cached native request for redirect flows
*/
BrowserCacheManager.prototype.getCachedNativeRequest = function () {
this.logger.trace("BrowserCacheManager.getCachedNativeRequest called");
var cachedRequest = this.getTemporaryCache(TemporaryCacheKeys.NATIVE_REQUEST, true);
if (!cachedRequest) {
this.logger.trace("BrowserCacheManager.getCachedNativeRequest: No cached native request found");
return null;
}
var parsedRequest = this.validateAndParseJson(cachedRequest);
if (!parsedRequest) {
this.logger.error("BrowserCacheManager.getCachedNativeRequest: Unable to parse native request");
return null;
}
return parsedRequest;
};
BrowserCacheManager.prototype.isInteractionInProgress = function (matchClientId) {
var clientId = this.getInteractionInProgress();
if (matchClientId) {
return clientId === this.clientId;
}
else {
return !!clientId;
}
};
BrowserCacheManager.prototype.getInteractionInProgress = function () {
var key = Constants.CACHE_PREFIX + "." + TemporaryCacheKeys.INTERACTION_STATUS_KEY;
return this.getTemporaryCache(key, false);
};
BrowserCacheManager.prototype.setInteractionInProgress = function (inProgress) {
// Ensure we don't overwrite interaction in progress for a different clientId
var key = Constants.CACHE_PREFIX + "." + TemporaryCacheKeys.INTERACTION_STATUS_KEY;
if (inProgress) {
if (this.getInteractionInProgress()) {
throw BrowserAuthError.createInteractionInProgressError();
}
else {
// No interaction is in progress
this.setTemporaryCache(key, this.clientId, false);
}
}
else if (!inProgress && this.getInteractionInProgress() === this.clientId) {
this.removeItem(key);
}
};
/**
* Returns username retrieved from ADAL or MSAL v1 idToken
*/
BrowserCacheManager.prototype.getLegacyLoginHint = function () {
// Only check for adal/msal token if no SSO params are being used
var adalIdTokenString = this.getTemporaryCache(PersistentCacheKeys.ADAL_ID_TOKEN);
if (adalIdTokenString) {
this.browserStorage.removeItem(PersistentCacheKeys.ADAL_ID_TOKEN);
this.logger.verbose("Cached ADAL id token retrieved.");
}
// Check for cached MSAL v1 id token
var msalIdTokenString = this.getTemporaryCache(PersistentCacheKeys.ID_TOKEN, true);
if (msalIdTokenString) {
this.removeItem(this.generateCacheKey(PersistentCacheKeys.ID_TOKEN));
this.logger.verbose("Cached MSAL.js v1 id token retrieved");
}
var cachedIdTokenString = msalIdTokenString || adalIdTokenString;
if (cachedIdTokenString) {
var cachedIdToken = new IdToken(cachedIdTokenString, this.cryptoImpl);
if (cachedIdToken.claims && cachedIdToken.claims.preferred_username) {
this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 preferred_username as loginHint");
return cachedIdToken.claims.preferred_username;
}
else if (cachedIdToken.claims && cachedIdToken.claims.upn) {
this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 upn as loginHint");
return cachedIdToken.claims.upn;
}
else {
this.logger.verbose("No SSO params used and ADAL/MSAL v1 token retrieved, however, no account hint claim found. Enable preferred_username or upn id token claim to get SSO.");
}
}
return null;
};
/**
* Updates a credential's cache key if the current cache key is outdated
*/
BrowserCacheManager.prototype.updateCredentialCacheKey = function (currentCacheKey, credential) {
var updatedCacheKey = credential.generateCredentialKey();
if (currentCacheKey !== updatedCacheKey) {
var cacheItem = this.getItem(currentCacheKey);
if (cacheItem) {
this.removeItem(currentCacheKey);
this.setItem(updatedCacheKey, cacheItem);
this.logger.verbose("Updated an outdated " + credential.credentialType + " cache key");
return updatedCacheKey;
}
else {
this.logger.error("Attempted to update an outdated " + credential.credentialType + " cache key but no item matching the outdated key was found in storage");
}
}
return currentCacheKey;
};
/**
* Returns application id as redirect context during AcquireTokenRedirect flow.
*/
BrowserCacheManager.prototype.getRedirectRequestContext = function () {
return this.getTemporaryCache(TemporaryCacheKeys.REDIRECT_CONTEXT, true);
};
/**
* Sets application id as the redirect context during AcquireTokenRedirect flow.
* @param value
*/
BrowserCacheManager.prototype.setRedirectRequestContext = function (value) {
this.setTemporaryCache(TemporaryCacheKeys.REDIRECT_CONTEXT, value, true);
};
return BrowserCacheManager;
}(CacheManager));
var DEFAULT_BROWSER_CACHE_MANAGER = function (clientId, logger) {
var cacheOptions = {
cacheLocation: BrowserCacheLocation.MemoryStorage,
storeAuthStateInCookie: false,
secureCookies: false
};
return new BrowserCacheManager(clientId, cacheOptions, DEFAULT_CRYPTO_IMPLEMENTATION, logger);
};
export { BrowserCacheManager, DEFAULT_BROWSER_CACHE_MANAGER };
//# sourceMappingURL=BrowserCacheManager.js.map
{"version":3,"file":"BrowserCacheManager.js","sources":["../../src/cache/BrowserCacheManager.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Constants, PersistentCacheKeys, StringUtils, CommonAuthorizationCodeRequest, ICrypto, AccountEntity, IdTokenEntity, AccessTokenEntity, RefreshTokenEntity, AppMetadataEntity, CacheManager, ServerTelemetryEntity, ThrottlingEntity, ProtocolUtils, Logger, AuthorityMetadataEntity, DEFAULT_CRYPTO_IMPLEMENTATION, AccountInfo, ActiveAccountFilters, CcsCredential, CcsCredentialType, IdToken, ValidCredentialType, ClientAuthError } from \"@azure/msal-common\";\nimport { CacheOptions } from \"../config/Configuration\";\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\nimport { BrowserCacheLocation, InteractionType, TemporaryCacheKeys, InMemoryCacheKeys } from \"../utils/BrowserConstants\";\nimport { BrowserStorage } from \"./BrowserStorage\";\nimport { MemoryStorage } from \"./MemoryStorage\";\nimport { IWindowStorage } from \"./IWindowStorage\";\nimport { BrowserProtocolUtils } from \"../utils/BrowserProtocolUtils\";\nimport { NativeTokenRequest } from \"../broker/nativeBroker/NativeRequest\";\n\n/**\n * This class implements the cache storage interface for MSAL through browser local or session storage.\n * Cookies are only used if storeAuthStateInCookie is true, and are only used for\n * parameters such as state and nonce, generally.\n */\nexport class BrowserCacheManager extends CacheManager {\n\n // Cache configuration, either set by user or default values.\n protected cacheConfig: Required<CacheOptions>;\n // Window storage object (either local or sessionStorage)\n protected browserStorage: IWindowStorage<string>;\n // Internal in-memory storage object used for data used by msal that does not need to persist across page loads\n protected internalStorage: MemoryStorage<string>;\n // Temporary cache\n protected temporaryCacheStorage: IWindowStorage<string>;\n // Client id of application. Used in cache keys to partition cache correctly in the case of multiple instances of MSAL.\n protected logger: Logger;\n\n // Cookie life calculation (hours * minutes * seconds * ms)\n protected readonly COOKIE_LIFE_MULTIPLIER = 24 * 60 * 60 * 1000;\n\n constructor(clientId: string, cacheConfig: Required<CacheOptions>, cryptoImpl: ICrypto, logger: Logger) {\n super(clientId, cryptoImpl);\n\n this.cacheConfig = cacheConfig;\n this.logger = logger;\n this.internalStorage = new MemoryStorage();\n this.browserStorage = this.setupBrowserStorage(this.cacheConfig.cacheLocation);\n this.temporaryCacheStorage = this.setupTemporaryCacheStorage(this.cacheConfig.cacheLocation);\n\n // Migrate any cache entries from older versions of MSAL.\n this.migrateCacheEntries();\n }\n\n /**\n * Returns a window storage class implementing the IWindowStorage interface that corresponds to the configured cacheLocation.\n * @param cacheLocation\n */\n protected setupBrowserStorage(cacheLocation: BrowserCacheLocation | string): IWindowStorage<string> {\n switch (cacheLocation) {\n case BrowserCacheLocation.LocalStorage:\n case BrowserCacheLocation.SessionStorage:\n try {\n // Temporary cache items will always be stored in session storage to mitigate problems caused by multiple tabs\n return new BrowserStorage(cacheLocation);\n } catch (e) {\n this.logger.verbose(e);\n break;\n }\n case BrowserCacheLocation.MemoryStorage:\n default:\n break;\n }\n this.cacheConfig.cacheLocation = BrowserCacheLocation.MemoryStorage;\n return new MemoryStorage();\n }\n\n /**\n *\n * @param cacheLocation\n */\n protected setupTemporaryCacheStorage(cacheLocation: BrowserCacheLocation | string): IWindowStorage<string> {\n switch (cacheLocation) {\n case BrowserCacheLocation.LocalStorage:\n case BrowserCacheLocation.SessionStorage:\n try {\n // Temporary cache items will always be stored in session storage to mitigate problems caused by multiple tabs\n return new BrowserStorage(BrowserCacheLocation.SessionStorage);\n } catch (e) {\n this.logger.verbose(e);\n return this.internalStorage;\n }\n case BrowserCacheLocation.MemoryStorage:\n default:\n return this.internalStorage;\n }\n }\n\n /**\n * Migrate all old cache entries to new schema. No rollback supported.\n * @param storeAuthStateInCookie\n */\n protected migrateCacheEntries(): void {\n const idTokenKey = `${Constants.CACHE_PREFIX}.${PersistentCacheKeys.ID_TOKEN}`;\n const clientInfoKey = `${Constants.CACHE_PREFIX}.${PersistentCacheKeys.CLIENT_INFO}`;\n const errorKey = `${Constants.CACHE_PREFIX}.${PersistentCacheKeys.ERROR}`;\n const errorDescKey = `${Constants.CACHE_PREFIX}.${PersistentCacheKeys.ERROR_DESC}`;\n\n const idTokenValue = this.browserStorage.getItem(idTokenKey);\n const clientInfoValue = this.browserStorage.getItem(clientInfoKey);\n const errorValue = this.browserStorage.getItem(errorKey);\n const errorDescValue = this.browserStorage.getItem(errorDescKey);\n\n const values = [idTokenValue, clientInfoValue, errorValue, errorDescValue];\n const keysToMigrate = [PersistentCacheKeys.ID_TOKEN, PersistentCacheKeys.CLIENT_INFO, PersistentCacheKeys.ERROR, PersistentCacheKeys.ERROR_DESC];\n\n keysToMigrate.forEach((cacheKey:string, index: number) => this.migrateCacheEntry(cacheKey, values[index]));\n }\n\n /**\n * Utility function to help with migration.\n * @param newKey\n * @param value\n * @param storeAuthStateInCookie\n */\n protected migrateCacheEntry(newKey: string, value: string|null): void {\n if (value) {\n this.setTemporaryCache(newKey, value, true);\n }\n }\n\n /**\n * Parses passed value as JSON object, JSON.parse() will throw an error.\n * @param input\n */\n protected validateAndParseJson(jsonValue: string): object | null {\n try {\n const parsedJson = JSON.parse(jsonValue);\n /**\n * There are edge cases in which JSON.parse will successfully parse a non-valid JSON object\n * (e.g. JSON.parse will parse an escaped string into an unescaped string), so adding a type check\n * of the parsed value is necessary in order to be certain that the string represents a valid JSON object.\n *\n */\n return (parsedJson && typeof parsedJson === \"object\") ? parsedJson : null;\n } catch (error) {\n return null;\n }\n }\n\n /**\n * fetches the entry from the browser storage based off the key\n * @param key\n */\n getItem(key: string): string | null {\n return this.browserStorage.getItem(key);\n }\n\n /**\n * sets the entry in the browser storage\n * @param key\n * @param value\n */\n setItem(key: string, value: string): void {\n this.browserStorage.setItem(key, value);\n }\n\n /**\n * fetch the account entity from the platform cache\n * @param accountKey\n */\n getAccount(accountKey: string): AccountEntity | null {\n const account = this.getItem(accountKey);\n if (!account) {\n return null;\n }\n\n const parsedAccount = this.validateAndParseJson(account);\n if (!parsedAccount || !AccountEntity.isAccountEntity(parsedAccount)) {\n return null;\n }\n\n return CacheManager.toObject<AccountEntity>(new AccountEntity(), parsedAccount);\n }\n\n /**\n * set account entity in the platform cache\n * @param key\n * @param value\n */\n setAccount(account: AccountEntity): void {\n this.logger.trace(\"BrowserCacheManager.setAccount called\");\n const key = account.generateAccountKey();\n this.setItem(key, JSON.stringify(account));\n }\n\n /**\n * generates idToken entity from a string\n * @param idTokenKey\n */\n getIdTokenCredential(idTokenKey: string): IdTokenEntity | null {\n const value = this.getItem(idTokenKey);\n if (!value) {\n this.logger.trace(\"BrowserCacheManager.getIdTokenCredential: called, no cache hit\");\n return null;\n }\n\n const parsedIdToken = this.validateAndParseJson(value);\n if (!parsedIdToken || !IdTokenEntity.isIdTokenEntity(parsedIdToken)) {\n this.logger.trace(\"BrowserCacheManager.getIdTokenCredential: called, no cache hit\");\n return null;\n }\n\n this.logger.trace(\"BrowserCacheManager.getIdTokenCredential: cache hit\");\n return CacheManager.toObject(new IdTokenEntity(), parsedIdToken);\n }\n\n /**\n * set IdToken credential to the platform cache\n * @param idToken\n */\n setIdTokenCredential(idToken: IdTokenEntity): void {\n this.logger.trace(\"BrowserCacheManager.setIdTokenCredential called\");\n const idTokenKey = idToken.generateCredentialKey();\n\n this.setItem(idTokenKey, JSON.stringify(idToken));\n }\n\n /**\n * generates accessToken entity from a string\n * @param key\n */\n getAccessTokenCredential(accessTokenKey: string): AccessTokenEntity | null {\n const value = this.getItem(accessTokenKey);\n if (!value) {\n this.logger.trace(\"BrowserCacheManager.getAccessTokenCredential: called, no cache hit\");\n return null;\n }\n const parsedAccessToken = this.validateAndParseJson(value);\n if (!parsedAccessToken || !AccessTokenEntity.isAccessTokenEntity(parsedAccessToken)) {\n this.logger.trace(\"BrowserCacheManager.getAccessTokenCredential: called, no cache hit\");\n return null;\n }\n\n this.logger.trace(\"BrowserCacheManager.getAccessTokenCredential: cache hit\");\n return CacheManager.toObject(new AccessTokenEntity(), parsedAccessToken);\n }\n\n /**\n * set accessToken credential to the platform cache\n * @param accessToken\n */\n setAccessTokenCredential(accessToken: AccessTokenEntity): void {\n this.logger.trace(\"BrowserCacheManager.setAccessTokenCredential called\");\n const accessTokenKey = accessToken.generateCredentialKey();\n this.setItem(accessTokenKey, JSON.stringify(accessToken));\n }\n\n /**\n * generates refreshToken entity from a string\n * @param refreshTokenKey\n */\n getRefreshTokenCredential(refreshTokenKey: string): RefreshTokenEntity | null {\n const value = this.getItem(refreshTokenKey);\n if (!value) {\n this.logger.trace(\"BrowserCacheManager.getRefreshTokenCredential: called, no cache hit\");\n return null;\n }\n const parsedRefreshToken = this.validateAndParseJson(value);\n if (!parsedRefreshToken || !RefreshTokenEntity.isRefreshTokenEntity(parsedRefreshToken)) {\n this.logger.trace(\"BrowserCacheManager.getRefreshTokenCredential: called, no cache hit\");\n return null;\n }\n\n this.logger.trace(\"BrowserCacheManager.getRefreshTokenCredential: cache hit\");\n return CacheManager.toObject(new RefreshTokenEntity(), parsedRefreshToken);\n }\n\n /**\n * set refreshToken credential to the platform cache\n * @param refreshToken\n */\n setRefreshTokenCredential(refreshToken: RefreshTokenEntity): void {\n this.logger.trace(\"BrowserCacheManager.setRefreshTokenCredential called\");\n const refreshTokenKey = refreshToken.generateCredentialKey();\n this.setItem(refreshTokenKey, JSON.stringify(refreshToken));\n }\n\n /**\n * fetch appMetadata entity from the platform cache\n * @param appMetadataKey\n */\n getAppMetadata(appMetadataKey: string): AppMetadataEntity | null {\n const value = this.getItem(appMetadataKey);\n if (!value) {\n this.logger.trace(\"BrowserCacheManager.getAppMetadata: called, no cache hit\");\n return null;\n }\n\n const parsedMetadata = this.validateAndParseJson(value);\n if (!parsedMetadata || !AppMetadataEntity.isAppMetadataEntity(appMetadataKey, parsedMetadata)) {\n this.logger.trace(\"BrowserCacheManager.getAppMetadata: called, no cache hit\");\n return null;\n }\n\n this.logger.trace(\"BrowserCacheManager.getAppMetadata: cache hit\");\n return CacheManager.toObject(new AppMetadataEntity(), parsedMetadata);\n }\n\n /**\n * set appMetadata entity to the platform cache\n * @param appMetadata\n */\n setAppMetadata(appMetadata: AppMetadataEntity): void {\n this.logger.trace(\"BrowserCacheManager.setAppMetadata called\");\n const appMetadataKey = appMetadata.generateAppMetadataKey();\n this.setItem(appMetadataKey, JSON.stringify(appMetadata));\n }\n\n /**\n * fetch server telemetry entity from the platform cache\n * @param serverTelemetryKey\n */\n getServerTelemetry(serverTelemetryKey: string): ServerTelemetryEntity | null {\n const value = this.getItem(serverTelemetryKey);\n if (!value) {\n this.logger.trace(\"BrowserCacheManager.getServerTelemetry: called, no cache hit\");\n return null;\n }\n const parsedMetadata = this.validateAndParseJson(value);\n if (!parsedMetadata || !ServerTelemetryEntity.isServerTelemetryEntity(serverTelemetryKey, parsedMetadata)) {\n this.logger.trace(\"BrowserCacheManager.getServerTelemetry: called, no cache hit\");\n return null;\n }\n\n this.logger.trace(\"BrowserCacheManager.getServerTelemetry: cache hit\");\n return CacheManager.toObject(new ServerTelemetryEntity(), parsedMetadata);\n }\n\n /**\n * set server telemetry entity to the platform cache\n * @param serverTelemetryKey\n * @param serverTelemetry\n */\n setServerTelemetry(serverTelemetryKey: string, serverTelemetry: ServerTelemetryEntity): void {\n this.logger.trace(\"BrowserCacheManager.setServerTelemetry called\");\n this.setItem(serverTelemetryKey, JSON.stringify(serverTelemetry));\n }\n\n /**\n *\n */\n getAuthorityMetadata(key: string) : AuthorityMetadataEntity | null {\n const value = this.internalStorage.getItem(key);\n if (!value) {\n this.logger.trace(\"BrowserCacheManager.getAuthorityMetadata: called, no cache hit\");\n return null;\n }\n const parsedMetadata = this.validateAndParseJson(value);\n if (parsedMetadata && AuthorityMetadataEntity.isAuthorityMetadataEntity(key, parsedMetadata)) {\n this.logger.trace(\"BrowserCacheManager.getAuthorityMetadata: cache hit\");\n return CacheManager.toObject(new AuthorityMetadataEntity(), parsedMetadata);\n }\n return null;\n }\n\n /**\n *\n */\n getAuthorityMetadataKeys(): Array<string> {\n const allKeys = this.internalStorage.getKeys();\n return allKeys.filter((key) => {\n return this.isAuthorityMetadata(key);\n });\n }\n\n /**\n * Sets wrapper metadata in memory\n * @param wrapperSKU\n * @param wrapperVersion\n */\n setWrapperMetadata(wrapperSKU: string, wrapperVersion: string): void {\n this.internalStorage.setItem(InMemoryCacheKeys.WRAPPER_SKU, wrapperSKU);\n this.internalStorage.setItem(InMemoryCacheKeys.WRAPPER_VER, wrapperVersion);\n }\n\n /**\n * Returns wrapper metadata from in-memory storage\n */\n getWrapperMetadata(): [string, string] {\n const sku = this.internalStorage.getItem(InMemoryCacheKeys.WRAPPER_SKU) || Constants.EMPTY_STRING;\n const version = this.internalStorage.getItem(InMemoryCacheKeys.WRAPPER_VER) || Constants.EMPTY_STRING;\n return [sku, version];\n }\n\n /**\n *\n * @param entity\n */\n setAuthorityMetadata(key: string, entity: AuthorityMetadataEntity): void {\n this.logger.trace(\"BrowserCacheManager.setAuthorityMetadata called\");\n this.internalStorage.setItem(key, JSON.stringify(entity));\n }\n\n /**\n * Gets the active account\n */\n getActiveAccount(): AccountInfo | null {\n const activeAccountKeyFilters = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS);\n const activeAccountValueFilters = this.getItem(activeAccountKeyFilters);\n if (!activeAccountValueFilters) { \n // if new active account cache type isn't found, it's an old version, so look for that instead\n this.logger.trace(\"No active account filters cache schema found, looking for legacy schema\");\n const activeAccountKeyLocal = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT);\n const activeAccountValueLocal = this.getItem(activeAccountKeyLocal);\n if(!activeAccountValueLocal) {\n this.logger.trace(\"No active account found\");\n return null;\n }\n const activeAccount = this.getAccountInfoByFilter({localAccountId: activeAccountValueLocal})[0] || null;\n if(activeAccount) {\n this.logger.trace(\"Legacy active account cache schema found\");\n this.logger.trace(\"Adding active account filters cache schema\");\n this.setActiveAccount(activeAccount);\n return activeAccount;\n }\n return null;\n }\n const activeAccountValueObj = this.validateAndParseJson(activeAccountValueFilters) as AccountInfo;\n if(activeAccountValueObj) {\n this.logger.trace(\"Active account filters schema found\");\n return this.getAccountInfoByFilter({\n homeAccountId: activeAccountValueObj.homeAccountId,\n localAccountId: activeAccountValueObj.localAccountId\n })[0] || null;\n }\n this.logger.trace(\"No active account found\");\n return null;\n }\n\n /**\n * Sets the active account's localAccountId in cache\n * @param account\n */\n setActiveAccount(account: AccountInfo | null): void {\n const activeAccountKey = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS);\n const activeAccountKeyLocal = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT);\n if (account) {\n this.logger.verbose(\"setActiveAccount: Active account set\");\n const activeAccountValue: ActiveAccountFilters = {\n homeAccountId: account.homeAccountId,\n localAccountId: account.localAccountId\n };\n this.browserStorage.setItem(activeAccountKey, JSON.stringify(activeAccountValue));\n this.browserStorage.setItem(activeAccountKeyLocal, account.localAccountId);\n } else {\n this.logger.verbose(\"setActiveAccount: No account passed, active account not set\");\n this.browserStorage.removeItem(activeAccountKey);\n this.browserStorage.removeItem(activeAccountKeyLocal);\n }\n }\n\n /**\n * Gets a list of accounts that match all of the filters provided\n * @param account\n */\n getAccountInfoByFilter(accountFilter: Partial<Omit<AccountInfo, \"idTokenClaims\"|\"name\">>): AccountInfo[] {\n const allAccounts = this.getAllAccounts();\n return allAccounts.filter((accountObj) => {\n if (accountFilter.username && accountFilter.username.toLowerCase() !== accountObj.username.toLowerCase()) {\n return false;\n }\n\n if (accountFilter.homeAccountId && accountFilter.homeAccountId !== accountObj.homeAccountId) {\n return false;\n }\n\n if (accountFilter.localAccountId && accountFilter.localAccountId !== accountObj.localAccountId) {\n return false;\n }\n\n if (accountFilter.tenantId && accountFilter.tenantId !== accountObj.tenantId) {\n return false;\n }\n\n if (accountFilter.environment && accountFilter.environment !== accountObj.environment) {\n return false;\n }\n\n return true;\n });\n }\n\n /**\n * Checks the cache for accounts matching loginHint or SID\n * @param loginHint\n * @param sid\n */\n getAccountInfoByHints(loginHint?: string, sid?: string): AccountInfo | null {\n const matchingAccounts = this.getAllAccounts().filter((accountInfo) => {\n if (sid) {\n const accountSid = accountInfo.idTokenClaims && accountInfo.idTokenClaims[\"sid\"];\n return sid === accountSid;\n }\n\n if (loginHint) {\n return loginHint === accountInfo.username;\n }\n\n return false;\n });\n\n if (matchingAccounts.length === 1) {\n return matchingAccounts[0];\n } else if (matchingAccounts.length > 1) {\n throw ClientAuthError.createMultipleMatchingAccountsInCacheError();\n }\n\n return null;\n }\n\n /**\n * fetch throttling entity from the platform cache\n * @param throttlingCacheKey\n */\n getThrottlingCache(throttlingCacheKey: string): ThrottlingEntity | null {\n const value = this.getItem(throttlingCacheKey);\n if (!value) {\n this.logger.trace(\"BrowserCacheManager.getThrottlingCache: called, no cache hit\");\n return null;\n }\n\n const parsedThrottlingCache = this.validateAndParseJson(value);\n if (!parsedThrottlingCache || !ThrottlingEntity.isThrottlingEntity(throttlingCacheKey, parsedThrottlingCache)) {\n this.logger.trace(\"BrowserCacheManager.getThrottlingCache: called, no cache hit\");\n return null;\n }\n\n this.logger.trace(\"BrowserCacheManager.getThrottlingCache: cache hit\");\n return CacheManager.toObject(new ThrottlingEntity(), parsedThrottlingCache);\n }\n\n /**\n * set throttling entity to the platform cache\n * @param throttlingCacheKey\n * @param throttlingCache\n */\n setThrottlingCache(throttlingCacheKey: string, throttlingCache: ThrottlingEntity): void {\n this.logger.trace(\"BrowserCacheManager.setThrottlingCache called\");\n this.setItem(throttlingCacheKey, JSON.stringify(throttlingCache));\n }\n\n /**\n * Gets cache item with given key.\n * Will retrieve from cookies if storeAuthStateInCookie is set to true.\n * @param key\n */\n getTemporaryCache(cacheKey: string, generateKey?: boolean): string | null {\n const key = generateKey ? this.generateCacheKey(cacheKey) : cacheKey;\n if (this.cacheConfig.storeAuthStateInCookie) {\n const itemCookie = this.getItemCookie(key);\n if (itemCookie) {\n this.logger.trace(\"BrowserCacheManager.getTemporaryCache: storeAuthStateInCookies set to true, retrieving from cookies\");\n return itemCookie;\n }\n }\n\n const value = this.temporaryCacheStorage.getItem(key);\n if (!value) {\n // If temp cache item not found in session/memory, check local storage for items set by old versions\n if (this.cacheConfig.cacheLocation === BrowserCacheLocation.LocalStorage) {\n const item = this.browserStorage.getItem(key);\n if (item) {\n this.logger.trace(\"BrowserCacheManager.getTemporaryCache: Temporary cache item found in local storage\");\n return item;\n }\n }\n this.logger.trace(\"BrowserCacheManager.getTemporaryCache: No cache item found in local storage\");\n return null;\n }\n this.logger.trace(\"BrowserCacheManager.getTemporaryCache: Temporary cache item returned\");\n return value;\n }\n\n /**\n * Sets the cache item with the key and value given.\n * Stores in cookie if storeAuthStateInCookie is set to true.\n * This can cause cookie overflow if used incorrectly.\n * @param key\n * @param value\n */\n setTemporaryCache(cacheKey: string, value: string, generateKey?: boolean): void {\n const key = generateKey ? this.generateCacheKey(cacheKey) : cacheKey;\n\n this.temporaryCacheStorage.setItem(key, value);\n if (this.cacheConfig.storeAuthStateInCookie) {\n this.logger.trace(\"BrowserCacheManager.setTemporaryCache: storeAuthStateInCookie set to true, setting item cookie\");\n this.setItemCookie(key, value);\n }\n }\n\n /**\n * Removes the cache item with the given key.\n * Will also clear the cookie item if storeAuthStateInCookie is set to true.\n * @param key\n */\n removeItem(key: string): boolean {\n this.browserStorage.removeItem(key);\n this.temporaryCacheStorage.removeItem(key);\n if (this.cacheConfig.storeAuthStateInCookie) {\n this.logger.trace(\"BrowserCacheManager.removeItem: storeAuthStateInCookie is true, clearing item cookie\");\n this.clearItemCookie(key);\n }\n return true;\n }\n\n /**\n * Checks whether key is in cache.\n * @param key\n */\n containsKey(key: string): boolean {\n return this.browserStorage.containsKey(key) || this.temporaryCacheStorage.containsKey(key);\n }\n\n /**\n * Gets all keys in window.\n */\n getKeys(): string[] {\n return [\n ...this.browserStorage.getKeys(),\n ...this.temporaryCacheStorage.getKeys()\n ];\n }\n\n /**\n * Clears all cache entries created by MSAL.\n */\n async clear(): Promise<void> {\n // Removes all accounts and their credentials\n await this.removeAllAccounts();\n this.removeAppMetadata();\n\n // Removes all remaining MSAL cache items\n this.getKeys().forEach((cacheKey: string) => {\n // Check if key contains msal prefix; For now, we are clearing all the cache items created by MSAL.js\n if ((this.browserStorage.containsKey(cacheKey) || this.temporaryCacheStorage.containsKey(cacheKey)) && ((cacheKey.indexOf(Constants.CACHE_PREFIX) !== -1) || (cacheKey.indexOf(this.clientId) !== -1))) {\n this.removeItem(cacheKey);\n }\n });\n\n this.internalStorage.clear();\n }\n\n /**\n * Add value to cookies\n * @param cookieName\n * @param cookieValue\n * @param expires\n */\n setItemCookie(cookieName: string, cookieValue: string, expires?: number): void {\n let cookieStr = `${encodeURIComponent(cookieName)}=${encodeURIComponent(cookieValue)};path=/;SameSite=Lax;`;\n if (expires) {\n const expireTime = this.getCookieExpirationTime(expires);\n cookieStr += `expires=${expireTime};`;\n }\n\n if (this.cacheConfig.secureCookies) {\n cookieStr += \"Secure;\";\n }\n\n document.cookie = cookieStr;\n }\n\n /**\n * Get one item by key from cookies\n * @param cookieName\n */\n getItemCookie(cookieName: string): string {\n const name = `${encodeURIComponent(cookieName)}=`;\n const cookieList = document.cookie.split(\";\");\n for (let i: number = 0; i < cookieList.length; i++) {\n let cookie = cookieList[i];\n while (cookie.charAt(0) === \" \") {\n cookie = cookie.substring(1);\n }\n if (cookie.indexOf(name) === 0) {\n return decodeURIComponent(cookie.substring(name.length, cookie.length));\n }\n }\n return Constants.EMPTY_STRING;\n }\n\n /**\n * Clear all msal-related cookies currently set in the browser. Should only be used to clear temporary cache items.\n */\n clearMsalCookies(): void {\n const cookiePrefix = `${Constants.CACHE_PREFIX}.${this.clientId}`;\n const cookieList = document.cookie.split(\";\");\n cookieList.forEach((cookie: string): void => {\n while (cookie.charAt(0) === \" \") {\n // eslint-disable-next-line no-param-reassign\n cookie = cookie.substring(1);\n }\n if (cookie.indexOf(cookiePrefix) === 0) {\n const cookieKey = cookie.split(\"=\")[0];\n this.clearItemCookie(cookieKey);\n }\n });\n }\n\n /**\n * Clear an item in the cookies by key\n * @param cookieName\n */\n clearItemCookie(cookieName: string): void {\n this.setItemCookie(cookieName, Constants.EMPTY_STRING, -1);\n }\n\n /**\n * Get cookie expiration time\n * @param cookieLifeDays\n */\n getCookieExpirationTime(cookieLifeDays: number): string {\n const today = new Date();\n const expr = new Date(today.getTime() + cookieLifeDays * this.COOKIE_LIFE_MULTIPLIER);\n return expr.toUTCString();\n }\n\n /**\n * Gets the cache object referenced by the browser\n */\n getCache(): object {\n return this.browserStorage;\n }\n\n /**\n * interface compat, we cannot overwrite browser cache; Functionality is supported by individual entities in browser\n */\n setCache(): void {\n // sets nothing\n }\n\n /**\n * Prepend msal.<client-id> to each key; Skip for any JSON object as Key (defined schemas do not need the key appended: AccessToken Keys or the upcoming schema)\n * @param key\n * @param addInstanceId\n */\n generateCacheKey(key: string): string {\n const generatedKey = this.validateAndParseJson(key);\n if (!generatedKey) {\n if (StringUtils.startsWith(key, Constants.CACHE_PREFIX) || StringUtils.startsWith(key, PersistentCacheKeys.ADAL_ID_TOKEN)) {\n return key;\n }\n return `${Constants.CACHE_PREFIX}.${this.clientId}.${key}`;\n }\n\n return JSON.stringify(key);\n }\n\n /**\n * Create authorityKey to cache authority\n * @param state\n */\n generateAuthorityKey(stateString: string): string {\n const {\n libraryState: {\n id: stateId\n }\n } = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString);\n\n return this.generateCacheKey(`${TemporaryCacheKeys.AUTHORITY}.${stateId}`);\n }\n\n /**\n * Create Nonce key to cache nonce\n * @param state\n */\n generateNonceKey(stateString: string): string {\n const {\n libraryState: {\n id: stateId\n }\n } = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString);\n\n return this.generateCacheKey(`${TemporaryCacheKeys.NONCE_IDTOKEN}.${stateId}`);\n }\n\n /**\n * Creates full cache key for the request state\n * @param stateString State string for the request\n */\n generateStateKey(stateString: string): string {\n // Use the library state id to key temp storage for uniqueness for multiple concurrent requests\n const {\n libraryState: {\n id: stateId\n }\n } = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString);\n return this.generateCacheKey(`${TemporaryCacheKeys.REQUEST_STATE}.${stateId}`);\n }\n\n /**\n * Gets the cached authority based on the cached state. Returns empty if no cached state found.\n */\n getCachedAuthority(cachedState: string): string | null {\n const stateCacheKey = this.generateStateKey(cachedState);\n const state = this.getTemporaryCache(stateCacheKey);\n if (!state) {\n return null;\n }\n\n const authorityCacheKey = this.generateAuthorityKey(state);\n return this.getTemporaryCache(authorityCacheKey);\n }\n\n /**\n * Updates account, authority, and state in cache\n * @param serverAuthenticationRequest\n * @param account\n */\n updateCacheEntries(state: string, nonce: string, authorityInstance: string, loginHint: string, account: AccountInfo|null): void {\n this.logger.trace(\"BrowserCacheManager.updateCacheEntries called\");\n // Cache the request state\n const stateCacheKey = this.generateStateKey(state);\n this.setTemporaryCache(stateCacheKey, state, false);\n\n // Cache the nonce\n const nonceCacheKey = this.generateNonceKey(state);\n this.setTemporaryCache(nonceCacheKey, nonce, false);\n\n // Cache authorityKey\n const authorityCacheKey = this.generateAuthorityKey(state);\n this.setTemporaryCache(authorityCacheKey, authorityInstance, false);\n\n if (account) {\n const ccsCredential: CcsCredential = {\n credential: account.homeAccountId,\n type: CcsCredentialType.HOME_ACCOUNT_ID\n };\n this.setTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, JSON.stringify(ccsCredential), true);\n } else if (!StringUtils.isEmpty(loginHint)) {\n const ccsCredential: CcsCredential = {\n credential: loginHint,\n type: CcsCredentialType.UPN\n };\n this.setTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, JSON.stringify(ccsCredential), true);\n }\n }\n\n /**\n * Reset all temporary cache items\n * @param state\n */\n resetRequestCache(state: string): void {\n this.logger.trace(\"BrowserCacheManager.resetRequestCache called\");\n // check state and remove associated cache items\n if (!StringUtils.isEmpty(state)) {\n this.getKeys().forEach(key => {\n if (key.indexOf(state) !== -1) {\n this.removeItem(key);\n }\n });\n }\n\n // delete generic interactive request parameters\n if (state) {\n this.removeItem(this.generateStateKey(state));\n this.removeItem(this.generateNonceKey(state));\n this.removeItem(this.generateAuthorityKey(state));\n }\n this.removeItem(this.generateCacheKey(TemporaryCacheKeys.REQUEST_PARAMS));\n this.removeItem(this.generateCacheKey(TemporaryCacheKeys.ORIGIN_URI));\n this.removeItem(this.generateCacheKey(TemporaryCacheKeys.URL_HASH));\n this.removeItem(this.generateCacheKey(TemporaryCacheKeys.CORRELATION_ID));\n this.removeItem(this.generateCacheKey(TemporaryCacheKeys.CCS_CREDENTIAL));\n this.removeItem(this.generateCacheKey(TemporaryCacheKeys.NATIVE_REQUEST));\n this.setInteractionInProgress(false);\n }\n\n /**\n * Removes temporary cache for the provided state\n * @param stateString\n */\n cleanRequestByState(stateString: string): void {\n this.logger.trace(\"BrowserCacheManager.cleanRequestByState called\");\n // Interaction is completed - remove interaction status.\n if (stateString) {\n const stateKey = this.generateStateKey(stateString);\n const cachedState = this.temporaryCacheStorage.getItem(stateKey);\n this.logger.infoPii(`BrowserCacheManager.cleanRequestByState: Removing temporary cache items for state: ${cachedState}`);\n this.resetRequestCache(cachedState || Constants.EMPTY_STRING);\n }\n this.clearMsalCookies();\n }\n\n /**\n * Looks in temporary cache for any state values with the provided interactionType and removes all temporary cache items for that state\n * Used in scenarios where temp cache needs to be cleaned but state is not known, such as clicking browser back button.\n * @param interactionType\n */\n cleanRequestByInteractionType(interactionType: InteractionType): void {\n this.logger.trace(\"BrowserCacheManager.cleanRequestByInteractionType called\");\n // Loop through all keys to find state key\n this.getKeys().forEach((key) => {\n // If this key is not the state key, move on\n if (key.indexOf(TemporaryCacheKeys.REQUEST_STATE) === -1) {\n return;\n }\n\n // Retrieve state value, return if not a valid value\n const stateValue = this.temporaryCacheStorage.getItem(key);\n if (!stateValue) {\n return;\n }\n // Extract state and ensure it matches given InteractionType, then clean request cache\n const parsedState = BrowserProtocolUtils.extractBrowserRequestState(this.cryptoImpl, stateValue);\n if (parsedState && parsedState.interactionType === interactionType) {\n this.logger.infoPii(`BrowserCacheManager.cleanRequestByInteractionType: Removing temporary cache items for state: ${stateValue}`);\n this.resetRequestCache(stateValue);\n }\n });\n this.clearMsalCookies();\n this.setInteractionInProgress(false);\n }\n\n cacheCodeRequest(authCodeRequest: CommonAuthorizationCodeRequest, browserCrypto: ICrypto): void {\n this.logger.trace(\"BrowserCacheManager.cacheCodeRequest called\");\n\n const encodedValue = browserCrypto.base64Encode(JSON.stringify(authCodeRequest));\n this.setTemporaryCache(TemporaryCacheKeys.REQUEST_PARAMS, encodedValue, true);\n }\n\n /**\n * Gets the token exchange parameters from the cache. Throws an error if nothing is found.\n */\n getCachedRequest(state: string, browserCrypto: ICrypto): CommonAuthorizationCodeRequest {\n this.logger.trace(\"BrowserCacheManager.getCachedRequest called\");\n // Get token request from cache and parse as TokenExchangeParameters.\n const encodedTokenRequest = this.getTemporaryCache(TemporaryCacheKeys.REQUEST_PARAMS, true);\n if (!encodedTokenRequest) {\n throw BrowserAuthError.createNoTokenRequestCacheError();\n }\n\n const parsedRequest = this.validateAndParseJson(browserCrypto.base64Decode(encodedTokenRequest)) as CommonAuthorizationCodeRequest;\n if (!parsedRequest) {\n throw BrowserAuthError.createUnableToParseTokenRequestCacheError();\n }\n this.removeItem(this.generateCacheKey(TemporaryCacheKeys.REQUEST_PARAMS));\n\n // Get cached authority and use if no authority is cached with request.\n if (StringUtils.isEmpty(parsedRequest.authority)) {\n const authorityCacheKey: string = this.generateAuthorityKey(state);\n const cachedAuthority = this.getTemporaryCache(authorityCacheKey);\n if (!cachedAuthority) {\n throw BrowserAuthError.createNoCachedAuthorityError();\n }\n parsedRequest.authority = cachedAuthority;\n }\n\n return parsedRequest;\n }\n\n /**\n * Gets cached native request for redirect flows\n */\n getCachedNativeRequest(): NativeTokenRequest | null {\n this.logger.trace(\"BrowserCacheManager.getCachedNativeRequest called\");\n const cachedRequest = this.getTemporaryCache(TemporaryCacheKeys.NATIVE_REQUEST, true);\n if (!cachedRequest) {\n this.logger.trace(\"BrowserCacheManager.getCachedNativeRequest: No cached native request found\");\n return null;\n }\n\n const parsedRequest = this.validateAndParseJson(cachedRequest) as NativeTokenRequest;\n if (!parsedRequest) {\n this.logger.error(\"BrowserCacheManager.getCachedNativeRequest: Unable to parse native request\");\n return null;\n }\n\n return parsedRequest;\n }\n\n isInteractionInProgress(matchClientId?: boolean): boolean {\n const clientId = this.getInteractionInProgress();\n\n if (matchClientId) {\n return clientId === this.clientId;\n } else {\n return !!clientId;\n }\n }\n\n getInteractionInProgress(): string | null {\n const key = `${Constants.CACHE_PREFIX}.${TemporaryCacheKeys.INTERACTION_STATUS_KEY}`;\n return this.getTemporaryCache(key, false);\n }\n\n setInteractionInProgress(inProgress: boolean): void {\n // Ensure we don't overwrite interaction in progress for a different clientId\n const key = `${Constants.CACHE_PREFIX}.${TemporaryCacheKeys.INTERACTION_STATUS_KEY}`;\n if (inProgress) {\n if (this.getInteractionInProgress()) {\n throw BrowserAuthError.createInteractionInProgressError();\n } else {\n // No interaction is in progress\n this.setTemporaryCache(key, this.clientId, false);\n }\n } else if (!inProgress && this.getInteractionInProgress() === this.clientId) {\n this.removeItem(key);\n }\n }\n\n /**\n * Returns username retrieved from ADAL or MSAL v1 idToken\n */\n getLegacyLoginHint(): string | null {\n // Only check for adal/msal token if no SSO params are being used\n const adalIdTokenString = this.getTemporaryCache(PersistentCacheKeys.ADAL_ID_TOKEN);\n if (adalIdTokenString) {\n this.browserStorage.removeItem(PersistentCacheKeys.ADAL_ID_TOKEN);\n this.logger.verbose(\"Cached ADAL id token retrieved.\");\n }\n\n // Check for cached MSAL v1 id token\n const msalIdTokenString = this.getTemporaryCache(PersistentCacheKeys.ID_TOKEN, true);\n if (msalIdTokenString) {\n this.removeItem(this.generateCacheKey(PersistentCacheKeys.ID_TOKEN));\n this.logger.verbose(\"Cached MSAL.js v1 id token retrieved\");\n }\n\n const cachedIdTokenString = msalIdTokenString || adalIdTokenString;\n if (cachedIdTokenString) {\n const cachedIdToken = new IdToken(cachedIdTokenString, this.cryptoImpl);\n if (cachedIdToken.claims && cachedIdToken.claims.preferred_username) {\n this.logger.verbose(\"No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 preferred_username as loginHint\");\n return cachedIdToken.claims.preferred_username;\n }\n else if (cachedIdToken.claims && cachedIdToken.claims.upn) {\n this.logger.verbose(\"No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 upn as loginHint\");\n return cachedIdToken.claims.upn;\n }\n else {\n this.logger.verbose(\"No SSO params used and ADAL/MSAL v1 token retrieved, however, no account hint claim found. Enable preferred_username or upn id token claim to get SSO.\");\n }\n }\n\n return null;\n }\n\n /**\n * Updates a credential's cache key if the current cache key is outdated\n */\n updateCredentialCacheKey(currentCacheKey: string, credential: ValidCredentialType): string {\n const updatedCacheKey = credential.generateCredentialKey();\n\n if (currentCacheKey !== updatedCacheKey) {\n const cacheItem = this.getItem(currentCacheKey);\n if (cacheItem) {\n this.removeItem(currentCacheKey);\n this.setItem(updatedCacheKey, cacheItem);\n this.logger.verbose(`Updated an outdated ${credential.credentialType} cache key`);\n return updatedCacheKey;\n } else {\n this.logger.error(`Attempted to update an outdated ${credential.credentialType} cache key but no item matching the outdated key was found in storage`);\n }\n }\n\n return currentCacheKey;\n }\n\n /**\n * Returns application id as redirect context during AcquireTokenRedirect flow.\n */\n getRedirectRequestContext(): string | null {\n return this.getTemporaryCache(TemporaryCacheKeys.REDIRECT_CONTEXT, true);\n }\n \n /**\n * Sets application id as the redirect context during AcquireTokenRedirect flow.\n * @param value \n */\n setRedirectRequestContext(value: string): void {\n this.setTemporaryCache(TemporaryCacheKeys.REDIRECT_CONTEXT, value, true);\n }\n}\n\nexport const DEFAULT_BROWSER_CACHE_MANAGER = (clientId: string, logger: Logger): BrowserCacheManager => {\n const cacheOptions = {\n cacheLocation: BrowserCacheLocation.MemoryStorage,\n storeAuthStateInCookie: false,\n secureCookies: false\n };\n return new BrowserCacheManager(clientId, cacheOptions, DEFAULT_CRYPTO_IMPLEMENTATION, logger);\n};\n"],"names":[],"mappings":"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"}
\ No newline at end of file
import { IWindowStorage } from "./IWindowStorage";
export declare class BrowserStorage implements IWindowStorage<string> {
private windowStorage;
constructor(cacheLocation: string);
private validateWindowStorage;
getItem(key: string): string | null;
setItem(key: string, value: string): void;
removeItem(key: string): void;
getKeys(): string[];
containsKey(key: string): boolean;
}
//# sourceMappingURL=BrowserStorage.d.ts.map
\ No newline at end of file
{"version":3,"file":"BrowserStorage.d.ts","sourceRoot":"","sources":["../../src/cache/BrowserStorage.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,qBAAa,cAAe,YAAW,cAAc,CAAC,MAAM,CAAC;IAEzD,OAAO,CAAC,aAAa,CAAU;gBAEnB,aAAa,EAAE,MAAM;IAKjC,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAInC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B,OAAO,IAAI,MAAM,EAAE;IAInB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAGpC"}
\ No newline at end of file
/*! @azure/msal-browser v2.32.1 2022-12-07 */
'use strict';
import { BrowserConfigurationAuthError } from '../error/BrowserConfigurationAuthError.js';
import { BrowserCacheLocation } from '../utils/BrowserConstants.js';
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
var BrowserStorage = /** @class */ (function () {
function BrowserStorage(cacheLocation) {
this.validateWindowStorage(cacheLocation);
this.windowStorage = window[cacheLocation];
}
BrowserStorage.prototype.validateWindowStorage = function (cacheLocation) {
if (cacheLocation !== BrowserCacheLocation.LocalStorage && cacheLocation !== BrowserCacheLocation.SessionStorage) {
throw BrowserConfigurationAuthError.createStorageNotSupportedError(cacheLocation);
}
var storageSupported = !!window[cacheLocation];
if (!storageSupported) {
throw BrowserConfigurationAuthError.createStorageNotSupportedError(cacheLocation);
}
};
BrowserStorage.prototype.getItem = function (key) {
return this.windowStorage.getItem(key);
};
BrowserStorage.prototype.setItem = function (key, value) {
this.windowStorage.setItem(key, value);
};
BrowserStorage.prototype.removeItem = function (key) {
this.windowStorage.removeItem(key);
};
BrowserStorage.prototype.getKeys = function () {
return Object.keys(this.windowStorage);
};
BrowserStorage.prototype.containsKey = function (key) {
return this.windowStorage.hasOwnProperty(key);
};
return BrowserStorage;
}());
export { BrowserStorage };
//# sourceMappingURL=BrowserStorage.js.map
{"version":3,"file":"BrowserStorage.js","sources":["../../src/cache/BrowserStorage.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { BrowserConfigurationAuthError } from \"../error/BrowserConfigurationAuthError\";\nimport { BrowserCacheLocation } from \"../utils/BrowserConstants\";\nimport { IWindowStorage } from \"./IWindowStorage\";\n\nexport class BrowserStorage implements IWindowStorage<string> {\n\n private windowStorage: Storage;\n\n constructor(cacheLocation: string) {\n this.validateWindowStorage(cacheLocation);\n this.windowStorage = window[cacheLocation];\n }\n\n private validateWindowStorage(cacheLocation: string): void {\n if (cacheLocation !== BrowserCacheLocation.LocalStorage && cacheLocation !== BrowserCacheLocation.SessionStorage) {\n throw BrowserConfigurationAuthError.createStorageNotSupportedError(cacheLocation);\n }\n const storageSupported = !!window[cacheLocation];\n if (!storageSupported) {\n throw BrowserConfigurationAuthError.createStorageNotSupportedError(cacheLocation);\n }\n }\n\n getItem(key: string): string | null {\n return this.windowStorage.getItem(key);\n }\n\n setItem(key: string, value: string): void {\n this.windowStorage.setItem(key, value);\n }\n\n removeItem(key: string): void {\n this.windowStorage.removeItem(key);\n }\n\n getKeys(): string[] {\n return Object.keys(this.windowStorage);\n }\n\n containsKey(key: string): boolean {\n return this.windowStorage.hasOwnProperty(key);\n }\n}\n"],"names":[],"mappings":";;;;;AAAA;;;;;IAaI,wBAAY,aAAqB;QAC7B,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QAC1C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;KAC9C;IAEO,8CAAqB,GAA7B,UAA8B,aAAqB;QAC/C,IAAI,aAAa,KAAK,oBAAoB,CAAC,YAAY,IAAI,aAAa,KAAK,oBAAoB,CAAC,cAAc,EAAE;YAC9G,MAAM,6BAA6B,CAAC,8BAA8B,CAAC,aAAa,CAAC,CAAC;SACrF;QACD,IAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACjD,IAAI,CAAC,gBAAgB,EAAE;YACnB,MAAM,6BAA6B,CAAC,8BAA8B,CAAC,aAAa,CAAC,CAAC;SACrF;KACJ;IAED,gCAAO,GAAP,UAAQ,GAAW;QACf,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;KAC1C;IAED,gCAAO,GAAP,UAAQ,GAAW,EAAE,KAAa;QAC9B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;KAC1C;IAED,mCAAU,GAAV,UAAW,GAAW;QAClB,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;KACtC;IAED,gCAAO,GAAP;QACI,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;KAC1C;IAED,oCAAW,GAAX,UAAY,GAAW;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;KACjD;IACL,qBAAC;AAAD,CAAC;;;;"}
\ No newline at end of file
import { Logger } from "@azure/msal-common";
import { CachedKeyPair } from "../crypto/CryptoOps";
import { AsyncMemoryStorage } from "./AsyncMemoryStorage";
export declare enum CryptoKeyStoreNames {
asymmetricKeys = "asymmetricKeys",
symmetricKeys = "symmetricKeys"
}
/**
* MSAL CryptoKeyStore DB Version 2
*/
export declare class CryptoKeyStore {
asymmetricKeys: AsyncMemoryStorage<CachedKeyPair>;
symmetricKeys: AsyncMemoryStorage<CryptoKey>;
logger: Logger;
constructor(logger: Logger);
clear(): Promise<boolean>;
}
//# sourceMappingURL=CryptoKeyStore.d.ts.map
\ No newline at end of file
{"version":3,"file":"CryptoKeyStore.d.ts","sourceRoot":"","sources":["../../src/cache/CryptoKeyStore.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,oBAAY,mBAAmB;IAC3B,cAAc,mBAAmB;IACjC,aAAa,kBAAkB;CAClC;AACD;;GAEG;AACH,qBAAa,cAAc;IAChB,cAAc,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAClD,aAAa,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC;gBAEV,MAAM,EAAE,MAAM;IAMpB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;CAsBlC"}
\ No newline at end of file
/*! @azure/msal-browser v2.32.1 2022-12-07 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { AsyncMemoryStorage } from './AsyncMemoryStorage.js';
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
var CryptoKeyStoreNames;
(function (CryptoKeyStoreNames) {
CryptoKeyStoreNames["asymmetricKeys"] = "asymmetricKeys";
CryptoKeyStoreNames["symmetricKeys"] = "symmetricKeys";
})(CryptoKeyStoreNames || (CryptoKeyStoreNames = {}));
/**
* MSAL CryptoKeyStore DB Version 2
*/
var CryptoKeyStore = /** @class */ (function () {
function CryptoKeyStore(logger) {
this.logger = logger;
this.asymmetricKeys = new AsyncMemoryStorage(this.logger, CryptoKeyStoreNames.asymmetricKeys);
this.symmetricKeys = new AsyncMemoryStorage(this.logger, CryptoKeyStoreNames.symmetricKeys);
}
CryptoKeyStore.prototype.clear = function () {
return __awaiter(this, void 0, void 0, function () {
var e_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
// Delete in-memory keystores
this.asymmetricKeys.clearInMemory();
this.symmetricKeys.clearInMemory();
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, this.asymmetricKeys.clearPersistent()];
case 2:
_a.sent();
return [2 /*return*/, true];
case 3:
e_1 = _a.sent();
if (e_1 instanceof Error) {
this.logger.error("Clearing keystore failed with error: " + e_1.message);
}
else {
this.logger.error("Clearing keystore failed with unknown error");
}
return [2 /*return*/, false];
case 4: return [2 /*return*/];
}
});
});
};
return CryptoKeyStore;
}());
export { CryptoKeyStore, CryptoKeyStoreNames };
//# sourceMappingURL=CryptoKeyStore.js.map
{"version":3,"file":"CryptoKeyStore.js","sources":["../../src/cache/CryptoKeyStore.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Logger } from \"@azure/msal-common\";\nimport { CachedKeyPair } from \"../crypto/CryptoOps\";\nimport { AsyncMemoryStorage } from \"./AsyncMemoryStorage\";\n\nexport enum CryptoKeyStoreNames {\n asymmetricKeys = \"asymmetricKeys\",\n symmetricKeys = \"symmetricKeys\"\n}\n/**\n * MSAL CryptoKeyStore DB Version 2\n */\nexport class CryptoKeyStore {\n public asymmetricKeys: AsyncMemoryStorage<CachedKeyPair>;\n public symmetricKeys: AsyncMemoryStorage<CryptoKey>;\n public logger: Logger;\n\n constructor(logger: Logger){\n this.logger = logger;\n this.asymmetricKeys = new AsyncMemoryStorage<CachedKeyPair>(this.logger, CryptoKeyStoreNames.asymmetricKeys);\n this.symmetricKeys = new AsyncMemoryStorage<CryptoKey>(this.logger, CryptoKeyStoreNames.symmetricKeys);\n }\n\n async clear(): Promise<boolean> {\n // Delete in-memory keystores\n this.asymmetricKeys.clearInMemory();\n\t this.symmetricKeys.clearInMemory();\n\t\t\n /**\n * There is only one database, so calling clearPersistent on asymmetric keystore takes care of\n * every persistent keystore\n */\n try {\n await this.asymmetricKeys.clearPersistent();\n return true;\n } catch (e) {\n if (e instanceof Error) {\n this.logger.error(`Clearing keystore failed with error: ${e.message}`);\n } else {\n this.logger.error(\"Clearing keystore failed with unknown error\");\n }\n \n return false;\n }\n }\n}\n"],"names":[],"mappings":";;;;;AAAA;;;;IASY;AAAZ,WAAY,mBAAmB;IAC3B,wDAAiC,CAAA;IACjC,sDAA+B,CAAA;AACnC,CAAC,EAHW,mBAAmB,KAAnB,mBAAmB,QAG9B;AACD;;;;IAQI,wBAAY,MAAc;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,IAAI,kBAAkB,CAAgB,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,cAAc,CAAC,CAAC;QAC7G,IAAI,CAAC,aAAa,GAAG,IAAI,kBAAkB,CAAY,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;KAC1G;IAEK,8BAAK,GAAX;;;;;;;wBAEI,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;wBACvC,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;;;;wBAO5B,qBAAM,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,EAAA;;wBAA3C,SAA2C,CAAC;wBAC5C,sBAAO,IAAI,EAAC;;;wBAEZ,IAAI,GAAC,YAAY,KAAK,EAAE;4BACpB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0CAAwC,GAAC,CAAC,OAAS,CAAC,CAAC;yBAC1E;6BAAM;4BACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;yBACpE;wBAED,sBAAO,KAAK,EAAC;;;;;KAEpB;IACL,qBAAC;AAAD,CAAC;;;;"}
\ No newline at end of file
import { IAsyncStorage } from "./IAsyncMemoryStorage";
/**
* Storage wrapper for IndexedDB storage in browsers: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API
*/
export declare class DatabaseStorage<T> implements IAsyncStorage<T> {
private db;
private dbName;
private tableName;
private version;
private dbOpen;
constructor();
/**
* Opens IndexedDB instance.
*/
open(): Promise<void>;
/**
* Closes the connection to IndexedDB database when all pending transactions
* complete.
*/
closeConnection(): void;
/**
* Opens database if it's not already open
*/
private validateDbIsOpen;
/**
* Retrieves item from IndexedDB instance.
* @param key
*/
getItem(key: string): Promise<T | null>;
/**
* Adds item to IndexedDB under given key
* @param key
* @param payload
*/
setItem(key: string, payload: T): Promise<void>;
/**
* Removes item from IndexedDB under given key
* @param key
*/
removeItem(key: string): Promise<void>;
/**
* Get all the keys from the storage object as an iterable array of strings.
*/
getKeys(): Promise<string[]>;
/**
*
* Checks whether there is an object under the search key in the object store
*/
containsKey(key: string): Promise<boolean>;
/**
* Deletes the MSAL database. The database is deleted rather than cleared to make it possible
* for client applications to downgrade to a previous MSAL version without worrying about forward compatibility issues
* with IndexedDB database versions.
*/
deleteDatabase(): Promise<boolean>;
}
//# sourceMappingURL=DatabaseStorage.d.ts.map
\ No newline at end of file
{"version":3,"file":"DatabaseStorage.d.ts","sourceRoot":"","sources":["../../src/cache/DatabaseStorage.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AActD;;GAEG;AACH,qBAAa,eAAe,CAAC,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,EAAE,CAAwB;IAClC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAU;;IASxB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B;;;OAGG;IACH,eAAe,IAAI,IAAI;IAQvB;;OAEG;YACW,gBAAgB;IAM9B;;;OAGG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAwB7C;;;;OAIG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBrD;;;OAGG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB5C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAwBlC;;;OAGG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAyBhD;;;;OAIG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAc3C"}
\ No newline at end of file
/*! @azure/msal-browser v2.32.1 2022-12-07 */
'use strict';
import { __awaiter, __generator } from '../_virtual/_tslib.js';
import { BrowserAuthError } from '../error/BrowserAuthError.js';
import { DB_NAME, DB_VERSION, DB_TABLE_NAME } from '../utils/BrowserConstants.js';
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
/**
* Storage wrapper for IndexedDB storage in browsers: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API
*/
var DatabaseStorage = /** @class */ (function () {
function DatabaseStorage() {
this.dbName = DB_NAME;
this.version = DB_VERSION;
this.tableName = DB_TABLE_NAME;
this.dbOpen = false;
}
/**
* Opens IndexedDB instance.
*/
DatabaseStorage.prototype.open = function () {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
return [2 /*return*/, new Promise(function (resolve, reject) {
var openDB = window.indexedDB.open(_this.dbName, _this.version);
openDB.addEventListener("upgradeneeded", function (e) {
var event = e;
event.target.result.createObjectStore(_this.tableName);
});
openDB.addEventListener("success", function (e) {
var event = e;
_this.db = event.target.result;
_this.dbOpen = true;
resolve();
});
openDB.addEventListener("error", function () { return reject(BrowserAuthError.createDatabaseUnavailableError()); });
})];
});
});
};
/**
* Closes the connection to IndexedDB database when all pending transactions
* complete.
*/
DatabaseStorage.prototype.closeConnection = function () {
var db = this.db;
if (db && this.dbOpen) {
db.close();
this.dbOpen = false;
}
};
/**
* Opens database if it's not already open
*/
DatabaseStorage.prototype.validateDbIsOpen = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!!this.dbOpen) return [3 /*break*/, 2];
return [4 /*yield*/, this.open()];
case 1: return [2 /*return*/, _a.sent()];
case 2: return [2 /*return*/];
}
});
});
};
/**
* Retrieves item from IndexedDB instance.
* @param key
*/
DatabaseStorage.prototype.getItem = function (key) {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.validateDbIsOpen()];
case 1:
_a.sent();
return [2 /*return*/, new Promise(function (resolve, reject) {
// TODO: Add timeouts?
if (!_this.db) {
return reject(BrowserAuthError.createDatabaseNotOpenError());
}
var transaction = _this.db.transaction([_this.tableName], "readonly");
var objectStore = transaction.objectStore(_this.tableName);
var dbGet = objectStore.get(key);
dbGet.addEventListener("success", function (e) {
var event = e;
_this.closeConnection();
resolve(event.target.result);
});
dbGet.addEventListener("error", function (e) {
_this.closeConnection();
reject(e);
});
})];
}
});
});
};
/**
* Adds item to IndexedDB under given key
* @param key
* @param payload
*/
DatabaseStorage.prototype.setItem = function (key, payload) {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.validateDbIsOpen()];
case 1:
_a.sent();
return [2 /*return*/, new Promise(function (resolve, reject) {
// TODO: Add timeouts?
if (!_this.db) {
return reject(BrowserAuthError.createDatabaseNotOpenError());
}
var transaction = _this.db.transaction([_this.tableName], "readwrite");
var objectStore = transaction.objectStore(_this.tableName);
var dbPut = objectStore.put(payload, key);
dbPut.addEventListener("success", function () {
_this.closeConnection();
resolve();
});
dbPut.addEventListener("error", function (e) {
_this.closeConnection();
reject(e);
});
})];
}
});
});
};
/**
* Removes item from IndexedDB under given key
* @param key
*/
DatabaseStorage.prototype.removeItem = function (key) {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.validateDbIsOpen()];
case 1:
_a.sent();
return [2 /*return*/, new Promise(function (resolve, reject) {
if (!_this.db) {
return reject(BrowserAuthError.createDatabaseNotOpenError());
}
var transaction = _this.db.transaction([_this.tableName], "readwrite");
var objectStore = transaction.objectStore(_this.tableName);
var dbDelete = objectStore.delete(key);
dbDelete.addEventListener("success", function () {
_this.closeConnection();
resolve();
});
dbDelete.addEventListener("error", function (e) {
_this.closeConnection();
reject(e);
});
})];
}
});
});
};
/**
* Get all the keys from the storage object as an iterable array of strings.
*/
DatabaseStorage.prototype.getKeys = function () {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.validateDbIsOpen()];
case 1:
_a.sent();
return [2 /*return*/, new Promise(function (resolve, reject) {
if (!_this.db) {
return reject(BrowserAuthError.createDatabaseNotOpenError());
}
var transaction = _this.db.transaction([_this.tableName], "readonly");
var objectStore = transaction.objectStore(_this.tableName);
var dbGetKeys = objectStore.getAllKeys();
dbGetKeys.addEventListener("success", function (e) {
var event = e;
_this.closeConnection();
resolve(event.target.result);
});
dbGetKeys.addEventListener("error", function (e) {
_this.closeConnection();
reject(e);
});
})];
}
});
});
};
/**
*
* Checks whether there is an object under the search key in the object store
*/
DatabaseStorage.prototype.containsKey = function (key) {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.validateDbIsOpen()];
case 1:
_a.sent();
return [2 /*return*/, new Promise(function (resolve, reject) {
if (!_this.db) {
return reject(BrowserAuthError.createDatabaseNotOpenError());
}
var transaction = _this.db.transaction([_this.tableName], "readonly");
var objectStore = transaction.objectStore(_this.tableName);
var dbContainsKey = objectStore.count(key);
dbContainsKey.addEventListener("success", function (e) {
var event = e;
_this.closeConnection();
resolve(event.target.result === 1);
});
dbContainsKey.addEventListener("error", function (e) {
_this.closeConnection();
reject(e);
});
})];
}
});
});
};
/**
* Deletes the MSAL database. The database is deleted rather than cleared to make it possible
* for client applications to downgrade to a previous MSAL version without worrying about forward compatibility issues
* with IndexedDB database versions.
*/
DatabaseStorage.prototype.deleteDatabase = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
// Check if database being deleted exists
if (this.db && this.dbOpen) {
this.closeConnection();
}
return [2 /*return*/, new Promise(function (resolve, reject) {
var deleteDbRequest = window.indexedDB.deleteDatabase(DB_NAME);
deleteDbRequest.addEventListener("success", function () { return resolve(true); });
deleteDbRequest.addEventListener("blocked", function () { return resolve(true); });
deleteDbRequest.addEventListener("error", function () { return reject(false); });
})];
});
});
};
return DatabaseStorage;
}());
export { DatabaseStorage };
//# sourceMappingURL=DatabaseStorage.js.map
{"version":3,"file":"DatabaseStorage.js","sources":["../../src/cache/DatabaseStorage.ts"],"sourcesContent":["/*\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\nimport { DB_NAME, DB_TABLE_NAME, DB_VERSION } from \"../utils/BrowserConstants\";\nimport { IAsyncStorage } from \"./IAsyncMemoryStorage\";\n\ninterface IDBOpenDBRequestEvent extends Event {\n target: IDBOpenDBRequest & EventTarget;\n}\n\ninterface IDBOpenOnUpgradeNeededEvent extends IDBVersionChangeEvent {\n target: IDBOpenDBRequest & EventTarget;\n}\n\ninterface IDBRequestEvent extends Event {\n target: IDBRequest & EventTarget;\n}\n\n/**\n * Storage wrapper for IndexedDB storage in browsers: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API\n */\nexport class DatabaseStorage<T> implements IAsyncStorage<T> {\n private db: IDBDatabase|undefined;\n private dbName: string;\n private tableName: string;\n private version: number;\n private dbOpen: boolean;\n\n constructor() {\n this.dbName = DB_NAME;\n this.version = DB_VERSION;\n this.tableName = DB_TABLE_NAME;\n this.dbOpen = false;\n }\n\n /**\n * Opens IndexedDB instance.\n */\n async open(): Promise<void> {\n return new Promise((resolve, reject) => {\n const openDB = window.indexedDB.open(this.dbName, this.version);\n openDB.addEventListener(\"upgradeneeded\", (e: IDBVersionChangeEvent) => {\n const event = e as IDBOpenOnUpgradeNeededEvent;\n event.target.result.createObjectStore(this.tableName);\n });\n openDB.addEventListener(\"success\", (e: Event) => {\n const event = e as IDBOpenDBRequestEvent;\n this.db = event.target.result;\n this.dbOpen = true;\n resolve();\n });\n openDB.addEventListener(\"error\", () => reject(BrowserAuthError.createDatabaseUnavailableError()));\n });\n }\n\n /**\n * Closes the connection to IndexedDB database when all pending transactions\n * complete.\n */\n closeConnection(): void {\n const db = this.db;\n if (db && this.dbOpen) {\n db.close();\n this.dbOpen = false;\n }\n }\n\n /**\n * Opens database if it's not already open\n */\n private async validateDbIsOpen(): Promise<void> {\n if (!this.dbOpen) {\n return await this.open();\n }\n }\n\n /**\n * Retrieves item from IndexedDB instance.\n * @param key \n */\n async getItem(key: string): Promise<T | null> {\n await this.validateDbIsOpen();\n return new Promise<T>((resolve, reject) => {\n // TODO: Add timeouts?\n if (!this.db) {\n return reject(BrowserAuthError.createDatabaseNotOpenError());\n }\n const transaction = this.db.transaction([this.tableName], \"readonly\");\n const objectStore = transaction.objectStore(this.tableName);\n const dbGet = objectStore.get(key);\n \n dbGet.addEventListener(\"success\", (e: Event) => {\n const event = e as IDBRequestEvent;\n this.closeConnection();\n resolve(event.target.result);\n });\n\n dbGet.addEventListener(\"error\", (e: Event) => {\n this.closeConnection();\n reject(e);\n });\n });\n }\n\n /**\n * Adds item to IndexedDB under given key\n * @param key \n * @param payload \n */\n async setItem(key: string, payload: T): Promise<void> {\n await this.validateDbIsOpen();\n return new Promise<void>((resolve: Function, reject: Function) => {\n // TODO: Add timeouts?\n if (!this.db) {\n return reject(BrowserAuthError.createDatabaseNotOpenError());\n }\n const transaction = this.db.transaction([this.tableName], \"readwrite\");\n\n const objectStore = transaction.objectStore(this.tableName);\n\n const dbPut = objectStore.put(payload, key);\n\n dbPut.addEventListener(\"success\", () => {\n this.closeConnection();\n resolve();\n });\n\n dbPut.addEventListener(\"error\", (e) => {\n this.closeConnection();\n reject(e);\n });\n });\n }\n\n /**\n * Removes item from IndexedDB under given key\n * @param key\n */\n async removeItem(key: string): Promise<void> {\n await this.validateDbIsOpen();\n return new Promise<void>((resolve: Function, reject: Function) => {\n if (!this.db) {\n return reject(BrowserAuthError.createDatabaseNotOpenError());\n }\n\n const transaction = this.db.transaction([this.tableName], \"readwrite\");\n const objectStore = transaction.objectStore(this.tableName);\n const dbDelete = objectStore.delete(key);\n\n dbDelete.addEventListener(\"success\", () => {\n this.closeConnection();\n resolve();\n });\n\n dbDelete.addEventListener(\"error\", (e) => {\n this.closeConnection();\n reject(e);\n });\n });\n }\n\n /**\n * Get all the keys from the storage object as an iterable array of strings.\n */\n async getKeys(): Promise<string[]> {\n await this.validateDbIsOpen();\n return new Promise<string[]>((resolve: Function, reject: Function) => {\n if (!this.db) {\n return reject(BrowserAuthError.createDatabaseNotOpenError());\n }\n\n const transaction = this.db.transaction([this.tableName], \"readonly\");\n const objectStore = transaction.objectStore(this.tableName);\n const dbGetKeys = objectStore.getAllKeys();\n\n dbGetKeys.addEventListener(\"success\", (e: Event) => {\n const event = e as IDBRequestEvent;\n this.closeConnection();\n resolve(event.target.result);\n });\n\n dbGetKeys.addEventListener(\"error\", (e: Event) => {\n this.closeConnection();\n reject(e);\n });\n });\n }\n\n /**\n * \n * Checks whether there is an object under the search key in the object store\n */\n async containsKey(key: string): Promise<boolean> {\n await this.validateDbIsOpen();\n\n return new Promise<boolean>((resolve: Function, reject: Function) => {\n if (!this.db) {\n return reject(BrowserAuthError.createDatabaseNotOpenError());\n }\n\n const transaction = this.db.transaction([this.tableName], \"readonly\");\n const objectStore = transaction.objectStore(this.tableName);\n const dbContainsKey = objectStore.count(key);\n\n dbContainsKey.addEventListener(\"success\", (e: Event) => {\n const event = e as IDBRequestEvent;\n this.closeConnection();\n resolve(event.target.result === 1);\n });\n\n dbContainsKey.addEventListener(\"error\", (e: Event) => {\n this.closeConnection();\n reject(e);\n });\n });\n }\n\n /**\n * Deletes the MSAL database. The database is deleted rather than cleared to make it possible\n * for client applications to downgrade to a previous MSAL version without worrying about forward compatibility issues\n * with IndexedDB database versions.\n */\n async deleteDatabase(): Promise<boolean> {\n // Check if database being deleted exists\n\n if (this.db && this.dbOpen) {\n this.closeConnection();\n }\n\n return new Promise<boolean>((resolve: Function, reject: Function) => {\n const deleteDbRequest = window.indexedDB.deleteDatabase(DB_NAME);\n deleteDbRequest.addEventListener(\"success\", () => resolve(true));\n deleteDbRequest.addEventListener(\"blocked\", () => resolve(true));\n deleteDbRequest.addEventListener(\"error\", () => reject(false));\n });\n }\n}\n"],"names":[],"mappings":"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"}
\ No newline at end of file
export interface IAsyncStorage<T> {
/**
* Get the item from the asynchronous storage object matching the given key.
* @param key
*/
getItem(key: string): Promise<T | null>;
/**
* Sets the item in the asynchronous storage object with the given key.
* @param key
* @param value
*/
setItem(key: string, value: T): Promise<void>;
/**
* Removes the item in the asynchronous storage object matching the given key.
* @param key
*/
removeItem(key: string): Promise<void>;
/**
* Get all the keys from the asynchronous storage object as an iterable array of strings.
*/
getKeys(): Promise<string[]>;
/**
* Returns true or false if the given key is present in the cache.
* @param key
*/
containsKey(key: string): Promise<boolean>;
}
//# sourceMappingURL=IAsyncMemoryStorage.d.ts.map
\ No newline at end of file
{"version":3,"file":"IAsyncMemoryStorage.d.ts","sourceRoot":"","sources":["../../src/cache/IAsyncMemoryStorage.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa,CAAC,CAAC;IAC5B;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAExC;;;;OAIG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;;OAGG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvC;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE7B;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C"}
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment