@polpo-ai/connect 0.15.143 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +207 -25
- package/dist/assignment-policy.d.ts +21 -0
- package/dist/assignment-policy.d.ts.map +1 -0
- package/dist/assignment-policy.js +93 -0
- package/dist/assignment-policy.js.map +1 -0
- package/dist/capability-resolver.d.ts +47 -3
- package/dist/capability-resolver.d.ts.map +1 -1
- package/dist/capability-resolver.js +197 -31
- package/dist/capability-resolver.js.map +1 -1
- package/dist/client/index.d.ts +97 -20
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +90 -4
- package/dist/client/index.js.map +1 -1
- package/dist/credential-requirement.d.ts +7 -0
- package/dist/credential-requirement.d.ts.map +1 -0
- package/dist/credential-requirement.js +7 -0
- package/dist/credential-requirement.js.map +1 -0
- package/dist/definition-store.d.ts +19 -0
- package/dist/definition-store.d.ts.map +1 -0
- package/dist/definition-store.js +2 -0
- package/dist/definition-store.js.map +1 -0
- package/dist/definitions.d.ts +54 -0
- package/dist/definitions.d.ts.map +1 -0
- package/dist/definitions.js +394 -0
- package/dist/definitions.js.map +1 -0
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +3 -0
- package/dist/errors.js.map +1 -1
- package/dist/http-policy.d.ts +3 -1
- package/dist/http-policy.d.ts.map +1 -1
- package/dist/http-policy.js +55 -14
- package/dist/http-policy.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-oauth-commit.d.ts +11 -0
- package/dist/mcp-oauth-commit.d.ts.map +1 -0
- package/dist/mcp-oauth-commit.js +65 -0
- package/dist/mcp-oauth-commit.js.map +1 -0
- package/dist/oauth-reconnect.d.ts +5 -0
- package/dist/oauth-reconnect.d.ts.map +1 -0
- package/dist/oauth-reconnect.js +18 -0
- package/dist/oauth-reconnect.js.map +1 -0
- package/dist/registry.d.ts +6 -3
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +47 -9
- package/dist/registry.js.map +1 -1
- package/dist/setup-lifecycle.d.ts +9 -0
- package/dist/setup-lifecycle.d.ts.map +1 -0
- package/dist/setup-lifecycle.js +57 -0
- package/dist/setup-lifecycle.js.map +1 -0
- package/dist/types.d.ts +204 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/verification.d.ts +55 -0
- package/dist/verification.d.ts.map +1 -0
- package/dist/verification.js +50 -0
- package/dist/verification.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
import { ConnectError } from "./errors.js";
|
|
2
|
+
import { connectorHostnameIsUnsafe, normalizeConnectorHttpPolicy } from "./http-policy.js";
|
|
3
|
+
import { normalizeScopes } from "./scopes.js";
|
|
4
|
+
import { normalizeConnectorVerification } from "./verification.js";
|
|
5
|
+
const RESERVED_OAUTH_PARAMS = new Set([
|
|
6
|
+
"client_id", "client_secret", "redirect_uri", "response_type", "grant_type",
|
|
7
|
+
"scope", "state", "code", "code_verifier", "code_challenge", "code_challenge_method",
|
|
8
|
+
"refresh_token", "access_token",
|
|
9
|
+
]);
|
|
10
|
+
function invalid(message) {
|
|
11
|
+
throw new ConnectError("invalid_provider", message);
|
|
12
|
+
}
|
|
13
|
+
function record(value, name) {
|
|
14
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
15
|
+
invalid(`${name} must be an object`);
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
function knownKeys(input, keys, name) {
|
|
19
|
+
if (Object.keys(input).some((key) => !keys.includes(key)))
|
|
20
|
+
invalid(`${name} contains an unsupported field`);
|
|
21
|
+
}
|
|
22
|
+
function jsonDocument(value) {
|
|
23
|
+
let nodes = 0;
|
|
24
|
+
const seen = new Set();
|
|
25
|
+
const visit = (entry, depth) => {
|
|
26
|
+
if (++nodes > 20_000 || depth > 32)
|
|
27
|
+
invalid("Connector JSON document exceeds its structural limit");
|
|
28
|
+
if (entry === null || typeof entry === "string" || typeof entry === "boolean")
|
|
29
|
+
return;
|
|
30
|
+
if (typeof entry === "number" && Number.isFinite(entry))
|
|
31
|
+
return;
|
|
32
|
+
if (!entry || typeof entry !== "object" || seen.has(entry))
|
|
33
|
+
invalid("Connector document must contain finite JSON values");
|
|
34
|
+
if (!Array.isArray(entry) && Object.getPrototypeOf(entry) !== Object.prototype && Object.getPrototypeOf(entry) !== null) {
|
|
35
|
+
invalid("Connector document must contain plain JSON objects");
|
|
36
|
+
}
|
|
37
|
+
seen.add(entry);
|
|
38
|
+
for (const child of Object.values(entry))
|
|
39
|
+
visit(child, depth + 1);
|
|
40
|
+
seen.delete(entry);
|
|
41
|
+
};
|
|
42
|
+
visit(value, 0);
|
|
43
|
+
if (JSON.stringify(value).length > 65_536)
|
|
44
|
+
invalid("Connector JSON document is too large");
|
|
45
|
+
return structuredClone(value);
|
|
46
|
+
}
|
|
47
|
+
function text(value, name) {
|
|
48
|
+
if (typeof value !== "string" || !value.trim() || value.length > 2048)
|
|
49
|
+
invalid(`${name} is invalid`);
|
|
50
|
+
return value.trim();
|
|
51
|
+
}
|
|
52
|
+
function identifier(value, name) {
|
|
53
|
+
const result = text(value, name);
|
|
54
|
+
if (!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(result))
|
|
55
|
+
invalid(`${name} is invalid`);
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
function scopes(value) {
|
|
59
|
+
if (value === undefined)
|
|
60
|
+
return undefined;
|
|
61
|
+
if (!Array.isArray(value) || value.length > 128 || value.some((v) => typeof v !== "string" || v.length > 2048)) {
|
|
62
|
+
invalid("Authentication scopes are invalid");
|
|
63
|
+
}
|
|
64
|
+
return normalizeScopes(value);
|
|
65
|
+
}
|
|
66
|
+
function endpoint(value, name) {
|
|
67
|
+
let url;
|
|
68
|
+
try {
|
|
69
|
+
url = new URL(text(value, name));
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
invalid(`${name} must be a public HTTPS URL`);
|
|
73
|
+
}
|
|
74
|
+
if (url.protocol !== "https:" || url.username || url.password || url.hash
|
|
75
|
+
|| connectorHostnameIsUnsafe(url.hostname))
|
|
76
|
+
invalid(`${name} must be a public HTTPS URL`);
|
|
77
|
+
for (const key of url.searchParams.keys()) {
|
|
78
|
+
if (RESERVED_OAUTH_PARAMS.has(key.toLowerCase()))
|
|
79
|
+
invalid(`${name} cannot override OAuth parameters`);
|
|
80
|
+
}
|
|
81
|
+
return url.toString();
|
|
82
|
+
}
|
|
83
|
+
function parameters(value, name) {
|
|
84
|
+
if (value === undefined)
|
|
85
|
+
return undefined;
|
|
86
|
+
const input = record(value, name);
|
|
87
|
+
const result = {};
|
|
88
|
+
if (Object.keys(input).length > 32)
|
|
89
|
+
invalid(`${name} has too many parameters`);
|
|
90
|
+
for (const [key, value] of Object.entries(input)) {
|
|
91
|
+
if (!/^[a-zA-Z][a-zA-Z0-9_.-]{0,127}$/.test(key) || RESERVED_OAUTH_PARAMS.has(key.toLowerCase())) {
|
|
92
|
+
invalid(`${name} cannot override reserved OAuth parameters`);
|
|
93
|
+
}
|
|
94
|
+
result[key] = text(value, name);
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
function normalizeIdentity(value) {
|
|
99
|
+
const input = record(value, "OAuth identity policy");
|
|
100
|
+
knownKeys(input, ["method", "issuer", "url", "requiredScopes", "scopeAliases"], "OAuth identity policy");
|
|
101
|
+
if (input.method !== "userinfo")
|
|
102
|
+
invalid("Unsupported OAuth identity method");
|
|
103
|
+
const issuer = endpoint(input.issuer, "OAuth identity issuer");
|
|
104
|
+
if (new URL(issuer).search)
|
|
105
|
+
invalid("OAuth identity issuer cannot contain a query");
|
|
106
|
+
const requiredScopes = scopes(input.requiredScopes);
|
|
107
|
+
if (!requiredScopes?.length)
|
|
108
|
+
invalid("OAuth identity scopes are required");
|
|
109
|
+
const aliases = Object.create(null);
|
|
110
|
+
if (input.scopeAliases !== undefined) {
|
|
111
|
+
for (const [alias, canonical] of Object.entries(record(input.scopeAliases, "OAuth scope aliases"))) {
|
|
112
|
+
const target = text(canonical, "OAuth scope alias");
|
|
113
|
+
if (!alias.trim() || alias.length > 2048 || !requiredScopes.includes(target)
|
|
114
|
+
|| requiredScopes.includes(alias) || Object.keys(aliases).length >= 32)
|
|
115
|
+
invalid("Invalid OAuth scope alias");
|
|
116
|
+
aliases[alias] = target;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return { method: "userinfo", issuer: text(input.issuer, "OAuth identity issuer"),
|
|
120
|
+
url: endpoint(input.url, "OAuth UserInfo endpoint"), requiredScopes,
|
|
121
|
+
...(Object.keys(aliases).length ? { scopeAliases: aliases } : {}) };
|
|
122
|
+
}
|
|
123
|
+
/** Immutable, non-secret JSON definitions are safe to persist and expose in catalogs. */
|
|
124
|
+
export function normalizeConnectorDefinition(value) {
|
|
125
|
+
const input = record(value, "Connector definition");
|
|
126
|
+
knownKeys(input, ["version", "id", "name", "description", "icon", "source", "protocol", "defaultAuthenticationId",
|
|
127
|
+
"authentication", "scopes", "actions", "triggers", "allowCustomScopes", "http", "verification"], "Connector definition");
|
|
128
|
+
if (input.version !== 2)
|
|
129
|
+
invalid("Unsupported Connector definition version");
|
|
130
|
+
if (input.protocol !== "http_api" && input.protocol !== "mcp")
|
|
131
|
+
invalid("Unsupported Connector protocol");
|
|
132
|
+
if (input.source !== "catalog" && input.source !== "custom")
|
|
133
|
+
invalid("Unsupported Connector source");
|
|
134
|
+
if (!Array.isArray(input.authentication) || input.authentication.length === 0 || input.authentication.length > 16) {
|
|
135
|
+
invalid("Connector must declare between 1 and 16 authentication methods");
|
|
136
|
+
}
|
|
137
|
+
const authentication = input.authentication.map((value) => {
|
|
138
|
+
const auth = record(value, "Connector authentication");
|
|
139
|
+
for (const key of ["clientId", "clientSecret", "apiKey", "accessToken", "refreshToken", "secretRef", "bearerToken"]) {
|
|
140
|
+
if (key in auth)
|
|
141
|
+
invalid("Connector authentication cannot contain client credentials or account secrets");
|
|
142
|
+
}
|
|
143
|
+
const common = ["id", "label", "type", "defaultScopes"];
|
|
144
|
+
knownKeys(auth, [...common, ...(auth.type === "api_key" ? ["injection"] : auth.type === "oauth2"
|
|
145
|
+
? input.protocol === "mcp" ? ["discovery"]
|
|
146
|
+
: ["authorizationUrl", "tokenUrl", "revokeUrl", "supportsPkce", "extraAuthorizeParams", "extraTokenParams", "identity"] : [])], "Connector authentication");
|
|
147
|
+
const base = {
|
|
148
|
+
id: identifier(auth.id, "Authentication id"),
|
|
149
|
+
...(auth.label === undefined ? {} : { label: text(auth.label, "Authentication label") }),
|
|
150
|
+
...(auth.defaultScopes === undefined ? {} : { defaultScopes: scopes(auth.defaultScopes) }),
|
|
151
|
+
};
|
|
152
|
+
if (auth.type === "none")
|
|
153
|
+
return { ...base, type: "none" };
|
|
154
|
+
if (auth.type === "api_key") {
|
|
155
|
+
const injection = record(auth.injection, "API key injection");
|
|
156
|
+
knownKeys(injection, ["mode", "name"], "API key injection");
|
|
157
|
+
if (!["bearer", "header", "query"].includes(String(injection.mode))
|
|
158
|
+
|| (input.protocol === "mcp" && injection.mode === "query"))
|
|
159
|
+
invalid("Unsupported API key injection");
|
|
160
|
+
const policy = normalizeConnectorHttpPolicy({
|
|
161
|
+
origins: ["https://policy-validation.example.com"],
|
|
162
|
+
auth: injection,
|
|
163
|
+
});
|
|
164
|
+
return { ...base, type: "api_key", injection: policy.auth };
|
|
165
|
+
}
|
|
166
|
+
if (auth.type !== "oauth2")
|
|
167
|
+
invalid("Unsupported Connector authentication method");
|
|
168
|
+
if (input.protocol === "mcp") {
|
|
169
|
+
if (auth.discovery !== true || auth.authorizationUrl !== undefined || auth.tokenUrl !== undefined) {
|
|
170
|
+
invalid("MCP OAuth requires protocol discovery, not API OAuth endpoint configuration");
|
|
171
|
+
}
|
|
172
|
+
return { ...base, type: "oauth2", discovery: true };
|
|
173
|
+
}
|
|
174
|
+
if (auth.discovery !== undefined)
|
|
175
|
+
invalid("HTTP API OAuth requires explicit endpoints");
|
|
176
|
+
if (auth.supportsPkce !== undefined && typeof auth.supportsPkce !== "boolean")
|
|
177
|
+
invalid("supportsPkce must be a boolean");
|
|
178
|
+
return {
|
|
179
|
+
...base, type: "oauth2",
|
|
180
|
+
authorizationUrl: endpoint(auth.authorizationUrl, "authorizationUrl"),
|
|
181
|
+
tokenUrl: endpoint(auth.tokenUrl, "tokenUrl"),
|
|
182
|
+
...(auth.revokeUrl === undefined ? {} : { revokeUrl: endpoint(auth.revokeUrl, "revokeUrl") }),
|
|
183
|
+
...(auth.supportsPkce === undefined ? {} : { supportsPkce: auth.supportsPkce }),
|
|
184
|
+
...(auth.extraAuthorizeParams === undefined ? {} : { extraAuthorizeParams: parameters(auth.extraAuthorizeParams, "extraAuthorizeParams") }),
|
|
185
|
+
...(auth.extraTokenParams === undefined ? {} : { extraTokenParams: parameters(auth.extraTokenParams, "extraTokenParams") }),
|
|
186
|
+
...(auth.identity === undefined ? {} : { identity: normalizeIdentity(auth.identity) }),
|
|
187
|
+
};
|
|
188
|
+
});
|
|
189
|
+
const ids = new Set(authentication.map((auth) => auth.id));
|
|
190
|
+
if (ids.size !== authentication.length)
|
|
191
|
+
invalid("Duplicate Connector authentication id");
|
|
192
|
+
const defaultAuthenticationId = identifier(input.defaultAuthenticationId, "Default authentication id");
|
|
193
|
+
if (!ids.has(defaultAuthenticationId))
|
|
194
|
+
invalid("Default authentication is not supported");
|
|
195
|
+
const base = {
|
|
196
|
+
version: 2, id: identifier(input.id, "Connector id"),
|
|
197
|
+
name: text(input.name, "Connector name"), source: input.source,
|
|
198
|
+
defaultAuthenticationId, authentication,
|
|
199
|
+
...(input.description === undefined ? {} : { description: text(input.description, "Connector description") }),
|
|
200
|
+
...(input.icon === undefined ? {} : { icon: text(input.icon, "Connector icon") }),
|
|
201
|
+
...normalizeOperations({ ...input, authentication }),
|
|
202
|
+
};
|
|
203
|
+
if (base.id.length < 2)
|
|
204
|
+
invalid("Connector id must contain at least two characters");
|
|
205
|
+
if (input.protocol === "mcp") {
|
|
206
|
+
if (input.http !== undefined)
|
|
207
|
+
invalid("MCP definitions cannot declare an HTTP API policy");
|
|
208
|
+
const verification = input.verification === undefined ? undefined : normalizeConnectorVerification(input.verification, "mcp");
|
|
209
|
+
if (verification && !input.allowCustomScopes && verification.scopes?.some((scope) => !base.scopes?.some((candidate) => candidate.id === scope))) {
|
|
210
|
+
invalid("Verification references an undeclared scope");
|
|
211
|
+
}
|
|
212
|
+
return freezeConnectorValue({ ...base, protocol: "mcp",
|
|
213
|
+
...(verification ? { verification } : {}),
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
const http = record(input.http, "HTTP API policy");
|
|
217
|
+
if ("auth" in http)
|
|
218
|
+
invalid("HTTP authentication belongs to the selected authentication method");
|
|
219
|
+
const { auth: _auth, ...policy } = normalizeConnectorHttpPolicy({ ...http, auth: { mode: "none" } });
|
|
220
|
+
const verification = input.verification === undefined ? undefined : normalizeConnectorVerification(input.verification, "http_api", { ...policy, auth: { mode: "none" } });
|
|
221
|
+
if (verification?.kind === "http" && verification.account && authentication.some((method) => method.type === "none")) {
|
|
222
|
+
invalid("A public authentication method cannot verify account credentials");
|
|
223
|
+
}
|
|
224
|
+
if (verification && !input.allowCustomScopes) {
|
|
225
|
+
const allowed = new Set((base.scopes ?? []).map((scope) => scope.id));
|
|
226
|
+
if (verification.scopes?.some((scope) => !allowed.has(scope)))
|
|
227
|
+
invalid("Verification references an undeclared scope");
|
|
228
|
+
}
|
|
229
|
+
return freezeConnectorValue({ ...base, protocol: "http_api", http: policy, ...(verification ? { verification } : {}) });
|
|
230
|
+
}
|
|
231
|
+
function normalizeOperations(input) {
|
|
232
|
+
const result = {};
|
|
233
|
+
if (input.allowCustomScopes !== undefined) {
|
|
234
|
+
if (typeof input.allowCustomScopes !== "boolean")
|
|
235
|
+
invalid("allowCustomScopes must be a boolean");
|
|
236
|
+
result.allowCustomScopes = input.allowCustomScopes;
|
|
237
|
+
}
|
|
238
|
+
for (const name of ["scopes", "actions", "triggers"]) {
|
|
239
|
+
if (input[name] === undefined)
|
|
240
|
+
continue;
|
|
241
|
+
if (!Array.isArray(input[name]) || input[name].length > 256)
|
|
242
|
+
invalid(`Connector ${name} must be an array`);
|
|
243
|
+
const ids = new Set();
|
|
244
|
+
result[name] = input[name].map((value) => {
|
|
245
|
+
const entry = record(value, name);
|
|
246
|
+
knownKeys(entry, name === "scopes" ? ["id", "label", "description", "required", "dangerous"]
|
|
247
|
+
: name === "actions" ? ["id", "label", "description", "scopes", "risk", "inputSchema", "outputSchema", "metadata"]
|
|
248
|
+
: ["id", "label", "description", "scopes", "metadata"], `Connector ${name}`);
|
|
249
|
+
const id = name === "scopes" ? text(entry.id, "Scope id") : identifier(entry.id, "Operation id");
|
|
250
|
+
if (ids.has(id))
|
|
251
|
+
invalid(`Duplicate Connector ${name} id`);
|
|
252
|
+
ids.add(id);
|
|
253
|
+
const copy = { id };
|
|
254
|
+
for (const field of ["label", "description"])
|
|
255
|
+
if (entry[field] !== undefined)
|
|
256
|
+
copy[field] = text(entry[field], field);
|
|
257
|
+
if (name === "scopes") {
|
|
258
|
+
for (const field of ["required", "dangerous"]) {
|
|
259
|
+
if (entry[field] !== undefined && typeof entry[field] !== "boolean")
|
|
260
|
+
invalid(`Scope ${field} must be a boolean`);
|
|
261
|
+
if (entry[field] !== undefined)
|
|
262
|
+
copy[field] = entry[field];
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
if (entry.scopes !== undefined)
|
|
267
|
+
copy.scopes = scopes(entry.scopes);
|
|
268
|
+
if (entry.metadata !== undefined)
|
|
269
|
+
copy.metadata = jsonDocument(record(entry.metadata, "Operation metadata"));
|
|
270
|
+
for (const field of ["inputSchema", "outputSchema"])
|
|
271
|
+
if (entry[field] !== undefined)
|
|
272
|
+
copy[field] = jsonDocument(entry[field]);
|
|
273
|
+
if (entry.risk !== undefined) {
|
|
274
|
+
if (!["read", "write", "admin"].includes(String(entry.risk)))
|
|
275
|
+
invalid("Unsupported operation risk");
|
|
276
|
+
copy.risk = entry.risk;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return copy;
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
const knownScopes = new Set(result.scopes?.map((entry) => entry.id));
|
|
283
|
+
if (!input.allowCustomScopes) {
|
|
284
|
+
const uses = [
|
|
285
|
+
...input.authentication.flatMap((auth) => scopes(auth.defaultScopes) ?? []),
|
|
286
|
+
...input.authentication.flatMap((auth) => auth.identity?.requiredScopes ?? []),
|
|
287
|
+
...([...(result.actions ?? []), ...(result.triggers ?? [])])
|
|
288
|
+
.flatMap((operation) => operation.scopes ?? []),
|
|
289
|
+
];
|
|
290
|
+
if (uses.some((scope) => !knownScopes.has(scope)))
|
|
291
|
+
invalid("Connector references an undeclared scope");
|
|
292
|
+
}
|
|
293
|
+
return result;
|
|
294
|
+
}
|
|
295
|
+
/** Selects one method for existing execution adapters; the authored definition remains intact. */
|
|
296
|
+
export function compileConnectorDefinition(value, authenticationId) {
|
|
297
|
+
const definition = normalizeConnectorDefinition(value);
|
|
298
|
+
const selected = authenticationId ?? definition.defaultAuthenticationId;
|
|
299
|
+
const method = definition.authentication.find((candidate) => candidate.id === selected);
|
|
300
|
+
if (!method)
|
|
301
|
+
throw new ConnectError("unsupported_auth", `Unsupported authentication: ${selected}`);
|
|
302
|
+
let auth;
|
|
303
|
+
if (definition.protocol === "mcp") {
|
|
304
|
+
auth = {
|
|
305
|
+
type: "mcp", defaultScopes: method.defaultScopes,
|
|
306
|
+
auth: method.type === "api_key" ? method.injection.mode : method.type,
|
|
307
|
+
...(method.type === "api_key" && method.injection.mode === "header" ? { headerName: method.injection.name } : {}),
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
else if (method.type === "api_key") {
|
|
311
|
+
auth = {
|
|
312
|
+
type: "api_key", defaultScopes: method.defaultScopes,
|
|
313
|
+
...(method.injection.mode === "header" ? { headerName: method.injection.name } : {}),
|
|
314
|
+
...(method.injection.mode === "query" ? { queryParam: method.injection.name } : {}),
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
else if (method.type === "oauth2" && "authorizationUrl" in method) {
|
|
318
|
+
const { id: _id, label: _label, ...config } = method;
|
|
319
|
+
auth = config;
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
auth = { type: "none", defaultScopes: method.defaultScopes };
|
|
323
|
+
}
|
|
324
|
+
return freezeConnectorValue({
|
|
325
|
+
id: definition.id, name: definition.name, description: definition.description,
|
|
326
|
+
icon: definition.icon, source: definition.source, protocol: definition.protocol,
|
|
327
|
+
scopes: definition.scopes, actions: definition.actions, triggers: definition.triggers,
|
|
328
|
+
allowCustomScopes: definition.allowCustomScopes, auth, authenticationId: selected,
|
|
329
|
+
verification: definition.verification,
|
|
330
|
+
http: definition.protocol === "http_api"
|
|
331
|
+
? normalizeConnectorHttpPolicy({
|
|
332
|
+
...definition.http,
|
|
333
|
+
auth: method.type === "api_key" ? method.injection : { mode: method.type === "none" ? "none" : "bearer" },
|
|
334
|
+
}) : undefined,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
export function describeConnector(provider) {
|
|
338
|
+
if ("version" in provider && provider.version === 2) {
|
|
339
|
+
const { version: _version, ...definition } = normalizeConnectorDefinition(provider);
|
|
340
|
+
return freezeConnectorValue({ ...definition, kind: "integration" });
|
|
341
|
+
}
|
|
342
|
+
const legacy = provider;
|
|
343
|
+
const id = legacy.authenticationId ?? "default";
|
|
344
|
+
let authentication;
|
|
345
|
+
if (legacy.auth.type === "mcp") {
|
|
346
|
+
authentication = legacy.auth.auth === "oauth2"
|
|
347
|
+
? { id, type: "oauth2", discovery: true, defaultScopes: legacy.auth.defaultScopes }
|
|
348
|
+
: legacy.auth.auth === "none"
|
|
349
|
+
? { id, type: "none", defaultScopes: legacy.auth.defaultScopes }
|
|
350
|
+
: { id, type: "api_key", injection: legacy.auth.auth === "header"
|
|
351
|
+
? { mode: "header", name: legacy.auth.headerName } : { mode: "bearer" }, defaultScopes: legacy.auth.defaultScopes };
|
|
352
|
+
}
|
|
353
|
+
else if (legacy.auth.type === "oauth2") {
|
|
354
|
+
const { clientId: _clientId, clientSecret: _secret, ...auth } = legacy.auth;
|
|
355
|
+
authentication = { ...auth, id };
|
|
356
|
+
}
|
|
357
|
+
else if (legacy.auth.type === "none") {
|
|
358
|
+
authentication = { ...legacy.auth, id };
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
authentication = { id, type: "api_key", defaultScopes: legacy.auth.defaultScopes,
|
|
362
|
+
injection: (legacy.http?.auth ?? (legacy.auth.headerName ? { mode: "header", name: legacy.auth.headerName }
|
|
363
|
+
: legacy.auth.queryParam ? { mode: "query", name: legacy.auth.queryParam } : { mode: "bearer" })) };
|
|
364
|
+
}
|
|
365
|
+
const credentialOnly = legacy.auth.type === "api_key" && !legacy.http;
|
|
366
|
+
const { auth: _httpAuth, ...http } = legacy.http ?? {};
|
|
367
|
+
return freezeConnectorValue({
|
|
368
|
+
id: legacy.id, name: legacy.name, description: legacy.description, icon: legacy.icon,
|
|
369
|
+
scopes: structuredClone(legacy.scopes), actions: structuredClone(legacy.actions), triggers: structuredClone(legacy.triggers),
|
|
370
|
+
allowCustomScopes: legacy.allowCustomScopes, kind: credentialOnly ? "credential" : "integration",
|
|
371
|
+
source: legacy.source ?? "legacy", protocol: credentialOnly ? null : legacy.auth.type === "mcp" ? "mcp" : "http_api",
|
|
372
|
+
defaultAuthenticationId: id, authentication: [authentication],
|
|
373
|
+
verification: structuredClone(legacy.verification),
|
|
374
|
+
...(legacy.http ? { http: http } : {}),
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
/** Compatibility projection for old catalog consumers; never expose OAuth client secrets. */
|
|
378
|
+
export function sanitizeConnectorProvider(provider) {
|
|
379
|
+
const copy = structuredClone(provider);
|
|
380
|
+
if (copy.auth.type === "oauth2") {
|
|
381
|
+
delete copy.auth.clientId;
|
|
382
|
+
delete copy.auth.clientSecret;
|
|
383
|
+
}
|
|
384
|
+
return freezeConnectorValue(copy);
|
|
385
|
+
}
|
|
386
|
+
export function freezeConnectorValue(value) {
|
|
387
|
+
if (value && typeof value === "object") {
|
|
388
|
+
for (const child of Object.values(value))
|
|
389
|
+
freezeConnectorValue(child);
|
|
390
|
+
Object.freeze(value);
|
|
391
|
+
}
|
|
392
|
+
return value;
|
|
393
|
+
}
|
|
394
|
+
//# sourceMappingURL=definitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../src/definitions.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type ConnectErrorCode = "invalid_request" | "invalid_provider" | "invalid_scope" | "provider_not_found" | "unsupported_auth" | "connection_not_found" | "connection_revoked" | "secret_not_found" | "token_not_available" | "token_exchange_failed" | "refresh_unavailable" | "oauth_state_not_found" | "oauth_state_expired" | "oauth_error" | "oauth_discovery_failed" | "oauth_registration_failed" | "oauth_callback_in_progress" | "setup_invalid" | "setup_expired" | "setup_consumed" | "policy_denied" | "http_error";
|
|
1
|
+
export type ConnectErrorCode = "invalid_request" | "invalid_provider" | "invalid_scope" | "provider_not_found" | "unsupported_auth" | "connection_not_found" | "connection_revoked" | "secret_not_found" | "token_not_available" | "token_exchange_failed" | "refresh_unavailable" | "rate_limited" | "dispatch_unavailable" | "oauth_state_not_found" | "oauth_state_expired" | "oauth_error" | "oauth_discovery_failed" | "oauth_registration_failed" | "oauth_callback_in_progress" | "setup_invalid" | "setup_expired" | "setup_consumed" | "policy_denied" | "http_error";
|
|
2
2
|
export declare class ConnectError extends Error {
|
|
3
3
|
readonly code: ConnectErrorCode;
|
|
4
4
|
readonly status: number;
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GACxB,iBAAiB,GACjB,kBAAkB,GAClB,eAAe,GACf,oBAAoB,GACpB,kBAAkB,GAClB,sBAAsB,GACtB,oBAAoB,GACpB,kBAAkB,GAClB,qBAAqB,GACrB,uBAAuB,GACvB,qBAAqB,GACrB,uBAAuB,GACvB,qBAAqB,GACrB,aAAa,GACb,wBAAwB,GACxB,2BAA2B,GAC3B,4BAA4B,GAC5B,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,eAAe,GACf,YAAY,CAAC;AAEjB,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;gBAEf,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO;CAO1G;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GACxB,iBAAiB,GACjB,kBAAkB,GAClB,eAAe,GACf,oBAAoB,GACpB,kBAAkB,GAClB,sBAAsB,GACtB,oBAAoB,GACpB,kBAAkB,GAClB,qBAAqB,GACrB,uBAAuB,GACvB,qBAAqB,GACrB,cAAc,GACd,sBAAsB,GACtB,uBAAuB,GACvB,qBAAqB,GACrB,aAAa,GACb,wBAAwB,GACxB,2BAA2B,GAC3B,4BAA4B,GAC5B,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,eAAe,GACf,YAAY,CAAC;AAEjB,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;gBAEf,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO;CAO1G;AA0CD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE"}
|
package/dist/errors.js
CHANGED
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AA0BA,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAmB;IACvB,MAAM,CAAS;IACf,OAAO,CAAW;IAE3B,YAAY,IAAsB,EAAE,OAAe,EAAE,UAAkD,EAAE;QACvG,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;CACF;AAED,SAAS,aAAa,CAAC,IAAsB;IAC3C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,iBAAiB,CAAC;QACvB,KAAK,kBAAkB,CAAC;QACxB,KAAK,eAAe,CAAC;QACrB,KAAK,kBAAkB,CAAC;QACxB,KAAK,aAAa,CAAC;QACnB,KAAK,wBAAwB,CAAC;QAC9B,KAAK,2BAA2B;YAC9B,OAAO,GAAG,CAAC;QACb,KAAK,eAAe;YAClB,OAAO,GAAG,CAAC;QACb,KAAK,eAAe;YAClB,OAAO,GAAG,CAAC;QACb,KAAK,gBAAgB,CAAC;QACtB,KAAK,4BAA4B;YAC/B,OAAO,GAAG,CAAC;QACb,KAAK,sBAAsB,CAAC;QAC5B,KAAK,oBAAoB,CAAC;QAC1B,KAAK,uBAAuB,CAAC;QAC7B,KAAK,kBAAkB;YACrB,OAAO,GAAG,CAAC;QACb,KAAK,oBAAoB,CAAC;QAC1B,KAAK,qBAAqB,CAAC;QAC3B,KAAK,eAAe;YAClB,OAAO,GAAG,CAAC;QACb,KAAK,uBAAuB,CAAC;QAC7B,KAAK,qBAAqB,CAAC;QAC3B,KAAK,YAAY;YACf,OAAO,GAAG,CAAC;QACb,KAAK,qBAAqB,CAAC;QAC3B,KAAK,sBAAsB;YACzB,OAAO,GAAG,CAAC;QACb,KAAK,cAAc;YACjB,OAAO,GAAG,CAAC;QACb;YACE,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,YAAY,YAAY,CAAC;AACvC,CAAC"}
|
package/dist/http-policy.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ConnectionRequest } from "@polpo-ai/core";
|
|
2
|
-
import type { ConnectorHttpPolicy } from "./types.js";
|
|
2
|
+
import type { ConnectorHttpAuthPolicy, ConnectorHttpPolicy } from "./types.js";
|
|
3
3
|
export interface ResolvedConnectorHttpRequest {
|
|
4
4
|
url: string;
|
|
5
5
|
method: string;
|
|
@@ -11,6 +11,8 @@ export interface ResolvedConnectorHttpRequest {
|
|
|
11
11
|
followRedirects: boolean;
|
|
12
12
|
}
|
|
13
13
|
export declare function normalizeConnectorHttpPolicy(input: ConnectorHttpPolicy): ConnectorHttpPolicy;
|
|
14
|
+
/** Shared credential injection validation for API and remote MCP setup. */
|
|
15
|
+
export declare function normalizeConnectorAuthPolicy(input: ConnectorHttpAuthPolicy): ConnectorHttpAuthPolicy;
|
|
14
16
|
export declare function resolveConnectorHttpRequest(rawPolicy: ConnectorHttpPolicy, input: ConnectionRequest): ResolvedConnectorHttpRequest;
|
|
15
17
|
export declare function assertConnectorRedirectAllowed(rawPolicy: ConnectorHttpPolicy, destination: string): string;
|
|
16
18
|
export declare function connectorHostnameIsUnsafe(hostname: string): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-policy.d.ts","sourceRoot":"","sources":["../src/http-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"http-policy.d.ts","sourceRoot":"","sources":["../src/http-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA4B/E,MAAM,WAAW,4BAA4B;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAqID,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,mBAAmB,GACzB,mBAAmB,CAoCrB;AAED,2EAA2E;AAC3E,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,uBAAuB,GAAG,uBAAuB,CAwBpG;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,mBAAmB,EAC9B,KAAK,EAAE,iBAAiB,GACvB,4BAA4B,CA0F9B;AAED,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,mBAAmB,EAC9B,WAAW,EAAE,MAAM,GAClB,MAAM,CAoBR;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEnE"}
|
package/dist/http-policy.js
CHANGED
|
@@ -34,6 +34,8 @@ function positiveInteger(name, value, fallback, maximum) {
|
|
|
34
34
|
return candidate;
|
|
35
35
|
}
|
|
36
36
|
function normalizeOrigin(value) {
|
|
37
|
+
if (typeof value !== "string")
|
|
38
|
+
denied("Connector HTTP origin must be a string");
|
|
37
39
|
let url;
|
|
38
40
|
try {
|
|
39
41
|
url = new URL(value);
|
|
@@ -66,7 +68,22 @@ function isUnsafeHostname(rawHostname) {
|
|
|
66
68
|
if (/^(?:fc|fd|fe[89ab])/i.test(hostname))
|
|
67
69
|
return true;
|
|
68
70
|
const mapped = hostname.match(/::ffff:(\d+\.\d+\.\d+\.\d+)$/i)?.[1];
|
|
69
|
-
|
|
71
|
+
if (mapped)
|
|
72
|
+
return isUnsafeIpv4(mapped);
|
|
73
|
+
// URL normalizes mapped IPv4 literals to hexadecimal IPv6 groups.
|
|
74
|
+
let normalized;
|
|
75
|
+
try {
|
|
76
|
+
normalized = new URL(`https://[${hostname}]/`).hostname.replace(/^\[|\]$/g, "");
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
const hexMapped = normalized.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);
|
|
82
|
+
if (hexMapped) {
|
|
83
|
+
const high = parseInt(hexMapped[1], 16), low = parseInt(hexMapped[2], 16);
|
|
84
|
+
return isUnsafeIpv4([high >> 8, high & 255, low >> 8, low & 255].join("."));
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
70
87
|
}
|
|
71
88
|
return /^\d+\.\d+\.\d+\.\d+$/.test(hostname)
|
|
72
89
|
? isUnsafeIpv4(hostname)
|
|
@@ -93,6 +110,8 @@ function isUnsafeIpv4(hostname) {
|
|
|
93
110
|
|| a >= 224;
|
|
94
111
|
}
|
|
95
112
|
function normalizePathPattern(pattern) {
|
|
113
|
+
if (typeof pattern !== "string")
|
|
114
|
+
denied("Connector HTTP path pattern must be a string");
|
|
96
115
|
const normalized = pattern.trim();
|
|
97
116
|
if (!normalized.startsWith("/")
|
|
98
117
|
|| normalized.startsWith("//")
|
|
@@ -132,7 +151,15 @@ export function normalizeConnectorHttpPolicy(input) {
|
|
|
132
151
|
denied("Connector HTTP policy must declare between 1 and 16 origins");
|
|
133
152
|
}
|
|
134
153
|
const origins = [...new Set(input.origins.map(normalizeOrigin))];
|
|
154
|
+
if (input.allowedMethods !== undefined && !Array.isArray(input.allowedMethods))
|
|
155
|
+
denied("Connector HTTP methods must be an array");
|
|
156
|
+
if (input.allowedPathPatterns !== undefined && !Array.isArray(input.allowedPathPatterns))
|
|
157
|
+
denied("Connector HTTP path patterns must be an array");
|
|
158
|
+
if (input.followRedirects !== undefined && typeof input.followRedirects !== "boolean")
|
|
159
|
+
denied("Connector redirect policy must be a boolean");
|
|
135
160
|
const methods = [...new Set((input.allowedMethods ?? DEFAULT_METHODS).map((method) => {
|
|
161
|
+
if (typeof method !== "string")
|
|
162
|
+
denied("Connector HTTP method must be a string");
|
|
136
163
|
const normalized = method.trim().toUpperCase();
|
|
137
164
|
if (!/^[A-Z]+$/.test(normalized))
|
|
138
165
|
denied(`Connector HTTP method is invalid: ${method}`);
|
|
@@ -145,31 +172,45 @@ export function normalizeConnectorHttpPolicy(input) {
|
|
|
145
172
|
if (patterns.length === 0 || patterns.length > 128) {
|
|
146
173
|
denied("Connector HTTP policy must allow between 1 and 128 path patterns");
|
|
147
174
|
}
|
|
148
|
-
|
|
149
|
-
denied("Connector HTTP auth policy is invalid");
|
|
150
|
-
}
|
|
151
|
-
const authName = input.auth.name?.trim();
|
|
152
|
-
if ((input.auth.mode === "header" || input.auth.mode === "query")
|
|
153
|
-
&& (!authName || !/^[A-Za-z][A-Za-z0-9_-]{0,127}$/.test(authName))) {
|
|
154
|
-
denied(`Connector HTTP ${input.auth.mode} auth requires a safe name`);
|
|
155
|
-
}
|
|
175
|
+
const auth = normalizeConnectorAuthPolicy(input.auth);
|
|
156
176
|
return Object.freeze({
|
|
157
177
|
origins: Object.freeze(origins),
|
|
158
178
|
allowedMethods: Object.freeze(methods),
|
|
159
179
|
allowedPathPatterns: Object.freeze(patterns),
|
|
160
|
-
auth
|
|
161
|
-
mode: input.auth.mode,
|
|
162
|
-
...(authName ? { name: authName } : {}),
|
|
163
|
-
}),
|
|
180
|
+
auth,
|
|
164
181
|
followRedirects: input.followRedirects === true,
|
|
165
182
|
maxRequestBytes: positiveInteger("maxRequestBytes", input.maxRequestBytes, DEFAULT_MAX_REQUEST_BYTES, MAX_HTTP_BYTES),
|
|
166
183
|
maxResponseBytes: positiveInteger("maxResponseBytes", input.maxResponseBytes, DEFAULT_MAX_RESPONSE_BYTES, MAX_HTTP_BYTES),
|
|
167
184
|
timeoutMs: positiveInteger("timeoutMs", input.timeoutMs, DEFAULT_TIMEOUT_MS, MAX_TIMEOUT_MS),
|
|
168
185
|
});
|
|
169
186
|
}
|
|
187
|
+
/** Shared credential injection validation for API and remote MCP setup. */
|
|
188
|
+
export function normalizeConnectorAuthPolicy(input) {
|
|
189
|
+
if (!input || !["bearer", "header", "query", "none"].includes(input.mode)) {
|
|
190
|
+
denied("Connector HTTP auth policy is invalid");
|
|
191
|
+
}
|
|
192
|
+
if (input.name !== undefined && typeof input.name !== "string")
|
|
193
|
+
denied("Connector HTTP auth name must be a string");
|
|
194
|
+
const authName = input.name?.trim();
|
|
195
|
+
if ((input.mode === "header" || input.mode === "query")
|
|
196
|
+
&& (!authName || !/^[A-Za-z][A-Za-z0-9_-]{0,127}$/.test(authName))) {
|
|
197
|
+
denied(`Connector HTTP ${input.mode} auth requires a safe name`);
|
|
198
|
+
}
|
|
199
|
+
if ((input.mode === "none" || input.mode === "bearer") && authName) {
|
|
200
|
+
denied(`Connector HTTP ${input.mode} auth cannot declare a name`);
|
|
201
|
+
}
|
|
202
|
+
if (input.mode === "header" && authName) {
|
|
203
|
+
const name = authName.toLowerCase();
|
|
204
|
+
if ((FORBIDDEN_REQUEST_HEADERS.has(name) && name !== "authorization")
|
|
205
|
+
|| name.startsWith("proxy-") || name.startsWith("sec-")) {
|
|
206
|
+
denied("Connector HTTP authentication cannot replace transport or cookie headers");
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return Object.freeze({ mode: input.mode, ...(authName ? { name: authName } : {}) });
|
|
210
|
+
}
|
|
170
211
|
export function resolveConnectorHttpRequest(rawPolicy, input) {
|
|
171
212
|
const policy = normalizeConnectorHttpPolicy(rawPolicy);
|
|
172
|
-
const method = input.method
|
|
213
|
+
const method = typeof input.method === "string" ? input.method.trim().toUpperCase() : undefined;
|
|
173
214
|
if (!method || !/^[A-Z]+$/.test(method) || !policy.allowedMethods.includes(method)) {
|
|
174
215
|
denied(`Connection request method is not allowed: ${input.method}`);
|
|
175
216
|
}
|