@azure/msal-common 14.0.0-alpha.1 → 14.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +62 -62
  3. package/dist/account/AccountInfo.d.ts +31 -31
  4. package/dist/account/AuthToken.d.ts +20 -20
  5. package/dist/account/AuthToken.js +48 -48
  6. package/dist/account/CcsCredential.d.ts +9 -8
  7. package/dist/account/CcsCredential.d.ts.map +1 -1
  8. package/dist/account/CcsCredential.js +9 -10
  9. package/dist/account/CcsCredential.js.map +1 -1
  10. package/dist/account/ClientCredentials.d.ts +14 -14
  11. package/dist/account/ClientInfo.d.ts +19 -19
  12. package/dist/account/ClientInfo.js +37 -37
  13. package/dist/account/DecodedAuthToken.d.ts +8 -8
  14. package/dist/account/TokenClaims.d.ts +65 -65
  15. package/dist/authority/Authority.d.ts +228 -215
  16. package/dist/authority/Authority.d.ts.map +1 -1
  17. package/dist/authority/Authority.js +716 -682
  18. package/dist/authority/Authority.js.map +1 -1
  19. package/dist/authority/AuthorityFactory.d.ts +30 -30
  20. package/dist/authority/AuthorityFactory.js +47 -47
  21. package/dist/authority/AuthorityMetadata.d.ts +622 -622
  22. package/dist/authority/AuthorityMetadata.js +876 -876
  23. package/dist/authority/AuthorityOptions.d.ts +19 -18
  24. package/dist/authority/AuthorityOptions.d.ts.map +1 -1
  25. package/dist/authority/AuthorityOptions.js +19 -20
  26. package/dist/authority/AuthorityOptions.js.map +1 -1
  27. package/dist/authority/AuthorityType.d.ts +10 -9
  28. package/dist/authority/AuthorityType.d.ts.map +1 -1
  29. package/dist/authority/AuthorityType.js +14 -15
  30. package/dist/authority/AuthorityType.js.map +1 -1
  31. package/dist/authority/AzureRegion.d.ts +1 -1
  32. package/dist/authority/AzureRegionConfiguration.d.ts +5 -5
  33. package/dist/authority/CloudDiscoveryMetadata.d.ts +5 -5
  34. package/dist/authority/CloudInstanceDiscoveryErrorResponse.d.ts +13 -13
  35. package/dist/authority/CloudInstanceDiscoveryErrorResponse.js +8 -8
  36. package/dist/authority/CloudInstanceDiscoveryResponse.d.ts +9 -9
  37. package/dist/authority/CloudInstanceDiscoveryResponse.js +8 -8
  38. package/dist/authority/ImdsOptions.d.ts +5 -5
  39. package/dist/authority/OpenIdConfigResponse.d.ts +11 -11
  40. package/dist/authority/OpenIdConfigResponse.js +10 -10
  41. package/dist/authority/ProtocolMode.d.ts +8 -7
  42. package/dist/authority/ProtocolMode.d.ts.map +1 -1
  43. package/dist/authority/ProtocolMode.js +12 -13
  44. package/dist/authority/ProtocolMode.js.map +1 -1
  45. package/dist/authority/RegionDiscovery.d.ts +30 -30
  46. package/dist/authority/RegionDiscovery.js +108 -108
  47. package/dist/authority/RegionDiscoveryMetadata.d.ts +6 -6
  48. package/dist/broker/nativeBroker/INativeBrokerPlugin.d.ts +15 -15
  49. package/dist/cache/CacheManager.d.ts +443 -443
  50. package/dist/cache/CacheManager.js +1011 -1011
  51. package/dist/cache/entities/AccessTokenEntity.d.ts +56 -56
  52. package/dist/cache/entities/AccessTokenEntity.js +111 -111
  53. package/dist/cache/entities/AccountEntity.d.ts +99 -99
  54. package/dist/cache/entities/AccountEntity.js +248 -248
  55. package/dist/cache/entities/AppMetadataEntity.d.ts +39 -39
  56. package/dist/cache/entities/AppMetadataEntity.js +66 -66
  57. package/dist/cache/entities/AuthorityMetadataEntity.d.ts +47 -47
  58. package/dist/cache/entities/AuthorityMetadataEntity.js +77 -77
  59. package/dist/cache/entities/CacheRecord.d.ts +13 -13
  60. package/dist/cache/entities/CacheRecord.js +13 -13
  61. package/dist/cache/entities/CredentialEntity.d.ts +88 -88
  62. package/dist/cache/entities/CredentialEntity.js +136 -136
  63. package/dist/cache/entities/IdTokenEntity.d.ts +34 -34
  64. package/dist/cache/entities/IdTokenEntity.js +56 -56
  65. package/dist/cache/entities/RefreshTokenEntity.d.ts +36 -36
  66. package/dist/cache/entities/RefreshTokenEntity.js +59 -59
  67. package/dist/cache/entities/ServerTelemetryEntity.d.ts +12 -12
  68. package/dist/cache/entities/ServerTelemetryEntity.js +27 -27
  69. package/dist/cache/entities/ThrottlingEntity.d.ts +13 -13
  70. package/dist/cache/entities/ThrottlingEntity.js +23 -23
  71. package/dist/cache/interface/ICacheManager.d.ts +165 -165
  72. package/dist/cache/interface/ICachePlugin.d.ts +5 -5
  73. package/dist/cache/interface/ISerializableTokenCache.d.ts +4 -4
  74. package/dist/cache/persistence/TokenCacheContext.d.ts +23 -23
  75. package/dist/cache/persistence/TokenCacheContext.js +25 -25
  76. package/dist/cache/utils/CacheTypes.d.ts +62 -62
  77. package/dist/client/AuthorizationCodeClient.d.ts +71 -71
  78. package/dist/client/AuthorizationCodeClient.js +433 -433
  79. package/dist/client/BaseClient.d.ts +50 -50
  80. package/dist/client/BaseClient.js +92 -92
  81. package/dist/client/RefreshTokenClient.d.ts +34 -34
  82. package/dist/client/RefreshTokenClient.js +239 -239
  83. package/dist/client/SilentFlowClient.d.ts +24 -24
  84. package/dist/client/SilentFlowClient.js +94 -94
  85. package/dist/config/AppTokenProvider.d.ts +38 -38
  86. package/dist/config/ClientConfiguration.d.ts +133 -133
  87. package/dist/config/ClientConfiguration.js +88 -88
  88. package/dist/crypto/ICrypto.d.ts +62 -62
  89. package/dist/crypto/ICrypto.js +42 -42
  90. package/dist/crypto/IGuidGenerator.d.ts +4 -4
  91. package/dist/crypto/JoseHeader.d.ts +21 -21
  92. package/dist/crypto/JoseHeader.js +36 -36
  93. package/dist/crypto/PopTokenGenerator.d.ts +58 -57
  94. package/dist/crypto/PopTokenGenerator.d.ts.map +1 -1
  95. package/dist/crypto/PopTokenGenerator.js +82 -83
  96. package/dist/crypto/PopTokenGenerator.js.map +1 -1
  97. package/dist/crypto/SignedHttpRequest.d.ts +11 -11
  98. package/dist/error/AuthError.d.ts +47 -47
  99. package/dist/error/AuthError.js +51 -51
  100. package/dist/error/ClientAuthError.d.ts +412 -412
  101. package/dist/error/ClientAuthError.js +519 -519
  102. package/dist/error/ClientConfigurationError.d.ts +206 -198
  103. package/dist/error/ClientConfigurationError.d.ts.map +1 -1
  104. package/dist/error/ClientConfigurationError.js +259 -249
  105. package/dist/error/ClientConfigurationError.js.map +1 -1
  106. package/dist/error/InteractionRequiredAuthError.d.ts +59 -59
  107. package/dist/error/InteractionRequiredAuthError.js +78 -78
  108. package/dist/error/JoseHeaderError.d.ts +28 -28
  109. package/dist/error/JoseHeaderError.js +39 -39
  110. package/dist/error/ServerError.d.ts +7 -7
  111. package/dist/error/ServerError.js +14 -14
  112. package/dist/index.cjs.js +8826 -8813
  113. package/dist/index.cjs.js.map +1 -1
  114. package/dist/index.d.ts +93 -93
  115. package/dist/index.js +1 -1
  116. package/dist/logger/Logger.d.ts +95 -95
  117. package/dist/logger/Logger.js +197 -197
  118. package/dist/network/INetworkModule.d.ts +29 -29
  119. package/dist/network/INetworkModule.js +14 -14
  120. package/dist/network/NetworkManager.d.ts +32 -32
  121. package/dist/network/NetworkManager.js +33 -33
  122. package/dist/network/RequestThumbprint.d.ts +16 -16
  123. package/dist/network/ThrottlingUtils.d.ts +41 -41
  124. package/dist/network/ThrottlingUtils.js +94 -94
  125. package/dist/packageMetadata.d.ts +2 -2
  126. package/dist/packageMetadata.d.ts.map +1 -1
  127. package/dist/packageMetadata.js +4 -4
  128. package/dist/request/AuthenticationHeaderParser.d.ts +19 -19
  129. package/dist/request/AuthenticationHeaderParser.js +55 -55
  130. package/dist/request/BaseAuthRequest.d.ts +37 -37
  131. package/dist/request/CommonAuthorizationCodeRequest.d.ts +27 -27
  132. package/dist/request/CommonAuthorizationUrlRequest.d.ts +50 -50
  133. package/dist/request/CommonClientCredentialRequest.d.ts +17 -17
  134. package/dist/request/CommonDeviceCodeRequest.d.ts +21 -21
  135. package/dist/request/CommonEndSessionRequest.d.ts +21 -21
  136. package/dist/request/CommonOnBehalfOfRequest.d.ts +13 -13
  137. package/dist/request/CommonRefreshTokenRequest.d.ts +19 -19
  138. package/dist/request/CommonSilentFlowRequest.d.ts +18 -18
  139. package/dist/request/CommonUsernamePasswordRequest.d.ts +17 -17
  140. package/dist/request/NativeRequest.d.ts +19 -19
  141. package/dist/request/NativeSignOutRequest.d.ts +5 -5
  142. package/dist/request/RequestParameterBuilder.d.ts +216 -216
  143. package/dist/request/RequestParameterBuilder.js +374 -374
  144. package/dist/request/RequestValidator.d.ts +33 -33
  145. package/dist/request/RequestValidator.js +82 -83
  146. package/dist/request/RequestValidator.js.map +1 -1
  147. package/dist/request/ScopeSet.d.ts +88 -88
  148. package/dist/request/ScopeSet.js +197 -197
  149. package/dist/response/AuthenticationResult.d.ts +39 -39
  150. package/dist/response/AuthorizationCodePayload.d.ts +13 -13
  151. package/dist/response/DeviceCodeResponse.d.ts +25 -25
  152. package/dist/response/ExternalTokenResponse.d.ts +15 -15
  153. package/dist/response/IMDSBadResponse.d.ts +4 -4
  154. package/dist/response/ResponseHandler.d.ts +72 -72
  155. package/dist/response/ResponseHandler.js +300 -300
  156. package/dist/response/ServerAuthorizationCodeResponse.d.ts +25 -25
  157. package/dist/response/ServerAuthorizationTokenResponse.d.ts +44 -44
  158. package/dist/telemetry/performance/IPerformanceClient.d.ts +42 -42
  159. package/dist/telemetry/performance/IPerformanceMeasurement.d.ts +5 -5
  160. package/dist/telemetry/performance/PerformanceClient.d.ts +189 -189
  161. package/dist/telemetry/performance/PerformanceClient.js +406 -406
  162. package/dist/telemetry/performance/PerformanceEvent.d.ts +441 -439
  163. package/dist/telemetry/performance/PerformanceEvent.d.ts.map +1 -1
  164. package/dist/telemetry/performance/PerformanceEvent.js +225 -227
  165. package/dist/telemetry/performance/PerformanceEvent.js.map +1 -1
  166. package/dist/telemetry/performance/StubPerformanceClient.d.ts +15 -19
  167. package/dist/telemetry/performance/StubPerformanceClient.d.ts.map +1 -1
  168. package/dist/telemetry/performance/StubPerformanceClient.js +22 -36
  169. package/dist/telemetry/performance/StubPerformanceClient.js.map +1 -1
  170. package/dist/telemetry/server/ServerTelemetryManager.d.ts +65 -65
  171. package/dist/telemetry/server/ServerTelemetryManager.js +196 -196
  172. package/dist/telemetry/server/ServerTelemetryRequest.d.ts +8 -8
  173. package/dist/url/IUri.d.ts +12 -12
  174. package/dist/url/UrlString.d.ts +70 -70
  175. package/dist/url/UrlString.js +242 -242
  176. package/dist/utils/Constants.d.ts +345 -331
  177. package/dist/utils/Constants.d.ts.map +1 -1
  178. package/dist/utils/Constants.js +353 -373
  179. package/dist/utils/Constants.js.map +1 -1
  180. package/dist/utils/MsalTypes.d.ts +6 -6
  181. package/dist/utils/ProtocolUtils.d.ts +42 -42
  182. package/dist/utils/ProtocolUtils.js +71 -71
  183. package/dist/utils/StringUtils.d.ts +53 -53
  184. package/dist/utils/StringUtils.js +124 -124
  185. package/dist/utils/TimeUtils.d.ts +27 -27
  186. package/dist/utils/TimeUtils.js +45 -45
  187. package/package.json +86 -79
