arc-1 0.1.4 → 0.3.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/LICENSE +1 -0
- package/dist/adt/btp.js +1 -1
- package/dist/adt/client.d.ts +5 -1
- package/dist/adt/client.d.ts.map +1 -1
- package/dist/adt/client.js +30 -3
- package/dist/adt/client.js.map +1 -1
- package/dist/adt/config.d.ts +7 -1
- package/dist/adt/config.d.ts.map +1 -1
- package/dist/adt/config.js +1 -1
- package/dist/adt/config.js.map +1 -1
- package/dist/adt/errors.d.ts +8 -0
- package/dist/adt/errors.d.ts.map +1 -1
- package/dist/adt/errors.js +34 -1
- package/dist/adt/errors.js.map +1 -1
- package/dist/adt/features.d.ts +11 -2
- package/dist/adt/features.d.ts.map +1 -1
- package/dist/adt/features.js +37 -12
- package/dist/adt/features.js.map +1 -1
- package/dist/adt/http.d.ts +7 -0
- package/dist/adt/http.d.ts.map +1 -1
- package/dist/adt/http.js +14 -4
- package/dist/adt/http.js.map +1 -1
- package/dist/adt/oauth.d.ts +120 -0
- package/dist/adt/oauth.d.ts.map +1 -0
- package/dist/adt/oauth.js +321 -0
- package/dist/adt/oauth.js.map +1 -0
- package/dist/adt/types.d.ts +14 -0
- package/dist/adt/types.d.ts.map +1 -1
- package/dist/adt/xml-parser.d.ts +8 -1
- package/dist/adt/xml-parser.d.ts.map +1 -1
- package/dist/adt/xml-parser.js +54 -1
- package/dist/adt/xml-parser.js.map +1 -1
- package/dist/handlers/intent.d.ts +3 -0
- package/dist/handlers/intent.d.ts.map +1 -1
- package/dist/handlers/intent.js +154 -9
- package/dist/handlers/intent.js.map +1 -1
- package/dist/handlers/tools.d.ts +5 -0
- package/dist/handlers/tools.d.ts.map +1 -1
- package/dist/handlers/tools.js +187 -59
- package/dist/handlers/tools.js.map +1 -1
- package/dist/server/audit.d.ts +2 -0
- package/dist/server/audit.d.ts.map +1 -1
- package/dist/server/audit.js.map +1 -1
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js +9 -1
- package/dist/server/config.js.map +1 -1
- package/dist/server/http.js +1 -1
- package/dist/server/http.js.map +1 -1
- package/dist/server/server.d.ts +2 -1
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +34 -6
- package/dist/server/server.js.map +1 -1
- package/dist/server/types.d.ts +5 -0
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +3 -1
- package/dist/server/types.js.map +1 -1
- package/package.json +7 -2
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth 2.0 Authorization Code flow for BTP ABAP Environment.
|
|
3
|
+
*
|
|
4
|
+
* Implements the browser-based login flow used by Eclipse ADT and fr0ster/mcp-abap-adt:
|
|
5
|
+
* 1. Parse BTP service key JSON (from file or env var)
|
|
6
|
+
* 2. Start local callback server to receive authorization code
|
|
7
|
+
* 3. Open browser to XSUAA authorization endpoint
|
|
8
|
+
* 4. Exchange code for JWT access + refresh tokens
|
|
9
|
+
* 5. Cache tokens, auto-refresh before expiry
|
|
10
|
+
*
|
|
11
|
+
* The resulting Bearer token is used with `Authorization: Bearer <token>`
|
|
12
|
+
* on all ADT requests (replacing Basic Auth).
|
|
13
|
+
*
|
|
14
|
+
* Cross-platform: uses `open` (macOS), `xdg-open` (Linux), `start` (Windows).
|
|
15
|
+
*/
|
|
16
|
+
import { type Server as HttpServer } from 'node:http';
|
|
17
|
+
/** BTP ABAP service key structure (from BTP Cockpit) */
|
|
18
|
+
export interface BTPServiceKey {
|
|
19
|
+
/** UAA (XSUAA) credentials for OAuth */
|
|
20
|
+
uaa: {
|
|
21
|
+
/** XSUAA base URL (e.g., "https://subdomain.authentication.eu10.hana.ondemand.com") */
|
|
22
|
+
url: string;
|
|
23
|
+
/** OAuth client ID */
|
|
24
|
+
clientid: string;
|
|
25
|
+
/** OAuth client secret */
|
|
26
|
+
clientsecret: string;
|
|
27
|
+
};
|
|
28
|
+
/** ABAP system URL (e.g., "https://system-id.abap.eu10.hana.ondemand.com") */
|
|
29
|
+
url: string;
|
|
30
|
+
/** Optional: ABAP-specific section */
|
|
31
|
+
abap?: {
|
|
32
|
+
url?: string;
|
|
33
|
+
sapClient?: string;
|
|
34
|
+
};
|
|
35
|
+
/** Optional: Binding metadata */
|
|
36
|
+
binding?: {
|
|
37
|
+
env?: string;
|
|
38
|
+
type?: string;
|
|
39
|
+
};
|
|
40
|
+
/** Optional: Catalog info */
|
|
41
|
+
catalogs?: Record<string, {
|
|
42
|
+
path: string;
|
|
43
|
+
type: string;
|
|
44
|
+
}>;
|
|
45
|
+
}
|
|
46
|
+
/** OAuth token response from XSUAA */
|
|
47
|
+
export interface OAuthTokenResponse {
|
|
48
|
+
access_token: string;
|
|
49
|
+
token_type: string;
|
|
50
|
+
expires_in: number;
|
|
51
|
+
refresh_token?: string;
|
|
52
|
+
scope?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Parse a BTP ABAP service key from JSON string.
|
|
56
|
+
* Validates required fields.
|
|
57
|
+
*/
|
|
58
|
+
export declare function parseServiceKey(json: string): BTPServiceKey;
|
|
59
|
+
/**
|
|
60
|
+
* Load service key from file path.
|
|
61
|
+
*/
|
|
62
|
+
export declare function loadServiceKeyFile(filePath: string): BTPServiceKey;
|
|
63
|
+
/**
|
|
64
|
+
* Resolve service key from environment variables.
|
|
65
|
+
* Priority: SAP_BTP_SERVICE_KEY (inline JSON) > SAP_BTP_SERVICE_KEY_FILE (file path)
|
|
66
|
+
*/
|
|
67
|
+
export declare function resolveServiceKey(): BTPServiceKey | undefined;
|
|
68
|
+
/**
|
|
69
|
+
* Exchange an authorization code for OAuth tokens.
|
|
70
|
+
*/
|
|
71
|
+
export declare function exchangeCodeForToken(serviceKey: BTPServiceKey, code: string, redirectUri: string): Promise<OAuthTokenResponse>;
|
|
72
|
+
/**
|
|
73
|
+
* Refresh an OAuth access token using a refresh token.
|
|
74
|
+
*/
|
|
75
|
+
export declare function refreshAccessToken(serviceKey: BTPServiceKey, refreshToken: string): Promise<OAuthTokenResponse>;
|
|
76
|
+
/**
|
|
77
|
+
* Open a URL in the user's default browser.
|
|
78
|
+
* Cross-platform: macOS (open), Linux (xdg-open), Windows (start).
|
|
79
|
+
*/
|
|
80
|
+
export declare function openBrowser(url: string): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Start a local HTTP server to receive the OAuth callback.
|
|
83
|
+
* Returns a promise that resolves with the authorization code.
|
|
84
|
+
*
|
|
85
|
+
* @param port Port to listen on (0 = auto-assign)
|
|
86
|
+
* @param timeoutMs Maximum wait time for callback (default: 120s)
|
|
87
|
+
*/
|
|
88
|
+
export declare function startCallbackServer(port: number, timeoutMs?: number): {
|
|
89
|
+
promise: Promise<string>;
|
|
90
|
+
server: HttpServer;
|
|
91
|
+
getPort: () => number;
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* Perform the full browser-based Authorization Code flow.
|
|
95
|
+
*
|
|
96
|
+
* 1. Start local callback server
|
|
97
|
+
* 2. Open browser to XSUAA authorize endpoint
|
|
98
|
+
* 3. Wait for callback with authorization code
|
|
99
|
+
* 4. Exchange code for tokens
|
|
100
|
+
*
|
|
101
|
+
* @param serviceKey BTP service key
|
|
102
|
+
* @param callbackPort Port for callback server (0 = auto-assign)
|
|
103
|
+
* @returns OAuth token response
|
|
104
|
+
*/
|
|
105
|
+
export declare function performBrowserLogin(serviceKey: BTPServiceKey, callbackPort?: number): Promise<OAuthTokenResponse>;
|
|
106
|
+
/**
|
|
107
|
+
* Create a bearer token provider function for the ADT HTTP client.
|
|
108
|
+
*
|
|
109
|
+
* The returned function handles:
|
|
110
|
+
* - First call: triggers browser login
|
|
111
|
+
* - Subsequent calls: returns cached token
|
|
112
|
+
* - Token refresh: uses refresh token when access token expires
|
|
113
|
+
* - Re-login: triggers browser login if refresh token also expires
|
|
114
|
+
*
|
|
115
|
+
* @param serviceKey BTP service key
|
|
116
|
+
* @param callbackPort Port for OAuth callback (0 = auto-assign)
|
|
117
|
+
* @returns Async function that returns a valid Bearer token
|
|
118
|
+
*/
|
|
119
|
+
export declare function createBearerTokenProvider(serviceKey: BTPServiceKey, callbackPort?: number): () => Promise<string>;
|
|
120
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../ts-src/adt/oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAgB,KAAK,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAKpE,wDAAwD;AACxD,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,GAAG,EAAE;QACH,uFAAuF;QACvF,GAAG,EAAE,MAAM,CAAC;QACZ,sBAAsB;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,0BAA0B;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,8EAA8E;IAC9E,GAAG,EAAE,MAAM,CAAC;IACZ,sCAAsC;IACtC,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,iCAAiC;IACjC,OAAO,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3D;AAED,sCAAsC;AACtC,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAYD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CA8B3D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAUlE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,SAAS,CAY7D;AAID;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,aAAa,EACzB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAyB7B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuBrH;AAID;;;GAGG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B5D;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,SAAS,SAAS,GACjB;IAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,MAAM,CAAA;CAAE,CAiEzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,aAAa,EAAE,YAAY,SAAI,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6ClH;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,aAAa,EAAE,YAAY,SAAI,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAsC5G"}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth 2.0 Authorization Code flow for BTP ABAP Environment.
|
|
3
|
+
*
|
|
4
|
+
* Implements the browser-based login flow used by Eclipse ADT and fr0ster/mcp-abap-adt:
|
|
5
|
+
* 1. Parse BTP service key JSON (from file or env var)
|
|
6
|
+
* 2. Start local callback server to receive authorization code
|
|
7
|
+
* 3. Open browser to XSUAA authorization endpoint
|
|
8
|
+
* 4. Exchange code for JWT access + refresh tokens
|
|
9
|
+
* 5. Cache tokens, auto-refresh before expiry
|
|
10
|
+
*
|
|
11
|
+
* The resulting Bearer token is used with `Authorization: Bearer <token>`
|
|
12
|
+
* on all ADT requests (replacing Basic Auth).
|
|
13
|
+
*
|
|
14
|
+
* Cross-platform: uses `open` (macOS), `xdg-open` (Linux), `start` (Windows).
|
|
15
|
+
*/
|
|
16
|
+
import { readFileSync } from 'node:fs';
|
|
17
|
+
import { createServer } from 'node:http';
|
|
18
|
+
import { logger } from '../server/logger.js';
|
|
19
|
+
// ─── Service Key Parsing ───────────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Parse a BTP ABAP service key from JSON string.
|
|
22
|
+
* Validates required fields.
|
|
23
|
+
*/
|
|
24
|
+
export function parseServiceKey(json) {
|
|
25
|
+
let parsed;
|
|
26
|
+
try {
|
|
27
|
+
parsed = JSON.parse(json);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
throw new Error('Invalid service key JSON: failed to parse');
|
|
31
|
+
}
|
|
32
|
+
const key = parsed;
|
|
33
|
+
if (!key.url || typeof key.url !== 'string') {
|
|
34
|
+
throw new Error('Invalid service key: missing "url" field');
|
|
35
|
+
}
|
|
36
|
+
const uaa = key.uaa;
|
|
37
|
+
if (!uaa || typeof uaa !== 'object') {
|
|
38
|
+
throw new Error('Invalid service key: missing "uaa" section');
|
|
39
|
+
}
|
|
40
|
+
if (!uaa.url || typeof uaa.url !== 'string') {
|
|
41
|
+
throw new Error('Invalid service key: missing "uaa.url" field');
|
|
42
|
+
}
|
|
43
|
+
if (!uaa.clientid || typeof uaa.clientid !== 'string') {
|
|
44
|
+
throw new Error('Invalid service key: missing "uaa.clientid" field');
|
|
45
|
+
}
|
|
46
|
+
if (!uaa.clientsecret || typeof uaa.clientsecret !== 'string') {
|
|
47
|
+
throw new Error('Invalid service key: missing "uaa.clientsecret" field');
|
|
48
|
+
}
|
|
49
|
+
return parsed;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Load service key from file path.
|
|
53
|
+
*/
|
|
54
|
+
export function loadServiceKeyFile(filePath) {
|
|
55
|
+
try {
|
|
56
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
57
|
+
return parseServiceKey(content);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
if (err instanceof Error && err.message.startsWith('Invalid service key'))
|
|
61
|
+
throw err;
|
|
62
|
+
throw new Error(`Failed to read service key file '${filePath}': ${err instanceof Error ? err.message : String(err)}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Resolve service key from environment variables.
|
|
67
|
+
* Priority: SAP_BTP_SERVICE_KEY (inline JSON) > SAP_BTP_SERVICE_KEY_FILE (file path)
|
|
68
|
+
*/
|
|
69
|
+
export function resolveServiceKey() {
|
|
70
|
+
const inline = process.env.SAP_BTP_SERVICE_KEY;
|
|
71
|
+
if (inline) {
|
|
72
|
+
return parseServiceKey(inline);
|
|
73
|
+
}
|
|
74
|
+
const filePath = process.env.SAP_BTP_SERVICE_KEY_FILE;
|
|
75
|
+
if (filePath) {
|
|
76
|
+
return loadServiceKeyFile(filePath);
|
|
77
|
+
}
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
// ─── OAuth Token Exchange ──────────────────────────────────────────
|
|
81
|
+
/**
|
|
82
|
+
* Exchange an authorization code for OAuth tokens.
|
|
83
|
+
*/
|
|
84
|
+
export async function exchangeCodeForToken(serviceKey, code, redirectUri) {
|
|
85
|
+
const tokenUrl = `${serviceKey.uaa.url}/oauth/token`;
|
|
86
|
+
const params = new URLSearchParams({
|
|
87
|
+
grant_type: 'authorization_code',
|
|
88
|
+
code,
|
|
89
|
+
redirect_uri: redirectUri,
|
|
90
|
+
client_id: serviceKey.uaa.clientid,
|
|
91
|
+
});
|
|
92
|
+
const response = await fetch(tokenUrl, {
|
|
93
|
+
method: 'POST',
|
|
94
|
+
headers: {
|
|
95
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
96
|
+
Authorization: `Basic ${Buffer.from(`${serviceKey.uaa.clientid}:${serviceKey.uaa.clientsecret}`).toString('base64')}`,
|
|
97
|
+
},
|
|
98
|
+
body: params.toString(),
|
|
99
|
+
});
|
|
100
|
+
if (!response.ok) {
|
|
101
|
+
const body = await response.text();
|
|
102
|
+
throw new Error(`OAuth token exchange failed (${response.status}): ${body.slice(0, 500)}`);
|
|
103
|
+
}
|
|
104
|
+
return (await response.json());
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Refresh an OAuth access token using a refresh token.
|
|
108
|
+
*/
|
|
109
|
+
export async function refreshAccessToken(serviceKey, refreshToken) {
|
|
110
|
+
const tokenUrl = `${serviceKey.uaa.url}/oauth/token`;
|
|
111
|
+
const params = new URLSearchParams({
|
|
112
|
+
grant_type: 'refresh_token',
|
|
113
|
+
refresh_token: refreshToken,
|
|
114
|
+
});
|
|
115
|
+
const response = await fetch(tokenUrl, {
|
|
116
|
+
method: 'POST',
|
|
117
|
+
headers: {
|
|
118
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
119
|
+
Authorization: `Basic ${Buffer.from(`${serviceKey.uaa.clientid}:${serviceKey.uaa.clientsecret}`).toString('base64')}`,
|
|
120
|
+
},
|
|
121
|
+
body: params.toString(),
|
|
122
|
+
});
|
|
123
|
+
if (!response.ok) {
|
|
124
|
+
const body = await response.text();
|
|
125
|
+
throw new Error(`OAuth token refresh failed (${response.status}): ${body.slice(0, 500)}`);
|
|
126
|
+
}
|
|
127
|
+
return (await response.json());
|
|
128
|
+
}
|
|
129
|
+
// ─── Browser Authorization Code Flow ───────────────────────────────
|
|
130
|
+
/**
|
|
131
|
+
* Open a URL in the user's default browser.
|
|
132
|
+
* Cross-platform: macOS (open), Linux (xdg-open), Windows (start).
|
|
133
|
+
*/
|
|
134
|
+
export async function openBrowser(url) {
|
|
135
|
+
const { exec } = await import('node:child_process');
|
|
136
|
+
const { platform } = await import('node:os');
|
|
137
|
+
const os = platform();
|
|
138
|
+
let cmd;
|
|
139
|
+
switch (os) {
|
|
140
|
+
case 'darwin':
|
|
141
|
+
cmd = `open "${url}"`;
|
|
142
|
+
break;
|
|
143
|
+
case 'win32':
|
|
144
|
+
// Windows: 'start' needs empty title and URL in quotes
|
|
145
|
+
cmd = `start "" "${url}"`;
|
|
146
|
+
break;
|
|
147
|
+
default:
|
|
148
|
+
// Linux and other Unix-like systems
|
|
149
|
+
cmd = `xdg-open "${url}"`;
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
return new Promise((resolve, reject) => {
|
|
153
|
+
exec(cmd, (err) => {
|
|
154
|
+
if (err) {
|
|
155
|
+
reject(new Error(`Failed to open browser (${os}): ${err.message}`));
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
resolve();
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Start a local HTTP server to receive the OAuth callback.
|
|
165
|
+
* Returns a promise that resolves with the authorization code.
|
|
166
|
+
*
|
|
167
|
+
* @param port Port to listen on (0 = auto-assign)
|
|
168
|
+
* @param timeoutMs Maximum wait time for callback (default: 120s)
|
|
169
|
+
*/
|
|
170
|
+
export function startCallbackServer(port, timeoutMs = 120000) {
|
|
171
|
+
let resolvePromise;
|
|
172
|
+
let rejectPromise;
|
|
173
|
+
const promise = new Promise((resolve, reject) => {
|
|
174
|
+
resolvePromise = resolve;
|
|
175
|
+
rejectPromise = reject;
|
|
176
|
+
});
|
|
177
|
+
const server = createServer((req, res) => {
|
|
178
|
+
if (!req.url?.startsWith('/callback')) {
|
|
179
|
+
res.writeHead(404);
|
|
180
|
+
res.end('Not found');
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const url = new URL(req.url, `http://localhost:${port}`);
|
|
184
|
+
const code = url.searchParams.get('code');
|
|
185
|
+
const error = url.searchParams.get('error');
|
|
186
|
+
if (error) {
|
|
187
|
+
const errorDescription = url.searchParams.get('error_description') ?? error;
|
|
188
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
189
|
+
res.end(`<html><body><h1>Authentication Failed</h1><p>${errorDescription}</p><p>You can close this window.</p></body></html>`);
|
|
190
|
+
rejectPromise(new Error(`OAuth authorization failed: ${errorDescription}`));
|
|
191
|
+
server.close();
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
if (!code) {
|
|
195
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
196
|
+
res.end('<html><body><h1>Error</h1><p>No authorization code received.</p></body></html>');
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
200
|
+
res.end('<html><body><h1>Authentication Successful</h1><p>You can close this window and return to your MCP client.</p></body></html>');
|
|
201
|
+
resolvePromise(code);
|
|
202
|
+
server.close();
|
|
203
|
+
});
|
|
204
|
+
server.listen(port);
|
|
205
|
+
// Timeout handling
|
|
206
|
+
const timer = setTimeout(() => {
|
|
207
|
+
rejectPromise(new Error(`OAuth callback timed out after ${timeoutMs / 1000}s — no browser login received`));
|
|
208
|
+
server.close();
|
|
209
|
+
}, timeoutMs);
|
|
210
|
+
// Clean up timer when server closes
|
|
211
|
+
server.on('close', () => clearTimeout(timer));
|
|
212
|
+
const getPort = () => {
|
|
213
|
+
const addr = server.address();
|
|
214
|
+
if (addr && typeof addr === 'object') {
|
|
215
|
+
return addr.port;
|
|
216
|
+
}
|
|
217
|
+
return port;
|
|
218
|
+
};
|
|
219
|
+
return { promise, server, getPort };
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Perform the full browser-based Authorization Code flow.
|
|
223
|
+
*
|
|
224
|
+
* 1. Start local callback server
|
|
225
|
+
* 2. Open browser to XSUAA authorize endpoint
|
|
226
|
+
* 3. Wait for callback with authorization code
|
|
227
|
+
* 4. Exchange code for tokens
|
|
228
|
+
*
|
|
229
|
+
* @param serviceKey BTP service key
|
|
230
|
+
* @param callbackPort Port for callback server (0 = auto-assign)
|
|
231
|
+
* @returns OAuth token response
|
|
232
|
+
*/
|
|
233
|
+
export async function performBrowserLogin(serviceKey, callbackPort = 0) {
|
|
234
|
+
const { promise, server, getPort } = startCallbackServer(callbackPort);
|
|
235
|
+
// Wait for server to be listening to get the actual port
|
|
236
|
+
await new Promise((resolve) => {
|
|
237
|
+
if (server.listening) {
|
|
238
|
+
resolve();
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
server.on('listening', resolve);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
const actualPort = getPort();
|
|
245
|
+
const redirectUri = `http://localhost:${actualPort}/callback`;
|
|
246
|
+
const authorizeUrl = `${serviceKey.uaa.url}/oauth/authorize` +
|
|
247
|
+
`?response_type=code` +
|
|
248
|
+
`&client_id=${encodeURIComponent(serviceKey.uaa.clientid)}` +
|
|
249
|
+
`&redirect_uri=${encodeURIComponent(redirectUri)}`;
|
|
250
|
+
logger.info('Opening browser for SAP BTP authentication...', { port: actualPort });
|
|
251
|
+
logger.info(`If browser doesn't open, visit: ${authorizeUrl}`);
|
|
252
|
+
try {
|
|
253
|
+
await openBrowser(authorizeUrl);
|
|
254
|
+
}
|
|
255
|
+
catch (_err) {
|
|
256
|
+
// Browser failed to open — log the URL so user can copy-paste
|
|
257
|
+
logger.warn('Could not open browser automatically. Please open this URL manually:', {
|
|
258
|
+
url: authorizeUrl,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
// Wait for callback
|
|
262
|
+
const code = await promise;
|
|
263
|
+
// Exchange code for tokens
|
|
264
|
+
const tokens = await exchangeCodeForToken(serviceKey, code, redirectUri);
|
|
265
|
+
logger.info('BTP ABAP authentication successful', {
|
|
266
|
+
expiresIn: tokens.expires_in,
|
|
267
|
+
hasRefreshToken: !!tokens.refresh_token,
|
|
268
|
+
});
|
|
269
|
+
return tokens;
|
|
270
|
+
}
|
|
271
|
+
// ─── Token Provider (BearerFetcher Pattern) ────────────────────────
|
|
272
|
+
/**
|
|
273
|
+
* Create a bearer token provider function for the ADT HTTP client.
|
|
274
|
+
*
|
|
275
|
+
* The returned function handles:
|
|
276
|
+
* - First call: triggers browser login
|
|
277
|
+
* - Subsequent calls: returns cached token
|
|
278
|
+
* - Token refresh: uses refresh token when access token expires
|
|
279
|
+
* - Re-login: triggers browser login if refresh token also expires
|
|
280
|
+
*
|
|
281
|
+
* @param serviceKey BTP service key
|
|
282
|
+
* @param callbackPort Port for OAuth callback (0 = auto-assign)
|
|
283
|
+
* @returns Async function that returns a valid Bearer token
|
|
284
|
+
*/
|
|
285
|
+
export function createBearerTokenProvider(serviceKey, callbackPort = 0) {
|
|
286
|
+
let tokenCache;
|
|
287
|
+
return async () => {
|
|
288
|
+
// If we have a cached token that's still valid (with 60s buffer), return it
|
|
289
|
+
if (tokenCache && Date.now() < tokenCache.expiresAt - 60000) {
|
|
290
|
+
return tokenCache.accessToken;
|
|
291
|
+
}
|
|
292
|
+
// Try refresh if we have a refresh token
|
|
293
|
+
if (tokenCache?.refreshToken) {
|
|
294
|
+
try {
|
|
295
|
+
const refreshed = await refreshAccessToken(serviceKey, tokenCache.refreshToken);
|
|
296
|
+
tokenCache = {
|
|
297
|
+
accessToken: refreshed.access_token,
|
|
298
|
+
refreshToken: refreshed.refresh_token ?? tokenCache.refreshToken,
|
|
299
|
+
expiresAt: Date.now() + refreshed.expires_in * 1000,
|
|
300
|
+
};
|
|
301
|
+
logger.debug('OAuth token refreshed successfully');
|
|
302
|
+
return tokenCache.accessToken;
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
logger.warn('OAuth token refresh failed, will re-authenticate via browser', {
|
|
306
|
+
error: err instanceof Error ? err.message : String(err),
|
|
307
|
+
});
|
|
308
|
+
// Fall through to browser login
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// No token or refresh failed — do browser login
|
|
312
|
+
const tokens = await performBrowserLogin(serviceKey, callbackPort);
|
|
313
|
+
tokenCache = {
|
|
314
|
+
accessToken: tokens.access_token,
|
|
315
|
+
refreshToken: tokens.refresh_token,
|
|
316
|
+
expiresAt: Date.now() + tokens.expires_in * 1000,
|
|
317
|
+
};
|
|
318
|
+
return tokenCache.accessToken;
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../ts-src/adt/oauth.ts"],"names":[],"mappings":"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"}
|
package/dist/adt/types.d.ts
CHANGED
|
@@ -28,6 +28,8 @@ export interface FeatureStatus {
|
|
|
28
28
|
message?: string;
|
|
29
29
|
probedAt?: string;
|
|
30
30
|
}
|
|
31
|
+
/** SAP system type: BTP ABAP Environment or on-premise */
|
|
32
|
+
export type SystemType = 'btp' | 'onprem';
|
|
31
33
|
/** Resolved features after probing */
|
|
32
34
|
export interface ResolvedFeatures {
|
|
33
35
|
hana: FeatureStatus;
|
|
@@ -38,6 +40,8 @@ export interface ResolvedFeatures {
|
|
|
38
40
|
transport: FeatureStatus;
|
|
39
41
|
/** Detected SAP_BASIS release (e.g. "750", "757"). Populated during probe. */
|
|
40
42
|
abapRelease?: string;
|
|
43
|
+
/** Detected system type: 'btp' (SAP_CLOUD component present) or 'onprem'. */
|
|
44
|
+
systemType?: SystemType;
|
|
41
45
|
}
|
|
42
46
|
/** System info from /sap/bc/adt/core/discovery */
|
|
43
47
|
export interface SystemInfo {
|
|
@@ -80,6 +84,16 @@ export interface TransportTask {
|
|
|
80
84
|
owner: string;
|
|
81
85
|
status: string;
|
|
82
86
|
}
|
|
87
|
+
/** Source code search result */
|
|
88
|
+
export interface SourceSearchResult {
|
|
89
|
+
objectType: string;
|
|
90
|
+
objectName: string;
|
|
91
|
+
uri: string;
|
|
92
|
+
matches: Array<{
|
|
93
|
+
line: number;
|
|
94
|
+
snippet: string;
|
|
95
|
+
}>;
|
|
96
|
+
}
|
|
83
97
|
/** Table structure */
|
|
84
98
|
export interface TableField {
|
|
85
99
|
name: string;
|
package/dist/adt/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../ts-src/adt/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,4BAA4B;AAC5B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,2BAA2B;AAC3B,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,sCAAsC;AACtC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,GAAG,EAAE,aAAa,CAAC;IACnB,IAAI,EAAE,aAAa,CAAC;IACpB,GAAG,EAAE,aAAa,CAAC;IACnB,SAAS,EAAE,aAAa,CAAC;IACzB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../ts-src/adt/types.ts"],"names":[],"mappings":"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"}
|
package/dist/adt/xml-parser.d.ts
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* This decouples the XML format from our internal types, making it
|
|
14
14
|
* easier to handle SAP's inconsistent XML across different endpoints.
|
|
15
15
|
*/
|
|
16
|
-
import type { AdtSearchResult } from './types.js';
|
|
16
|
+
import type { AdtSearchResult, SourceSearchResult } from './types.js';
|
|
17
17
|
/** Parse raw XML string to a JS object */
|
|
18
18
|
export declare function parseXml(xml: string): Record<string, unknown>;
|
|
19
19
|
/**
|
|
@@ -104,6 +104,13 @@ export declare function parseSystemInfo(xml: string, username: string): {
|
|
|
104
104
|
href: string;
|
|
105
105
|
}>;
|
|
106
106
|
};
|
|
107
|
+
/**
|
|
108
|
+
* Parse ADT source/text search results.
|
|
109
|
+
*
|
|
110
|
+
* The textSearch endpoint returns results as either XML with objectReference elements
|
|
111
|
+
* containing match details, or an Atom-like feed. We handle both formats.
|
|
112
|
+
*/
|
|
113
|
+
export declare function parseSourceSearchResults(xml: string): SourceSearchResult[];
|
|
107
114
|
/** Recursively find an array by key name, anywhere in the object tree */
|
|
108
115
|
export declare function findDeepNodes(obj: unknown, key: string): Array<Record<string, unknown>>;
|
|
109
116
|
//# sourceMappingURL=xml-parser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml-parser.d.ts","sourceRoot":"","sources":["../../ts-src/adt/xml-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"xml-parser.d.ts","sourceRoot":"","sources":["../../ts-src/adt/xml-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA8BtE,0CAA0C;AAC1C,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE7D;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAUjE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,GACV,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAczE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;CAAE,CA6CrG;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBnH;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAQrF;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CA0BvE;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAkD1E;AAcD,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAoBvF"}
|
package/dist/adt/xml-parser.js
CHANGED
|
@@ -201,7 +201,7 @@ export function parseSystemInfo(xml, username) {
|
|
|
201
201
|
// Atom service document: service > workspace > collection
|
|
202
202
|
const collections = [];
|
|
203
203
|
// After namespace stripping: app:service → service, app:workspace → workspace, app:collection → collection
|
|
204
|
-
const service = (parsed.service ?? parsed
|
|
204
|
+
const service = (parsed.service ?? parsed.service ?? {});
|
|
205
205
|
const workspaces = Array.isArray(service.workspace)
|
|
206
206
|
? service.workspace
|
|
207
207
|
: service.workspace
|
|
@@ -219,6 +219,59 @@ export function parseSystemInfo(xml, username) {
|
|
|
219
219
|
}
|
|
220
220
|
return { user: username ?? '', collections };
|
|
221
221
|
}
|
|
222
|
+
/**
|
|
223
|
+
* Parse ADT source/text search results.
|
|
224
|
+
*
|
|
225
|
+
* The textSearch endpoint returns results as either XML with objectReference elements
|
|
226
|
+
* containing match details, or an Atom-like feed. We handle both formats.
|
|
227
|
+
*/
|
|
228
|
+
export function parseSourceSearchResults(xml) {
|
|
229
|
+
const parsed = parseXml(xml);
|
|
230
|
+
const results = [];
|
|
231
|
+
// Try objectReferences format (similar to quickSearch)
|
|
232
|
+
const refs = getNestedArray(parsed, 'objectReferences', 'objectReference');
|
|
233
|
+
if (refs.length > 0) {
|
|
234
|
+
for (const ref of refs) {
|
|
235
|
+
results.push({
|
|
236
|
+
objectType: String(ref['@_type'] ?? ''),
|
|
237
|
+
objectName: String(ref['@_name'] ?? ''),
|
|
238
|
+
uri: String(ref['@_uri'] ?? ''),
|
|
239
|
+
matches: [],
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
return results;
|
|
243
|
+
}
|
|
244
|
+
// Try Atom feed format
|
|
245
|
+
const entries = getNestedArray(parsed, 'feed', 'entry');
|
|
246
|
+
for (const entry of entries) {
|
|
247
|
+
const uri = String(entry.id ?? entry['@_href'] ?? '');
|
|
248
|
+
const title = String(entry.title ?? '');
|
|
249
|
+
results.push({
|
|
250
|
+
objectType: '',
|
|
251
|
+
objectName: title || uri.split('/').pop() || '',
|
|
252
|
+
uri,
|
|
253
|
+
matches: [],
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
// Fallback: try to find any matching nodes
|
|
257
|
+
if (results.length === 0) {
|
|
258
|
+
const nodes = findDeepNodes(parsed, 'match');
|
|
259
|
+
for (const node of nodes) {
|
|
260
|
+
results.push({
|
|
261
|
+
objectType: String(node['@_type'] ?? ''),
|
|
262
|
+
objectName: String(node['@_name'] ?? node['@_objectName'] ?? ''),
|
|
263
|
+
uri: String(node['@_uri'] ?? ''),
|
|
264
|
+
matches: [
|
|
265
|
+
{
|
|
266
|
+
line: Number(node['@_line'] ?? 0),
|
|
267
|
+
snippet: String(node['@_snippet'] ?? node['#text'] ?? ''),
|
|
268
|
+
},
|
|
269
|
+
],
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return results;
|
|
274
|
+
}
|
|
222
275
|
// ─── Helpers ────────────────────────────────────────────────────────
|
|
223
276
|
/** Safely get a nested array from parsed XML */
|
|
224
277
|
function getNestedArray(obj, parent, child) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml-parser.js","sourceRoot":"","sources":["../../ts-src/adt/xml-parser.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"xml-parser.js","sourceRoot":"","sources":["../../ts-src/adt/xml-parser.ts"],"names":[],"mappings":"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"}
|