fix: race condition OAuth2 et rejet 400 caractères spéciaux [RUN-3788] - #16
fix: race condition OAuth2 et rejet 400 caractères spéciaux [RUN-3788]#16rockynox wants to merge 1 commit into
Conversation
… 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
|
La PR couvre plusieurs problèmes que je viens de rencontrer en production (plugin 1.1.2, WooCommerce 11.0.1, WP 7.0.4, PHP 8.3.6). Deux retours après l'avoir testée. La correction de la regex introduit un refus de prénoms français courantsLe passage de Constaté sur une instance réelle. J'ai déployé votre branche seule (
Les autres cas ci-dessous sont mesurés en exécutant directement les deux motifs :
Le filtrage des caractères indésirables fonctionne bien. Par ex, Une classe plus large qui a réglé le cas : preg_match('/[^a-zA-ZÀ-ÿ\' -]/u', $firstName)Vérifiée sur le même jeu : les prénoms français passent, Nous l'avons également déployée sur la même instance, à la place de la vôtre : La liste de noms interdits est sensible à la casseIndépendamment de cette PR, in_array('TEST', array(..., 'test')) // false
in_array('Test', array(..., 'test')) // falseC'est ce qui m'a amenés ici à la base : une commande de test avec le prénom {"result":"success","redirect":null,"order_id":6057}Côté client, le script de checkout échoue sur cette redirection nulle et affiche Votre PR supprime ce faux message mais la validation locale continue de laisser passer le cas qu'elle est précisément censée intercepter. $forbiddenNames = array('firstname', 'lastname', /* ... */, 'test');
if (in_array(mb_strtolower(trim($firstName)), $forbiddenNames, true)) {Remonter le message de l'APIDernier point, mineur : dans le bloc $message = 'Réponse inattendue de HelloAsso. Veuillez réessayer.';
if (isset($response_data->errors[0]->message)) {
$message = $response_data->errors[0]->message;
}
wc_add_notice($message, 'error');
return array('result' => 'failure', 'messages' => $message);Ces trois correctifs sont prêts sur une branche basée sur la vôtre : https://github.com/lpmcsn/woocommerce-plugin/tree/fix/complement-pr16 Je peux les proposer en PR séparée une fois celle-ci mergée, ou les pousser ici si vous préférez tout regrouper — dites-nous ce qui vous arrange. |
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()appelaithelloasso_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_assoindique 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 :Les points (
.),@,_passaient la validation locale et étaient rejetés par l'API avecArgumentInvalid.Corrections annexes
wp_error, les réponses non-200 et les réponses sansredirectUrlretournent maintenant unresult: failurepropre à WooCommerce, au lieu de continuer l'exécution et crasher sur->redirectUrl.Fichiers modifiés
inc/Gateway/WC_HelloAsso_Gateway.php