90 lines
2.1 KiB
Go
90 lines
2.1 KiB
Go
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
|
|
}
|