account_protection_runtime.go 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package service
  2. import (
  3. "crypto/sha256"
  4. "fmt"
  5. "time"
  6. "github.com/Wei-Shaw/sub2api/internal/config"
  7. )
  8. // Safe diagnostic metadata: never include credentials, identity seeds or URLs
  9. // containing proxy authentication. This is a computed plan, not a handshake.
  10. type ProtectionRuntimeState struct {
  11. IntegrityMode string `json:"integrity_mode"`
  12. RequestedModel string `json:"requested_model,omitempty"`
  13. Strategy string `json:"strategy"`
  14. PolicyVersion int `json:"policy_version"`
  15. IdentityMode string `json:"identity_mode"`
  16. ConfiguredTLS string `json:"configured_tls"`
  17. EffectiveTLS string `json:"effective_tls"`
  18. TLSReason string `json:"tls_reason,omitempty"`
  19. Observed bool `json:"observed"`
  20. Concurrency int `json:"concurrency"`
  21. ProxyID *int64 `json:"proxy_id,omitempty"`
  22. ProxyMode string `json:"proxy_mode"`
  23. AccountRevision time.Time `json:"account_revision"`
  24. TLSProfileDigest string `json:"tls_profile_digest,omitempty"`
  25. PromptDigest string `json:"prompt_digest,omitempty"`
  26. Model string `json:"model,omitempty"`
  27. }
  28. func ResolveProtectionRuntime(a *Account, cfg *config.Config, plugins *PluginManager) *ProtectionRuntimeState {
  29. if a == nil {
  30. return nil
  31. }
  32. out := &ProtectionRuntimeState{Strategy: a.ProtectionMode(), PolicyVersion: mode1Int(mode1Marker(a)["policy_version"]), IdentityMode: string(a.GetCodexFingerprintMode()), ConfiguredTLS: "standard", EffectiveTLS: "standard", Concurrency: a.Mode1EffectiveConcurrency(), AccountRevision: a.UpdatedAt, ProxyMode: "fixed"}
  33. out.IntegrityMode = a.RequestIntegrityMode()
  34. if a.ProxyID != nil {
  35. id := *a.ProxyID
  36. out.ProxyID = &id
  37. }
  38. if a.IsRandomProxy() {
  39. out.ProxyMode = "random"
  40. }
  41. if a.IsTLSFingerprintEnabled() {
  42. out.ConfiguredTLS, _ = a.Extra["tls_fingerprint_builtin"].(string)
  43. if out.ConfiguredTLS == "" {
  44. out.ConfiguredTLS = "account_template"
  45. }
  46. }
  47. profile, err := resolveMode1TLSProfile(a)
  48. if err != nil {
  49. out.EffectiveTLS = "invalid"
  50. out.TLSReason = err.Error()
  51. return out
  52. }
  53. if profile != nil {
  54. out.TLSProfileDigest = profile.CacheKey()
  55. out.ConfiguredTLS = profile.Name
  56. }
  57. // Preserve stable registry identifiers rather than the profile display name.
  58. if p := antiDegradeStrategyProfile(antiDegradeMode(a)); a.AntiDegradationEnabled() && p.ID != "" {
  59. out.ConfiguredTLS = p.TLSProfile
  60. }
  61. if isMode1ProtectionEnabled(a) && mode1Int(mode1Marker(a)["policy_version"]) == 2 && a.IsTLSFingerprintEnabled() {
  62. out.ConfiguredTLS = "nodejs24"
  63. }
  64. out.EffectiveTLS = out.ConfiguredTLS
  65. if cfg == nil {
  66. out.EffectiveTLS = "unverified"
  67. out.TLSReason = "未提供运行配置,尚未确认有效传输"
  68. } else if !cfg.Gateway.TLSFingerprint.Enabled && out.ConfiguredTLS != "standard" {
  69. out.EffectiveTLS = "standard"
  70. out.TLSReason = "全局 TLS 指纹开关已关闭"
  71. }
  72. if plugins != nil && plugins.ShouldRouteOpenAIOAuth(a) {
  73. out.EffectiveTLS = "plugin"
  74. out.TLSReason = "HTTP 传输由插件接管,模板握手未观测"
  75. }
  76. return out
  77. }
  78. func protectionPromptDigest(prompt string) string {
  79. return fmt.Sprintf("%x", sha256.Sum256([]byte(prompt)))
  80. }