@itwin/map-layers-auth 3.2.0-dev.71

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 (58) hide show
  1. package/README.md +32 -0
  2. package/lib/cjs/ArcGis/ArcGisAccessClient.d.ts +67 -0
  3. package/lib/cjs/ArcGis/ArcGisAccessClient.d.ts.map +1 -0
  4. package/lib/cjs/ArcGis/ArcGisAccessClient.js +295 -0
  5. package/lib/cjs/ArcGis/ArcGisAccessClient.js.map +1 -0
  6. package/lib/cjs/ArcGis/ArcGisOAuth2Endpoint.d.ts +23 -0
  7. package/lib/cjs/ArcGis/ArcGisOAuth2Endpoint.d.ts.map +1 -0
  8. package/lib/cjs/ArcGis/ArcGisOAuth2Endpoint.js +47 -0
  9. package/lib/cjs/ArcGis/ArcGisOAuth2Endpoint.js.map +1 -0
  10. package/lib/cjs/ArcGis/ArcGisOauthRedirect.d.ts +4 -0
  11. package/lib/cjs/ArcGis/ArcGisOauthRedirect.d.ts.map +1 -0
  12. package/lib/cjs/ArcGis/ArcGisOauthRedirect.js +31 -0
  13. package/lib/cjs/ArcGis/ArcGisOauthRedirect.js.map +1 -0
  14. package/lib/cjs/ArcGis/ArcGisTokenGenerator.d.ts +42 -0
  15. package/lib/cjs/ArcGis/ArcGisTokenGenerator.d.ts.map +1 -0
  16. package/lib/cjs/ArcGis/ArcGisTokenGenerator.js +111 -0
  17. package/lib/cjs/ArcGis/ArcGisTokenGenerator.js.map +1 -0
  18. package/lib/cjs/ArcGis/ArcGisTokenManager.d.ts +21 -0
  19. package/lib/cjs/ArcGis/ArcGisTokenManager.d.ts.map +1 -0
  20. package/lib/cjs/ArcGis/ArcGisTokenManager.js +110 -0
  21. package/lib/cjs/ArcGis/ArcGisTokenManager.js.map +1 -0
  22. package/lib/cjs/ArcGis/ArcGisUrl.d.ts +7 -0
  23. package/lib/cjs/ArcGis/ArcGisUrl.d.ts.map +1 -0
  24. package/lib/cjs/ArcGis/ArcGisUrl.js +50 -0
  25. package/lib/cjs/ArcGis/ArcGisUrl.js.map +1 -0
  26. package/lib/cjs/map-layers-auth.d.ts +7 -0
  27. package/lib/cjs/map-layers-auth.d.ts.map +1 -0
  28. package/lib/cjs/map-layers-auth.js +23 -0
  29. package/lib/cjs/map-layers-auth.js.map +1 -0
  30. package/lib/esm/ArcGis/ArcGisAccessClient.d.ts +67 -0
  31. package/lib/esm/ArcGis/ArcGisAccessClient.d.ts.map +1 -0
  32. package/lib/esm/ArcGis/ArcGisAccessClient.js +291 -0
  33. package/lib/esm/ArcGis/ArcGisAccessClient.js.map +1 -0
  34. package/lib/esm/ArcGis/ArcGisOAuth2Endpoint.d.ts +23 -0
  35. package/lib/esm/ArcGis/ArcGisOAuth2Endpoint.d.ts.map +1 -0
  36. package/lib/esm/ArcGis/ArcGisOAuth2Endpoint.js +43 -0
  37. package/lib/esm/ArcGis/ArcGisOAuth2Endpoint.js.map +1 -0
  38. package/lib/esm/ArcGis/ArcGisOauthRedirect.d.ts +4 -0
  39. package/lib/esm/ArcGis/ArcGisOauthRedirect.d.ts.map +1 -0
  40. package/lib/esm/ArcGis/ArcGisOauthRedirect.js +27 -0
  41. package/lib/esm/ArcGis/ArcGisOauthRedirect.js.map +1 -0
  42. package/lib/esm/ArcGis/ArcGisTokenGenerator.d.ts +42 -0
  43. package/lib/esm/ArcGis/ArcGisTokenGenerator.d.ts.map +1 -0
  44. package/lib/esm/ArcGis/ArcGisTokenGenerator.js +107 -0
  45. package/lib/esm/ArcGis/ArcGisTokenGenerator.js.map +1 -0
  46. package/lib/esm/ArcGis/ArcGisTokenManager.d.ts +21 -0
  47. package/lib/esm/ArcGis/ArcGisTokenManager.d.ts.map +1 -0
  48. package/lib/esm/ArcGis/ArcGisTokenManager.js +106 -0
  49. package/lib/esm/ArcGis/ArcGisTokenManager.js.map +1 -0
  50. package/lib/esm/ArcGis/ArcGisUrl.d.ts +7 -0
  51. package/lib/esm/ArcGis/ArcGisUrl.d.ts.map +1 -0
  52. package/lib/esm/ArcGis/ArcGisUrl.js +46 -0
  53. package/lib/esm/ArcGis/ArcGisUrl.js.map +1 -0
  54. package/lib/esm/map-layers-auth.d.ts +7 -0
  55. package/lib/esm/map-layers-auth.d.ts.map +1 -0
  56. package/lib/esm/map-layers-auth.js +11 -0
  57. package/lib/esm/map-layers-auth.js.map +1 -0
  58. package/package.json +118 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArcGisTokenGenerator.js","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisTokenGenerator.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\nimport { MapLayerAccessToken } from \"@itwin/core-frontend\";\r\n\r\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\n/** @internal */\r\nexport interface ArcGisOAuth2Token extends MapLayerAccessToken {\r\n\r\n // The expiration time of the token in milliseconds (UNIX time)\r\n expiresAt: number;\r\n\r\n // This property will show as true if the token must always pass over ssl.\r\n ssl: boolean;\r\n\r\n // Username associated with this token\r\n userName: string;\r\n\r\n // A Binary value that, if true, implies that the user had checked \"Keep me signed in\"\r\n persist?: boolean;\r\n}\r\n\r\n/** @internal */\r\nexport interface ArcGisToken extends MapLayerAccessToken {\r\n // The expiration time of the token in milliseconds since January 1, 1970 (UTC).\r\n expires: number;\r\n\r\n // This property will show as true if the token must always pass over ssl.\r\n ssl: boolean;\r\n}\r\n\r\n// client application's base URL, a user-specified IP address, or the IP address that is making the request.\r\n/** @internal */\r\nexport enum ArcGisTokenClientType {\r\n ip,\r\n referer,\r\n requestIp,\r\n}\r\n\r\n/** @internal */\r\nexport interface ArcGisGenerateTokenOptions {\r\n\r\n // The client type that will be granted access to the token.\r\n // Users will be able to specify whether the token will be generated for a client application's base URL,\r\n // a user-specified IP address, or the IP address that is making the request.\r\n client: ArcGisTokenClientType;\r\n\r\n // The IP address that will be using the created token for access.\r\n // On the Generate Token page, the IP address is specified in the IP Address field. This is required when client has been set as ip.\r\n // Example ip=11.11.111.111\r\n ip?: string;\r\n\r\n // The base URL of the client application that will use the token.\r\n // On the Generate Token page, the referrer URL is specified in the Webapp URL field.\r\n // Defaults to location.origin if undefined and client = referer.\r\n // This is required when client has been set as referer.\r\n // Example : referer=https://myserver/mywebapp\r\n referer?: string;\r\n\r\n // The token expiration time in minutes. The default is 60 minutes (one hour).\r\n // The maximum expiration period is 15 days. The maximum value of the expiration time is controlled by the server.\r\n // Requests for tokens larger than this time will be rejected.\r\n // Applications are responsible for renewing expired tokens;\r\n // expired tokens will be rejected by the server on subsequent requests that use the token.\r\n expiration?: number; // in minutes, defaults to 60 minutes\r\n}\r\n\r\n/** @internal */\r\nexport class ArcGisTokenGenerator {\r\n private static readonly restApiPath = \"/rest/\";\r\n private static readonly restApiInfoPath = \"info?f=pjson\";\r\n\r\n // Cache info url to avoid fetching/parsing twice for the same base url.\r\n private static _tokenServiceUrlCache = new Map<string, string>();\r\n\r\n public static async fetchTokenServiceUrl(arcGisRestServiceUrl: string): Promise<string | undefined> {\r\n const lowerUrl = arcGisRestServiceUrl.toLowerCase();\r\n const restApiIdx = lowerUrl.indexOf(ArcGisTokenGenerator.restApiPath);\r\n if (restApiIdx === -1)\r\n return undefined;\r\n const infoUrl = lowerUrl.substr(0, restApiIdx + ArcGisTokenGenerator.restApiPath.length) + ArcGisTokenGenerator.restApiInfoPath;\r\n\r\n let tokenServicesUrl: string | undefined;\r\n try {\r\n const response = await fetch(infoUrl, { method: \"GET\" });\r\n const json = await response.json();\r\n tokenServicesUrl = ArcGisTokenGenerator.getTokenServiceFromInfoJson(json);\r\n } catch (_error) {\r\n }\r\n return tokenServicesUrl;\r\n }\r\n\r\n public static getTokenServiceFromInfoJson(json: any): string | undefined {\r\n return json.authInfo?.isTokenBasedSecurity ? json?.authInfo?.tokenServicesUrl : undefined;\r\n }\r\n\r\n public async getTokenServiceUrl(baseUrl: string): Promise<string | undefined> {\r\n const cached = ArcGisTokenGenerator._tokenServiceUrlCache.get(baseUrl);\r\n if (cached !== undefined)\r\n return cached;\r\n\r\n const tokenServiceUrl = await ArcGisTokenGenerator.fetchTokenServiceUrl(baseUrl);\r\n if (tokenServiceUrl !== undefined)\r\n ArcGisTokenGenerator._tokenServiceUrlCache.set(baseUrl, tokenServiceUrl);\r\n\r\n return tokenServiceUrl;\r\n }\r\n\r\n // base url: ArcGis REST service base URL (format must be \"https://<host>/<instance>/rest/\")\r\n public async generate(arcGisRestServiceUrl: string, userName: string, password: string, options: ArcGisGenerateTokenOptions): Promise<any> {\r\n const tokenServiceUrl = await this.getTokenServiceUrl(arcGisRestServiceUrl);\r\n if (!tokenServiceUrl)\r\n return undefined;\r\n\r\n let token: undefined;\r\n try {\r\n const encodedUsername = encodeURIComponent(userName);\r\n const encodedPassword = encodeURIComponent(password);\r\n\r\n // Compose the expiration param\r\n let expirationStr = \"\";\r\n if (options.expiration) {\r\n expirationStr = `&expiration=${options.expiration}`;\r\n }\r\n\r\n // Compose the client param\r\n let clientStr = \"\";\r\n if (options.client === ArcGisTokenClientType.referer) {\r\n let refererStr = \"\";\r\n if (options.referer === undefined) {\r\n refererStr = encodeURIComponent(location.origin); // default to application origin\r\n } else {\r\n refererStr = encodeURIComponent(options.referer);\r\n }\r\n\r\n clientStr = `&client=referer&referer=${refererStr}`;\r\n } else if (options.client === ArcGisTokenClientType.ip) {\r\n if (options.ip === undefined)\r\n return token;\r\n clientStr = `&client=ip&ip=${options.ip}`;\r\n } else if (options.client === ArcGisTokenClientType.requestIp) {\r\n clientStr = `&client=requestip&ip=`;\r\n }\r\n\r\n const httpRequestOptions: RequestInit = {\r\n method: \"POST\",\r\n body: `username=${encodedUsername}&password=${encodedPassword}${clientStr}${expirationStr}&f=pjson`,\r\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\r\n };\r\n\r\n const response = await fetch(tokenServiceUrl, httpRequestOptions);\r\n\r\n // Check a token was really generated (an error could be part of the body)\r\n token = await response.json();\r\n\r\n } catch (_error) {\r\n }\r\n return token;\r\n }\r\n\r\n // Encode following 'application/x-www-form-urlencoded' standard (https://www.w3.org/TR/html401/interact/forms.html#h-17.13.3.3)\r\n // Also mentioned here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\r\n public static formEncode(str: string): string {\r\n return ArcGisTokenGenerator.rfc1738Encode(str).replace(/%20/g, \"+\");\r\n }\r\n\r\n // Encode following RFC1738 standard (https://www.ietf.org/rfc/rfc1738.txt)\r\n // Code from https://locutus.io/php/url/rawurlencode/\r\n public static rfc1738Encode(str: string): string {\r\n return encodeURIComponent(str)\r\n .replace(/!/g, \"%21\")\r\n .replace(/'/g, \"%27\")\r\n .replace(/\\(/g, \"%28\")\r\n .replace(/\\)/g, \"%29\")\r\n .replace(/\\*/g, \"%2A\");\r\n }\r\n}\r\n"]}
