package adobe import ( "encoding/base64" "encoding/hex" "encoding/json" "os" "strconv" "strings" "time" "github.com/google/uuid" ) const ( defaultUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36" defaultSecCHUA = `"Not:A-Brand";v="99", "Google Chrome";v="145", "Chromium";v="145"` ) func stringValue(v any) string { switch x := v.(type) { case string: return x case nil: return "" default: return strings.TrimSpace(strings.ReplaceAll(toJSONScalar(x), "\n", " ")) } } func toJSONScalar(v any) string { b, err := json.Marshal(v) if err != nil { return "" } return string(b) } func intValue(v any) int { switch x := v.(type) { case int: return x case int64: return int(x) case float64: return int(x) case float32: return int(x) case json.Number: n, _ := x.Int64() return int(n) case string: n, _ := strconv.Atoi(strings.TrimSpace(x)) return n default: return 0 } } func defaultString(v, fallback string) string { v = strings.TrimSpace(v) if v == "" { return fallback } return v } func itoa(v int) string { return strconv.Itoa(v) } func decodeJWTPayload(token string) map[string]any { parts := strings.Split(strings.TrimSpace(token), ".") if len(parts) < 2 { return map[string]any{} } raw, err := base64.RawURLEncoding.DecodeString(parts[1]) if err != nil { return map[string]any{} } var out map[string]any if err := json.Unmarshal(raw, &out); err != nil { return map[string]any{} } return out } func buildARPSessionID() string { raw := map[string]any{ "sid": uuid.NewString(), "ftr": randomHex(16) + "_" + strconv.FormatInt(time.Now().UnixMilli(), 10) + "_" + strconv.Itoa(os.Getpid()) + "_dUAL43-mnts-ants-d4_31ck__tt", } b, _ := json.Marshal(raw) return base64.StdEncoding.EncodeToString(b) } func randomHex(n int) string { if n <= 0 { return "" } buf := make([]byte, n) now := time.Now().UnixNano() for i := range buf { buf[i] = byte(now >> ((i % 8) * 8)) } return hex.EncodeToString(buf) } func intOrNil(v any) any { switch x := v.(type) { case nil: return nil case int: return x case int64: return int(x) case float64: return int(x) case float32: return int(x) case json.Number: n, err := x.Int64() if err != nil { return nil } return int(n) case string: n, err := strconv.Atoi(strings.TrimSpace(x)) if err != nil { return nil } return n default: return nil } } func emptyStringNil(v string) any { v = strings.TrimSpace(v) if v == "" { return nil } return v }