@se-studio/contentful-cms 3.15.3 → 3.15.5

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 (111) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/HOSTED.md +20 -0
  3. package/README.md +1 -1
  4. package/dist/commands/host-scaffold.d.ts.map +1 -1
  5. package/dist/commands/host-scaffold.js +7 -5
  6. package/dist/commands/host-scaffold.js.map +1 -1
  7. package/dist/contentful/cma-user-agent.d.ts +1 -1
  8. package/dist/editor-pack/load.d.ts.map +1 -1
  9. package/dist/editor-pack/load.js +14 -2
  10. package/dist/editor-pack/load.js.map +1 -1
  11. package/dist/generated/help-topics.d.ts.map +1 -1
  12. package/dist/generated/help-topics.js +1 -1
  13. package/dist/generated/help-topics.js.map +1 -1
  14. package/dist/generated/hosted-guide.d.ts +1 -1
  15. package/dist/generated/hosted-guide.d.ts.map +1 -1
  16. package/dist/generated/hosted-guide.js +1 -1
  17. package/dist/generated/hosted-guide.js.map +1 -1
  18. package/dist/generated/version.d.ts +1 -1
  19. package/dist/generated/version.js +1 -1
  20. package/dist/hosted/index.d.ts +1 -1
  21. package/dist/hosted/index.d.ts.map +1 -1
  22. package/dist/hosted/index.js +1 -1
  23. package/dist/hosted/index.js.map +1 -1
  24. package/dist/hosted/next/pages/CmsEditPage.d.ts.map +1 -1
  25. package/dist/hosted/next/pages/CmsEditPage.js +1 -1
  26. package/dist/hosted/next/pages/CmsEditPage.js.map +1 -1
  27. package/dist/hosted/next/pages/HomePage.d.ts.map +1 -1
  28. package/dist/hosted/next/pages/HomePage.js +1 -1
  29. package/dist/hosted/next/pages/HomePage.js.map +1 -1
  30. package/dist/hosted/next/routes/mcp.d.ts +1 -0
  31. package/dist/hosted/next/routes/mcp.d.ts.map +1 -1
  32. package/dist/hosted/next/routes/mcp.js +6 -1
  33. package/dist/hosted/next/routes/mcp.js.map +1 -1
  34. package/dist/hosted/next/routes/oauth-authorization-server.d.ts +1 -0
  35. package/dist/hosted/next/routes/oauth-authorization-server.d.ts.map +1 -1
  36. package/dist/hosted/next/routes/oauth-authorization-server.js +5 -1
  37. package/dist/hosted/next/routes/oauth-authorization-server.js.map +1 -1
  38. package/dist/hosted/next/routes/oauth-protected-resource-path.d.ts +13 -0
  39. package/dist/hosted/next/routes/oauth-protected-resource-path.d.ts.map +1 -0
  40. package/dist/hosted/next/routes/oauth-protected-resource-path.js +17 -0
  41. package/dist/hosted/next/routes/oauth-protected-resource-path.js.map +1 -0
  42. package/dist/hosted/next/routes/oauth-protected-resource.d.ts +1 -0
  43. package/dist/hosted/next/routes/oauth-protected-resource.d.ts.map +1 -1
  44. package/dist/hosted/next/routes/oauth-protected-resource.js +5 -1
  45. package/dist/hosted/next/routes/oauth-protected-resource.js.map +1 -1
  46. package/dist/hosted/next/routes/oauth-register.d.ts +1 -0
  47. package/dist/hosted/next/routes/oauth-register.d.ts.map +1 -1
  48. package/dist/hosted/next/routes/oauth-register.js +5 -1
  49. package/dist/hosted/next/routes/oauth-register.js.map +1 -1
  50. package/dist/hosted/next/routes/oauth-token.d.ts +1 -0
  51. package/dist/hosted/next/routes/oauth-token.d.ts.map +1 -1
  52. package/dist/hosted/next/routes/oauth-token.js +5 -1
  53. package/dist/hosted/next/routes/oauth-token.js.map +1 -1
  54. package/dist/hosted/oauth/cimd.d.ts +17 -0
  55. package/dist/hosted/oauth/cimd.d.ts.map +1 -0
  56. package/dist/hosted/oauth/cimd.js +300 -0
  57. package/dist/hosted/oauth/cimd.js.map +1 -0
  58. package/dist/hosted/oauth/complete.d.ts +1 -0
  59. package/dist/hosted/oauth/complete.d.ts.map +1 -1
  60. package/dist/hosted/oauth/complete.js +4 -0
  61. package/dist/hosted/oauth/complete.js.map +1 -1
  62. package/dist/hosted/oauth/config.d.ts +2 -0
  63. package/dist/hosted/oauth/config.d.ts.map +1 -1
  64. package/dist/hosted/oauth/config.js +4 -0
  65. package/dist/hosted/oauth/config.js.map +1 -1
  66. package/dist/hosted/oauth/cors.d.ts +4 -0
  67. package/dist/hosted/oauth/cors.d.ts.map +1 -0
  68. package/dist/hosted/oauth/cors.js +23 -0
  69. package/dist/hosted/oauth/cors.js.map +1 -0
  70. package/dist/hosted/oauth/handlers.d.ts.map +1 -1
  71. package/dist/hosted/oauth/handlers.js +57 -7
  72. package/dist/hosted/oauth/handlers.js.map +1 -1
  73. package/dist/hosted/oauth/log.d.ts +2 -0
  74. package/dist/hosted/oauth/log.d.ts.map +1 -1
  75. package/dist/hosted/oauth/log.js +4 -0
  76. package/dist/hosted/oauth/log.js.map +1 -1
  77. package/dist/hosted/oauth/redirect-hosts.d.ts +4 -0
  78. package/dist/hosted/oauth/redirect-hosts.d.ts.map +1 -0
  79. package/dist/hosted/oauth/redirect-hosts.js +47 -0
  80. package/dist/hosted/oauth/redirect-hosts.js.map +1 -0
  81. package/dist/hosted/oauth/refresh.d.ts +1 -0
  82. package/dist/hosted/oauth/refresh.d.ts.map +1 -1
  83. package/dist/hosted/oauth/refresh.js +2 -0
  84. package/dist/hosted/oauth/refresh.js.map +1 -1
  85. package/dist/hosted/oauth/scopes.d.ts +15 -0
  86. package/dist/hosted/oauth/scopes.d.ts.map +1 -0
  87. package/dist/hosted/oauth/scopes.js +21 -0
  88. package/dist/hosted/oauth/scopes.js.map +1 -0
  89. package/dist/hosted/oauth/store.d.ts +4 -0
  90. package/dist/hosted/oauth/store.d.ts.map +1 -1
  91. package/dist/hosted/oauth/store.js +3 -0
  92. package/dist/hosted/oauth/store.js.map +1 -1
  93. package/dist/mcp/server.d.ts.map +1 -1
  94. package/dist/mcp/server.js +2 -0
  95. package/dist/mcp/server.js.map +1 -1
  96. package/dist/mcp/tools/client-tools.d.ts +11 -0
  97. package/dist/mcp/tools/client-tools.d.ts.map +1 -0
  98. package/dist/mcp/tools/client-tools.js +215 -0
  99. package/dist/mcp/tools/client-tools.js.map +1 -0
  100. package/dist/staged-upload/store.d.ts +18 -0
  101. package/dist/staged-upload/store.d.ts.map +1 -1
  102. package/dist/staged-upload/store.js +73 -0
  103. package/dist/staged-upload/store.js.map +1 -1
  104. package/dist/staged-upload/types.d.ts +2 -0
  105. package/dist/staged-upload/types.d.ts.map +1 -1
  106. package/docs/help/workflow.md +1 -1
  107. package/docs/mcp/hosted-guide.md +11 -8
  108. package/package.json +1 -1
  109. package/skills/core/SKILL.md +2 -7
  110. package/skills/manifest.json +1 -1
  111. package/skills/setup/SKILL.md +23 -2
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-register.d.ts","sourceRoot":"","sources":["../../../../src/hosted/next/routes/oauth-register.ts"],"names":[],"mappings":"AAGA,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAE9D"}
1
+ {"version":3,"file":"oauth-register.d.ts","sourceRoot":"","sources":["../../../../src/hosted/next/routes/oauth-register.ts"],"names":[],"mappings":"AAIA,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAE9D;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,CAEjD"}
@@ -1,6 +1,10 @@
1
1
  import { handleOAuthRegisterPost } from '../../index.js';
