Files
keyhunter/pkg/dorks/schema.go
salvacybersec fd6efbb4c2 feat(08-01): add pkg/dorks foundation (schema, loader, registry, executor)
- Dork schema with Validate() mirroring provider YAML pattern
- go:embed loader tolerating empty definitions tree
- Registry with List/Get/Stats/ListBySource/ListByCategory
- Executor interface + Runner dispatch + ErrSourceNotImplemented
- Placeholder definitions/.gitkeep and repo-root dorks/.gitkeep
- Full unit test coverage for registry, validation, and runner dispatch
2026-04-06 00:15:32 +03:00

81 lines
2.2 KiB
Go

// Package dorks provides YAML-embedded dork definitions and per-source
// executors for the KeyHunter dork engine. The package mirrors the
// pkg/providers pattern: dorks are authored as YAML files under
// pkg/dorks/definitions/{source}/*.yaml and compiled into the binary via
// go:embed, then loaded into an in-memory Registry at startup.
package dorks
import (
"fmt"
"strings"
)
// Dork is a single dork definition loaded from a YAML file under
// pkg/dorks/definitions/{source}/*.yaml.
type Dork struct {
ID string `yaml:"id"`
Name string `yaml:"name"`
Source string `yaml:"source"` // github|google|shodan|censys|zoomeye|fofa|gitlab|bing
Category string `yaml:"category"` // frontier|specialized|infrastructure|emerging|enterprise
Query string `yaml:"query"`
Description string `yaml:"description"`
Tags []string `yaml:"tags"`
}
// ValidSources enumerates the dork source backends recognised by the engine.
// Executors for most of these arrive in later phases (OSINT 9-16); the
// foundation plan only wires the GitHub executor live.
var ValidSources = []string{
"github",
"google",
"shodan",
"censys",
"zoomeye",
"fofa",
"gitlab",
"bing",
}
// ValidCategories enumerates the dork taxonomy buckets used for filtering.
var ValidCategories = []string{
"frontier",
"specialized",
"infrastructure",
"emerging",
"enterprise",
}
// Validate returns a non-nil error when the dork is missing required fields
// or declares an unknown source.
func (d Dork) Validate() error {
if strings.TrimSpace(d.ID) == "" {
return fmt.Errorf("dork: id is required")
}
if strings.TrimSpace(d.Source) == "" {
return fmt.Errorf("dork %q: source is required", d.ID)
}
if strings.TrimSpace(d.Query) == "" {
return fmt.Errorf("dork %q: query is required", d.ID)
}
if !contains(ValidSources, d.Source) {
return fmt.Errorf("dork %q: source %q is not one of %v", d.ID, d.Source, ValidSources)
}
return nil
}
// Stats holds aggregate counts over a Registry, returned by Registry.Stats.
type Stats struct {
Total int
BySource map[string]int
ByCategory map[string]int
}
func contains(haystack []string, needle string) bool {
for _, h := range haystack {
if h == needle {
return true
}
}
return false
}