@@ -0,0 +1,21 @@
1
+ /** @packageDocumentation
2
+ * @module Tiles
3
+ */
4
+ import { MapLayerAccessToken } from "@itwin/core-frontend";
5
+ import { ArcGisGenerateTokenOptions, ArcGisOAuth2Token, ArcGisToken } from "./ArcGisTokenGenerator";
6
+ /** @internal */
7
+ export declare class ArcGisTokenManager {
8
+ private static readonly tokenExpiryThreshold;
9
+ private static _cache;
10
+ private static _oauth2Cache;
11
+ private static _generator;
12
+ private static readonly _browserStorageKey;
13
+ static getToken(arcGisRestServiceUrl: string, userName: string, password: string, options: ArcGisGenerateTokenOptions): Promise<ArcGisToken | undefined>;
14
+ static invalidateToken(token: MapLayerAccessToken): boolean;
15
+ static getOAuth2Token(key: string): ArcGisOAuth2Token | undefined;
16
+ static invalidateOAuth2Token(token: MapLayerAccessToken): boolean;
17
+ static setOAuth2Token(key: string, token: ArcGisOAuth2Token): void;
18
+ static loadFromBrowserStorage(): void;
19
+ static saveToBrowserStorage(): void;
20
+ }
21
+ //# sourceMappingURL=ArcGisTokenManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArcGisTokenManager.d.ts","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisTokenManager.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,WAAW,EAAwB,MAAM,wBAAwB,CAAC;AAO1H,gBAAgB;AAChB,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAU;IACtD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAkC;IACvD,OAAO,CAAC,MAAM,CAAC,YAAY,CAA6C;IACxE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAmC;IAC5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAiB;WAEvC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;WAyBvJ,eAAe,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO;WAUpD,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;WAiB1D,qBAAqB,CAAC,KAAK,EAAE,mBAAmB;WAYhD,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB;WAWpD,sBAAsB;WAoBtB,oBAAoB;CAqBnC"}
@@ -0,0 +1,106 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ /** @packageDocumentation
6
+ * @module Tiles
7
+ */
8
+ import { ArcGisTokenGenerator } from "./ArcGisTokenGenerator";
9
+ /** @internal */
10
+ export class ArcGisTokenManager {
11
+ static async getToken(arcGisRestServiceUrl, userName, password, options) {
12
+ if (!ArcGisTokenManager._generator)
13
+ ArcGisTokenManager._generator = new ArcGisTokenGenerator();
14
+ const tokenCacheKey = `${encodeURIComponent(userName)}@${arcGisRestServiceUrl}`;
15
+ // First check in the session cache
16
+ const cachedToken = ArcGisTokenManager._cache.get(tokenCacheKey);
17
+ // Check if token is in cached and is valid within the threshold, if not, generate a new token immediately.
18
+ if (cachedToken !== undefined && (cachedToken.expires - (+new Date()) > ArcGisTokenManager.tokenExpiryThreshold)) {
19
+ return cachedToken;
20
+ }
21
+ // Nothing in cache, generate a new token
22
+ const newToken = await ArcGisTokenManager._generator.generate(arcGisRestServiceUrl, userName, password, options);
23
+ if (newToken.token) {
24
+ const token = newToken;
25
+ ArcGisTokenManager._cache.set(tokenCacheKey, token);
26
+ return token;
27
+ }
28
+ return undefined;
29
+ }
30
+ static invalidateToken(token) {
31
+ for (const [key, value] of ArcGisTokenManager._cache) {
32
+ if (value.token === token.token)
33
+ return ArcGisTokenManager._cache.delete(key);
34
+ }
35
+ return false;
36
+ }
37
+ static getOAuth2Token(key) {
38
+ if (ArcGisTokenManager._oauth2Cache === undefined) {
39
+ ArcGisTokenManager._oauth2Cache = new Map();
40
+ ArcGisTokenManager.loadFromBrowserStorage();
41
+ }
42
+ const cachedToken = ArcGisTokenManager._oauth2Cache.get(key);
43
+ // If cached token has expired (or about to expire), invalidate don't return it.
44
+ if (cachedToken !== undefined && (cachedToken.expiresAt - (+new Date()) < ArcGisTokenManager.tokenExpiryThreshold)) {
45
+ ArcGisTokenManager._oauth2Cache.delete(key);
46
+ return undefined;
47
+ }
48
+ return cachedToken;
49
+ }
50
+ static invalidateOAuth2Token(token) {
51
+ if (ArcGisTokenManager._oauth2Cache) {
52
+ for (const [key, value] of ArcGisTokenManager._oauth2Cache) {
53
+ if (value.token === token.token)
54
+ return ArcGisTokenManager._cache.delete(key);
55
+ }
56
+ }
57
+ return false;
58
+ }
59
+ static setOAuth2Token(key, token) {
60
+ if (ArcGisTokenManager._oauth2Cache === undefined) {
61
+ ArcGisTokenManager._oauth2Cache = new Map();
62
+ }
63
+ ArcGisTokenManager._oauth2Cache.set(key, token);
64
+ ArcGisTokenManager.saveToBrowserStorage();
65
+ }
66
+ static loadFromBrowserStorage() {
67
+ var _a, _b;
68
+ if (ArcGisTokenManager._oauth2Cache === undefined) {
69
+ return;
70
+ }
71
+ const loadEntries = (json) => {
72
+ if (json && ArcGisTokenManager._oauth2Cache !== undefined) {
73
+ const tokens = JSON.parse(json);
74
+ if (tokens) {
75
+ for (const [key, value] of Object.entries(tokens)) {
76
+ ArcGisTokenManager._oauth2Cache.set(key, value);
77
+ }
78
+ }
79
+ }
80
+ };
81
+ loadEntries((_a = window.sessionStorage.getItem(this._browserStorageKey)) !== null && _a !== void 0 ? _a : undefined);
82
+ loadEntries((_b = window.localStorage.getItem(this._browserStorageKey)) !== null && _b !== void 0 ? _b : undefined);
83
+ }
84
+ static saveToBrowserStorage() {
85
+ if (ArcGisTokenManager._oauth2Cache === undefined) {
86
+ return;
87
+ }
88
+ const sessionTokens = {};
89
+ const storageTokens = {};
90
+ ArcGisTokenManager._oauth2Cache.forEach((value, key) => {
91
+ // ignore the persist flag for now, and only save to session storage
92
+ // if (value.persist === true) {
93
+ // storageTokens[key] = value;
94
+ // } else {
95
+ // sessionTokens[key] = value;
96
+ // }
97
+ sessionTokens[key] = value;
98
+ });
99
+ window.sessionStorage.setItem(this._browserStorageKey, JSON.stringify(sessionTokens));
100
+ window.localStorage.setItem(this._browserStorageKey, JSON.stringify(storageTokens));
101
+ }
102
+ }
103
+ ArcGisTokenManager.tokenExpiryThreshold = 300000; // 5 minutes in milliseconds
104
+ ArcGisTokenManager._cache = new Map();
105
+ ArcGisTokenManager._browserStorageKey = "arcGisOAuth";
106
+ //# sourceMappingURL=ArcGisTokenManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArcGisTokenManager.js","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisTokenManager.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 Tiles\r\n */\r\n\r\nimport { MapLayerAccessToken } from \"@itwin/core-frontend\";\r\nimport { ArcGisGenerateTokenOptions, ArcGisOAuth2Token, ArcGisToken, ArcGisTokenGenerator } from \"./ArcGisTokenGenerator\";\r\n\r\n/** @internal */\r\ninterface ArcGisTokenProps {\r\n [hostname: string]: ArcGisOAuth2Token;\r\n}\r\n\r\n/** @internal */\r\nexport class ArcGisTokenManager {\r\n private static readonly tokenExpiryThreshold = 300000; // 5 minutes in milliseconds\r\n private static _cache = new Map<string, ArcGisToken>();\r\n private static _oauth2Cache: Map<string, ArcGisOAuth2Token> | undefined;\r\n private static _generator: ArcGisTokenGenerator | undefined;\r\n private static readonly _browserStorageKey = \"arcGisOAuth\";\r\n\r\n public static async getToken(arcGisRestServiceUrl: string, userName: string, password: string, options: ArcGisGenerateTokenOptions): Promise<ArcGisToken | undefined> {\r\n if (!ArcGisTokenManager._generator)\r\n ArcGisTokenManager._generator = new ArcGisTokenGenerator();\r\n\r\n const tokenCacheKey = `${encodeURIComponent(userName)}@${arcGisRestServiceUrl}`;\r\n\r\n // First check in the session cache\r\n const cachedToken = ArcGisTokenManager._cache.get(tokenCacheKey);\r\n\r\n // Check if token is in cached and is valid within the threshold, if not, generate a new token immediately.\r\n if (cachedToken !== undefined && (cachedToken.expires - (+new Date()) > ArcGisTokenManager.tokenExpiryThreshold)) {\r\n return cachedToken;\r\n }\r\n\r\n // Nothing in cache, generate a new token\r\n const newToken = await ArcGisTokenManager._generator.generate(arcGisRestServiceUrl, userName, password, options);\r\n if (newToken.token) {\r\n const token = newToken as ArcGisToken;\r\n ArcGisTokenManager._cache.set(tokenCacheKey, token);\r\n return token;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n public static invalidateToken(token: MapLayerAccessToken): boolean {\r\n\r\n for (const [key, value] of ArcGisTokenManager._cache) {\r\n if (value.token === token.token)\r\n return ArcGisTokenManager._cache.delete(key);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public static getOAuth2Token(key: string): ArcGisOAuth2Token | undefined {\r\n if (ArcGisTokenManager._oauth2Cache === undefined) {\r\n ArcGisTokenManager._oauth2Cache = new Map<string, ArcGisOAuth2Token>();\r\n ArcGisTokenManager.loadFromBrowserStorage();\r\n }\r\n\r\n const cachedToken = ArcGisTokenManager._oauth2Cache.get(key);\r\n\r\n // If cached token has expired (or about to expire), invalidate don't return it.\r\n if (cachedToken !== undefined && (cachedToken.expiresAt - (+new Date()) < ArcGisTokenManager.tokenExpiryThreshold)) {\r\n ArcGisTokenManager._oauth2Cache.delete(key);\r\n return undefined;\r\n }\r\n\r\n return cachedToken;\r\n }\r\n\r\n public static invalidateOAuth2Token(token: MapLayerAccessToken) {\r\n\r\n if (ArcGisTokenManager._oauth2Cache) {\r\n for (const [key, value] of ArcGisTokenManager._oauth2Cache) {\r\n if (value.token === token.token)\r\n return ArcGisTokenManager._cache.delete(key);\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public static setOAuth2Token(key: string, token: ArcGisOAuth2Token) {\r\n\r\n if (ArcGisTokenManager._oauth2Cache === undefined) {\r\n ArcGisTokenManager._oauth2Cache = new Map<string, ArcGisOAuth2Token>();\r\n\r\n }\r\n ArcGisTokenManager._oauth2Cache.set(key, token);\r\n\r\n ArcGisTokenManager.saveToBrowserStorage();\r\n }\r\n\r\n public static loadFromBrowserStorage() {\r\n if (ArcGisTokenManager._oauth2Cache === undefined) {\r\n return;\r\n }\r\n\r\n const loadEntries = (json: string | undefined) => {\r\n if (json && ArcGisTokenManager._oauth2Cache !== undefined) {\r\n const tokens: ArcGisTokenProps | undefined = JSON.parse(json);\r\n if (tokens) {\r\n for (const [key, value] of Object.entries(tokens)) {\r\n ArcGisTokenManager._oauth2Cache.set(key, value);\r\n }\r\n }\r\n }\r\n };\r\n\r\n loadEntries(window.sessionStorage.getItem(this._browserStorageKey) ?? undefined);\r\n loadEntries(window.localStorage.getItem(this._browserStorageKey) ?? undefined);\r\n }\r\n\r\n public static saveToBrowserStorage() {\r\n\r\n if (ArcGisTokenManager._oauth2Cache === undefined) {\r\n return;\r\n }\r\n const sessionTokens: ArcGisTokenProps = {};\r\n const storageTokens: ArcGisTokenProps = {};\r\n\r\n ArcGisTokenManager._oauth2Cache.forEach((value: ArcGisOAuth2Token, key: string) => {\r\n // ignore the persist flag for now, and only save to session storage\r\n // if (value.persist === true) {\r\n // storageTokens[key] = value;\r\n // } else {\r\n // sessionTokens[key] = value;\r\n // }\r\n sessionTokens[key] = value;\r\n });\r\n window.sessionStorage.setItem(this._browserStorageKey, JSON.stringify(sessionTokens));\r\n window.localStorage.setItem(this._browserStorageKey, JSON.stringify(storageTokens));\r\n }\r\n\r\n}\r\n"]}
@@ -0,0 +1,7 @@
1
+ /** @internal */
2
+ export declare class ArcGisUrl {
3
+ static extractRestBaseUrl(url: URL): URL | undefined;
4
+ static getRestUrlFromGenerateTokenUrl(url: URL): Promise<URL | undefined>;
5
+ private static fetchJson;
6
+ }
7
+ //# sourceMappingURL=ArcGisUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArcGisUrl.d.ts","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisUrl.ts"],"names":[],"mappings":"AAIA,gBAAgB;AAChB,qBAAa,SAAS;WAGN,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS;WAQvC,8BAA8B,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC;mBAwBjE,SAAS;CAS/B"}
@@ -0,0 +1,46 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ /** @internal */
6
+ export class ArcGisUrl {
7
+ // Extract the sub-url up to '/rest/'
8
+ static extractRestBaseUrl(url) {
9
+ const urlStr = url.toString();
10
+ const searchStr = "/rest/";
11
+ const restPos = urlStr.indexOf(searchStr);
12
+ return (restPos === -1 ? undefined : new URL(urlStr.substring(0, restPos + searchStr.length)));
13
+ }
14
+ static async getRestUrlFromGenerateTokenUrl(url) {
15
+ var _a;
16
+ const restUrl = ArcGisUrl.extractRestBaseUrl(url);
17
+ if (restUrl === undefined) {
18
+ return undefined;
19
+ }
20
+ // First attempt: derive the Oauth2 token URL from the 'tokenServicesUrl', exposed by the 'info request'
21
+ const infoUrl = new URL(`${restUrl.toString()}info`);
22
+ infoUrl.searchParams.append("f", "json");
23
+ let json;
24
+ try {
25
+ json = await ArcGisUrl.fetchJson(infoUrl);
26
+ }
27
+ catch {
28
+ }
29
+ const tokenServicesUrl = (_a = json === null || json === void 0 ? void 0 : json.authInfo) === null || _a === void 0 ? void 0 : _a.tokenServicesUrl;
30
+ if (tokenServicesUrl === undefined) {
31
+ return undefined;
32
+ }
33
+ return ArcGisUrl.extractRestBaseUrl(new URL(tokenServicesUrl));
34
+ }
35
+ static async fetchJson(url) {
36
+ let json;
37
+ try {
38
+ const response = await fetch(url.toString(), { method: "GET" });
39
+ json = await response.json();
40
+ }
41
+ catch {
42
+ }
43
+ return json;
44
+ }
45
+ }
46
+ //# sourceMappingURL=ArcGisUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArcGisUrl.js","sourceRoot":"","sources":["../../../src/ArcGis/ArcGisUrl.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,gBAAgB;AAChB,MAAM,OAAO,SAAS;IAEpB,qCAAqC;IAC9B,MAAM,CAAC,kBAAkB,CAAC,GAAQ;QACvC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,QAAQ,CAAC;QAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC1C,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAEjG,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,GAAQ;;QACzD,MAAM,OAAO,GAAG,SAAS,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,OAAO,SAAS,CAAC;SAClB;QAED,wGAAwG;QACxG,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrD,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEzC,IAAI,IAAI,CAAC;QACT,IAAI;YACF,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;SAC3C;QAAC,MAAM;SAEP;QAED,MAAM,gBAAgB,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,0CAAE,gBAAgB,CAAC;QAC1D,IAAI,gBAAgB,KAAK,SAAS,EAAE;YAClC,OAAO,SAAS,CAAC;SAClB;QACD,OAAO,SAAS,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACjE,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAQ;QACrC,IAAI,IAAI,CAAC;QACT,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAChE,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;SAC9B;QAAC,MAAM;SACP;QACD,OAAO,IAAI,CAAC;IACd,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/** @internal */\r\nexport class ArcGisUrl {\r\n\r\n // Extract the sub-url up to '/rest/'\r\n public static extractRestBaseUrl(url: URL): URL | undefined {\r\n const urlStr = url.toString();\r\n const searchStr = \"/rest/\";\r\n const restPos = urlStr.indexOf(searchStr);\r\n return (restPos === -1 ? undefined : new URL(urlStr.substring(0, restPos + searchStr.length)));\r\n\r\n }\r\n\r\n public static async getRestUrlFromGenerateTokenUrl(url: URL): Promise<URL | undefined> {\r\n const restUrl = ArcGisUrl.extractRestBaseUrl(url);\r\n if (restUrl === undefined) {\r\n return undefined;\r\n }\r\n\r\n // First attempt: derive the Oauth2 token URL from the 'tokenServicesUrl', exposed by the 'info request'\r\n const infoUrl = new URL(`${restUrl.toString()}info`);\r\n infoUrl.searchParams.append(\"f\", \"json\");\r\n\r\n let json;\r\n try {\r\n json = await ArcGisUrl.fetchJson(infoUrl);\r\n } catch {\r\n\r\n }\r\n\r\n const tokenServicesUrl = json?.authInfo?.tokenServicesUrl;\r\n if (tokenServicesUrl === undefined) {\r\n return undefined;\r\n }\r\n return ArcGisUrl.extractRestBaseUrl(new URL(tokenServicesUrl));\r\n }\r\n\r\n private static async fetchJson(url: URL): Promise<any> {\r\n let json;\r\n try {\r\n const response = await fetch(url.toString(), { method: \"GET\" });\r\n json = await response.json();\r\n } catch {\r\n }\r\n return json;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,7 @@
1
+ export * from "./ArcGis/ArcGisOAuth2Endpoint";
2
+ export * from "./ArcGis/ArcGisUrl";
3
+ export * from "./ArcGis/ArcGisAccessClient";
4
+ export * from "./ArcGis/ArcGisOauthRedirect";
5
+ export * from "./ArcGis/ArcGisTokenGenerator";
6
+ export * from "./ArcGis/ArcGisTokenManager";
7
+ //# sourceMappingURL=map-layers-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-layers-auth.d.ts","sourceRoot":"","sources":["../../src/map-layers-auth.ts"],"names":[],"mappings":"AAIA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,11 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ export * from "./ArcGis/ArcGisOAuth2Endpoint";
6
+ export * from "./ArcGis/ArcGisUrl";
7
+ export * from "./ArcGis/ArcGisAccessClient";
8
+ export * from "./ArcGis/ArcGisOauthRedirect";
9
+ export * from "./ArcGis/ArcGisTokenGenerator";
10
+ export * from "./ArcGis/ArcGisTokenManager";
11
+ //# sourceMappingURL=map-layers-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map-layers-auth.js","sourceRoot":"","sources":["../../src/map-layers-auth.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC","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\nexport * from \"./ArcGis/ArcGisOAuth2Endpoint\";\r\nexport * from \"./ArcGis/ArcGisUrl\";\r\nexport * from \"./ArcGis/ArcGisAccessClient\";\r\nexport * from \"./ArcGis/ArcGisOauthRedirect\";\r\nexport * from \"./ArcGis/ArcGisTokenGenerator\";\r\nexport * from \"./ArcGis/ArcGisTokenManager\";\r\n"]}
package/package.json ADDED
@@ -0,0 +1,118 @@
1
+ {
2
+ "name": "@itwin/map-layers-auth",
3
+ "version": "3.2.0-dev.71",
4
+ "description": "Extension that adds a Map Layers Widget",
5
+ "main": "lib/cjs/map-layers-auth.js",
6
+ "module": "lib/esm/map-layers-auth.js",
7
+ "typings": "lib/cjs/map-layers-auth",
8
+ "license": "MIT",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/iTwin/itwinjs-core/tree/master/extensions/map-layers-auth"
12
+ },
13
+ "keywords": [
14
+ "iModel",
15
+ "BIM",
16
+ "maps",
17
+ "extension"
18
+ ],
19
+ "author": {
20
+ "name": "Bentley Systems, Inc.",
21
+ "url": "http://www.bentley.com"
22
+ },
23
+ "devDependencies": {
24
+ "@itwin/build-tools": "3.2.0-dev.71",
25
+ "@itwin/core-bentley": "3.2.0-dev.71",
26
+ "@itwin/core-common": "3.2.0-dev.71",
27
+ "@itwin/core-frontend": "3.2.0-dev.71",
28
+ "@itwin/eslint-plugin": "3.2.0-dev.71",
29
+ "@itwin/itwinui-css": "0.x",
30
+ "@itwin/itwinui-react": "^1.32.0",
31
+ "@types/chai": "^4.1.4",
32
+ "@types/enzyme": "3.9.3",
33
+ "@types/mocha": "^8.2.2",
34
+ "@types/node": "14.14.31",
35
+ "@types/react": "^17.0.37",
36
+ "@types/sinon": "^9.0.0",
37
+ "@types/sinon-chai": "^3.2.0",
38
+ "chai": "^4.1.2",
39
+ "chai-as-promised": "^7",
40
+ "chai-jest-snapshot": "^2.0.0",
41
+ "chai-spies": "1.0.0",
42
+ "cpx2": "^3.0.0",
43
+ "enzyme": "^3.4.0",
44
+ "enzyme-to-json": "^3.3.4",
45
+ "eslint": "^7.11.0",
46
+ "jsdom": "^19.0.0",
47
+ "jsdom-global": "3.0.2",
48
+ "mocha": "^8.3.2",
49
+ "nyc": "^15.1.0",
50
+ "rimraf": "^3.0.2",
51
+ "sinon": "^9.0.2",
52
+ "sinon-chai": "^3.2.0",
53
+ "source-map-support": "^0.5.6",
54
+ "typemoq": "^2.1.0",
55
+ "typescript": "~4.4.0"
56
+ },
57
+ "dependencies": {
58
+ "classnames": "^2.3.1",
59
+ "react": "^17.0.0",
60
+ "react-dom": "^17.0.0"
61
+ },
62
+ "peerDependencies": {
63
+ "@itwin/core-bentley": "3.2.0-dev.71",
64
+ "@itwin/core-common": "3.2.0-dev.71",
65
+ "@itwin/core-frontend": "3.2.0-dev.71",
66
+ "@itwin/itwinui-css": "0.x",
67
+ "@itwin/itwinui-react": "^1.32.0"
68
+ },
69
+ "nyc": {
70
+ "extends": "./node_modules/@itwin/build-tools/.nycrc",
71
+ "check-coverage": false
72
+ },
73
+ "eslintConfig": {
74
+ "plugins": [
75
+ "@itwin"
76
+ ],
77
+ "extends": "plugin:@itwin/itwinjs-recommended"
78
+ },
79
+ "mocha": {
80
+ "require": [
81
+ "raf/polyfill",
82
+ "source-map-support/register",
83
+ "jsdom-global/register",
84
+ "ignore-styles"
85
+ ],
86
+ "checkLeaks": true,
87
+ "timeout": 60000,
88
+ "file": [],
89
+ "exclude": [
90
+ "lib/cjs/test/coverage/**/*"
91
+ ],
92
+ "reporter": [
93
+ "node_modules/@itwin/build-tools/mocha-reporter"
94
+ ],
95
+ "reporterOptions": [
96
+ "mochaFile=lib/test/junit_results.xml"
97
+ ]
98
+ },
99
+ "scripts": {
100
+ "build": "npm run -s copy:locale && npm run -s build:cjs",
101
+ "build:ci": "npm run -s build && npm run -s build:esm",
102
+ "build:cjs": "tsc 1>&2 --outDir lib/cjs && npm run -s copy:cjs",
103
+ "build:esm": "tsc 1>&2 --module ES2020 --outDir lib/esm && npm run -s copy:esm",
104
+ "clean": "rimraf lib .rush/temp/package-deps*.json",
105
+ "copy:locale": "",
106
+ "copy:cjs": "cpx \"./src/**/*.{*css,json,svg}\" \"./lib/cjs\"",
107
+ "copy:esm": "cpx \"./src/**/*.{*css,json,svg}\" \"./lib/esm\"",
108
+ "cover": "nyc npm -s test",
109
+ "docs": "",
110
+ "extract-api": "betools extract-api --entry=map-layers-auth && npm run extract-extension-api",
111
+ "extract-extension-api": "eslint --no-eslintrc -c \"../../tools/eslint-plugin/dist/configs/extension-exports-config.js\" \"./src/**/*.ts\" 1>&2",
112
+ "lint": "eslint -f visualstudio \"./src/**/*.{ts,tsx}\" 1>&2",
113
+ "pseudolocalize": "",
114
+ "test": "mocha \"./lib/cjs/test/**/*.test.js\"",
115
+ "rebuild": "npm run -s clean && npm run -s build"
116
+ },
117
+ "readme": "# MapLayers-auth Extension/Package\r\n\r\nCopyright © Bentley Systems, Incorporated. All rights reserved. See LICENSE.md for license terms and full copyright notice.\r\n\r\nAn iTwin.js Extension that adds a widget for attaching and updating map attachments in a view:\r\n\r\nThis extension serves as an example of a extension that can be added to iTwin.js host applications.\r\nSee <http://itwinjs.org> for comprehensive documentation on the iTwin.js API and the various constructs used in this sample.\r\n\r\nThis package can also be installed into an application and the method MapLayersUI.initialized() called during the host IModelApps initialize processing.\r\n\r\n## Development Setup\r\n\r\n1. Select and prepare an iTwin.js host application. You can use the [ui-test-app] to host the extension, for example.\r\n2. The dependencies are installed as part of \"rush install\" in the iTwin.js repository.\r\n3. Build the extension as part of the \"rush build\" in the iTwin.js repository, or separately build using the npm build command.\r\n\r\n ```sh\r\n npm run build\r\n ```\r\n\r\n4. Start the host application - go to its directory and run:\r\n\r\n ```sh\r\n npm run start:servers\r\n ```\r\n\r\n5. Open a web browser (e.g., Chrome), and browse to <http://localhost:3000>.\r\n\r\n## Contributing\r\n\r\n[Contributing to iTwin.js](https://github.com/iTwin/itwinjs-core/blob/master/CONTRIBUTING.md)\r\n"
118
+ }