@itwin/core-frontend 5.13.0-dev.8 → 5.14.0-dev.1

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 (201) hide show
  1. package/CHANGELOG.md +35 -1
  2. package/lib/cjs/BriefcaseTxns.d.ts +9 -0
  3. package/lib/cjs/BriefcaseTxns.d.ts.map +1 -1
  4. package/lib/cjs/BriefcaseTxns.js +9 -0
  5. package/lib/cjs/BriefcaseTxns.js.map +1 -1
  6. package/lib/cjs/EmphasizeElements.d.ts +4 -1
  7. package/lib/cjs/EmphasizeElements.d.ts.map +1 -1
  8. package/lib/cjs/EmphasizeElements.js +16 -9
  9. package/lib/cjs/EmphasizeElements.js.map +1 -1
  10. package/lib/cjs/IModelApp.d.ts +11 -1
  11. package/lib/cjs/IModelApp.d.ts.map +1 -1
  12. package/lib/cjs/IModelApp.js +14 -1
  13. package/lib/cjs/IModelApp.js.map +1 -1
  14. package/lib/cjs/IModeljs-css.d.ts.map +1 -1
  15. package/lib/cjs/IModeljs-css.js +4 -2
  16. package/lib/cjs/IModeljs-css.js.map +1 -1
  17. package/lib/cjs/RealityDataSource.d.ts.map +1 -1
  18. package/lib/cjs/RealityDataSource.js +7 -4
  19. package/lib/cjs/RealityDataSource.js.map +1 -1
  20. package/lib/cjs/TxnEntityChanges.d.ts +4 -18
  21. package/lib/cjs/TxnEntityChanges.d.ts.map +1 -1
  22. package/lib/cjs/TxnEntityChanges.js.map +1 -1
  23. package/lib/cjs/ViewManager.d.ts +3 -0
  24. package/lib/cjs/ViewManager.d.ts.map +1 -1
  25. package/lib/cjs/ViewManager.js +9 -1
  26. package/lib/cjs/ViewManager.js.map +1 -1
  27. package/lib/cjs/Viewport.d.ts +7 -1
  28. package/lib/cjs/Viewport.d.ts.map +1 -1
  29. package/lib/cjs/Viewport.js +13 -1
  30. package/lib/cjs/Viewport.js.map +1 -1
  31. package/lib/cjs/core-frontend.d.ts +7 -1
  32. package/lib/cjs/core-frontend.d.ts.map +1 -1
  33. package/lib/cjs/core-frontend.js.map +1 -1
  34. package/lib/cjs/internal/GoogleMapsDecorator.js +1 -1
  35. package/lib/cjs/internal/GoogleMapsDecorator.js.map +1 -1
  36. package/lib/cjs/internal/tile/OrbitGtTileTree.d.ts +11 -1
  37. package/lib/cjs/internal/tile/OrbitGtTileTree.d.ts.map +1 -1
  38. package/lib/cjs/internal/tile/OrbitGtTileTree.js +49 -3
  39. package/lib/cjs/internal/tile/OrbitGtTileTree.js.map +1 -1
  40. package/lib/cjs/internal/tile/RealityModelTileTree.d.ts.map +1 -1
  41. package/lib/cjs/internal/tile/RealityModelTileTree.js +5 -1
  42. package/lib/cjs/internal/tile/RealityModelTileTree.js.map +1 -1
  43. package/lib/cjs/internal/tile/map/ArcGisUtilities.d.ts +3 -0
  44. package/lib/cjs/internal/tile/map/ArcGisUtilities.d.ts.map +1 -1
  45. package/lib/cjs/internal/tile/map/ArcGisUtilities.js +32 -4
  46. package/lib/cjs/internal/tile/map/ArcGisUtilities.js.map +1 -1
  47. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -1
  48. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISImageryProvider.js +28 -6
  49. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
  50. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
  51. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +7 -3
  52. package/lib/cjs/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  53. package/lib/cjs/internal/tile/map/ImageryProviders/BingImageryProvider.d.ts.map +1 -1
  54. package/lib/cjs/internal/tile/map/ImageryProviders/BingImageryProvider.js +1 -7
  55. package/lib/cjs/internal/tile/map/ImageryProviders/BingImageryProvider.js.map +1 -1
  56. package/lib/cjs/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.d.ts.map +1 -1
  57. package/lib/cjs/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +4 -1
  58. package/lib/cjs/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
  59. package/lib/cjs/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.d.ts.map +1 -1
  60. package/lib/cjs/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js +6 -2
  61. package/lib/cjs/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
  62. package/lib/cjs/internal/tile/map/WmsCapabilities.d.ts +2 -0
  63. package/lib/cjs/internal/tile/map/WmsCapabilities.d.ts.map +1 -1
  64. package/lib/cjs/internal/tile/map/WmsCapabilities.js +28 -6
  65. package/lib/cjs/internal/tile/map/WmsCapabilities.js.map +1 -1
  66. package/lib/cjs/internal/tile/map/WmsUtilities.d.ts.map +1 -1
  67. package/lib/cjs/internal/tile/map/WmsUtilities.js +25 -4
  68. package/lib/cjs/internal/tile/map/WmsUtilities.js.map +1 -1
  69. package/lib/cjs/quantity-formatting/QuantityFormatter.d.ts.map +1 -1
  70. package/lib/cjs/quantity-formatting/QuantityFormatter.js +14 -6
  71. package/lib/cjs/quantity-formatting/QuantityFormatter.js.map +1 -1
  72. package/lib/cjs/tile/map/MapLayerFormatRegistry.d.ts +74 -0
  73. package/lib/cjs/tile/map/MapLayerFormatRegistry.d.ts.map +1 -1
  74. package/lib/cjs/tile/map/MapLayerFormatRegistry.js +114 -2
  75. package/lib/cjs/tile/map/MapLayerFormatRegistry.js.map +1 -1
  76. package/lib/cjs/tile/map/MapLayerImageryFormats.d.ts.map +1 -1
  77. package/lib/cjs/tile/map/MapLayerImageryFormats.js +16 -0
  78. package/lib/cjs/tile/map/MapLayerImageryFormats.js.map +1 -1
  79. package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts +118 -2
  80. package/lib/cjs/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
  81. package/lib/cjs/tile/map/MapLayerImageryProvider.js +230 -20
  82. package/lib/cjs/tile/map/MapLayerImageryProvider.js.map +1 -1
  83. package/lib/cjs/tile/map/MapLayerSources.d.ts +7 -1
  84. package/lib/cjs/tile/map/MapLayerSources.d.ts.map +1 -1
  85. package/lib/cjs/tile/map/MapLayerSources.js +6 -0
  86. package/lib/cjs/tile/map/MapLayerSources.js.map +1 -1
  87. package/lib/cjs/tile/map/MapLayerTileTreeReference.d.ts.map +1 -1
  88. package/lib/cjs/tile/map/MapLayerTileTreeReference.js +1 -3
  89. package/lib/cjs/tile/map/MapLayerTileTreeReference.js.map +1 -1
  90. package/lib/cjs/tile/map/MapTileTree.d.ts.map +1 -1
  91. package/lib/cjs/tile/map/MapTileTree.js +3 -1
  92. package/lib/cjs/tile/map/MapTileTree.js.map +1 -1
  93. package/lib/cjs/tools/Tool.d.ts +5 -1
  94. package/lib/cjs/tools/Tool.d.ts.map +1 -1
  95. package/lib/cjs/tools/Tool.js +5 -1
  96. package/lib/cjs/tools/Tool.js.map +1 -1
  97. package/lib/cjs/tools/ToolAdmin.d.ts +2 -1
  98. package/lib/cjs/tools/ToolAdmin.d.ts.map +1 -1
  99. package/lib/cjs/tools/ToolAdmin.js +81 -19
  100. package/lib/cjs/tools/ToolAdmin.js.map +1 -1
  101. package/lib/esm/BriefcaseTxns.d.ts +9 -0
  102. package/lib/esm/BriefcaseTxns.d.ts.map +1 -1
  103. package/lib/esm/BriefcaseTxns.js +9 -0
  104. package/lib/esm/BriefcaseTxns.js.map +1 -1
  105. package/lib/esm/EmphasizeElements.d.ts +4 -1
  106. package/lib/esm/EmphasizeElements.d.ts.map +1 -1
  107. package/lib/esm/EmphasizeElements.js +16 -9
  108. package/lib/esm/EmphasizeElements.js.map +1 -1
  109. package/lib/esm/IModelApp.d.ts +11 -1
  110. package/lib/esm/IModelApp.d.ts.map +1 -1
  111. package/lib/esm/IModelApp.js +14 -1
  112. package/lib/esm/IModelApp.js.map +1 -1
  113. package/lib/esm/IModeljs-css.d.ts.map +1 -1
  114. package/lib/esm/IModeljs-css.js +4 -2
  115. package/lib/esm/IModeljs-css.js.map +1 -1
  116. package/lib/esm/RealityDataSource.d.ts.map +1 -1
  117. package/lib/esm/RealityDataSource.js +7 -4
  118. package/lib/esm/RealityDataSource.js.map +1 -1
  119. package/lib/esm/TxnEntityChanges.d.ts +4 -18
  120. package/lib/esm/TxnEntityChanges.d.ts.map +1 -1
  121. package/lib/esm/TxnEntityChanges.js.map +1 -1
  122. package/lib/esm/ViewManager.d.ts +3 -0
  123. package/lib/esm/ViewManager.d.ts.map +1 -1
  124. package/lib/esm/ViewManager.js +9 -1
  125. package/lib/esm/ViewManager.js.map +1 -1
  126. package/lib/esm/Viewport.d.ts +7 -1
  127. package/lib/esm/Viewport.d.ts.map +1 -1
  128. package/lib/esm/Viewport.js +13 -1
  129. package/lib/esm/Viewport.js.map +1 -1
  130. package/lib/esm/core-frontend.d.ts +7 -1
  131. package/lib/esm/core-frontend.d.ts.map +1 -1
  132. package/lib/esm/core-frontend.js.map +1 -1
  133. package/lib/esm/internal/GoogleMapsDecorator.js +1 -1
  134. package/lib/esm/internal/GoogleMapsDecorator.js.map +1 -1
  135. package/lib/esm/internal/tile/OrbitGtTileTree.d.ts +11 -1
  136. package/lib/esm/internal/tile/OrbitGtTileTree.d.ts.map +1 -1
  137. package/lib/esm/internal/tile/OrbitGtTileTree.js +49 -4
  138. package/lib/esm/internal/tile/OrbitGtTileTree.js.map +1 -1
  139. package/lib/esm/internal/tile/RealityModelTileTree.d.ts.map +1 -1
  140. package/lib/esm/internal/tile/RealityModelTileTree.js +5 -1
  141. package/lib/esm/internal/tile/RealityModelTileTree.js.map +1 -1
  142. package/lib/esm/internal/tile/map/ArcGisUtilities.d.ts +3 -0
  143. package/lib/esm/internal/tile/map/ArcGisUtilities.d.ts.map +1 -1
  144. package/lib/esm/internal/tile/map/ArcGisUtilities.js +33 -5
  145. package/lib/esm/internal/tile/map/ArcGisUtilities.js.map +1 -1
  146. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISImageryProvider.d.ts.map +1 -1
  147. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISImageryProvider.js +29 -7
  148. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISImageryProvider.js.map +1 -1
  149. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.d.ts.map +1 -1
  150. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js +8 -4
  151. package/lib/esm/internal/tile/map/ImageryProviders/ArcGISMapLayerImageryProvider.js.map +1 -1
  152. package/lib/esm/internal/tile/map/ImageryProviders/BingImageryProvider.d.ts.map +1 -1
  153. package/lib/esm/internal/tile/map/ImageryProviders/BingImageryProvider.js +1 -7
  154. package/lib/esm/internal/tile/map/ImageryProviders/BingImageryProvider.js.map +1 -1
  155. package/lib/esm/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.d.ts.map +1 -1
  156. package/lib/esm/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js +5 -2
  157. package/lib/esm/internal/tile/map/ImageryProviders/WmsMapLayerImageryProvider.js.map +1 -1
  158. package/lib/esm/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.d.ts.map +1 -1
  159. package/lib/esm/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js +7 -3
  160. package/lib/esm/internal/tile/map/ImageryProviders/WmtsMapLayerImageryProvider.js.map +1 -1
  161. package/lib/esm/internal/tile/map/WmsCapabilities.d.ts +2 -0
  162. package/lib/esm/internal/tile/map/WmsCapabilities.d.ts.map +1 -1
  163. package/lib/esm/internal/tile/map/WmsCapabilities.js +28 -6
  164. package/lib/esm/internal/tile/map/WmsCapabilities.js.map +1 -1
  165. package/lib/esm/internal/tile/map/WmsUtilities.d.ts.map +1 -1
  166. package/lib/esm/internal/tile/map/WmsUtilities.js +25 -4
  167. package/lib/esm/internal/tile/map/WmsUtilities.js.map +1 -1
  168. package/lib/esm/quantity-formatting/QuantityFormatter.d.ts.map +1 -1
  169. package/lib/esm/quantity-formatting/QuantityFormatter.js +14 -6
  170. package/lib/esm/quantity-formatting/QuantityFormatter.js.map +1 -1
  171. package/lib/esm/tile/map/MapLayerFormatRegistry.d.ts +74 -0
  172. package/lib/esm/tile/map/MapLayerFormatRegistry.d.ts.map +1 -1
  173. package/lib/esm/tile/map/MapLayerFormatRegistry.js +113 -2
  174. package/lib/esm/tile/map/MapLayerFormatRegistry.js.map +1 -1
  175. package/lib/esm/tile/map/MapLayerImageryFormats.d.ts.map +1 -1
  176. package/lib/esm/tile/map/MapLayerImageryFormats.js +17 -1
  177. package/lib/esm/tile/map/MapLayerImageryFormats.js.map +1 -1
  178. package/lib/esm/tile/map/MapLayerImageryProvider.d.ts +118 -2
  179. package/lib/esm/tile/map/MapLayerImageryProvider.d.ts.map +1 -1
  180. package/lib/esm/tile/map/MapLayerImageryProvider.js +228 -20
  181. package/lib/esm/tile/map/MapLayerImageryProvider.js.map +1 -1
  182. package/lib/esm/tile/map/MapLayerSources.d.ts +7 -1
  183. package/lib/esm/tile/map/MapLayerSources.d.ts.map +1 -1
  184. package/lib/esm/tile/map/MapLayerSources.js +6 -0
  185. package/lib/esm/tile/map/MapLayerSources.js.map +1 -1
  186. package/lib/esm/tile/map/MapLayerTileTreeReference.d.ts.map +1 -1
  187. package/lib/esm/tile/map/MapLayerTileTreeReference.js +1 -3
  188. package/lib/esm/tile/map/MapLayerTileTreeReference.js.map +1 -1
  189. package/lib/esm/tile/map/MapTileTree.d.ts.map +1 -1
  190. package/lib/esm/tile/map/MapTileTree.js +4 -2
  191. package/lib/esm/tile/map/MapTileTree.js.map +1 -1
  192. package/lib/esm/tools/Tool.d.ts +5 -1
  193. package/lib/esm/tools/Tool.d.ts.map +1 -1
  194. package/lib/esm/tools/Tool.js +5 -1
  195. package/lib/esm/tools/Tool.js.map +1 -1
  196. package/lib/esm/tools/ToolAdmin.d.ts +2 -1
  197. package/lib/esm/tools/ToolAdmin.d.ts.map +1 -1
  198. package/lib/esm/tools/ToolAdmin.js +82 -20
  199. package/lib/esm/tools/ToolAdmin.js.map +1 -1
  200. package/lib/public/scripts/parse-imdl-worker.js +1 -1
  201. package/package.json +21 -24
