@n24q02m/mcp-core 1.13.0-beta.8 → 1.13.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/build/auth/credential-form.d.ts +17 -0
- package/build/auth/credential-form.d.ts.map +1 -1
- package/build/auth/credential-form.js +133 -99
- package/build/auth/credential-form.js.map +1 -1
- package/build/auth/relay-login.d.ts.map +1 -1
- package/build/auth/relay-login.js +42 -2
- package/build/auth/relay-login.js.map +1 -1
- package/package.json +1 -1
|
@@ -51,6 +51,23 @@ export interface RenderOptions {
|
|
|
51
51
|
*/
|
|
52
52
|
prefill?: Record<string, string>;
|
|
53
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Wrap `bodyHtml` in the shared dark-theme HTML shell.
|
|
56
|
+
*
|
|
57
|
+
* The shell provides `<!DOCTYPE html>`, `<head>` (charset, viewport, escaped
|
|
58
|
+
* `<title>`, embedded `FORM_SHELL_CSS`) and a `<body>` whose only child is
|
|
59
|
+
* `bodyHtml`. `bodyHtml` is inserted verbatim, so callers MUST pre-escape any
|
|
60
|
+
* untrusted values they interpolate.
|
|
61
|
+
*
|
|
62
|
+
* `title` is HTML-escaped before being placed in `<title>`.
|
|
63
|
+
*
|
|
64
|
+
* Used by `renderCredentialForm` (relay credential form) and by
|
|
65
|
+
* `loginGetHandler` in `relay-login.ts` (the `/login` password gate) so both
|
|
66
|
+
* pages share identical typography, palette, card layout, and input styling.
|
|
67
|
+
* Parity with Python `render_form_shell` in
|
|
68
|
+
* `packages/core-py/src/mcp_core/auth/credential_form.py`.
|
|
69
|
+
*/
|
|
70
|
+
export declare function renderFormShell(title: string, bodyHtml: string): string;
|
|
54
71
|
/**
|
|
55
72
|
* Render a dark-themed HTML credential form from a RelayConfigSchema.
|
|
56
73
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-form.d.ts","sourceRoot":"","sources":["../../src/auth/credential-form.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,EACjD,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAUT;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,cAAc,CAAC,EAAE,cAAc,EAAE,CAAA;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;
|
|
1
|
+
{"version":3,"file":"credential-form.d.ts","sourceRoot":"","sources":["../../src/auth/credential-form.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,EACjD,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAUT;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,cAAc,CAAC,EAAE,cAAc,EAAE,CAAA;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC;AAsVD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAevE;AAqED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAuZ9F;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,OAAO,CAAA;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAE7D"}
|
|
@@ -34,103 +34,16 @@ function escapeHtml(value) {
|
|
|
34
34
|
.replace(/"/g, '"')
|
|
35
35
|
.replace(/'/g, ''');
|
|
36
36
|
}
|
|
37
|
-
function renderField(field, value = '') {
|
|
38
|
-
const key = escapeHtml(field.key ?? '');
|
|
39
|
-
const label = escapeHtml(field.label ?? '');
|
|
40
|
-
const fieldType = escapeHtml(field.type ?? 'text');
|
|
41
|
-
const placeholder = escapeHtml(field.placeholder ?? '');
|
|
42
|
-
const helpText = escapeHtml(field.helpText ?? '');
|
|
43
|
-
const helpUrl = escapeHtml(field.helpUrl ?? '');
|
|
44
|
-
const required = Boolean(field.required);
|
|
45
|
-
const requiredAttr = required ? ' required' : '';
|
|
46
|
-
const requiredBadge = required
|
|
47
|
-
? '<span class="required-badge">Required</span>'
|
|
48
|
-
: '<span class="optional-badge">Optional</span>';
|
|
49
|
-
const valueAttr = value ? ` value="${escapeHtml(value)}"` : '';
|
|
50
|
-
let helpHtml = '';
|
|
51
|
-
let ariaDescribedby = '';
|
|
52
|
-
if (helpText) {
|
|
53
|
-
ariaDescribedby = ` aria-describedby="help-${key}"`;
|
|
54
|
-
if (helpUrl) {
|
|
55
|
-
helpHtml = `<p class="help-text" id="help-${key}"><a href="${helpUrl}" target="_blank" rel="noopener noreferrer">${helpText}</a></p>`;
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
helpHtml = `<p class="help-text" id="help-${key}">${helpText}</p>`;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return `
|
|
62
|
-
<div class="field-group">
|
|
63
|
-
<label for="field-${key}" class="field-label">
|
|
64
|
-
${label}
|
|
65
|
-
${requiredBadge}
|
|
66
|
-
</label>
|
|
67
|
-
<input
|
|
68
|
-
id="field-${key}"
|
|
69
|
-
name="${key}"
|
|
70
|
-
type="${fieldType}"
|
|
71
|
-
placeholder="${placeholder}"
|
|
72
|
-
class="field-input"
|
|
73
|
-
autocomplete="off"
|
|
74
|
-
autocorrect="off"
|
|
75
|
-
autocapitalize="off"
|
|
76
|
-
spellcheck="false"${valueAttr}${requiredAttr}${ariaDescribedby}
|
|
77
|
-
/>
|
|
78
|
-
${helpHtml}
|
|
79
|
-
</div>`;
|
|
80
|
-
}
|
|
81
|
-
function renderCapability(cap) {
|
|
82
|
-
const label = escapeHtml(cap.label ?? '');
|
|
83
|
-
const priority = escapeHtml(cap.priority ?? '');
|
|
84
|
-
const description = escapeHtml(cap.description ?? '');
|
|
85
|
-
const priorityClass = priority ? `priority-${priority}` : 'priority-medium';
|
|
86
|
-
const descHtml = description ? `<p class="capability-desc">${description}</p>` : '';
|
|
87
|
-
return `
|
|
88
|
-
<li class="capability-item">
|
|
89
|
-
<div class="capability-header">
|
|
90
|
-
<span class="capability-label">${label}</span>
|
|
91
|
-
<span class="capability-priority ${priorityClass}">${priority}</span>
|
|
92
|
-
</div>
|
|
93
|
-
${descHtml}
|
|
94
|
-
</li>`;
|
|
95
|
-
}
|
|
96
37
|
/**
|
|
97
|
-
*
|
|
38
|
+
* Shared CSS for every relay/auth HTML page rendered by core-ts.
|
|
98
39
|
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
40
|
+
* Kept verbatim with `packages/core-py/src/mcp_core/auth/credential_form.py`'s
|
|
41
|
+
* `_FORM_SHELL_CSS` constant so the credential form, the `/login` password
|
|
42
|
+
* gate, and any future relay page have identical visual styling regardless of
|
|
43
|
+
* which language renders them. Extending this string requires updating the
|
|
44
|
+
* Python parity copy in the same commit.
|
|
104
45
|
*/
|
|
105
|
-
|
|
106
|
-
const displayName = escapeHtml(schema.displayName ?? schema.server ?? 'Configuration');
|
|
107
|
-
const server = escapeHtml(schema.server ?? '');
|
|
108
|
-
const description = escapeHtml(schema.description ?? '');
|
|
109
|
-
const title = options.pageTitle !== undefined ? escapeHtml(options.pageTitle) : displayName;
|
|
110
|
-
const submitUrlEscaped = escapeHtml(options.submitUrl);
|
|
111
|
-
const fields = schema.fields ?? [];
|
|
112
|
-
const capabilityInfo = schema.capabilityInfo ?? [];
|
|
113
|
-
const prefill = options.prefill ?? {};
|
|
114
|
-
const fieldsHtml = fields.map((f) => renderField(f, prefill[f.key] ?? '')).join('');
|
|
115
|
-
let capabilitiesHtml = '';
|
|
116
|
-
if (capabilityInfo.length > 0) {
|
|
117
|
-
const itemsHtml = capabilityInfo.map(renderCapability).join('');
|
|
118
|
-
capabilitiesHtml = `
|
|
119
|
-
<section class="capabilities-section">
|
|
120
|
-
<h2 class="capabilities-title">Capabilities Requested</h2>
|
|
121
|
-
<ul class="capabilities-list">${itemsHtml}
|
|
122
|
-
</ul>
|
|
123
|
-
</section>`;
|
|
124
|
-
}
|
|
125
|
-
const descriptionHtml = description ? `<p class="server-description">${description}</p>` : '';
|
|
126
|
-
return `<!DOCTYPE html>
|
|
127
|
-
<html lang="en">
|
|
128
|
-
<head>
|
|
129
|
-
<meta charset="UTF-8" />
|
|
130
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
131
|
-
<title>${title}</title>
|
|
132
|
-
<style>
|
|
133
|
-
*, *::before, *::after {
|
|
46
|
+
const FORM_SHELL_CSS = ` *, *::before, *::after {
|
|
134
47
|
box-sizing: border-box;
|
|
135
48
|
margin: 0;
|
|
136
49
|
padding: 0;
|
|
@@ -450,10 +363,132 @@ export function renderCredentialForm(schema, options) {
|
|
|
450
363
|
font-size: 0.8125rem;
|
|
451
364
|
color: #9ca3af;
|
|
452
365
|
}
|
|
453
|
-
|
|
366
|
+
`;
|
|
367
|
+
/**
|
|
368
|
+
* Wrap `bodyHtml` in the shared dark-theme HTML shell.
|
|
369
|
+
*
|
|
370
|
+
* The shell provides `<!DOCTYPE html>`, `<head>` (charset, viewport, escaped
|
|
371
|
+
* `<title>`, embedded `FORM_SHELL_CSS`) and a `<body>` whose only child is
|
|
372
|
+
* `bodyHtml`. `bodyHtml` is inserted verbatim, so callers MUST pre-escape any
|
|
373
|
+
* untrusted values they interpolate.
|
|
374
|
+
*
|
|
375
|
+
* `title` is HTML-escaped before being placed in `<title>`.
|
|
376
|
+
*
|
|
377
|
+
* Used by `renderCredentialForm` (relay credential form) and by
|
|
378
|
+
* `loginGetHandler` in `relay-login.ts` (the `/login` password gate) so both
|
|
379
|
+
* pages share identical typography, palette, card layout, and input styling.
|
|
380
|
+
* Parity with Python `render_form_shell` in
|
|
381
|
+
* `packages/core-py/src/mcp_core/auth/credential_form.py`.
|
|
382
|
+
*/
|
|
383
|
+
export function renderFormShell(title, bodyHtml) {
|
|
384
|
+
const safeTitle = escapeHtml(title);
|
|
385
|
+
return `<!DOCTYPE html>
|
|
386
|
+
<html lang="en">
|
|
387
|
+
<head>
|
|
388
|
+
<meta charset="UTF-8" />
|
|
389
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
390
|
+
<title>${safeTitle}</title>
|
|
391
|
+
<style>
|
|
392
|
+
${FORM_SHELL_CSS} </style>
|
|
454
393
|
</head>
|
|
455
394
|
<body>
|
|
456
|
-
|
|
395
|
+
${bodyHtml}
|
|
396
|
+
</body>
|
|
397
|
+
</html>`;
|
|
398
|
+
}
|
|
399
|
+
function renderField(field, value = '') {
|
|
400
|
+
const key = escapeHtml(field.key ?? '');
|
|
401
|
+
const label = escapeHtml(field.label ?? '');
|
|
402
|
+
const fieldType = escapeHtml(field.type ?? 'text');
|
|
403
|
+
const placeholder = escapeHtml(field.placeholder ?? '');
|
|
404
|
+
const helpText = escapeHtml(field.helpText ?? '');
|
|
405
|
+
const helpUrl = escapeHtml(field.helpUrl ?? '');
|
|
406
|
+
const required = Boolean(field.required);
|
|
407
|
+
const requiredAttr = required ? ' required' : '';
|
|
408
|
+
const requiredBadge = required
|
|
409
|
+
? '<span class="required-badge">Required</span>'
|
|
410
|
+
: '<span class="optional-badge">Optional</span>';
|
|
411
|
+
const valueAttr = value ? ` value="${escapeHtml(value)}"` : '';
|
|
412
|
+
let helpHtml = '';
|
|
413
|
+
let ariaDescribedby = '';
|
|
414
|
+
if (helpText) {
|
|
415
|
+
ariaDescribedby = ` aria-describedby="help-${key}"`;
|
|
416
|
+
if (helpUrl) {
|
|
417
|
+
helpHtml = `<p class="help-text" id="help-${key}"><a href="${helpUrl}" target="_blank" rel="noopener noreferrer">${helpText}</a></p>`;
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
helpHtml = `<p class="help-text" id="help-${key}">${helpText}</p>`;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
return `
|
|
424
|
+
<div class="field-group">
|
|
425
|
+
<label for="field-${key}" class="field-label">
|
|
426
|
+
${label}
|
|
427
|
+
${requiredBadge}
|
|
428
|
+
</label>
|
|
429
|
+
<input
|
|
430
|
+
id="field-${key}"
|
|
431
|
+
name="${key}"
|
|
432
|
+
type="${fieldType}"
|
|
433
|
+
placeholder="${placeholder}"
|
|
434
|
+
class="field-input"
|
|
435
|
+
autocomplete="off"
|
|
436
|
+
autocorrect="off"
|
|
437
|
+
autocapitalize="off"
|
|
438
|
+
spellcheck="false"${valueAttr}${requiredAttr}${ariaDescribedby}
|
|
439
|
+
/>
|
|
440
|
+
${helpHtml}
|
|
441
|
+
</div>`;
|
|
442
|
+
}
|
|
443
|
+
function renderCapability(cap) {
|
|
444
|
+
const label = escapeHtml(cap.label ?? '');
|
|
445
|
+
const priority = escapeHtml(cap.priority ?? '');
|
|
446
|
+
const description = escapeHtml(cap.description ?? '');
|
|
447
|
+
const priorityClass = priority ? `priority-${priority}` : 'priority-medium';
|
|
448
|
+
const descHtml = description ? `<p class="capability-desc">${description}</p>` : '';
|
|
449
|
+
return `
|
|
450
|
+
<li class="capability-item">
|
|
451
|
+
<div class="capability-header">
|
|
452
|
+
<span class="capability-label">${label}</span>
|
|
453
|
+
<span class="capability-priority ${priorityClass}">${priority}</span>
|
|
454
|
+
</div>
|
|
455
|
+
${descHtml}
|
|
456
|
+
</li>`;
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Render a dark-themed HTML credential form from a RelayConfigSchema.
|
|
460
|
+
*
|
|
461
|
+
* @param schema RelayConfigSchema with server metadata and field definitions.
|
|
462
|
+
* @param options.submitUrl URL the form POSTs to as JSON via fetch().
|
|
463
|
+
* @param options.pageTitle Optional browser tab title. Defaults to displayName.
|
|
464
|
+
* @param options.prefill Optional ``{KEY: VALUE}`` map for input ``value=`` attrs.
|
|
465
|
+
* @returns Complete HTML document string, XSS-safe with all dynamic content escaped.
|
|
466
|
+
*/
|
|
467
|
+
export function renderCredentialForm(schema, options) {
|
|
468
|
+
const displayName = escapeHtml(schema.displayName ?? schema.server ?? 'Configuration');
|
|
469
|
+
const server = escapeHtml(schema.server ?? '');
|
|
470
|
+
const description = escapeHtml(schema.description ?? '');
|
|
471
|
+
const title = options.pageTitle !== undefined ? escapeHtml(options.pageTitle) : displayName;
|
|
472
|
+
const submitUrlEscaped = escapeHtml(options.submitUrl);
|
|
473
|
+
const fields = schema.fields ?? [];
|
|
474
|
+
const capabilityInfo = schema.capabilityInfo ?? [];
|
|
475
|
+
const prefill = options.prefill ?? {};
|
|
476
|
+
const fieldsHtml = fields.map((f) => renderField(f, prefill[f.key] ?? '')).join('');
|
|
477
|
+
let capabilitiesHtml = '';
|
|
478
|
+
if (capabilityInfo.length > 0) {
|
|
479
|
+
const itemsHtml = capabilityInfo.map(renderCapability).join('');
|
|
480
|
+
capabilitiesHtml = `
|
|
481
|
+
<section class="capabilities-section">
|
|
482
|
+
<h2 class="capabilities-title">Capabilities Requested</h2>
|
|
483
|
+
<ul class="capabilities-list">${itemsHtml}
|
|
484
|
+
</ul>
|
|
485
|
+
</section>`;
|
|
486
|
+
}
|
|
487
|
+
const descriptionHtml = description ? `<p class="server-description">${description}</p>` : '';
|
|
488
|
+
// The body is wrapped in `renderFormShell` below. The shell injects the
|
|
489
|
+
// `<head>` (with the shared `FORM_SHELL_CSS`) and the `<body>` opening +
|
|
490
|
+
// closing tags, so this template starts at the first child of `<body>`.
|
|
491
|
+
const bodyHtml = ` <div class="container">
|
|
457
492
|
<div class="card">
|
|
458
493
|
<div class="server-header">
|
|
459
494
|
<h1 class="server-name">${displayName}</h1>
|
|
@@ -828,9 +863,8 @@ export function renderCredentialForm(schema, options) {
|
|
|
828
863
|
});
|
|
829
864
|
});
|
|
830
865
|
})();
|
|
831
|
-
</script
|
|
832
|
-
|
|
833
|
-
</html>`;
|
|
866
|
+
</script>`;
|
|
867
|
+
return renderFormShell(title, bodyHtml);
|
|
834
868
|
}
|
|
835
869
|
/** Return true if field stores a credential that must not be re-rendered to HTML. */
|
|
836
870
|
export function isSecretField(field) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-form.js","sourceRoot":"","sources":["../../src/auth/credential-form.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"credential-form.js","sourceRoot":"","sources":["../../src/auth/credential-form.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-login.d.ts","sourceRoot":"","sources":["../../src/auth/relay-login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"relay-login.d.ts","sourceRoot":"","sources":["../../src/auth/relay-login.ts"],"names":[],"mappings":"AAmCA,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE1D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAI7C;AA8BD;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACzC,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAA;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,kBAAkB,CAAA;IAC5C,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAA;IACjC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,KAAK,OAAO,CAAA;IAC9E,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;IACjD,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;CAC/C;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,IACrD,KAAK,iBAAiB,EAAE,KAAK,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,EAAE,MAAM,MAAM,IAAI,KAAG,OAAO,CAAC,IAAI,CAAC,CAclH;AAeD,wBAAsB,eAAe,CACnC,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,EACrC,GAAG,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,GAAG,KAAK,CAAC,GAC5C,OAAO,CAAC,IAAI,CAAC,CAkDf;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC,EAC3C,GAAG,EAAE,kBAAkB,GACtB,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* lives at ``packages/core-py/src/mcp_core/auth/relay_login.py``.
|
|
16
16
|
*/
|
|
17
17
|
import crypto from 'node:crypto';
|
|
18
|
+
import { renderFormShell } from './credential-form.js';
|
|
18
19
|
const sessions = new Map();
|
|
19
20
|
const fails = new Map();
|
|
20
21
|
const SESSION_TTL_MS = 24 * 60 * 60 * 1000;
|
|
@@ -103,8 +104,47 @@ export async function loginGetHandler(req, res) {
|
|
|
103
104
|
// raw-html-format rule expects sanitisers to handle. Semgrep can't see
|
|
104
105
|
// the custom helper so we suppress the warning here.
|
|
105
106
|
const safeNext = escapeHtml(String(next));
|
|
106
|
-
|
|
107
|
-
|
|
107
|
+
// Visual parity with the relay credential form: same dark-theme card,
|
|
108
|
+
// typography, ``.field-group`` / ``.field-label`` / ``.field-input``
|
|
109
|
+
// classes, and primary submit button styling. Pure POST (no JavaScript)
|
|
110
|
+
// so the gate works under strict CSP that blocks inline scripts.
|
|
111
|
+
const bodyHtml = ` <div class="container">
|
|
112
|
+
<div class="card">
|
|
113
|
+
<div class="server-header">
|
|
114
|
+
<h1 class="server-name">Relay login</h1>
|
|
115
|
+
<div class="server-id">mcp-relay</div>
|
|
116
|
+
<p class="server-description">Enter the relay password shared by your deployer.</p>
|
|
117
|
+
</div>
|
|
118
|
+
|
|
119
|
+
<p class="form-title">Authenticate</p>
|
|
120
|
+
|
|
121
|
+
<form method="POST" action="/login" novalidate>
|
|
122
|
+
<input type="hidden" name="next" value="${safeNext}">
|
|
123
|
+
<div class="field-group">
|
|
124
|
+
<label for="field-password" class="field-label">
|
|
125
|
+
Relay password
|
|
126
|
+
<span class="required-badge">Required</span>
|
|
127
|
+
</label>
|
|
128
|
+
<input
|
|
129
|
+
id="field-password"
|
|
130
|
+
type="password"
|
|
131
|
+
name="password"
|
|
132
|
+
class="field-input"
|
|
133
|
+
placeholder="Relay password"
|
|
134
|
+
autocomplete="current-password"
|
|
135
|
+
autocorrect="off"
|
|
136
|
+
autocapitalize="off"
|
|
137
|
+
spellcheck="false"
|
|
138
|
+
required
|
|
139
|
+
autofocus
|
|
140
|
+
/>
|
|
141
|
+
</div>
|
|
142
|
+
|
|
143
|
+
<button type="submit" class="submit-btn">Continue</button>
|
|
144
|
+
</form>
|
|
145
|
+
</div>
|
|
146
|
+
</div>`; // nosemgrep: javascript.express.security.injection.raw-html-format.raw-html-format
|
|
147
|
+
res.send(renderFormShell('Relay login', bodyHtml));
|
|
108
148
|
}
|
|
109
149
|
export async function loginPostHandler(req, res) {
|
|
110
150
|
const ip = req.ip ?? 'unknown';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-login.js","sourceRoot":"","sources":["../../src/auth/relay-login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,MAAM,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"relay-login.js","sourceRoot":"","sources":["../../src/auth/relay-login.ts"],"names":[],"mappings":"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"}
|