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
This commit is contained in:
80
pkg/dorks/schema.go
Normal file
80
pkg/dorks/schema.go
Normal file
@@ -0,0 +1,80 @@
|
||||
// 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
|
||||
}
|
||||
Reference in New Issue
Block a user