• erio's avatar
    feat(payment): redact provider secrets in admin config API · 235f7108
    erio authored
    Admin GET /api/v1/admin/payment/providers previously returned every
    config value — including privateKey / apiV3Key / secretKey etc. —
    verbatim. Any future XSS on the admin UI would hand attackers the
    full set of production payment credentials, and the plaintext values
    sat unnecessarily in browser memory for every operator.
    
    Treat those fields as write-only from the admin surface:
    
    - decryptAndMaskConfig() strips sensitive keys from the GET response.
      The authoritative list is an explicit per-provider registry that
      mirrors the frontend's PROVIDER_CONFIG_FIELDS sensitive flag:
        alipay   → privateKey, publicKey, alipayPublicKey
        wxpay    → privateKey, apiV3Key, publicKey
        stripe   → secretKey, webhookSecret (publishableKey stays plain)
        easypay  → pkey
      Payment runtime still reads the full config via decryptConfig, so
      nothing at the gateway changes.
    
    - mergeConfig() treats an empty value for a sensitive key as "leave
      unchanged" — the admin UI omits unchanged secrets so operators can
      tweak non-sensitive settings without re-entering credentials.
    
    - Admin dialog (PaymentProviderDialog.vue):
      * secret inputs get autocomplete="new-password", data-1p-ignore,
        data-lpignore and data-bwignore so password managers do not
        offer to save provider credentials
      * in edit mode the required-field check skips sensitive fields
        (empty is the "keep existing" signal) and the placeholder shows
        "leave empty to keep" instead of the default example value
      * create mode still requires every non-optional field, including
        secrets, since there is nothing to preserve
    
    - Unit test renamed to TestIsSensitiveProviderConfigField, covers
      the per-provider registry and specifically asserts that Stripe's
      publishableKey is NOT treated as a secret.
    235f7108
payment_config_providers.go 13.6 KB