package app import ( "fmt" "os" "strings" "time" ) func writeAutoloopLoginState(loginStateFile, state, email, msg string) { ts := time.Now().Format(time.RFC3339) payload := fmt.Sprintf(`{"ts":"%s","state":"%s","email":"%s","msg":"%s"}`, ts, escapeJSON(state), escapeJSON(email), escapeJSON(msg), ) _ = os.WriteFile(loginStateFile, []byte(payload), 0o644) } func isAutoloopConnected(out string) bool { low := strings.ToLower(out) return strings.Contains(low, "vpn is connected") || strings.Contains(low, "connected to") || strings.Contains(low, "after connect: connected") } func parseAutoloopEmail(text string) string { return autoloopEmailRe.FindString(text) } func isAutoloopLoginRequired(text string) bool { low := strings.ToLower(text) return strings.Contains(low, "please log in") || strings.Contains(low, "not logged in") || strings.Contains(low, "login required") || strings.Contains(low, "sign in") } func updateAutoloopLoginStateFromText( text string, writeState func(state, email, msg string), logLine func(msg string), ) { if writeState == nil { return } if isAutoloopLoginRequired(text) { writeState("no_login", "", "NOT LOGGED IN") if logLine != nil { logLine("login: NO (detected from output)") } return } if em := parseAutoloopEmail(text); em != "" { writeState("ok", em, "logged in") if logLine != nil { logLine("login: OK email=" + em) } return } low := strings.ToLower(text) if strings.Contains(low, "not logged in") || strings.Contains(low, "expired") || strings.Contains(low, "no active license") { writeState("no_login", "", "NOT LOGGED IN (license)") if logLine != nil { logLine("login: NO (license says not logged in)") } return } if strings.Contains(low, "license") && (strings.Contains(low, "active") || strings.Contains(low, "valid")) { writeState("ok", "", "logged in (license ok)") if logLine != nil { logLine("login: OK (license ok, email not found)") } return } } func escapeJSON(s string) string { s = strings.ReplaceAll(s, `\`, `\\`) s = strings.ReplaceAll(s, `"`, `\\"`) s = strings.ReplaceAll(s, "\n", "\\n") s = strings.ReplaceAll(s, "\r", "") return s }