paygate-mcp 8.92.0 → 8.93.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/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +51 -6
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/dist/server.d.ts
CHANGED
|
@@ -98,6 +98,8 @@ export declare class PayGateServer {
|
|
|
98
98
|
readonly creditLedger: CreditLedger;
|
|
99
99
|
/** Rate limiter for admin API endpoints (brute-force protection) */
|
|
100
100
|
private readonly adminRateLimiter;
|
|
101
|
+
/** Rate limiter for session creation (prevents session slot exhaustion) */
|
|
102
|
+
private readonly sessionRateLimiter;
|
|
101
103
|
/** Server start time (ms since epoch) */
|
|
102
104
|
private readonly startedAt;
|
|
103
105
|
/** Whether the server is draining (shutting down gracefully) */
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAgB,eAAe,EAA0B,MAAM,MAAM,CAAC;AAI7E,OAAO,EAAE,aAAa,EAAkB,mBAAmB,EAAkB,MAAM,SAAS,CAAC;AAE7F,OAAO,EAAE,MAAM,EAAiC,MAAM,UAAU,CAAC;AASjE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,cAAc,EAAqD,MAAM,WAAW,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAmB,MAAM,SAAS,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAS,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,eAAe,EAA6B,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,aAAa,EAAqB,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -179,6 +179,18 @@ function sanitizeString(value, maxLen = MAX_STRING_FIELD) {
|
|
|
179
179
|
return '';
|
|
180
180
|
return String(value).slice(0, maxLen);
|
|
181
181
|
}
|
|
182
|
+
/**
|
|
183
|
+
* Sanitize a request URL for safe inclusion in log output.
|
|
184
|
+
* Strips control characters (newlines, tabs, carriage returns, etc.) that could
|
|
185
|
+
* be used for log injection attacks (forging log entries, hiding malicious activity).
|
|
186
|
+
* Truncates to 2048 chars to prevent log bloat from absurdly long URLs.
|
|
187
|
+
*/
|
|
188
|
+
function sanitizeLogUrl(url) {
|
|
189
|
+
if (!url)
|
|
190
|
+
return '/';
|
|
191
|
+
// eslint-disable-next-line no-control-regex
|
|
192
|
+
return url.replace(/[\x00-\x1f\x7f]/g, '').slice(0, 2048);
|
|
193
|
+
}
|
|
182
194
|
/** Clamp a numeric value to [min, max], returning defaultVal for NaN/undefined. */
|
|
183
195
|
function clampInt(value, min, max, defaultVal) {
|
|
184
196
|
if (value === undefined || !Number.isFinite(value))
|
|
@@ -308,6 +320,8 @@ class PayGateServer {
|
|
|
308
320
|
creditLedger;
|
|
309
321
|
/** Rate limiter for admin API endpoints (brute-force protection) */
|
|
310
322
|
adminRateLimiter;
|
|
323
|
+
/** Rate limiter for session creation (prevents session slot exhaustion) */
|
|
324
|
+
sessionRateLimiter;
|
|
311
325
|
/** Server start time (ms since epoch) */
|
|
312
326
|
startedAt = Date.now();
|
|
313
327
|
/** Whether the server is draining (shutting down gracefully) */
|
|
@@ -360,6 +374,8 @@ class PayGateServer {
|
|
|
360
374
|
this.adminKeys.bootstrap(this.bootstrapAdminKey);
|
|
361
375
|
// Admin endpoint rate limiter: configurable requests/min per source IP (brute-force protection)
|
|
362
376
|
this.adminRateLimiter = new rate_limiter_1.RateLimiter(this.config.adminRateLimit ?? 120);
|
|
377
|
+
// Session creation rate limiter: max 60 new sessions/min per IP (prevents session slot exhaustion)
|
|
378
|
+
this.sessionRateLimiter = new rate_limiter_1.RateLimiter(this.config.sessionRateLimit ?? 60);
|
|
363
379
|
this.gate = new gate_1.Gate(this.config, statePath);
|
|
364
380
|
this.gate.store.logger = this.logger;
|
|
365
381
|
// Multi-server mode: use Router
|
|
@@ -594,7 +610,7 @@ class PayGateServer {
|
|
|
594
610
|
this.sendError(res, 408, 'Request timeout');
|
|
595
611
|
}
|
|
596
612
|
else {
|
|
597
|
-
this.logger.error('Unhandled request error', { error: msg, url: req.url, method: req.method });
|
|
613
|
+
this.logger.error('Unhandled request error', { error: msg, url: sanitizeLogUrl(req.url), method: req.method });
|
|
598
614
|
this.sendError(res, 500, 'Internal server error');
|
|
599
615
|
}
|
|
600
616
|
}
|
|
@@ -1432,6 +1448,15 @@ class PayGateServer {
|
|
|
1432
1448
|
// Session management: reuse or create
|
|
1433
1449
|
let sessionId = req.headers['mcp-session-id'];
|
|
1434
1450
|
if (!sessionId || !this.sessions.getSession(sessionId)) {
|
|
1451
|
+
// Rate limit session creation per IP to prevent session slot exhaustion
|
|
1452
|
+
const sessionIp = resolveClientIp(req, this.config.trustedProxies);
|
|
1453
|
+
const sessionRateResult = this.sessionRateLimiter.check(`sess:${sessionIp}`);
|
|
1454
|
+
if (!sessionRateResult.allowed) {
|
|
1455
|
+
res.setHeader('Retry-After', String(Math.ceil(sessionRateResult.resetInMs / 1000)));
|
|
1456
|
+
this.sendError(res, 429, 'Too many sessions created. Try again later.');
|
|
1457
|
+
return;
|
|
1458
|
+
}
|
|
1459
|
+
this.sessionRateLimiter.record(`sess:${sessionIp}`);
|
|
1435
1460
|
sessionId = this.sessions.createSession(apiKey);
|
|
1436
1461
|
this.audit.log('session.created', (0, audit_1.maskKeyForAudit)(apiKey || 'anonymous'), `Session created`, {
|
|
1437
1462
|
requestId,
|
|
@@ -1654,6 +1679,15 @@ class PayGateServer {
|
|
|
1654
1679
|
// Session: reuse or create
|
|
1655
1680
|
let sessionId = req.headers['mcp-session-id'];
|
|
1656
1681
|
if (!sessionId || !this.sessions.getSession(sessionId)) {
|
|
1682
|
+
// Rate limit session creation per IP to prevent session slot exhaustion
|
|
1683
|
+
const sessionIp = resolveClientIp(req, this.config.trustedProxies);
|
|
1684
|
+
const sessionRateResult = this.sessionRateLimiter.check(`sess:${sessionIp}`);
|
|
1685
|
+
if (!sessionRateResult.allowed) {
|
|
1686
|
+
res.setHeader('Retry-After', String(Math.ceil(sessionRateResult.resetInMs / 1000)));
|
|
1687
|
+
this.sendError(res, 429, 'Too many sessions created. Try again later.');
|
|
1688
|
+
return;
|
|
1689
|
+
}
|
|
1690
|
+
this.sessionRateLimiter.record(`sess:${sessionIp}`);
|
|
1657
1691
|
sessionId = this.sessions.createSession(apiKey);
|
|
1658
1692
|
}
|
|
1659
1693
|
// Register this SSE connection
|
|
@@ -1964,6 +1998,15 @@ class PayGateServer {
|
|
|
1964
1998
|
const params = new URLSearchParams(urlParts[1] || '');
|
|
1965
1999
|
const namespace = params.get('namespace') || undefined;
|
|
1966
2000
|
const status = this.gate.getStatus(namespace);
|
|
2001
|
+
// Cap the keys array to prevent unbounded response sizes with many API keys.
|
|
2002
|
+
// The full paginated listing is available via GET /admin/keys.
|
|
2003
|
+
const MAX_STATUS_KEYS = 1000;
|
|
2004
|
+
if (status.keys && status.keys.length > MAX_STATUS_KEYS) {
|
|
2005
|
+
const totalKeys = status.keys.length;
|
|
2006
|
+
status.keys = status.keys.slice(0, MAX_STATUS_KEYS);
|
|
2007
|
+
status.keysTruncated = true;
|
|
2008
|
+
status.totalKeyCount = totalKeys;
|
|
2009
|
+
}
|
|
1967
2010
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
1968
2011
|
res.end(JSON.stringify(status, null, 2));
|
|
1969
2012
|
}
|
|
@@ -4517,7 +4560,8 @@ class PayGateServer {
|
|
|
4517
4560
|
const from = params.get('from') || undefined;
|
|
4518
4561
|
const to = params.get('to') || undefined;
|
|
4519
4562
|
const granularity = (params.get('granularity') || 'hourly');
|
|
4520
|
-
const topN = params.get('top') ? parseInt(params.get('top'), 10) : 10
|
|
4563
|
+
const topN = clampInt(params.get('top') ? parseInt(params.get('top'), 10) : undefined, 1, 1000, 10 // default 10, max 1000 — prevents memory exhaustion from ?top=999999999
|
|
4564
|
+
);
|
|
4521
4565
|
const namespace = params.get('namespace') || undefined;
|
|
4522
4566
|
const events = this.gate.meter.getEvents(undefined, namespace);
|
|
4523
4567
|
const report = this.analytics.report(events, { from, to, granularity, topN });
|
|
@@ -10238,8 +10282,8 @@ class PayGateServer {
|
|
|
10238
10282
|
this.adminRateLimiter.record(`ip:${sourceIp}`);
|
|
10239
10283
|
const record = adminKey ? this.adminKeys.validate(adminKey) : null;
|
|
10240
10284
|
if (!record) {
|
|
10241
|
-
this.audit.log('admin.auth_failed', 'unknown', `Admin auth failed on ${req.url}`, {
|
|
10242
|
-
url: req.url,
|
|
10285
|
+
this.audit.log('admin.auth_failed', 'unknown', `Admin auth failed on ${sanitizeLogUrl(req.url)}`, {
|
|
10286
|
+
url: sanitizeLogUrl(req.url),
|
|
10243
10287
|
method: req.method,
|
|
10244
10288
|
});
|
|
10245
10289
|
this.sendError(res, 401, 'Invalid admin key');
|
|
@@ -10247,8 +10291,8 @@ class PayGateServer {
|
|
|
10247
10291
|
}
|
|
10248
10292
|
// Role-based permission check (if a minimum role is specified)
|
|
10249
10293
|
if (minRole && admin_keys_1.ROLE_HIERARCHY[record.role] < admin_keys_1.ROLE_HIERARCHY[minRole]) {
|
|
10250
|
-
this.audit.log('admin.auth_failed', adminKey.slice(0, 7) + '...' + adminKey.slice(-4), `Insufficient role for ${req.url} (need ${minRole}, have ${record.role})`, {
|
|
10251
|
-
url: req.url,
|
|
10294
|
+
this.audit.log('admin.auth_failed', adminKey.slice(0, 7) + '...' + adminKey.slice(-4), `Insufficient role for ${sanitizeLogUrl(req.url)} (need ${minRole}, have ${record.role})`, {
|
|
10295
|
+
url: sanitizeLogUrl(req.url),
|
|
10252
10296
|
method: req.method,
|
|
10253
10297
|
requiredRole: minRole,
|
|
10254
10298
|
currentRole: record.role,
|
|
@@ -11260,6 +11304,7 @@ class PayGateServer {
|
|
|
11260
11304
|
this.tokens.destroy();
|
|
11261
11305
|
this.expiryScanner.destroy();
|
|
11262
11306
|
this.adminRateLimiter.destroy();
|
|
11307
|
+
this.sessionRateLimiter.destroy();
|
|
11263
11308
|
if (this.redisSync) {
|
|
11264
11309
|
await this.redisSync.destroy();
|
|
11265
11310
|
}
|