(alors que je ne pensais pas être légitime)



J'ai hacké puis contribué à Symfony

Mais en fait, t'es qui ?





Mais en fait t'es qui ?

Andoni Larzabal

Dev back PHP/Symfony
Devops à mes heures perdues
Monomaniaque de la dette technique
Artisan des internets
Depuis 2018


AndoniLarz



Mais en fait t'es qui ?
Les sponsors du jour






Il était une fois :
le non respect des standards


Le contexte

Mais sans CDATA
Une refacto
Un endpoint qui renvoie du XML
Le legacy


Le contexte

Interdit de mettre du CDATA
Pas de budget ou de temps alloué
Les contraintes



Le contexte

Refacto d'abord en JSON
A la fin, on normalisera en XML
Le plan
Petit détail : on a des URLs dans nos données





Bienvenue en l'an 2000 :
Le XML


Le XML

Un ensemble de composants
Le XmlEncoder
Le Serializer
(Json, CSV, XML...)



Le XML

needsCdataWrapping
class XmlEncoder
{
// ...
private function needsCdataWrapping(string $val): bool
{
return preg_match('/[<>&]/', $val);
}
}







J'suis coincé

Modifier directement le code dans les vendor
Ecrasé si je réinstalle les vendors
Première solution
Fonctionne que sur mon PC



J'suis coincé

Ouvrir une issue sur le Github Symfony
Client moyen chaud
Deuxième solution
Proposer une PR, demande du temps



J'suis coincé

Hacker le XmlEncoder
Troisième solution





On devient le hacker



Le hacker

C'est possible ???
# vendor/symfony/Component/Serializer/Encoder/XmlEncoder.php
<?php
namespace Symfony\Component\Serializer\Encoder;
// use classes...
class XmlEncoder
{
// other methods...
private function needsCdataWrapping(string $val): bool
{
return preg_match('/[<>&]/', $val);
}
}


Le hacker

C'est possible ???
# functions/functions.php
namespace Symfony\Component\Serializer\Encoder;
function preg_match(
string $pattern,
string $subject,
array &$matches = null,
int $flags = 0,
int $offset = 0
): int|false {
if ('/[<>&]/' === $pattern) {
return false;
}
return \preg_match($pattern, $subject, $matches, $flags, $offset);
}


Le hacker

C'est pas fini !




Notre première contribution !


On contribue

Par où on commence ?
Proposer une PR
Trouver ou créer l'issue
Chercher les règles & guidelines



On contribue

Comment ça se passe ?
Attendre la relecture
Forker le projet
Changes + tests



On contribue

Oui, mais j'ai peur
Trouver un mentor
Chercher dans la commu (Slack, Bluesky, etc.)





Vous aussi vous pouvez contribuer !


Contribuez vous aussi !






AndoniLarz



J'ai contribué à Symfony - pitre version
By Andoni Larzabal
J'ai contribué à Symfony - pitre version
- 19