platform: modularize api/gui, add docs-tests-web foundation, and refresh root config
This commit is contained in:
89
selective-vpn-api/app/autoloop_helpers_login.go
Normal file
89
selective-vpn-api/app/autoloop_helpers_login.go
Normal file
@@ -0,0 +1,89 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user