Files
Charon/docs/reports/qa_crowdsec_lapi_auth_fix.md
GitHub Actions 3169b05156 fix: skip incomplete system log viewer tests
- Marked 12 tests as skip pending feature implementation
- Features tracked in GitHub issue #686 (system log viewer feature completion)
- Tests cover sorting by timestamp/level/method/URI/status, pagination controls, filtering by text/level, download functionality
- Unblocks Phase 2 at 91.7% pass rate to proceed to Phase 3 security enforcement validation
- TODO comments in code reference GitHub #686 for feature completion tracking
- Tests skipped: Pagination (3), Search/Filter (2), Download (2), Sorting (1), Log Display (4)
2026-02-09 21:55:55 +00:00

8.9 KiB

QA Report: CrowdSec LAPI Auth Fix & Translation Bug Fix

Date: 2026-02-04 Implementation: CrowdSec LAPI authentication key handling and i18n translation fixes Auditor: GitHub Copilot QA Agent


Executive Summary

Category Status Details
E2E Tests (Playwright) ⚠️ PARTIAL 174 passed, 4 failed, 26 skipped
Backend Coverage ⚠️ BELOW THRESHOLD 84.7% (minimum: 85%)
Frontend Coverage ⚠️ BELOW THRESHOLD 84.09% (minimum: 85%)
TypeScript Check PASS No type errors
Pre-commit Hooks ⚠️ PARTIAL 2 hooks modified files
Docker Image Security ⚠️ HIGH VULNS 0 Critical, 7 High
Implementation Focus Areas VERIFIED See detailed analysis below

Overall Verdict: ⚠️ CONDITIONAL PASS - Core implementation is secure and functional, but coverage thresholds and test failures require attention before merge.


1. Playwright E2E Tests

Test Execution Summary

Total Tests:        2901 (configured)
✅ Passed:          174 (91% of executed)
❌ Failed:          4
⏭️  Skipped:        26
⏸️  Did Not Run:    2697 (security teardown aborted remaining tests)
Duration:           4.7 minutes

Failed Tests (4)

Test File Failure Reason Priority
CrowdSec Config Import - Invalid YAML Syntax crowdsec-import.spec.ts:95 Expected 422, got 500 🟡 Medium
CrowdSec Config Import - Missing Required Fields crowdsec-import.spec.ts:128 Error message pattern mismatch 🟡 Medium
CrowdSec Config Import - Path Traversal crowdsec-import.spec.ts:333 Got "failed to create backup" instead of security error 🟠 High
Break Glass Recovery - Final Verification zzzz-break-glass-recovery.spec.ts:177 admin_whitelist is undefined 🟡 Medium

Remediation Required

  1. crowdsec-import.spec.ts:95 - Backend returns 500 for invalid YAML instead of 422. Either:

    • Fix backend to return 422 with proper error message
    • Update test expectation if 500 is intentional
  2. crowdsec-import.spec.ts:333 - Path traversal test receiving backup error:

    • Security concern: Path traversal should be blocked with explicit security error
    • Review ImportConfig handler for proper path validation
  3. zzzz-break-glass-recovery.spec.ts:177 - API response missing admin_whitelist field:

    • Check security status endpoint response schema

2. Backend Coverage Tests

Coverage: 84.7%
Threshold: 85.0%
Status: ⚠️ BELOW THRESHOLD (-0.3%)

All Tests Passed

  • No test failures in backend unit tests

Coverage Gap

  • Missing only 0.3% to meet threshold
  • Focus on uncovered critical paths if patches needed

3. Frontend Coverage Tests

Coverage: 84.09% statements
Threshold: 85.0%
Status: ⚠️ BELOW THRESHOLD (-0.91%)

Test Results

  • Passed: 1596 tests
  • Skipped: 90 tests
  • Errors: 270 unhandled rejection errors (jsdom/undici compatibility issue)

Low Coverage Files (Focus Areas)

File Coverage Issue
CrowdSecKeyWarning.tsx 31.42% New component - needs more tests
CrowdSecBouncerKeyDisplay.tsx 53.84% Related component
PermissionsPolicyBuilder.tsx 35% Complex component
SecurityHeaders.tsx 69.35% Page component
Security.tsx 72.22% Page component

Remediation

  • Add unit tests for CrowdSecKeyWarning.tsx to cover:
    • Loading state
    • Error handling for clipboard API
    • Dismiss functionality
    • Key display and copy

4. TypeScript Check

Status: ✅ PASS
Errors: 0

5. Pre-commit Hooks

Status: ⚠️ PARTIAL PASS

Results

