@robinmordasiewicz/f5xc-api-mcp 2.0.21-2601081732 → 2.0.21-2601090213
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/dist/generator/tool-generator.d.ts +1 -2
- package/dist/generator/tool-generator.d.ts.map +1 -1
- package/dist/generator/tool-generator.js +1 -1
- package/dist/generator/tool-generator.js.map +1 -1
- package/dist/resources/handlers.d.ts +1 -2
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +1 -1
- package/dist/resources/handlers.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/configure-auth.d.ts +1 -1
- package/dist/tools/configure-auth.d.ts.map +1 -1
- package/dist/tools/configure-auth.js +1 -1
- package/dist/tools/configure-auth.js.map +1 -1
- package/dist/tools/discovery/execute.d.ts +1 -1
- package/dist/tools/discovery/execute.d.ts.map +1 -1
- package/dist/tools/discovery/execute.js +1 -2
- package/dist/tools/discovery/execute.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/manifest.json +1 -1
- package/package.json +2 -1
- package/dist/auth/credential-manager.d.ts +0 -177
- package/dist/auth/credential-manager.d.ts.map +0 -1
- package/dist/auth/credential-manager.js +0 -417
- package/dist/auth/credential-manager.js.map +0 -1
- package/dist/auth/http-client.d.ts +0 -86
- package/dist/auth/http-client.d.ts.map +0 -1
- package/dist/auth/http-client.js +0 -257
- package/dist/auth/http-client.js.map +0 -1
- package/dist/auth/index.d.ts +0 -12
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/auth/index.js +0 -10
- package/dist/auth/index.js.map +0 -1
- package/dist/config/paths.d.ts +0 -36
- package/dist/config/paths.d.ts.map +0 -1
- package/dist/config/paths.js +0 -68
- package/dist/config/paths.js.map +0 -1
- package/dist/profile/index.d.ts +0 -8
- package/dist/profile/index.d.ts.map +0 -1
- package/dist/profile/index.js +0 -7
- package/dist/profile/index.js.map +0 -1
- package/dist/profile/manager.d.ts +0 -74
- package/dist/profile/manager.d.ts.map +0 -1
- package/dist/profile/manager.js +0 -326
- package/dist/profile/manager.js.map +0 -1
- package/dist/profile/types.d.ts +0 -53
- package/dist/profile/types.d.ts.map +0 -1
- package/dist/profile/types.js +0 -7
- package/dist/profile/types.js.map +0 -1
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Credential Manager for F5 Distributed Cloud API
|
|
3
|
-
*
|
|
4
|
-
* Handles authentication configuration and URL normalization.
|
|
5
|
-
* Supports dual-mode operation:
|
|
6
|
-
* - Documentation mode: No credentials required
|
|
7
|
-
* - Execution mode: API token or P12/Certificate authentication
|
|
8
|
-
*
|
|
9
|
-
* Uses XDG-compliant profile storage at ~/.config/f5xc/
|
|
10
|
-
*/
|
|
11
|
-
/**
|
|
12
|
-
* Authentication modes supported by the server
|
|
13
|
-
*/
|
|
14
|
-
export declare enum AuthMode {
|
|
15
|
-
/** No authentication - documentation mode only */
|
|
16
|
-
NONE = "none",
|
|
17
|
-
/** API token authentication */
|
|
18
|
-
TOKEN = "token",
|
|
19
|
-
/** P12 certificate authentication (mTLS) */
|
|
20
|
-
CERTIFICATE = "certificate"
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Environment variable names for authentication
|
|
24
|
-
* These take priority over profile settings
|
|
25
|
-
*/
|
|
26
|
-
export declare const AUTH_ENV_VARS: {
|
|
27
|
-
readonly API_URL: "F5XC_API_URL";
|
|
28
|
-
readonly API_TOKEN: "F5XC_API_TOKEN";
|
|
29
|
-
readonly P12_BUNDLE: "F5XC_P12_BUNDLE";
|
|
30
|
-
readonly CERT: "F5XC_CERT";
|
|
31
|
-
readonly KEY: "F5XC_KEY";
|
|
32
|
-
readonly NAMESPACE: "F5XC_NAMESPACE";
|
|
33
|
-
readonly TLS_INSECURE: "F5XC_TLS_INSECURE";
|
|
34
|
-
readonly CA_BUNDLE: "F5XC_CA_BUNDLE";
|
|
35
|
-
};
|
|
36
|
-
/**
|
|
37
|
-
* Credential configuration for API access
|
|
38
|
-
*/
|
|
39
|
-
export interface Credentials {
|
|
40
|
-
/** Authentication mode */
|
|
41
|
-
mode: AuthMode;
|
|
42
|
-
/** Normalized API URL */
|
|
43
|
-
apiUrl: string | null;
|
|
44
|
-
/** API token (for token auth) */
|
|
45
|
-
token: string | null;
|
|
46
|
-
/** P12 certificate buffer (for cert auth) */
|
|
47
|
-
p12Certificate: Buffer | null;
|
|
48
|
-
/** Certificate content (for mTLS) */
|
|
49
|
-
cert: string | null;
|
|
50
|
-
/** Private key content (for mTLS) */
|
|
51
|
-
key: string | null;
|
|
52
|
-
/** Default namespace */
|
|
53
|
-
namespace: string | null;
|
|
54
|
-
/** Disable TLS certificate verification (staging/development only) */
|
|
55
|
-
tlsInsecure: boolean;
|
|
56
|
-
/** Custom CA bundle for TLS verification */
|
|
57
|
-
caBundle: Buffer | null;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Normalize F5XC tenant URL to standard API endpoint format
|
|
61
|
-
*
|
|
62
|
-
* Handles various input formats:
|
|
63
|
-
* - tenant.volterra.us -> tenant.console.ves.volterra.io/api (production)
|
|
64
|
-
* - tenant.staging.volterra.us -> tenant.staging.volterra.us/api (staging - keep as-is)
|
|
65
|
-
* - tenant.console.ves.volterra.io -> tenant.console.ves.volterra.io/api
|
|
66
|
-
* - Any of the above with trailing slashes or /api suffix
|
|
67
|
-
*
|
|
68
|
-
* @param input - Raw URL from user configuration
|
|
69
|
-
* @returns Normalized API URL
|
|
70
|
-
*/
|
|
71
|
-
export declare function normalizeApiUrl(input: string): string;
|
|
72
|
-
/**
|
|
73
|
-
* Extract tenant name from a normalized URL
|
|
74
|
-
*
|
|
75
|
-
* @param url - Normalized API URL
|
|
76
|
-
* @returns Tenant name or null if not parseable
|
|
77
|
-
*/
|
|
78
|
-
export declare function extractTenantFromUrl(url: string): string | null;
|
|
79
|
-
/**
|
|
80
|
-
* Credential Manager
|
|
81
|
-
*
|
|
82
|
-
* Manages authentication credentials for F5 Distributed Cloud API.
|
|
83
|
-
* Supports credential loading with priority:
|
|
84
|
-
* 1. Environment variables (highest priority - overrides all)
|
|
85
|
-
* 2. Active profile from ~/.config/f5xc/ (XDG Base Directory compliant)
|
|
86
|
-
* 3. No credentials (documentation mode - lowest priority)
|
|
87
|
-
*/
|
|
88
|
-
export declare class CredentialManager {
|
|
89
|
-
private credentials;
|
|
90
|
-
private activeProfileName;
|
|
91
|
-
private initialized;
|
|
92
|
-
constructor();
|
|
93
|
-
/**
|
|
94
|
-
* Initialize credentials asynchronously
|
|
95
|
-
* Must be called before using credentials
|
|
96
|
-
*/
|
|
97
|
-
initialize(): Promise<void>;
|
|
98
|
-
/**
|
|
99
|
-
* Load credentials from environment variables
|
|
100
|
-
*/
|
|
101
|
-
private loadFromEnvironment;
|
|
102
|
-
/**
|
|
103
|
-
* Load credentials from active profile
|
|
104
|
-
*/
|
|
105
|
-
private loadFromProfile;
|
|
106
|
-
/**
|
|
107
|
-
* Build credentials object from profile data
|
|
108
|
-
*/
|
|
109
|
-
private buildCredentials;
|
|
110
|
-
/**
|
|
111
|
-
* Load credentials with priority order:
|
|
112
|
-
* 1. Environment variables (highest)
|
|
113
|
-
* 2. Active profile from ~/.config/f5xc/
|
|
114
|
-
* 3. No credentials - documentation mode (lowest)
|
|
115
|
-
*/
|
|
116
|
-
private loadCredentials;
|
|
117
|
-
/**
|
|
118
|
-
* Get the active profile name (if any)
|
|
119
|
-
* Returns null if credentials are from environment variables or no profile is active
|
|
120
|
-
*/
|
|
121
|
-
getActiveProfile(): string | null;
|
|
122
|
-
/**
|
|
123
|
-
* Get the current authentication mode
|
|
124
|
-
*/
|
|
125
|
-
getAuthMode(): AuthMode;
|
|
126
|
-
/**
|
|
127
|
-
* Check if the server is in authenticated mode
|
|
128
|
-
*/
|
|
129
|
-
isAuthenticated(): boolean;
|
|
130
|
-
/**
|
|
131
|
-
* Get the normalized API URL
|
|
132
|
-
*/
|
|
133
|
-
getApiUrl(): string | null;
|
|
134
|
-
/**
|
|
135
|
-
* Get the tenant name
|
|
136
|
-
*/
|
|
137
|
-
getTenant(): string | null;
|
|
138
|
-
/**
|
|
139
|
-
* Get API token (for token authentication)
|
|
140
|
-
*/
|
|
141
|
-
getToken(): string | null;
|
|
142
|
-
/**
|
|
143
|
-
* Get P12 certificate buffer (for certificate authentication)
|
|
144
|
-
*/
|
|
145
|
-
getP12Certificate(): Buffer | null;
|
|
146
|
-
/**
|
|
147
|
-
* Get certificate content (for mTLS)
|
|
148
|
-
*/
|
|
149
|
-
getCert(): string | null;
|
|
150
|
-
/**
|
|
151
|
-
* Get private key content (for mTLS)
|
|
152
|
-
*/
|
|
153
|
-
getKey(): string | null;
|
|
154
|
-
/**
|
|
155
|
-
* Get default namespace
|
|
156
|
-
*/
|
|
157
|
-
getNamespace(): string | null;
|
|
158
|
-
/**
|
|
159
|
-
* Check if TLS certificate verification is disabled
|
|
160
|
-
* WARNING: Only use for staging/development environments
|
|
161
|
-
*/
|
|
162
|
-
getTlsInsecure(): boolean;
|
|
163
|
-
/**
|
|
164
|
-
* Get custom CA bundle for TLS verification
|
|
165
|
-
*/
|
|
166
|
-
getCaBundle(): Buffer | null;
|
|
167
|
-
/**
|
|
168
|
-
* Get full credentials object
|
|
169
|
-
*/
|
|
170
|
-
getCredentials(): Readonly<Credentials>;
|
|
171
|
-
/**
|
|
172
|
-
* Reload credentials from environment/profile
|
|
173
|
-
* Useful for testing or when credentials change
|
|
174
|
-
*/
|
|
175
|
-
reload(): Promise<void>;
|
|
176
|
-
}
|
|
177
|
-
//# sourceMappingURL=credential-manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-manager.d.ts","sourceRoot":"","sources":["../../src/auth/credential-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH;;GAEG;AACH,oBAAY,QAAQ;IAClB,kDAAkD;IAClD,IAAI,SAAS;IACb,+BAA+B;IAC/B,KAAK,UAAU;IACf,4CAA4C;IAC5C,WAAW,gBAAgB;CAC5B;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;;;CAUhB,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,0BAA0B;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,yBAAyB;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iCAAiC;IACjC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,6CAA6C;IAC7C,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,qCAAqC;IACrC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,qCAAqC;IACrC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,wBAAwB;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,sEAAsE;IACtE,WAAW,EAAE,OAAO,CAAC;IACrB,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAgBD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA8BrD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG/D;AAED;;;;;;;;GAQG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,WAAW,CAAS;;IAiB5B;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA8B3B;;OAEG;YACW,eAAe;IAmB7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiGxB;;;;;OAKG;YACW,eAAe;IA4C7B;;;OAGG;IACH,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIjC;;OAEG;IACH,WAAW,IAAI,QAAQ;IAIvB;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B;;OAEG;IACH,QAAQ,IAAI,MAAM,GAAG,IAAI;IAIzB;;OAEG;IACH,iBAAiB,IAAI,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACH,OAAO,IAAI,MAAM,GAAG,IAAI;IAIxB;;OAEG;IACH,MAAM,IAAI,MAAM,GAAG,IAAI;IAIvB;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B;;;OAGG;IACH,cAAc,IAAI,OAAO;IAIzB;;OAEG;IACH,WAAW,IAAI,MAAM,GAAG,IAAI;IAI5B;;OAEG;IACH,cAAc,IAAI,QAAQ,CAAC,WAAW,CAAC;IAIvC;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAK9B"}
|
|
@@ -1,417 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Credential Manager for F5 Distributed Cloud API
|
|
3
|
-
*
|
|
4
|
-
* Handles authentication configuration and URL normalization.
|
|
5
|
-
* Supports dual-mode operation:
|
|
6
|
-
* - Documentation mode: No credentials required
|
|
7
|
-
* - Execution mode: API token or P12/Certificate authentication
|
|
8
|
-
*
|
|
9
|
-
* Uses XDG-compliant profile storage at ~/.config/f5xc/
|
|
10
|
-
*/
|
|
11
|
-
import { readFileSync } from "fs";
|
|
12
|
-
import { logger } from "../utils/logging.js";
|
|
13
|
-
import { getProfileManager } from "../profile/index.js";
|
|
14
|
-
/**
|
|
15
|
-
* Authentication modes supported by the server
|
|
16
|
-
*/
|
|
17
|
-
export var AuthMode;
|
|
18
|
-
(function (AuthMode) {
|
|
19
|
-
/** No authentication - documentation mode only */
|
|
20
|
-
AuthMode["NONE"] = "none";
|
|
21
|
-
/** API token authentication */
|
|
22
|
-
AuthMode["TOKEN"] = "token";
|
|
23
|
-
/** P12 certificate authentication (mTLS) */
|
|
24
|
-
AuthMode["CERTIFICATE"] = "certificate";
|
|
25
|
-
})(AuthMode || (AuthMode = {}));
|
|
26
|
-
/**
|
|
27
|
-
* Environment variable names for authentication
|
|
28
|
-
* These take priority over profile settings
|
|
29
|
-
*/
|
|
30
|
-
export const AUTH_ENV_VARS = {
|
|
31
|
-
API_URL: "F5XC_API_URL",
|
|
32
|
-
API_TOKEN: "F5XC_API_TOKEN",
|
|
33
|
-
P12_BUNDLE: "F5XC_P12_BUNDLE",
|
|
34
|
-
CERT: "F5XC_CERT",
|
|
35
|
-
KEY: "F5XC_KEY",
|
|
36
|
-
NAMESPACE: "F5XC_NAMESPACE",
|
|
37
|
-
// TLS configuration
|
|
38
|
-
TLS_INSECURE: "F5XC_TLS_INSECURE",
|
|
39
|
-
CA_BUNDLE: "F5XC_CA_BUNDLE",
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* URL normalization patterns
|
|
43
|
-
*/
|
|
44
|
-
const URL_PATTERNS = {
|
|
45
|
-
// Match staging short-form URLs: tenant.staging.volterra.us (keep as-is)
|
|
46
|
-
STAGING_SHORT_FORM: /^https?:\/\/([^./]+)\.staging\.volterra\.us\/?/i,
|
|
47
|
-
// Match production short-form URLs: tenant.volterra.us (convert to console.ves)
|
|
48
|
-
PROD_SHORT_FORM: /^https?:\/\/([^./]+)\.volterra\.us\/?/i,
|
|
49
|
-
// Match console URLs: tenant.console.ves.volterra.io or tenant.staging.console.ves.volterra.io
|
|
50
|
-
CONSOLE_FORM: /^https?:\/\/([^./]+)\.(staging\.)?console\.ves\.volterra\.io\/?/i,
|
|
51
|
-
// Trailing slashes and /api suffix
|
|
52
|
-
TRAILING_CLEANUP: /\/+$|\/api\/?$/gi,
|
|
53
|
-
};
|
|
54
|
-
/**
|
|
55
|
-
* Normalize F5XC tenant URL to standard API endpoint format
|
|
56
|
-
*
|
|
57
|
-
* Handles various input formats:
|
|
58
|
-
* - tenant.volterra.us -> tenant.console.ves.volterra.io/api (production)
|
|
59
|
-
* - tenant.staging.volterra.us -> tenant.staging.volterra.us/api (staging - keep as-is)
|
|
60
|
-
* - tenant.console.ves.volterra.io -> tenant.console.ves.volterra.io/api
|
|
61
|
-
* - Any of the above with trailing slashes or /api suffix
|
|
62
|
-
*
|
|
63
|
-
* @param input - Raw URL from user configuration
|
|
64
|
-
* @returns Normalized API URL
|
|
65
|
-
*/
|
|
66
|
-
export function normalizeApiUrl(input) {
|
|
67
|
-
// Remove trailing slashes and existing /api suffix
|
|
68
|
-
let url = input.replace(URL_PATTERNS.TRAILING_CLEANUP, "");
|
|
69
|
-
// Handle staging short-form URLs - keep as-is (don't convert to console.ves)
|
|
70
|
-
const stagingMatch = url.match(URL_PATTERNS.STAGING_SHORT_FORM);
|
|
71
|
-
if (stagingMatch) {
|
|
72
|
-
const tenant = stagingMatch[1];
|
|
73
|
-
url = `https://${tenant}.staging.volterra.us`;
|
|
74
|
-
// Ensure /api suffix and return early
|
|
75
|
-
return `${url}/api`;
|
|
76
|
-
}
|
|
77
|
-
// Handle production short-form URLs (tenant.volterra.us -> tenant.console.ves.volterra.io)
|
|
78
|
-
const prodMatch = url.match(URL_PATTERNS.PROD_SHORT_FORM);
|
|
79
|
-
if (prodMatch) {
|
|
80
|
-
const tenant = prodMatch[1];
|
|
81
|
-
url = `https://${tenant}.console.ves.volterra.io`;
|
|
82
|
-
}
|
|
83
|
-
// Handle console URLs - ensure https
|
|
84
|
-
const consoleMatch = url.match(URL_PATTERNS.CONSOLE_FORM);
|
|
85
|
-
if (consoleMatch) {
|
|
86
|
-
const tenant = consoleMatch[1];
|
|
87
|
-
const staging = consoleMatch[2] ?? "";
|
|
88
|
-
url = `https://${tenant}.${staging}console.ves.volterra.io`;
|
|
89
|
-
}
|
|
90
|
-
// Ensure /api suffix
|
|
91
|
-
return `${url}/api`;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Extract tenant name from a normalized URL
|
|
95
|
-
*
|
|
96
|
-
* @param url - Normalized API URL
|
|
97
|
-
* @returns Tenant name or null if not parseable
|
|
98
|
-
*/
|
|
99
|
-
export function extractTenantFromUrl(url) {
|
|
100
|
-
const match = url.match(/https?:\/\/([^./]+)\./);
|
|
101
|
-
return match?.[1] ?? null;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Credential Manager
|
|
105
|
-
*
|
|
106
|
-
* Manages authentication credentials for F5 Distributed Cloud API.
|
|
107
|
-
* Supports credential loading with priority:
|
|
108
|
-
* 1. Environment variables (highest priority - overrides all)
|
|
109
|
-
* 2. Active profile from ~/.config/f5xc/ (XDG Base Directory compliant)
|
|
110
|
-
* 3. No credentials (documentation mode - lowest priority)
|
|
111
|
-
*/
|
|
112
|
-
export class CredentialManager {
|
|
113
|
-
credentials;
|
|
114
|
-
activeProfileName = null;
|
|
115
|
-
initialized = false;
|
|
116
|
-
constructor() {
|
|
117
|
-
// Initialize with empty credentials - will be loaded async
|
|
118
|
-
this.credentials = {
|
|
119
|
-
mode: AuthMode.NONE,
|
|
120
|
-
apiUrl: null,
|
|
121
|
-
token: null,
|
|
122
|
-
p12Certificate: null,
|
|
123
|
-
cert: null,
|
|
124
|
-
key: null,
|
|
125
|
-
namespace: null,
|
|
126
|
-
tlsInsecure: false,
|
|
127
|
-
caBundle: null,
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Initialize credentials asynchronously
|
|
132
|
-
* Must be called before using credentials
|
|
133
|
-
*/
|
|
134
|
-
async initialize() {
|
|
135
|
-
if (this.initialized)
|
|
136
|
-
return;
|
|
137
|
-
this.credentials = await this.loadCredentials();
|
|
138
|
-
this.initialized = true;
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Load credentials from environment variables
|
|
142
|
-
*/
|
|
143
|
-
loadFromEnvironment() {
|
|
144
|
-
const apiUrl = process.env[AUTH_ENV_VARS.API_URL];
|
|
145
|
-
const apiToken = process.env[AUTH_ENV_VARS.API_TOKEN];
|
|
146
|
-
const p12Bundle = process.env[AUTH_ENV_VARS.P12_BUNDLE];
|
|
147
|
-
const cert = process.env[AUTH_ENV_VARS.CERT];
|
|
148
|
-
const key = process.env[AUTH_ENV_VARS.KEY];
|
|
149
|
-
const defaultNamespace = process.env[AUTH_ENV_VARS.NAMESPACE];
|
|
150
|
-
const tlsInsecure = process.env[AUTH_ENV_VARS.TLS_INSECURE]?.toLowerCase() === "true";
|
|
151
|
-
const caBundle = process.env[AUTH_ENV_VARS.CA_BUNDLE];
|
|
152
|
-
const hasAuth = !!(apiToken || p12Bundle || (cert && key));
|
|
153
|
-
return {
|
|
154
|
-
name: "__env__",
|
|
155
|
-
apiUrl: apiUrl || "",
|
|
156
|
-
apiToken,
|
|
157
|
-
p12Bundle,
|
|
158
|
-
cert,
|
|
159
|
-
key,
|
|
160
|
-
defaultNamespace,
|
|
161
|
-
hasAuth,
|
|
162
|
-
tlsInsecure,
|
|
163
|
-
caBundle,
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Load credentials from active profile
|
|
168
|
-
*/
|
|
169
|
-
async loadFromProfile() {
|
|
170
|
-
try {
|
|
171
|
-
const profileManager = getProfileManager();
|
|
172
|
-
const profile = await profileManager.getActiveProfile();
|
|
173
|
-
if (profile) {
|
|
174
|
-
this.activeProfileName = profile.name;
|
|
175
|
-
return profile;
|
|
176
|
-
}
|
|
177
|
-
return null;
|
|
178
|
-
}
|
|
179
|
-
catch (error) {
|
|
180
|
-
logger.debug("Failed to load credentials from profile", {
|
|
181
|
-
error: error instanceof Error ? error.message : String(error),
|
|
182
|
-
});
|
|
183
|
-
return null;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Build credentials object from profile data
|
|
188
|
-
*/
|
|
189
|
-
buildCredentials(profile) {
|
|
190
|
-
const apiUrl = profile.apiUrl;
|
|
191
|
-
// Determine authentication mode
|
|
192
|
-
let mode = AuthMode.NONE;
|
|
193
|
-
let normalizedUrl = null;
|
|
194
|
-
let p12Certificate = null;
|
|
195
|
-
let cert = null;
|
|
196
|
-
let key = null;
|
|
197
|
-
// TLS configuration
|
|
198
|
-
const tlsInsecure = profile.tlsInsecure ?? false;
|
|
199
|
-
let caBundle = null;
|
|
200
|
-
// Load CA bundle if specified
|
|
201
|
-
if (profile.caBundle) {
|
|
202
|
-
try {
|
|
203
|
-
caBundle = readFileSync(profile.caBundle);
|
|
204
|
-
logger.info("Loaded CA bundle", { file: profile.caBundle });
|
|
205
|
-
}
|
|
206
|
-
catch (error) {
|
|
207
|
-
logger.warn("Failed to load CA bundle", {
|
|
208
|
-
file: profile.caBundle,
|
|
209
|
-
error: error instanceof Error ? error.message : String(error),
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
// Log TLS insecure mode warning
|
|
214
|
-
if (tlsInsecure) {
|
|
215
|
-
logger.warn("TLS certificate verification is DISABLED. This is insecure and should only be used for staging/development environments.");
|
|
216
|
-
}
|
|
217
|
-
if (apiUrl) {
|
|
218
|
-
normalizedUrl = normalizeApiUrl(apiUrl);
|
|
219
|
-
if (profile.p12Bundle) {
|
|
220
|
-
// P12 certificate authentication
|
|
221
|
-
mode = AuthMode.CERTIFICATE;
|
|
222
|
-
try {
|
|
223
|
-
p12Certificate = readFileSync(profile.p12Bundle);
|
|
224
|
-
logger.info("Loaded P12 certificate", { file: profile.p12Bundle });
|
|
225
|
-
}
|
|
226
|
-
catch (error) {
|
|
227
|
-
logger.error("Failed to load P12 certificate", {
|
|
228
|
-
file: profile.p12Bundle,
|
|
229
|
-
error: error instanceof Error ? error.message : String(error),
|
|
230
|
-
});
|
|
231
|
-
// Fall back to token auth if certificate load fails
|
|
232
|
-
if (profile.apiToken) {
|
|
233
|
-
mode = AuthMode.TOKEN;
|
|
234
|
-
logger.info("Falling back to token authentication");
|
|
235
|
-
}
|
|
236
|
-
else {
|
|
237
|
-
mode = AuthMode.NONE;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
else if (profile.cert && profile.key) {
|
|
242
|
-
// Certificate + key authentication
|
|
243
|
-
mode = AuthMode.CERTIFICATE;
|
|
244
|
-
try {
|
|
245
|
-
cert = readFileSync(profile.cert, "utf-8");
|
|
246
|
-
key = readFileSync(profile.key, "utf-8");
|
|
247
|
-
logger.info("Loaded certificate and key", {
|
|
248
|
-
cert: profile.cert,
|
|
249
|
-
key: profile.key,
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
catch (error) {
|
|
253
|
-
logger.error("Failed to load certificate/key", {
|
|
254
|
-
error: error instanceof Error ? error.message : String(error),
|
|
255
|
-
});
|
|
256
|
-
if (profile.apiToken) {
|
|
257
|
-
mode = AuthMode.TOKEN;
|
|
258
|
-
logger.info("Falling back to token authentication");
|
|
259
|
-
}
|
|
260
|
-
else {
|
|
261
|
-
mode = AuthMode.NONE;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
else if (profile.apiToken) {
|
|
266
|
-
mode = AuthMode.TOKEN;
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
return {
|
|
270
|
-
mode,
|
|
271
|
-
apiUrl: normalizedUrl,
|
|
272
|
-
token: profile.apiToken ?? null,
|
|
273
|
-
p12Certificate,
|
|
274
|
-
cert,
|
|
275
|
-
key,
|
|
276
|
-
namespace: profile.defaultNamespace ?? null,
|
|
277
|
-
tlsInsecure,
|
|
278
|
-
caBundle,
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Load credentials with priority order:
|
|
283
|
-
* 1. Environment variables (highest)
|
|
284
|
-
* 2. Active profile from ~/.config/f5xc/
|
|
285
|
-
* 3. No credentials - documentation mode (lowest)
|
|
286
|
-
*/
|
|
287
|
-
async loadCredentials() {
|
|
288
|
-
// Step 1: Check environment variables first (highest priority)
|
|
289
|
-
const envCreds = this.loadFromEnvironment();
|
|
290
|
-
if (envCreds.apiUrl && envCreds.hasAuth) {
|
|
291
|
-
const credentials = this.buildCredentials(envCreds);
|
|
292
|
-
const tenant = credentials.apiUrl ? extractTenantFromUrl(credentials.apiUrl) : null;
|
|
293
|
-
logger.info("Credentials loaded from environment variables", {
|
|
294
|
-
mode: credentials.mode,
|
|
295
|
-
tenant,
|
|
296
|
-
});
|
|
297
|
-
return credentials;
|
|
298
|
-
}
|
|
299
|
-
// Step 2: Try active profile from ~/.config/f5xc/
|
|
300
|
-
const profile = await this.loadFromProfile();
|
|
301
|
-
if (profile) {
|
|
302
|
-
const credentials = this.buildCredentials(profile);
|
|
303
|
-
if (credentials.mode !== AuthMode.NONE) {
|
|
304
|
-
const tenant = credentials.apiUrl ? extractTenantFromUrl(credentials.apiUrl) : null;
|
|
305
|
-
logger.info("Credentials loaded from profile", {
|
|
306
|
-
mode: credentials.mode,
|
|
307
|
-
tenant,
|
|
308
|
-
profile: this.activeProfileName,
|
|
309
|
-
});
|
|
310
|
-
return credentials;
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
// Step 3: No credentials - documentation mode (lowest priority)
|
|
314
|
-
logger.info("No credentials configured - running in documentation mode");
|
|
315
|
-
return {
|
|
316
|
-
mode: AuthMode.NONE,
|
|
317
|
-
apiUrl: null,
|
|
318
|
-
token: null,
|
|
319
|
-
p12Certificate: null,
|
|
320
|
-
cert: null,
|
|
321
|
-
key: null,
|
|
322
|
-
namespace: null,
|
|
323
|
-
tlsInsecure: false,
|
|
324
|
-
caBundle: null,
|
|
325
|
-
};
|
|
326
|
-
}
|
|
327
|
-
/**
|
|
328
|
-
* Get the active profile name (if any)
|
|
329
|
-
* Returns null if credentials are from environment variables or no profile is active
|
|
330
|
-
*/
|
|
331
|
-
getActiveProfile() {
|
|
332
|
-
return this.activeProfileName;
|
|
333
|
-
}
|
|
334
|
-
/**
|
|
335
|
-
* Get the current authentication mode
|
|
336
|
-
*/
|
|
337
|
-
getAuthMode() {
|
|
338
|
-
return this.credentials.mode;
|
|
339
|
-
}
|
|
340
|
-
/**
|
|
341
|
-
* Check if the server is in authenticated mode
|
|
342
|
-
*/
|
|
343
|
-
isAuthenticated() {
|
|
344
|
-
return this.credentials.mode !== AuthMode.NONE;
|
|
345
|
-
}
|
|
346
|
-
/**
|
|
347
|
-
* Get the normalized API URL
|
|
348
|
-
*/
|
|
349
|
-
getApiUrl() {
|
|
350
|
-
return this.credentials.apiUrl;
|
|
351
|
-
}
|
|
352
|
-
/**
|
|
353
|
-
* Get the tenant name
|
|
354
|
-
*/
|
|
355
|
-
getTenant() {
|
|
356
|
-
return this.credentials.apiUrl ? extractTenantFromUrl(this.credentials.apiUrl) : null;
|
|
357
|
-
}
|
|
358
|
-
/**
|
|
359
|
-
* Get API token (for token authentication)
|
|
360
|
-
*/
|
|
361
|
-
getToken() {
|
|
362
|
-
return this.credentials.token;
|
|
363
|
-
}
|
|
364
|
-
/**
|
|
365
|
-
* Get P12 certificate buffer (for certificate authentication)
|
|
366
|
-
*/
|
|
367
|
-
getP12Certificate() {
|
|
368
|
-
return this.credentials.p12Certificate;
|
|
369
|
-
}
|
|
370
|
-
/**
|
|
371
|
-
* Get certificate content (for mTLS)
|
|
372
|
-
*/
|
|
373
|
-
getCert() {
|
|
374
|
-
return this.credentials.cert;
|
|
375
|
-
}
|
|
376
|
-
/**
|
|
377
|
-
* Get private key content (for mTLS)
|
|
378
|
-
*/
|
|
379
|
-
getKey() {
|
|
380
|
-
return this.credentials.key;
|
|
381
|
-
}
|
|
382
|
-
/**
|
|
383
|
-
* Get default namespace
|
|
384
|
-
*/
|
|
385
|
-
getNamespace() {
|
|
386
|
-
return this.credentials.namespace;
|
|
387
|
-
}
|
|
388
|
-
/**
|
|
389
|
-
* Check if TLS certificate verification is disabled
|
|
390
|
-
* WARNING: Only use for staging/development environments
|
|
391
|
-
*/
|
|
392
|
-
getTlsInsecure() {
|
|
393
|
-
return this.credentials.tlsInsecure;
|
|
394
|
-
}
|
|
395
|
-
/**
|
|
396
|
-
* Get custom CA bundle for TLS verification
|
|
397
|
-
*/
|
|
398
|
-
getCaBundle() {
|
|
399
|
-
return this.credentials.caBundle;
|
|
400
|
-
}
|
|
401
|
-
/**
|
|
402
|
-
* Get full credentials object
|
|
403
|
-
*/
|
|
404
|
-
getCredentials() {
|
|
405
|
-
return Object.freeze({ ...this.credentials });
|
|
406
|
-
}
|
|
407
|
-
/**
|
|
408
|
-
* Reload credentials from environment/profile
|
|
409
|
-
* Useful for testing or when credentials change
|
|
410
|
-
*/
|
|
411
|
-
async reload() {
|
|
412
|
-
this.initialized = false;
|
|
413
|
-
this.activeProfileName = null;
|
|
414
|
-
await this.initialize();
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
//# sourceMappingURL=credential-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-manager.js","sourceRoot":"","sources":["../../src/auth/credential-manager.ts"],"names":[],"mappings":"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"}
|