1. 14 Apr, 2026 4 commits
    • erio's avatar
      fix: gofmt formatting across all Go source files · 1e6912ea
      erio authored
      1e6912ea
    • erio's avatar
      fix: round-2 audit fixes — security, code quality, and UI improvements · a9880ee7
      erio authored
      Security (HIGH):
      - Normalize all Redis cache keys to lowercase (verifyCode, passwordReset)
      - Fix verify code TTL renewal on failed attempts: use remaining TTL via
        ExpiresAt field instead of resetting to full 15-minute window
      - Add 3 missing fields to diffSettings audit log (promo_code, invitation_code,
        custom_endpoints)
      
      Code quality (MEDIUM):
      - Extract filterVerifiedEmails shared helper (balance_notify_service.go)
      - Add Pricing array non-empty validation for channel pricing rules
      - Add platform token semantics comment in gateway_service.go
      - Complete validatePlanPatch test coverage (+10 test cases)
      - Replace string types with QuotaThresholdType/QuotaResetMode across frontend
      - Remove duplicate getPlatformTextColor/getRateBadgeClass in ChannelsView
      - Return EMAIL_NOT_FOUND error on RemoveNotifyEmail miss
      
      UI improvements:
      - Reorder cost tooltip: user billing above separator, account billing below
      - Add NaN guard to accountBilled function
      - Move timezone selector inline into reset-mode row (no longer standalone)
      a9880ee7
    • erio's avatar
      fix: address audit findings for websearch, email verification, and pricing · 74f8a30f
      erio authored
      - Fix websearch provider failover: proxy error from provider-specific proxy
        now continues to next provider instead of aborting the entire loop
      - Fix SMTP failure locking users out: send email first, then write cache
        and increment rate counter
      - Fix notify email cache key case sensitivity: normalize to lowercase
      - Add OriginalPrice validation to validatePlanPatch and validatePlanRequired
      - Add empty scope validation for channel pricing rules (group_ids/account_ids)
      - Add platform color to account search dropdown in channel pricing rules
      74f8a30f
    • erio's avatar
      test: add 66 unit tests for balance/quota notify + plan validation · ca673f98
      erio authored
      balance_notify_service_test.go (27 tests):
      - resolveBalanceThreshold: fixed/percentage/zero recharged/empty type
      - quotaDim.resolvedThreshold: fixed normal/exceed/equal limit, percentage 0/30/100/>100, zero/negative limit
      - sanitizeEmailHeader: CRLF/CR/LF/clean/empty/multiple newlines
      - buildQuotaDims / buildQuotaDimsFromState: all dimensions, empty extra, state-vs-account precedence
      - collectBalanceNotifyRecipients: empty, filter disabled/unverified, case-insensitive dedup, skip empty, trim
      
      balance_notify_check_test.go (16 tests):
      - CheckBalanceAfterDeduction guard clauses: nil user/disabled/global-off/threshold=0/user-override/no-crossing
      - CheckAccountQuotaAfterIncrement guards: nil account/zero cost/negative cost/global-disabled
      - getBalanceNotifyConfig: all fields, disabled, invalid threshold
      - isAccountQuotaNotifyEnabled: missing/false/true
      - getSiteName: default fallback + configured
      
      balance_notify_email_body_test.go (10 tests):
      - Guards against fmt.Sprintf arg-count mismatches in email templates
      - Verifies HTML escaping of recharge URL
      - Verifies CSS %% escape produces literal % in output
      - Verifies unlimited/percentage/over-quota display branches
      
      payment_config_plans_validation_test.go (13 tests):
      - validatePlanRequired: all 5 validation branches + whitespace handling
      ca673f98