Hook Status Notes
end-of-file-fixer ⚠️ Modified Fixed tests/etc/passwd
trim trailing whitespace Pass
check yaml Pass
check for added large files Pass
dockerfile validation Pass
Go Vet Pass
golangci-lint Pass
version check Pass
LFS check Pass
CodeQL DB check Pass
Frontend TypeScript ⚠️ Modified npm ci ran
Frontend Lint Pass

Action Required

  • Commit the auto-fixed files: tests/etc/passwd

6. Security Scans

Docker Image Scan (Grype)

Total Vulnerabilities: 409
🔴 Critical: 0
🟠 High: 7
🟡 Medium: 20
🟢 Low: 2
⚪ Negligible: 380

High Severity Vulnerabilities

CVE Package CVSS Fixed?
CVE-2025-13151 libtasn1-6@4.20.0-2 7.5 No fix
CVE-2025-15281 libc-bin@2.41-12 7.5 No fix
CVE-2025-15281 libc6@2.41-12 7.5 No fix
CVE-2026-0915 libc-bin@2.41-12 7.5 No fix
CVE-2026-0915 libc6@2.41-12 7.5 No fix
CVE-2026-0861 libc-bin@2.41-12 8.4 No fix
CVE-2026-0861 libc6@2.41-12 8.4 No fix

Assessment: All high vulnerabilities are in Debian base image system libraries (glibc, libtasn1). No fixes available upstream yet. These are:

  • Not directly exploitable in typical web application context
  • Will be patched when Debian releases updates
  • Tracked for monitoring

Recommendation: Accept for now, monitor for Debian security updates.


7. Implementation Focus Areas

7.1 /api/v1/crowdsec/key-status Endpoint Security

Status: SECURE

Findings:

  • Endpoint registered in RegisterRoutes() under protected router group (rg)
  • All routes in this handler require authentication via the rg (router group) middleware
  • No secrets exposed - the fullKey field is only returned when envKeyRejected is true (for user to copy to docker-compose)
  • Key masking implemented via maskAPIKey() function (first 4 + ... + last 4 chars)

Code Location: crowdsec_handler.go

7.2 CrowdSecKeyWarning Component Error Handling

Status: PROPER

Findings:

  • useQuery with retry: 1 prevents excessive retry loops
  • Clipboard API wrapped in try/catch with toast.error fallback
  • localStorage operations wrapped in try/catch with fallback
  • Returns null during loading/dismissed states (no flash of content)
  • Dismissal state persisted per-key (shows again if key changes)

Code Location: CrowdSecKeyWarning.tsx

Improvement Opportunity: Coverage is low (31.42%). Add unit tests.

7.3 Translation Files Consistency

Status: ALL LOCALES UPDATED

Verified Keys in All 5 Locales:

Locale security.crowdsec.keyWarning.* security.crowdsec.copyFailed
en
de
es
fr
zh

All required keys present:

  • keyWarning.title
  • keyWarning.description
  • keyWarning.copyButton
  • keyWarning.copied
  • keyWarning.envVarName
  • keyWarning.instructions
  • keyWarning.restartNote
  • copyFailed

8. Remediation Checklist

Required Before Merge

  • Review path traversal handling in CrowdSec import endpoint
  • Fix or update tests for CrowdSec import validation
  • Commit auto-fixed files from pre-commit hooks
  • Add tests for CrowdSecKeyWarning.tsx to improve coverage
  • Increase backend coverage by 0.3% to meet 85% threshold
  • Increase frontend coverage by 0.91% to meet 85% threshold
  • Monitor Debian security updates for glibc/libtasn1 patches
  • Investigate jsdom/undici compatibility errors in frontend tests

9. Test Commands Reference

# E2E Tests
.github/skills/scripts/skill-runner.sh docker-rebuild-e2e
npx playwright test --project=chromium --project=firefox --project=webkit

# Backend Coverage
./scripts/go-test-coverage.sh

# Frontend Coverage
./scripts/frontend-test-coverage.sh

# TypeScript Check
cd frontend && npm run type-check

# Pre-commit
pre-commit run --all-files

# Docker Image Scan
.github/skills/scripts/skill-runner.sh security-scan-docker-image

10. Conclusion

The CrowdSec LAPI auth fix and translation implementation is functionally correct and secure:

  1. API endpoint is properly authenticated
  2. No secrets exposed inappropriately
  3. Error handling is graceful
  4. All 5 translation locales are consistent

Blocking issues:

  • 4 E2E test failures (3 related to CrowdSec import validation, 1 to break-glass recovery)
  • Path traversal test failure warrants security review

Non-blocking concerns:

  • Coverage slightly below threshold (fixable with focused tests)
  • High severity vulnerabilities in base image (no fixes available)

Recommendation: Address the blocking test failures and commit pre-commit fixes before merging.


Report Generated: 2026-02-04 Report Version: 1.0 QA Engineer: GitHub Copilot (QA Security Mode)