@@ -60,12 +60,31 @@ export interface ValidateSourceArgs {
60
60
  * @public
61
61
  */
62
62
  export type MapLayerFormatType = typeof MapLayerFormat;
63
+ /** Error thrown when an NTLM or Negotiate http 401 challenge could not be answered because the request
64
+ * URL's origin is not listed in [[MapLayerFormatRegistry.trustedCredentialsOrigins]]
65
+ * (see [[MapLayerFormatRegistry.restrictCredentialsToTrustedOrigins]]).
66
+ * Thrown by the static map-layer utilities (e.g. capabilities / service-metadata fetches) that have no
67
+ * provider instance on which to report the blocked origin; callers convert it to
68
+ * [[MapLayerImageryProviderStatus.UntrustedOrigin]] (provider initialization) or
69
+ * [[MapLayerSourceStatus.UntrustedOrigin]] (source validation).
70
+ * @internal
71
+ */
72
+ export declare class MapLayerUntrustedOriginError extends Error {
73
+ /** The URL of the request whose authentication challenge was left unanswered. */
74
+ readonly url: string;
75
+ constructor(url: string);
76
+ }
63
77
  /** @public */
64
78
  export interface MapLayerSourceValidation {
65
79
  status: MapLayerSourceStatus;
66
80
  subLayers?: MapSubLayerProps[];
67
81
  /** @beta */
68
82
  authInfo?: MapLayerAuthenticationInfo;
83
+ /** The origin of the URL that triggered an `UntrustedOrigin` validation failure, if known. Applications
84
+ * can use this to whitelist the correct origin in [[MapLayerFormatRegistry.trustedCredentialsOrigins]].
85
+ * @beta
86
+ */
87
+ blockedOrigin?: string;
69
88
  }
70
89
  /**
71
90
  * Options supplied at startup via [[IModelAppOptions.mapLayerOptions]] to specify access keys for various map layer formats.
@@ -100,7 +119,62 @@ export interface MapLayerFormatEntry {
100
119
  */
101
120
  export declare class MapLayerFormatRegistry {
102
121
  private _configOptions;
122
+ private _trustedCredentialsOrigins;
123
+ /** Opt-in enforcement of origin restrictions on map-layer credentials.
124
+ * When enabled, map layer providers:
125
+ * - attach the basic-auth credentials stored in the layer settings only to requests targeting the origin
126
+ * of the layer's settings URL or an origin listed in [[trustedCredentialsOrigins]];
127
+ * - retry a request with browser credentials included (i.e. SSO / Windows Authentication) after an NTLM
128
+ * or Negotiate http 401 challenge only for origins explicitly listed in [[trustedCredentialsOrigins]]
129
+ * (the settings-URL origin is NOT implicitly trusted for SSO, since map-layer URLs may originate from
130
+ * untrusted user input while SSO shares the user's ambient identity).
131
+ * Default is false, preserving the legacy behavior of sending credentials to any request URL.
132
+ * @beta
133
+ */
134
+ restrictCredentialsToTrustedOrigins: boolean;
103
135
  constructor(opts?: MapLayerOptions);
136
+ /** Origins (e.g. "https://tiles.example.com") to which map layer providers may send credentials —
137
+ * both the basic-auth credentials stored in the layer settings and browser credentials for
138
+ * SSO (i.e. Windows Authentication) retries after an NTLM or Negotiate http 401 challenge.
139
+ * Only enforced when [[restrictCredentialsToTrustedOrigins]] is enabled.
140
+ * For basic-auth, the origin of each map layer's settings URL is always implicitly trusted; for SSO,
141
+ * origins must be explicitly listed here.
142
+ * Entries are normalized to their origin (scheme + host + port); only `http:` and `https:` URLs are accepted,
143
+ * and any other entry is ignored and logged. Opaque schemes such as `file:`, `data:`, `about:` and custom
144
+ * Electron protocols are rejected because they all share the same serialized origin, so trusting one would
145
+ * trust every other.
146
+ * @beta
147
+ */
148
+ get trustedCredentialsOrigins(): ReadonlyArray<string>;
149
+ set trustedCredentialsOrigins(origins: ReadonlyArray<string>);
150
+ /** Returns true if a request to the given URL may be retried with browser credentials included
151
+ * (i.e. SSO / Windows Authentication) after an NTLM or Negotiate http 401 challenge.
152
+ * Always true unless [[restrictCredentialsToTrustedOrigins]] is enabled (opt-in).
153
+ * When enabled, the URL's origin must be explicitly listed in [[trustedCredentialsOrigins]];
154
+ * unlike basic-auth, the settings-URL origin is NOT implicitly trusted because SSO shares the user's
155
+ * ambient identity, and map-layer URLs may originate from untrusted user input.
156
+ * @internal
157
+ */
158
+ isSsoAllowed(url: string): boolean;
159
+ /** Returns true if the basic-auth credentials belonging to a map-layer source or settings URL may be
160
+ * attached to a request to the given URL. Always true unless [[restrictCredentialsToTrustedOrigins]]
161
+ * is enabled (opt-in). When enabled, the origin of `settingsUrl` is implicitly trusted (the credentials
162
+ * belong to that server); any other origin must be listed in [[trustedCredentialsOrigins]].
163
+ * @internal
164
+ */
165
+ isCredentialsSharingAllowed(url: string, settingsUrl: string): boolean;
166
+ /** Origins for which a "credentials sent to untrusted origin" warning was already logged;
167
+ * used to log the discovery warning only once per origin.
168
+ */
169
+ private readonly _untrustedUseLogged;
170
+ /** Logs a warning (once per origin) when credentials are sent to an origin that would be blocked
171
+ * if [[restrictCredentialsToTrustedOrigins]] were enabled.
172
+ * Helps applications discover the origins they need to whitelist before opting in to the restriction.
173
+ * If `settingsUrl` is supplied, requests sharing its origin are not logged, since that origin is
174
+ * implicitly trusted for basic-auth.
175
+ * @internal
176
+ */
177
+ logUntrustedOriginUse(url: string, settingsUrl?: string): void;
104
178
  private _formats;
105
179
  isRegistered(formatId: string): boolean;
106
180
  register(formatClass: MapLayerFormatType): void;
@@ -1 +1 @@
1
- {"version":3,"file":"MapLayerFormatRegistry.d.ts","sourceRoot":"","sources":["../../../../src/tile/map/MapLayerFormatRegistry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MapLayerFormatRegistry.d.ts","sourceRoot":"","sources":["../../../../src/tile/map/MapLayerFormatRegistry.ts"],"names":[],"mappings":"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"}
@@ -7,8 +7,8 @@
7
7
  */
8
8
  import { assert, expectDefined, Logger } from "@itwin/core-bentley";
9
9
  import { IModelApp } from "../../IModelApp";
10
- import { internalMapLayerImageryFormats, MapLayerSource, MapLayerSourceStatus } from "../internal";
11
- const loggerCategory = "ArcGISFeatureProvider";
10
+ import { internalMapLayerImageryFormats, MapLayerSource, MapLayerSourceStatus, tryGetOrigin } from "../internal";
11
+ const loggerCategory = "MapLayerFormatRegistry";
12
12
  /**
13
13
  * Class representing a map-layer format.
14
14
  * Each format has it's unique 'formatId' string, used to uniquely identify a format in the [[MapLayerFormatRegistry]].
@@ -57,16 +57,127 @@ export class MapLayerFormat {
57
57
  return undefined;
58
58
  }
59
59
  }
60
+ /** Error thrown when an NTLM or Negotiate http 401 challenge could not be answered because the request
61
+ * URL's origin is not listed in [[MapLayerFormatRegistry.trustedCredentialsOrigins]]
62
+ * (see [[MapLayerFormatRegistry.restrictCredentialsToTrustedOrigins]]).
63
+ * Thrown by the static map-layer utilities (e.g. capabilities / service-metadata fetches) that have no
64
+ * provider instance on which to report the blocked origin; callers convert it to
65
+ * [[MapLayerImageryProviderStatus.UntrustedOrigin]] (provider initialization) or
66
+ * [[MapLayerSourceStatus.UntrustedOrigin]] (source validation).
67
+ * @internal
68
+ */
69
+ export class MapLayerUntrustedOriginError extends Error {
70
+ /** The URL of the request whose authentication challenge was left unanswered. */
71
+ url;
72
+ constructor(url) {
73
+ super(`Authentication blocked: origin of '${url}' is not listed in MapLayerFormatRegistry.trustedCredentialsOrigins`);
74
+ this.url = url;
75
+ }
76
+ }
60
77
  /**
61
78
  * A registry of MapLayerFormats identified by their unique format IDs. The registry can be accessed via [[IModelApp.mapLayerFormatRegistry]].
62
79
  * @public
63
80
  */
64
81
  export class MapLayerFormatRegistry {
65
82
  _configOptions;
83
+ _trustedCredentialsOrigins = [];
84
+ /** Opt-in enforcement of origin restrictions on map-layer credentials.
85
+ * When enabled, map layer providers:
86
+ * - attach the basic-auth credentials stored in the layer settings only to requests targeting the origin
87
+ * of the layer's settings URL or an origin listed in [[trustedCredentialsOrigins]];
88
+ * - retry a request with browser credentials included (i.e. SSO / Windows Authentication) after an NTLM
89
+ * or Negotiate http 401 challenge only for origins explicitly listed in [[trustedCredentialsOrigins]]
90
+ * (the settings-URL origin is NOT implicitly trusted for SSO, since map-layer URLs may originate from
91
+ * untrusted user input while SSO shares the user's ambient identity).
92
+ * Default is false, preserving the legacy behavior of sending credentials to any request URL.
93
+ * @beta
94
+ */
95
+ restrictCredentialsToTrustedOrigins = false;
66
96
  constructor(opts) {
67
97
  this._configOptions = opts ?? {};
68
98
  internalMapLayerImageryFormats.forEach((format) => this.register(format));
69
99
  }
100
+ /** Origins (e.g. "https://tiles.example.com") to which map layer providers may send credentials —
101
+ * both the basic-auth credentials stored in the layer settings and browser credentials for
102
+ * SSO (i.e. Windows Authentication) retries after an NTLM or Negotiate http 401 challenge.
103
+ * Only enforced when [[restrictCredentialsToTrustedOrigins]] is enabled.
104
+ * For basic-auth, the origin of each map layer's settings URL is always implicitly trusted; for SSO,
105
+ * origins must be explicitly listed here.
106
+ * Entries are normalized to their origin (scheme + host + port); only `http:` and `https:` URLs are accepted,
107
+ * and any other entry is ignored and logged. Opaque schemes such as `file:`, `data:`, `about:` and custom
108
+ * Electron protocols are rejected because they all share the same serialized origin, so trusting one would
109
+ * trust every other.
110
+ * @beta
111
+ */
112
+ get trustedCredentialsOrigins() {
113
+ return this._trustedCredentialsOrigins;
114
+ }
115
+ set trustedCredentialsOrigins(origins) {
116
+ const normalized = [];
117
+ for (const entry of origins) {
118
+ const origin = tryGetOrigin(entry);
119
+ if (origin !== undefined)
120
+ normalized.push(origin);
121
+ else
122
+ Logger.logWarning(loggerCategory, `trustedCredentialsOrigins: ignoring '${entry}'; entries must be http or https URLs.`);
123
+ }
124
+ this._trustedCredentialsOrigins = normalized;
125
+ }
126
+ /** Returns true if a request to the given URL may be retried with browser credentials included
127
+ * (i.e. SSO / Windows Authentication) after an NTLM or Negotiate http 401 challenge.
128
+ * Always true unless [[restrictCredentialsToTrustedOrigins]] is enabled (opt-in).
129
+ * When enabled, the URL's origin must be explicitly listed in [[trustedCredentialsOrigins]];
130
+ * unlike basic-auth, the settings-URL origin is NOT implicitly trusted because SSO shares the user's
131
+ * ambient identity, and map-layer URLs may originate from untrusted user input.
132
+ * @internal
133
+ */
134
+ isSsoAllowed(url) {
135
+ if (!this.restrictCredentialsToTrustedOrigins)
136
+ return true;
137
+ const origin = tryGetOrigin(url);
138
+ // Entries are normalized to their origin by the [[trustedCredentialsOrigins]] setter.
139
+ return origin !== undefined && this._trustedCredentialsOrigins.includes(origin);
140
+ }
141
+ /** Returns true if the basic-auth credentials belonging to a map-layer source or settings URL may be
142
+ * attached to a request to the given URL. Always true unless [[restrictCredentialsToTrustedOrigins]]
143
+ * is enabled (opt-in). When enabled, the origin of `settingsUrl` is implicitly trusted (the credentials
144
+ * belong to that server); any other origin must be listed in [[trustedCredentialsOrigins]].
145
+ * @internal
146
+ */
147
+ isCredentialsSharingAllowed(url, settingsUrl) {
148
+ if (!this.restrictCredentialsToTrustedOrigins)
149
+ return true;
150
+ const origin = tryGetOrigin(url);
151
+ if (origin === undefined)
152
+ return false;
153
+ if (origin === tryGetOrigin(settingsUrl))
154
+ return true;
155
+ // Entries are normalized to their origin by the [[trustedCredentialsOrigins]] setter.
156
+ return this._trustedCredentialsOrigins.includes(origin);
157
+ }
158
+ /** Origins for which a "credentials sent to untrusted origin" warning was already logged;
159
+ * used to log the discovery warning only once per origin.
160
+ */
161
+ _untrustedUseLogged = new Set();
162
+ /** Logs a warning (once per origin) when credentials are sent to an origin that would be blocked
163
+ * if [[restrictCredentialsToTrustedOrigins]] were enabled.
164
+ * Helps applications discover the origins they need to whitelist before opting in to the restriction.
165
+ * If `settingsUrl` is supplied, requests sharing its origin are not logged, since that origin is
166
+ * implicitly trusted for basic-auth.
167
+ * @internal
168
+ */
169
+ logUntrustedOriginUse(url, settingsUrl) {
170
+ if (this.restrictCredentialsToTrustedOrigins)
171
+ return; // restriction active; nothing to preview
172
+ const origin = tryGetOrigin(url) ?? url;
173
+ if (settingsUrl !== undefined && origin === tryGetOrigin(settingsUrl))
174
+ return; // implicitly trusted for basic-auth
175
+ if (this._untrustedUseLogged.has(origin) || this._trustedCredentialsOrigins.includes(origin))
176
+ return;
177
+ this._untrustedUseLogged.add(origin);
178
+ Logger.logWarning(loggerCategory, `Credentials sent to origin '${origin}' which is not in MapLayerFormatRegistry.trustedCredentialsOrigins; `
179
+ + "this request would be blocked if restrictCredentialsToTrustedOrigins were enabled.");
180
+ }
70
181
  _formats = new Map();
71
182
  isRegistered(formatId) { return this._formats.get(formatId) !== undefined; }
72
183
  register(formatClass) {
@@ -1 +1 @@
1
- {"version":3,"file":"MapLayerFormatRegistry.js","sourceRoot":"","sources":["../../../../src/tile/map/MapLayerFormatRegistry.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module MapLayers\r\n */\r\n\r\nimport { assert, expectDefined, Logger } from \"@itwin/core-bentley\";\r\nimport { ImageMapLayerSettings, MapLayerKey, MapLayerSettings, MapSubLayerProps } from \"@itwin/core-common\";\r\nimport { IModelApp } from \"../../IModelApp\";\r\nimport { IModelConnection } from \"../../IModelConnection\";\r\nimport { ImageryMapLayerTreeReference, internalMapLayerImageryFormats, MapLayerAccessClient, MapLayerAuthenticationInfo, MapLayerImageryProvider, MapLayerSource, MapLayerSourceStatus, MapLayerTileTreeReference } from \"../internal\";\r\nconst loggerCategory = \"ArcGISFeatureProvider\";\r\n\r\n/**\r\n * Class representing a map-layer format.\r\n * Each format has it's unique 'formatId' string, used to uniquely identify a format in the [[MapLayerFormatRegistry]].\r\n * When creating an [[ImageMapLayerSettings]] object, a format needs to be specified this 'formatId'.\r\n * The MapLayerFormat object can later be used to validate a source, or create a provider.\r\n *\r\n * Subclasses should override formatId, [[MapLayerFormat.createImageryProvider]], and [[MapLayerFormat.createMapLayerTree]].\r\n * @public\r\n */\r\nexport class MapLayerFormat {\r\n public static formatId: string;\r\n\r\n /** Register the current format in the [[MapLayerFormatRegistry]]. */\r\n public static register() { IModelApp.mapLayerFormatRegistry.register(this); }\r\n\r\n /**\r\n * Allow a source of a specific format to be validated before being attached as a map-layer.\r\n * @param _url The URL of the source.\r\n * @param _userName The username to access the source if needed.\r\n * @param _password The password to access the source if needed.\r\n * @param _ignoreCache Flag to skip cache lookup (i.e. force a new server request).\r\n * @returns Validation Status. If successful, a list of available sub-layers may also be returned.\r\n */\r\n public static async validateSource(_url: string, _userName?: string, _password?: string, _ignoreCache?: boolean, _accesKey?: MapLayerKey): Promise<MapLayerSourceValidation> { return { status: MapLayerSourceStatus.Valid }; }\r\n\r\n /** Allow a source object to be validated before being attached as a map-layer.\r\n * @beta\r\n */\r\n public static async validate(args: ValidateSourceArgs): Promise<MapLayerSourceValidation> {\r\n return this.validateSource(args.source.url, args.source.userName, args.source.password, args.ignoreCache);\r\n }\r\n\r\n /**\r\n * Create a [[MapLayerImageryProvider]] that will be used to feed data in a map-layer tile tree.\r\n * @param _settings The map layer settings to be applied to the imagery provider.\r\n * @returns Returns the new imagery provider.\r\n * @beta\r\n */\r\n public static createImageryProvider(_settings: MapLayerSettings): MapLayerImageryProvider | undefined { assert(false); }\r\n\r\n /**\r\n * Creates a MapLayerTileTreeReference for this map layer format.\r\n * @param _layerSettings Map layer settings that are applied to the MapLayerTileTreeReference.\r\n * @param _layerIndex The index of the associated map layer.\r\n * @param _iModel The iModel containing the MapLayerTileTreeReference.\r\n * @returns Returns the new tile tree reference.\r\n * @beta\r\n */\r\n public static createMapLayerTree(_layerSettings: MapLayerSettings, _layerIndex: number, _iModel: IModelConnection): MapLayerTileTreeReference | undefined {\r\n assert(false);\r\n return undefined;\r\n }\r\n\r\n}\r\n\r\n/** Options for validating sources\r\n * @beta\r\n */\r\nexport interface ValidateSourceArgs {\r\n source: MapLayerSource;\r\n /** Disable cache lookup during validate process */\r\n ignoreCache?: boolean;\r\n}\r\n\r\n/**\r\n * The type of a map layer format.\r\n * @public\r\n */\r\nexport type MapLayerFormatType = typeof MapLayerFormat;\r\n\r\n/** @public */\r\nexport interface MapLayerSourceValidation {\r\n status: MapLayerSourceStatus;\r\n subLayers?: MapSubLayerProps[];\r\n\r\n /** @beta */\r\n authInfo?: MapLayerAuthenticationInfo;\r\n}\r\n\r\n/**\r\n * Options supplied at startup via [[IModelAppOptions.mapLayerOptions]] to specify access keys for various map layer formats.\r\n * 'BingMaps' must have it's key value set to 'key'\r\n * 'MapboxImagery' must have it's key value set to 'access_token'\r\n * Some format-specific options, including `BingMaps`, are retained for compatibility.\r\n *\r\n * @public\r\n */\r\nexport interface MapLayerOptions {\r\n /** Access key for Azure Maps in the format `{ key: \"subscription-key\", value: \"your-azure-maps-key\" }`. */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n AzureMaps?: MapLayerKey;\r\n /** Access key for Mapbox in the format `{ key: \"access_token\", value: \"your-mapbox-key\" }`. */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n MapboxImagery?: MapLayerKey;\r\n /** Access key for Bing Maps in the format `{ key: \"key\", value: \"your-bing-maps-key\" }`.\r\n * @deprecated in 5.11.0 - will not be removed until after 2027-07-03. All Bing Maps APIs are deprecated. Supply custom providers via\r\n * [[IModelAppOptions.geospatialProviders]].\r\n * For basemap imagery, use `@itwin/map-layers-formats`.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n BingMaps?: MapLayerKey;\r\n /** Access keys for additional map layer formats. */\r\n [format: string]: MapLayerKey | undefined;\r\n}\r\n\r\n/** @internal */\r\nexport interface MapLayerFormatEntry {\r\n type: MapLayerFormatType;\r\n accessClient?: MapLayerAccessClient;\r\n}\r\n\r\n/**\r\n * A registry of MapLayerFormats identified by their unique format IDs. The registry can be accessed via [[IModelApp.mapLayerFormatRegistry]].\r\n * @public\r\n */\r\nexport class MapLayerFormatRegistry {\r\n private _configOptions: MapLayerOptions;\r\n constructor(opts?: MapLayerOptions) {\r\n this._configOptions = opts ?? {};\r\n internalMapLayerImageryFormats.forEach((format) => this.register(format));\r\n }\r\n private _formats = new Map<string, MapLayerFormatEntry>();\r\n\r\n public isRegistered(formatId: string) { return this._formats.get(formatId) !== undefined; }\r\n\r\n public register(formatClass: MapLayerFormatType) {\r\n if (formatClass.formatId.length === 0)\r\n return; // must be an abstract class, ignore it\r\n\r\n this._formats.set(formatClass.formatId, { type: formatClass });\r\n }\r\n\r\n /** @beta */\r\n public setAccessClient(formatId: string, accessClient: MapLayerAccessClient): boolean {\r\n const entry = this._formats.get(formatId);\r\n if (entry !== undefined) {\r\n entry.accessClient = accessClient;\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /** @beta */\r\n public getAccessClient(formatId: string): MapLayerAccessClient | undefined {\r\n if (formatId.length === 0)\r\n return undefined;\r\n\r\n return this._formats.get(formatId)?.accessClient;\r\n }\r\n\r\n public get configOptions(): MapLayerOptions {\r\n return this._configOptions;\r\n }\r\n\r\n /** @internal */\r\n public createImageryMapLayerTree(layerSettings: ImageMapLayerSettings, layerIndex: number, iModel: IModelConnection): ImageryMapLayerTreeReference | undefined {\r\n const entry = this._formats.get(layerSettings.formatId);\r\n const format = entry?.type;\r\n if (format === undefined) {\r\n Logger.logError(loggerCategory, `Could not find format '${layerSettings.formatId}' in registry`);\r\n return undefined;\r\n }\r\n return format.createMapLayerTree(layerSettings, layerIndex, iModel);\r\n }\r\n\r\n /**\r\n * Returns a [[MapLayerImageryProvider]] based on the provided [[ImageMapLayerSettings]] object.\r\n * @internal\r\n */\r\n public createImageryProvider(layerSettings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n const entry = this._formats.get(layerSettings.formatId);\r\n const format = entry?.type;\r\n if (this._configOptions[layerSettings.formatId] !== undefined) {\r\n const keyValuePair = expectDefined(this._configOptions[layerSettings.formatId]);\r\n const key: MapLayerKey = { key: keyValuePair.key, value: keyValuePair.value };\r\n layerSettings = layerSettings.clone({ accessKey: key });\r\n }\r\n return (format === undefined) ? undefined : format.createImageryProvider(layerSettings);\r\n }\r\n\r\n /** @beta*/\r\n public async validateSource(opts: ValidateSourceArgs): Promise<MapLayerSourceValidation>;\r\n\r\n public async validateSource(formatId: string, url: string, userName?: string, password?: string, ignoreCache?: boolean): Promise<MapLayerSourceValidation>;\r\n\r\n /** @internal*/\r\n public async validateSource(formatIdOrArgs: string|ValidateSourceArgs, url?: string, userName?: string, password?: string, ignoreCache?: boolean): Promise<MapLayerSourceValidation> {\r\n let format: typeof MapLayerFormat | undefined;\r\n let args: ValidateSourceArgs | undefined;\r\n\r\n if (typeof formatIdOrArgs == \"string\" && url !== undefined) {\r\n const formatId = formatIdOrArgs;\r\n const entry = this._formats.get(formatId);\r\n format = entry?.type;\r\n if (format !== undefined) {\r\n const source = MapLayerSource.fromJSON({name: \"\", formatId, url});\r\n if (source !== undefined) {\r\n args = {source, ignoreCache};\r\n source.userName = userName;\r\n source.password = password;\r\n }\r\n\r\n }\r\n } else if (typeof formatIdOrArgs !== \"string\") {\r\n const entry = this._formats.get(formatIdOrArgs.source.formatId);\r\n format = entry?.type;\r\n args = formatIdOrArgs;\r\n }\r\n\r\n if (!args || !format)\r\n return { status: MapLayerSourceStatus.InvalidFormat };\r\n\r\n return format.validate(args);\r\n }\r\n}\r\n\r\n"]}
1
+ {"version":3,"file":"MapLayerFormatRegistry.js","sourceRoot":"","sources":["../../../../src/tile/map/MapLayerFormatRegistry.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAgC,8BAA8B,EAA6E,cAAc,EAAE,oBAAoB,EAA6B,YAAY,EAAE,MAAM,aAAa,CAAC;AACrP,MAAM,cAAc,GAAG,wBAAwB,CAAC;AAEhD;;;;;;;;GAQG;AACH,MAAM,OAAO,cAAc;IAClB,MAAM,CAAC,QAAQ,CAAS;IAE/B,qEAAqE;IAC9D,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE7E;;;;;;;OAOG;IACI,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,IAAY,EAAE,SAAkB,EAAE,SAAkB,EAAE,YAAsB,EAAE,SAAuB,IAAuC,OAAO,EAAE,MAAM,EAAE,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAE/N;;MAEE;IACK,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAwB;QACnD,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5G,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,qBAAqB,CAAC,SAA2B,IAAyC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAExH;;;;;;;OAOG;IACI,MAAM,CAAC,kBAAkB,CAAC,cAAgC,EAAE,WAAmB,EAAE,OAAyB;QAC/G,MAAM,CAAC,KAAK,CAAC,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;CAEF;AAiBD;;;;;;;;GAQG;AACH,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACrD,iFAAiF;IACjE,GAAG,CAAS;IAE5B,YAAY,GAAW;QACrB,KAAK,CAAC,sCAAsC,GAAG,qEAAqE,CAAC,CAAC;QACtH,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;CACF;AAiDD;;;GAGG;AACH,MAAM,OAAO,sBAAsB;IACzB,cAAc,CAAkB;IAChC,0BAA0B,GAAa,EAAE,CAAC;IAElD;;;;;;;;;;OAUG;IACI,mCAAmC,GAAG,KAAK,CAAC;IAEnD,YAAY,IAAsB;QAChC,IAAI,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;QACjC,8BAA8B,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED;;;;;;;;;;;OAWG;IACH,IAAW,yBAAyB;QAClC,OAAO,IAAI,CAAC,0BAA0B,CAAC;IACzC,CAAC;IAED,IAAW,yBAAyB,CAAC,OAA8B;QACjE,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,MAAM,KAAK,SAAS;gBACtB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;gBAExB,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,wCAAwC,KAAK,wCAAwC,CAAC,CAAC;QAC7H,CAAC;QACD,IAAI,CAAC,0BAA0B,GAAG,UAAU,CAAC;IAC/C,CAAC;IAED;;;;;;;OAOG;IACI,YAAY,CAAC,GAAW;QAC7B,IAAI,CAAC,IAAI,CAAC,mCAAmC;YAC3C,OAAO,IAAI,CAAC;QAEd,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAEjC,sFAAsF;QACtF,OAAO,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAClF,CAAC;IAED;;;;;OAKG;IACI,2BAA2B,CAAC,GAAW,EAAE,WAAmB;QACjE,IAAI,CAAC,IAAI,CAAC,mCAAmC;YAC3C,OAAO,IAAI,CAAC;QAEd,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,SAAS;YACtB,OAAO,KAAK,CAAC;QAEf,IAAI,MAAM,KAAK,YAAY,CAAC,WAAW,CAAC;YACtC,OAAO,IAAI,CAAC;QAEd,sFAAsF;QACtF,OAAO,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACc,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzD;;;;;;OAMG;IACI,qBAAqB,CAAC,GAAW,EAAE,WAAoB;QAC5D,IAAI,IAAI,CAAC,mCAAmC;YAC1C,OAAO,CAAG,yCAAyC;QAErD,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;QAExC,IAAI,WAAW,KAAK,SAAS,IAAI,MAAM,KAAK,YAAY,CAAC,WAAW,CAAC;YACnE,OAAO,CAAG,oCAAoC;QAEhD,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC1F,OAAO;QAET,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,+BAA+B,MAAM,sEAAsE;cACzI,oFAAoF,CAAC,CAAC;IAC5F,CAAC;IAEO,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;IAEnD,YAAY,CAAC,QAAgB,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;IAEpF,QAAQ,CAAC,WAA+B;QAC7C,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YACnC,OAAO,CAAC,uCAAuC;QAEjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,YAAY;IACL,eAAe,CAAC,QAAgB,EAAE,YAAkC;QACzE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,YAAY;IACL,eAAe,CAAC,QAAgB;QACrC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YACvB,OAAO,SAAS,CAAC;QAEnB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACnD,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,gBAAgB;IACT,yBAAyB,CAAC,aAAoC,EAAE,UAAkB,EAAE,MAAwB;QACjH,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC;QAC3B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,0BAA0B,aAAa,CAAC,QAAQ,eAAe,CAAC,CAAC;YACjG,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,MAAM,CAAC,kBAAkB,CAAC,aAAa,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IACI,qBAAqB,CAAC,aAAoC;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC;QAC3B,IAAI,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;YAC9D,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChF,MAAM,GAAG,GAAgB,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,CAAC;YAC9E,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAC1F,CAAC;IAOD,eAAe;IACR,KAAK,CAAC,cAAc,CAAC,cAAyC,EAAE,GAAY,EAAE,QAAiB,EAAE,QAAiB,EAAE,WAAqB;QAC9I,IAAI,MAAyC,CAAC;QAC9C,IAAI,IAAoC,CAAC;QAEzC,IAAI,OAAO,cAAc,IAAI,QAAQ,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC3D,MAAM,QAAQ,GAAG,cAAc,CAAC;YAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC;YACrB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAI,cAAc,CAAC,QAAQ,CAAC,EAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAC,CAAC,CAAC;gBACnE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,IAAI,GAAG,EAAC,MAAM,EAAE,WAAW,EAAC,CAAC;oBAC7B,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;oBAC3B,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC7B,CAAC;YAEH,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChE,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC;YACrB,IAAI,GAAG,cAAc,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAClB,OAAO,EAAE,MAAM,EAAE,oBAAoB,CAAC,aAAa,EAAE,CAAC;QAExD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module MapLayers\r\n */\r\n\r\nimport { assert, expectDefined, Logger } from \"@itwin/core-bentley\";\r\nimport { ImageMapLayerSettings, MapLayerKey, MapLayerSettings, MapSubLayerProps } from \"@itwin/core-common\";\r\nimport { IModelApp } from \"../../IModelApp\";\r\nimport { IModelConnection } from \"../../IModelConnection\";\r\nimport { ImageryMapLayerTreeReference, internalMapLayerImageryFormats, MapLayerAccessClient, MapLayerAuthenticationInfo, MapLayerImageryProvider, MapLayerSource, MapLayerSourceStatus, MapLayerTileTreeReference, tryGetOrigin } from \"../internal\";\r\nconst loggerCategory = \"MapLayerFormatRegistry\";\r\n\r\n/**\r\n * Class representing a map-layer format.\r\n * Each format has it's unique 'formatId' string, used to uniquely identify a format in the [[MapLayerFormatRegistry]].\r\n * When creating an [[ImageMapLayerSettings]] object, a format needs to be specified this 'formatId'.\r\n * The MapLayerFormat object can later be used to validate a source, or create a provider.\r\n *\r\n * Subclasses should override formatId, [[MapLayerFormat.createImageryProvider]], and [[MapLayerFormat.createMapLayerTree]].\r\n * @public\r\n */\r\nexport class MapLayerFormat {\r\n public static formatId: string;\r\n\r\n /** Register the current format in the [[MapLayerFormatRegistry]]. */\r\n public static register() { IModelApp.mapLayerFormatRegistry.register(this); }\r\n\r\n /**\r\n * Allow a source of a specific format to be validated before being attached as a map-layer.\r\n * @param _url The URL of the source.\r\n * @param _userName The username to access the source if needed.\r\n * @param _password The password to access the source if needed.\r\n * @param _ignoreCache Flag to skip cache lookup (i.e. force a new server request).\r\n * @returns Validation Status. If successful, a list of available sub-layers may also be returned.\r\n */\r\n public static async validateSource(_url: string, _userName?: string, _password?: string, _ignoreCache?: boolean, _accesKey?: MapLayerKey): Promise<MapLayerSourceValidation> { return { status: MapLayerSourceStatus.Valid }; }\r\n\r\n /** Allow a source object to be validated before being attached as a map-layer.\r\n * @beta\r\n */\r\n public static async validate(args: ValidateSourceArgs): Promise<MapLayerSourceValidation> {\r\n return this.validateSource(args.source.url, args.source.userName, args.source.password, args.ignoreCache);\r\n }\r\n\r\n /**\r\n * Create a [[MapLayerImageryProvider]] that will be used to feed data in a map-layer tile tree.\r\n * @param _settings The map layer settings to be applied to the imagery provider.\r\n * @returns Returns the new imagery provider.\r\n * @beta\r\n */\r\n public static createImageryProvider(_settings: MapLayerSettings): MapLayerImageryProvider | undefined { assert(false); }\r\n\r\n /**\r\n * Creates a MapLayerTileTreeReference for this map layer format.\r\n * @param _layerSettings Map layer settings that are applied to the MapLayerTileTreeReference.\r\n * @param _layerIndex The index of the associated map layer.\r\n * @param _iModel The iModel containing the MapLayerTileTreeReference.\r\n * @returns Returns the new tile tree reference.\r\n * @beta\r\n */\r\n public static createMapLayerTree(_layerSettings: MapLayerSettings, _layerIndex: number, _iModel: IModelConnection): MapLayerTileTreeReference | undefined {\r\n assert(false);\r\n return undefined;\r\n }\r\n\r\n}\r\n\r\n/** Options for validating sources\r\n * @beta\r\n */\r\nexport interface ValidateSourceArgs {\r\n source: MapLayerSource;\r\n /** Disable cache lookup during validate process */\r\n ignoreCache?: boolean;\r\n}\r\n\r\n/**\r\n * The type of a map layer format.\r\n * @public\r\n */\r\nexport type MapLayerFormatType = typeof MapLayerFormat;\r\n\r\n/** Error thrown when an NTLM or Negotiate http 401 challenge could not be answered because the request\r\n * URL's origin is not listed in [[MapLayerFormatRegistry.trustedCredentialsOrigins]]\r\n * (see [[MapLayerFormatRegistry.restrictCredentialsToTrustedOrigins]]).\r\n * Thrown by the static map-layer utilities (e.g. capabilities / service-metadata fetches) that have no\r\n * provider instance on which to report the blocked origin; callers convert it to\r\n * [[MapLayerImageryProviderStatus.UntrustedOrigin]] (provider initialization) or\r\n * [[MapLayerSourceStatus.UntrustedOrigin]] (source validation).\r\n * @internal\r\n */\r\nexport class MapLayerUntrustedOriginError extends Error {\r\n /** The URL of the request whose authentication challenge was left unanswered. */\r\n public readonly url: string;\r\n\r\n constructor(url: string) {\r\n super(`Authentication blocked: origin of '${url}' is not listed in MapLayerFormatRegistry.trustedCredentialsOrigins`);\r\n this.url = url;\r\n }\r\n}\r\n\r\n/** @public */\r\nexport interface MapLayerSourceValidation {\r\n status: MapLayerSourceStatus;\r\n subLayers?: MapSubLayerProps[];\r\n\r\n /** @beta */\r\n authInfo?: MapLayerAuthenticationInfo;\r\n\r\n /** The origin of the URL that triggered an `UntrustedOrigin` validation failure, if known. Applications\r\n * can use this to whitelist the correct origin in [[MapLayerFormatRegistry.trustedCredentialsOrigins]].\r\n * @beta\r\n */\r\n blockedOrigin?: string;\r\n}\r\n\r\n/**\r\n * Options supplied at startup via [[IModelAppOptions.mapLayerOptions]] to specify access keys for various map layer formats.\r\n * 'BingMaps' must have it's key value set to 'key'\r\n * 'MapboxImagery' must have it's key value set to 'access_token'\r\n * Some format-specific options, including `BingMaps`, are retained for compatibility.\r\n *\r\n * @public\r\n */\r\nexport interface MapLayerOptions {\r\n /** Access key for Azure Maps in the format `{ key: \"subscription-key\", value: \"your-azure-maps-key\" }`. */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n AzureMaps?: MapLayerKey;\r\n /** Access key for Mapbox in the format `{ key: \"access_token\", value: \"your-mapbox-key\" }`. */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n MapboxImagery?: MapLayerKey;\r\n /** Access key for Bing Maps in the format `{ key: \"key\", value: \"your-bing-maps-key\" }`.\r\n * @deprecated in 5.11.0 - will not be removed until after 2027-07-03. All Bing Maps APIs are deprecated. Supply custom providers via\r\n * [[IModelAppOptions.geospatialProviders]].\r\n * For basemap imagery, use `@itwin/map-layers-formats`.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n BingMaps?: MapLayerKey;\r\n /** Access keys for additional map layer formats. */\r\n [format: string]: MapLayerKey | undefined;\r\n}\r\n\r\n/** @internal */\r\nexport interface MapLayerFormatEntry {\r\n type: MapLayerFormatType;\r\n accessClient?: MapLayerAccessClient;\r\n}\r\n\r\n/**\r\n * A registry of MapLayerFormats identified by their unique format IDs. The registry can be accessed via [[IModelApp.mapLayerFormatRegistry]].\r\n * @public\r\n */\r\nexport class MapLayerFormatRegistry {\r\n private _configOptions: MapLayerOptions;\r\n private _trustedCredentialsOrigins: string[] = [];\r\n\r\n /** Opt-in enforcement of origin restrictions on map-layer credentials.\r\n * When enabled, map layer providers:\r\n * - attach the basic-auth credentials stored in the layer settings only to requests targeting the origin\r\n * of the layer's settings URL or an origin listed in [[trustedCredentialsOrigins]];\r\n * - retry a request with browser credentials included (i.e. SSO / Windows Authentication) after an NTLM\r\n * or Negotiate http 401 challenge only for origins explicitly listed in [[trustedCredentialsOrigins]]\r\n * (the settings-URL origin is NOT implicitly trusted for SSO, since map-layer URLs may originate from\r\n * untrusted user input while SSO shares the user's ambient identity).\r\n * Default is false, preserving the legacy behavior of sending credentials to any request URL.\r\n * @beta\r\n */\r\n public restrictCredentialsToTrustedOrigins = false;\r\n\r\n constructor(opts?: MapLayerOptions) {\r\n this._configOptions = opts ?? {};\r\n internalMapLayerImageryFormats.forEach((format) => this.register(format));\r\n }\r\n\r\n /** Origins (e.g. \"https://tiles.example.com\") to which map layer providers may send credentials —\r\n * both the basic-auth credentials stored in the layer settings and browser credentials for\r\n * SSO (i.e. Windows Authentication) retries after an NTLM or Negotiate http 401 challenge.\r\n * Only enforced when [[restrictCredentialsToTrustedOrigins]] is enabled.\r\n * For basic-auth, the origin of each map layer's settings URL is always implicitly trusted; for SSO,\r\n * origins must be explicitly listed here.\r\n * Entries are normalized to their origin (scheme + host + port); only `http:` and `https:` URLs are accepted,\r\n * and any other entry is ignored and logged. Opaque schemes such as `file:`, `data:`, `about:` and custom\r\n * Electron protocols are rejected because they all share the same serialized origin, so trusting one would\r\n * trust every other.\r\n * @beta\r\n */\r\n public get trustedCredentialsOrigins(): ReadonlyArray<string> {\r\n return this._trustedCredentialsOrigins;\r\n }\r\n\r\n public set trustedCredentialsOrigins(origins: ReadonlyArray<string>) {\r\n const normalized: string[] = [];\r\n for (const entry of origins) {\r\n const origin = tryGetOrigin(entry);\r\n if (origin !== undefined)\r\n normalized.push(origin);\r\n else\r\n Logger.logWarning(loggerCategory, `trustedCredentialsOrigins: ignoring '${entry}'; entries must be http or https URLs.`);\r\n }\r\n this._trustedCredentialsOrigins = normalized;\r\n }\r\n\r\n /** Returns true if a request to the given URL may be retried with browser credentials included\r\n * (i.e. SSO / Windows Authentication) after an NTLM or Negotiate http 401 challenge.\r\n * Always true unless [[restrictCredentialsToTrustedOrigins]] is enabled (opt-in).\r\n * When enabled, the URL's origin must be explicitly listed in [[trustedCredentialsOrigins]];\r\n * unlike basic-auth, the settings-URL origin is NOT implicitly trusted because SSO shares the user's\r\n * ambient identity, and map-layer URLs may originate from untrusted user input.\r\n * @internal\r\n */\r\n public isSsoAllowed(url: string): boolean {\r\n if (!this.restrictCredentialsToTrustedOrigins)\r\n return true;\r\n\r\n const origin = tryGetOrigin(url);\r\n\r\n // Entries are normalized to their origin by the [[trustedCredentialsOrigins]] setter.\r\n return origin !== undefined && this._trustedCredentialsOrigins.includes(origin);\r\n }\r\n\r\n /** Returns true if the basic-auth credentials belonging to a map-layer source or settings URL may be\r\n * attached to a request to the given URL. Always true unless [[restrictCredentialsToTrustedOrigins]]\r\n * is enabled (opt-in). When enabled, the origin of `settingsUrl` is implicitly trusted (the credentials\r\n * belong to that server); any other origin must be listed in [[trustedCredentialsOrigins]].\r\n * @internal\r\n */\r\n public isCredentialsSharingAllowed(url: string, settingsUrl: string): boolean {\r\n if (!this.restrictCredentialsToTrustedOrigins)\r\n return true;\r\n\r\n const origin = tryGetOrigin(url);\r\n if (origin === undefined)\r\n return false;\r\n\r\n if (origin === tryGetOrigin(settingsUrl))\r\n return true;\r\n\r\n // Entries are normalized to their origin by the [[trustedCredentialsOrigins]] setter.\r\n return this._trustedCredentialsOrigins.includes(origin);\r\n }\r\n\r\n /** Origins for which a \"credentials sent to untrusted origin\" warning was already logged;\r\n * used to log the discovery warning only once per origin.\r\n */\r\n private readonly _untrustedUseLogged = new Set<string>();\r\n\r\n /** Logs a warning (once per origin) when credentials are sent to an origin that would be blocked\r\n * if [[restrictCredentialsToTrustedOrigins]] were enabled.\r\n * Helps applications discover the origins they need to whitelist before opting in to the restriction.\r\n * If `settingsUrl` is supplied, requests sharing its origin are not logged, since that origin is\r\n * implicitly trusted for basic-auth.\r\n * @internal\r\n */\r\n public logUntrustedOriginUse(url: string, settingsUrl?: string): void {\r\n if (this.restrictCredentialsToTrustedOrigins)\r\n return; // restriction active; nothing to preview\r\n\r\n const origin = tryGetOrigin(url) ?? url;\r\n\r\n if (settingsUrl !== undefined && origin === tryGetOrigin(settingsUrl))\r\n return; // implicitly trusted for basic-auth\r\n\r\n if (this._untrustedUseLogged.has(origin) || this._trustedCredentialsOrigins.includes(origin))\r\n return;\r\n\r\n this._untrustedUseLogged.add(origin);\r\n Logger.logWarning(loggerCategory, `Credentials sent to origin '${origin}' which is not in MapLayerFormatRegistry.trustedCredentialsOrigins; `\r\n + \"this request would be blocked if restrictCredentialsToTrustedOrigins were enabled.\");\r\n }\r\n\r\n private _formats = new Map<string, MapLayerFormatEntry>();\r\n\r\n public isRegistered(formatId: string) { return this._formats.get(formatId) !== undefined; }\r\n\r\n public register(formatClass: MapLayerFormatType) {\r\n if (formatClass.formatId.length === 0)\r\n return; // must be an abstract class, ignore it\r\n\r\n this._formats.set(formatClass.formatId, { type: formatClass });\r\n }\r\n\r\n /** @beta */\r\n public setAccessClient(formatId: string, accessClient: MapLayerAccessClient): boolean {\r\n const entry = this._formats.get(formatId);\r\n if (entry !== undefined) {\r\n entry.accessClient = accessClient;\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /** @beta */\r\n public getAccessClient(formatId: string): MapLayerAccessClient | undefined {\r\n if (formatId.length === 0)\r\n return undefined;\r\n\r\n return this._formats.get(formatId)?.accessClient;\r\n }\r\n\r\n public get configOptions(): MapLayerOptions {\r\n return this._configOptions;\r\n }\r\n\r\n /** @internal */\r\n public createImageryMapLayerTree(layerSettings: ImageMapLayerSettings, layerIndex: number, iModel: IModelConnection): ImageryMapLayerTreeReference | undefined {\r\n const entry = this._formats.get(layerSettings.formatId);\r\n const format = entry?.type;\r\n if (format === undefined) {\r\n Logger.logError(loggerCategory, `Could not find format '${layerSettings.formatId}' in registry`);\r\n return undefined;\r\n }\r\n return format.createMapLayerTree(layerSettings, layerIndex, iModel);\r\n }\r\n\r\n /**\r\n * Returns a [[MapLayerImageryProvider]] based on the provided [[ImageMapLayerSettings]] object.\r\n * @internal\r\n */\r\n public createImageryProvider(layerSettings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n const entry = this._formats.get(layerSettings.formatId);\r\n const format = entry?.type;\r\n if (this._configOptions[layerSettings.formatId] !== undefined) {\r\n const keyValuePair = expectDefined(this._configOptions[layerSettings.formatId]);\r\n const key: MapLayerKey = { key: keyValuePair.key, value: keyValuePair.value };\r\n layerSettings = layerSettings.clone({ accessKey: key });\r\n }\r\n return (format === undefined) ? undefined : format.createImageryProvider(layerSettings);\r\n }\r\n\r\n /** @beta*/\r\n public async validateSource(opts: ValidateSourceArgs): Promise<MapLayerSourceValidation>;\r\n\r\n public async validateSource(formatId: string, url: string, userName?: string, password?: string, ignoreCache?: boolean): Promise<MapLayerSourceValidation>;\r\n\r\n /** @internal*/\r\n public async validateSource(formatIdOrArgs: string|ValidateSourceArgs, url?: string, userName?: string, password?: string, ignoreCache?: boolean): Promise<MapLayerSourceValidation> {\r\n let format: typeof MapLayerFormat | undefined;\r\n let args: ValidateSourceArgs | undefined;\r\n\r\n if (typeof formatIdOrArgs == \"string\" && url !== undefined) {\r\n const formatId = formatIdOrArgs;\r\n const entry = this._formats.get(formatId);\r\n format = entry?.type;\r\n if (format !== undefined) {\r\n const source = MapLayerSource.fromJSON({name: \"\", formatId, url});\r\n if (source !== undefined) {\r\n args = {source, ignoreCache};\r\n source.userName = userName;\r\n source.password = password;\r\n }\r\n\r\n }\r\n } else if (typeof formatIdOrArgs !== \"string\") {\r\n const entry = this._formats.get(formatIdOrArgs.source.formatId);\r\n format = entry?.type;\r\n args = formatIdOrArgs;\r\n }\r\n\r\n if (!args || !format)\r\n return { status: MapLayerSourceStatus.InvalidFormat };\r\n\r\n return format.validate(args);\r\n }\r\n}\r\n\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MapLayerImageryFormats.d.ts","sourceRoot":"","sources":["../../../../src/tile/map/MapLayerImageryFormats.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,OAAO,EAAE,qBAAqB,EAAoB,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAML,cAAc,EACd,uBAAuB,EAIvB,yBAAyB,EAQ1B,MAAM,aAAa,CAAC;AAErB;;;;GAIG;AACH,qBAAa,qBAAsB,SAAQ,cAAc;IACvD,gBAAgB;WACO,kBAAkB,CAAC,aAAa,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,yBAAyB,GAAG,SAAS;CAGrK;AAoLD,2KAA2K;AAC3K,cAAM,sBAAuB,SAAQ,qBAAqB;IACxD,OAAuB,QAAQ,SAAc;WACtB,qBAAqB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,uBAAuB,GAAG,SAAS;CAInH;AAaD,gBAAgB;AAEhB,eAAO,MAAM,8BAA8B,mCAA4I,CAAC"}
1
+ {"version":3,"file":"MapLayerImageryFormats.d.ts","sourceRoot":"","sources":["../../../../src/tile/map/MapLayerImageryFormats.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,OAAO,EAAE,qBAAqB,EAAoB,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAML,cAAc,EACd,uBAAuB,EAIvB,yBAAyB,EAS1B,MAAM,aAAa,CAAC;AAErB;;;;GAIG;AACH,qBAAa,qBAAsB,SAAQ,cAAc;IACvD,gBAAgB;WACO,kBAAkB,CAAC,aAAa,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,yBAAyB,GAAG,SAAS;CAGrK;AA8LD,2KAA2K;AAC3K,cAAM,sBAAuB,SAAQ,qBAAqB;IACxD,OAAuB,QAAQ,SAAc;WACtB,qBAAqB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,uBAAuB,GAAG,SAAS;CAInH;AAaD,gBAAgB;AAEhB,eAAO,MAAM,8BAA8B,mCAA4I,CAAC"}
@@ -1,4 +1,4 @@
1
- import { ArcGISMapLayerImageryProvider, ArcGisUtilities, BingMapsImageryLayerProvider, ImageryMapLayerTreeReference, MapBoxLayerImageryProvider, MapLayerFormat, MapLayerSource, MapLayerSourceStatus, TileUrlImageryProvider, WmsCapabilities, WmsMapLayerImageryProvider, WmtsCapabilities, WmtsMapLayerImageryProvider, } from "../internal";
1
+ import { ArcGISMapLayerImageryProvider, ArcGisUtilities, BingMapsImageryLayerProvider, ImageryMapLayerTreeReference, MapBoxLayerImageryProvider, MapLayerFormat, MapLayerSource, MapLayerSourceStatus, MapLayerUntrustedOriginError, TileUrlImageryProvider, WmsCapabilities, WmsMapLayerImageryProvider, WmtsCapabilities, WmtsMapLayerImageryProvider, } from "../internal";
2
2
  /** Base class imagery map layer formats.
3
3
  * Subclasses should override formatId and [[MapLayerFormat.createImageryProvider]].
4
4
  * @see [[MapLayerFormat]]
@@ -70,6 +70,14 @@ class WmsMapLayerFormat extends ImageryMapLayerFormat {
70
70
  return { status: MapLayerSourceStatus.Valid, subLayers };
71
71
  }
72
72
  catch (err) {
73
+ if (err instanceof MapLayerUntrustedOriginError) {
74
+ let blockedOrigin;
75
+ try {
76
+ blockedOrigin = new URL(err.url).origin;
77
+ }
78
+ catch { /* non-hierarchical URL */ }
79
+ return { status: MapLayerSourceStatus.UntrustedOrigin, blockedOrigin };
80
+ }
73
81
  let status = MapLayerSourceStatus.InvalidUrl;
74
82
  if (err?.status === 401) {
75
83
  status = ((userName && password) ? MapLayerSourceStatus.InvalidCredentials : MapLayerSourceStatus.RequireAuth);
@@ -135,6 +143,14 @@ class WmtsMapLayerFormat extends ImageryMapLayerFormat {
135
143
  return { status: MapLayerSourceStatus.Valid, subLayers };
136
144
  }
137
145
  catch (err) {
146
+ if (err instanceof MapLayerUntrustedOriginError) {
147
+ let blockedOrigin;
148
+ try {
149
+ blockedOrigin = new URL(err.url).origin;
150
+ }
151
+ catch { /* non-hierarchical URL */ }
152
+ return { status: MapLayerSourceStatus.UntrustedOrigin, blockedOrigin };
153
+ }
138
154
  let status = MapLayerSourceStatus.InvalidUrl;
139
155
  if (err?.status === 401) {
140
156
  status = ((userName && password) ? MapLayerSourceStatus.InvalidCredentials : MapLayerSourceStatus.RequireAuth);
@@ -1 +1 @@
1
- {"version":3,"file":"MapLayerImageryFormats.js","sourceRoot":"","sources":["../../../../src/tile/map/MapLayerImageryFormats.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module MapLayers\r\n */\r\nimport { ImageMapLayerSettings, MapSubLayerProps } from \"@itwin/core-common\";\r\nimport { IModelConnection } from \"../../IModelConnection\";\r\nimport {\r\n ArcGISMapLayerImageryProvider,\r\n ArcGisUtilities,\r\n BingMapsImageryLayerProvider,\r\n ImageryMapLayerTreeReference,\r\n MapBoxLayerImageryProvider,\r\n MapLayerFormat,\r\n MapLayerImageryProvider,\r\n MapLayerSource,\r\n MapLayerSourceStatus,\r\n MapLayerSourceValidation,\r\n MapLayerTileTreeReference,\r\n TileUrlImageryProvider,\r\n ValidateSourceArgs,\r\n WmsCapabilities,\r\n WmsMapLayerImageryProvider,\r\n WmtsCapabilities,\r\n WmtsCapability,\r\n WmtsMapLayerImageryProvider,\r\n} from \"../internal\";\r\n\r\n/** Base class imagery map layer formats.\r\n * Subclasses should override formatId and [[MapLayerFormat.createImageryProvider]].\r\n * @see [[MapLayerFormat]]\r\n * @beta\r\n */\r\nexport class ImageryMapLayerFormat extends MapLayerFormat {\r\n /** @internal */\r\n public static override createMapLayerTree(layerSettings: ImageMapLayerSettings, layerIndex: number, iModel: IModelConnection): MapLayerTileTreeReference | undefined {\r\n return new ImageryMapLayerTreeReference({ layerSettings, layerIndex, iModel });\r\n }\r\n}\r\n\r\nclass WmsMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"WMS\";\r\n\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n return new WmsMapLayerImageryProvider(settings);\r\n }\r\n public static override async validateSource(url: string, userName?: string, password?: string, ignoreCache?: boolean): Promise<MapLayerSourceValidation> {\r\n const source = MapLayerSource.fromJSON({name: \"\", formatId: WmsMapLayerFormat.formatId, url});\r\n if (source === undefined)\r\n return { status: MapLayerSourceStatus.InvalidFormat };\r\n source.userName = userName;\r\n source.password = password;\r\n return WmsMapLayerFormat.validate({source, ignoreCache});\r\n }\r\n\r\n public static override async validate(args: ValidateSourceArgs): Promise<MapLayerSourceValidation> {\r\n const {source, ignoreCache} = args;\r\n const { url, userName, password } = source;\r\n\r\n try {\r\n let subLayers: MapSubLayerProps[] | undefined;\r\n const maxVisibleSubLayers = 50;\r\n const capabilities = await WmsCapabilities.create(url, (userName && password ? {user: userName, password} : undefined), ignoreCache, source.collectQueryParams());\r\n if (capabilities !== undefined) {\r\n subLayers = capabilities.getSubLayers(false);\r\n const rootsSubLayer = subLayers?.find((sublayer) => sublayer.parent === undefined);\r\n const hasTooManyLayers = subLayers && subLayers.length > maxVisibleSubLayers;\r\n\r\n if (!Array.isArray(subLayers))\r\n return { status: MapLayerSourceStatus.Valid, subLayers };\r\n\r\n for (const subLayer of subLayers) {\r\n // In general for WMS, we prefer to have the children of root node visible, but not the root itself.\r\n // Thats simply to give more flexibility in the UI.\r\n // Two exceptions to this rule: If there are too many layers or the root node is not named.\r\n if (subLayer.id && subLayer.id === rootsSubLayer?.id\r\n && (!(subLayer.name && subLayer.name.length > 0) || hasTooManyLayers)) {\r\n subLayer.visible = true;\r\n break; // if root node is visible, don't bother turning ON any other layers\r\n }\r\n\r\n // Make children of the root node visible.\r\n if (subLayer.parent && subLayer.parent === rootsSubLayer?.id && !hasTooManyLayers) {\r\n const isUnnamedGroup = (layer: MapSubLayerProps) => {\r\n return layer.children && layer.children.length > 0 && (!layer.name || layer.name.length === 0);\r\n };\r\n\r\n const makeChildrenVisible = (layers: MapSubLayerProps[] | undefined, layer: MapSubLayerProps) => {\r\n layer?.children?.forEach((childId) => {\r\n const childSubLayer = subLayers?.find((child) => child?.id === childId);\r\n if (childSubLayer) {\r\n childSubLayer.visible = true;\r\n if (isUnnamedGroup(childSubLayer))\r\n makeChildrenVisible(layers, childSubLayer);\r\n }\r\n });\r\n };\r\n\r\n subLayer.visible = true;\r\n\r\n // If we got a unnamed group, make children visible recursively until we have a leaf or named group\r\n if (isUnnamedGroup(subLayer))\r\n makeChildrenVisible(subLayers, subLayer);\r\n }\r\n }\r\n }\r\n\r\n return { status: MapLayerSourceStatus.Valid, subLayers };\r\n } catch (err: any) {\r\n let status = MapLayerSourceStatus.InvalidUrl;\r\n if (err?.status === 401) {\r\n status = ((userName && password) ? MapLayerSourceStatus.InvalidCredentials : MapLayerSourceStatus.RequireAuth);\r\n }\r\n return { status};\r\n }\r\n }\r\n\r\n}\r\n\r\nclass WmtsMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"WMTS\";\r\n\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n return new WmtsMapLayerImageryProvider(settings);\r\n }\r\n\r\n public static override async validateSource(url: string, userName?: string, password?: string, ignoreCache?: boolean): Promise<MapLayerSourceValidation> {\r\n const source = MapLayerSource.fromJSON({name: \"\", formatId: WmtsMapLayerFormat.formatId, url});\r\n if (source === undefined)\r\n return { status: MapLayerSourceStatus.InvalidFormat };\r\n source.userName = userName;\r\n source.password = password;\r\n return WmtsMapLayerFormat.validate({source, ignoreCache});\r\n }\r\n\r\n public static override async validate(args: ValidateSourceArgs): Promise<MapLayerSourceValidation> {\r\n const {source, ignoreCache} = args;\r\n const { url, userName, password } = source;\r\n try {\r\n const subLayers: MapSubLayerProps[] = [];\r\n const capabilities = await WmtsCapabilities.create(url, (userName && password ? {user: userName, password} : undefined), ignoreCache, source.collectQueryParams());\r\n if (!capabilities)\r\n return { status: MapLayerSourceStatus.InvalidUrl };\r\n\r\n // Only returns layer that can be published in the Google maps or WGS84 aligned tile trees.\r\n let supportedTms: WmtsCapability.TileMatrixSet[] = [];\r\n const googleMapsTms = capabilities?.contents?.getGoogleMapsCompatibleTileMatrixSet();\r\n if (googleMapsTms) {\r\n supportedTms = googleMapsTms;\r\n }\r\n const wsg84Tms = capabilities?.contents?.getEpsg4326CompatibleTileMatrixSet();\r\n if (wsg84Tms) {\r\n supportedTms = supportedTms.concat(wsg84Tms);\r\n }\r\n\r\n if (supportedTms.length === 0) {\r\n // This WMTS server doesn't support either GoogleMaps or WSG84\r\n return { status: MapLayerSourceStatus.InvalidCoordinateSystem };\r\n }\r\n\r\n let subLayerId = 0;\r\n capabilities?.contents?.layers.forEach((layer) => {\r\n const hasSupportedTms = supportedTms?.some((tms) => {\r\n return layer.tileMatrixSetLinks.some((tmls) => tmls.tileMatrixSet === tms.identifier);\r\n });\r\n if (hasSupportedTms) {\r\n subLayers.push({\r\n name: layer.identifier,\r\n title: layer.title ?? layer.identifier,\r\n visible: (subLayers.length === 0), // Make the first layer visible.\r\n parent: undefined,\r\n children: undefined,\r\n id: subLayerId++,\r\n });\r\n }\r\n });\r\n\r\n // Return error if we could find a single compatible layer.\r\n if (subLayers.length === 0)\r\n return { status: MapLayerSourceStatus.InvalidTileTree };\r\n\r\n return { status: MapLayerSourceStatus.Valid, subLayers };\r\n } catch (err: any) {\r\n let status = MapLayerSourceStatus.InvalidUrl;\r\n if (err?.status === 401) {\r\n status = ((userName && password) ? MapLayerSourceStatus.InvalidCredentials : MapLayerSourceStatus.RequireAuth);\r\n }\r\n return { status};\r\n }\r\n }\r\n\r\n}\r\n\r\nclass ArcGISMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"ArcGIS\";\r\n public static override async validateSource(url: string, userName?: string, password?: string, ignoreCache?: boolean): Promise<MapLayerSourceValidation> {\r\n const source = MapLayerSource.fromJSON({name: \"\", formatId: WmtsMapLayerFormat.formatId, url});\r\n if (source === undefined)\r\n return { status: MapLayerSourceStatus.InvalidFormat };\r\n source.userName = userName;\r\n source.password = password;\r\n return WmtsMapLayerFormat.validate({source, ignoreCache});\r\n }\r\n\r\n public static override async validate(args: ValidateSourceArgs): Promise<MapLayerSourceValidation> {\r\n const urlValidation = ArcGisUtilities.validateUrl(args.source.url, \"MapServer\");\r\n if (urlValidation !== MapLayerSourceStatus.Valid)\r\n return {status: urlValidation};\r\n\r\n // Some Map service supporting only tiles don't include the 'Map' capabilities, thus we can't make it mandatory.\r\n return ArcGisUtilities.validateSource({...args, capabilitiesFilter: []});\r\n }\r\n\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n return new ArcGISMapLayerImageryProvider(settings);\r\n }\r\n}\r\n\r\n/** @deprecated in 5.11.0 - will not be removed until after 2027-07-03. Bing Maps imagery is deprecated. For basemap imagery providers, see `@itwin/map-layers-formats`. */\r\nclass BingMapsMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"BingMaps\";\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n return new BingMapsImageryLayerProvider(settings);\r\n }\r\n}\r\n\r\nclass MapBoxImageryMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"MapboxImagery\";\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n return new MapBoxLayerImageryProvider(settings);\r\n }\r\n}\r\nclass TileUrlMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"TileURL\";\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined { return new TileUrlImageryProvider(settings); }\r\n}\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/no-deprecated -- BingMapsMapLayerFormat is deprecated but must remain registered for legacy persisted styles.\r\nexport const internalMapLayerImageryFormats = [WmsMapLayerFormat, WmtsMapLayerFormat, ArcGISMapLayerFormat, BingMapsMapLayerFormat, MapBoxImageryMapLayerFormat, TileUrlMapLayerFormat];\r\n"]}
1
+ {"version":3,"file":"MapLayerImageryFormats.js","sourceRoot":"","sources":["../../../../src/tile/map/MapLayerImageryFormats.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module MapLayers\r\n */\r\nimport { ImageMapLayerSettings, MapSubLayerProps } from \"@itwin/core-common\";\r\nimport { IModelConnection } from \"../../IModelConnection\";\r\nimport {\r\n ArcGISMapLayerImageryProvider,\r\n ArcGisUtilities,\r\n BingMapsImageryLayerProvider,\r\n ImageryMapLayerTreeReference,\r\n MapBoxLayerImageryProvider,\r\n MapLayerFormat,\r\n MapLayerImageryProvider,\r\n MapLayerSource,\r\n MapLayerSourceStatus,\r\n MapLayerSourceValidation,\r\n MapLayerTileTreeReference,\r\n MapLayerUntrustedOriginError,\r\n TileUrlImageryProvider,\r\n ValidateSourceArgs,\r\n WmsCapabilities,\r\n WmsMapLayerImageryProvider,\r\n WmtsCapabilities,\r\n WmtsCapability,\r\n WmtsMapLayerImageryProvider,\r\n} from \"../internal\";\r\n\r\n/** Base class imagery map layer formats.\r\n * Subclasses should override formatId and [[MapLayerFormat.createImageryProvider]].\r\n * @see [[MapLayerFormat]]\r\n * @beta\r\n */\r\nexport class ImageryMapLayerFormat extends MapLayerFormat {\r\n /** @internal */\r\n public static override createMapLayerTree(layerSettings: ImageMapLayerSettings, layerIndex: number, iModel: IModelConnection): MapLayerTileTreeReference | undefined {\r\n return new ImageryMapLayerTreeReference({ layerSettings, layerIndex, iModel });\r\n }\r\n}\r\n\r\nclass WmsMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"WMS\";\r\n\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n return new WmsMapLayerImageryProvider(settings);\r\n }\r\n public static override async validateSource(url: string, userName?: string, password?: string, ignoreCache?: boolean): Promise<MapLayerSourceValidation> {\r\n const source = MapLayerSource.fromJSON({name: \"\", formatId: WmsMapLayerFormat.formatId, url});\r\n if (source === undefined)\r\n return { status: MapLayerSourceStatus.InvalidFormat };\r\n source.userName = userName;\r\n source.password = password;\r\n return WmsMapLayerFormat.validate({source, ignoreCache});\r\n }\r\n\r\n public static override async validate(args: ValidateSourceArgs): Promise<MapLayerSourceValidation> {\r\n const {source, ignoreCache} = args;\r\n const { url, userName, password } = source;\r\n\r\n try {\r\n let subLayers: MapSubLayerProps[] | undefined;\r\n const maxVisibleSubLayers = 50;\r\n const capabilities = await WmsCapabilities.create(url, (userName && password ? {user: userName, password} : undefined), ignoreCache, source.collectQueryParams());\r\n if (capabilities !== undefined) {\r\n subLayers = capabilities.getSubLayers(false);\r\n const rootsSubLayer = subLayers?.find((sublayer) => sublayer.parent === undefined);\r\n const hasTooManyLayers = subLayers && subLayers.length > maxVisibleSubLayers;\r\n\r\n if (!Array.isArray(subLayers))\r\n return { status: MapLayerSourceStatus.Valid, subLayers };\r\n\r\n for (const subLayer of subLayers) {\r\n // In general for WMS, we prefer to have the children of root node visible, but not the root itself.\r\n // Thats simply to give more flexibility in the UI.\r\n // Two exceptions to this rule: If there are too many layers or the root node is not named.\r\n if (subLayer.id && subLayer.id === rootsSubLayer?.id\r\n && (!(subLayer.name && subLayer.name.length > 0) || hasTooManyLayers)) {\r\n subLayer.visible = true;\r\n break; // if root node is visible, don't bother turning ON any other layers\r\n }\r\n\r\n // Make children of the root node visible.\r\n if (subLayer.parent && subLayer.parent === rootsSubLayer?.id && !hasTooManyLayers) {\r\n const isUnnamedGroup = (layer: MapSubLayerProps) => {\r\n return layer.children && layer.children.length > 0 && (!layer.name || layer.name.length === 0);\r\n };\r\n\r\n const makeChildrenVisible = (layers: MapSubLayerProps[] | undefined, layer: MapSubLayerProps) => {\r\n layer?.children?.forEach((childId) => {\r\n const childSubLayer = subLayers?.find((child) => child?.id === childId);\r\n if (childSubLayer) {\r\n childSubLayer.visible = true;\r\n if (isUnnamedGroup(childSubLayer))\r\n makeChildrenVisible(layers, childSubLayer);\r\n }\r\n });\r\n };\r\n\r\n subLayer.visible = true;\r\n\r\n // If we got a unnamed group, make children visible recursively until we have a leaf or named group\r\n if (isUnnamedGroup(subLayer))\r\n makeChildrenVisible(subLayers, subLayer);\r\n }\r\n }\r\n }\r\n\r\n return { status: MapLayerSourceStatus.Valid, subLayers };\r\n } catch (err: any) {\r\n if (err instanceof MapLayerUntrustedOriginError) {\r\n let blockedOrigin: string | undefined;\r\n try { blockedOrigin = new URL(err.url).origin; } catch { /* non-hierarchical URL */ }\r\n return { status: MapLayerSourceStatus.UntrustedOrigin, blockedOrigin };\r\n }\r\n let status = MapLayerSourceStatus.InvalidUrl;\r\n if (err?.status === 401) {\r\n status = ((userName && password) ? MapLayerSourceStatus.InvalidCredentials : MapLayerSourceStatus.RequireAuth);\r\n }\r\n return { status};\r\n }\r\n }\r\n\r\n}\r\n\r\nclass WmtsMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"WMTS\";\r\n\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n return new WmtsMapLayerImageryProvider(settings);\r\n }\r\n\r\n public static override async validateSource(url: string, userName?: string, password?: string, ignoreCache?: boolean): Promise<MapLayerSourceValidation> {\r\n const source = MapLayerSource.fromJSON({name: \"\", formatId: WmtsMapLayerFormat.formatId, url});\r\n if (source === undefined)\r\n return { status: MapLayerSourceStatus.InvalidFormat };\r\n source.userName = userName;\r\n source.password = password;\r\n return WmtsMapLayerFormat.validate({source, ignoreCache});\r\n }\r\n\r\n public static override async validate(args: ValidateSourceArgs): Promise<MapLayerSourceValidation> {\r\n const {source, ignoreCache} = args;\r\n const { url, userName, password } = source;\r\n try {\r\n const subLayers: MapSubLayerProps[] = [];\r\n const capabilities = await WmtsCapabilities.create(url, (userName && password ? {user: userName, password} : undefined), ignoreCache, source.collectQueryParams());\r\n if (!capabilities)\r\n return { status: MapLayerSourceStatus.InvalidUrl };\r\n\r\n // Only returns layer that can be published in the Google maps or WGS84 aligned tile trees.\r\n let supportedTms: WmtsCapability.TileMatrixSet[] = [];\r\n const googleMapsTms = capabilities?.contents?.getGoogleMapsCompatibleTileMatrixSet();\r\n if (googleMapsTms) {\r\n supportedTms = googleMapsTms;\r\n }\r\n const wsg84Tms = capabilities?.contents?.getEpsg4326CompatibleTileMatrixSet();\r\n if (wsg84Tms) {\r\n supportedTms = supportedTms.concat(wsg84Tms);\r\n }\r\n\r\n if (supportedTms.length === 0) {\r\n // This WMTS server doesn't support either GoogleMaps or WSG84\r\n return { status: MapLayerSourceStatus.InvalidCoordinateSystem };\r\n }\r\n\r\n let subLayerId = 0;\r\n capabilities?.contents?.layers.forEach((layer) => {\r\n const hasSupportedTms = supportedTms?.some((tms) => {\r\n return layer.tileMatrixSetLinks.some((tmls) => tmls.tileMatrixSet === tms.identifier);\r\n });\r\n if (hasSupportedTms) {\r\n subLayers.push({\r\n name: layer.identifier,\r\n title: layer.title ?? layer.identifier,\r\n visible: (subLayers.length === 0), // Make the first layer visible.\r\n parent: undefined,\r\n children: undefined,\r\n id: subLayerId++,\r\n });\r\n }\r\n });\r\n\r\n // Return error if we could find a single compatible layer.\r\n if (subLayers.length === 0)\r\n return { status: MapLayerSourceStatus.InvalidTileTree };\r\n\r\n return { status: MapLayerSourceStatus.Valid, subLayers };\r\n } catch (err: any) {\r\n if (err instanceof MapLayerUntrustedOriginError) {\r\n let blockedOrigin: string | undefined;\r\n try { blockedOrigin = new URL(err.url).origin; } catch { /* non-hierarchical URL */ }\r\n return { status: MapLayerSourceStatus.UntrustedOrigin, blockedOrigin };\r\n }\r\n let status = MapLayerSourceStatus.InvalidUrl;\r\n if (err?.status === 401) {\r\n status = ((userName && password) ? MapLayerSourceStatus.InvalidCredentials : MapLayerSourceStatus.RequireAuth);\r\n }\r\n return { status};\r\n }\r\n }\r\n\r\n}\r\n\r\nclass ArcGISMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"ArcGIS\";\r\n public static override async validateSource(url: string, userName?: string, password?: string, ignoreCache?: boolean): Promise<MapLayerSourceValidation> {\r\n const source = MapLayerSource.fromJSON({name: \"\", formatId: WmtsMapLayerFormat.formatId, url});\r\n if (source === undefined)\r\n return { status: MapLayerSourceStatus.InvalidFormat };\r\n source.userName = userName;\r\n source.password = password;\r\n return WmtsMapLayerFormat.validate({source, ignoreCache});\r\n }\r\n\r\n public static override async validate(args: ValidateSourceArgs): Promise<MapLayerSourceValidation> {\r\n const urlValidation = ArcGisUtilities.validateUrl(args.source.url, \"MapServer\");\r\n if (urlValidation !== MapLayerSourceStatus.Valid)\r\n return {status: urlValidation};\r\n\r\n // Some Map service supporting only tiles don't include the 'Map' capabilities, thus we can't make it mandatory.\r\n return ArcGisUtilities.validateSource({...args, capabilitiesFilter: []});\r\n }\r\n\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n return new ArcGISMapLayerImageryProvider(settings);\r\n }\r\n}\r\n\r\n/** @deprecated in 5.11.0 - will not be removed until after 2027-07-03. Bing Maps imagery is deprecated. For basemap imagery providers, see `@itwin/map-layers-formats`. */\r\nclass BingMapsMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"BingMaps\";\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n return new BingMapsImageryLayerProvider(settings);\r\n }\r\n}\r\n\r\nclass MapBoxImageryMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"MapboxImagery\";\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined {\r\n return new MapBoxLayerImageryProvider(settings);\r\n }\r\n}\r\nclass TileUrlMapLayerFormat extends ImageryMapLayerFormat {\r\n public static override formatId = \"TileURL\";\r\n public static override createImageryProvider(settings: ImageMapLayerSettings): MapLayerImageryProvider | undefined { return new TileUrlImageryProvider(settings); }\r\n}\r\n\r\n/** @internal */\r\n// eslint-disable-next-line @typescript-eslint/no-deprecated -- BingMapsMapLayerFormat is deprecated but must remain registered for legacy persisted styles.\r\nexport const internalMapLayerImageryFormats = [WmsMapLayerFormat, WmtsMapLayerFormat, ArcGISMapLayerFormat, BingMapsMapLayerFormat, MapBoxImageryMapLayerFormat, TileUrlMapLayerFormat];\r\n"]}