2
+ import { corsPreflight, withCors } from '../../oauth/cors.js';
2
3
  import { createOAuthHandlerContext } from '../context.js';
3
4
  export async function POST(request) {
4
- return handleOAuthRegisterPost(request, createOAuthHandlerContext());
5
+ return withCors(await handleOAuthRegisterPost(request, createOAuthHandlerContext()));
6
+ }
7
+ export async function OPTIONS() {
8
+ return corsPreflight();
5
9
  }
6
10
  //# sourceMappingURL=oauth-register.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-register.js","sourceRoot":"","sources":["../../../../src/hosted/next/routes/oauth-register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAgB;IACzC,OAAO,uBAAuB,CAAC,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;AACvE,CAAC"}
1
+ {"version":3,"file":"oauth-register.js","sourceRoot":"","sources":["../../../../src/hosted/next/routes/oauth-register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAgB;IACzC,OAAO,QAAQ,CAAC,MAAM,uBAAuB,CAAC,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export declare function POST(request: Request): Promise<Response>;
2
+ export declare function OPTIONS(): Promise<Response>;
2
3
  //# sourceMappingURL=oauth-token.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-token.d.ts","sourceRoot":"","sources":["../../../../src/hosted/next/routes/oauth-token.ts"],"names":[],"mappings":"AAGA,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAE9D"}
1
+ {"version":3,"file":"oauth-token.d.ts","sourceRoot":"","sources":["../../../../src/hosted/next/routes/oauth-token.ts"],"names":[],"mappings":"AAIA,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAE9D;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,CAEjD"}
@@ -1,6 +1,10 @@
1
1
  import { handleOAuthTokenPost } from '../../index.js';
2
+ import { corsPreflight, withCors } from '../../oauth/cors.js';
2
3
  import { createOAuthHandlerContext } from '../context.js';
3
4
  export async function POST(request) {
4
- return handleOAuthTokenPost(request, createOAuthHandlerContext());
5
+ return withCors(await handleOAuthTokenPost(request, createOAuthHandlerContext()));
6
+ }
7
+ export async function OPTIONS() {
8
+ return corsPreflight();
5
9
  }
6
10
  //# sourceMappingURL=oauth-token.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-token.js","sourceRoot":"","sources":["../../../../src/hosted/next/routes/oauth-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAgB;IACzC,OAAO,oBAAoB,CAAC,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"oauth-token.js","sourceRoot":"","sources":["../../../../src/hosted/next/routes/oauth-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAgB;IACzC,OAAO,QAAQ,CAAC,MAAM,oBAAoB,CAAC,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,17 @@
1
+ export declare const CIMD_CLIENT_TTL_SECONDS: number;
2
+ export interface ClientIdMetadata {
3
+ clientId: string;
4
+ redirectUris: string[];
5
+ clientName?: string;
6
+ }
7
+ export declare class CimdError extends Error {
8
+ constructor(message: string);
9
+ }
10
+ export declare function isCimdClientId(clientId: string): boolean;
11
+ export type CimdHostResolver = (hostname: string) => Promise<readonly string[]>;
12
+ export declare function isBlockedCimdAddress(address: string): boolean;
13
+ export declare function parseClientIdMetadata(clientId: string, body: unknown): ClientIdMetadata;
14
+ export declare function metadataAllowsRedirect(metadata: ClientIdMetadata, redirectUri: string): boolean;
15
+ /** Fetch a Client ID Metadata Document. Redirects are rejected. */
16
+ export declare function fetchClientIdMetadata(clientId: string, fetchImpl?: typeof fetch, resolveHost?: CimdHostResolver): Promise<ClientIdMetadata>;
17
+ //# sourceMappingURL=cimd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cimd.d.ts","sourceRoot":"","sources":["../../../src/hosted/oauth/cimd.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,uBAAuB,QAAU,CAAC;AAK/C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;AAmChF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAoC7D;AAkED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAoCvF;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAE/F;AAiHD,mEAAmE;AACnE,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,OAAO,KAAa,EAC/B,WAAW,GAAE,gBAAqC,GACjD,OAAO,CAAC,gBAAgB,CAAC,CAyB3B"}
@@ -0,0 +1,300 @@
1
+ import { lookup } from 'node:dns/promises';
2
+ import * as https from 'node:https';
3
+ import { isIP } from 'node:net';
4
+ import { redirectUriMatchesRegistered } from './redirect-uri.js';
5
+ export const CIMD_CLIENT_TTL_SECONDS = 60 * 60;
6
+ const CIMD_MAX_BYTES = 65_536;
7
+ const CIMD_TIMEOUT_MS = 5_000;
8
+ export class CimdError extends Error {
9
+ constructor(message) {
10
+ super(message);
11
+ this.name = 'CimdError';
12
+ }
13
+ }
14
+ export function isCimdClientId(clientId) {
15
+ return clientId.startsWith('https://');
16
+ }
17
+ /** Node leaves a trailing dot on the hostname (`localhost.` still resolves to loopback). */
18
+ function canonicalHostname(hostname) {
19
+ return hostname.toLowerCase().replace(/\.+$/, '');
20
+ }
21
+ function ipv4ToInt(ip) {
22
+ const parts = ip.split('.');
23
+ if (parts.length !== 4) {
24
+ return null;
25
+ }
26
+ let value = 0;
27
+ for (const part of parts) {
28
+ if (!/^\d{1,3}$/.test(part)) {
29
+ return null;
30
+ }
31
+ const octet = Number(part);
32
+ if (octet > 255) {
33
+ return null;
34
+ }
35
+ value = (value << 8) | octet;
36
+ }
37
+ return value >>> 0;
38
+ }
39
+ function inIpv4Cidr(ip, base, bits) {
40
+ const baseInt = ipv4ToInt(base);
41
+ if (baseInt === null) {
42
+ return false;
43
+ }
44
+ const mask = bits === 0 ? 0 : (0xffffffff << (32 - bits)) >>> 0;
45
+ return (ip & mask) === (baseInt & mask);
46
+ }
47
+ export function isBlockedCimdAddress(address) {
48
+ const normalized = address.toLowerCase().replace(/^\[|\]$/g, '');
49
+ if (normalized.startsWith('::ffff:')) {
50
+ const mapped = normalized.slice('::ffff:'.length);
51
+ if (mapped.includes('.')) {
52
+ return isBlockedCimdAddress(mapped);
53
+ }
54
+ }
55
+ if (normalized.includes(':')) {
56
+ if (normalized === '::' || normalized === '::1') {
57
+ return true;
58
+ }
59
+ const head = Number.parseInt(normalized.split(':')[0] || '0', 16);
60
+ if (Number.isNaN(head)) {
61
+ return true;
62
+ }
63
+ if ((head & 0xfe00) === 0xfc00) {
64
+ return true;
65
+ }
66
+ if ((head & 0xffc0) === 0xfe80) {
67
+ return true;
68
+ }
69
+ return false;
70
+ }
71
+ const ip = ipv4ToInt(normalized);
72
+ if (ip === null) {
73
+ return false;
74
+ }
75
+ return (inIpv4Cidr(ip, '0.0.0.0', 8) ||
76
+ inIpv4Cidr(ip, '10.0.0.0', 8) ||
77
+ inIpv4Cidr(ip, '127.0.0.0', 8) ||
78
+ inIpv4Cidr(ip, '169.254.0.0', 16) ||
79
+ inIpv4Cidr(ip, '172.16.0.0', 12) ||
80
+ inIpv4Cidr(ip, '192.168.0.0', 16));
81
+ }
82
+ function assertPublicHostname(host) {
83
+ if (host.length === 0 ||
84
+ host === 'localhost' ||
85
+ host.endsWith('.localhost') ||
86
+ host.endsWith('.local') ||
87
+ host.endsWith('.internal') ||
88
+ host.includes(':') ||
89
+ host.includes('%')) {
90
+ throw new CimdError('Client ID metadata host is not public.');
91
+ }
92
+ if (isIP(host) !== 0 || /^\d+\.\d+\.\d+\.\d+$/.test(host)) {
93
+ throw new CimdError('Client ID metadata host is not public.');
94
+ }
95
+ }
96
+ function assertPublicHttps(clientId) {
97
+ let url;
98
+ try {
99
+ url = new URL(clientId);
100
+ }
101
+ catch {
102
+ throw new CimdError('client_id is not a URL.');
103
+ }
104
+ if (url.protocol !== 'https:') {
105
+ throw new CimdError('Client ID metadata must be HTTPS.');
106
+ }
107
+ if (url.username || url.password) {
108
+ throw new CimdError('Client ID metadata URL must not include credentials.');
109
+ }
110
+ assertPublicHostname(canonicalHostname(url.hostname));
111
+ return url;
112
+ }
113
+ async function defaultResolveHost(hostname) {
114
+ const records = await lookup(hostname, { all: true, verbatim: true });
115
+ return records.map((record) => record.address);
116
+ }
117
+ async function assertStablePublicDns(hostname, resolveHost) {
118
+ let first;
119
+ let second;
120
+ try {
121
+ first = await resolveHost(hostname);
122
+ second = await resolveHost(hostname);
123
+ }
124
+ catch (error) {
125
+ if (error instanceof CimdError) {
126
+ throw error;
127
+ }
128
+ throw new CimdError('Client ID metadata host could not be resolved.');
129
+ }
130
+ const blocked = [...first, ...second].filter((address) => isBlockedCimdAddress(address));
131
+ const same = first.length > 0 &&
132
+ second.length === first.length &&
133
+ second.every((address, index) => address === first[index]);
134
+ if (blocked.length > 0 || !same) {
135
+ throw new CimdError('Client ID metadata host is not public.');
136
+ }
137
+ }
138
+ export function parseClientIdMetadata(clientId, body) {
139
+ if (!body || typeof body !== 'object') {
140
+ throw new CimdError('Client ID metadata is not a JSON object.');
141
+ }
142
+ const record = body;
143
+ if (record.client_id !== clientId) {
144
+ throw new CimdError('Client ID metadata client_id does not match the requested client.');
145
+ }
146
+ const supported = Array.isArray(record.token_endpoint_auth_methods_supported)
147
+ ? record.token_endpoint_auth_methods_supported
148
+ : [];
149
+ const supportsNone = record.token_endpoint_auth_method === undefined ||
150
+ record.token_endpoint_auth_method === 'none' ||
151
+ supported.includes('none');
152
+ if (!supportsNone) {
153
+ throw new CimdError('Only public clients (token_endpoint_auth_method none) are supported.');
154
+ }
155
+ if (!Array.isArray(record.redirect_uris) || record.redirect_uris.length === 0) {
156
+ throw new CimdError('Client ID metadata is missing redirect_uris.');
157
+ }
158
+ const redirectUris = record.redirect_uris.filter((uri) => typeof uri === 'string');
159
+ if (redirectUris.length !== record.redirect_uris.length) {
160
+ throw new CimdError('Client ID metadata redirect_uris must be strings.');
161
+ }
162
+ return {
163
+ clientId,
164
+ redirectUris,
165
+ clientName: typeof record.client_name === 'string' ? record.client_name : undefined,
166
+ };
167
+ }
168
+ export function metadataAllowsRedirect(metadata, redirectUri) {
169
+ return redirectUriMatchesRegistered(metadata.redirectUris, redirectUri);
170
+ }
171
+ async function readCappedBody(response) {
172
+ const declared = response.headers.get('content-length');
173
+ if (declared !== null && Number(declared) > CIMD_MAX_BYTES) {
174
+ throw new CimdError('Client ID metadata document is too large.');
175
+ }
176
+ const reader = response.body?.getReader();
177
+ if (!reader) {
178
+ const text = await response.text();
179
+ if (Buffer.byteLength(text) > CIMD_MAX_BYTES) {
180
+ throw new CimdError('Client ID metadata document is too large.');
181
+ }
182
+ return text;
183
+ }
184
+ const chunks = [];
185
+ let total = 0;
186
+ while (true) {
187
+ const { done, value } = await reader.read();
188
+ if (done) {
189
+ break;
190
+ }
191
+ if (!value) {
192
+ continue;
193
+ }
194
+ total += value.byteLength;
195
+ if (total > CIMD_MAX_BYTES) {
196
+ await reader.cancel();
197
+ throw new CimdError('Client ID metadata document is too large.');
198
+ }
199
+ chunks.push(value);
200
+ }
201
+ return Buffer.concat(chunks).toString('utf8');
202
+ }
203
+ function httpsGetPublic(url, signal) {
204
+ return new Promise((resolve, reject) => {
205
+ const req = https.get(url, {
206
+ headers: { accept: 'application/json' },
207
+ signal,
208
+ lookup: (hostname, options, callback) => {
209
+ lookup(hostname, { all: true, verbatim: true })
210
+ .then((records) => {
211
+ if (records.length === 0 ||
212
+ records.some((record) => isBlockedCimdAddress(record.address))) {
213
+ callback(new Error('Client ID metadata host is not public.'), '', 4);
214
+ return;
215
+ }
216
+ const first = records[0];
217
+ if (!first) {
218
+ callback(new Error('Client ID metadata host could not be resolved.'), '', 4);
219
+ return;
220
+ }
221
+ if (typeof options === 'object' && options.all) {
222
+ callback(null, records);
223
+ return;
224
+ }
225
+ callback(null, first.address, first.family);
226
+ })
227
+ .catch((error) => {
228
+ callback(error instanceof Error ? error : new Error(String(error)), '', 4);
229
+ });
230
+ },
231
+ }, (res) => {
232
+ const chunks = [];
233
+ let total = 0;
234
+ const declared = res.headers['content-length'];
235
+ if (declared !== undefined && Number(declared) > CIMD_MAX_BYTES) {
236
+ req.destroy();
237
+ reject(new CimdError('Client ID metadata document is too large.'));
238
+ return;
239
+ }
240
+ res.on('data', (chunk) => {
241
+ total += chunk.length;
242
+ if (total > CIMD_MAX_BYTES) {
243
+ req.destroy();
244
+ reject(new CimdError('Client ID metadata document is too large.'));
245
+ return;
246
+ }
247
+ chunks.push(chunk);
248
+ });
249
+ res.on('end', () => {
250
+ resolve({ status: res.statusCode ?? 0, body: Buffer.concat(chunks).toString('utf8') });
251
+ });
252
+ });
253
+ req.on('error', (error) => {
254
+ reject(error);
255
+ });
256
+ });
257
+ }
258
+ function parseFetchedMetadata(clientId, status, text) {
259
+ if (status < 200 || status >= 300) {
260
+ throw new CimdError(`Client ID metadata request failed (${String(status)}).`);
261
+ }
262
+ let parsed;
263
+ try {
264
+ parsed = JSON.parse(text);
265
+ }
266
+ catch {
267
+ throw new CimdError('Client ID metadata is not JSON.');
268
+ }
269
+ return parseClientIdMetadata(clientId, parsed);
270
+ }
271
+ /** Fetch a Client ID Metadata Document. Redirects are rejected. */
272
+ export async function fetchClientIdMetadata(clientId, fetchImpl = fetch, resolveHost = defaultResolveHost) {
273
+ const url = assertPublicHttps(clientId);
274
+ await assertStablePublicDns(canonicalHostname(url.hostname), resolveHost);
275
+ const controller = new AbortController();
276
+ const timer = setTimeout(() => controller.abort(), CIMD_TIMEOUT_MS);
277
+ try {
278
+ if (fetchImpl !== fetch) {
279
+ const response = await fetchImpl(clientId, {
280
+ method: 'GET',
281
+ redirect: 'error',
282
+ signal: controller.signal,
283
+ headers: { accept: 'application/json' },
284
+ });
285
+ return parseFetchedMetadata(clientId, response.status, await readCappedBody(response));
286
+ }
287
+ const result = await httpsGetPublic(clientId, controller.signal);
288
+ return parseFetchedMetadata(clientId, result.status, result.body);
289
+ }
290
+ catch (error) {
291
+ if (error instanceof CimdError) {
292
+ throw error;
293
+ }
294
+ throw new CimdError('Client ID metadata could not be fetched.');
295
+ }
296
+ finally {
297
+ clearTimeout(timer);
298
+ }
299
+ }
300
+ //# sourceMappingURL=cimd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cimd.js","sourceRoot":"","sources":["../../../src/hosted/oauth/cimd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,EAAE,CAAC;AAE/C,MAAM,cAAc,GAAG,MAAM,CAAC;AAC9B,MAAM,eAAe,GAAG,KAAK,CAAC;AAQ9B,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACzC,CAAC;AAID,4FAA4F;AAC5F,SAAS,iBAAiB,CAAC,QAAgB;IACzC,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,SAAS,CAAC,EAAU;IAC3B,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,KAAK,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,UAAU,CAAC,EAAU,EAAE,IAAY,EAAE,IAAY;IACxD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;IAChE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACjE,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAClE,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,EAAE,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IACjC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CACL,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5B,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAC7B,UAAU,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;QAC9B,UAAU,CAAC,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC;QACjC,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,CAAC;QAChC,UAAU,CAAC,EAAE,EAAE,aAAa,EAAE,EAAE,CAAC,CAClC,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,IACE,IAAI,CAAC,MAAM,KAAK,CAAC;QACjB,IAAI,KAAK,WAAW;QACpB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAClB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAClB,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,SAAS,CAAC,yBAAyB,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;IAC9E,CAAC;IACD,oBAAoB,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IAChD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,QAAgB,EAChB,WAA6B;IAE7B,IAAI,KAAwB,CAAC;IAC7B,IAAI,MAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;YAC/B,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IACzF,MAAM,IAAI,GACR,KAAK,CAAC,MAAM,GAAG,CAAC;QAChB,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,IAAa;IACnE,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,MAAM,GAAG,IAMd,CAAC;IACF,IAAI,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC,mEAAmE,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,qCAAqC,CAAC;QAC3E,CAAC,CAAC,MAAM,CAAC,qCAAqC;QAC9C,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,YAAY,GAChB,MAAM,CAAC,0BAA0B,KAAK,SAAS;QAC/C,MAAM,CAAC,0BAA0B,KAAK,MAAM;QAC5C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,SAAS,CAAC,sEAAsE,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9E,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC;IAClG,IAAI,YAAY,CAAC,MAAM,KAAK,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QACxD,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO;QACL,QAAQ;QACR,YAAY;QACZ,UAAU,EAAE,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;KACpF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAA0B,EAAE,WAAmB;IACpF,OAAO,4BAA4B,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AAC1E,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAkB;IAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACxD,IAAI,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,cAAc,EAAE,CAAC;QAC3D,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,cAAc,EAAE,CAAC;YAC7C,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI,EAAE,CAAC;YACT,MAAM;QACR,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QACD,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC;QAC1B,IAAI,KAAK,GAAG,cAAc,EAAE,CAAC;YAC3B,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,cAAc,CACrB,GAAW,EACX,MAAmB;IAEnB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CACnB,GAAG,EACH;YACE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACvC,MAAM;YACN,MAAM,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;gBACtC,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;qBAC5C,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;oBAChB,IACE,OAAO,CAAC,MAAM,KAAK,CAAC;wBACpB,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAC9D,CAAC;wBACD,QAAQ,CAAC,IAAI,KAAK,CAAC,wCAAwC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;wBACrE,OAAO;oBACT,CAAC;oBACD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;oBACzB,IAAI,CAAC,KAAK,EAAE,CAAC;wBACX,QAAQ,CAAC,IAAI,KAAK,CAAC,gDAAgD,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;wBAC7E,OAAO;oBACT,CAAC;oBACD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;wBAC/C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;wBACxB,OAAO;oBACT,CAAC;oBACD,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC9C,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;oBACxB,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC7E,CAAC,CAAC,CAAC;YACP,CAAC;SACF,EACD,CAAC,GAAG,EAAE,EAAE;YACN,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAC/C,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,cAAc,EAAE,CAAC;gBAChE,GAAG,CAAC,OAAO,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC,CAAC;gBACnE,OAAO;YACT,CAAC;YACD,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC/B,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;gBACtB,IAAI,KAAK,GAAG,cAAc,EAAE,CAAC;oBAC3B,GAAG,CAAC,OAAO,EAAE,CAAC;oBACd,MAAM,CAAC,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC,CAAC;oBACnE,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzF,CAAC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACxB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAgB,EAAE,MAAc,EAAE,IAAY;IAC1E,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC,sCAAsC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAgB,EAChB,SAAS,GAAiB,KAAK,EAC/B,WAAW,GAAqB,kBAAkB;IAElD,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,qBAAqB,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,eAAe,CAAC,CAAC;IACpE,IAAI,CAAC;QACH,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE;gBACzC,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,OAAO;gBACjB,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;aACxC,CAAC,CAAC;YACH,OAAO,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACjE,OAAO,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;YAC/B,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;IAClE,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -12,5 +12,6 @@ export declare function completeAuthorizationCodeGrant(store: OAuthStore, input:
12
12
  tokenType: string;
13
13
  expiresIn: number;
14
14
  refreshToken: string;
15
+ scope: string;
15
16
  }>;
16
17
  //# sourceMappingURL=complete.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../../src/hosted/oauth/complete.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEjE,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,UAAU,EACjB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE;IACL,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D,GACA,OAAO,CAAC;IACT,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC,CAmDD"}
1
+ {"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../../src/hosted/oauth/complete.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEjE,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,UAAU,EACjB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE;IACL,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D,GACA,OAAO,CAAC;IACT,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAsDD"}
@@ -3,6 +3,7 @@ import { loadAndValidateContentfulToken } from './cached-cma.js';
3
3
  import { signMcpAccessToken } from './jwt.js';
4
4
  import { generateAuthCode } from './pkce.js';
5
5
  import { redirectUrisEquivalent } from './redirect-uri.js';
6
+ import { CMS_EDIT_OAUTH_SCOPE } from './scopes.js';
6
7
  export async function issueAuthorizationRedirect(store, authRequestId, sub, request) {
7
8
  const code = generateAuthCode();
8
9
  await store.saveAuthCode(code, { authRequestId, sub });
@@ -40,16 +41,19 @@ export async function completeAuthorizationCodeGrant(store, input) {
40
41
  }
41
42
  const { accessToken, expiresIn } = await signMcpAccessToken(codeRecord.sub, authRequest.resource);
42
43
  const refreshToken = randomUUID();
44
+ const scope = authRequest.scope ?? CMS_EDIT_OAUTH_SCOPE;
43
45
  await store.saveRefreshToken(refreshToken, {
44
46
  sub: codeRecord.sub,
45
47
  clientId: authRequest.clientId,
46
48
  resource: authRequest.resource,
49
+ scope,
47
50
  });
48
51
  return {
49
52
  accessToken,
50
53
  tokenType: 'Bearer',
51
54
  expiresIn,
52
55
  refreshToken,
56
+ scope,
53
57
  };
54
58
  }
55
59
  //# sourceMappingURL=complete.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"complete.js","sourceRoot":"","sources":["../../../src/hosted/oauth/complete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,KAAiB,EACjB,aAAqB,EACrB,GAAW,EACX,OAA2B;IAE3B,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,MAAM,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9C,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,KAAiB,EACjB,KAOC;IAOD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,qBAAqB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAChF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,WAAW,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACnF,IAAI,MAAM,KAAK,WAAW,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,8BAA8B,CAClC,KAAK,EACL,UAAU,CAAC,GAAG,EACd,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,uBAAuB,CAC9B,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,MAAM,kBAAkB,CAAC,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAElG,MAAM,YAAY,GAAG,UAAU,EAAE,CAAC;IAClC,MAAM,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE;QACzC,GAAG,EAAE,UAAU,CAAC,GAAG;QACnB,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,QAAQ,EAAE,WAAW,CAAC,QAAQ;KAC/B,CAAC,CAAC;IAEH,OAAO;QACL,WAAW;QACX,SAAS,EAAE,QAAQ;QACnB,SAAS;QACT,YAAY;KACb,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"complete.js","sourceRoot":"","sources":["../../../src/hosted/oauth/complete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,KAAiB,EACjB,aAAqB,EACrB,GAAW,EACX,OAA2B;IAE3B,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,MAAM,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9C,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,KAAiB,EACjB,KAOC;IAQD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,qBAAqB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAChF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,WAAW,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACnF,IAAI,MAAM,KAAK,WAAW,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,8BAA8B,CAClC,KAAK,EACL,UAAU,CAAC,GAAG,EACd,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,uBAAuB,CAC9B,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,MAAM,kBAAkB,CAAC,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAElG,MAAM,YAAY,GAAG,UAAU,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,oBAAoB,CAAC;IACxD,MAAM,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE;QACzC,GAAG,EAAE,UAAU,CAAC,GAAG;QACnB,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,KAAK;KACN,CAAC,CAAC;IAEH,OAAO;QACL,WAAW;QACX,SAAS,EAAE,QAAQ;QACnB,SAAS;QACT,YAAY;QACZ,KAAK;KACN,CAAC;AACJ,CAAC"}
@@ -1,5 +1,7 @@
1
1
  export declare function getPublicOrigin(): string;
2
2
  export declare function getMcpResourceUrl(): string;
3
+ /** RFC 9728 path suffix for the MCP resource (`/.well-known/oauth-protected-resource/api/mcp`). */
4
+ export declare function isMcpProtectedResourcePath(segments: readonly string[]): boolean;
3
5
  export declare function getContentfulOAuthClientId(): string;
4
6
  export declare function getContentfulOAuthRedirectUri(): string;
5
7
  export declare function getContentfulAuthorizeUrl(authRequestId: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/hosted/oauth/config.ts"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,wBAAgB,6BAA6B,IAAI,MAAM,CAEtD;AAED,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CASvE;AAED,wBAAgB,+BAA+B,IAAI,MAAM,CAExD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/hosted/oauth/config.ts"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,mGAAmG;AACnG,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE/E;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,wBAAgB,6BAA6B,IAAI,MAAM,CAEtD;AAED,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CASvE;AAED,wBAAgB,+BAA+B,IAAI,MAAM,CAExD"}
@@ -11,6 +11,10 @@ export function getPublicOrigin() {
11
11
  export function getMcpResourceUrl() {
12
12
  return `${getPublicOrigin()}/api/mcp`;
13
13
  }
14
+ /** RFC 9728 path suffix for the MCP resource (`/.well-known/oauth-protected-resource/api/mcp`). */
15
+ export function isMcpProtectedResourcePath(segments) {
16
+ return segments.join('/') === 'api/mcp';
17
+ }
14
18
  export function getContentfulOAuthClientId() {
15
19
  return requireEnv('CONTENTFUL_OAUTH_CLIENT_ID');
16
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/hosted/oauth/config.ts"],"names":[],"mappings":"AAAA,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,UAAU,CAAC,wBAAwB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,GAAG,eAAe,EAAE,UAAU,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO,UAAU,CAAC,4BAA4B,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,6BAA6B;IAC3C,OAAO,GAAG,eAAe,EAAE,4BAA4B,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,aAAqB;IAC7D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,aAAa,EAAE,OAAO;QACtB,SAAS,EAAE,0BAA0B,EAAE;QACvC,YAAY,EAAE,6BAA6B,EAAE;QAC7C,KAAK,EAAE,2BAA2B;QAClC,KAAK,EAAE,aAAa;KACrB,CAAC,CAAC;IACH,OAAO,6CAA6C,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,+BAA+B;IAC7C,OAAO,GAAG,eAAe,EAAE,uCAAuC,CAAC;AACrE,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/hosted/oauth/config.ts"],"names":[],"mappings":"AAAA,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,UAAU,CAAC,wBAAwB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,GAAG,eAAe,EAAE,UAAU,CAAC;AACxC,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,0BAA0B,CAAC,QAA2B;IACpE,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO,UAAU,CAAC,4BAA4B,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,6BAA6B;IAC3C,OAAO,GAAG,eAAe,EAAE,4BAA4B,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,aAAqB;IAC7D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,aAAa,EAAE,OAAO;QACtB,SAAS,EAAE,0BAA0B,EAAE;QACvC,YAAY,EAAE,6BAA6B,EAAE;QAC7C,KAAK,EAAE,2BAA2B;QAClC,KAAK,EAAE,aAAa;KACrB,CAAC,CAAC;IACH,OAAO,6CAA6C,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,+BAA+B;IAC7C,OAAO,GAAG,eAAe,EAAE,uCAAuC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function corsPreflight(): Response;
2
+ /** Copy a response and add discovery CORS headers. Body is a single read. */
3
+ export declare function withCors(response: Response): Response;
4
+ //# sourceMappingURL=cors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../../src/hosted/oauth/cors.ts"],"names":[],"mappings":"AASA,wBAAgB,aAAa,IAAI,QAAQ,CAExC;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAUrD"}
@@ -0,0 +1,23 @@
1
+ const CORS_HEADERS = {
2
+ 'Access-Control-Allow-Origin': '*',
3
+ 'Access-Control-Allow-Methods': 'GET, POST, DELETE, OPTIONS',
4
+ 'Access-Control-Allow-Headers': 'Authorization, Content-Type, MCP-Protocol-Version, Mcp-Protocol-Version, Mcp-Session-Id, Last-Event-ID',
5
+ 'Access-Control-Expose-Headers': 'WWW-Authenticate, MCP-Protocol-Version, Mcp-Session-Id',
6
+ 'Access-Control-Max-Age': '86400',
7
+ };
8
+ export function corsPreflight() {
9
+ return new Response(null, { status: 204, headers: CORS_HEADERS });
10
+ }
11
+ /** Copy a response and add discovery CORS headers. Body is a single read. */
12
+ export function withCors(response) {
13
+ const headers = new Headers(response.headers);
14
+ for (const [name, value] of Object.entries(CORS_HEADERS)) {
15
+ headers.set(name, value);
16
+ }
17
+ return new Response(response.body, {
18
+ status: response.status,
19
+ statusText: response.statusText,
20
+ headers,
21
+ });
22
+ }
23
+ //# sourceMappingURL=cors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../../../src/hosted/oauth/cors.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAA2B;IAC3C,6BAA6B,EAAE,GAAG;IAClC,8BAA8B,EAAE,4BAA4B;IAC5D,8BAA8B,EAC5B,wGAAwG;IAC1G,+BAA+B,EAAE,wDAAwD;IACzF,wBAAwB,EAAE,OAAO;CAClC,CAAC;AAEF,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,QAAQ,CAAC,QAAkB;IACzC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE;QACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,OAAO;KACR,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/hosted/oauth/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sBAAsB,EAA4B,MAAM,wBAAwB,CAAC;AAW/F,OAAO,EAAgC,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAG3E,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,sBAAsB,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAeD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,QAAQ,CAAC,CAuDnB;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,QAAQ,CAAC,CAyBnB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,QAAQ,CAAC,CA8FnB;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,QAAQ,CAAC,CAiDnB;AAED,wBAAgB,yCAAyC,IAAI,QAAQ,CAYpE;AAED,wBAAgB,uCAAuC,IAAI,QAAQ,CAMlE;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBvF"}
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/hosted/oauth/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sBAAsB,EAA4B,MAAM,wBAAwB,CAAC;AAmB/F,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,sBAAsB,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAmDD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,QAAQ,CAAC,CA0EnB;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,QAAQ,CAAC,CA4BnB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,QAAQ,CAAC,CAgGnB;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,QAAQ,CAAC,CAiDnB;AAED,wBAAgB,yCAAyC,IAAI,QAAQ,CAcpE;AAED,wBAAgB,uCAAuC,IAAI,QAAQ,CAQlE;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBvF"}