@enterprisestandard/esv 0.0.5-beta.20260115.1 → 0.0.5-beta.20260115.2

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.
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Vault endpoint handlers for the ESV mock server
3
+ *
4
+ * Provides configuration secrets for SSO, IAM, and Workload services.
5
+ */
6
+ /**
7
+ * Default ESV configuration returned by the vault
8
+ */
9
+ function getEsvConfig(baseUrl = 'http://localhost:3555') {
10
+ return {
11
+ sso: {
12
+ authority: `${baseUrl}/sso`,
13
+ token_url: `${baseUrl}/sso/token`,
14
+ authorization_url: `${baseUrl}/sso/authorize`,
15
+ jwks_uri: `${baseUrl}/sso/certs`,
16
+ client_id: 'local-test-client',
17
+ client_secret: 'local-test-secret',
18
+ redirect_uri: 'http://localhost:3000/api/auth/callback',
19
+ scope: 'openid profile email',
20
+ revocation_endpoint: `${baseUrl}/sso/revoke`,
21
+ end_session_endpoint: `${baseUrl}/sso/logout`,
22
+ },
23
+ iam: {
24
+ url: `${baseUrl}/iam`,
25
+ // Note: The ESV server handles SCIM at /iam/Users and /iam/Groups
26
+ // The url should point to the base IAM endpoint, not /scim/v2
27
+ },
28
+ workload: {
29
+ token_url: `${baseUrl}/workload/token`,
30
+ jwks_uri: `${baseUrl}/workload/certs`,
31
+ client_id: 'local-workload-client',
32
+ client_secret: 'local-workload-secret',
33
+ issuer: `${baseUrl}/workload`,
34
+ audience: `${baseUrl}/workload`,
35
+ },
36
+ };
37
+ }
38
+ /**
39
+ * Handle vault requests
40
+ */
41
+ export function handleVaultRequest(req, res, pathname) {
42
+ // Remove /vault prefix
43
+ const vaultPath = pathname.replace(/^\/vault/, '');
44
+ // Handle GET /vault/v1/secret/data/esv/config
45
+ if (req.method === 'GET' && vaultPath === '/v1/secret/data/esv/config') {
46
+ // Verify vault token
47
+ const token = req.headers['x-vault-token'];
48
+ if (token !== 'local-esv-token') {
49
+ res.writeHead(403, { 'Content-Type': 'application/json' });
50
+ res.end(JSON.stringify({ errors: ['permission denied'] }));
51
+ return;
52
+ }
53
+ const config = getEsvConfig();
54
+ res.writeHead(200, { 'Content-Type': 'application/json' });
55
+ res.end(JSON.stringify({
56
+ request_id: 'local-esv-request',
57
+ lease_id: '',
58
+ renewable: false,
59
+ lease_duration: 0,
60
+ data: {
61
+ data: config,
62
+ metadata: {
63
+ created_time: new Date().toISOString(),
64
+ deletion_time: '',
65
+ destroyed: false,
66
+ version: 1,
67
+ },
68
+ },
69
+ wrap_info: null,
70
+ warnings: null,
71
+ auth: null,
72
+ }));
73
+ return;
74
+ }
75
+ // Handle GET /vault/v1/secret/data/* for other secrets
76
+ if (req.method === 'GET' && vaultPath.startsWith('/v1/secret/data/')) {
77
+ const token = req.headers['x-vault-token'];
78
+ if (token !== 'local-esv-token') {
79
+ res.writeHead(403, { 'Content-Type': 'application/json' });
80
+ res.end(JSON.stringify({ errors: ['permission denied'] }));
81
+ return;
82
+ }
83
+ // Return empty secret for unknown paths
84
+ res.writeHead(404, { 'Content-Type': 'application/json' });
85
+ res.end(JSON.stringify({ errors: ['secret not found'] }));
86
+ return;
87
+ }
88
+ // 404 for unknown vault paths
89
+ res.writeHead(404, { 'Content-Type': 'application/json' });
90
+ res.end(JSON.stringify({ errors: ['path not found'] }));
91
+ }
92
+ //# sourceMappingURL=vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/server/vault.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Workload Identity endpoint handlers for the ESV mock server
3
+ *
4
+ * Implements OAuth2 client credentials and JWT bearer grant for workload identity.
5
+ */
6
+ import { getJwks, signJwt, verifyJwt } from './crypto.js';
7
+ const ISSUER = 'http://localhost:3555/workload';
8
+ const TOKEN_EXPIRY = 3600; // 1 hour
9
+ // Valid client credentials for testing
10
+ const VALID_CLIENTS = {
11
+ 'local-workload-client': 'local-workload-secret',
12
+ };
13
+ /**
14
+ * Parse request body as URL-encoded form data
15
+ */
16
+ async function parseFormBody(req) {
17
+ return new Promise((resolve, reject) => {
18
+ let body = '';
19
+ req.on('data', (chunk) => {
20
+ body += chunk.toString();
21
+ });
22
+ req.on('end', () => {
23
+ resolve(new URLSearchParams(body));
24
+ });
25
+ req.on('error', reject);
26
+ });
27
+ }
28
+ /**
29
+ * Handle workload requests
30
+ */
31
+ export async function handleWorkloadRequest(req, res, pathname) {
32
+ // Remove /workload prefix
33
+ const workloadPath = pathname.replace(/^\/workload/, '');
34
+ // POST /workload/token - Token endpoint
35
+ if (req.method === 'POST' && workloadPath === '/token') {
36
+ await handleToken(req, res);
37
+ return;
38
+ }
39
+ // GET /workload/certs - JWKS endpoint
40
+ if (req.method === 'GET' && workloadPath === '/certs') {
41
+ handleCerts(res);
42
+ return;
43
+ }
44
+ // POST /workload/validate - Token validation endpoint (for testing)
45
+ if (req.method === 'POST' && workloadPath === '/validate') {
46
+ handleValidate(req, res);
47
+ return;
48
+ }
49
+ res.writeHead(404, { 'Content-Type': 'application/json' });
50
+ res.end(JSON.stringify({ error: 'not_found' }));
51
+ }
52
+ /**
53
+ * Token endpoint - issues access tokens for client credentials or JWT bearer
54
+ */
55
+ async function handleToken(req, res) {
56
+ const body = await parseFormBody(req);
57
+ const grantType = body.get('grant_type');
58
+ if (grantType === 'client_credentials') {
59
+ handleClientCredentials(body, res);
60
+ }
61
+ else if (grantType === 'urn:ietf:params:oauth:grant-type:jwt-bearer') {
62
+ handleJwtBearer(body, res);
63
+ }
64
+ else {
65
+ res.writeHead(400, { 'Content-Type': 'application/json' });
66
+ res.end(JSON.stringify({
67
+ error: 'unsupported_grant_type',
68
+ error_description: 'Only client_credentials and jwt-bearer are supported',
69
+ }));
70
+ }
71
+ }
72
+ /**
73
+ * Handle client credentials grant
74
+ */
75
+ function handleClientCredentials(body, res) {
76
+ const clientId = body.get('client_id');
77
+ const clientSecret = body.get('client_secret');
78
+ const scope = body.get('scope') || '';
79
+ if (!clientId || !clientSecret) {
80
+ res.writeHead(400, { 'Content-Type': 'application/json' });
81
+ res.end(JSON.stringify({
82
+ error: 'invalid_request',
83
+ error_description: 'Missing client_id or client_secret',
84
+ }));
85
+ return;
86
+ }
87
+ // Validate credentials
88
+ const expectedSecret = VALID_CLIENTS[clientId];
89
+ if (!expectedSecret || expectedSecret !== clientSecret) {
90
+ res.writeHead(401, { 'Content-Type': 'application/json' });
91
+ res.end(JSON.stringify({
92
+ error: 'invalid_client',
93
+ error_description: 'Invalid client credentials',
94
+ }));
95
+ return;
96
+ }
97
+ // Generate access token
98
+ const accessTokenClaims = {
99
+ iss: ISSUER,
100
+ sub: clientId,
101
+ aud: ISSUER,
102
+ client_id: clientId,
103
+ scope,
104
+ };
105
+ const accessToken = signJwt(accessTokenClaims, TOKEN_EXPIRY);
106
+ res.writeHead(200, { 'Content-Type': 'application/json' });
107
+ res.end(JSON.stringify({
108
+ access_token: accessToken,
109
+ token_type: 'Bearer',
110
+ expires_in: TOKEN_EXPIRY,
111
+ scope,
112
+ }));
113
+ }
114
+ /**
115
+ * Handle JWT bearer grant
116
+ */
117
+ function handleJwtBearer(body, res) {
118
+ const assertion = body.get('assertion');
119
+ const scope = body.get('scope') || '';
120
+ if (!assertion) {
121
+ res.writeHead(400, { 'Content-Type': 'application/json' });
122
+ res.end(JSON.stringify({
123
+ error: 'invalid_request',
124
+ error_description: 'Missing assertion',
125
+ }));
126
+ return;
127
+ }
128
+ // Verify the JWT assertion
129
+ const result = verifyJwt(assertion);
130
+ if (!result.valid) {
131
+ res.writeHead(400, { 'Content-Type': 'application/json' });
132
+ res.end(JSON.stringify({
133
+ error: 'invalid_grant',
134
+ error_description: result.error || 'Invalid JWT assertion',
135
+ }));
136
+ return;
137
+ }
138
+ // Extract workload ID from assertion
139
+ const workloadId = result.payload?.sub;
140
+ // Generate access token
141
+ const accessTokenClaims = {
142
+ iss: ISSUER,
143
+ sub: workloadId,
144
+ aud: ISSUER,
145
+ workload_id: workloadId,
146
+ scope: scope || result.payload?.scope || '',
147
+ };
148
+ const accessToken = signJwt(accessTokenClaims, TOKEN_EXPIRY);
149
+ res.writeHead(200, { 'Content-Type': 'application/json' });
150
+ res.end(JSON.stringify({
151
+ access_token: accessToken,
152
+ token_type: 'Bearer',
153
+ expires_in: TOKEN_EXPIRY,
154
+ scope: accessTokenClaims.scope,
155
+ }));
156
+ }
157
+ /**
158
+ * JWKS endpoint
159
+ */
160
+ function handleCerts(res) {
161
+ const jwks = getJwks();
162
+ res.writeHead(200, { 'Content-Type': 'application/json' });
163
+ res.end(JSON.stringify(jwks));
164
+ }
165
+ /**
166
+ * Token validation endpoint (for testing)
167
+ */
168
+ function handleValidate(req, res) {
169
+ const authHeader = req.headers.authorization;
170
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
171
+ res.writeHead(401, { 'Content-Type': 'application/json' });
172
+ res.end(JSON.stringify({
173
+ valid: false,
174
+ error: 'Missing Authorization header',
175
+ }));
176
+ return;
177
+ }
178
+ const token = authHeader.substring(7);
179
+ const result = verifyJwt(token);
180
+ if (!result.valid) {
181
+ res.writeHead(401, { 'Content-Type': 'application/json' });
182
+ res.end(JSON.stringify({
183
+ valid: false,
184
+ error: result.error,
185
+ }));
186
+ return;
187
+ }
188
+ res.writeHead(200, { 'Content-Type': 'application/json' });
189
+ res.end(JSON.stringify({
190
+ valid: true,
191
+ claims: result.payload,
192
+ expiresAt: result.payload?.exp ? new Date(result.payload.exp * 1000).toISOString() : undefined,
193
+ }));
194
+ }
195
+ /**
196
+ * Mock /api/whoami endpoint for testing workload authentication
197
+ *
198
+ * This endpoint validates workload tokens and returns the workload identity,
199
+ * allowing applications to be tested independently without requiring
200
+ * another application to be running.
201
+ */
202
+ export function handleWhoamiRequest(req, res) {
203
+ const authHeader = req.headers.authorization;
204
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
205
+ res.writeHead(401, { 'Content-Type': 'application/json' });
206
+ res.end(JSON.stringify({ error: 'Unauthorized' }));
207
+ return;
208
+ }
209
+ const token = authHeader.substring(7);
210
+ const result = verifyJwt(token);
211
+ if (!result.valid) {
212
+ res.writeHead(401, { 'Content-Type': 'application/json' });
213
+ res.end(JSON.stringify({ error: 'Invalid token', details: result.error }));
214
+ return;
215
+ }
216
+ res.writeHead(200, { 'Content-Type': 'application/json' });
217
+ res.end(JSON.stringify({
218
+ user: null,
219
+ workload: {
220
+ workload_id: result.payload?.sub,
221
+ client_id: result.payload?.client_id,
222
+ scope: result.payload?.scope,
223
+ },
224
+ }));
225
+ }
226
+ //# sourceMappingURL=workload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workload.js","sourceRoot":"","sources":["../../src/server/workload.ts"],"names":[],"mappings":"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"}