Some checks failed
Quality gates / quality (pull_request) Failing after 1m38s
- src/image-ingress.js: sniff magic bytes independent of declared MIME, reject polyglots (embedded ZIP/script payloads), enforce 4 MB body cap and 4096 px dimension cap before decode, re-encode via fixed-argv Pillow subprocess with 15s timeout, strip EXIF/GPS/XMP/tEXt metadata, fail closed with sanitized short errors and manual fallback. - scripts/reencode_image.py: defensive decoder; decompression-bomb guarded; prints one JSON verdict line, never image bytes. - src/rate-limiter.js + server.mjs /api/analyze: bounded fixed-window per-client limiter, 429 with retry-after, no payload retention. - tests/image-ingress.test.js: hostile synthetic fixtures only (spoofed MIME, GIF/ZIP polyglots, truncated/garbage/empty images, 12000x12000 bomb, 6000x6000 oversized, EXIF+GPS, SVG-with-script); asserts provider is never reached on rejection and error messages contain no bytes/base64/stacks. Closes #16
27 lines
1.1 KiB
JavaScript
27 lines
1.1 KiB
JavaScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
|
|
import { createRateLimiter } from '../src/rate-limiter.js';
|
|
|
|
test('rate limiter blocks after the configured burst and recovers next window', () => {
|
|
const limiter = createRateLimiter({ windowMs: 1000, maxRequests: 3 });
|
|
const t0 = 1_000_000;
|
|
assert.equal(limiter.take('k', t0).allowed, true);
|
|
assert.equal(limiter.take('k', t0 + 1).allowed, true);
|
|
assert.equal(limiter.take('k', t0 + 2).allowed, true);
|
|
const blocked = limiter.take('k', t0 + 3);
|
|
assert.equal(blocked.allowed, false);
|
|
assert.ok(blocked.retryAfterMs > 0 && blocked.retryAfterMs <= 1000);
|
|
// Next window resets cleanly.
|
|
assert.equal(limiter.take('k', t0 + 1001).allowed, true);
|
|
});
|
|
|
|
test('rate limiter keys are isolated and never expose payload data', () => {
|
|
const limiter = createRateLimiter({ windowMs: 60_000, maxRequests: 1 });
|
|
assert.equal(limiter.take('a').allowed, true);
|
|
assert.equal(limiter.take('b').allowed, true);
|
|
const blocked = limiter.take('a');
|
|
assert.equal(blocked.allowed, false);
|
|
assert.doesNotMatch(blocked.reason, /image|base64|byte/i);
|
|
});
|