@mcp-abap-adt/auth-broker 0.3.6 → 1.0.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/CHANGELOG.md CHANGED
@@ -11,6 +11,11 @@ Thank you to all contributors! See [CONTRIBUTORS.md](CONTRIBUTORS.md) for the co
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [1.0.0] - 2026-02-10
15
+
16
+ ### Added
17
+ - Persist SAML session cookies when token providers return `tokenType: 'saml'`.
18
+
14
19
  ## [0.3.6] - 2026-01-28
15
20
 
16
21
  ### Changed
@@ -1 +1 @@
1
- {"version":3,"file":"AuthBroker.d.ts","sourceRoot":"","sources":["../src/AuthBroker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,eAAe,EAGrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACd,MAAM,qBAAqB,CAAC;AA6C7B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,YAAY,EAAE,aAAa,CAAC;IAC5B,uEAAuE;IACvE,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,4IAA4I;IAC5I,aAAa,EAAE,cAAc,CAAC;IAC9B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,gBAAgB,CAAU;IAElC;;;;;;;;;;;OAWG;gBACS,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO;IAsFxE;;OAEG;YACW,eAAe;IA0D7B;;OAEG;YACW,aAAa;IAoD3B;;OAEG;YACW,oCAAoC;IA4ClD;;OAEG;YACW,kBAAkB;YAkClB,aAAa;YA0Db,kBAAkB;IAgDhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAuCG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkJpD;;;;;OAKG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASxD;;;;OAIG;IACG,sBAAsB,CAC1B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAoEvC;;;;OAIG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAgEpC;;;;;;;;;;;;;;;;OAgBG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe;CAqB3D"}
1
+ {"version":3,"file":"AuthBroker.d.ts","sourceRoot":"","sources":["../src/AuthBroker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,eAAe,EAGrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACd,MAAM,qBAAqB,CAAC;AA6C7B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,YAAY,EAAE,aAAa,CAAC;IAC5B,uEAAuE;IACvE,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,4IAA4I;IAC5I,aAAa,EAAE,cAAc,CAAC;IAC9B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,gBAAgB,CAAU;IAElC;;;;;;;;;;;OAWG;gBACS,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO;IAsFxE;;OAEG;YACW,eAAe;IA0D7B;;OAEG;YACW,aAAa;IAoD3B;;OAEG;YACW,oCAAoC;IA4ClD;;OAEG;YACW,kBAAkB;YAkClB,aAAa;YA0Db,kBAAkB;IAkDhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAuCG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsJpD;;;;;OAKG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASxD;;;;OAIG;IACG,sBAAsB,CAC1B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAoEvC;;;;OAIG;IACG,mBAAmB,CACvB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAuEpC;;;;;;;;;;;;;;;;OAgBG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe;CAqB3D"}
@@ -298,11 +298,13 @@ class AuthBroker {
298
298
  if (!token) {
299
299
  throw new Error(`Token provider did not return authorization token for destination "${destination}"`);
300
300
  }
301
+ const isSaml = tokenResult.tokenType === 'saml';
301
302
  const connectionConfigWithServiceUrl = {
302
303
  ...baseConnConfig,
303
304
  serviceUrl,
304
- authorizationToken: token,
305
- authType: 'jwt',
305
+ authorizationToken: isSaml ? undefined : token,
306
+ sessionCookies: isSaml ? token : undefined,
307
+ authType: isSaml ? 'saml' : 'jwt',
306
308
  };
307
309
  const authorizationConfig = {
308
310
  ...authConfig,
@@ -368,14 +370,15 @@ class AuthBroker {
368
370
  // Get serviceUrl (required)
369
371
  const serviceUrl = await this.getServiceUrl(destination, connConfig);
370
372
  // Check if we have token or UAA credentials
371
- const hasToken = !!connConfig?.authorizationToken;
373
+ const sessionToken = connConfig?.authorizationToken || connConfig?.sessionCookies;
374
+ const hasToken = !!sessionToken;
372
375
  const hasAuthConfig = !!authConfig;
373
376
  this.logger?.info(`[AuthBroker] Session check for ${destination}`, {
374
377
  hasToken,
375
378
  hasAuthConfig,
376
379
  hasServiceUrl: !!serviceUrl,
377
380
  serviceUrl,
378
- authorizationToken: (0, formatting_1.formatToken)(connConfig?.authorizationToken),
381
+ authorizationToken: (0, formatting_1.formatToken)(connConfig?.authorizationToken || connConfig?.sessionCookies),
379
382
  hasRefreshToken: !!authConfig?.refreshToken,
380
383
  refreshToken: (0, formatting_1.formatToken)(authConfig?.refreshToken),
381
384
  });
@@ -528,8 +531,10 @@ class AuthBroker {
528
531
  this.logger?.warn(`Failed to get connection config from session store for ${destination}: ${getErrorMessage(error)}`);
529
532
  }
530
533
  if (sessionConnConfig) {
531
- const tokenLength = sessionConnConfig.authorizationToken?.length || 0;
532
- const formattedToken = (0, formatting_1.formatToken)(sessionConnConfig.authorizationToken);
534
+ const tokenLength = (sessionConnConfig.authorizationToken ||
535
+ sessionConnConfig.sessionCookies)?.length || 0;
536
+ const formattedToken = (0, formatting_1.formatToken)(sessionConnConfig.authorizationToken ||
537
+ sessionConnConfig.sessionCookies);
533
538
  this.logger?.debug(`Connection config from session for ${destination}: token(${tokenLength} chars${formattedToken ? `, ${formattedToken}` : ''}), serviceUrl(${sessionConnConfig.serviceUrl ? 'yes' : 'no'})`);
534
539
  return sessionConnConfig;
535
540
  }
@@ -0,0 +1,3 @@
1
+ export declare function getAvailablePort(): Promise<number>;
2
+ export declare function canListenOnLocalhost(): Promise<boolean>;
3
+ //# sourceMappingURL=netHelpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"netHelpers.d.ts","sourceRoot":"","sources":["../../../src/__tests__/helpers/netHelpers.ts"],"names":[],"mappings":"AAEA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAcxD;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAQ7D"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getAvailablePort = getAvailablePort;
37
+ exports.canListenOnLocalhost = canListenOnLocalhost;
38
+ const net = __importStar(require("node:net"));
39
+ async function getAvailablePort() {
40
+ return new Promise((resolve, reject) => {
41
+ const server = net.createServer();
42
+ server.once('error', reject);
43
+ server.listen(0, '127.0.0.1', () => {
44
+ const address = server.address();
45
+ if (typeof address === 'object' && address?.port) {
46
+ const port = address.port;
47
+ server.close(() => resolve(port));
48
+ }
49
+ else {
50
+ server.close(() => reject(new Error('Failed to acquire a port')));
51
+ }
52
+ });
53
+ });
54
+ }
55
+ async function canListenOnLocalhost() {
56
+ return new Promise((resolve) => {
57
+ const server = net.createServer();
58
+ server.once('error', () => resolve(false));
59
+ server.listen(0, '127.0.0.1', () => {
60
+ server.close(() => resolve(true));
61
+ });
62
+ });
63
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-abap-adt/auth-broker",
3
- "version": "0.3.6",
3
+ "version": "1.0.0",
4
4
  "description": "JWT authentication broker for MCP ABAP ADT - manages tokens based on destination headers",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -56,9 +56,9 @@
56
56
  "node": ">=18.0.0"
57
57
  },
58
58
  "dependencies": {
59
- "@mcp-abap-adt/auth-providers": "^0.2.10",
60
- "@mcp-abap-adt/auth-stores": "^0.3.0",
61
- "@mcp-abap-adt/interfaces": "^0.2.15",
59
+ "@mcp-abap-adt/auth-providers": "^1.0.0",
60
+ "@mcp-abap-adt/auth-stores": "^1.0.0",
61
+ "@mcp-abap-adt/interfaces": "^2.3.0",
62
62
  "axios": "^1.13.4",
63
63
  "tsx": "^4.21.0"
64
64
  },