(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

Made with Slides.com