fix: validation du payeur insensible à la casse et remontée des erreurs API - #19
Open
lpmcsn wants to merge 1 commit into
Conversation
…rs API Complète la PR HelloAsso#16, sur laquelle cette branche est basée. - validate_fields() : la liste de noms interdits était comparée avec in_array() sensible à la casse, laissant passer TEST, Test, ADMIN. Comparaison via mb_strtolower(trim(...)) et liste extraite en variable. - validate_fields() : élargit la classe de caractères autorisés à /[^a-zA-ZÀ-ÿ\' -]/u. La liste de la PR HelloAsso#16 ne contient ni î, ï, ô, ni les majuscules accentuées, et sans le flag /u la classe est évaluée octet par octet sur de l'UTF-8 : Émile, Benoît, Loïc, Anaïs, Jérôme et Éric étaient refusés au checkout. - validate_fields() : comparaison prénom/nom insensible à la casse et aux espaces de bord. - process_payment() : remonte le message d'erreur renvoyé par l'API plutôt qu'un message générique, le corps de la réponse contenant déjà une indication exploitable par le donateur. - HELLOASSO_REFRESH_TOKEN_LIFETIME est définie à l'identique dans trois fichiers chargés dans la même requête, d'où un warning PHP à chaque chargement. Ajout d'un garde defined().
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pour compléter #16, sur la branche de laquelle elle est basée. Elle corrige trois points que la #16 ne couvre pas, et ajuste la classe de caractères de sa correction de regex.
Sur mon instance, une commande passée avec le prénom
TESTa franchivalidate_fields()et déclenché un400 ArgumentInvalidcôté API HelloAsso, alors que la liste de noms interdits contient déjà'test'.1.
validate_fields(): liste de noms interdits sensible à la casseTEST,Test,ADMINfranchissent la validation qu'ils sont censés déclencher. Corrigé parmb_strtolower(trim(...)), avec la liste extraite en variable pour éviter sa duplication entre prénom et nom.2.
validate_fields(): classe de caractères de la regexLa #16 corrige à juste titre
!en[^, mais le jeu de caractères conservé ne contient niî, niï, niô, ni les majuscules accentuées, et le motif n'a pas le flag/u. Donc la classe est évaluée octet par octet sur de l'UTF-8. Une fois la négation active, cela refuse au checkout des prénoms français courants.Constaté en déployant la #16 seule sur mon instance :
Benoîtest refusé avec « Le prénom ne doit pas contenir de caractères spéciaux ni de caractères n'appartenant pas à l'alphabet latin ».Élargi en
/[^a-zA-ZÀ-ÿ\' -]/u, ce qui laisse passer les prénoms accentués et composés tout en continuant de rejeter les caractères spéciaux et les alphabets non latins.3.
validate_fields(): comparaison prénom/nom$firstName === $lastNamene détecte pasMartin/martin. Comparaison alignée sur le reste, insensible à la casse et aux espaces de bord.4.
process_payment(): remontée du message de l'APIDans le bloc
!isset($response_data->redirectUrl), le corps de la réponse contient déjà un message exploitable (Le champ prénom est invalide). Le remonter évite de laisser le donateur devant un message générique sans piste de correction.5.
HELLOASSO_REFRESH_TOKEN_LIFETIMEdéfinie trois foisLa constante est définie à l'identique dans
cron/helloasso-woocommerce-cron.phpl.4,helloasso-api/helloasso-woocommerce-api.phpl.7 etwc-api/helloasso-woocommerce-wc-api.phpl.7, tous chargés dans la même requête, d'où unPHP Warning: Constant ... already definedà chaque chargement. Ajout d'un gardedefined().Fixes # (issue)
Type of change
How Has This Been Tested?
Testé sur une instance de production : WordPress 7.0.4, WooCommerce 11.0.1, PHP 8.3.6, plugin 1.1.2, tunnel de commande classique, mode production (
test_mode: no).Trois états successifs ont été déployés et comparés, chacun suivi d'un
systemctl reload php8.3-fpmet de commandes réelles.État A — plugin 1.1.2 tel quel
TESTfranchit la validation,checkout-intentsrépond400 ArgumentInvalid,process_payment()retourne{"result":"success","redirect":null,"order_id":6057}(capturé sur le filtrewoocommerce_payment_successful_result). Le checkout échoue sur la redirection nulle.PHP Warning: Undefined property: stdClass::$redirectUrl ... on line 871dansdebug.log.État B — branche de la #16 seule
Benoîtrefusé au checkout par la regex. C'est la régression signalée en commentaire de la fix: race condition OAuth2 et rejet 400 caractères spéciaux [RUN-3788] #16.État C — cette branche
Benoît/Parmecheckout-intentsen 200TEST/PARMEPierre/Parmecheckout-intentsen 200Ivan#/Petrovdebug.logne contient plus aucunUndefined property: stdClass::$redirectUrlniConstant ... already definedaprès le déploiement de l'état C.Checklist:
Sur les deux cases relatives aux tests : le dépôt ne comporte pas d'infrastructure de test (pas de PHPUnit, pas de CI,
composer.jsonsansrequire-dev), il n'y avait donc pas de hook où brancher un test automatisé. La vérification a été faite manuellement sur une instance réelle, selon le protocole ci-dessus. Si besoin, nous pouvons voir pour créer les tests associés.Sur la documentation : aucun changement de comportement documenté publiquement, hormis l'élargissement de la classe de caractères acceptés dans les champs prénom et nom.