Skip to content

fix: race condition OAuth2 et rejet 400 caractères spéciaux [RUN-3788]#16

Open
rockynox wants to merge 1 commit into
mainfrom
fix/RUN-3788-token-race-condition-and-special-chars
Open

fix: race condition OAuth2 et rejet 400 caractères spéciaux [RUN-3788]#16
rockynox wants to merge 1 commit into
mainfrom
fix/RUN-3788-token-race-condition-and-special-chars

Conversation

@rockynox

Copy link
Copy Markdown
Member

Contexte

Deux bugs de production identifiés sur les commandes #1456, #1353 et #1449 (ticket RUN-3788).

Bug 1 — Boucle 401 / race condition token OAuth2

process_payment() appelait helloasso_refresh_token_asso() systématiquement à chaque paiement, même si le token courant était encore valide (30 min de durée de vie). Sous charge concurrente, deux requêtes lisaient le même refresh token en base, déclenchaient deux rotations en cascade, et le token utilisé par la première requête se retrouvait révoqué → 401 en boucle.

Fix : le refresh n'est déclenché que si le token est absent ou si helloasso_token_expires_in_asso indique qu'il est expiré. Les paiements simultanés partagent le même access token valide (l'API autorise jusqu'à 20 en simultané).

Bug 2 — Rejet 400 / noms avec points ou caractères spéciaux

La regex de validate_fields() était cassée :

// Avant — '!' est un caractère littéral, pas une négation
preg_match('/![a-zA-ZéèêëáàâäúùûüçÇ\'-]/', $firstName)

// Après — '[^...]' est la vraie négation de classe en PCRE
preg_match('/[^a-zA-ZéèêëáàâäúùûüçÇ\' -]/', $firstName)

Les points (.), @, _ passaient la validation locale et étaient rejetés par l'API avec ArgumentInvalid.

Corrections annexes

  • Les erreurs wp_error, les réponses non-200 et les réponses sans redirectUrl retournent maintenant un result: failure propre à WooCommerce, au lieu de continuer l'exécution et crasher sur ->redirectUrl.

Fichiers modifiés

  • inc/Gateway/WC_HelloAsso_Gateway.php

… spéciaux

- process_payment() ne refresh le token que si absent ou expiré, évitant
  la rotation concurrente du refresh token sous charge (boucle 401)
- les erreurs API (wp_error, non-200, réponse sans redirectUrl) retournent
  désormais un échec WooCommerce propre au lieu de continuer l'exécution
- corrige la regex validate_fields() : '![...]' → '[^...]' pour bloquer
  correctement les points, @, _ et autres caractères rejetés par l'API
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant