# Конфигурация gitleaks для проекта Лидерра
# Правило §5.2 правил Claude: запрет на ПДн / токены / API-ключи в коммитах
#
# ВАЖНО: gitleaks использует Go RE2, который НЕ поддерживает lookbehind/lookahead.
# Все правила ниже написаны без (?<=...), (?<!...), (?=...), (?!...).
# Границы — через \b (word boundary).

title = "gitleaks Лидерра"

# Расширяем встроенный набор правил gitleaks
[extend]
useDefault = true

# ============================================================================
# Кастомные правила для российского контекста (152-ФЗ + ПДн)
# ============================================================================

# 1. Российский телефонный номер +7XXXXXXXXXX (без маски)
[[rules]]
id = "ru-phone-unmasked"
description = "Российский телефон без маскирования (правило §5.1 правил Claude)"
regex = '''\b(?:\+?7|8)[\s\-]?\(?[34589]\d{2}\)?[\s\-]?\d{3}[\s\-]?\d{2}[\s\-]?\d{2}\b'''
tags = ["pii", "phone", "152-fz"]

# 2. ИНН — 10 цифр (юр. лица) или 12 цифр (физ. лица)
[[rules]]
id = "ru-inn"
description = "Российский ИНН (10 или 12 цифр)"
regex = '''(?i)\b(?:inn|инн)[:=\s]+\d{10,12}\b'''
tags = ["pii", "ru-tax"]

# 3. ОГРН — 13 цифр (юр. лица) или 15 цифр (ИП)
[[rules]]
id = "ru-ogrn"
description = "Российский ОГРН/ОГРНИП (13 или 15 цифр)"
regex = '''(?i)\b(?:ogrn|огрн|огрнип)[:=\s]+\d{13,15}\b'''
tags = ["pii", "ru-tax"]

# 4. Российский паспорт (XX XX XXXXXX)
[[rules]]
id = "ru-passport"
description = "Российский паспорт RF (4 цифры серии + 6 цифр номера)"
regex = '''(?i)\b(?:passport|паспорт)[:=\s]+\d{4}\s?\d{6}\b'''
tags = ["pii"]

# 5. Email — детектируется default-правилами gitleaks. Дополнительно — через
# allowlist пропускаем известные плейсхолдеры (см. секцию allowlist ниже).

# 6. Yandex Cloud OAuth-token (формат `y0_...`)
[[rules]]
id = "yandex-cloud-oauth"
description = "Yandex Cloud OAuth/IAM-token"
regex = '''\by[0-9]_[A-Za-z0-9_-]{40,}\b'''
tags = ["secret", "yandex"]

# 7. Yandex Cloud API-key (формат AQVN...)
[[rules]]
id = "yandex-cloud-api-key"
description = "Yandex Cloud API-key"
regex = '''\bAQVN[A-Za-z0-9_-]{40,}\b'''
tags = ["secret", "yandex"]

# 8. Webhook signing secrets / HMAC keys
[[rules]]
id = "webhook-secret"
description = "Webhook signing secret (HMAC) с явным префиксом ключа"
regex = '''(?i)(?:webhook[_-]?(?:secret|token|signature)|signing[_-]?secret|hmac[_-]?key)[\s:=]+["']?[A-Za-z0-9_+/=\-]{20,}["']?'''
tags = ["secret"]

