@azure/msal-common 14.0.2 → 14.1.0-alpha.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 (399) hide show
  1. package/dist/account/AccountInfo.d.ts +32 -32
  2. package/dist/account/AuthToken.d.ts +17 -20
  3. package/dist/account/AuthToken.d.ts.map +1 -1
  4. package/dist/account/AuthToken.mjs +61 -51
  5. package/dist/account/AuthToken.mjs.map +1 -1
  6. package/dist/account/CcsCredential.d.ts +9 -9
  7. package/dist/account/CcsCredential.mjs +8 -8
  8. package/dist/account/CcsCredential.mjs.map +1 -1
  9. package/dist/account/ClientCredentials.d.ts +14 -14
  10. package/dist/account/ClientInfo.d.ts +19 -19
  11. package/dist/account/ClientInfo.d.ts.map +1 -1
  12. package/dist/account/ClientInfo.mjs +39 -39
  13. package/dist/account/ClientInfo.mjs.map +1 -1
  14. package/dist/account/TokenClaims.d.ts +65 -65
  15. package/dist/authority/Authority.d.ts +235 -235
  16. package/dist/authority/Authority.d.ts.map +1 -1
  17. package/dist/authority/Authority.mjs +743 -765
  18. package/dist/authority/Authority.mjs.map +1 -1
  19. package/dist/authority/AuthorityFactory.d.ts +31 -31
  20. package/dist/authority/AuthorityFactory.d.ts.map +1 -1
  21. package/dist/authority/AuthorityFactory.mjs +52 -51
  22. package/dist/authority/AuthorityFactory.mjs.map +1 -1
  23. package/dist/authority/AuthorityMetadata.d.ts +623 -623
  24. package/dist/authority/AuthorityMetadata.mjs +884 -884
  25. package/dist/authority/AuthorityMetadata.mjs.map +1 -1
  26. package/dist/authority/AuthorityOptions.d.ts +21 -21
  27. package/dist/authority/AuthorityOptions.mjs +18 -18
  28. package/dist/authority/AuthorityOptions.mjs.map +1 -1
  29. package/dist/authority/AuthorityType.d.ts +10 -10
  30. package/dist/authority/AuthorityType.mjs +13 -13
  31. package/dist/authority/AuthorityType.mjs.map +1 -1
  32. package/dist/authority/AzureRegion.d.ts +1 -1
  33. package/dist/authority/AzureRegionConfiguration.d.ts +5 -5
  34. package/dist/authority/CloudDiscoveryMetadata.d.ts +5 -5
  35. package/dist/authority/CloudInstanceDiscoveryErrorResponse.d.ts +13 -13
  36. package/dist/authority/CloudInstanceDiscoveryErrorResponse.mjs +8 -8
  37. package/dist/authority/CloudInstanceDiscoveryErrorResponse.mjs.map +1 -1
  38. package/dist/authority/CloudInstanceDiscoveryResponse.d.ts +9 -9
  39. package/dist/authority/CloudInstanceDiscoveryResponse.mjs +8 -8
  40. package/dist/authority/CloudInstanceDiscoveryResponse.mjs.map +1 -1
  41. package/dist/authority/ImdsOptions.d.ts +5 -5
  42. package/dist/authority/OIDCOptions.d.ts +8 -8
  43. package/dist/authority/OpenIdConfigResponse.d.ts +11 -11
  44. package/dist/authority/OpenIdConfigResponse.mjs +10 -10
  45. package/dist/authority/OpenIdConfigResponse.mjs.map +1 -1
  46. package/dist/authority/ProtocolMode.d.ts +8 -8
  47. package/dist/authority/ProtocolMode.mjs +11 -11
  48. package/dist/authority/ProtocolMode.mjs.map +1 -1
  49. package/dist/authority/RegionDiscovery.d.ts +32 -30
  50. package/dist/authority/RegionDiscovery.d.ts.map +1 -1
  51. package/dist/authority/RegionDiscovery.mjs +107 -108
  52. package/dist/authority/RegionDiscovery.mjs.map +1 -1
  53. package/dist/authority/RegionDiscoveryMetadata.d.ts +6 -6
  54. package/dist/broker/nativeBroker/INativeBrokerPlugin.d.ts +15 -15
  55. package/dist/cache/CacheManager.d.ts +446 -446
  56. package/dist/cache/CacheManager.d.ts.map +1 -1
  57. package/dist/cache/CacheManager.mjs +1001 -1025
  58. package/dist/cache/CacheManager.mjs.map +1 -1
  59. package/dist/cache/entities/AccessTokenEntity.d.ts +56 -56
  60. package/dist/cache/entities/AccessTokenEntity.d.ts.map +1 -1
  61. package/dist/cache/entities/AccessTokenEntity.mjs +112 -114
  62. package/dist/cache/entities/AccessTokenEntity.mjs.map +1 -1
  63. package/dist/cache/entities/AccountEntity.d.ts +101 -101
  64. package/dist/cache/entities/AccountEntity.d.ts.map +1 -1
  65. package/dist/cache/entities/AccountEntity.mjs +222 -223
  66. package/dist/cache/entities/AccountEntity.mjs.map +1 -1
  67. package/dist/cache/entities/AppMetadataEntity.d.ts +39 -39
  68. package/dist/cache/entities/AppMetadataEntity.mjs +66 -66
  69. package/dist/cache/entities/AppMetadataEntity.mjs.map +1 -1
  70. package/dist/cache/entities/AuthorityMetadataEntity.d.ts +48 -48
  71. package/dist/cache/entities/AuthorityMetadataEntity.mjs +78 -78
  72. package/dist/cache/entities/AuthorityMetadataEntity.mjs.map +1 -1
  73. package/dist/cache/entities/CacheRecord.d.ts +14 -14
  74. package/dist/cache/entities/CacheRecord.mjs +14 -14
  75. package/dist/cache/entities/CacheRecord.mjs.map +1 -1
  76. package/dist/cache/entities/CredentialEntity.d.ts +88 -88
  77. package/dist/cache/entities/CredentialEntity.d.ts.map +1 -1
  78. package/dist/cache/entities/CredentialEntity.mjs +138 -137
  79. package/dist/cache/entities/CredentialEntity.mjs.map +1 -1
  80. package/dist/cache/entities/IdTokenEntity.d.ts +34 -34
  81. package/dist/cache/entities/IdTokenEntity.mjs +56 -56
  82. package/dist/cache/entities/IdTokenEntity.mjs.map +1 -1
  83. package/dist/cache/entities/RefreshTokenEntity.d.ts +36 -36
  84. package/dist/cache/entities/RefreshTokenEntity.mjs +59 -59
  85. package/dist/cache/entities/RefreshTokenEntity.mjs.map +1 -1
  86. package/dist/cache/entities/ServerTelemetryEntity.d.ts +12 -12
  87. package/dist/cache/entities/ServerTelemetryEntity.mjs +27 -27
  88. package/dist/cache/entities/ServerTelemetryEntity.mjs.map +1 -1
  89. package/dist/cache/entities/ThrottlingEntity.d.ts +13 -13
  90. package/dist/cache/entities/ThrottlingEntity.mjs +23 -23
  91. package/dist/cache/entities/ThrottlingEntity.mjs.map +1 -1
  92. package/dist/cache/interface/ICacheManager.d.ts +166 -166
  93. package/dist/cache/interface/ICachePlugin.d.ts +5 -5
  94. package/dist/cache/interface/ISerializableTokenCache.d.ts +4 -4
  95. package/dist/cache/persistence/TokenCacheContext.d.ts +23 -23
  96. package/dist/cache/persistence/TokenCacheContext.mjs +25 -25
  97. package/dist/cache/persistence/TokenCacheContext.mjs.map +1 -1
  98. package/dist/cache/utils/CacheTypes.d.ts +69 -69
  99. package/dist/client/AuthorizationCodeClient.d.ts +73 -73
  100. package/dist/client/AuthorizationCodeClient.d.ts.map +1 -1
  101. package/dist/client/AuthorizationCodeClient.mjs +412 -440
  102. package/dist/client/AuthorizationCodeClient.mjs.map +1 -1
  103. package/dist/client/BaseClient.d.ts +51 -51
  104. package/dist/client/BaseClient.d.ts.map +1 -1
  105. package/dist/client/BaseClient.mjs +101 -94
  106. package/dist/client/BaseClient.mjs.map +1 -1
  107. package/dist/client/RefreshTokenClient.d.ts +35 -35
  108. package/dist/client/RefreshTokenClient.d.ts.map +1 -1
  109. package/dist/client/RefreshTokenClient.mjs +185 -243
  110. package/dist/client/RefreshTokenClient.mjs.map +1 -1
  111. package/dist/client/SilentFlowClient.d.ts +26 -25
  112. package/dist/client/SilentFlowClient.d.ts.map +1 -1
  113. package/dist/client/SilentFlowClient.mjs +128 -104
  114. package/dist/client/SilentFlowClient.mjs.map +1 -1
  115. package/dist/config/AppTokenProvider.d.ts +38 -38
  116. package/dist/config/ClientConfiguration.d.ts +150 -150
  117. package/dist/config/ClientConfiguration.d.ts.map +1 -1
  118. package/dist/config/ClientConfiguration.mjs +99 -100
  119. package/dist/config/ClientConfiguration.mjs.map +1 -1
  120. package/dist/crypto/ICrypto.d.ts +62 -62
  121. package/dist/crypto/ICrypto.d.ts.map +1 -1
  122. package/dist/crypto/ICrypto.mjs +35 -43
  123. package/dist/crypto/ICrypto.mjs.map +1 -1
  124. package/dist/crypto/IGuidGenerator.d.ts +4 -4
  125. package/dist/crypto/JoseHeader.d.ts +22 -22
  126. package/dist/crypto/JoseHeader.d.ts.map +1 -1
  127. package/dist/crypto/JoseHeader.mjs +39 -38
  128. package/dist/crypto/JoseHeader.mjs.map +1 -1
  129. package/dist/crypto/PopTokenGenerator.d.ts +60 -59
  130. package/dist/crypto/PopTokenGenerator.d.ts.map +1 -1
  131. package/dist/crypto/PopTokenGenerator.mjs +83 -83
  132. package/dist/crypto/PopTokenGenerator.mjs.map +1 -1
  133. package/dist/crypto/SignedHttpRequest.d.ts +11 -11
  134. package/dist/error/AuthError.d.ts +44 -47
  135. package/dist/error/AuthError.d.ts.map +1 -1
  136. package/dist/error/AuthError.mjs +50 -52
  137. package/dist/error/AuthError.mjs.map +1 -1
  138. package/dist/error/AuthErrorCodes.d.ts +6 -0
  139. package/dist/error/AuthErrorCodes.d.ts.map +1 -0
  140. package/dist/error/AuthErrorCodes.mjs +14 -0
  141. package/dist/error/AuthErrorCodes.mjs.map +1 -0
  142. package/dist/error/ClientAuthError.d.ts +232 -412
  143. package/dist/error/ClientAuthError.d.ts.map +1 -1
  144. package/dist/error/ClientAuthError.mjs +248 -520
  145. package/dist/error/ClientAuthError.mjs.map +1 -1
  146. package/dist/error/ClientAuthErrorCodes.d.ts +44 -0
  147. package/dist/error/ClientAuthErrorCodes.d.ts.map +1 -0
  148. package/dist/error/ClientAuthErrorCodes.mjs +52 -0
  149. package/dist/error/ClientAuthErrorCodes.mjs.map +1 -0
  150. package/dist/error/ClientConfigurationError.d.ts +128 -222
  151. package/dist/error/ClientConfigurationError.d.ts.map +1 -1
  152. package/dist/error/ClientConfigurationError.mjs +140 -281
  153. package/dist/error/ClientConfigurationError.mjs.map +1 -1
  154. package/dist/error/ClientConfigurationErrorCodes.d.ts +23 -0
  155. package/dist/error/ClientConfigurationErrorCodes.d.ts.map +1 -0
  156. package/dist/error/ClientConfigurationErrorCodes.mjs +31 -0
  157. package/dist/error/ClientConfigurationErrorCodes.mjs.map +1 -0
  158. package/dist/error/InteractionRequiredAuthError.d.ts +57 -59
  159. package/dist/error/InteractionRequiredAuthError.d.ts.map +1 -1
  160. package/dist/error/InteractionRequiredAuthError.mjs +80 -79
  161. package/dist/error/InteractionRequiredAuthError.mjs.map +1 -1
  162. package/dist/error/InteractionRequiredAuthErrorCodes.d.ts +6 -0
  163. package/dist/error/InteractionRequiredAuthErrorCodes.d.ts.map +1 -0
  164. package/dist/error/InteractionRequiredAuthErrorCodes.mjs +16 -0
  165. package/dist/error/InteractionRequiredAuthErrorCodes.mjs.map +1 -0
  166. package/dist/error/JoseHeaderError.d.ts +15 -28
  167. package/dist/error/JoseHeaderError.d.ts.map +1 -1
  168. package/dist/error/JoseHeaderError.mjs +24 -40
  169. package/dist/error/JoseHeaderError.mjs.map +1 -1
  170. package/dist/error/JoseHeaderErrorCodes.d.ts +3 -0
  171. package/dist/error/JoseHeaderErrorCodes.d.ts.map +1 -0
  172. package/dist/error/JoseHeaderErrorCodes.mjs +11 -0
  173. package/dist/error/JoseHeaderErrorCodes.mjs.map +1 -0
  174. package/dist/error/ServerError.d.ts +7 -7
  175. package/dist/error/ServerError.mjs +14 -14
  176. package/dist/error/ServerError.mjs.map +1 -1
  177. package/dist/index.cjs +8727 -8978
  178. package/dist/index.cjs.map +1 -1
  179. package/dist/index.d.ts +96 -96
  180. package/dist/index.d.ts.map +1 -1
  181. package/dist/index.mjs +17 -7
  182. package/dist/index.mjs.map +1 -1
  183. package/dist/logger/Logger.d.ts +95 -95
  184. package/dist/logger/Logger.d.ts.map +1 -1
  185. package/dist/logger/Logger.mjs +188 -198
  186. package/dist/logger/Logger.mjs.map +1 -1
  187. package/dist/network/INetworkModule.d.ts +29 -29
  188. package/dist/network/INetworkModule.d.ts.map +1 -1
  189. package/dist/network/INetworkModule.mjs +14 -15
  190. package/dist/network/INetworkModule.mjs.map +1 -1
  191. package/dist/network/NetworkManager.d.ts +33 -33
  192. package/dist/network/NetworkManager.d.ts.map +1 -1
  193. package/dist/network/NetworkManager.mjs +36 -35
  194. package/dist/network/NetworkManager.mjs.map +1 -1
  195. package/dist/network/RequestThumbprint.d.ts +16 -16
  196. package/dist/network/ThrottlingUtils.d.ts +42 -42
  197. package/dist/network/ThrottlingUtils.mjs +95 -95
  198. package/dist/network/ThrottlingUtils.mjs.map +1 -1
  199. package/dist/packageMetadata.d.ts +2 -2
  200. package/dist/packageMetadata.mjs +4 -4
  201. package/dist/packageMetadata.mjs.map +1 -1
  202. package/dist/request/AuthenticationHeaderParser.d.ts +19 -19
  203. package/dist/request/AuthenticationHeaderParser.d.ts.map +1 -1
  204. package/dist/request/AuthenticationHeaderParser.mjs +58 -57
  205. package/dist/request/AuthenticationHeaderParser.mjs.map +1 -1
  206. package/dist/request/BaseAuthRequest.d.ts +40 -40
  207. package/dist/request/CommonAuthorizationCodeRequest.d.ts +27 -27
  208. package/dist/request/CommonAuthorizationUrlRequest.d.ts +50 -50
  209. package/dist/request/CommonClientCredentialRequest.d.ts +17 -17
  210. package/dist/request/CommonDeviceCodeRequest.d.ts +21 -21
  211. package/dist/request/CommonEndSessionRequest.d.ts +21 -21
  212. package/dist/request/CommonOnBehalfOfRequest.d.ts +13 -13
  213. package/dist/request/CommonRefreshTokenRequest.d.ts +19 -19
  214. package/dist/request/CommonSilentFlowRequest.d.ts +18 -18
  215. package/dist/request/CommonUsernamePasswordRequest.d.ts +17 -17
  216. package/dist/request/NativeRequest.d.ts +19 -19
  217. package/dist/request/NativeSignOutRequest.d.ts +5 -5
  218. package/dist/request/RequestParameterBuilder.d.ts +217 -217
  219. package/dist/request/RequestParameterBuilder.d.ts.map +1 -1
  220. package/dist/request/RequestParameterBuilder.mjs +383 -383
  221. package/dist/request/RequestParameterBuilder.mjs.map +1 -1
  222. package/dist/request/RequestValidator.d.ts +33 -33
  223. package/dist/request/RequestValidator.d.ts.map +1 -1
  224. package/dist/request/RequestValidator.mjs +83 -84
  225. package/dist/request/RequestValidator.mjs.map +1 -1
  226. package/dist/request/ScopeSet.d.ts +88 -88
  227. package/dist/request/ScopeSet.d.ts.map +1 -1
  228. package/dist/request/ScopeSet.mjs +201 -199
  229. package/dist/request/ScopeSet.mjs.map +1 -1
  230. package/dist/request/StoreInCache.d.ts +8 -8
  231. package/dist/response/AuthenticationResult.d.ts +41 -39
  232. package/dist/response/AuthenticationResult.d.ts.map +1 -1
  233. package/dist/response/AuthorizationCodePayload.d.ts +13 -13
  234. package/dist/response/DeviceCodeResponse.d.ts +25 -25
  235. package/dist/response/ExternalTokenResponse.d.ts +15 -15
  236. package/dist/response/IMDSBadResponse.d.ts +4 -4
  237. package/dist/response/ResponseHandler.d.ts +67 -66
  238. package/dist/response/ResponseHandler.d.ts.map +1 -1
  239. package/dist/response/ResponseHandler.mjs +316 -297
  240. package/dist/response/ResponseHandler.mjs.map +1 -1
  241. package/dist/response/ServerAuthorizationCodeResponse.d.ts +25 -25
  242. package/dist/response/ServerAuthorizationTokenResponse.d.ts +46 -44
  243. package/dist/response/ServerAuthorizationTokenResponse.d.ts.map +1 -1
  244. package/dist/telemetry/performance/IPerformanceClient.d.ts +51 -51
  245. package/dist/telemetry/performance/IPerformanceClient.d.ts.map +1 -1
  246. package/dist/telemetry/performance/IPerformanceMeasurement.d.ts +5 -5
  247. package/dist/telemetry/performance/PerformanceClient.d.ts +191 -191
  248. package/dist/telemetry/performance/PerformanceClient.d.ts.map +1 -1
  249. package/dist/telemetry/performance/PerformanceClient.mjs +409 -408
  250. package/dist/telemetry/performance/PerformanceClient.mjs.map +1 -1
  251. package/dist/telemetry/performance/PerformanceEvent.d.ts +433 -426
  252. package/dist/telemetry/performance/PerformanceEvent.d.ts.map +1 -1
  253. package/dist/telemetry/performance/PerformanceEvent.mjs +234 -226
  254. package/dist/telemetry/performance/PerformanceEvent.mjs.map +1 -1
  255. package/dist/telemetry/performance/StubPerformanceClient.d.ts +24 -24
  256. package/dist/telemetry/performance/StubPerformanceClient.d.ts.map +1 -1
  257. package/dist/telemetry/performance/StubPerformanceClient.mjs +77 -57
  258. package/dist/telemetry/performance/StubPerformanceClient.mjs.map +1 -1
  259. package/dist/telemetry/server/ServerTelemetryManager.d.ts +66 -66
  260. package/dist/telemetry/server/ServerTelemetryManager.d.ts.map +1 -1
  261. package/dist/telemetry/server/ServerTelemetryManager.mjs +197 -198
  262. package/dist/telemetry/server/ServerTelemetryManager.mjs.map +1 -1
  263. package/dist/telemetry/server/ServerTelemetryRequest.d.ts +8 -8
  264. package/dist/url/IUri.d.ts +12 -12
  265. package/dist/url/UrlString.d.ts +83 -83
  266. package/dist/url/UrlString.d.ts.map +1 -1
  267. package/dist/url/UrlString.mjs +283 -283
  268. package/dist/url/UrlString.mjs.map +1 -1
  269. package/dist/utils/Constants.d.ts +366 -353
  270. package/dist/utils/Constants.d.ts.map +1 -1
  271. package/dist/utils/Constants.mjs +377 -360
  272. package/dist/utils/Constants.mjs.map +1 -1
  273. package/dist/utils/FunctionWrappers.d.ts +28 -0
  274. package/dist/utils/FunctionWrappers.d.ts.map +1 -0
  275. package/dist/utils/FunctionWrappers.mjs +90 -0
  276. package/dist/utils/FunctionWrappers.mjs.map +1 -0
  277. package/dist/utils/MsalTypes.d.ts +6 -6
  278. package/dist/utils/ProtocolUtils.d.ts +42 -42
  279. package/dist/utils/ProtocolUtils.d.ts.map +1 -1
  280. package/dist/utils/ProtocolUtils.mjs +71 -73
  281. package/dist/utils/ProtocolUtils.mjs.map +1 -1
  282. package/dist/utils/StringUtils.d.ts +40 -53
  283. package/dist/utils/StringUtils.d.ts.map +1 -1
  284. package/dist/utils/StringUtils.mjs +95 -126
  285. package/dist/utils/StringUtils.mjs.map +1 -1
  286. package/dist/utils/TimeUtils.d.ts +27 -27
  287. package/dist/utils/TimeUtils.mjs +45 -45
  288. package/dist/utils/TimeUtils.mjs.map +1 -1
  289. package/package.json +6 -4
  290. package/src/account/AccountInfo.ts +44 -0
  291. package/src/account/AuthToken.ts +71 -0
  292. package/src/account/CcsCredential.ts +16 -0
  293. package/src/account/ClientCredentials.ts +20 -0
  294. package/src/account/ClientInfo.ts +67 -0
  295. package/src/account/TokenClaims.ts +70 -0
  296. package/src/authority/Authority.ts +1207 -0
  297. package/src/authority/AuthorityFactory.ts +118 -0
  298. package/src/authority/AuthorityMetadata.ts +953 -0
  299. package/src/authority/AuthorityOptions.ts +40 -0
  300. package/src/authority/AuthorityType.ts +15 -0
  301. package/src/authority/AzureRegion.ts +7 -0
  302. package/src/authority/AzureRegionConfiguration.ts +16 -0
  303. package/src/authority/CloudDiscoveryMetadata.ts +10 -0
  304. package/src/authority/CloudInstanceDiscoveryErrorResponse.ts +26 -0
  305. package/src/authority/CloudInstanceDiscoveryResponse.ts +21 -0
  306. package/src/authority/ImdsOptions.ts +10 -0
  307. package/src/authority/OIDCOptions.ts +14 -0
  308. package/src/authority/OpenIdConfigResponse.ts +24 -0
  309. package/src/authority/ProtocolMode.ts +13 -0
  310. package/src/authority/RegionDiscovery.ts +196 -0
  311. package/src/authority/RegionDiscoveryMetadata.ts +15 -0
  312. package/src/broker/nativeBroker/INativeBrokerPlugin.ts +29 -0
  313. package/src/cache/CacheManager.ts +1579 -0
  314. package/src/cache/entities/AccessTokenEntity.ts +167 -0
  315. package/src/cache/entities/AccountEntity.ts +314 -0
  316. package/src/cache/entities/AppMetadataEntity.ts +91 -0
  317. package/src/cache/entities/AuthorityMetadataEntity.ts +112 -0
  318. package/src/cache/entities/CacheRecord.ts +33 -0
  319. package/src/cache/entities/CredentialEntity.ts +220 -0
  320. package/src/cache/entities/IdTokenEntity.ts +74 -0
  321. package/src/cache/entities/RefreshTokenEntity.ts +78 -0
  322. package/src/cache/entities/ServerTelemetryEntity.ts +38 -0
  323. package/src/cache/entities/ThrottlingEntity.ts +36 -0
  324. package/src/cache/interface/ICacheManager.ts +218 -0
  325. package/src/cache/interface/ICachePlugin.ts +11 -0
  326. package/src/cache/interface/ISerializableTokenCache.ts +9 -0
  327. package/src/cache/persistence/TokenCacheContext.ts +39 -0
  328. package/src/cache/utils/CacheTypes.ts +93 -0
  329. package/src/client/AuthorizationCodeClient.ts +736 -0
  330. package/src/client/BaseClient.ts +208 -0
  331. package/src/client/RefreshTokenClient.ts +399 -0
  332. package/src/client/SilentFlowClient.ts +239 -0
  333. package/src/config/AppTokenProvider.ts +47 -0
  334. package/src/config/ClientConfiguration.ts +286 -0
  335. package/src/crypto/ICrypto.ts +112 -0
  336. package/src/crypto/IGuidGenerator.ts +9 -0
  337. package/src/crypto/JoseHeader.ts +58 -0
  338. package/src/crypto/PopTokenGenerator.ts +160 -0
  339. package/src/crypto/SignedHttpRequest.ts +16 -0
  340. package/src/error/AuthError.ts +83 -0
  341. package/src/error/AuthErrorCodes.ts +10 -0
  342. package/src/error/ClientAuthError.ts +333 -0
  343. package/src/error/ClientAuthErrorCodes.ts +51 -0
  344. package/src/error/ClientConfigurationError.ts +210 -0
  345. package/src/error/ClientConfigurationErrorCodes.ts +28 -0
  346. package/src/error/InteractionRequiredAuthError.ts +139 -0
  347. package/src/error/InteractionRequiredAuthErrorCodes.ts +13 -0
  348. package/src/error/JoseHeaderError.ts +32 -0
  349. package/src/error/JoseHeaderErrorCodes.ts +7 -0
  350. package/src/error/ServerError.ts +18 -0
  351. package/src/index.ts +226 -0
  352. package/src/logger/Logger.ts +272 -0
  353. package/src/network/INetworkModule.ts +60 -0
  354. package/src/network/NetworkManager.ts +76 -0
  355. package/src/network/RequestThumbprint.ts +22 -0
  356. package/src/network/ThrottlingUtils.ts +156 -0
  357. package/src/packageMetadata.ts +3 -0
  358. package/src/request/AuthenticationHeaderParser.ts +92 -0
  359. package/src/request/BaseAuthRequest.ts +46 -0
  360. package/src/request/CommonAuthorizationCodeRequest.ts +33 -0
  361. package/src/request/CommonAuthorizationUrlRequest.ts +56 -0
  362. package/src/request/CommonClientCredentialRequest.ts +23 -0
  363. package/src/request/CommonDeviceCodeRequest.ts +31 -0
  364. package/src/request/CommonEndSessionRequest.ts +27 -0
  365. package/src/request/CommonOnBehalfOfRequest.ts +19 -0
  366. package/src/request/CommonRefreshTokenRequest.ts +25 -0
  367. package/src/request/CommonSilentFlowRequest.ts +24 -0
  368. package/src/request/CommonUsernamePasswordRequest.ts +23 -0
  369. package/src/request/NativeRequest.ts +25 -0
  370. package/src/request/NativeSignOutRequest.ts +10 -0
  371. package/src/request/RequestParameterBuilder.ts +613 -0
  372. package/src/request/RequestValidator.ts +116 -0
  373. package/src/request/ScopeSet.ts +246 -0
  374. package/src/request/StoreInCache.ts +16 -0
  375. package/src/response/AuthenticationResult.ts +47 -0
  376. package/src/response/AuthorizationCodePayload.ts +18 -0
  377. package/src/response/DeviceCodeResponse.ts +31 -0
  378. package/src/response/ExternalTokenResponse.ts +24 -0
  379. package/src/response/IMDSBadResponse.ts +9 -0
  380. package/src/response/ResponseHandler.ts +634 -0
  381. package/src/response/ServerAuthorizationCodeResponse.ts +33 -0
  382. package/src/response/ServerAuthorizationTokenResponse.ts +54 -0
  383. package/src/telemetry/performance/IPerformanceClient.ts +71 -0
  384. package/src/telemetry/performance/IPerformanceMeasurement.ts +10 -0
  385. package/src/telemetry/performance/PerformanceClient.ts +636 -0
  386. package/src/telemetry/performance/PerformanceEvent.ts +542 -0
  387. package/src/telemetry/performance/StubPerformanceClient.ts +101 -0
  388. package/src/telemetry/server/ServerTelemetryManager.ts +274 -0
  389. package/src/telemetry/server/ServerTelemetryRequest.ts +13 -0
  390. package/src/url/IUri.ts +17 -0
  391. package/src/url/UrlString.ts +373 -0
  392. package/src/utils/Constants.ts +444 -0
  393. package/src/utils/FunctionWrappers.ts +105 -0
  394. package/src/utils/MsalTypes.ts +9 -0
  395. package/src/utils/ProtocolUtils.ts +120 -0
  396. package/src/utils/StringUtils.ts +106 -0
  397. package/src/utils/TimeUtils.ts +51 -0
  398. package/dist/account/DecodedAuthToken.d.ts +0 -9
  399. package/dist/account/DecodedAuthToken.d.ts.map +0 -1
