- Created a comprehensive runbook for emergency token rotation, detailing when to rotate, prerequisites, and step-by-step procedures.
- Included methods for generating secure tokens, updating configurations, and verifying new tokens.
- Added an automation script for token rotation to streamline the process.
- Implemented compliance checklist and troubleshooting sections for better guidance.
test: Implement E2E tests for emergency server and token functionality
- Added tests for the emergency server to ensure it operates independently of the main application.
- Verified that the emergency server can bypass security controls and reset security settings.
- Implemented tests for emergency token validation, rate limiting, and audit logging.
- Documented expected behaviors for emergency access and security enforcement.
refactor: Introduce security test fixtures for better test management
- Created a fixtures file to manage security-related test data and functions.
- Included helper functions for enabling/disabling security modules and testing emergency access.
- Improved test readability and maintainability by centralizing common logic.
test: Enhance emergency token tests for robustness and coverage
- Expanded tests to cover various scenarios including token validation, rate limiting, and idempotency.
- Ensured that emergency token functionality adheres to security best practices.
- Documented expected behaviors and outcomes for clarity in test results.
E2E Workflow Fixes:
Add frontend dependency installation step (missing npm ci in frontend/)
Remove incorrect working-directory from backend build step
Update Node.js version from v18 to v20 (dependency requirements)
Backend Coverage: 84.9% → 85.0% (20+ new test functions):
Access list service validation and templates
Backup service error handling and edge cases
Security audit logs and rule sets
Auth service edge cases and token validation
Certificate service upload and sync error paths
Frontend Coverage: 85.06% → 85.66% (27 new tests):
Tabs component accessibility and keyboard navigation
Plugins page status badges and error handling
SecurityHeaders CRUD operations and presets
API wrappers for credentials and encryption endpoints
E2E Infrastructure:
Enhanced global-setup with emergency security module reset
Added retry logic and verification for settings propagation
Known Issues:
19 E2E tests still failing (ACL blocking security APIs - Issue #16)
7 Plugins modal UI tests failing (non-critical)
To be addressed in follow-up PR
Fixes#550 E2E workflow failures
Related to #16 ACL implementation
The E2E workflow was failing during backend build because make build
was being executed from the backend/ directory, but the Makefile exists
at the root level.
Remove working-directory: backend from Build backend step
Allows make build to execute from root where Makefile is located
Verified with local test: frontend + backend build successfully
Related to PR #550 E2E workflow failures
The E2E workflow was failing during "Build frontend" because npm ci
was only run at root level. The frontend directory has its own
package.json with React, Tailwind, and other dependencies that were
never installed.
Add "Install frontend dependencies" step before build
Update Node.js version from 18 to 20 (required by markdownlint-cli2)
Fixes failing E2E tests in PR #550
The base tsconfig.json had types: ["vitest/globals", "@testing-library/jest-dom/vitest"]
which are devDependencies only installed during development. CI production
builds with npm ci --production don't include these, causing TS2688 errors.
Solution:
Remove types array from tsconfig.json (let TS auto-discover available types)
Simplify tsconfig.build.json to only exclude test files
Add triple-slash type references to test setup file
Add typecheck config to vitest.config.ts
This ensures:
Production builds work without devDependencies
Test files still have proper type definitions
No JSX.IntrinsicElements errors from missing React types
Set types to ["node"] instead of [] to maintain module resolution
Add explicit include: ["src"] to override parent's test file patterns
Add src/test-utils/** to exclusions to prevent test utilities in build
Fixes TS7026 "no interface JSX.IntrinsicElements" and module resolution
errors in CI production build.
GitHub Actions doesn't allow secrets context in step if expressions.
Add HAS_DOCKERHUB_TOKEN env var at job level that evaluates the secret
existence, then reference that env var in step conditions.
Fixes: "Unrecognized named-value: 'secrets'" workflow validation error
Override the types array in tsconfig.build.json to prevent
vitest and testing-library type definitions from being required
during production builds. These are devDependencies only needed
for test compilation.
Fixes CI E2E workflow failure: TS2688 "Cannot find type definition file"
Re-enable YAML validation to catch mistakes in workflow and compose
files. Remove empty exclude/association overrides that harm editor
performance.
Fixes review feedback on PR #550.
Replace misleading named volume with real tmpfs mount. E2E test data is
now truly ephemeral and fresh on every container start, with no state
leakage between test runs.
Fixes review feedback on PR #550.
Replace brittle stat/regex check with find -perm -0002 which correctly
handles directories with sticky/setgid bits (e.g., mode 1777).
Use chmod o-w instead of chmod 755 to preserve special bits when fixing
permissions, only removing the world-writable bit.
Fixes review feedback from Copilot on PR #550.
Publish Docker images to both Docker Hub (docker.io/wikid82/charon) and
GitHub Container Registry (ghcr.io/wikid82/charon) for maximum reach.
Add Docker Hub login with secret existence check for graceful fallback
Update docker/metadata-action to generate tags for both registries
Add Cosign keyless signing for both GHCR and Docker Hub images
Attach SBOM to Docker Hub via cosign attach sbom
Add Docker Hub signature verification to supply-chain-verify workflow
Update README with Docker Hub badges and dual registry examples
Update getting-started.md with both registry options
Supply chain security maintained: identical tags, signatures, and SBOMs
on both registries. PR images remain GHCR-only.
Add 404 status code to fallback conditions in hub_sync.go so the
integration gracefully falls back to GitHub mirror when primary
hub-data.crowdsec.net returns 404.
Add http.StatusNotFound to fetchIndexHTTPFromURL fallback
Add http.StatusNotFound to fetchWithLimitFromURL fallback
Update crowdsec_integration.sh to check hub availability
Skip hub preset tests gracefully when hub is unavailable
Fixes CI failure when CrowdSec Hub API is temporarily unavailable