195 Commits

Author SHA1 Message Date
salvacybersec
3872240e8a feat(phase-18): embedded web dashboard with chi + htmx + REST API + SSE
pkg/web: chi v5 server with go:embed static assets, HTML templates,
14 REST API endpoints (/api/v1/*), SSE hub for live scan/recon progress,
optional basic/token auth middleware.

cmd/serve.go: keyhunter serve [--telegram] [--port=8080] starts web
dashboard + optional Telegram bot.
2026-04-06 18:11:33 +03:00
salvacybersec
bb9ef17518 merge: phase 18 API+SSE 2026-04-06 18:08:52 +03:00
salvacybersec
d557c7303d feat(18-02): SSE hub for live scan/recon progress streaming
- SSEHub with Subscribe/Unsubscribe/Broadcast lifecycle
- Non-blocking broadcast with buffered channels (cap 32)
- SSE handlers for /api/v1/scan/progress and /api/v1/recon/progress
- Proper text/event-stream headers and SSE wire format
- 7 passing tests covering hub lifecycle, broadcast, and HTTP handler
2026-04-06 18:06:35 +03:00
salvacybersec
76601b11b5 feat(18-02): REST API handlers for /api/v1/* endpoints
- Stats, keys, providers, scan, recon, dorks, config endpoints
- JSON response wrappers with proper tags for all entities
- Filtering, pagination, 404/204/202 status codes
- SSE hub stub (full impl in task 2)
- Resolved merge conflict in schema.sql
- 16 passing tests covering all endpoints
2026-04-06 18:05:39 +03:00
salvacybersec
268a769efb feat(18-01): implement chi server, auth middleware, overview handler
- Server struct with chi router, embedded template parsing, static file serving
- AuthMiddleware supports Basic and Bearer token with constant-time comparison
- Overview handler renders stats from providers/recon/storage when available
- Nil-safe: works with zero config (shows zeroes, no DB required)
- All 7 tests pass
2026-04-06 18:02:41 +03:00
salvacybersec
3541c82448 test(18-01): add failing tests for web server, auth middleware, overview handler
- Test overview returns 200 with KeyHunter in body
- Test static asset serving for htmx.min.js
- Test auth returns 401 when configured but no credentials
- Test basic auth and bearer token pass through
- Test overview shows stat cards
2026-04-06 18:02:04 +03:00
salvacybersec
dd2c8c5586 feat(18-01): chi v5 dependency, go:embed static assets, HTML layout and overview templates
- Add chi v5.2.5 to go.mod
- Vendor htmx v2.0.4 minified JS in pkg/web/static/
- Create go:embed directives for static/ and templates/
- Create layout.html with nav bar and Tailwind CDN
- Create overview.html with stat cards and findings table
2026-04-06 18:01:37 +03:00
salvacybersec
8dd051feb0 merge: phase 17 wave 3 CLI wiring 2026-04-06 17:48:25 +03:00
salvacybersec
292ec247fe feat(17-05): implement serve and schedule commands replacing stubs
- cmd/serve.go: starts scheduler, optionally starts Telegram bot with --telegram flag
- cmd/schedule.go: add/list/remove/run subcommands for scheduled scan job CRUD
- pkg/scheduler/: gocron v2 based scheduler with DB-backed jobs and scan execution
- pkg/storage/scheduled_jobs.go: scheduled_jobs table CRUD with tests
- Remove serve and schedule stubs from cmd/stubs.go

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 17:46:24 +03:00
salvacybersec
41a9ba2a19 fix(phase-17): align bot handler signatures and resolve merge conflicts 2026-04-06 17:39:36 +03:00
salvacybersec
230dcdc98a merge: phase 17 wave 2 2026-04-06 17:36:54 +03:00
salvacybersec
52988a7059 merge: phase 17 wave 2 2026-04-06 17:36:53 +03:00
salvacybersec
202473a799 test(17-03): add unit tests for bot command handlers
- Test extractArg parsing for all command formats
- Test isPrivateChat detection (private vs group vs supergroup)
- Test commandHelp contains all 8 commands with descriptions
- Test storageToEngine conversion fidelity
- Test New constructor wires startedAt correctly
2026-04-06 17:35:23 +03:00
salvacybersec
9ad58534fc feat(17-03): implement Telegram bot command handlers
- Add telego v1.8.0 dependency for Telegram Bot API
- Create pkg/bot package with Bot struct holding engine, verifier, recon, storage, registry deps
- Implement 8 command handlers: /help, /scan, /verify, /recon, /status, /stats, /providers, /key
- /key enforced private-chat-only for security (never exposes unmasked keys in groups)
- All other commands use masked keys only
- Handler registration via telego's BotHandler with CommandEqual predicates
2026-04-06 17:34:44 +03:00
salvacybersec
2643927821 feat(17-04): implement notification dispatcher with tests
- NotifyNewFindings sends to all subscribers on scan completion with findings
- NotifyFinding sends real-time individual finding notifications (always masked)
- formatNotification/formatErrorNotification/formatFindingNotification helpers
- Zero findings = no notification; errors get separate error format
- Per-subscriber error handling: log and continue on individual send failures
- 6 tests pass: subscribe DB round-trip, no-subscriber no-op, zero-finding skip,
  message format validation, error format, masked key enforcement

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 17:33:32 +03:00
salvacybersec
f7162aa34a test(17-04): add failing tests for notification dispatcher
- TestSubscribeUnsubscribe: DB round-trip for add/remove subscriber
- TestNotifyNewFindings_NoSubscribers: zero messages with empty table
- TestNotifyNewFindings_ZeroFindings: no notification for 0 findings
- TestFormatNotification: message contains job name, count, duration
- TestFormatFindingNotification: masked key, never full key

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 17:32:58 +03:00
salvacybersec
d671695f65 feat(17-04): implement /subscribe and /unsubscribe handlers
- handleSubscribe checks IsSubscribed, calls AddSubscriber with chat ID and username
- handleUnsubscribe calls RemoveSubscriber, reports rows affected
- Both use storage layer from Plan 17-02
- Removed stub implementations from bot.go

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 17:32:18 +03:00
salvacybersec
6e0024daba merge: phase 17 wave 1 2026-04-06 17:29:18 +03:00
salvacybersec
2d51d31b8a test(17-01): add unit tests for Bot creation and auth filtering
- TestNew_EmptyToken: verify empty token returns error from telego
- TestIsAllowed_EmptyList: verify open access when no restrictions set
- TestIsAllowed_RestrictedList: verify allowlist filtering
- TestCheckRateLimit: verify cooldown enforcement and per-user isolation
2026-04-06 17:28:05 +03:00
salvacybersec
0d00215a26 feat(17-01): add telego dependency and create Bot package skeleton
- Add telego v1.8.0 as direct dependency for Telegram bot
- Create pkg/bot/bot.go with Bot struct, Config, New, Start, Stop
- Implement isAllowed chat authorization and per-user rate limiting
- Add command dispatch with handler stubs for all 10 commands
- Long polling lifecycle with context cancellation for graceful shutdown
2026-04-06 17:27:41 +03:00
salvacybersec
c71faa97f5 feat(17-02): implement scheduler package with gocron wrapper and job lifecycle
- Scheduler wraps gocron with Start/Stop lifecycle
- Start loads enabled jobs from DB and registers cron schedules
- AddJob/RemoveJob persist to DB and sync with gocron
- RunJob for manual trigger with OnComplete callback
- JobResult struct for notification bridge
- Promote gocron/v2 v2.19.1 to direct dependency
2026-04-06 17:27:00 +03:00
salvacybersec
89cc133982 test(17-02): add failing tests for scheduler package
- Storage round-trip test for SaveScheduledJob/ListScheduledJobs
- Subscriber round-trip test for Add/Remove/List/IsSubscribed
- Scheduler Start loads enabled jobs from DB
- Scheduler AddJob/RemoveJob persists and registers
- Scheduler RunJob manual trigger with callback
2026-04-06 17:26:20 +03:00
salvacybersec
c8f7592b73 feat(17-02): add gocron dependency, subscribers and scheduled_jobs tables with CRUD
- Add gocron/v2 v2.19.1 as direct dependency
- Append subscribers and scheduled_jobs CREATE TABLE to schema.sql
- Implement full subscriber CRUD (Add/Remove/List/IsSubscribed)
- Implement full scheduled job CRUD (Save/List/Get/Delete/UpdateLastRun/SetEnabled)
2026-04-06 17:25:43 +03:00
salvacybersec
6eb5b69845 feat(phase-16): wire all 9 Phase 16 sources + VT/IX/ST API keys 2026-04-06 16:48:35 +03:00
salvacybersec
6bcb011cda merge: phase 16 resolve conflicts 2026-04-06 16:47:10 +03:00
salvacybersec
a8bcb44912 merge: phase 16 resolve conflicts 2026-04-06 16:47:10 +03:00
salvacybersec
a195ef33a0 feat(16-02): add SecurityTrails source and wire all three Phase 16-02 sources
- SecurityTrailsSource enumerates subdomains via API, probes config endpoints
- Credential-gated via SECURITYTRAILS_API_KEY env var
- RegisterAll extended to 70 sources (67 Phase 10-15 + 3 Phase 16)
- cmd/recon.go wires SecurityTrails API key from env/viper
2026-04-06 16:46:09 +03:00
salvacybersec
35fa4ad174 feat(16-01): add URLhaus recon source
- URLhausSource searches abuse.ch URLhaus API for malicious URLs with API keys
- Credentialless source (Enabled always true, no API key needed)
- Tag lookup with payload endpoint fallback
- ciLogKeyPattern used for content matching
- Tests with httptest mocks for happy path and empty results

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:45:23 +03:00
salvacybersec
297ad3dc2b feat(16-03): add RapidAPI recon source
- RapidAPISource searches public API listings for leaked keys
- Scrapes HTML search pages with ciLogKeyPattern matching
- Credentialless, httptest-based tests
2026-04-06 16:44:57 +03:00
salvacybersec
edde02f3a2 feat(16-03): add Postman and SwaggerHub recon sources
- PostmanSource searches public collections via internal search proxy
- SwaggerHubSource searches published API specs for embedded keys
- Both credentialless, use BuildQueries + ciLogKeyPattern
- httptest-based tests for both sources
2026-04-06 16:44:47 +03:00
salvacybersec
e02bad69ba feat(16-01): add VirusTotal and IntelligenceX recon sources
- VirusTotalSource searches VT Intelligence API for files containing API keys
- IntelligenceXSource searches IX archive with 3-step flow (search/results/read)
- Both credential-gated (Enabled returns false without API key)
- ciLogKeyPattern used for content matching
- Tests with httptest mocks for happy path and empty results

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:44:41 +03:00
salvacybersec
09a8d4cb70 feat(16-02): add APKMirror and crt.sh ReconSource modules
- APKMirrorSource searches APK metadata pages for key patterns
- CrtShSource discovers subdomains via CT logs and probes config endpoints
- Both credentialless, emit findings on ciLogKeyPattern match
2026-04-06 16:44:37 +03:00
salvacybersec
83a1e83ae5 fix(phase-15): update register tests for 67 total sources (Phase 10-15) 2026-04-06 16:37:48 +03:00
salvacybersec
d02cdcc7e0 feat(15-03): add Grafana and Sentry ReconSource implementations
- GrafanaSource: search dashboards via /api/search, fetch detail via /api/dashboards/uid
- SentrySource: search issues via /api/0/issues, fetch events for key detection
- Register all 5 log aggregator sources in RegisterAll (67 sources total)
- Tests use httptest mocks for each API endpoint
2026-04-06 16:31:14 +03:00
salvacybersec
bc63ca1f2f feat(15-03): add Elasticsearch, Kibana, and Splunk ReconSource implementations
- ElasticsearchSource: POST _search API with query_string, parse hits._source
- KibanaSource: GET saved_objects/_find API with kbn-xsrf header
- SplunkSource: GET search/jobs/export API with newline-delimited JSON parsing
- All sources use ciLogKeyPattern for key detection
- Tests use httptest mocks for each API endpoint
2026-04-06 16:31:05 +03:00
salvacybersec
fcc1a769c5 feat(15-01): add Discord, Slack, DevTo recon sources and wire all six
- DiscordSource uses dorking approach against configurable search endpoint
- SlackSource uses dorking against slack-archive indexers
- DevToSource searches dev.to API articles list + detail for body_markdown
- RegisterAll extended to include all 6 Phase 15 forum sources
- All credentialless, use ciLogKeyPattern for key detection
2026-04-06 16:29:52 +03:00
salvacybersec
282c145a43 feat(15-01): add StackOverflow, Reddit, HackerNews recon sources
- StackOverflowSource searches SE API v2.3 search/excerpts endpoint
- RedditSource searches Reddit JSON API with custom User-Agent
- HackerNewsSource searches Algolia HN API for comments
- All credentialless, use ciLogKeyPattern for key detection
- Tests use httptest mock servers with API key patterns
2026-04-06 16:28:23 +03:00
salvacybersec
37393a9b5f feat(15-02): wire Trello, Notion, Confluence, GoogleDocs into RegisterAll
- RegisterAll extended to 56 sources (52 Phase 10-14 + 4 Phase 15 collab)
- All four sources credentialless, no new SourcesConfig fields needed
2026-04-06 13:50:56 +03:00
salvacybersec
5d568333c7 feat(15-02): add Confluence and GoogleDocs ReconSource implementations
- ConfluenceSource searches exposed instances via /rest/api/content/search CQL
- GoogleDocsSource uses dorking + /export?format=txt for plain-text scanning
- HTML tag stripping for Confluence storage format
- Both credentialless, tests with httptest mocks confirm findings
2026-04-06 13:50:14 +03:00
salvacybersec
7bb614678d feat(15-02): add Trello and Notion ReconSource implementations
- TrelloSource searches public Trello boards via /1/search API
- NotionSource uses dorking to discover and scrape public Notion pages
- Both credentialless, follow established Phase 10 pattern
- Tests with httptest mocks confirm Sweep emits findings
2026-04-06 13:50:04 +03:00
salvacybersec
4246db8294 fix: resolve Phase 14 merge conflicts across CI/CD, archive, and frontend sources 2026-04-06 13:42:54 +03:00
salvacybersec
27624e0ec7 merge: phase 14-04 register wiring 2026-04-06 13:39:32 +03:00
salvacybersec
7ef6c2ac34 feat(14-04): wire all 12 Phase 14 sources in RegisterAll (45 -> 52 total)
- Add CircleCIToken to SourcesConfig with env/viper lookup in cmd/recon.go
- Register 7 new sources: travisci, ghactions, circleci, jenkins, wayback, commoncrawl, jsbundle
- Update register_test.go expectations from 45 to 52 sources
- Add integration test handlers + registrations for all 12 Phase 14 sources
- Integration test now validates 52 sources end-to-end
2026-04-06 13:34:18 +03:00
salvacybersec
169b80b3bc feat(14-04): implement 7 Phase 14 sources (CI/CD, archives, JS bundles)
- TravisCISource: scrapes public Travis CI build logs for API key leaks
- GitHubActionsSource: searches Actions workflow logs (requires GitHub token)
- CircleCISource: scrapes CircleCI pipeline logs (requires CircleCI token)
- JenkinsSource: scrapes public Jenkins console output for leaked secrets
- WaybackMachineSource: searches Wayback Machine CDX for archived key leaks
- CommonCrawlSource: searches Common Crawl index for exposed pages
- JSBundleSource: probes JS bundles for embedded API key literals
2026-04-06 13:34:09 +03:00
salvacybersec
3a4e9c11bf fix: add CircleCIToken to SourcesConfig 2026-04-06 13:22:25 +03:00
salvacybersec
095b90ec07 merge: phase 14-03 frontend leaks 2026-04-06 13:21:39 +03:00
salvacybersec
aeebf37174 merge: phase 14 wave 1 all conflicts resolved 2026-04-06 13:21:32 +03:00
salvacybersec
0a8be81f0c feat(14-03): wire 5 frontend leak sources in RegisterAll (40 -> 45 sources)
- Register SourceMapSource, WebpackSource, EnvLeakSource, SwaggerSource, DeployPreviewSource
- Update test expectations from 40 to 45 sources
2026-04-06 13:19:34 +03:00
salvacybersec
7d8a4182d7 feat(14-03): implement SwaggerSource and DeployPreviewSource with tests
- SwaggerSource probes OpenAPI doc endpoints for API keys in example/default fields
- DeployPreviewSource scans Vercel/Netlify preview URLs for __NEXT_DATA__ env leaks
- Both implement ReconSource, credentialless, with httptest-based tests
2026-04-06 13:18:18 +03:00
salvacybersec
e0f267f7bf feat(14-01): add 5 CI/CD log sources (GitHubActions, TravisCI, CircleCI, Jenkins, GitLabCI)
- GitHubActionsSource: searches GitHub code search for workflow files with provider keywords (token-gated)
- TravisCISource: queries Travis CI v3 API for public build logs (credentialless)
- CircleCISource: queries CircleCI v2 pipeline API for build pipelines (token-gated)
- JenkinsSource: queries open Jenkins /api/json for job build consoles (credentialless)
- GitLabCISource: queries GitLab projects API for CI-enabled projects (token-gated)
- RegisterAll extended to 45 sources (40 Phase 10-13 + 5 Phase 14)
- Integration test updated with fixtures for all 5 new sources
- cmd/recon.go wires CIRCLECI_TOKEN env var
2026-04-06 13:17:31 +03:00