f8f5f2f3f4
CI / lint (pull_request) Successful in 59s
CI / typecheck (pull_request) Successful in 1m8s
CI / push-validation (pull_request) Successful in 38s
CI / build (pull_request) Successful in 52s
CI / helm (pull_request) Successful in 56s
CI / security (pull_request) Successful in 1m18s
CI / quality (pull_request) Successful in 1m14s
CI / unit_tests (pull_request) Successful in 5m40s
CI / docker (pull_request) Successful in 1m36s
CI / integration_tests (pull_request) Successful in 8m59s
CI / coverage (pull_request) Successful in 9m27s
CI / status-check (pull_request) Successful in 4s
Add two BDD scenarios that mock os.walk and the time module so the outer-loop and inner-file-loop timeout-exceeded branches in detect_directory_languages() are deterministically exercised. Closes the diff-coverage gap on src/cleveragents/lsp/discovery.py lines 250-257 (outer-loop timeout warning + break) and 284-291 (inner-loop timeout warning + break) which the previous DoS protection scenarios did not reach. Refs: #7161
104 lines
4.2 KiB
Gherkin
104 lines
4.2 KiB
Gherkin
@tdd_issue
|
|
@tdd_issue_7161
|
|
Feature: LSP language discovery DoS protection
|
|
Prevent resource exhaustion attacks via directory traversal limits.
|
|
Issue #7161: Resource exhaustion DoS in LSP language discovery.
|
|
|
|
# ------------------------------------------------------------------
|
|
# Depth limit protection (prevents deep nesting attacks)
|
|
# ------------------------------------------------------------------
|
|
|
|
@tdd_issue_7161
|
|
Scenario: detect_directory_languages respects max_depth limit
|
|
Given ldos a LanguageDiscovery instance
|
|
And ldos a mock directory tree with depth 10
|
|
When ldos I detect directory languages with max_depth 5
|
|
Then ldos the result is a list
|
|
|
|
@tdd_issue_7161
|
|
Scenario: detect_directory_languages allows traversal within max_depth
|
|
Given ldos a LanguageDiscovery instance
|
|
And ldos a mock directory tree with depth 3
|
|
When ldos I detect directory languages with max_depth 5
|
|
Then ldos the result is a list
|
|
|
|
# ------------------------------------------------------------------
|
|
# File count limit protection (prevents wide directory attacks)
|
|
# ------------------------------------------------------------------
|
|
|
|
@tdd_issue_7161
|
|
Scenario: detect_directory_languages respects max_files limit
|
|
Given ldos a LanguageDiscovery instance
|
|
And ldos a mock directory with 1000 files
|
|
When ldos I detect directory languages with max_files 100
|
|
Then ldos the result is a list
|
|
|
|
@tdd_issue_7161
|
|
Scenario: detect_directory_languages allows processing within max_files
|
|
Given ldos a LanguageDiscovery instance
|
|
And ldos a mock directory with 50 files
|
|
When ldos I detect directory languages with max_files 100
|
|
Then ldos the result is a list
|
|
|
|
# ------------------------------------------------------------------
|
|
# Symlink loop protection (prevents circular traversal)
|
|
# ------------------------------------------------------------------
|
|
|
|
@tdd_issue_7161
|
|
Scenario: detect_directory_languages does not follow symlinks
|
|
Given ldos a LanguageDiscovery instance
|
|
And ldos a mock directory with symlinks
|
|
When ldos I detect directory languages
|
|
Then ldos the result is a list
|
|
|
|
# ------------------------------------------------------------------
|
|
# Parameter validation
|
|
# ------------------------------------------------------------------
|
|
|
|
@tdd_issue_7161
|
|
Scenario: detect_directory_languages rejects invalid max_depth
|
|
Given ldos a LanguageDiscovery instance
|
|
When ldos I detect directory languages with max_depth 0
|
|
Then ldos a ValueError is raised
|
|
|
|
@tdd_issue_7161
|
|
Scenario: detect_directory_languages rejects invalid max_files
|
|
Given ldos a LanguageDiscovery instance
|
|
When ldos I detect directory languages with max_files 0
|
|
Then ldos a ValueError is raised
|
|
|
|
@tdd_issue_7161
|
|
Scenario: detect_directory_languages rejects invalid timeout
|
|
Given ldos a LanguageDiscovery instance
|
|
When ldos I detect directory languages with timeout 0.0
|
|
Then ldos a ValueError is raised
|
|
|
|
# ------------------------------------------------------------------
|
|
# Default parameter values
|
|
# ------------------------------------------------------------------
|
|
|
|
@tdd_issue_7161
|
|
Scenario: detect_directory_languages uses default limits
|
|
Given ldos a LanguageDiscovery instance
|
|
And ldos a mock directory with 100 files
|
|
When ldos I detect directory languages without explicit limits
|
|
Then ldos the result is a list
|
|
|
|
# ------------------------------------------------------------------
|
|
# Timeout enforcement (prevents indefinite traversal)
|
|
# ------------------------------------------------------------------
|
|
|
|
@tdd_issue_7161
|
|
Scenario: detect_directory_languages enforces timeout in outer walk loop
|
|
Given ldos a LanguageDiscovery instance
|
|
And ldos a mock directory and a clock that exceeds timeout immediately
|
|
When ldos I detect directory languages without explicit limits
|
|
Then ldos the result is a list
|
|
|
|
@tdd_issue_7161
|
|
Scenario: detect_directory_languages enforces timeout during file iteration
|
|
Given ldos a LanguageDiscovery instance
|
|
And ldos a mock directory and a clock that exceeds timeout after first file
|
|
When ldos I detect directory languages without explicit limits
|
|
Then ldos the result is a list
|