llng-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/.github/workflows/ci.yml +77 -0
  2. package/.prettierrc +7 -0
  3. package/LICENSE +661 -0
  4. package/README.md +502 -0
  5. package/dist/__tests__/api-transport.test.d.ts +1 -0
  6. package/dist/__tests__/api-transport.test.js +577 -0
  7. package/dist/__tests__/api-transport.test.js.map +1 -0
  8. package/dist/__tests__/config.test.d.ts +1 -0
  9. package/dist/__tests__/config.test.js +472 -0
  10. package/dist/__tests__/config.test.js.map +1 -0
  11. package/dist/__tests__/integration/api-mode.test.d.ts +1 -0
  12. package/dist/__tests__/integration/api-mode.test.js +199 -0
  13. package/dist/__tests__/integration/api-mode.test.js.map +1 -0
  14. package/dist/__tests__/integration/oidc-rp.test.d.ts +1 -0
  15. package/dist/__tests__/integration/oidc-rp.test.js +120 -0
  16. package/dist/__tests__/integration/oidc-rp.test.js.map +1 -0
  17. package/dist/__tests__/integration/ssh-mode.test.d.ts +1 -0
  18. package/dist/__tests__/integration/ssh-mode.test.js +101 -0
  19. package/dist/__tests__/integration/ssh-mode.test.js.map +1 -0
  20. package/dist/__tests__/k8s-transport.test.d.ts +1 -0
  21. package/dist/__tests__/k8s-transport.test.js +254 -0
  22. package/dist/__tests__/k8s-transport.test.js.map +1 -0
  23. package/dist/__tests__/oidc-tools.test.d.ts +1 -0
  24. package/dist/__tests__/oidc-tools.test.js +457 -0
  25. package/dist/__tests__/oidc-tools.test.js.map +1 -0
  26. package/dist/__tests__/registry.test.d.ts +1 -0
  27. package/dist/__tests__/registry.test.js +96 -0
  28. package/dist/__tests__/registry.test.js.map +1 -0
  29. package/dist/__tests__/ssh-transport.test.d.ts +1 -0
  30. package/dist/__tests__/ssh-transport.test.js +618 -0
  31. package/dist/__tests__/ssh-transport.test.js.map +1 -0
  32. package/dist/__tests__/tools.test.d.ts +1 -0
  33. package/dist/__tests__/tools.test.js +525 -0
  34. package/dist/__tests__/tools.test.js.map +1 -0
  35. package/dist/config.d.ts +65 -0
  36. package/dist/config.js +506 -0
  37. package/dist/config.js.map +1 -0
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.js +42 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/resources/documentation.d.ts +5 -0
  42. package/dist/resources/documentation.js +56 -0
  43. package/dist/resources/documentation.js.map +1 -0
  44. package/dist/tools/cli-utilities.d.ts +3 -0
  45. package/dist/tools/cli-utilities.js +187 -0
  46. package/dist/tools/cli-utilities.js.map +1 -0
  47. package/dist/tools/config.d.ts +6 -0
  48. package/dist/tools/config.js +326 -0
  49. package/dist/tools/config.js.map +1 -0
  50. package/dist/tools/consents.d.ts +3 -0
  51. package/dist/tools/consents.js +39 -0
  52. package/dist/tools/consents.js.map +1 -0
  53. package/dist/tools/instances.d.ts +3 -0
  54. package/dist/tools/instances.js +14 -0
  55. package/dist/tools/instances.js.map +1 -0
  56. package/dist/tools/oidc-rp.d.ts +6 -0
  57. package/dist/tools/oidc-rp.js +246 -0
  58. package/dist/tools/oidc-rp.js.map +1 -0
  59. package/dist/tools/oidc.d.ts +3 -0
  60. package/dist/tools/oidc.js +343 -0
  61. package/dist/tools/oidc.js.map +1 -0
  62. package/dist/tools/secondfactors.d.ts +3 -0
  63. package/dist/tools/secondfactors.js +62 -0
  64. package/dist/tools/secondfactors.js.map +1 -0
  65. package/dist/tools/sessions.d.ts +6 -0
  66. package/dist/tools/sessions.js +300 -0
  67. package/dist/tools/sessions.js.map +1 -0
  68. package/dist/transport/api.d.ts +35 -0
  69. package/dist/transport/api.js +327 -0
  70. package/dist/transport/api.js.map +1 -0
  71. package/dist/transport/interface.d.ts +50 -0
  72. package/dist/transport/interface.js +2 -0
  73. package/dist/transport/interface.js.map +1 -0
  74. package/dist/transport/k8s.d.ts +41 -0
  75. package/dist/transport/k8s.js +303 -0
  76. package/dist/transport/k8s.js.map +1 -0
  77. package/dist/transport/registry.d.ts +20 -0
  78. package/dist/transport/registry.js +91 -0
  79. package/dist/transport/registry.js.map +1 -0
  80. package/dist/transport/ssh.d.ts +37 -0
  81. package/dist/transport/ssh.js +353 -0
  82. package/dist/transport/ssh.js.map +1 -0
  83. package/docker-compose.test.yml +16 -0
  84. package/eslint.config.js +21 -0
  85. package/package.json +38 -0
  86. package/src/__tests__/api-transport.test.ts +746 -0
  87. package/src/__tests__/config.test.ts +587 -0
  88. package/src/__tests__/integration/api-mode.test.ts +229 -0
  89. package/src/__tests__/integration/oidc-rp.test.ts +138 -0
  90. package/src/__tests__/integration/ssh-mode.test.ts +113 -0
  91. package/src/__tests__/k8s-transport.test.ts +342 -0
  92. package/src/__tests__/oidc-tools.test.ts +554 -0
  93. package/src/__tests__/registry.test.ts +110 -0
  94. package/src/__tests__/ssh-transport.test.ts +805 -0
  95. package/src/__tests__/tools.test.ts +735 -0
  96. package/src/config.ts +605 -0
  97. package/src/index.ts +48 -0
  98. package/src/resources/documentation.ts +65 -0
  99. package/src/tools/cli-utilities.ts +207 -0
  100. package/src/tools/config.ts +382 -0
  101. package/src/tools/consents.ts +50 -0
  102. package/src/tools/instances.ts +21 -0
  103. package/src/tools/oidc-rp.ts +299 -0
  104. package/src/tools/oidc.ts +434 -0
  105. package/src/tools/secondfactors.ts +78 -0
  106. package/src/tools/sessions.ts +342 -0
  107. package/src/transport/api.ts +429 -0
  108. package/src/transport/interface.ts +58 -0
  109. package/src/transport/k8s.ts +367 -0
  110. package/src/transport/registry.ts +105 -0
  111. package/src/transport/ssh.ts +430 -0
  112. package/tsconfig.json +16 -0
  113. package/vitest.config.ts +8 -0
  114. package/vitest.integration.config.ts +9 -0