@@ -1,71 +1,71 @@
1
- import { ServerAuthorizationCodeResponse } from "../response/ServerAuthorizationCodeResponse";
2
- import { IUri } from "./IUri";
3
- /**
4
- * Url object class which can perform various transformations on url strings.
5
- */
6
- export declare class UrlString {
7
- private _urlString;
8
- get urlString(): string;
9
- constructor(url: string);
10
- /**
11
- * Ensure urls are lower case and end with a / character.
12
- * @param url
13
- */
14
- static canonicalizeUri(url: string): string;
15
- /**
16
- * Throws if urlString passed is not a valid authority URI string.
17
- */
18
- validateAsUri(): void;
19
- /**
20
- * Given a url and a query string return the url with provided query string appended
21
- * @param url
22
- * @param queryString
23
- */
24
- static appendQueryString(url: string, queryString: string): string;
25
- /**
26
- * Returns a url with the hash removed
27
- * @param url
28
- */
29
- static removeHashFromUrl(url: string): string;
30
- /**
31
- * Given a url like https://a:b/common/d?e=f#g, and a tenantId, returns https://a:b/tenantId/d
32
- * @param href The url
33
- * @param tenantId The tenant id to replace
34
- */
35
- replaceTenantPath(tenantId: string): UrlString;
36
- /**
37
- * Returns the anchor part(#) of the URL
38
- */
39
- getHash(): string;
40
- /**
41
- * Parses out the components from a url string.
42
- * @returns An object with the various components. Please cache this value insted of calling this multiple times on the same url.
43
- */
44
- getUrlComponents(): IUri;
45
- static getDomainFromUrl(url: string): string;
46
- static getAbsoluteUrl(relativeUrl: string, baseUrl: string): string;
47
- /**
48
- * Parses hash string from given string. Returns empty string if no hash symbol is found.
49
- * @param hashString
50
- */
51
- static parseHash(hashString: string): string;
52
- /**
53
- * Parses query string from given string. Returns empty string if no query symbol is found.
54
- * @param queryString
55
- */
56
- static parseQueryString(queryString: string): string;
57
- static constructAuthorityUriFromObject(urlObject: IUri): UrlString;
58
- /**
59
- * Returns URL hash as server auth code response object.
60
- */
61
- static getDeserializedHash(hash: string): ServerAuthorizationCodeResponse;
62
- /**
63
- * Returns URL query string as server auth code response object.
64
- */
65
- static getDeserializedQueryString(query: string): ServerAuthorizationCodeResponse;
66
- /**
67
- * Check if the hash of the URL string contains known properties
68
- */
69
- static hashContainsKnownProperties(hash: string): boolean;
70
- }
1
+ import { ServerAuthorizationCodeResponse } from "../response/ServerAuthorizationCodeResponse";
2
+ import { IUri } from "./IUri";
3
+ /**
4
+ * Url object class which can perform various transformations on url strings.
5
+ */
6
+ export declare class UrlString {
7
+ private _urlString;
8
+ get urlString(): string;
9
+ constructor(url: string);
10
+ /**
11
+ * Ensure urls are lower case and end with a / character.
12
+ * @param url
13
+ */
14
+ static canonicalizeUri(url: string): string;
15
+ /**
16
+ * Throws if urlString passed is not a valid authority URI string.
17
+ */
18
+ validateAsUri(): void;
19
+ /**
20
+ * Given a url and a query string return the url with provided query string appended
21
+ * @param url
22
+ * @param queryString
23
+ */
24
+ static appendQueryString(url: string, queryString: string): string;
25
+ /**
26
+ * Returns a url with the hash removed
27
+ * @param url
28
+ */
29
+ static removeHashFromUrl(url: string): string;
30
+ /**
31
+ * Given a url like https://a:b/common/d?e=f#g, and a tenantId, returns https://a:b/tenantId/d
32
+ * @param href The url
33
+ * @param tenantId The tenant id to replace
34
+ */
35
+ replaceTenantPath(tenantId: string): UrlString;
36
+ /**
37
+ * Returns the anchor part(#) of the URL
38
+ */
39
+ getHash(): string;
40
+ /**
41
+ * Parses out the components from a url string.
42
+ * @returns An object with the various components. Please cache this value insted of calling this multiple times on the same url.
43
+ */
44
+ getUrlComponents(): IUri;
45
+ static getDomainFromUrl(url: string): string;
46
+ static getAbsoluteUrl(relativeUrl: string, baseUrl: string): string;
47
+ /**
48
+ * Parses hash string from given string. Returns empty string if no hash symbol is found.
49
+ * @param hashString
50
+ */
51
+ static parseHash(hashString: string): string;
52
+ /**
53
+ * Parses query string from given string. Returns empty string if no query symbol is found.
54
+ * @param queryString
55
+ */
56
+ static parseQueryString(queryString: string): string;
57
+ static constructAuthorityUriFromObject(urlObject: IUri): UrlString;
58
+ /**
59
+ * Returns URL hash as server auth code response object.
60
+ */
61
+ static getDeserializedHash(hash: string): ServerAuthorizationCodeResponse;
62
+ /**
63
+ * Returns URL query string as server auth code response object.
64
+ */
65
+ static getDeserializedQueryString(query: string): ServerAuthorizationCodeResponse;
66
+ /**
67
+ * Check if the hash of the URL string contains known properties
68
+ */
69
+ static hashContainsKnownProperties(hash: string): boolean;
70
+ }
71
71
  //# sourceMappingURL=UrlString.d.ts.map