@@ -0,0 +1,274 @@
1
+ /*
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import {
7
+ SERVER_TELEM_CONSTANTS,
8
+ Separators,
9
+ CacheOutcome,
10
+ Constants,
11
+ RegionDiscoverySources,
12
+ RegionDiscoveryOutcomes,
13
+ } from "../../utils/Constants";
14
+ import { CacheManager } from "../../cache/CacheManager";
15
+ import { AuthError } from "../../error/AuthError";
16
+ import { ServerTelemetryRequest } from "./ServerTelemetryRequest";
17
+ import { ServerTelemetryEntity } from "../../cache/entities/ServerTelemetryEntity";
18
+ import { RegionDiscoveryMetadata } from "../../authority/RegionDiscoveryMetadata";
19
+
20
+ /** @internal */
21
+ export class ServerTelemetryManager {
22
+ private cacheManager: CacheManager;
23
+ private apiId: number;
24
+ private correlationId: string;
25
+ private telemetryCacheKey: string;
26
+ private wrapperSKU: String;
27
+ private wrapperVer: String;
28
+ private regionUsed: string | undefined;
29
+ private regionSource: RegionDiscoverySources | undefined;
30
+ private regionOutcome: RegionDiscoveryOutcomes | undefined;
31
+ private cacheOutcome: CacheOutcome = CacheOutcome.NOT_APPLICABLE;
32
+
33
+ constructor(
34
+ telemetryRequest: ServerTelemetryRequest,
35
+ cacheManager: CacheManager
36
+ ) {
37
+ this.cacheManager = cacheManager;
38
+ this.apiId = telemetryRequest.apiId;
39
+ this.correlationId = telemetryRequest.correlationId;
40
+ this.wrapperSKU = telemetryRequest.wrapperSKU || Constants.EMPTY_STRING;
41
+ this.wrapperVer = telemetryRequest.wrapperVer || Constants.EMPTY_STRING;
42
+
43
+ this.telemetryCacheKey =
44
+ SERVER_TELEM_CONSTANTS.CACHE_KEY +
45
+ Separators.CACHE_KEY_SEPARATOR +
46
+ telemetryRequest.clientId;
47
+ }
48
+
49
+ /**
50
+ * API to add MSER Telemetry to request
51
+ */
52
+ generateCurrentRequestHeaderValue(): string {
53
+ const request = `${this.apiId}${SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR}${this.cacheOutcome}`;
54
+ const platformFields = [this.wrapperSKU, this.wrapperVer].join(
55
+ SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR
56
+ );
57
+ const regionDiscoveryFields = this.getRegionDiscoveryFields();
58
+ const requestWithRegionDiscoveryFields = [
59
+ request,
60
+ regionDiscoveryFields,
61
+ ].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
62
+
63
+ return [
64
+ SERVER_TELEM_CONSTANTS.SCHEMA_VERSION,
65
+ requestWithRegionDiscoveryFields,
66
+ platformFields,
67
+ ].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR);
68
+ }
69
+
70
+ /**
71
+ * API to add MSER Telemetry for the last failed request
72
+ */
73
+ generateLastRequestHeaderValue(): string {
74
+ const lastRequests = this.getLastRequests();
75
+
76
+ const maxErrors = ServerTelemetryManager.maxErrorsToSend(lastRequests);
77
+ const failedRequests = lastRequests.failedRequests
78
+ .slice(0, 2 * maxErrors)
79
+ .join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
80
+ const errors = lastRequests.errors
81
+ .slice(0, maxErrors)
82
+ .join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);
83
+ const errorCount = lastRequests.errors.length;
84
+
85
+ // Indicate whether this header contains all data or partial data
86
+ const overflow =
87
+ maxErrors < errorCount
88
+ ? SERVER_TELEM_CONSTANTS.OVERFLOW_TRUE
89
+ : SERVER_TELEM_CONSTANTS.OVERFLOW_FALSE;
90
+ const platformFields = [errorCount, overflow].join(
91
+ SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR
92
+ );
93
+
94
+ return [
95
+ SERVER_TELEM_CONSTANTS.SCHEMA_VERSION,
96
+ lastRequests.cacheHits,
97
+ failedRequests,
98
+ errors,
99
+ platformFields,
100
+ ].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR);
101
+ }
102
+
103
+ /**
104
+ * API to cache token failures for MSER data capture
105
+ * @param error
106
+ */
107
+ cacheFailedRequest(error: unknown): void {
108
+ const lastRequests = this.getLastRequests();
109
+ if (
110
+ lastRequests.errors.length >=
111
+ SERVER_TELEM_CONSTANTS.MAX_CACHED_ERRORS
112
+ ) {
113
+ // Remove a cached error to make room, first in first out
114
+ lastRequests.failedRequests.shift(); // apiId
115
+ lastRequests.failedRequests.shift(); // correlationId
116
+ lastRequests.errors.shift();
117
+ }
118
+
119
+ lastRequests.failedRequests.push(this.apiId, this.correlationId);
120
+
121
+ if (error instanceof Error && !!error && error.toString()) {
122
+ if (error instanceof AuthError) {
123
+ if (error.subError) {
124
+ lastRequests.errors.push(error.subError);
125
+ } else if (error.errorCode) {
126
+ lastRequests.errors.push(error.errorCode);
127
+ } else {
128
+ lastRequests.errors.push(error.toString());
129
+ }
130
+ } else {
131
+ lastRequests.errors.push(error.toString());
132
+ }
133
+ } else {
134
+ lastRequests.errors.push(SERVER_TELEM_CONSTANTS.UNKNOWN_ERROR);
135
+ }
136
+
137
+ this.cacheManager.setServerTelemetry(
138
+ this.telemetryCacheKey,
139
+ lastRequests
140
+ );
141
+
142
+ return;
143
+ }
144
+
145
+ /**
146
+ * Update server telemetry cache entry by incrementing cache hit counter
147
+ */
148
+ incrementCacheHits(): number {
149
+ const lastRequests = this.getLastRequests();
150
+ lastRequests.cacheHits += 1;
151
+
152
+ this.cacheManager.setServerTelemetry(
153
+ this.telemetryCacheKey,
154
+ lastRequests
155
+ );
156
+ return lastRequests.cacheHits;
157
+ }
158
+
159
+ /**
160
+ * Get the server telemetry entity from cache or initialize a new one
161
+ */
162
+ getLastRequests(): ServerTelemetryEntity {
163
+ const initialValue: ServerTelemetryEntity = new ServerTelemetryEntity();
164
+ const lastRequests = this.cacheManager.getServerTelemetry(
165
+ this.telemetryCacheKey
166
+ ) as ServerTelemetryEntity;
167
+
168
+ return lastRequests || initialValue;
169
+ }
170
+
171
+ /**
172
+ * Remove server telemetry cache entry
173
+ */
174
+ clearTelemetryCache(): void {
175
+ const lastRequests = this.getLastRequests();
176
+ const numErrorsFlushed =
177
+ ServerTelemetryManager.maxErrorsToSend(lastRequests);
178
+ const errorCount = lastRequests.errors.length;
179
+ if (numErrorsFlushed === errorCount) {
180
+ // All errors were sent on last request, clear Telemetry cache
181
+ this.cacheManager.removeItem(this.telemetryCacheKey);
182
+ } else {
183
+ // Partial data was flushed to server, construct a new telemetry cache item with errors that were not flushed
184
+ const serverTelemEntity = new ServerTelemetryEntity();
185
+ serverTelemEntity.failedRequests =
186
+ lastRequests.failedRequests.slice(numErrorsFlushed * 2); // failedRequests contains 2 items for each error
187
+ serverTelemEntity.errors =
188
+ lastRequests.errors.slice(numErrorsFlushed);
189
+
190
+ this.cacheManager.setServerTelemetry(
191
+ this.telemetryCacheKey,
192
+ serverTelemEntity
193
+ );
194
+ }
195
+ }
196
+
197
+ /**
198
+ * Returns the maximum number of errors that can be flushed to the server in the next network request
199
+ * @param serverTelemetryEntity
200
+ */
201
+ static maxErrorsToSend(
202
+ serverTelemetryEntity: ServerTelemetryEntity
203
+ ): number {
204
+ let i;
205
+ let maxErrors = 0;
206
+ let dataSize = 0;
207
+ const errorCount = serverTelemetryEntity.errors.length;
208
+ for (i = 0; i < errorCount; i++) {
209
+ // failedRequests parameter contains pairs of apiId and correlationId, multiply index by 2 to preserve pairs
210
+ const apiId =
211
+ serverTelemetryEntity.failedRequests[2 * i] ||
212
+ Constants.EMPTY_STRING;
213
+ const correlationId =
214
+ serverTelemetryEntity.failedRequests[2 * i + 1] ||
215
+ Constants.EMPTY_STRING;
216
+ const errorCode =
217
+ serverTelemetryEntity.errors[i] || Constants.EMPTY_STRING;
218
+
219
+ // Count number of characters that would be added to header, each character is 1 byte. Add 3 at the end to account for separators
220
+ dataSize +=
221
+ apiId.toString().length +
222
+ correlationId.toString().length +
223
+ errorCode.length +
224
+ 3;
225
+
226
+ if (dataSize < SERVER_TELEM_CONSTANTS.MAX_LAST_HEADER_BYTES) {
227
+ // Adding this entry to the header would still keep header size below the limit
228
+ maxErrors += 1;
229
+ } else {
230
+ break;
231
+ }
232
+ }
233
+
234
+ return maxErrors;
235
+ }
236
+
237
+ /**
238
+ * Get the region discovery fields
239
+ *
240
+ * @returns string
241
+ */
242
+ getRegionDiscoveryFields(): string {
243
+ const regionDiscoveryFields: string[] = [];
244
+
245
+ regionDiscoveryFields.push(this.regionUsed || Constants.EMPTY_STRING);
246
+ regionDiscoveryFields.push(this.regionSource || Constants.EMPTY_STRING);
247
+ regionDiscoveryFields.push(
248
+ this.regionOutcome || Constants.EMPTY_STRING
249
+ );
250
+
251
+ return regionDiscoveryFields.join(",");
252
+ }
253
+
254
+ /**
255
+ * Update the region discovery metadata
256
+ *
257
+ * @param regionDiscoveryMetadata
258
+ * @returns void
259
+ */
260
+ updateRegionDiscoveryMetadata(
261
+ regionDiscoveryMetadata: RegionDiscoveryMetadata
262
+ ): void {
263
+ this.regionUsed = regionDiscoveryMetadata.region_used;
264
+ this.regionSource = regionDiscoveryMetadata.region_source;
265
+ this.regionOutcome = regionDiscoveryMetadata.region_outcome;
266
+ }
267
+
268
+ /**
269
+ * Set cache outcome
270
+ */
271
+ setCacheOutcome(cacheOutcome: CacheOutcome): void {
272
+ this.cacheOutcome = cacheOutcome;
273
+ }
274
+ }
@@ -0,0 +1,13 @@
1
+ /*
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ export type ServerTelemetryRequest = {
7
+ clientId: string;
8
+ apiId: number;
9
+ correlationId: string;
10
+ forceRefresh?: boolean;
11
+ wrapperSKU?: string;
12
+ wrapperVer?: string;
13
+ };
@@ -0,0 +1,17 @@
1
+ /*
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ /**
7
+ * Interface which describes URI components.
8
+ */
9
+ export interface IUri {
10
+ Protocol: string;
11
+ HostNameAndPort: string;
12
+ AbsolutePath: string;
13
+ Search: string;
14
+ Hash: string;
15
+ PathSegments: string[];
16
+ QueryString: string;
17
+ }
@@ -0,0 +1,373 @@
1
+ /*
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import { ServerAuthorizationCodeResponse } from "../response/ServerAuthorizationCodeResponse";
7
+ import {
8
+ createClientConfigurationError,
9
+ ClientConfigurationErrorCodes,
10
+ } from "../error/ClientConfigurationError";
11
+ import {
12
+ ClientAuthErrorCodes,
13
+ createClientAuthError,
14
+ } from "../error/ClientAuthError";
15
+ import { StringUtils } from "../utils/StringUtils";
16
+ import { IUri } from "./IUri";
17
+ import {
18
+ AADAuthorityConstants,
19
+ Constants,
20
+ ServerResponseType,
21
+ } from "../utils/Constants";
22
+
23
+ /**
24
+ * Url object class which can perform various transformations on url strings.
25
+ */
26
+ export class UrlString {
27
+ // internal url string field
28
+ private _urlString: string;
29
+ public get urlString(): string {
30
+ return this._urlString;
31
+ }
32
+
33
+ constructor(url: string) {
34
+ this._urlString = url;
35
+ if (!this._urlString) {
36
+ // Throws error if url is empty
37
+ throw createClientConfigurationError(
38
+ ClientConfigurationErrorCodes.urlEmptyError
39
+ );
40
+ }
41
+
42
+ if (!this.getHash()) {
43
+ this._urlString = UrlString.canonicalizeUri(url);
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Ensure urls are lower case and end with a / character.
49
+ * @param url
50
+ */
51
+ static canonicalizeUri(url: string): string {
52
+ if (url) {
53
+ let lowerCaseUrl = url.toLowerCase();
54
+
55
+ if (StringUtils.endsWith(lowerCaseUrl, "?")) {
56
+ lowerCaseUrl = lowerCaseUrl.slice(0, -1);
57
+ } else if (StringUtils.endsWith(lowerCaseUrl, "?/")) {
58
+ lowerCaseUrl = lowerCaseUrl.slice(0, -2);
59
+ }
60
+
61
+ if (!StringUtils.endsWith(lowerCaseUrl, "/")) {
62
+ lowerCaseUrl += "/";
63
+ }
64
+
65
+ return lowerCaseUrl;
66
+ }
67
+
68
+ return url;
69
+ }
70
+
71
+ /**
72
+ * Throws if urlString passed is not a valid authority URI string.
73
+ */
74
+ validateAsUri(): void {
75
+ // Attempts to parse url for uri components
76
+ let components;
77
+ try {
78
+ components = this.getUrlComponents();
79
+ } catch (e) {
80
+ throw createClientConfigurationError(
81
+ ClientConfigurationErrorCodes.urlParseError
82
+ );
83
+ }
84
+
85
+ // Throw error if URI or path segments are not parseable.
86
+ if (!components.HostNameAndPort || !components.PathSegments) {
87
+ throw createClientConfigurationError(
88
+ ClientConfigurationErrorCodes.urlParseError
89
+ );
90
+ }
91
+
92
+ // Throw error if uri is insecure.
93
+ if (
94
+ !components.Protocol ||
95
+ components.Protocol.toLowerCase() !== "https:"
96
+ ) {
97
+ throw createClientConfigurationError(
98
+ ClientConfigurationErrorCodes.authorityUriInsecure
99
+ );
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Given a url and a query string return the url with provided query string appended
105
+ * @param url
106
+ * @param queryString
107
+ */
108
+ static appendQueryString(url: string, queryString: string): string {
109
+ if (!queryString) {
110
+ return url;
111
+ }
112
+
113
+ return url.indexOf("?") < 0
114
+ ? `${url}?${queryString}`
115
+ : `${url}&${queryString}`;
116
+ }
117
+
118
+ /**
119
+ * Returns a url with the hash removed
120
+ * @param url
121
+ */
122
+ static removeHashFromUrl(url: string): string {
123
+ return UrlString.canonicalizeUri(url.split("#")[0]);
124
+ }
125
+
126
+ /**
127
+ * Given a url like https://a:b/common/d?e=f#g, and a tenantId, returns https://a:b/tenantId/d
128
+ * @param href The url
129
+ * @param tenantId The tenant id to replace
130
+ */
131
+ replaceTenantPath(tenantId: string): UrlString {
132
+ const urlObject = this.getUrlComponents();
133
+ const pathArray = urlObject.PathSegments;
134
+ if (
135
+ tenantId &&
136
+ pathArray.length !== 0 &&
137
+ (pathArray[0] === AADAuthorityConstants.COMMON ||
138
+ pathArray[0] === AADAuthorityConstants.ORGANIZATIONS)
139
+ ) {
140
+ pathArray[0] = tenantId;
141
+ }
142
+ return UrlString.constructAuthorityUriFromObject(urlObject);
143
+ }
144
+
145
+ /**
146
+ * Returns the anchor part(#) of the URL
147
+ */
148
+ getHash(): string {
149
+ return UrlString.parseHash(this.urlString);
150
+ }
151
+
152
+ /**
153
+ * Parses out the components from a url string.
154
+ * @returns An object with the various components. Please cache this value insted of calling this multiple times on the same url.
155
+ */
156
+ getUrlComponents(): IUri {
157
+ // https://gist.github.com/curtisz/11139b2cfcaef4a261e0
158
+ const regEx = RegExp(
159
+ "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?"
160
+ );
161
+
162
+ // If url string does not match regEx, we throw an error
163
+ const match = this.urlString.match(regEx);
164
+ if (!match) {
165
+ throw createClientConfigurationError(
166
+ ClientConfigurationErrorCodes.urlParseError
167
+ );
168
+ }
169
+
170
+ // Url component object
171
+ const urlComponents = {
172
+ Protocol: match[1],
173
+ HostNameAndPort: match[4],
174
+ AbsolutePath: match[5],
175
+ QueryString: match[7],
176
+ } as IUri;
177
+
178
+ let pathSegments = urlComponents.AbsolutePath.split("/");
179
+ pathSegments = pathSegments.filter((val) => val && val.length > 0); // remove empty elements
180
+ urlComponents.PathSegments = pathSegments;
181
+
182
+ if (
183
+ urlComponents.QueryString &&
184
+ urlComponents.QueryString.endsWith("/")
185
+ ) {
186
+ urlComponents.QueryString = urlComponents.QueryString.substring(
187
+ 0,
188
+ urlComponents.QueryString.length - 1
189
+ );
190
+ }
191
+ return urlComponents;
192
+ }
193
+
194
+ static getDomainFromUrl(url: string): string {
195
+ const regEx = RegExp("^([^:/?#]+://)?([^/?#]*)");
196
+
197
+ const match = url.match(regEx);
198
+
199
+ if (!match) {
200
+ throw createClientConfigurationError(
201
+ ClientConfigurationErrorCodes.urlParseError
202
+ );
203
+ }
204
+
205
+ return match[2];
206
+ }
207
+
208
+ static getAbsoluteUrl(relativeUrl: string, baseUrl: string): string {
209
+ if (relativeUrl[0] === Constants.FORWARD_SLASH) {
210
+ const url = new UrlString(baseUrl);
211
+ const baseComponents = url.getUrlComponents();
212
+
213
+ return (
214
+ baseComponents.Protocol +
215
+ "//" +
216
+ baseComponents.HostNameAndPort +
217
+ relativeUrl
218
+ );
219
+ }
220
+
221
+ return relativeUrl;
222
+ }
223
+
224
+ /**
225
+ * Parses hash string from given string. Returns empty string if no hash symbol is found.
226
+ * @param hashString
227
+ */
228
+ static parseHash(hashString: string): string {
229
+ const hashIndex1 = hashString.indexOf("#");
230
+ const hashIndex2 = hashString.indexOf("#/");
231
+ if (hashIndex2 > -1) {
232
+ return hashString.substring(hashIndex2 + 2);
233
+ } else if (hashIndex1 > -1) {
234
+ return hashString.substring(hashIndex1 + 1);
235
+ }
236
+ return Constants.EMPTY_STRING;
237
+ }
238
+
239
+ /**
240
+ * Parses query string from given string. Returns empty string if no query symbol is found.
241
+ * @param queryString
242
+ */
243
+ static parseQueryString(queryString: string): string {
244
+ const queryIndex1 = queryString.indexOf("?");
245
+ const queryIndex2 = queryString.indexOf("/?");
246
+ if (queryIndex2 > -1) {
247
+ return queryString.substring(queryIndex2 + 2);
248
+ } else if (queryIndex1 > -1) {
249
+ return queryString.substring(queryIndex1 + 1);
250
+ }
251
+ return Constants.EMPTY_STRING;
252
+ }
253
+
254
+ /**
255
+ * Parses query server response string from given string.
256
+ * Extract hash between '?code=' and '#' if trailing '# is present.
257
+ * Returns empty string if no query symbol is found.
258
+ * @param queryString
259
+ */
260
+ static parseQueryServerResponse(queryString: string): string {
261
+ const queryIndex1 = queryString.indexOf("?code");
262
+ const queryIndex2 = queryString.indexOf("/?code");
263
+ const hashIndex = queryString.indexOf("#");
264
+ if (queryIndex2 > -1 && hashIndex > -1) {
265
+ return queryString.substring(queryIndex2 + 2, hashIndex);
266
+ } else if (queryIndex2 > -1) {
267
+ return queryString.substring(queryIndex2 + 2);
268
+ } else if (queryIndex1 > -1 && hashIndex > -1) {
269
+ return queryString.substring(queryIndex1 + 1, hashIndex);
270
+ } else if (queryIndex1 > -1) {
271
+ return queryString.substring(queryIndex1 + 1);
272
+ }
273
+ return Constants.EMPTY_STRING;
274
+ }
275
+
276
+ static constructAuthorityUriFromObject(urlObject: IUri): UrlString {
277
+ return new UrlString(
278
+ urlObject.Protocol +
279
+ "//" +
280
+ urlObject.HostNameAndPort +
281
+ "/" +
282
+ urlObject.PathSegments.join("/")
283
+ );
284
+ }
285
+
286
+ /**
287
+ * Returns URL hash as server auth code response object.
288
+ */
289
+ static getDeserializedHash(hash: string): ServerAuthorizationCodeResponse {
290
+ // Check if given hash is empty
291
+ if (!hash) {
292
+ return {};
293
+ }
294
+ // Strip the # symbol if present
295
+ const parsedHash = UrlString.parseHash(hash);
296
+ // If # symbol was not present, above will return empty string, so give original hash value
297
+ const deserializedHash: ServerAuthorizationCodeResponse =
298
+ StringUtils.queryStringToObject<ServerAuthorizationCodeResponse>(
299
+ parsedHash || hash
300
+ );
301
+ // Check if deserialization didn't work
302
+ if (!deserializedHash) {
303
+ throw createClientAuthError(
304
+ ClientAuthErrorCodes.hashNotDeserialized
305
+ );
306
+ }
307
+ return deserializedHash;
308
+ }
309
+
310
+ /**
311
+ * Returns URL query string as server auth code response object.
312
+ */
313
+ static getDeserializedQueryString(
314
+ query: string
315
+ ): ServerAuthorizationCodeResponse {
316
+ // Check if given query is empty
317
+ if (!query) {
318
+ return {};
319
+ }
320
+ // Strip the ? symbol if present
321
+ const parsedQueryString = UrlString.parseQueryString(query);
322
+ // If ? symbol was not present, above will return empty string, so give original query value
323
+ const deserializedQueryString: ServerAuthorizationCodeResponse =
324
+ StringUtils.queryStringToObject<ServerAuthorizationCodeResponse>(
325
+ parsedQueryString || query
326
+ );
327
+ // Check if deserialization didn't work
328
+ if (!deserializedQueryString) {
329
+ throw createClientAuthError(
330
+ ClientAuthErrorCodes.hashNotDeserialized
331
+ );
332
+ }
333
+ return deserializedQueryString;
334
+ }
335
+ /**
336
+ * Returns either deserialized query string or deserialized hash, depending on the serverResponseType
337
+ * as a server auth code response object.
338
+ */
339
+ static getDeserializedCodeResponse(
340
+ serverResponseType: ServerResponseType | undefined,
341
+ hashFragment: string
342
+ ): ServerAuthorizationCodeResponse {
343
+ const hashUrlString = new UrlString(hashFragment);
344
+ let serverParams: ServerAuthorizationCodeResponse;
345
+ if (serverResponseType === ServerResponseType.QUERY) {
346
+ serverParams = UrlString.getDeserializedQueryString(hashFragment);
347
+ } else {
348
+ serverParams = UrlString.getDeserializedHash(
349
+ hashUrlString.getHash()
350
+ );
351
+ }
352
+ return serverParams;
353
+ }
354
+
355
+ /**
356
+ * Check if the hash of the URL string contains known properties
357
+ */
358
+ static hashContainsKnownProperties(hash: string): boolean {
359
+ if (!hash || hash.indexOf("=") < 0) {
360
+ // Hash doesn't contain key/value pairs
361
+ return false;
362
+ }
363
+
364
+ const parameters: ServerAuthorizationCodeResponse =
365
+ UrlString.getDeserializedHash(hash);
366
+ return !!(
367
+ parameters.code ||
368
+ parameters.error_description ||
369
+ parameters.error ||
370
+ parameters.state
371
+ );
372
+ }
373
+ }