@@ -0,0 +1,457 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { createHash } from "crypto";
3
+ import { registerOidcTools } from "../tools/oidc.js";
4
+ function createMockOidcRegistry(config) {
5
+ return {
6
+ getTransport: vi.fn(),
7
+ getOidcConfig: vi.fn().mockReturnValue(config),
8
+ listInstances: vi.fn().mockReturnValue([]),
9
+ };
10
+ }
11
+ describe("OIDC Tools", () => {
12
+ let originalFetch;
13
+ beforeEach(() => {
14
+ originalFetch = global.fetch;
15
+ });
16
+ afterEach(() => {
17
+ global.fetch = originalFetch;
18
+ vi.restoreAllMocks();
19
+ });
20
+ describe("PKCE generation", () => {
21
+ it("should generate code_verifier with 43+ chars in base64url", async () => {
22
+ const config = {
23
+ issuer: "https://auth.example.com",
24
+ clientId: "test-client",
25
+ redirectUri: "http://localhost:3000/callback",
26
+ scope: "openid profile",
27
+ };
28
+ const metadata = {
29
+ authorization_endpoint: "https://auth.example.com/authorize",
30
+ token_endpoint: "https://auth.example.com/token",
31
+ };
32
+ const mockFetch = vi.fn().mockResolvedValue({
33
+ ok: true,
34
+ status: 200,
35
+ json: () => Promise.resolve(metadata),
36
+ });
37
+ global.fetch = mockFetch;
38
+ const toolResults = [];
39
+ const mockServer = {
40
+ tool: vi.fn((name, desc, schema, handler) => {
41
+ if (name === "llng_oidc_authorize") {
42
+ toolResults.push({ name, handler });
43
+ }
44
+ }),
45
+ };
46
+ registerOidcTools(mockServer, createMockOidcRegistry(config));
47
+ const authorizeHandler = toolResults.find((t) => t.name === "llng_oidc_authorize")?.handler;
48
+ const result = await authorizeHandler({});
49
+ const parsed = JSON.parse(result.content[0].text);
50
+ expect(parsed.code_verifier).toMatch(/^[A-Za-z0-9_-]{43,}$/);
51
+ expect(parsed.code_verifier.length).toBeGreaterThanOrEqual(43);
52
+ });
53
+ it("should generate code_challenge as SHA256 of verifier in base64url", async () => {
54
+ const config = {
55
+ issuer: "https://auth.example.com",
56
+ clientId: "test-client",
57
+ redirectUri: "http://localhost:3000/callback",
58
+ scope: "openid profile",
59
+ };
60
+ const metadata = {
61
+ authorization_endpoint: "https://auth.example.com/authorize",
62
+ token_endpoint: "https://auth.example.com/token",
63
+ };
64
+ const mockFetch = vi.fn().mockResolvedValue({
65
+ ok: true,
66
+ status: 200,
67
+ json: () => Promise.resolve(metadata),
68
+ });
69
+ global.fetch = mockFetch;
70
+ const toolResults = [];
71
+ const mockServer = {
72
+ tool: vi.fn((name, desc, schema, handler) => {
73
+ if (name === "llng_oidc_authorize") {
74
+ toolResults.push({ name, handler });
75
+ }
76
+ }),
77
+ };
78
+ registerOidcTools(mockServer, createMockOidcRegistry(config));
79
+ const authorizeHandler = toolResults.find((t) => t.name === "llng_oidc_authorize")?.handler;
80
+ const result = await authorizeHandler({});
81
+ const parsed = JSON.parse(result.content[0].text);
82
+ const verifier = parsed.code_verifier;
83
+ const challenge = parsed.url.match(/code_challenge=([^&]+)/)?.[1];
84
+ // Compute expected challenge
85
+ const expectedChallenge = createHash("sha256").update(verifier).digest("base64url");
86
+ expect(decodeURIComponent(challenge)).toBe(expectedChallenge);
87
+ });
88
+ });
89
+ describe("JWT decode (whoami)", () => {
90
+ function makeJwt(payload) {
91
+ const header = Buffer.from(JSON.stringify({ alg: "RS256", typ: "JWT" })).toString("base64url");
92
+ const body = Buffer.from(JSON.stringify(payload)).toString("base64url");
93
+ const sig = "fakesignature";
94
+ return `${header}.${body}.${sig}`;
95
+ }
96
+ it("should decode a valid JWT payload", async () => {
97
+ const config = {
98
+ issuer: "https://auth.example.com",
99
+ clientId: "test-client",
100
+ redirectUri: "http://localhost:3000/callback",
101
+ scope: "openid profile",
102
+ };
103
+ const toolResults = [];
104
+ const mockServer = {
105
+ tool: vi.fn((name, desc, schema, handler) => {
106
+ if (name === "llng_oidc_whoami") {
107
+ toolResults.push({ name, handler });
108
+ }
109
+ }),
110
+ };
111
+ registerOidcTools(mockServer, createMockOidcRegistry(config));
112
+ const whoamiHandler = toolResults.find((t) => t.name === "llng_oidc_whoami")?.handler;
113
+ const payload = {
114
+ sub: "user123",
115
+ name: "John Doe",
116
+ email: "john@example.com",
117
+ iat: 1234567890,
118
+ exp: 1234571490,
119
+ };
120
+ const jwt = makeJwt(payload);
121
+ const result = await whoamiHandler({ id_token: jwt });
122
+ expect(result.isError).toBeUndefined();
123
+ const decoded = JSON.parse(result.content[0].text);
124
+ expect(decoded._warning).toContain("UNVERIFIED");
125
+ expect(decoded.sub).toBe(payload.sub);
126
+ expect(decoded.name).toBe(payload.name);
127
+ expect(decoded.email).toBe(payload.email);
128
+ expect(decoded.iat).toBe(payload.iat);
129
+ expect(decoded.exp).toBe(payload.exp);
130
+ });
131
+ it("should return error for invalid JWT format", async () => {
132
+ const config = {
133
+ issuer: "https://auth.example.com",
134
+ clientId: "test-client",
135
+ redirectUri: "http://localhost:3000/callback",
136
+ scope: "openid profile",
137
+ };
138
+ const toolResults = [];
139
+ const mockServer = {
140
+ tool: vi.fn((name, desc, schema, handler) => {
141
+ if (name === "llng_oidc_whoami") {
142
+ toolResults.push({ name, handler });
143
+ }
144
+ }),
145
+ };
146
+ registerOidcTools(mockServer, createMockOidcRegistry(config));
147
+ const whoamiHandler = toolResults.find((t) => t.name === "llng_oidc_whoami")?.handler;
148
+ const result = await whoamiHandler({ id_token: "not.a.valid.jwt.token" });
149
+ expect(result.isError).toBe(true);
150
+ expect(result.content[0].text).toContain("Error: Invalid JWT format");
151
+ });
152
+ it("should handle JWT with special characters in payload", async () => {
153
+ const config = {
154
+ issuer: "https://auth.example.com",
155
+ clientId: "test-client",
156
+ redirectUri: "http://localhost:3000/callback",
157
+ scope: "openid profile",
158
+ };
159
+ const toolResults = [];
160
+ const mockServer = {
161
+ tool: vi.fn((name, desc, schema, handler) => {
162
+ if (name === "llng_oidc_whoami") {
163
+ toolResults.push({ name, handler });
164
+ }
165
+ }),
166
+ };
167
+ registerOidcTools(mockServer, createMockOidcRegistry(config));
168
+ const whoamiHandler = toolResults.find((t) => t.name === "llng_oidc_whoami")?.handler;
169
+ const payload = {
170
+ sub: "user@example.com",
171
+ name: "José García",
172
+ groups: ["admin", "users"],
173
+ };
174
+ const jwt = makeJwt(payload);
175
+ const result = await whoamiHandler({ id_token: jwt });
176
+ const decoded = JSON.parse(result.content[0].text);
177
+ expect(decoded.name).toBe("José García");
178
+ expect(decoded.groups).toEqual(["admin", "users"]);
179
+ });
180
+ });
181
+ describe("OIDC not configured", () => {
182
+ it("should return error when config is undefined", async () => {
183
+ const toolResults = [];
184
+ const mockServer = {
185
+ tool: vi.fn((name, desc, schema, handler) => {
186
+ toolResults.push({ name, handler });
187
+ }),
188
+ };
189
+ registerOidcTools(mockServer, createMockOidcRegistry(undefined));
190
+ // Test each tool
191
+ for (const tool of toolResults) {
192
+ const result = await tool.handler({});
193
+ expect(result.isError).toBe(true);
194
+ expect(result.content[0].text).toContain("Error: OIDC not configured");
195
+ }
196
+ });
197
+ });
198
+ describe("Discovery metadata caching", () => {
199
+ it("should fetch discovery metadata successfully", async () => {
200
+ // Note: Discovery metadata caching is an implementation detail that uses
201
+ // module-scoped state. This test verifies that the discovery endpoint
202
+ // can be fetched successfully. Cache behavior is implicitly tested by
203
+ // the fact that subsequent tool calls don't fail.
204
+ const config = {
205
+ issuer: "https://cache-test.example.com",
206
+ clientId: "test-client",
207
+ redirectUri: "http://localhost:3000/callback",
208
+ scope: "openid profile",
209
+ };
210
+ const metadata = {
211
+ issuer: "https://cache-test.example.com",
212
+ authorization_endpoint: "https://cache-test.example.com/authorize",
213
+ token_endpoint: "https://cache-test.example.com/token",
214
+ userinfo_endpoint: "https://cache-test.example.com/userinfo",
215
+ };
216
+ const mockFetch = vi.fn().mockResolvedValue({
217
+ ok: true,
218
+ status: 200,
219
+ json: () => Promise.resolve(metadata),
220
+ });
221
+ global.fetch = mockFetch;
222
+ const toolResults = [];
223
+ const mockServer = {
224
+ tool: vi.fn((name, desc, schema, handler) => {
225
+ toolResults.push({ name, handler });
226
+ }),
227
+ };
228
+ registerOidcTools(mockServer, createMockOidcRegistry(config));
229
+ const metadataHandler = toolResults.find((t) => t.name === "llng_oidc_metadata")?.handler;
230
+ expect(metadataHandler).toBeDefined();
231
+ const result = await metadataHandler({});
232
+ expect(result.isError).toBeUndefined();
233
+ const parsed = JSON.parse(result.content[0].text);
234
+ expect(parsed.issuer).toBe("https://cache-test.example.com");
235
+ expect(parsed.authorization_endpoint).toBe("https://cache-test.example.com/authorize");
236
+ });
237
+ });
238
+ describe("Tool registration", () => {
239
+ it("should register 8 OIDC tools", () => {
240
+ const config = {
241
+ issuer: "https://auth.example.com",
242
+ clientId: "test-client",
243
+ redirectUri: "http://localhost:3000/callback",
244
+ scope: "openid profile",
245
+ };
246
+ const toolNames = [];
247
+ const mockServer = {
248
+ tool: vi.fn((name) => {
249
+ toolNames.push(name);
250
+ }),
251
+ };
252
+ registerOidcTools(mockServer, createMockOidcRegistry(config));
253
+ expect(toolNames).toEqual([
254
+ "llng_oidc_metadata",
255
+ "llng_oidc_authorize",
256
+ "llng_oidc_tokens",
257
+ "llng_oidc_userinfo",
258
+ "llng_oidc_introspect",
259
+ "llng_oidc_refresh",
260
+ "llng_oidc_whoami",
261
+ "llng_oidc_check_auth",
262
+ ]);
263
+ });
264
+ });
265
+ describe("Authorization URL generation", () => {
266
+ it("should include all required PKCE parameters", async () => {
267
+ const config = {
268
+ issuer: "https://auth.example.com",
269
+ clientId: "test-client",
270
+ redirectUri: "http://localhost:3000/callback",
271
+ scope: "openid profile email",
272
+ };
273
+ const metadata = {
274
+ authorization_endpoint: "https://auth.example.com/authorize",
275
+ token_endpoint: "https://auth.example.com/token",
276
+ };
277
+ const mockFetch = vi.fn().mockResolvedValue({
278
+ ok: true,
279
+ status: 200,
280
+ json: () => Promise.resolve(metadata),
281
+ });
282
+ global.fetch = mockFetch;
283
+ const toolResults = [];
284
+ const mockServer = {
285
+ tool: vi.fn((name, desc, schema, handler) => {
286
+ if (name === "llng_oidc_authorize") {
287
+ toolResults.push({ name, handler });
288
+ }
289
+ }),
290
+ };
291
+ registerOidcTools(mockServer, createMockOidcRegistry(config));
292
+ const authorizeHandler = toolResults.find((t) => t.name === "llng_oidc_authorize")?.handler;
293
+ const result = await authorizeHandler({});
294
+ const parsed = JSON.parse(result.content[0].text);
295
+ const url = new URL(parsed.url);
296
+ expect(url.searchParams.get("response_type")).toBe("code");
297
+ expect(url.searchParams.get("client_id")).toBe("test-client");
298
+ expect(url.searchParams.get("redirect_uri")).toBe("http://localhost:3000/callback");
299
+ expect(url.searchParams.get("scope")).toBe("openid profile email");
300
+ expect(url.searchParams.get("code_challenge")).toBeTruthy();
301
+ expect(url.searchParams.get("code_challenge_method")).toBe("S256");
302
+ expect(url.searchParams.get("state")).toBeTruthy();
303
+ });
304
+ it("should use custom scope when provided", async () => {
305
+ const config = {
306
+ issuer: "https://auth.example.com",
307
+ clientId: "test-client",
308
+ redirectUri: "http://localhost:3000/callback",
309
+ scope: "openid profile",
310
+ };
311
+ const metadata = {
312
+ authorization_endpoint: "https://auth.example.com/authorize",
313
+ token_endpoint: "https://auth.example.com/token",
314
+ };
315
+ const mockFetch = vi.fn().mockResolvedValue({
316
+ ok: true,
317
+ status: 200,
318
+ json: () => Promise.resolve(metadata),
319
+ });
320
+ global.fetch = mockFetch;
321
+ const toolResults = [];
322
+ const mockServer = {
323
+ tool: vi.fn((name, desc, schema, handler) => {
324
+ if (name === "llng_oidc_authorize") {
325
+ toolResults.push({ name, handler });
326
+ }
327
+ }),
328
+ };
329
+ registerOidcTools(mockServer, createMockOidcRegistry(config));
330
+ const authorizeHandler = toolResults.find((t) => t.name === "llng_oidc_authorize")?.handler;
331
+ const result = await authorizeHandler({ scope: "openid email offline_access" });
332
+ const parsed = JSON.parse(result.content[0].text);
333
+ const url = new URL(parsed.url);
334
+ expect(url.searchParams.get("scope")).toBe("openid email offline_access");
335
+ });
336
+ });
337
+ describe("Token exchange", () => {
338
+ it("should send correct parameters in token request", async () => {
339
+ const config = {
340
+ issuer: "https://auth.example.com",
341
+ clientId: "test-client",
342
+ redirectUri: "http://localhost:3000/callback",
343
+ scope: "openid profile",
344
+ clientSecret: "secret123",
345
+ };
346
+ const metadata = {
347
+ token_endpoint: "https://auth.example.com/token",
348
+ };
349
+ const tokenResponse = {
350
+ access_token: "access123",
351
+ id_token: "id123",
352
+ token_type: "Bearer",
353
+ expires_in: 3600,
354
+ };
355
+ const fetchCalls = [];
356
+ const mockFetch = vi.fn().mockImplementation((url, options) => {
357
+ fetchCalls.push({ url, options });
358
+ // First call is discovery, second is token
359
+ if (url.includes(".well-known")) {
360
+ return Promise.resolve({
361
+ ok: true,
362
+ status: 200,
363
+ json: () => Promise.resolve(metadata),
364
+ });
365
+ }
366
+ else {
367
+ return Promise.resolve({
368
+ ok: true,
369
+ status: 200,
370
+ json: () => Promise.resolve(tokenResponse),
371
+ });
372
+ }
373
+ });
374
+ global.fetch = mockFetch;
375
+ const toolResults = [];
376
+ const mockServer = {
377
+ tool: vi.fn((name, desc, schema, handler) => {
378
+ if (name === "llng_oidc_tokens") {
379
+ toolResults.push({ name, handler });
380
+ }
381
+ }),
382
+ };
383
+ registerOidcTools(mockServer, createMockOidcRegistry(config));
384
+ const tokensHandler = toolResults.find((t) => t.name === "llng_oidc_tokens")?.handler;
385
+ await tokensHandler({ code: "auth_code_123", code_verifier: "verifier123" });
386
+ // Find the token endpoint call
387
+ const tokenCall = fetchCalls.find((call) => call.url === "https://auth.example.com/token");
388
+ expect(tokenCall).toBeDefined();
389
+ expect(tokenCall.options.method).toBe("POST");
390
+ const body = new URLSearchParams(tokenCall.options.body);
391
+ expect(body.get("grant_type")).toBe("authorization_code");
392
+ expect(body.get("code")).toBe("auth_code_123");
393
+ expect(body.get("code_verifier")).toBe("verifier123");
394
+ expect(body.get("client_id")).toBe("test-client");
395
+ expect(body.get("client_secret")).toBe("secret123");
396
+ expect(body.get("redirect_uri")).toBe("http://localhost:3000/callback");
397
+ });
398
+ });
399
+ describe("Error handling", () => {
400
+ it("should handle fetch errors gracefully", async () => {
401
+ // Use a unique issuer to avoid cache collision
402
+ const config = {
403
+ issuer: "https://error-test-1.example.com",
404
+ clientId: "test-client",
405
+ redirectUri: "http://localhost:3000/callback",
406
+ scope: "openid profile",
407
+ };
408
+ const mockFetch = vi.fn().mockRejectedValue(new Error("Network error"));
409
+ global.fetch = mockFetch;
410
+ const toolResults = [];
411
+ const mockServer = {
412
+ tool: vi.fn((name, desc, schema, handler) => {
413
+ toolResults.push({ name, handler });
414
+ }),
415
+ };
416
+ registerOidcTools(mockServer, createMockOidcRegistry(config));
417
+ const metadataHandler = toolResults.find((t) => t.name === "llng_oidc_metadata")?.handler;
418
+ expect(metadataHandler).toBeDefined();
419
+ if (metadataHandler) {
420
+ const result = await metadataHandler({});
421
+ expect(result.isError).toBe(true);
422
+ expect(result.content[0].text).toContain("Network error");
423
+ }
424
+ });
425
+ it("should handle HTTP error responses", async () => {
426
+ // Use a unique issuer to avoid cache collision
427
+ const config = {
428
+ issuer: "https://error-test-2.example.com",
429
+ clientId: "test-client",
430
+ redirectUri: "http://localhost:3000/callback",
431
+ scope: "openid profile",
432
+ };
433
+ const mockFetch = vi.fn().mockResolvedValue({
434
+ ok: false,
435
+ status: 404,
436
+ statusText: "Not Found",
437
+ json: () => Promise.resolve({ error: "not_found" }),
438
+ });
439
+ global.fetch = mockFetch;
440
+ const toolResults = [];
441
+ const mockServer = {
442
+ tool: vi.fn((name, desc, schema, handler) => {
443
+ toolResults.push({ name, handler });
444
+ }),
445
+ };
446
+ registerOidcTools(mockServer, createMockOidcRegistry(config));
447
+ const metadataHandler = toolResults.find((t) => t.name === "llng_oidc_metadata")?.handler;
448
+ expect(metadataHandler).toBeDefined();
449
+ if (metadataHandler) {
450
+ const result = await metadataHandler({});
451
+ expect(result.isError).toBe(true);
452
+ expect(result.content[0].text).toContain("404");
453
+ }
454
+ });
455
+ });
456
+ });
457
+ //# sourceMappingURL=oidc-tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oidc-tools.test.js","sourceRoot":"","sources":["../../src/__tests__/oidc-tools.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAKrD,SAAS,sBAAsB,CAAC,MAA8B;IAC5D,OAAO;QACL,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;QACrB,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC;QAC9C,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;KACX,CAAC;AACpC,CAAC;AAED,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAI,aAAkC,CAAC;IAEvC,UAAU,CAAC,GAAG,EAAE;QACd,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC;QAC7B,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,MAAM,GAAe;gBACzB,MAAM,EAAE,0BAA0B;gBAClC,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,gCAAgC;gBAC7C,KAAK,EAAE,gBAAgB;aACxB,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,sBAAsB,EAAE,oCAAoC;gBAC5D,cAAc,EAAE,gCAAgC;aACjD,CAAC;YAEF,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBAC1C,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;aACtC,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,GAAG,SAAgB,CAAC;YAEhC,MAAM,WAAW,GAAU,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,IAAY,EAAE,MAAW,EAAE,OAAY,EAAE,EAAE;oBACpE,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;wBACnC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC,CAAC;aACqB,CAAC;YAE1B,iBAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YAE9D,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,CAAC,EAAE,OAAO,CAAC;YAC5F,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC;YAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;YACjF,MAAM,MAAM,GAAe;gBACzB,MAAM,EAAE,0BAA0B;gBAClC,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,gCAAgC;gBAC7C,KAAK,EAAE,gBAAgB;aACxB,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,sBAAsB,EAAE,oCAAoC;gBAC5D,cAAc,EAAE,gCAAgC;aACjD,CAAC;YAEF,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBAC1C,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;aACtC,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,GAAG,SAAgB,CAAC;YAEhC,MAAM,WAAW,GAAU,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,IAAY,EAAE,MAAW,EAAE,OAAY,EAAE,EAAE;oBACpE,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;wBACnC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC,CAAC;aACqB,CAAC;YAE1B,iBAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YAE9D,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,CAAC,EAAE,OAAO,CAAC;YAC5F,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC;YAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC;YACtC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAElE,6BAA6B;YAC7B,MAAM,iBAAiB,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAEpF,MAAM,CAAC,kBAAkB,CAAC,SAAU,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,SAAS,OAAO,CAAC,OAAe;YAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAC/E,WAAW,CACZ,CAAC;YACF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACxE,MAAM,GAAG,GAAG,eAAe,CAAC;YAC5B,OAAO,GAAG,MAAM,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;QACpC,CAAC;QAED,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,MAAM,GAAe;gBACzB,MAAM,EAAE,0BAA0B;gBAClC,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,gCAAgC;gBAC7C,KAAK,EAAE,gBAAgB;aACxB,CAAC;YAEF,MAAM,WAAW,GAAU,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,IAAY,EAAE,MAAW,EAAE,OAAY,EAAE,EAAE;oBACpE,IAAI,IAAI,KAAK,kBAAkB,EAAE,CAAC;wBAChC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC,CAAC;aACqB,CAAC;YAE1B,iBAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YAE9D,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,EAAE,OAAO,CAAC;YAEtF,MAAM,OAAO,GAAG;gBACd,GAAG,EAAE,SAAS;gBACd,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,kBAAkB;gBACzB,GAAG,EAAE,UAAU;gBACf,GAAG,EAAE,UAAU;aAChB,CAAC;YAEF,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YAEtD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACjD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,MAAM,GAAe;gBACzB,MAAM,EAAE,0BAA0B;gBAClC,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,gCAAgC;gBAC7C,KAAK,EAAE,gBAAgB;aACxB,CAAC;YAEF,MAAM,WAAW,GAAU,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,IAAY,EAAE,MAAW,EAAE,OAAY,EAAE,EAAE;oBACpE,IAAI,IAAI,KAAK,kBAAkB,EAAE,CAAC;wBAChC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC,CAAC;aACqB,CAAC;YAE1B,iBAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YAE9D,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,EAAE,OAAO,CAAC;YAEtF,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,QAAQ,EAAE,uBAAuB,EAAE,CAAC,CAAC;YAE1E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,MAAM,GAAe;gBACzB,MAAM,EAAE,0BAA0B;gBAClC,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,gCAAgC;gBAC7C,KAAK,EAAE,gBAAgB;aACxB,CAAC;YAEF,MAAM,WAAW,GAAU,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,IAAY,EAAE,MAAW,EAAE,OAAY,EAAE,EAAE;oBACpE,IAAI,IAAI,KAAK,kBAAkB,EAAE,CAAC;wBAChC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC,CAAC;aACqB,CAAC;YAE1B,iBAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YAE9D,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,EAAE,OAAO,CAAC;YAEtF,MAAM,OAAO,GAAG;gBACd,GAAG,EAAE,kBAAkB;gBACvB,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;aAC3B,CAAC;YAEF,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YAEtD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACzC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,WAAW,GAAU,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,IAAY,EAAE,MAAW,EAAE,OAAY,EAAE,EAAE;oBACpE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBACtC,CAAC,CAAC;aACqB,CAAC;YAE1B,iBAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC;YAEjE,iBAAiB;YACjB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACtC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YACzE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,yEAAyE;YACzE,sEAAsE;YACtE,sEAAsE;YACtE,kDAAkD;YAElD,MAAM,MAAM,GAAe;gBACzB,MAAM,EAAE,gCAAgC;gBACxC,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,gCAAgC;gBAC7C,KAAK,EAAE,gBAAgB;aACxB,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,MAAM,EAAE,gCAAgC;gBACxC,sBAAsB,EAAE,0CAA0C;gBAClE,cAAc,EAAE,sCAAsC;gBACtD,iBAAiB,EAAE,yCAAyC;aAC7D,CAAC;YAEF,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBAC1C,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;aACtC,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,GAAG,SAAgB,CAAC;YAEhC,MAAM,WAAW,GAAU,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,IAAY,EAAE,MAAW,EAAE,OAAY,EAAE,EAAE;oBACpE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBACtC,CAAC,CAAC;aACqB,CAAC;YAE1B,iBAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YAE9D,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,oBAAoB,CAAC,EAAE,OAAO,CAAC;YAC1F,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;YAEtC,MAAM,MAAM,GAAG,MAAM,eAAgB,CAAC,EAAE,CAAC,CAAC;YAE1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,MAAM,GAAe;gBACzB,MAAM,EAAE,0BAA0B;gBAClC,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,gCAAgC;gBAC7C,KAAK,EAAE,gBAAgB;aACxB,CAAC;YAEF,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE;oBAC3B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvB,CAAC,CAAC;aACqB,CAAC;YAE1B,iBAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YAE9D,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;gBACxB,oBAAoB;gBACpB,qBAAqB;gBACrB,kBAAkB;gBAClB,oBAAoB;gBACpB,sBAAsB;gBACtB,mBAAmB;gBACnB,kBAAkB;gBAClB,sBAAsB;aACvB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,MAAM,GAAe;gBACzB,MAAM,EAAE,0BAA0B;gBAClC,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,gCAAgC;gBAC7C,KAAK,EAAE,sBAAsB;aAC9B,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,sBAAsB,EAAE,oCAAoC;gBAC5D,cAAc,EAAE,gCAAgC;aACjD,CAAC;YAEF,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBAC1C,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;aACtC,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,GAAG,SAAgB,CAAC;YAEhC,MAAM,WAAW,GAAU,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,IAAY,EAAE,MAAW,EAAE,OAAY,EAAE,EAAE;oBACpE,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;wBACnC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC,CAAC;aACqB,CAAC;YAE1B,iBAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YAE9D,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,CAAC,EAAE,OAAO,CAAC;YAC5F,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC;YAE1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAEhC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC9D,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YACpF,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACnE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;YAC5D,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,MAAM,GAAe;gBACzB,MAAM,EAAE,0BAA0B;gBAClC,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,gCAAgC;gBAC7C,KAAK,EAAE,gBAAgB;aACxB,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,sBAAsB,EAAE,oCAAoC;gBAC5D,cAAc,EAAE,gCAAgC;aACjD,CAAC;YAEF,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBAC1C,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;aACtC,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,GAAG,SAAgB,CAAC;YAEhC,MAAM,WAAW,GAAU,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,IAAY,EAAE,MAAW,EAAE,OAAY,EAAE,EAAE;oBACpE,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;wBACnC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC,CAAC;aACqB,CAAC;YAE1B,iBAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YAE9D,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAqB,CAAC,EAAE,OAAO,CAAC;YAC5F,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC,CAAC;YAEhF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAEhC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,MAAM,GAAe;gBACzB,MAAM,EAAE,0BAA0B;gBAClC,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,gCAAgC;gBAC7C,KAAK,EAAE,gBAAgB;gBACvB,YAAY,EAAE,WAAW;aAC1B,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,cAAc,EAAE,gCAAgC;aACjD,CAAC;YAEF,MAAM,aAAa,GAAG;gBACpB,YAAY,EAAE,WAAW;gBACzB,QAAQ,EAAE,OAAO;gBACjB,UAAU,EAAE,QAAQ;gBACpB,UAAU,EAAE,IAAI;aACjB,CAAC;YAEF,MAAM,UAAU,GAAU,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,GAAW,EAAE,OAAY,EAAE,EAAE;gBACzE,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;gBAClC,2CAA2C;gBAC3C,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;oBAChC,OAAO,OAAO,CAAC,OAAO,CAAC;wBACrB,EAAE,EAAE,IAAI;wBACR,MAAM,EAAE,GAAG;wBACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;qBACtC,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,OAAO,OAAO,CAAC,OAAO,CAAC;wBACrB,EAAE,EAAE,IAAI;wBACR,MAAM,EAAE,GAAG;wBACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;qBAC3C,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,GAAG,SAAgB,CAAC;YAEhC,MAAM,WAAW,GAAU,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,IAAY,EAAE,MAAW,EAAE,OAAY,EAAE,EAAE;oBACpE,IAAI,IAAI,KAAK,kBAAkB,EAAE,CAAC;wBAChC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC,CAAC;aACqB,CAAC;YAE1B,iBAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YAE9D,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,EAAE,OAAO,CAAC;YACtF,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC;YAE7E,+BAA+B;YAC/B,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,gCAAgC,CAAC,CAAC;YAC3F,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;YAChC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE9C,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,+CAA+C;YAC/C,MAAM,MAAM,GAAe;gBACzB,MAAM,EAAE,kCAAkC;gBAC1C,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,gCAAgC;gBAC7C,KAAK,EAAE,gBAAgB;aACxB,CAAC;YAEF,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;YACxE,MAAM,CAAC,KAAK,GAAG,SAAgB,CAAC;YAEhC,MAAM,WAAW,GAAU,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,IAAY,EAAE,MAAW,EAAE,OAAY,EAAE,EAAE;oBACpE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBACtC,CAAC,CAAC;aACqB,CAAC;YAE1B,iBAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YAE9D,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,oBAAoB,CAAC,EAAE,OAAO,CAAC;YAC1F,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;YAEtC,IAAI,eAAe,EAAE,CAAC;gBACpB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;gBACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,+CAA+C;YAC/C,MAAM,MAAM,GAAe;gBACzB,MAAM,EAAE,kCAAkC;gBAC1C,QAAQ,EAAE,aAAa;gBACvB,WAAW,EAAE,gCAAgC;gBAC7C,KAAK,EAAE,gBAAgB;aACxB,CAAC;YAEF,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBAC1C,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,UAAU,EAAE,WAAW;gBACvB,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;aACpD,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,GAAG,SAAgB,CAAC;YAEhC,MAAM,WAAW,GAAU,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,IAAY,EAAE,MAAW,EAAE,OAAY,EAAE,EAAE;oBACpE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBACtC,CAAC,CAAC;aACqB,CAAC;YAE1B,iBAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YAE9D,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,oBAAoB,CAAC,EAAE,OAAO,CAAC;YAC1F,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;YAEtC,IAAI,eAAe,EAAE,CAAC;gBACpB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;gBACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAClD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,96 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { TransportRegistry } from "../transport/registry.js";
3
+ vi.mock("../transport/api.js", () => {
4
+ const ApiTransport = vi.fn(function () {
5
+ this._type = "api";
6
+ });
7
+ return { ApiTransport };
8
+ });
9
+ vi.mock("../transport/ssh.js", () => {
10
+ const SshTransport = vi.fn(function () {
11
+ this._type = "ssh";
12
+ });
13
+ return { SshTransport };
14
+ });
15
+ describe("TransportRegistry", () => {
16
+ function makeConfig(overrides) {
17
+ return {
18
+ instances: {
19
+ prod: {
20
+ mode: "api",
21
+ api: { baseUrl: "https://prod.example.com" },
22
+ },
23
+ staging: {
24
+ mode: "ssh",
25
+ ssh: {
26
+ host: "staging.example.com",
27
+ cliPath: "/usr/share/lemonldap-ng/bin/lemonldap-ng-cli",
28
+ sessionsPath: "/usr/share/lemonldap-ng/bin/lemonldap-ng-sessions",
29
+ configEditorPath: "/usr/share/lemonldap-ng/bin/lmConfigEditor",
30
+ },
31
+ },
32
+ },
33
+ default: "prod",
34
+ ...overrides,
35
+ };
36
+ }
37
+ it("returns transport for default instance when no name given", () => {
38
+ const registry = new TransportRegistry(makeConfig());
39
+ const transport = registry.getTransport();
40
+ expect(transport).toBeDefined();
41
+ expect(transport._type).toBe("api");
42
+ });
43
+ it("returns transport for named instance", () => {
44
+ const registry = new TransportRegistry(makeConfig());
45
+ const transport = registry.getTransport("staging");
46
+ expect(transport._type).toBe("ssh");
47
+ });
48
+ it("caches transport instances", () => {
49
+ const registry = new TransportRegistry(makeConfig());
50
+ const t1 = registry.getTransport("prod");
51
+ const t2 = registry.getTransport("prod");
52
+ expect(t1).toBe(t2);
53
+ });
54
+ it("throws for unknown instance", () => {
55
+ const registry = new TransportRegistry(makeConfig());
56
+ expect(() => registry.getTransport("unknown")).toThrow("Unknown instance 'unknown'. Available instances: prod, staging");
57
+ });
58
+ it("throws for API mode without api config", () => {
59
+ const config = makeConfig({
60
+ instances: {
61
+ broken: { mode: "api" },
62
+ },
63
+ default: "broken",
64
+ });
65
+ const registry = new TransportRegistry(config);
66
+ expect(() => registry.getTransport()).toThrow("API mode requires 'api' configuration");
67
+ });
68
+ it("returns OIDC config for instance", () => {
69
+ const config = makeConfig();
70
+ config.instances.prod.oidc = {
71
+ issuer: "https://auth.example.com",
72
+ clientId: "client",
73
+ redirectUri: "http://localhost/cb",
74
+ scope: "openid",
75
+ };
76
+ const registry = new TransportRegistry(config);
77
+ expect(registry.getOidcConfig("prod")?.issuer).toBe("https://auth.example.com");
78
+ });
79
+ it("returns undefined OIDC config when not configured", () => {
80
+ const registry = new TransportRegistry(makeConfig());
81
+ expect(registry.getOidcConfig("prod")).toBeUndefined();
82
+ });
83
+ it("throws for unknown instance in getOidcConfig", () => {
84
+ const registry = new TransportRegistry(makeConfig());
85
+ expect(() => registry.getOidcConfig("nope")).toThrow("Unknown instance 'nope'");
86
+ });
87
+ it("lists all instances", () => {
88
+ const registry = new TransportRegistry(makeConfig());
89
+ const list = registry.listInstances();
90
+ expect(list).toEqual([
91
+ { name: "prod", mode: "api", isDefault: true, hasManager: false },
92
+ { name: "staging", mode: "ssh", isDefault: false, hasManager: false },
93
+ ]);
94
+ });
95
+ });
96
+ //# sourceMappingURL=registry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/__tests__/registry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};