@@ -1,251 +1,251 @@
1
- /*! @azure/msal-common v14.0.0-alpha.1 2023-05-08 */
1
+ /*! @azure/msal-common v14.0.0-beta.0 2023-06-19 */
2
2
  'use strict';
3
3
  import { ClientConfigurationError } from '../error/ClientConfigurationError.js';
4
4
  import { ClientAuthError } from '../error/ClientAuthError.js';
5
5
  import { StringUtils } from '../utils/StringUtils.js';
6
6
  import { AADAuthorityConstants, Constants } from '../utils/Constants.js';
7
7
 
8
- /*
9
- * Copyright (c) Microsoft Corporation. All rights reserved.
10
- * Licensed under the MIT License.
11
- */
12
- /**
13
- * Url object class which can perform various transformations on url strings.
14
- */
15
- class UrlString {
16
- get urlString() {
17
- return this._urlString;
18
- }
19
- constructor(url) {
20
- this._urlString = url;
21
- if (StringUtils.isEmpty(this._urlString)) {
22
- // Throws error if url is empty
23
- throw ClientConfigurationError.createUrlEmptyError();
24
- }
25
- if (StringUtils.isEmpty(this.getHash())) {
26
- this._urlString = UrlString.canonicalizeUri(url);
27
- }
28
- }
29
- /**
30
- * Ensure urls are lower case and end with a / character.
31
- * @param url
32
- */
33
- static canonicalizeUri(url) {
34
- if (url) {
35
- let lowerCaseUrl = url.toLowerCase();
36
- if (StringUtils.endsWith(lowerCaseUrl, "?")) {
37
- lowerCaseUrl = lowerCaseUrl.slice(0, -1);
38
- }
39
- else if (StringUtils.endsWith(lowerCaseUrl, "?/")) {
40
- lowerCaseUrl = lowerCaseUrl.slice(0, -2);
41
- }
42
- if (!StringUtils.endsWith(lowerCaseUrl, "/")) {
43
- lowerCaseUrl += "/";
44
- }
45
- return lowerCaseUrl;
46
- }
47
- return url;
48
- }
49
- /**
50
- * Throws if urlString passed is not a valid authority URI string.
51
- */
52
- validateAsUri() {
53
- // Attempts to parse url for uri components
54
- let components;
55
- try {
56
- components = this.getUrlComponents();
57
- }
58
- catch (e) {
59
- throw ClientConfigurationError.createUrlParseError(e);
60
- }
61
- // Throw error if URI or path segments are not parseable.
62
- if (!components.HostNameAndPort || !components.PathSegments) {
63
- throw ClientConfigurationError.createUrlParseError(`Given url string: ${this.urlString}`);
64
- }
65
- // Throw error if uri is insecure.
66
- if (!components.Protocol ||
67
- components.Protocol.toLowerCase() !== "https:") {
68
- throw ClientConfigurationError.createInsecureAuthorityUriError(this.urlString);
69
- }
70
- }
71
- /**
72
- * Given a url and a query string return the url with provided query string appended
73
- * @param url
74
- * @param queryString
75
- */
76
- static appendQueryString(url, queryString) {
77
- if (StringUtils.isEmpty(queryString)) {
78
- return url;
79
- }
80
- return url.indexOf("?") < 0
81
- ? `${url}?${queryString}`
82
- : `${url}&${queryString}`;
83
- }
84
- /**
85
- * Returns a url with the hash removed
86
- * @param url
87
- */
88
- static removeHashFromUrl(url) {
89
- return UrlString.canonicalizeUri(url.split("#")[0]);
90
- }
91
- /**
92
- * Given a url like https://a:b/common/d?e=f#g, and a tenantId, returns https://a:b/tenantId/d
93
- * @param href The url
94
- * @param tenantId The tenant id to replace
95
- */
96
- replaceTenantPath(tenantId) {
97
- const urlObject = this.getUrlComponents();
98
- const pathArray = urlObject.PathSegments;
99
- if (tenantId &&
100
- pathArray.length !== 0 &&
101
- (pathArray[0] === AADAuthorityConstants.COMMON ||
102
- pathArray[0] === AADAuthorityConstants.ORGANIZATIONS)) {
103
- pathArray[0] = tenantId;
104
- }
105
- return UrlString.constructAuthorityUriFromObject(urlObject);
106
- }
107
- /**
108
- * Returns the anchor part(#) of the URL
109
- */
110
- getHash() {
111
- return UrlString.parseHash(this.urlString);
112
- }
113
- /**
114
- * Parses out the components from a url string.
115
- * @returns An object with the various components. Please cache this value insted of calling this multiple times on the same url.
116
- */
117
- getUrlComponents() {
118
- // https://gist.github.com/curtisz/11139b2cfcaef4a261e0
119
- const regEx = RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?");
120
- // If url string does not match regEx, we throw an error
121
- const match = this.urlString.match(regEx);
122
- if (!match) {
123
- throw ClientConfigurationError.createUrlParseError(`Given url string: ${this.urlString}`);
124
- }
125
- // Url component object
126
- const urlComponents = {
127
- Protocol: match[1],
128
- HostNameAndPort: match[4],
129
- AbsolutePath: match[5],
130
- QueryString: match[7],
131
- };
132
- let pathSegments = urlComponents.AbsolutePath.split("/");
133
- pathSegments = pathSegments.filter((val) => val && val.length > 0); // remove empty elements
134
- urlComponents.PathSegments = pathSegments;
135
- if (!StringUtils.isEmpty(urlComponents.QueryString) &&
136
- urlComponents.QueryString.endsWith("/")) {
137
- urlComponents.QueryString = urlComponents.QueryString.substring(0, urlComponents.QueryString.length - 1);
138
- }
139
- return urlComponents;
140
- }
141
- static getDomainFromUrl(url) {
142
- const regEx = RegExp("^([^:/?#]+://)?([^/?#]*)");
143
- const match = url.match(regEx);
144
- if (!match) {
145
- throw ClientConfigurationError.createUrlParseError(`Given url string: ${url}`);
146
- }
147
- return match[2];
148
- }
149
- static getAbsoluteUrl(relativeUrl, baseUrl) {
150
- if (relativeUrl[0] === Constants.FORWARD_SLASH) {
151
- const url = new UrlString(baseUrl);
152
- const baseComponents = url.getUrlComponents();
153
- return (baseComponents.Protocol +
154
- "//" +
155
- baseComponents.HostNameAndPort +
156
- relativeUrl);
157
- }
158
- return relativeUrl;
159
- }
160
- /**
161
- * Parses hash string from given string. Returns empty string if no hash symbol is found.
162
- * @param hashString
163
- */
164
- static parseHash(hashString) {
165
- const hashIndex1 = hashString.indexOf("#");
166
- const hashIndex2 = hashString.indexOf("#/");
167
- if (hashIndex2 > -1) {
168
- return hashString.substring(hashIndex2 + 2);
169
- }
170
- else if (hashIndex1 > -1) {
171
- return hashString.substring(hashIndex1 + 1);
172
- }
173
- return Constants.EMPTY_STRING;
174
- }
175
- /**
176
- * Parses query string from given string. Returns empty string if no query symbol is found.
177
- * @param queryString
178
- */
179
- static parseQueryString(queryString) {
180
- const queryIndex1 = queryString.indexOf("?");
181
- const queryIndex2 = queryString.indexOf("/?");
182
- if (queryIndex2 > -1) {
183
- return queryString.substring(queryIndex2 + 2);
184
- }
185
- else if (queryIndex1 > -1) {
186
- return queryString.substring(queryIndex1 + 1);
187
- }
188
- return Constants.EMPTY_STRING;
189
- }
190
- static constructAuthorityUriFromObject(urlObject) {
191
- return new UrlString(urlObject.Protocol +
192
- "//" +
193
- urlObject.HostNameAndPort +
194
- "/" +
195
- urlObject.PathSegments.join("/"));
196
- }
197
- /**
198
- * Returns URL hash as server auth code response object.
199
- */
200
- static getDeserializedHash(hash) {
201
- // Check if given hash is empty
202
- if (StringUtils.isEmpty(hash)) {
203
- return {};
204
- }
205
- // Strip the # symbol if present
206
- const parsedHash = UrlString.parseHash(hash);
207
- // If # symbol was not present, above will return empty string, so give original hash value
208
- const deserializedHash = StringUtils.queryStringToObject(StringUtils.isEmpty(parsedHash) ? hash : parsedHash);
209
- // Check if deserialization didn't work
210
- if (!deserializedHash) {
211
- throw ClientAuthError.createHashNotDeserializedError(JSON.stringify(deserializedHash));
212
- }
213
- return deserializedHash;
214
- }
215
- /**
216
- * Returns URL query string as server auth code response object.
217
- */
218
- static getDeserializedQueryString(query) {
219
- // Check if given query is empty
220
- if (StringUtils.isEmpty(query)) {
221
- return {};
222
- }
223
- // Strip the ? symbol if present
224
- const parsedQueryString = UrlString.parseQueryString(query);
225
- // If ? symbol was not present, above will return empty string, so give original query value
226
- const deserializedQueryString = StringUtils.queryStringToObject(StringUtils.isEmpty(parsedQueryString)
227
- ? query
228
- : parsedQueryString);
229
- // Check if deserialization didn't work
230
- if (!deserializedQueryString) {
231
- throw ClientAuthError.createHashNotDeserializedError(JSON.stringify(deserializedQueryString));
232
- }
233
- return deserializedQueryString;
234
- }
235
- /**
236
- * Check if the hash of the URL string contains known properties
237
- */
238
- static hashContainsKnownProperties(hash) {
239
- if (StringUtils.isEmpty(hash) || hash.indexOf("=") < 0) {
240
- // Hash doesn't contain key/value pairs
241
- return false;
242
- }
243
- const parameters = UrlString.getDeserializedHash(hash);
244
- return !!(parameters.code ||
245
- parameters.error_description ||
246
- parameters.error ||
247
- parameters.state);
248
- }
8
+ /*
9
+ * Copyright (c) Microsoft Corporation. All rights reserved.
10
+ * Licensed under the MIT License.
11
+ */
12
+ /**
13
+ * Url object class which can perform various transformations on url strings.
14
+ */
15
+ class UrlString {
16
+ get urlString() {
17
+ return this._urlString;
18
+ }
19
+ constructor(url) {
20
+ this._urlString = url;
21
+ if (StringUtils.isEmpty(this._urlString)) {
22
+ // Throws error if url is empty
23
+ throw ClientConfigurationError.createUrlEmptyError();
24
+ }
25
+ if (StringUtils.isEmpty(this.getHash())) {
26
+ this._urlString = UrlString.canonicalizeUri(url);
27
+ }
28
+ }
29
+ /**
30
+ * Ensure urls are lower case and end with a / character.
31
+ * @param url
32
+ */
33
+ static canonicalizeUri(url) {
34
+ if (url) {
35
+ let lowerCaseUrl = url.toLowerCase();
36
+ if (StringUtils.endsWith(lowerCaseUrl, "?")) {
37
+ lowerCaseUrl = lowerCaseUrl.slice(0, -1);
38
+ }
39
+ else if (StringUtils.endsWith(lowerCaseUrl, "?/")) {
40
+ lowerCaseUrl = lowerCaseUrl.slice(0, -2);
41
+ }
42
+ if (!StringUtils.endsWith(lowerCaseUrl, "/")) {
43
+ lowerCaseUrl += "/";
44
+ }
45
+ return lowerCaseUrl;
46
+ }
47
+ return url;
48
+ }
49
+ /**
50
+ * Throws if urlString passed is not a valid authority URI string.
51
+ */
52
+ validateAsUri() {
53
+ // Attempts to parse url for uri components
54
+ let components;
55
+ try {
56
+ components = this.getUrlComponents();
57
+ }
58
+ catch (e) {
59
+ throw ClientConfigurationError.createUrlParseError(e);
60
+ }
61
+ // Throw error if URI or path segments are not parseable.
62
+ if (!components.HostNameAndPort || !components.PathSegments) {
63
+ throw ClientConfigurationError.createUrlParseError(`Given url string: ${this.urlString}`);
64
+ }
65
+ // Throw error if uri is insecure.
66
+ if (!components.Protocol ||
67
+ components.Protocol.toLowerCase() !== "https:") {
68
+ throw ClientConfigurationError.createInsecureAuthorityUriError(this.urlString);
69
+ }
70
+ }
71
+ /**
72
+ * Given a url and a query string return the url with provided query string appended
73
+ * @param url
74
+ * @param queryString
75
+ */
76
+ static appendQueryString(url, queryString) {
77
+ if (StringUtils.isEmpty(queryString)) {
78
+ return url;
79
+ }
80
+ return url.indexOf("?") < 0
81
+ ? `${url}?${queryString}`
82
+ : `${url}&${queryString}`;
83
+ }
84
+ /**
85
+ * Returns a url with the hash removed
86
+ * @param url
87
+ */
88
+ static removeHashFromUrl(url) {
89
+ return UrlString.canonicalizeUri(url.split("#")[0]);
90
+ }
91
+ /**
92
+ * Given a url like https://a:b/common/d?e=f#g, and a tenantId, returns https://a:b/tenantId/d
93
+ * @param href The url
94
+ * @param tenantId The tenant id to replace
95
+ */
96
+ replaceTenantPath(tenantId) {
97
+ const urlObject = this.getUrlComponents();
98
+ const pathArray = urlObject.PathSegments;
99
+ if (tenantId &&
100
+ pathArray.length !== 0 &&
101
+ (pathArray[0] === AADAuthorityConstants.COMMON ||
102
+ pathArray[0] === AADAuthorityConstants.ORGANIZATIONS)) {
103
+ pathArray[0] = tenantId;
104
+ }
105
+ return UrlString.constructAuthorityUriFromObject(urlObject);
106
+ }
107
+ /**
108
+ * Returns the anchor part(#) of the URL
109
+ */
110
+ getHash() {
111
+ return UrlString.parseHash(this.urlString);
112
+ }
113
+ /**
114
+ * Parses out the components from a url string.
115
+ * @returns An object with the various components. Please cache this value insted of calling this multiple times on the same url.
116
+ */
117
+ getUrlComponents() {
118
+ // https://gist.github.com/curtisz/11139b2cfcaef4a261e0
119
+ const regEx = RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?");
120
+ // If url string does not match regEx, we throw an error
121
+ const match = this.urlString.match(regEx);
122
+ if (!match) {
123
+ throw ClientConfigurationError.createUrlParseError(`Given url string: ${this.urlString}`);
124
+ }
125
+ // Url component object
126
+ const urlComponents = {
127
+ Protocol: match[1],
128
+ HostNameAndPort: match[4],
129
+ AbsolutePath: match[5],
130
+ QueryString: match[7],
131
+ };
132
+ let pathSegments = urlComponents.AbsolutePath.split("/");
133
+ pathSegments = pathSegments.filter((val) => val && val.length > 0); // remove empty elements
134
+ urlComponents.PathSegments = pathSegments;
135
+ if (!StringUtils.isEmpty(urlComponents.QueryString) &&
136
+ urlComponents.QueryString.endsWith("/")) {
137
+ urlComponents.QueryString = urlComponents.QueryString.substring(0, urlComponents.QueryString.length - 1);
138
+ }
139
+ return urlComponents;
140
+ }
141
+ static getDomainFromUrl(url) {
142
+ const regEx = RegExp("^([^:/?#]+://)?([^/?#]*)");
143
+ const match = url.match(regEx);
144
+ if (!match) {
145
+ throw ClientConfigurationError.createUrlParseError(`Given url string: ${url}`);
146
+ }
147
+ return match[2];
148
+ }
149
+ static getAbsoluteUrl(relativeUrl, baseUrl) {
150
+ if (relativeUrl[0] === Constants.FORWARD_SLASH) {
151
+ const url = new UrlString(baseUrl);
152
+ const baseComponents = url.getUrlComponents();
153
+ return (baseComponents.Protocol +
154
+ "//" +
155
+ baseComponents.HostNameAndPort +
156
+ relativeUrl);
157
+ }
158
+ return relativeUrl;
159
+ }
160
+ /**
161
+ * Parses hash string from given string. Returns empty string if no hash symbol is found.
162
+ * @param hashString
163
+ */
164
+ static parseHash(hashString) {
165
+ const hashIndex1 = hashString.indexOf("#");
166
+ const hashIndex2 = hashString.indexOf("#/");
167
+ if (hashIndex2 > -1) {
168
+ return hashString.substring(hashIndex2 + 2);
169
+ }
170
+ else if (hashIndex1 > -1) {
171
+ return hashString.substring(hashIndex1 + 1);
172
+ }
173
+ return Constants.EMPTY_STRING;
174
+ }
175
+ /**
176
+ * Parses query string from given string. Returns empty string if no query symbol is found.
177
+ * @param queryString
178
+ */
179
+ static parseQueryString(queryString) {
180
+ const queryIndex1 = queryString.indexOf("?");
181
+ const queryIndex2 = queryString.indexOf("/?");
182
+ if (queryIndex2 > -1) {
183
+ return queryString.substring(queryIndex2 + 2);
184
+ }
185
+ else if (queryIndex1 > -1) {
186
+ return queryString.substring(queryIndex1 + 1);
187
+ }
188
+ return Constants.EMPTY_STRING;
189
+ }
190
+ static constructAuthorityUriFromObject(urlObject) {
191
+ return new UrlString(urlObject.Protocol +
192
+ "//" +
193
+ urlObject.HostNameAndPort +
194
+ "/" +
195
+ urlObject.PathSegments.join("/"));
196
+ }
197
+ /**
198
+ * Returns URL hash as server auth code response object.
199
+ */
200
+ static getDeserializedHash(hash) {
201
+ // Check if given hash is empty
202
+ if (StringUtils.isEmpty(hash)) {
203
+ return {};
204
+ }
205
+ // Strip the # symbol if present
206
+ const parsedHash = UrlString.parseHash(hash);
207
+ // If # symbol was not present, above will return empty string, so give original hash value
208
+ const deserializedHash = StringUtils.queryStringToObject(StringUtils.isEmpty(parsedHash) ? hash : parsedHash);
209
+ // Check if deserialization didn't work
210
+ if (!deserializedHash) {
211
+ throw ClientAuthError.createHashNotDeserializedError(JSON.stringify(deserializedHash));
212
+ }
213
+ return deserializedHash;
214
+ }
215
+ /**
216
+ * Returns URL query string as server auth code response object.
217
+ */
218
+ static getDeserializedQueryString(query) {
219
+ // Check if given query is empty
220
+ if (StringUtils.isEmpty(query)) {
221
+ return {};
222
+ }
223
+ // Strip the ? symbol if present
224
+ const parsedQueryString = UrlString.parseQueryString(query);
225
+ // If ? symbol was not present, above will return empty string, so give original query value
226
+ const deserializedQueryString = StringUtils.queryStringToObject(StringUtils.isEmpty(parsedQueryString)
227
+ ? query
228
+ : parsedQueryString);
229
+ // Check if deserialization didn't work
230
+ if (!deserializedQueryString) {
231
+ throw ClientAuthError.createHashNotDeserializedError(JSON.stringify(deserializedQueryString));
232
+ }
233
+ return deserializedQueryString;
234
+ }
235
+ /**
236
+ * Check if the hash of the URL string contains known properties
237
+ */
238
+ static hashContainsKnownProperties(hash) {
239
+ if (StringUtils.isEmpty(hash) || hash.indexOf("=") < 0) {
240
+ // Hash doesn't contain key/value pairs
241
+ return false;
242
+ }
243
+ const parameters = UrlString.getDeserializedHash(hash);
244
+ return !!(parameters.code ||
245
+ parameters.error_description ||
246
+ parameters.error ||
247
+ parameters.state);
248
+ }
249
249
  }
250
250
 
251
251
  export { UrlString };