# Gitleaks Configuration
# https://github.com/gitleaks/gitleaks
#
# This configuration extends the default rules with project-specific settings.

title = "FreeCAD MCP Gitleaks Configuration"

[extend]
# Extend the default gitleaks configuration
useDefault = true

# ============================================================================
# Custom Rules
# ============================================================================

[[rules]]
id = "freecad-api-key"
description = "FreeCAD or related API key"
regex = '''(?i)(freecad|fcstd|fc)[-_]?(api)?[-_]?(key|token|secret)[\s]*[=:]\s*['"]?([a-zA-Z0-9_\-]{16,})['"]?'''
keywords = ["freecad", "fcstd"]

[[rules]]
id = "generic-api-key-assignment"
description = "Generic API key assignment in code"
regex = '''(?i)(api[_-]?key|apikey|api[_-]?secret|api[_-]?token)[\s]*[=:]\s*['"]([a-zA-Z0-9_\-]{20,})['"]'''
keywords = ["api_key", "apikey", "api-key", "api_secret", "api_token"]

[[rules]]
id = "jwt-token"
description = "JSON Web Token"
regex = '''eyJ[a-zA-Z0-9_-]*\.eyJ[a-zA-Z0-9_-]*\.[a-zA-Z0-9_-]*'''
keywords = ["eyJ"]

[[rules]]
id = "base64-encoded-secret"
description = "Base64 encoded secret (high entropy)"
regex = '''(?i)(secret|password|token|key)[\s]*[=:]\s*['"]([A-Za-z0-9+/]{40,}={0,2})['"]'''
keywords = ["secret", "password", "token", "key"]
entropy = 4.0

[[rules]]
id = "connection-string"
description = "Database connection string"
regex = '''(?i)(mongodb|postgres|mysql|redis|amqp|mssql)://[^\s'"]+'''
keywords = ["mongodb://", "postgres://", "mysql://", "redis://", "amqp://", "mssql://"]

[[rules]]
id = "private-key-header"
description = "Private key file content"
regex = '''-----BEGIN (RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY( BLOCK)?-----'''
keywords = ["BEGIN", "PRIVATE KEY"]

[[rules]]
id = "oauth-token"
description = "OAuth access or refresh token"
regex = '''(?i)(oauth|access|refresh)[-_]?token[\s]*[=:]\s*['"]([a-zA-Z0-9_\-\.]{20,})['"]'''
keywords = ["oauth", "access_token", "refresh_token"]

# ============================================================================
# Allowlist - Paths, Commits, and Patterns to Ignore
# ============================================================================

[allowlist]
description = "Global allowlist"

# Paths to ignore
paths = [
    '''\.gitleaks\.toml$''',
    '''\.pre-commit-config\.yaml$''',
    '''(^|/)tests?/''',
    '''(^|/)test_.*\.py$''',
    '''(^|/).*_test\.py$''',
    '''(^|/)conftest\.py$''',
    '''(^|/)fixtures/''',
    '''(^|/)mocks?/''',
    '''\.md$''',             # Documentation files
    '''go\.sum$''',
    '''package-lock\.json$''',
    '''yarn\.lock$''',
    '''uv\.lock$''',
    '''poetry\.lock$''',
]

# Regex patterns to ignore (for false positives)
regexes = [
    # Example/placeholder values
    '''(?i)(example|sample|placeholder|dummy|fake|test|mock)''',
    # Documentation patterns
    '''your[-_]?(api)?[-_]?(key|token|secret)[-_]?here''',
    '''<.*?(key|token|secret|password).*?>''',
    '''xxx+''',
    '''CHANGE[-_]?ME''',
    # Common false positives
    '''(?i)public[-_]?key''',  # Public keys are not secrets
    '''sk-\.\.\.''',           # Truncated keys in docs
]

# Specific strings to ignore
stopwords = [
    "AKIAIOSFODNN7EXAMPLE",  # AWS example key
    "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",  # AWS example secret
    "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",  # GitHub placeholder
]

# ============================================================================
# Rule-specific Allowlists
# ============================================================================

# Allow specific patterns for certain rules
[[rules]]
id = "generic-api-key"
[rules.allowlist]
regexes = [
    '''(?i)example''',
    '''(?i)placeholder''',
    '''(?i)your[-_]key[-_]here''',
]

# ============================================================================
# Entropy Settings
# ============================================================================

# Minimum entropy threshold for entropy-based detection
# Higher values = fewer false positives but may miss some secrets
# Default is 3.5, we use 4.0 for fewer false positives
