Files
elmprodvpn/selective-vpn-api/app/autoloop_helpers_login.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
}