Files
brain/tools/secret-scan.test.mjs
T

47 lines
2.6 KiB
JavaScript

// tools/secret-scan.test.mjs
// Машина 5 Пакет 7 (Блок 4) — общий скан секрет-паттернов в тексте. Используется
// read-path-deny (7.1, скан выдачи Read) и mcp-classification (7.3, скан исходящего egress).
// Секрет-подмножество (НЕ PII): приватные ключи PEM, известные токены (AWS/GitHub/OpenAI/
// Slack/Sentry/Yandex/JWT/Bearer), строки подключения с встроенными кредами. Анти-дрейф —
// один источник секрет-паттернов на оба канала (как classify-destructive для разрушительности).
import { describe, it, expect } from 'vitest';
import { scanSecrets } from './secret-scan.mjs';
describe('scanSecrets (Пакет 7): детект секрет-паттернов в тексте', () => {
it('PEM приватный ключ → found', () => {
const r = scanSecrets('foo\n-----BEGIN RSA PRIVATE KEY-----\nMII...\n-----END RSA PRIVATE KEY-----');
expect(r.found).toBe(true);
expect(r.hits).toContain('pem-private-key');
});
it('AWS Access Key (AKIA) → found', () => {
expect(scanSecrets('key=AKIAIOSFODNN7EXAMPLE').found).toBe(true);
});
it('GitHub token (ghp_) → found', () => {
expect(scanSecrets('token ghp_0123456789abcdefghijklmnopqrstuvwxyz').found).toBe(true);
});
it('OpenAI sk- токен → found', () => {
expect(scanSecrets('OPENAI=sk-abcdefghij0123456789ABCDE').found).toBe(true);
});
it('строка подключения с кредами (postgres://user:pass@host) → found', () => {
const r = scanSecrets('DATABASE_URL=postgres://admin:s3cretPwd@db.local:5432/app');
expect(r.found).toBe(true);
expect(r.hits).toContain('conn-string-creds');
});
it('Bearer-токен → found', () => {
expect(scanSecrets('Authorization: Bearer abcdefghijklmnopqrstuvwx').found).toBe(true);
});
it('обычный код без секретов → not found, hits пуст', () => {
const r = scanSecrets('export function add(a, b) { return a + b; }');
expect(r.found).toBe(false);
expect(r.hits).toEqual([]);
});
it('строка подключения БЕЗ кредов (postgres://host) → not found (нет user:pass@)', () => {
expect(scanSecrets('postgres://db.local:5432/app').found).toBe(false);
});
it('пустой/невалидный вход → not found, не бросает', () => {
expect(scanSecrets(null).found).toBe(false);
expect(scanSecrets(undefined).found).toBe(false);
expect(scanSecrets('').found).toBe(false);
});
});