From aeeeac862e2fcd5d441bc196545f7a8a70f0a0e2 Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Thu, 20 May 2021 16:15:57 +0300 Subject: [PATCH 01/26] Change files --- ...-3150477f-929f-4013-8176-77b1a63f8912.json | 7 ++ ...-f63abd0d-4eab-4485-ba86-ca75799c6065.json | 7 ++ lib/msal-common/src/authority/Authority.ts | 36 ++++++++- .../src/authority/RegionDiscovery.ts | 15 +++- .../src/authority/RegionDiscoveryMetadata.ts | 15 ++++ .../server/ServerTelemetryManager.ts | 78 ++++++++++++++++++- lib/msal-common/src/utils/Constants.ts | 21 +++++ lib/msal-node/src/client/ClientApplication.ts | 2 + 8 files changed, 174 insertions(+), 7 deletions(-) create mode 100644 change/@azure-msal-common-3150477f-929f-4013-8176-77b1a63f8912.json create mode 100644 change/@azure-msal-node-f63abd0d-4eab-4485-ba86-ca75799c6065.json create mode 100644 lib/msal-common/src/authority/RegionDiscoveryMetadata.ts diff --git a/change/@azure-msal-common-3150477f-929f-4013-8176-77b1a63f8912.json b/change/@azure-msal-common-3150477f-929f-4013-8176-77b1a63f8912.json new file mode 100644 index 0000000000..c7028f0560 --- /dev/null +++ b/change/@azure-msal-common-3150477f-929f-4013-8176-77b1a63f8912.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "feat: add regional authority telemetry", + "packageName": "@azure/msal-common", + "email": "samuelkamau@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@azure-msal-node-f63abd0d-4eab-4485-ba86-ca75799c6065.json b/change/@azure-msal-node-f63abd0d-4eab-4485-ba86-ca75799c6065.json new file mode 100644 index 0000000000..189b2b5b6e --- /dev/null +++ b/change/@azure-msal-node-f63abd0d-4eab-4485-ba86-ca75799c6065.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "feat: add regional authority telemetry", + "packageName": "@azure/msal-node", + "email": "samuelkamau@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/lib/msal-common/src/authority/Authority.ts b/lib/msal-common/src/authority/Authority.ts index 86c23d2afa..78a98ff959 100644 --- a/lib/msal-common/src/authority/Authority.ts +++ b/lib/msal-common/src/authority/Authority.ts @@ -9,7 +9,7 @@ import { UrlString } from "../url/UrlString"; import { IUri } from "../url/IUri"; import { ClientAuthError } from "../error/ClientAuthError"; import { INetworkModule } from "../network/INetworkModule"; -import { AuthorityMetadataSource, Constants } from "../utils/Constants"; +import { AuthorityMetadataSource, Constants, RegionDiscoveryOutcomes } from "../utils/Constants"; import { ClientConfigurationError } from "../error/ClientConfigurationError"; import { ProtocolMode } from "./ProtocolMode"; import { ICacheManager } from "../cache/interface/ICacheManager"; @@ -18,6 +18,7 @@ import { AuthorityOptions } from "./AuthorityOptions"; import { CloudInstanceDiscoveryResponse, isCloudInstanceDiscoveryResponse } from "./CloudInstanceDiscoveryResponse"; import { CloudDiscoveryMetadata } from "./CloudDiscoveryMetadata"; import { RegionDiscovery } from "./RegionDiscovery"; +import { RegionDiscoveryMetadata } from "./RegionDiscoveryMetadata"; /** * The authority class validates the authority URIs used by the user, and retrieves the OpenID Configuration Data from the @@ -39,6 +40,8 @@ export class Authority { private metadata: AuthorityMetadataEntity; // Region discovery service private regionDiscovery: RegionDiscovery; + // Region discovery metadata + private regionDiscoveryMetadata: RegionDiscoveryMetadata; constructor(authority: string, networkInterface: INetworkModule, cacheManager: ICacheManager, authorityOptions: AuthorityOptions) { this.canonicalAuthority = authority; @@ -47,6 +50,7 @@ export class Authority { this.cacheManager = cacheManager; this.authorityOptions = authorityOptions; this.regionDiscovery = new RegionDiscovery(networkInterface); + this.regionDiscoveryMetadata = { region_used: undefined, region_source: undefined, region_outcome: undefined }; } // See above for AuthorityType @@ -172,6 +176,15 @@ export class Authority { } } + /** + * Region used if any + * + * @returns string + */ + public getRegionDiscoveryMetadata(): RegionDiscoveryMetadata { + return this.regionDiscoveryMetadata; + } + /** * Replaces tenant in url path with current tenant. Defaults to common. * @param urlString @@ -263,13 +276,32 @@ export class Authority { if (metadata) { // If the user prefers to use an azure region replace the global endpoints with regional information. if (this.authorityOptions.azureRegionConfiguration?.azureRegion) { - const autodetectedRegionName = await this.regionDiscovery.detectRegion(this.authorityOptions.azureRegionConfiguration.environmentRegion); + const autodetectedRegionName = await this.regionDiscovery.detectRegion(this.authorityOptions.azureRegionConfiguration.environmentRegion, this.regionDiscoveryMetadata); const azureRegion = this.authorityOptions.azureRegionConfiguration.azureRegion === Constants.AZURE_REGION_AUTO_DISCOVER_FLAG ? autodetectedRegionName : this.authorityOptions.azureRegionConfiguration.azureRegion; + if (this.authorityOptions.azureRegionConfiguration.azureRegion === Constants.AZURE_REGION_AUTO_DISCOVER_FLAG) { + if (autodetectedRegionName) { + this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_SUCCESSFUL; + } else { + this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_FAILED; + } + } else { + if (autodetectedRegionName) { + if (this.authorityOptions.azureRegionConfiguration.azureRegion === autodetectedRegionName) { + this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.CONFIGURED_MATCHES_DETECTED; + } else { + this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.CONFIGURED_NOT_DETECTED; + } + } else { + this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.CONFIGURED_NO_AUTO_DETECTION; + } + } + if (azureRegion) { + this.regionDiscoveryMetadata.region_used = azureRegion; metadata = Authority.replaceWithRegionalInformation(metadata, azureRegion); } } diff --git a/lib/msal-common/src/authority/RegionDiscovery.ts b/lib/msal-common/src/authority/RegionDiscovery.ts index b695d343af..71d3b5a6d2 100644 --- a/lib/msal-common/src/authority/RegionDiscovery.ts +++ b/lib/msal-common/src/authority/RegionDiscovery.ts @@ -6,7 +6,8 @@ import { INetworkModule } from "../network/INetworkModule"; import { NetworkResponse } from "../network/NetworkManager"; import { IMDSBadResponse } from "../response/IMDSBadResponse"; -import { Constants, ResponseCodes } from "../utils/Constants"; +import { Constants, RegionDiscoverySources, ResponseCodes } from "../utils/Constants"; +import { RegionDiscoveryMetadata } from "./RegionDiscoveryMetadata"; export class RegionDiscovery { // Network interface to make requests with. @@ -23,7 +24,7 @@ export class RegionDiscovery { * * @returns Promise */ - public async detectRegion(environmentRegion: string | undefined): Promise { + public async detectRegion(environmentRegion: string | undefined, regionDiscoveryMetadata: RegionDiscoveryMetadata): Promise { // Initialize auto detected region with the region from the envrionment let autodetectedRegionName = environmentRegion; @@ -38,6 +39,7 @@ export class RegionDiscovery { if (response.status === ResponseCodes.httpBadRequest) { const latestIMDSVersion = await this.getCurrentVersion(); if (!latestIMDSVersion) { + regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION; return null; } @@ -45,12 +47,19 @@ export class RegionDiscovery { if (response.status === ResponseCodes.httpSuccess) { autodetectedRegionName = response.body; } - } + } + + if (autodetectedRegionName) regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS; } catch(e) { + regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION; return null; } + } else { + regionDiscoveryMetadata.region_source = RegionDiscoverySources.ENVIRONMENT_VARIABLE; } + if (!autodetectedRegionName) regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION; + return autodetectedRegionName || null; } diff --git a/lib/msal-common/src/authority/RegionDiscoveryMetadata.ts b/lib/msal-common/src/authority/RegionDiscoveryMetadata.ts new file mode 100644 index 0000000000..7c5dad893e --- /dev/null +++ b/lib/msal-common/src/authority/RegionDiscoveryMetadata.ts @@ -0,0 +1,15 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +import { + RegionDiscoveryOutcomes, + RegionDiscoverySources +} from "../utils/Constants"; + +export type RegionDiscoveryMetadata = { + region_used?: string; + region_source?: RegionDiscoverySources; + region_outcome?: RegionDiscoveryOutcomes; +}; diff --git a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts index 4307a7a570..f8ca711c40 100644 --- a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts +++ b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts @@ -3,12 +3,13 @@ * Licensed under the MIT License. */ -import { SERVER_TELEM_CONSTANTS, Separators, Constants } from "../../utils/Constants"; +import { SERVER_TELEM_CONSTANTS, Separators, Constants, RegionDiscoverySources, RegionDiscoveryOutcomes } from "../../utils/Constants"; import { CacheManager } from "../../cache/CacheManager"; import { AuthError } from "../../error/AuthError"; import { ServerTelemetryRequest } from "./ServerTelemetryRequest"; import { ServerTelemetryEntity } from "../../cache/entities/ServerTelemetryEntity"; import { StringUtils } from "../../utils/StringUtils"; +import { RegionDiscoveryMetadata } from "../../authority/RegionDiscoveryMetadata"; export class ServerTelemetryManager { private cacheManager: CacheManager; @@ -18,6 +19,9 @@ export class ServerTelemetryManager { private telemetryCacheKey: string; private wrapperSKU: String; private wrapperVer: String; + private regionUsed: string | undefined; + private regionSource: RegionDiscoverySources | undefined; + private regionOutcome: RegionDiscoveryOutcomes | undefined; constructor(telemetryRequest: ServerTelemetryRequest, cacheManager: CacheManager) { this.cacheManager = cacheManager; @@ -37,8 +41,10 @@ export class ServerTelemetryManager { const forceRefreshInt = this.forceRefresh ? 1 : 0; const request = `${this.apiId}${SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR}${forceRefreshInt}`; const platformFields = [this.wrapperSKU, this.wrapperVer].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR); + const regionDiscoveryFields = this.getRegionDiscoveryFields(); + const requestWithRegionDiscoveryFields = [request, regionDiscoveryFields].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR); - return [SERVER_TELEM_CONSTANTS.SCHEMA_VERSION, request, platformFields].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR); + return [SERVER_TELEM_CONSTANTS.SCHEMA_VERSION, requestWithRegionDiscoveryFields, platformFields].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR); } /** @@ -158,4 +164,72 @@ export class ServerTelemetryManager { return maxErrors; } + + /** + * Get the region discovery fields + * + * @returns string + */ + getRegionDiscoveryFields(): string { + const regionDiscoveryFields: string[] = []; + + regionDiscoveryFields.push(this.regionUsed ? this.regionUsed : ""); + regionDiscoveryFields.push(this.getRegionSourceValue(this.regionSource)); + regionDiscoveryFields.push(this.getRegionOutcomeValue(this.regionOutcome)); + + return regionDiscoveryFields.join(","); + } + + /** + * Get the header value for the region source + * @param regionSource + * @returns string + */ + getRegionSourceValue(regionSource: RegionDiscoverySources | undefined): string { + if (!regionSource) return ""; + + switch (regionSource) { + case RegionDiscoverySources.FAILED_AUTO_DETECTION: + return "1"; + case RegionDiscoverySources.INTERNAL_CACHE: + return "2"; + case RegionDiscoverySources.ENVIRONMENT_VARIABLE: + return "3"; + case RegionDiscoverySources.IMDS: + return "4"; + default: + return "0"; + } + } + + getRegionOutcomeValue(regionOutcome: RegionDiscoveryOutcomes | undefined): string { + if (!regionOutcome) return ""; + + switch (regionOutcome) { + case RegionDiscoveryOutcomes.CONFIGURED_MATCHES_DETECTED: + return "1"; + case RegionDiscoveryOutcomes.CONFIGURED_NO_AUTO_DETECTION: + return "2"; + case RegionDiscoveryOutcomes.CONFIGURED_NOT_DETECTED: + return "3"; + case RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_SUCCESSFUL: + return "4"; + case RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_FAILED: + return "5"; + default: + return "0"; + } + } + + /** + * Update the region discovery metadata + * + * @param regionDiscoveryMetadata + * @returns void + */ + updateRegionDiscoveryMetadata(regionDiscoveryMetadata: RegionDiscoveryMetadata): void { + this.regionUsed = regionDiscoveryMetadata.region_used; + this.regionSource = regionDiscoveryMetadata.region_source; + this.regionOutcome = regionDiscoveryMetadata.region_outcome; + } } diff --git a/lib/msal-common/src/utils/Constants.ts b/lib/msal-common/src/utils/Constants.ts index 766b632457..91b413383e 100644 --- a/lib/msal-common/src/utils/Constants.ts +++ b/lib/msal-common/src/utils/Constants.ts @@ -349,3 +349,24 @@ export enum ResponseCodes { httpSuccess = 200, httpBadRequest = 400 } + +/** + * Region Discovery Sources + */ +export enum RegionDiscoverySources { + FAILED_AUTO_DETECTION = "FAILED AUTO DETECTION", + INTERNAL_CACHE = "INTERNAL CACHE", + ENVIRONMENT_VARIABLE = "ENVIRONMENT VARIABLE", + IMDS = "IMDS", +} + +/** + * Region Discovery Outcomes + */ +export enum RegionDiscoveryOutcomes { + CONFIGURED_MATCHES_DETECTED = "Configured by developer and matches auto-detected", + CONFIGURED_NO_AUTO_DETECTION = "Configured by developer, cannot be auto-detected", + CONFIGURED_NOT_DETECTED = "Configured by developer, does not match auto-detected", + AUTO_DETECTION_REQUESTED_SUCCESSFUL = "Auto-detect requested and auto-detection worked", + AUTO_DETECTION_REQUESTED_FAILED = "Auto-detect requested and failed, fallback to global" +} diff --git a/lib/msal-node/src/client/ClientApplication.ts b/lib/msal-node/src/client/ClientApplication.ts index c3d42567e9..38adf4b33b 100644 --- a/lib/msal-node/src/client/ClientApplication.ts +++ b/lib/msal-node/src/client/ClientApplication.ts @@ -240,6 +240,8 @@ export abstract class ClientApplication { const discoveredAuthority = await this.createAuthority(authority, azureRegionConfiguration); + serverTelemetryManager?.updateRegionDiscoveryMetadata(discoveredAuthority.getRegionDiscoveryMetadata()); + return { authOptions: { clientId: this.config.auth.clientId, From ddab044e0b54f977fbfcf1e1a4afb521c0668ca9 Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Thu, 20 May 2021 17:49:01 +0300 Subject: [PATCH 02/26] feat: update the confidential and public client test with region discovery metadata --- .../test/client/ConfidentialClientApplication.spec.ts | 3 +++ lib/msal-node/test/client/PublicClientApplication.spec.ts | 3 +++ 2 files changed, 6 insertions(+) diff --git a/lib/msal-node/test/client/ConfidentialClientApplication.spec.ts b/lib/msal-node/test/client/ConfidentialClientApplication.spec.ts index 6282897d5d..a2c61dfda7 100644 --- a/lib/msal-node/test/client/ConfidentialClientApplication.spec.ts +++ b/lib/msal-node/test/client/ConfidentialClientApplication.spec.ts @@ -16,6 +16,9 @@ mocked(StringUtils.isEmpty).mockImplementation((str) => { describe('ConfidentialClientApplication', () => { const authority: Authority = { + getRegionDiscoveryMetadata: () => { + return { region_used: undefined, region_source: undefined, region_outcome: undefined }; + }, resolveEndpointsAsync: () => { return new Promise(resolve => { resolve(); diff --git a/lib/msal-node/test/client/PublicClientApplication.spec.ts b/lib/msal-node/test/client/PublicClientApplication.spec.ts index 9826b07e27..af027d0eb1 100644 --- a/lib/msal-node/test/client/PublicClientApplication.spec.ts +++ b/lib/msal-node/test/client/PublicClientApplication.spec.ts @@ -25,6 +25,9 @@ jest.mock('@azure/msal-common'); describe('PublicClientApplication', () => { const authority: Authority = { + getRegionDiscoveryMetadata: () => { + return { region_used: undefined, region_source: undefined, region_outcome: undefined }; + }, resolveEndpointsAsync: () => { return new Promise(resolve => { resolve(); From 962bf0c3a2f43af01eab35a53f231c878d822cbe Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Thu, 20 May 2021 17:57:37 +0300 Subject: [PATCH 03/26] fix: update the server telemetry manager test --- lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts b/lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts index d3f313387f..230edc1c8a 100644 --- a/lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts +++ b/lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts @@ -113,14 +113,14 @@ describe("ServerTelemetryManager.ts", () => { it("Adds telemetry headers with current request", () => { const telemetryManager = new ServerTelemetryManager(testTelemetryPayload, testCacheManager); const currHeaderVal = telemetryManager.generateCurrentRequestHeaderValue(); - expect(currHeaderVal).to.eq(`2|${testApiCode},0|,`); + expect(currHeaderVal).to.eq(`2|${testApiCode},0,,,|,`); }); it("Adds telemetry headers with current request with forceRefresh true", () => { const testPayload: ServerTelemetryRequest = {...testTelemetryPayload, forceRefresh: true }; const telemetryManager = new ServerTelemetryManager(testPayload, testCacheManager); const currHeaderVal = telemetryManager.generateCurrentRequestHeaderValue(); - expect(currHeaderVal).to.eq(`2|${testApiCode},1|,`); + expect(currHeaderVal).to.eq(`2|${testApiCode},1,,,|,`); }); it("Adds telemetry headers with last failed request", () => { From 67697aca289693f683126defe2f6f9b355e89286 Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Thu, 20 May 2021 20:01:29 +0300 Subject: [PATCH 04/26] fix: update sever telemetry manager test with jest command --- lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts b/lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts index 2497ddb10c..e20f88868a 100644 --- a/lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts +++ b/lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts @@ -111,14 +111,14 @@ describe("ServerTelemetryManager.ts", () => { it("Adds telemetry headers with current request", () => { const telemetryManager = new ServerTelemetryManager(testTelemetryPayload, testCacheManager); const currHeaderVal = telemetryManager.generateCurrentRequestHeaderValue(); - expect(currHeaderVal).to.eq(`2|${testApiCode},0,,,|,`); + expect(currHeaderVal).toEqual(`2|${testApiCode},0,,,|,`); }); it("Adds telemetry headers with current request with forceRefresh true", () => { const testPayload: ServerTelemetryRequest = {...testTelemetryPayload, forceRefresh: true }; const telemetryManager = new ServerTelemetryManager(testPayload, testCacheManager); const currHeaderVal = telemetryManager.generateCurrentRequestHeaderValue(); - expect(currHeaderVal).to.eq(`2|${testApiCode},1,,,|,`); + expect(currHeaderVal).toEqual(`2|${testApiCode},1,,,|,`); }); it("Adds telemetry headers with last failed request", () => { From 312977da48ecc551c113e1e7443f1192f3599692 Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Wed, 26 May 2021 17:32:35 +0300 Subject: [PATCH 05/26] feat: upgraded the telemetry manager --- .../src/client/ClientCredentialClient.ts | 11 +++- .../server/ServerTelemetryManager.ts | 65 +++++++++++++++++-- lib/msal-common/src/utils/Constants.ts | 2 +- .../client-credentials/index.js | 8 +-- 4 files changed, 74 insertions(+), 12 deletions(-) diff --git a/lib/msal-common/src/client/ClientCredentialClient.ts b/lib/msal-common/src/client/ClientCredentialClient.ts index d2bba1cedc..96cd64e153 100644 --- a/lib/msal-common/src/client/ClientCredentialClient.ts +++ b/lib/msal-common/src/client/ClientCredentialClient.ts @@ -54,9 +54,16 @@ export class ClientCredentialClient extends BaseClient { * looks up cache if the tokens are cached already */ private async getCachedAuthenticationResult(request: CommonClientCredentialRequest): Promise { + const cachedAccessToken = this.readAccessTokenFromCache(); - if (!cachedAccessToken || - TimeUtils.isTokenExpired(cachedAccessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)) { + + if (!cachedAccessToken) { + this.serverTelemetryManager?.recordCachedAtDoesNotExist(); + return null; + } + + if (TimeUtils.isTokenExpired(cachedAccessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)) { + this.serverTelemetryManager?.recordCachedAtExpired(); return null; } diff --git a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts index f8ca711c40..cf4ec0d233 100644 --- a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts +++ b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts @@ -22,6 +22,10 @@ export class ServerTelemetryManager { private regionUsed: string | undefined; private regionSource: RegionDiscoverySources | undefined; private regionOutcome: RegionDiscoveryOutcomes | undefined; + private noCacheHit: boolean; + private cachedAtDoesNotExist: boolean; + private cachedAtIsExpired: boolean; + private cachedAtShouldBeRefreshed: boolean; constructor(telemetryRequest: ServerTelemetryRequest, cacheManager: CacheManager) { this.cacheManager = cacheManager; @@ -38,13 +42,17 @@ export class ServerTelemetryManager { * API to add MSER Telemetry to request */ generateCurrentRequestHeaderValue(): string { - const forceRefreshInt = this.forceRefresh ? 1 : 0; - const request = `${this.apiId}${SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR}${forceRefreshInt}`; + const cacheInfo = this.getCacheInfoValue(); + const request = `${this.apiId}${SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR}${cacheInfo}`; const platformFields = [this.wrapperSKU, this.wrapperVer].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR); const regionDiscoveryFields = this.getRegionDiscoveryFields(); const requestWithRegionDiscoveryFields = [request, regionDiscoveryFields].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR); - return [SERVER_TELEM_CONSTANTS.SCHEMA_VERSION, requestWithRegionDiscoveryFields, platformFields].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR); + const serverTelemetryHeaders = [SERVER_TELEM_CONSTANTS.SCHEMA_VERSION, requestWithRegionDiscoveryFields, platformFields].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR); + // eslint-disable-next-line no-console + console.log(serverTelemetryHeaders); + + return serverTelemetryHeaders; } /** @@ -219,7 +227,25 @@ export class ServerTelemetryManager { default: return "0"; } - } + } + + getCacheInfoValue(): string { + if (this.noCacheHit) { + return "0"; + } else if (this.forceRefresh) { + return "1"; + } else if (this.cachedAtDoesNotExist) { + return "2"; + } else if (this.cachedAtIsExpired) { + return "3"; + } else if (this.cachedAtShouldBeRefreshed) { + return "4"; + } else { + return "0"; + } + + return "0"; + } /** * Update the region discovery metadata @@ -231,5 +257,34 @@ export class ServerTelemetryManager { this.regionUsed = regionDiscoveryMetadata.region_used; this.regionSource = regionDiscoveryMetadata.region_source; this.regionOutcome = regionDiscoveryMetadata.region_outcome; - } + } + + /** + * Set no cache hit to be true + */ + recordNoCacheHit(): void { + this.noCacheHit = true; + } + + /** + * Set that no cached AT exists + */ + recordCachedAtDoesNotExist(): void { + this.cachedAtDoesNotExist = true; + } + + /** + * Set that the cached AT us expired + */ + recordCachedAtExpired(): void { + this.cachedAtIsExpired = true; + } + + /** + * TODO: Implement the refresh_in logic + * Set that the cached AT requires to be refreshed + */ + recordCachedAtShouldBeRefreshed(): void { + this.cachedAtShouldBeRefreshed = true; + } } diff --git a/lib/msal-common/src/utils/Constants.ts b/lib/msal-common/src/utils/Constants.ts index 91b413383e..74db8b85d4 100644 --- a/lib/msal-common/src/utils/Constants.ts +++ b/lib/msal-common/src/utils/Constants.ts @@ -295,7 +295,7 @@ export enum AuthorityMetadataSource { } export const SERVER_TELEM_CONSTANTS = { - SCHEMA_VERSION: 2, + SCHEMA_VERSION: 5, MAX_CUR_HEADER_BYTES: 80, // ESTS limit is 100B, set to 80 to provide a 20B buffer MAX_LAST_HEADER_BYTES: 330, // ESTS limit is 350B, set to 330 to provide a 20B buffer, MAX_CACHED_ERRORS: 50, // Limit the number of errors that can be stored to prevent uncontrolled size gains diff --git a/samples/msal-node-samples/client-credentials/index.js b/samples/msal-node-samples/client-credentials/index.js index bcff1abb9d..def8d38de0 100644 --- a/samples/msal-node-samples/client-credentials/index.js +++ b/samples/msal-node-samples/client-credentials/index.js @@ -7,9 +7,9 @@ var msal = require('@azure/msal-node'); const config = { auth: { - clientId: "", - authority: "https://login.microsoftonline.com/", - clientSecret: "", + clientId: "48f55727-da76-4dbb-9908-d9335f239e20", + authority: "https://login.microsoftonline.com/eefab79a-7793-4852-be01-105ecb6f6d4e", + clientSecret: "epFuS.3-QDTU3DGI-QQs8UwQx-34jy.u9y", }, system: {         loggerOptions: { @@ -30,7 +30,7 @@ const cca = new msal.ConfidentialClientApplication(config); const clientCredentialRequest = { scopes: ["https://graph.microsoft.com/.default"], azureRegion: "westus2", - skipCache: true, + skipCache: false, }; cca.acquireTokenByClientCredential(clientCredentialRequest).then((response) => { From 01b95a8560dd4e4e57ccd1a677f342ca5acaab0e Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Wed, 26 May 2021 17:34:05 +0300 Subject: [PATCH 06/26] fix: client credentials sample --- samples/msal-node-samples/client-credentials/index.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/samples/msal-node-samples/client-credentials/index.js b/samples/msal-node-samples/client-credentials/index.js index def8d38de0..bcff1abb9d 100644 --- a/samples/msal-node-samples/client-credentials/index.js +++ b/samples/msal-node-samples/client-credentials/index.js @@ -7,9 +7,9 @@ var msal = require('@azure/msal-node'); const config = { auth: { - clientId: "48f55727-da76-4dbb-9908-d9335f239e20", - authority: "https://login.microsoftonline.com/eefab79a-7793-4852-be01-105ecb6f6d4e", - clientSecret: "epFuS.3-QDTU3DGI-QQs8UwQx-34jy.u9y", + clientId: "", + authority: "https://login.microsoftonline.com/", + clientSecret: "", }, system: {         loggerOptions: { @@ -30,7 +30,7 @@ const cca = new msal.ConfidentialClientApplication(config); const clientCredentialRequest = { scopes: ["https://graph.microsoft.com/.default"], azureRegion: "westus2", - skipCache: false, + skipCache: true, }; cca.acquireTokenByClientCredential(clientCredentialRequest).then((response) => { From 91f9633e67d754983257aadf1a4cbb6358360b3e Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Wed, 2 Jun 2021 19:44:08 +0300 Subject: [PATCH 07/26] feat: refactor the telemetry implementation --- lib/msal-common/src/authority/Authority.ts | 27 ++------ .../src/client/ClientCredentialClient.ts | 6 +- .../src/client/OnBehalfOfClient.ts | 8 ++- .../src/client/SilentFlowClient.ts | 14 +++- .../server/ServerTelemetryManager.ts | 66 ++++++------------- lib/msal-common/src/utils/Constants.ts | 7 ++ lib/msal-node/src/client/ClientApplication.ts | 2 +- 7 files changed, 56 insertions(+), 74 deletions(-) diff --git a/lib/msal-common/src/authority/Authority.ts b/lib/msal-common/src/authority/Authority.ts index 78a98ff959..15961a85f1 100644 --- a/lib/msal-common/src/authority/Authority.ts +++ b/lib/msal-common/src/authority/Authority.ts @@ -41,7 +41,7 @@ export class Authority { // Region discovery service private regionDiscovery: RegionDiscovery; // Region discovery metadata - private regionDiscoveryMetadata: RegionDiscoveryMetadata; + public regionDiscoveryMetadata: RegionDiscoveryMetadata; constructor(authority: string, networkInterface: INetworkModule, cacheManager: ICacheManager, authorityOptions: AuthorityOptions) { this.canonicalAuthority = authority; @@ -176,15 +176,6 @@ export class Authority { } } - /** - * Region used if any - * - * @returns string - */ - public getRegionDiscoveryMetadata(): RegionDiscoveryMetadata { - return this.regionDiscoveryMetadata; - } - /** * Replaces tenant in url path with current tenant. Defaults to common. * @param urlString @@ -283,18 +274,14 @@ export class Authority { : this.authorityOptions.azureRegionConfiguration.azureRegion; if (this.authorityOptions.azureRegionConfiguration.azureRegion === Constants.AZURE_REGION_AUTO_DISCOVER_FLAG) { - if (autodetectedRegionName) { - this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_SUCCESSFUL; - } else { - this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_FAILED; - } + this.regionDiscoveryMetadata.region_outcome = autodetectedRegionName ? + RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_SUCCESSFUL : + RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_FAILED; } else { if (autodetectedRegionName) { - if (this.authorityOptions.azureRegionConfiguration.azureRegion === autodetectedRegionName) { - this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.CONFIGURED_MATCHES_DETECTED; - } else { - this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.CONFIGURED_NOT_DETECTED; - } + this.regionDiscoveryMetadata.region_outcome = (this.authorityOptions.azureRegionConfiguration.azureRegion === autodetectedRegionName) ? + RegionDiscoveryOutcomes.CONFIGURED_MATCHES_DETECTED : + RegionDiscoveryOutcomes.CONFIGURED_NOT_DETECTED; } else { this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.CONFIGURED_NO_AUTO_DETECTION; } diff --git a/lib/msal-common/src/client/ClientCredentialClient.ts b/lib/msal-common/src/client/ClientCredentialClient.ts index 96cd64e153..36c52872b2 100644 --- a/lib/msal-common/src/client/ClientCredentialClient.ts +++ b/lib/msal-common/src/client/ClientCredentialClient.ts @@ -8,7 +8,7 @@ import { BaseClient } from "./BaseClient"; import { Authority } from "../authority/Authority"; import { RequestParameterBuilder } from "../request/RequestParameterBuilder"; import { ScopeSet } from "../request/ScopeSet"; -import { GrantType , CredentialType } from "../utils/Constants"; +import { GrantType , CredentialType, CacheOutcome } from "../utils/Constants"; import { ResponseHandler } from "../response/ResponseHandler"; import { AuthenticationResult } from "../response/AuthenticationResult"; import { CommonClientCredentialRequest } from "../request/CommonClientCredentialRequest"; @@ -58,12 +58,12 @@ export class ClientCredentialClient extends BaseClient { const cachedAccessToken = this.readAccessTokenFromCache(); if (!cachedAccessToken) { - this.serverTelemetryManager?.recordCachedAtDoesNotExist(); + this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.NO_CACHED_ACCESS_TOKEN); return null; } if (TimeUtils.isTokenExpired(cachedAccessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)) { - this.serverTelemetryManager?.recordCachedAtExpired(); + this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED); return null; } diff --git a/lib/msal-common/src/client/OnBehalfOfClient.ts b/lib/msal-common/src/client/OnBehalfOfClient.ts index 78023d67ab..055ac69124 100644 --- a/lib/msal-common/src/client/OnBehalfOfClient.ts +++ b/lib/msal-common/src/client/OnBehalfOfClient.ts @@ -8,7 +8,7 @@ import { BaseClient } from "./BaseClient"; import { Authority } from "../authority/Authority"; import { RequestParameterBuilder } from "../request/RequestParameterBuilder"; import { ScopeSet } from "../request/ScopeSet"; -import { GrantType, AADServerParamKeys , CredentialType, Constants } from "../utils/Constants"; +import { GrantType, AADServerParamKeys , CredentialType, Constants, CacheOutcome } from "../utils/Constants"; import { ResponseHandler } from "../response/ResponseHandler"; import { AuthenticationResult } from "../response/AuthenticationResult"; import { CommonOnBehalfOfRequest } from "../request/CommonOnBehalfOfRequest"; @@ -60,6 +60,12 @@ export class OnBehalfOfClient extends BaseClient { const cachedAccessToken = this.readAccessTokenFromCache(request); if (!cachedAccessToken || TimeUtils.isTokenExpired(cachedAccessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)) { + + // Update the server telemetry outcome + !cachedAccessToken ? + this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.NO_CACHED_ACCESS_TOKEN) : + this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED); + return null; } diff --git a/lib/msal-common/src/client/SilentFlowClient.ts b/lib/msal-common/src/client/SilentFlowClient.ts index 0463e3a4f1..82161fb3e2 100644 --- a/lib/msal-common/src/client/SilentFlowClient.ts +++ b/lib/msal-common/src/client/SilentFlowClient.ts @@ -15,7 +15,7 @@ import { ClientAuthError, ClientAuthErrorMessage } from "../error/ClientAuthErro import { ClientConfigurationError } from "../error/ClientConfigurationError"; import { ResponseHandler } from "../response/ResponseHandler"; import { CacheRecord } from "../cache/entities/CacheRecord"; -import { AuthenticationScheme } from "../utils/Constants"; +import { AuthenticationScheme, CacheOutcome } from "../utils/Constants"; import { StringUtils } from "../utils/StringUtils"; export class SilentFlowClient extends BaseClient { @@ -60,12 +60,22 @@ export class SilentFlowClient extends BaseClient { const environment = request.authority || this.authority.getPreferredCache(); const authScheme = request.authenticationScheme || AuthenticationScheme.BEARER; const cacheRecord = this.cacheManager.readCacheRecord(request.account, this.config.authOptions.clientId, requestScopes, environment, authScheme); - + if (request.forceRefresh || !StringUtils.isEmptyObj(request.claims) || !cacheRecord.accessToken || TimeUtils.isTokenExpired(cacheRecord.accessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds) || (cacheRecord.accessToken.refreshOn && TimeUtils.isTokenExpired(cacheRecord.accessToken.refreshOn, 0))) { + + // Update server telemetry manager with the cache outcome + if (!cacheRecord.accessToken) { + this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.NO_CACHED_ACCESS_TOKEN); + } else if (TimeUtils.isTokenExpired(cacheRecord.accessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)) { + this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED); + } else if (cacheRecord.accessToken.refreshOn && TimeUtils.isTokenExpired(cacheRecord.accessToken.refreshOn, 0)) { + this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.REFRESH_CACHED_ACCESS_TOKEN); + } + // Must refresh due to request parameters, or expired or non-existent access_token throw ClientAuthError.createRefreshRequiredError(); } diff --git a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts index cf4ec0d233..6747f07222 100644 --- a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts +++ b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. */ -import { SERVER_TELEM_CONSTANTS, Separators, Constants, RegionDiscoverySources, RegionDiscoveryOutcomes } from "../../utils/Constants"; +import { SERVER_TELEM_CONSTANTS, Separators, CacheOutcome, Constants, RegionDiscoverySources, RegionDiscoveryOutcomes } from "../../utils/Constants"; import { CacheManager } from "../../cache/CacheManager"; import { AuthError } from "../../error/AuthError"; import { ServerTelemetryRequest } from "./ServerTelemetryRequest"; @@ -22,10 +22,7 @@ export class ServerTelemetryManager { private regionUsed: string | undefined; private regionSource: RegionDiscoverySources | undefined; private regionOutcome: RegionDiscoveryOutcomes | undefined; - private noCacheHit: boolean; - private cachedAtDoesNotExist: boolean; - private cachedAtIsExpired: boolean; - private cachedAtShouldBeRefreshed: boolean; + private cacheOutcome: CacheOutcome = CacheOutcome.NO_CACHE_HIT; constructor(telemetryRequest: ServerTelemetryRequest, cacheManager: CacheManager) { this.cacheManager = cacheManager; @@ -48,11 +45,7 @@ export class ServerTelemetryManager { const regionDiscoveryFields = this.getRegionDiscoveryFields(); const requestWithRegionDiscoveryFields = [request, regionDiscoveryFields].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR); - const serverTelemetryHeaders = [SERVER_TELEM_CONSTANTS.SCHEMA_VERSION, requestWithRegionDiscoveryFields, platformFields].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR); - // eslint-disable-next-line no-console - console.log(serverTelemetryHeaders); - - return serverTelemetryHeaders; + return [SERVER_TELEM_CONSTANTS.SCHEMA_VERSION, requestWithRegionDiscoveryFields, platformFields].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR); } /** @@ -230,21 +223,22 @@ export class ServerTelemetryManager { } getCacheInfoValue(): string { - if (this.noCacheHit) { - return "0"; - } else if (this.forceRefresh) { + if (this.forceRefresh) { return "1"; - } else if (this.cachedAtDoesNotExist) { - return "2"; - } else if (this.cachedAtIsExpired) { - return "3"; - } else if (this.cachedAtShouldBeRefreshed) { - return "4"; - } else { - return "0"; } - return "0"; + switch(this.cacheOutcome) { + case CacheOutcome.NO_CACHE_HIT: + return "0"; + case CacheOutcome.NO_CACHED_ACCESS_TOKEN: + return "2"; + case CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED: + return "3"; + case CacheOutcome.REFRESH_CACHED_ACCESS_TOKEN: + return "4"; + default: + return "0"; + } } /** @@ -258,33 +252,11 @@ export class ServerTelemetryManager { this.regionSource = regionDiscoveryMetadata.region_source; this.regionOutcome = regionDiscoveryMetadata.region_outcome; } - - /** - * Set no cache hit to be true - */ - recordNoCacheHit(): void { - this.noCacheHit = true; - } - - /** - * Set that no cached AT exists - */ - recordCachedAtDoesNotExist(): void { - this.cachedAtDoesNotExist = true; - } - - /** - * Set that the cached AT us expired - */ - recordCachedAtExpired(): void { - this.cachedAtIsExpired = true; - } /** - * TODO: Implement the refresh_in logic - * Set that the cached AT requires to be refreshed + * Set cache outcome */ - recordCachedAtShouldBeRefreshed(): void { - this.cachedAtShouldBeRefreshed = true; + setCacheOutcome(cacheOutcome: CacheOutcome): void { + this.cacheOutcome = cacheOutcome; } } diff --git a/lib/msal-common/src/utils/Constants.ts b/lib/msal-common/src/utils/Constants.ts index 74db8b85d4..46861a3885 100644 --- a/lib/msal-common/src/utils/Constants.ts +++ b/lib/msal-common/src/utils/Constants.ts @@ -370,3 +370,10 @@ export enum RegionDiscoveryOutcomes { AUTO_DETECTION_REQUESTED_SUCCESSFUL = "Auto-detect requested and auto-detection worked", AUTO_DETECTION_REQUESTED_FAILED = "Auto-detect requested and failed, fallback to global" } + +export enum CacheOutcome { + NO_CACHE_HIT = "No cache hit", + NO_CACHED_ACCESS_TOKEN = "No cached access token", + CACHED_ACCESS_TOKEN_EXPIRED = "Cached access token is expired", + REFRESH_CACHED_ACCESS_TOKEN = "Refresh cached access token" +} diff --git a/lib/msal-node/src/client/ClientApplication.ts b/lib/msal-node/src/client/ClientApplication.ts index b0fd57d891..7b1709bf39 100644 --- a/lib/msal-node/src/client/ClientApplication.ts +++ b/lib/msal-node/src/client/ClientApplication.ts @@ -240,7 +240,7 @@ export abstract class ClientApplication { const discoveredAuthority = await this.createAuthority(authority, azureRegionConfiguration); - serverTelemetryManager?.updateRegionDiscoveryMetadata(discoveredAuthority.getRegionDiscoveryMetadata()); + serverTelemetryManager?.updateRegionDiscoveryMetadata(discoveredAuthority.regionDiscoveryMetadata); return { authOptions: { From 1bfa82c1bb3bab3ef19351b4cad543fc7ea62479 Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Thu, 3 Jun 2021 16:26:59 +0300 Subject: [PATCH 08/26] fix: update the server telemetry documentation --- .../src/telemetry/server/ServerTelemetryManager.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts index 6747f07222..5f5b6728de 100644 --- a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts +++ b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts @@ -203,6 +203,11 @@ export class ServerTelemetryManager { } } + /** + * Get the header value for the region outcome + * @param regionOutcome RegionDiscoveryOutcomes | undefined + * @returns string + */ getRegionOutcomeValue(regionOutcome: RegionDiscoveryOutcomes | undefined): string { if (!regionOutcome) return ""; From cb67535ec1218ac669a179dc3f70e02c20479c61 Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Wed, 23 Jun 2021 15:45:36 +0300 Subject: [PATCH 09/26] Update change/@azure-msal-common-3150477f-929f-4013-8176-77b1a63f8912.json Co-authored-by: Sameera Gajjarapu --- ...@azure-msal-common-3150477f-929f-4013-8176-77b1a63f8912.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/change/@azure-msal-common-3150477f-929f-4013-8176-77b1a63f8912.json b/change/@azure-msal-common-3150477f-929f-4013-8176-77b1a63f8912.json index c7028f0560..c90f5d4120 100644 --- a/change/@azure-msal-common-3150477f-929f-4013-8176-77b1a63f8912.json +++ b/change/@azure-msal-common-3150477f-929f-4013-8176-77b1a63f8912.json @@ -1,6 +1,6 @@ { "type": "minor", - "comment": "feat: add regional authority telemetry", + "comment": "feat: add regional authority telemetry #3662", "packageName": "@azure/msal-common", "email": "samuelkamau@microsoft.com", "dependentChangeType": "patch" From 93ffc8c296f16b6287441ec094b8df101ef89f7b Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Wed, 23 Jun 2021 16:16:53 +0300 Subject: [PATCH 10/26] refactor: replace the enum values with the expected header values --- .../server/ServerTelemetryManager.ts | 49 +++---------------- lib/msal-common/src/utils/Constants.ts | 26 +++++----- 2 files changed, 21 insertions(+), 54 deletions(-) diff --git a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts index 5f5b6728de..fc4c743f16 100644 --- a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts +++ b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts @@ -189,18 +189,7 @@ export class ServerTelemetryManager { getRegionSourceValue(regionSource: RegionDiscoverySources | undefined): string { if (!regionSource) return ""; - switch (regionSource) { - case RegionDiscoverySources.FAILED_AUTO_DETECTION: - return "1"; - case RegionDiscoverySources.INTERNAL_CACHE: - return "2"; - case RegionDiscoverySources.ENVIRONMENT_VARIABLE: - return "3"; - case RegionDiscoverySources.IMDS: - return "4"; - default: - return "0"; - } + return regionSource; } /** @@ -211,39 +200,17 @@ export class ServerTelemetryManager { getRegionOutcomeValue(regionOutcome: RegionDiscoveryOutcomes | undefined): string { if (!regionOutcome) return ""; - switch (regionOutcome) { - case RegionDiscoveryOutcomes.CONFIGURED_MATCHES_DETECTED: - return "1"; - case RegionDiscoveryOutcomes.CONFIGURED_NO_AUTO_DETECTION: - return "2"; - case RegionDiscoveryOutcomes.CONFIGURED_NOT_DETECTED: - return "3"; - case RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_SUCCESSFUL: - return "4"; - case RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_FAILED: - return "5"; - default: - return "0"; - } + return regionOutcome; } + /** + * Get the header value for the cache information + * @returns string + */ getCacheInfoValue(): string { - if (this.forceRefresh) { - return "1"; - } + if (this.forceRefresh) return "1"; - switch(this.cacheOutcome) { - case CacheOutcome.NO_CACHE_HIT: - return "0"; - case CacheOutcome.NO_CACHED_ACCESS_TOKEN: - return "2"; - case CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED: - return "3"; - case CacheOutcome.REFRESH_CACHED_ACCESS_TOKEN: - return "4"; - default: - return "0"; - } + return this.cacheOutcome; } /** diff --git a/lib/msal-common/src/utils/Constants.ts b/lib/msal-common/src/utils/Constants.ts index 46861a3885..acc798b320 100644 --- a/lib/msal-common/src/utils/Constants.ts +++ b/lib/msal-common/src/utils/Constants.ts @@ -354,26 +354,26 @@ export enum ResponseCodes { * Region Discovery Sources */ export enum RegionDiscoverySources { - FAILED_AUTO_DETECTION = "FAILED AUTO DETECTION", - INTERNAL_CACHE = "INTERNAL CACHE", - ENVIRONMENT_VARIABLE = "ENVIRONMENT VARIABLE", - IMDS = "IMDS", + FAILED_AUTO_DETECTION = "1", + INTERNAL_CACHE = "2", + ENVIRONMENT_VARIABLE = "3", + IMDS = "4", } /** * Region Discovery Outcomes */ export enum RegionDiscoveryOutcomes { - CONFIGURED_MATCHES_DETECTED = "Configured by developer and matches auto-detected", - CONFIGURED_NO_AUTO_DETECTION = "Configured by developer, cannot be auto-detected", - CONFIGURED_NOT_DETECTED = "Configured by developer, does not match auto-detected", - AUTO_DETECTION_REQUESTED_SUCCESSFUL = "Auto-detect requested and auto-detection worked", - AUTO_DETECTION_REQUESTED_FAILED = "Auto-detect requested and failed, fallback to global" + CONFIGURED_MATCHES_DETECTED = "1", + CONFIGURED_NO_AUTO_DETECTION = "2", + CONFIGURED_NOT_DETECTED = "3", + AUTO_DETECTION_REQUESTED_SUCCESSFUL = "4", + AUTO_DETECTION_REQUESTED_FAILED = "5" } export enum CacheOutcome { - NO_CACHE_HIT = "No cache hit", - NO_CACHED_ACCESS_TOKEN = "No cached access token", - CACHED_ACCESS_TOKEN_EXPIRED = "Cached access token is expired", - REFRESH_CACHED_ACCESS_TOKEN = "Refresh cached access token" + NO_CACHE_HIT = "0", + NO_CACHED_ACCESS_TOKEN = "2", + CACHED_ACCESS_TOKEN_EXPIRED = "3", + REFRESH_CACHED_ACCESS_TOKEN = "4" } From 4ac4c4c742122f322f53845a2c9f4ad9951c361b Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Wed, 23 Jun 2021 16:18:20 +0300 Subject: [PATCH 11/26] Update change/@azure-msal-node-f63abd0d-4eab-4485-ba86-ca75799c6065.json Co-authored-by: Sameera Gajjarapu --- .../@azure-msal-node-f63abd0d-4eab-4485-ba86-ca75799c6065.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/change/@azure-msal-node-f63abd0d-4eab-4485-ba86-ca75799c6065.json b/change/@azure-msal-node-f63abd0d-4eab-4485-ba86-ca75799c6065.json index 189b2b5b6e..da360df0d2 100644 --- a/change/@azure-msal-node-f63abd0d-4eab-4485-ba86-ca75799c6065.json +++ b/change/@azure-msal-node-f63abd0d-4eab-4485-ba86-ca75799c6065.json @@ -1,6 +1,6 @@ { "type": "minor", - "comment": "feat: add regional authority telemetry", + "comment": "feat: add regional authority telemetry, #3662", "packageName": "@azure/msal-node", "email": "samuelkamau@microsoft.com", "dependentChangeType": "patch" From f62a571c94838e1dfea9c1a8729099020f2a35ba Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Mon, 28 Jun 2021 15:09:24 +0300 Subject: [PATCH 12/26] tests: update the expected telemetry version to 5 --- .../test/telemetry/ServerTelemetryManager.spec.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts b/lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts index e20f88868a..27381c7432 100644 --- a/lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts +++ b/lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts @@ -111,14 +111,14 @@ describe("ServerTelemetryManager.ts", () => { it("Adds telemetry headers with current request", () => { const telemetryManager = new ServerTelemetryManager(testTelemetryPayload, testCacheManager); const currHeaderVal = telemetryManager.generateCurrentRequestHeaderValue(); - expect(currHeaderVal).toEqual(`2|${testApiCode},0,,,|,`); + expect(currHeaderVal).toEqual(`5|${testApiCode},0,,,|,`); }); it("Adds telemetry headers with current request with forceRefresh true", () => { const testPayload: ServerTelemetryRequest = {...testTelemetryPayload, forceRefresh: true }; const telemetryManager = new ServerTelemetryManager(testPayload, testCacheManager); const currHeaderVal = telemetryManager.generateCurrentRequestHeaderValue(); - expect(currHeaderVal).toEqual(`2|${testApiCode},1,,,|,`); + expect(currHeaderVal).toEqual(`5|${testApiCode},1,,,|,`); }); it("Adds telemetry headers with last failed request", () => { @@ -132,7 +132,7 @@ describe("ServerTelemetryManager.ts", () => { const telemetryManager = new ServerTelemetryManager(testTelemetryPayload, testCacheManager); const lastHeaderVal = telemetryManager.generateLastRequestHeaderValue(); - expect(lastHeaderVal).toBe(`2|${testCacheHits}|${testApiCode},${testCorrelationId}|${testError}|1,0`); + expect(lastHeaderVal).toBe(`5|${testCacheHits}|${testApiCode},${testCorrelationId}|${testError}|1,0`); }); it("Adds telemetry headers with multiple last failed requests", () => { @@ -147,7 +147,7 @@ describe("ServerTelemetryManager.ts", () => { const telemetryManager = new ServerTelemetryManager(testTelemetryPayload, testCacheManager); const lastHeaderVal = telemetryManager.generateLastRequestHeaderValue(); expect(lastHeaderVal).toBe( - `2|${testCacheHits}|${testApiCode},${testCorrelationId},${testApiCode},${testCorrelationId}|${testError},${testError}|2,0` + `5|${testCacheHits}|${testApiCode},${testCorrelationId},${testApiCode},${testCorrelationId}|${testError},${testError}|2,0` ); }); @@ -163,7 +163,7 @@ describe("ServerTelemetryManager.ts", () => { const telemetryManager = new ServerTelemetryManager(testTelemetryPayload, testCacheManager); const lastHeaderVal = telemetryManager.generateLastRequestHeaderValue(); - expect(lastHeaderVal).toBe(`2|${testCacheHits}|${testApiCode},${testCorrelationId}|${testError}|2,1`); + expect(lastHeaderVal).toBe(`5|${testCacheHits}|${testApiCode},${testCorrelationId}|${testError}|2,1`); }); }); From a73b13f070908173bd83fed02c85edcd9b853849 Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Mon, 28 Jun 2021 16:19:38 +0300 Subject: [PATCH 13/26] test: upgrade the authority definition in the tests --- .../test/client/ConfidentialClientApplication.spec.ts | 4 +--- lib/msal-node/test/client/PublicClientApplication.spec.ts | 6 ++---- lib/msal-node/test/config/ClientConfiguration.spec.ts | 1 + 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/msal-node/test/client/ConfidentialClientApplication.spec.ts b/lib/msal-node/test/client/ConfidentialClientApplication.spec.ts index a2c61dfda7..7ae47c7873 100644 --- a/lib/msal-node/test/client/ConfidentialClientApplication.spec.ts +++ b/lib/msal-node/test/client/ConfidentialClientApplication.spec.ts @@ -16,9 +16,7 @@ mocked(StringUtils.isEmpty).mockImplementation((str) => { describe('ConfidentialClientApplication', () => { const authority: Authority = { - getRegionDiscoveryMetadata: () => { - return { region_used: undefined, region_source: undefined, region_outcome: undefined }; - }, + regionDiscoveryMetadata: { region_used: undefined, region_source: undefined, region_outcome: undefined }, resolveEndpointsAsync: () => { return new Promise(resolve => { resolve(); diff --git a/lib/msal-node/test/client/PublicClientApplication.spec.ts b/lib/msal-node/test/client/PublicClientApplication.spec.ts index af027d0eb1..296dd8c0a3 100644 --- a/lib/msal-node/test/client/PublicClientApplication.spec.ts +++ b/lib/msal-node/test/client/PublicClientApplication.spec.ts @@ -25,9 +25,7 @@ jest.mock('@azure/msal-common'); describe('PublicClientApplication', () => { const authority: Authority = { - getRegionDiscoveryMetadata: () => { - return { region_used: undefined, region_source: undefined, region_outcome: undefined }; - }, + regionDiscoveryMetadata: { region_used: undefined, region_source: undefined, region_outcome: undefined }, resolveEndpointsAsync: () => { return new Promise(resolve => { resolve(); @@ -36,7 +34,7 @@ describe('PublicClientApplication', () => { discoveryComplete: () => { return true; }, - } as Authority; + } as unknown as Authority; let appConfig: Configuration = { auth: { diff --git a/lib/msal-node/test/config/ClientConfiguration.spec.ts b/lib/msal-node/test/config/ClientConfiguration.spec.ts index d38edbb856..db12a6ccd1 100644 --- a/lib/msal-node/test/config/ClientConfiguration.spec.ts +++ b/lib/msal-node/test/config/ClientConfiguration.spec.ts @@ -146,6 +146,7 @@ describe('ClientConfiguration tests', () => { test('client capabilities are handled as expected', async () => { const authority: Authority = { + regionDiscoveryMetadata: { region_used: undefined, region_source: undefined, region_outcome: undefined }, resolveEndpointsAsync: () => { return new Promise(resolve => { resolve(); From 9caf09ebdac3354a267c925ae63cd0d41d6f3601 Mon Sep 17 00:00:00 2001 From: Sameera Gajjarapu Date: Mon, 28 Jun 2021 11:46:43 -0700 Subject: [PATCH 14/26] Update lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts Co-authored-by: Thomas Norling --- lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts index fc4c743f16..afd387ba60 100644 --- a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts +++ b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts @@ -174,7 +174,7 @@ export class ServerTelemetryManager { getRegionDiscoveryFields(): string { const regionDiscoveryFields: string[] = []; - regionDiscoveryFields.push(this.regionUsed ? this.regionUsed : ""); + regionDiscoveryFields.push(this.regionUsed || ""); regionDiscoveryFields.push(this.getRegionSourceValue(this.regionSource)); regionDiscoveryFields.push(this.getRegionOutcomeValue(this.regionOutcome)); From 4cb59e6117a1c923c9b3ab1d76c66cea561339b5 Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Tue, 29 Jun 2021 11:09:40 +0300 Subject: [PATCH 15/26] refactor: improve the readability of server telemetry on the OBO flow client Co-authored-by: Jason Nutter --- lib/msal-common/src/client/OnBehalfOfClient.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/msal-common/src/client/OnBehalfOfClient.ts b/lib/msal-common/src/client/OnBehalfOfClient.ts index 37ecc9fe30..daf18c79fa 100644 --- a/lib/msal-common/src/client/OnBehalfOfClient.ts +++ b/lib/msal-common/src/client/OnBehalfOfClient.ts @@ -62,9 +62,7 @@ export class OnBehalfOfClient extends BaseClient { TimeUtils.isTokenExpired(cachedAccessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)) { // Update the server telemetry outcome - !cachedAccessToken ? - this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.NO_CACHED_ACCESS_TOKEN) : - this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED); + this.serverTelemetryManager?.setCacheOutcome(!cachedAccessToken ? CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED : CacheOutcome.NO_CACHED_ACCESS_TOKEN); return null; } From 1cb3dad6fb6cb212bc47d9ce0d148c2cde96df3a Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Tue, 29 Jun 2021 14:09:31 +0300 Subject: [PATCH 16/26] feat: implemented the changes from the pull request - bumped up the version for msal-common in the extensions library - implemented the feedback from the reviewers --- .../msal-node-extensions/package-lock.json | 12 ++--- extensions/msal-node-extensions/package.json | 2 +- .../server/ServerTelemetryManager.ts | 44 +++---------------- lib/msal-common/src/utils/Constants.ts | 1 + 4 files changed, 15 insertions(+), 44 deletions(-) diff --git a/extensions/msal-node-extensions/package-lock.json b/extensions/msal-node-extensions/package-lock.json index 039cef793b..486b4adc2e 100644 --- a/extensions/msal-node-extensions/package-lock.json +++ b/extensions/msal-node-extensions/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@azure/msal-common": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-1.7.2.tgz", - "integrity": "sha512-3/voCdFKONENX+5tMrNOBSrVJb6NbE7YB8vc4FZ/4ZbjpK7GVtq9Bu1MW+HZhrmsUzSF/joHx0ZIJDYIequ/jg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-4.4.0.tgz", + "integrity": "sha512-Qrs33Ctt2KM7NxArFPIUKc8UbIcm7zYxJFdJeQ9k7HKBhVk3e88CUz1Mw33cS/Jr+YA1H02OAzHg++bJ+4SFyQ==", "requires": { "debug": "^4.1.1" } @@ -9469,9 +9469,9 @@ } }, "ws": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", - "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.1.tgz", + "integrity": "sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow==", "dev": true }, "xml-name-validator": { diff --git a/extensions/msal-node-extensions/package.json b/extensions/msal-node-extensions/package.json index 5c4c138457..650883ec91 100644 --- a/extensions/msal-node-extensions/package.json +++ b/extensions/msal-node-extensions/package.json @@ -37,7 +37,7 @@ }, "module": "dist/test.esm.js", "dependencies": { - "@azure/msal-common": "^1.7.2", + "@azure/msal-common": "^4.4.0", "bindings": "^1.5.0", "keytar": "^7.6.0", "nan": "^2.13.2" diff --git a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts index afd387ba60..fc9248b3e4 100644 --- a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts +++ b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts @@ -22,7 +22,7 @@ export class ServerTelemetryManager { private regionUsed: string | undefined; private regionSource: RegionDiscoverySources | undefined; private regionOutcome: RegionDiscoveryOutcomes | undefined; - private cacheOutcome: CacheOutcome = CacheOutcome.NO_CACHE_HIT; + private cacheOutcome: CacheOutcome; constructor(telemetryRequest: ServerTelemetryRequest, cacheManager: CacheManager) { this.cacheManager = cacheManager; @@ -33,14 +33,16 @@ export class ServerTelemetryManager { this.wrapperVer = telemetryRequest.wrapperVer || Constants.EMPTY_STRING; this.telemetryCacheKey = SERVER_TELEM_CONSTANTS.CACHE_KEY + Separators.CACHE_KEY_SEPARATOR + telemetryRequest.clientId; + + // Initialize the cache outcome value + this.setCacheOutcome(this.forceRefresh ? CacheOutcome.FORCE_REFRESH : CacheOutcome.NO_CACHE_HIT); } /** * API to add MSER Telemetry to request */ generateCurrentRequestHeaderValue(): string { - const cacheInfo = this.getCacheInfoValue(); - const request = `${this.apiId}${SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR}${cacheInfo}`; + const request = `${this.apiId}${SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR}${this.cacheOutcome}`; const platformFields = [this.wrapperSKU, this.wrapperVer].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR); const regionDiscoveryFields = this.getRegionDiscoveryFields(); const requestWithRegionDiscoveryFields = [request, regionDiscoveryFields].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR); @@ -175,44 +177,12 @@ export class ServerTelemetryManager { const regionDiscoveryFields: string[] = []; regionDiscoveryFields.push(this.regionUsed || ""); - regionDiscoveryFields.push(this.getRegionSourceValue(this.regionSource)); - regionDiscoveryFields.push(this.getRegionOutcomeValue(this.regionOutcome)); + regionDiscoveryFields.push(this.regionSource || ""); + regionDiscoveryFields.push(this.regionOutcome || ""); return regionDiscoveryFields.join(","); } - /** - * Get the header value for the region source - * @param regionSource - * @returns string - */ - getRegionSourceValue(regionSource: RegionDiscoverySources | undefined): string { - if (!regionSource) return ""; - - return regionSource; - } - - /** - * Get the header value for the region outcome - * @param regionOutcome RegionDiscoveryOutcomes | undefined - * @returns string - */ - getRegionOutcomeValue(regionOutcome: RegionDiscoveryOutcomes | undefined): string { - if (!regionOutcome) return ""; - - return regionOutcome; - } - - /** - * Get the header value for the cache information - * @returns string - */ - getCacheInfoValue(): string { - if (this.forceRefresh) return "1"; - - return this.cacheOutcome; - } - /** * Update the region discovery metadata * diff --git a/lib/msal-common/src/utils/Constants.ts b/lib/msal-common/src/utils/Constants.ts index acc798b320..2e1be00fea 100644 --- a/lib/msal-common/src/utils/Constants.ts +++ b/lib/msal-common/src/utils/Constants.ts @@ -373,6 +373,7 @@ export enum RegionDiscoveryOutcomes { export enum CacheOutcome { NO_CACHE_HIT = "0", + FORCE_REFRESH = "1", NO_CACHED_ACCESS_TOKEN = "2", CACHED_ACCESS_TOKEN_EXPIRED = "3", REFRESH_CACHED_ACCESS_TOKEN = "4" From 2bf61e9e1ed3697352269537f7e24ebbac4d926b Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Tue, 29 Jun 2021 15:13:36 +0300 Subject: [PATCH 17/26] Change files --- ...de-extensions-775467ab-ea19-4849-9a64-291a495d4226.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 change/@azure-msal-node-extensions-775467ab-ea19-4849-9a64-291a495d4226.json diff --git a/change/@azure-msal-node-extensions-775467ab-ea19-4849-9a64-291a495d4226.json b/change/@azure-msal-node-extensions-775467ab-ea19-4849-9a64-291a495d4226.json new file mode 100644 index 0000000000..5d926d2a8e --- /dev/null +++ b/change/@azure-msal-node-extensions-775467ab-ea19-4849-9a64-291a495d4226.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "feat: implemented the changes from the pull request", + "packageName": "@azure/msal-node-extensions", + "email": "samuelkamau@microsoft.com", + "dependentChangeType": "patch" +} From 9f121374d20dd6a11c0ea1d7fd142afa07aec040 Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Tue, 29 Jun 2021 15:15:49 +0300 Subject: [PATCH 18/26] Update @azure-msal-node-extensions-775467ab-ea19-4849-9a64-291a495d4226.json --- ...al-node-extensions-775467ab-ea19-4849-9a64-291a495d4226.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/change/@azure-msal-node-extensions-775467ab-ea19-4849-9a64-291a495d4226.json b/change/@azure-msal-node-extensions-775467ab-ea19-4849-9a64-291a495d4226.json index 5d926d2a8e..6296ed3227 100644 --- a/change/@azure-msal-node-extensions-775467ab-ea19-4849-9a64-291a495d4226.json +++ b/change/@azure-msal-node-extensions-775467ab-ea19-4849-9a64-291a495d4226.json @@ -1,6 +1,6 @@ { "type": "patch", - "comment": "feat: implemented the changes from the pull request", + "comment": "fix: bump up the msal-common version", "packageName": "@azure/msal-node-extensions", "email": "samuelkamau@microsoft.com", "dependentChangeType": "patch" From de672a7a081a50bd413ff6429ad40c4175c6b196 Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Tue, 29 Jun 2021 15:25:47 +0300 Subject: [PATCH 19/26] fix: fixing the npm audit issues --- lib/msal-angular/package-lock.json | 246 ++++++++++++++--------------- lib/msal-browser/package-lock.json | 30 ++-- lib/msal-node/package-lock.json | 8 +- lib/msal-react/package-lock.json | 16 +- 4 files changed, 151 insertions(+), 149 deletions(-) diff --git a/lib/msal-angular/package-lock.json b/lib/msal-angular/package-lock.json index eb72dec634..4e56549e94 100644 --- a/lib/msal-angular/package-lock.json +++ b/lib/msal-angular/package-lock.json @@ -1,6 +1,6 @@ { "name": "@azure/msal-angular", - "version": "2.0.0", + "version": "2.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -467,18 +467,18 @@ } }, "@azure/msal-browser": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.14.2.tgz", - "integrity": "sha512-JKHE9Rer41CI8tweiyE91M8ZbGvQV9P+jOPB4ZtPxyxCi2f7ED3jNfdzyUJ1eGB+hCRnvO56M1Xc61T1R+JfYg==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.15.0.tgz", + "integrity": "sha512-Du0BHQiDQgkqg6OoKovUZWdEIZbTnhh/lma7QLyi5jFKDekk78wXsFIOJLUcFoY97+ZhB+Y2WQOYT1DJphAdCg==", "dev": true, "requires": { - "@azure/msal-common": "^4.3.0" + "@azure/msal-common": "^4.4.0" } }, "@azure/msal-common": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-4.3.0.tgz", - "integrity": "sha512-jFqUWe83wVb6O8cNGGBFg2QlKvqM1ezUgJTEV7kIsAPX0RXhGFE4B1DLNt6hCnkTXDbw+KGW0zgxOEr4MJQwLw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-4.4.0.tgz", + "integrity": "sha512-Qrs33Ctt2KM7NxArFPIUKc8UbIcm7zYxJFdJeQ9k7HKBhVk3e88CUz1Mw33cS/Jr+YA1H02OAzHg++bJ+4SFyQ==", "dev": true, "requires": { "debug": "^4.1.1" @@ -4040,15 +4040,15 @@ } }, "css-select": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-3.1.2.tgz", - "integrity": "sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^4.0.0", - "domhandler": "^4.0.0", - "domutils": "^2.4.3", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", "nth-check": "^2.0.0" } }, @@ -4077,9 +4077,9 @@ } }, "css-what": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-4.0.0.tgz", - "integrity": "sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", "dev": true }, "cssesc": { @@ -4158,9 +4158,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -4567,9 +4567,9 @@ } }, "domutils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.6.0.tgz", - "integrity": "sha512-y0BezHuy4MDYxh6OvolXYsH+1EMGmFbwv5FKW7ovwMG6zTPWqNPq3WF9ayZssFq+UlKdffGLbOEaghNdaOm1WA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", "dev": true, "requires": { "dom-serializer": "^1.0.1", @@ -8235,9 +8235,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8288,9 +8288,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8339,9 +8339,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8459,9 +8459,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8485,9 +8485,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8514,9 +8514,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8542,9 +8542,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8564,9 +8564,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8586,9 +8586,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8608,9 +8608,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8633,9 +8633,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8666,9 +8666,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8700,9 +8700,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8731,9 +8731,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8764,9 +8764,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8795,9 +8795,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8828,9 +8828,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8852,9 +8852,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8883,9 +8883,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8914,9 +8914,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8944,9 +8944,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -8974,9 +8974,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -9004,9 +9004,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -9035,9 +9035,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -9064,9 +9064,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -9094,9 +9094,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -9125,9 +9125,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -9150,9 +9150,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -9180,9 +9180,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -9210,9 +9210,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -9246,9 +9246,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -11417,9 +11417,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -12772,15 +12772,15 @@ } }, "svgo": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.0.tgz", - "integrity": "sha512-fz4IKjNO6HDPgIQxu4IxwtubtbSfGEAJUq/IXyTPIkGhWck/faiiwfkvsB8LnBkKLvSoyNNIY6d13lZprJMc9Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.1.tgz", + "integrity": "sha512-riDDIQgXpEnn0BEl9Gvhh1LNLIyiusSpt64IR8upJu7MwxnzetmF/Y57pXQD2NMX2lVyMRzXt5f2M5rO4wG7Dw==", "dev": true, "requires": { "@trysound/sax": "0.1.1", "chalk": "^4.1.0", "commander": "^7.1.0", - "css-select": "^3.1.2", + "css-select": "^4.1.3", "css-tree": "^1.1.2", "csso": "^4.2.0", "stable": "^0.1.8" diff --git a/lib/msal-browser/package-lock.json b/lib/msal-browser/package-lock.json index 1d447405b5..a146b6bba1 100644 --- a/lib/msal-browser/package-lock.json +++ b/lib/msal-browser/package-lock.json @@ -1,6 +1,6 @@ { "name": "@azure/msal-browser", - "version": "2.14.2", + "version": "2.15.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -91,9 +91,9 @@ } }, "@azure/msal-common": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-4.3.0.tgz", - "integrity": "sha512-jFqUWe83wVb6O8cNGGBFg2QlKvqM1ezUgJTEV7kIsAPX0RXhGFE4B1DLNt6hCnkTXDbw+KGW0zgxOEr4MJQwLw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-4.4.0.tgz", + "integrity": "sha512-Qrs33Ctt2KM7NxArFPIUKc8UbIcm7zYxJFdJeQ9k7HKBhVk3e88CUz1Mw33cS/Jr+YA1H02OAzHg++bJ+4SFyQ==", "requires": { "debug": "^4.1.1" } @@ -1995,6 +1995,18 @@ "requires": { "bole": "npm:@zkochan/bole@^3.0.4", "ndjson": "^1.5.0" + }, + "dependencies": { + "bole": { + "version": "npm:@zkochan/bole@3.0.4", + "resolved": "https://registry.npmjs.org/@zkochan/bole/-/bole-3.0.4.tgz", + "integrity": "sha512-3iPQz6Z7A2aiKc9cxB+I4X0nKxOagBxWAl91+ukUyJ9El+DgejYgbfd4PtzUyam+JRXXydUCkKGKiWYj8EzrGw==", + "dev": true, + "requires": { + "fast-safe-stringify": "~1.1.0", + "individual": "~3.0.0" + } + } } }, "@pnpm/merge-lockfile-changes": { @@ -2839,16 +2851,6 @@ "yargs-parser": "^20.2.4" } }, - "bole": { - "version": "npm:@zkochan/bole@3.0.4", - "resolved": "https://registry.npmjs.org/@zkochan/bole/-/bole-3.0.4.tgz", - "integrity": "sha512-3iPQz6Z7A2aiKc9cxB+I4X0nKxOagBxWAl91+ukUyJ9El+DgejYgbfd4PtzUyam+JRXXydUCkKGKiWYj8EzrGw==", - "dev": true, - "requires": { - "fast-safe-stringify": "~1.1.0", - "individual": "~3.0.0" - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", diff --git a/lib/msal-node/package-lock.json b/lib/msal-node/package-lock.json index 2ba4625272..b871b5fdd9 100644 --- a/lib/msal-node/package-lock.json +++ b/lib/msal-node/package-lock.json @@ -1,13 +1,13 @@ { "name": "@azure/msal-node", - "version": "1.1.0", + "version": "1.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { "@azure/msal-common": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-4.3.0.tgz", - "integrity": "sha512-jFqUWe83wVb6O8cNGGBFg2QlKvqM1ezUgJTEV7kIsAPX0RXhGFE4B1DLNt6hCnkTXDbw+KGW0zgxOEr4MJQwLw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-4.4.0.tgz", + "integrity": "sha512-Qrs33Ctt2KM7NxArFPIUKc8UbIcm7zYxJFdJeQ9k7HKBhVk3e88CUz1Mw33cS/Jr+YA1H02OAzHg++bJ+4SFyQ==", "requires": { "debug": "^4.1.1" } diff --git a/lib/msal-react/package-lock.json b/lib/msal-react/package-lock.json index c5266dd3ae..f1624d12b8 100644 --- a/lib/msal-react/package-lock.json +++ b/lib/msal-react/package-lock.json @@ -1,22 +1,22 @@ { "name": "@azure/msal-react", - "version": "1.0.0", + "version": "1.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { "@azure/msal-browser": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.14.2.tgz", - "integrity": "sha512-JKHE9Rer41CI8tweiyE91M8ZbGvQV9P+jOPB4ZtPxyxCi2f7ED3jNfdzyUJ1eGB+hCRnvO56M1Xc61T1R+JfYg==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-2.15.0.tgz", + "integrity": "sha512-Du0BHQiDQgkqg6OoKovUZWdEIZbTnhh/lma7QLyi5jFKDekk78wXsFIOJLUcFoY97+ZhB+Y2WQOYT1DJphAdCg==", "dev": true, "requires": { - "@azure/msal-common": "^4.3.0" + "@azure/msal-common": "^4.4.0" } }, "@azure/msal-common": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-4.3.0.tgz", - "integrity": "sha512-jFqUWe83wVb6O8cNGGBFg2QlKvqM1ezUgJTEV7kIsAPX0RXhGFE4B1DLNt6hCnkTXDbw+KGW0zgxOEr4MJQwLw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-4.4.0.tgz", + "integrity": "sha512-Qrs33Ctt2KM7NxArFPIUKc8UbIcm7zYxJFdJeQ9k7HKBhVk3e88CUz1Mw33cS/Jr+YA1H02OAzHg++bJ+4SFyQ==", "dev": true, "requires": { "debug": "^4.1.1" From 9b19470078b65bedf2b69246ba764b32b533a268 Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Tue, 29 Jun 2021 15:29:21 +0300 Subject: [PATCH 20/26] Change files --- ...-msal-angular-93820d74-8077-45d4-b5fe-abbc1173a1b1.json | 7 +++++++ ...-msal-browser-e02e76bb-e3be-4942-92fb-db7f87c51270.json | 7 +++++++ ...re-msal-react-c60f303b-d77c-45c3-80f1-0012a472df94.json | 7 +++++++ 3 files changed, 21 insertions(+) create mode 100644 change/@azure-msal-angular-93820d74-8077-45d4-b5fe-abbc1173a1b1.json create mode 100644 change/@azure-msal-browser-e02e76bb-e3be-4942-92fb-db7f87c51270.json create mode 100644 change/@azure-msal-react-c60f303b-d77c-45c3-80f1-0012a472df94.json diff --git a/change/@azure-msal-angular-93820d74-8077-45d4-b5fe-abbc1173a1b1.json b/change/@azure-msal-angular-93820d74-8077-45d4-b5fe-abbc1173a1b1.json new file mode 100644 index 0000000000..a1b389518e --- /dev/null +++ b/change/@azure-msal-angular-93820d74-8077-45d4-b5fe-abbc1173a1b1.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: fixing the npm audit issues", + "packageName": "@azure/msal-angular", + "email": "samuelkamau@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@azure-msal-browser-e02e76bb-e3be-4942-92fb-db7f87c51270.json b/change/@azure-msal-browser-e02e76bb-e3be-4942-92fb-db7f87c51270.json new file mode 100644 index 0000000000..b6350a27e7 --- /dev/null +++ b/change/@azure-msal-browser-e02e76bb-e3be-4942-92fb-db7f87c51270.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: fixing the npm audit issues", + "packageName": "@azure/msal-browser", + "email": "samuelkamau@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@azure-msal-react-c60f303b-d77c-45c3-80f1-0012a472df94.json b/change/@azure-msal-react-c60f303b-d77c-45c3-80f1-0012a472df94.json new file mode 100644 index 0000000000..4fa08da434 --- /dev/null +++ b/change/@azure-msal-react-c60f303b-d77c-45c3-80f1-0012a472df94.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: fixing the npm audit issues", + "packageName": "@azure/msal-react", + "email": "samuelkamau@microsoft.com", + "dependentChangeType": "patch" +} From 4c9e2618b8d4a975733c7979ee06cbcfeb5cee7b Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Wed, 30 Jun 2021 17:42:00 +0300 Subject: [PATCH 21/26] fix: implement the changes suggested on the pull request - improve the code readability - improve cache outcome initialization --- .../src/client/SilentFlowClient.ts | 38 ++++++++++--------- .../server/ServerTelemetryManager.ts | 5 +-- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/lib/msal-common/src/client/SilentFlowClient.ts b/lib/msal-common/src/client/SilentFlowClient.ts index 3e29e575af..1f13c77def 100644 --- a/lib/msal-common/src/client/SilentFlowClient.ts +++ b/lib/msal-common/src/client/SilentFlowClient.ts @@ -60,24 +60,28 @@ export class SilentFlowClient extends BaseClient { const environment = request.authority || this.authority.getPreferredCache(); const authScheme = request.authenticationScheme || AuthenticationScheme.BEARER; const cacheRecord = this.cacheManager.readCacheRecord(request.account, this.config.authOptions.clientId, requestScopes, environment, authScheme); - - if (request.forceRefresh || - !StringUtils.isEmptyObj(request.claims) || - !cacheRecord.accessToken || - TimeUtils.isTokenExpired(cacheRecord.accessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds) || + + if (request.forceRefresh) { + // Must refresh due to present force_refresh flag. + this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.FORCE_REFRESH); + throw ClientAuthError.createRefreshRequiredError(); + } else if (!cacheRecord.accessToken) { + // Must refresh due to non-existent access_token. + this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.NO_CACHED_ACCESS_TOKEN); + throw ClientAuthError.createRefreshRequiredError(); + } else if ( TimeUtils.wasClockTurnedBack(cacheRecord.accessToken.cachedAt) || - (cacheRecord.accessToken.refreshOn && TimeUtils.isTokenExpired(cacheRecord.accessToken.refreshOn, 0))) { - - // Update server telemetry manager with the cache outcome - if (!cacheRecord.accessToken) { - this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.NO_CACHED_ACCESS_TOKEN); - } else if (TimeUtils.isTokenExpired(cacheRecord.accessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)) { - this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED); - } else if (cacheRecord.accessToken.refreshOn && TimeUtils.isTokenExpired(cacheRecord.accessToken.refreshOn, 0)) { - this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.REFRESH_CACHED_ACCESS_TOKEN); - } - - // Must refresh due to request parameters, or expired or non-existent access_token + TimeUtils.isTokenExpired(cacheRecord.accessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds) + ) { + // Must refresh due to expired access_token. + this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED); + throw ClientAuthError.createRefreshRequiredError(); + } else if (cacheRecord.accessToken.refreshOn && TimeUtils.isTokenExpired(cacheRecord.accessToken.refreshOn, 0)) { + // Must refresh due to the refresh_in value. + this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.REFRESH_CACHED_ACCESS_TOKEN); + throw ClientAuthError.createRefreshRequiredError(); + } else if (!StringUtils.isEmptyObj(request.claims)) { + // Must refresh due to request parameters. throw ClientAuthError.createRefreshRequiredError(); } diff --git a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts index fc9248b3e4..0027fc259b 100644 --- a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts +++ b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts @@ -22,7 +22,7 @@ export class ServerTelemetryManager { private regionUsed: string | undefined; private regionSource: RegionDiscoverySources | undefined; private regionOutcome: RegionDiscoveryOutcomes | undefined; - private cacheOutcome: CacheOutcome; + private cacheOutcome: CacheOutcome = CacheOutcome.NO_CACHE_HIT; constructor(telemetryRequest: ServerTelemetryRequest, cacheManager: CacheManager) { this.cacheManager = cacheManager; @@ -33,9 +33,6 @@ export class ServerTelemetryManager { this.wrapperVer = telemetryRequest.wrapperVer || Constants.EMPTY_STRING; this.telemetryCacheKey = SERVER_TELEM_CONSTANTS.CACHE_KEY + Separators.CACHE_KEY_SEPARATOR + telemetryRequest.clientId; - - // Initialize the cache outcome value - this.setCacheOutcome(this.forceRefresh ? CacheOutcome.FORCE_REFRESH : CacheOutcome.NO_CACHE_HIT); } /** From 01c0a7e2bf4dbc195e7913b13578734d659161ce Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Wed, 30 Jun 2021 20:04:31 +0300 Subject: [PATCH 22/26] fix: removed unused variable in sever telemetry manager --- lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts index 0027fc259b..5be4d03921 100644 --- a/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts +++ b/lib/msal-common/src/telemetry/server/ServerTelemetryManager.ts @@ -15,7 +15,6 @@ export class ServerTelemetryManager { private cacheManager: CacheManager; private apiId: number; private correlationId: string; - private forceRefresh: boolean; private telemetryCacheKey: string; private wrapperSKU: String; private wrapperVer: String; @@ -28,7 +27,6 @@ export class ServerTelemetryManager { this.cacheManager = cacheManager; this.apiId = telemetryRequest.apiId; this.correlationId = telemetryRequest.correlationId; - this.forceRefresh = telemetryRequest.forceRefresh || false; this.wrapperSKU = telemetryRequest.wrapperSKU || Constants.EMPTY_STRING; this.wrapperVer = telemetryRequest.wrapperVer || Constants.EMPTY_STRING; From 582d63f7733cc4fe4768a7826b74f5498225449e Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Wed, 30 Jun 2021 20:22:47 +0300 Subject: [PATCH 23/26] fix: update the server telemetry manager test --- lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts b/lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts index 7b1e719543..310e1ca7aa 100644 --- a/lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts +++ b/lib/msal-common/test/telemetry/ServerTelemetryManager.spec.ts @@ -10,6 +10,7 @@ import { ServerTelemetryRequest } from "../../src/telemetry/server/ServerTelemet import { ServerTelemetryManager } from "../../src/telemetry/server/ServerTelemetryManager"; import { AuthError } from "../../src/error/AuthError"; import { ServerTelemetryEntity } from "../../src/cache/entities/ServerTelemetryEntity"; +import { CacheOutcome } from "../../src/utils/Constants"; const testCacheManager = new MockStorageClass(TEST_CONFIG.MSAL_CLIENT_ID, mockCrypto); const testApiCode = 9999999; @@ -118,8 +119,9 @@ describe("ServerTelemetryManager.ts", () => { }); it("Adds telemetry headers with current request with forceRefresh true", () => { - const testPayload: ServerTelemetryRequest = {...testTelemetryPayload, forceRefresh: true }; + const testPayload: ServerTelemetryRequest = {...testTelemetryPayload }; const telemetryManager = new ServerTelemetryManager(testPayload, testCacheManager); + telemetryManager.setCacheOutcome(CacheOutcome.FORCE_REFRESH); const currHeaderVal = telemetryManager.generateCurrentRequestHeaderValue(); expect(currHeaderVal).toEqual(`5|${testApiCode},1,,,|,`); }); From 2a7da533097fae80edb3a0b031ea229afefd24ff Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Wed, 30 Jun 2021 21:58:26 +0300 Subject: [PATCH 24/26] fix: cleanup the region discovery api - improve the readability of the region discovery API --- lib/msal-common/src/authority/RegionDiscovery.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/msal-common/src/authority/RegionDiscovery.ts b/lib/msal-common/src/authority/RegionDiscovery.ts index 71d3b5a6d2..37b98fbba3 100644 --- a/lib/msal-common/src/authority/RegionDiscovery.ts +++ b/lib/msal-common/src/authority/RegionDiscovery.ts @@ -34,8 +34,10 @@ export class RegionDiscovery { const response = await this.getRegionFromIMDS(Constants.IMDS_VERSION); if (response.status === ResponseCodes.httpSuccess) { autodetectedRegionName = response.body; + regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS; } + // Check if the response was a bad request and try again with a more recent version of IMDS if (response.status === ResponseCodes.httpBadRequest) { const latestIMDSVersion = await this.getCurrentVersion(); if (!latestIMDSVersion) { @@ -46,10 +48,9 @@ export class RegionDiscovery { const response = await this.getRegionFromIMDS(latestIMDSVersion); if (response.status === ResponseCodes.httpSuccess) { autodetectedRegionName = response.body; + regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS; } } - - if (autodetectedRegionName) regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS; } catch(e) { regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION; return null; From ac9a7fdfbfa2a9b63637a61734cee2123f6921a4 Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Thu, 1 Jul 2021 13:38:27 +0300 Subject: [PATCH 25/26] refactor: improve code readability of the RegionDiscovery file - improve code readability of the RegionDiscovery file - add code comments in the RegionDiscovery file --- .../src/authority/RegionDiscovery.ts | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/lib/msal-common/src/authority/RegionDiscovery.ts b/lib/msal-common/src/authority/RegionDiscovery.ts index 37b98fbba3..ccbb119bfd 100644 --- a/lib/msal-common/src/authority/RegionDiscovery.ts +++ b/lib/msal-common/src/authority/RegionDiscovery.ts @@ -28,26 +28,26 @@ export class RegionDiscovery { // Initialize auto detected region with the region from the envrionment let autodetectedRegionName = environmentRegion; - // Call the local IMDS endpoint for applications running in azure vms + // Check if a region was detected from the environment, if not, attempt to get the region from IMDS if (!autodetectedRegionName) { try { - const response = await this.getRegionFromIMDS(Constants.IMDS_VERSION); - if (response.status === ResponseCodes.httpSuccess) { - autodetectedRegionName = response.body; + const localIMDSVersionResponse = await this.getRegionFromIMDS(Constants.IMDS_VERSION); + if (localIMDSVersionResponse.status === ResponseCodes.httpSuccess) { + autodetectedRegionName = localIMDSVersionResponse.body; regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS; } - // Check if the response was a bad request and try again with a more recent version of IMDS - if (response.status === ResponseCodes.httpBadRequest) { - const latestIMDSVersion = await this.getCurrentVersion(); - if (!latestIMDSVersion) { + // If the response using the local IMDS version failed, try to fetch the current version of IMDS and retry. + if (localIMDSVersionResponse.status === ResponseCodes.httpBadRequest) { + const currentIMDSVersion = await this.getCurrentVersion(); + if (!currentIMDSVersion) { regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION; return null; } - const response = await this.getRegionFromIMDS(latestIMDSVersion); - if (response.status === ResponseCodes.httpSuccess) { - autodetectedRegionName = response.body; + const currentIMDSVersionResponse = await this.getRegionFromIMDS(currentIMDSVersion); + if (currentIMDSVersionResponse.status === ResponseCodes.httpSuccess) { + autodetectedRegionName = currentIMDSVersionResponse.body; regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS; } } @@ -59,7 +59,10 @@ export class RegionDiscovery { regionDiscoveryMetadata.region_source = RegionDiscoverySources.ENVIRONMENT_VARIABLE; } - if (!autodetectedRegionName) regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION; + // If no region was auto detected from the environment or from the IMDS endpoint, mark the attempt as a FAILED_AUTO_DETECTION + if (!autodetectedRegionName) { + regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION; + } return autodetectedRegionName || null; } From 0dbf9719734aeedf02e77bec47608605036467f3 Mon Sep 17 00:00:00 2001 From: Samuel Kubai Date: Thu, 1 Jul 2021 13:54:13 +0300 Subject: [PATCH 26/26] fix: replace the auto discover flag with the flag from the .NET team --- lib/msal-common/src/utils/Constants.ts | 2 +- lib/msal-node/docs/regional-authorities.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/msal-common/src/utils/Constants.ts b/lib/msal-common/src/utils/Constants.ts index 78ec6e1e42..7749e8d8ad 100644 --- a/lib/msal-common/src/utils/Constants.ts +++ b/lib/msal-common/src/utils/Constants.ts @@ -42,7 +42,7 @@ export const Constants = { IMDS_ENDPOINT: "http://169.254.169.254/metadata/instance/compute/location", IMDS_VERSION: "2020-06-01", IMDS_TIMEOUT: 2000, - AZURE_REGION_AUTO_DISCOVER_FLAG: "AUTO_DISCOVER", + AZURE_REGION_AUTO_DISCOVER_FLAG: "TryAutoDetect", REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX: "login.microsoft.com", KNOWN_PUBLIC_CLOUDS: ["login.microsoftonline.com", "login.windows.net", "login.microsoft.com", "sts.windows.net"] }; diff --git a/lib/msal-node/docs/regional-authorities.md b/lib/msal-node/docs/regional-authorities.md index 657ad74af9..71e60426da 100644 --- a/lib/msal-node/docs/regional-authorities.md +++ b/lib/msal-node/docs/regional-authorities.md @@ -42,7 +42,7 @@ cca }); ``` -> NOTE: If you provide the value `"AUTO_DISCOVER"` in the `azureRegion` field, the msal library which will try to discover the region the application has been deployed to and use that region. If no region is auto discovered the library will fall back to using the global authority. +> NOTE: If you provide the value `"TryAutoDetect"` in the `azureRegion` field, the msal library which will try to discover the region the application has been deployed to and use that region. If no region is auto discovered the library will fall back to using the global authority. ## Sample You can find a working sample of this feature in the client-credentials [sample](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-node-samples/client-credentials)