# ============================================================================
# Глобальный allowlist: что НЕ считать секретом
# ============================================================================
[allowlist]
description = "Что игнорировать (плейсхолдеры, тестовые данные, публичные реквизиты)"
paths = [
  '''node_modules/''',
  '''package-lock\.json''',
  '''\.git/''',
  '''bin/''',
  '''cspell-words\.txt''',
  '''\.gitleaks\.toml''',
  # HTML-концепты handoff Платона (v8 Forest) — демо-данные для визуализации,
  # не реальные ПДн. Дублирующие пути в liderra_v8_handoff/concepts/ и web/v8/
  '''liderra_v8_handoff/concepts/.*\.html''',
  '''web/v8/.*\.html''',
  # Composer lock — содержит хеши/строки, иногда ловятся регулярками false-positive
  '''app/composer\.lock''',
  # Pest-тесты с фиктивными data-фикстурами (не реальные ПДн)
  '''app/tests/.*\.php''',
  # Database seeders с демо-данными (admin@demo.local + +7916123XXXX демо-телефоны)
  '''app/database/seeders/.*\.php''',
  # Audit-internal docs (findings/blocked/report/plan) — содержат демо-телефоны и
  # script-смешанные artifacts как finding'и для review (не реальные ПДн)
  '''docs/superpowers/audits/.*\.md''',
  '''docs/superpowers/plans/.*\.md''',
  # Mock-данные для UI-разводки фронтенда (фиктивные имена/телефоны)
  '''app/resources/js/composables/mockDeals\.ts''',
  # Vitest-тесты с assertion на mock-данные (mock-телефоны из mockDeals)
  '''app/tests/Frontend/.*\.(spec|test)\.ts''',
  # Settings-вкладки с фиктивными mock-данными (профиль/сессии — UI-разводка)
  '''app/resources/js/views/settings/.*\.vue'''
]
regexTarget = "match"
regexes = [
  # Маскированные ПДн (правило §5.1 правил Claude)
  '''\+7XXXXXXXXXX''',
  '''\+7\s\(\*{3}\)\s\*{3}-\*{2}-\d{2}''',
  '''\*{3}@\*{3}''',
  '''u\*{3}@d\*{3}''',
  # Шаблонные плейсхолдеры из шаблонов оферты/РКН/брендбука
  '''\{\{[a-z_]+\}\}''',
  '''\[ИНН\]''',
  '''\[ОГРН\]''',
  '''\[АДРЕС\]''',
  '''\[ФИО[^\]]*\]''',
  '''\[БАНК\]''',
  '''\[Р/С\]''',
  '''\[К/С\]''',
  '''\[БИК\]''',
  # Известные публичные реквизиты Yandex Cloud (публичная информация)
  '''7704458262''',
  # Стандартные плейсхолдеры для test/example email (не считаются ПДн)
  '''[a-zA-Z0-9._%+-]+@(?:example\.|test\.|localhost|.*\.local|.*\.test)[a-zA-Z0-9.-]*''',
  '''noreply@.*''',
  '''support@.*''',
  # Тестовые/демо-токены
  '''sk-test-[A-Za-z0-9]+''',
  '''pk_test_[A-Za-z0-9]+''',
  '''example_[a-z_]+_token''',
  # Известные publicly known keys из документации (для embed-примеров)
  '''xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx''',
  '''YOUR_TOKEN_HERE''',
  '''YOUR_API_KEY''',
  # Тестовые/демо-номера телефонов (не настоящие ПДн)
  '''(?:\+?7|8)\s?\(?9000\)?\s?[\s\-]?000[\s\-]?00[\s\-]?00''',
  '''(?:\+?7|8)\s?\(?900\)?\s?123[\s\-]?45[\s\-]?67''',
  '''(?:\+?7|8)\s?\(?XXX\)?\s?XXX[\s\-]?XX[\s\-]?XX''',
  '''79000000000''',
  '''79991234567''',
  '''74955551212''',
  '''89991234567''',
  # Plan 2: ABC-коды городов с тестовым tail "1234567" (PhonePrefixService docs/tests)
  '''7\d{3}1234567''',
  '''799912345678''',
  '''7999123456''',
  '''\+79991234567''',
  '''7 999 123 45 67''',
  # 12-значные номера-маски для скриншотов и тестов
  '''[78]\(?[*X]{3}\)?\s?[*X]{3}[\s\-]?[*X]{2}[\s\-]?[*X0-9]{2}'''
]
