Il m’est venu en tête pour le fun, suite à l’excellent tuto de Spine sur le fail2ban, d’appeler mon scénario de notification Telegram via curl.
Ce scénario attend au moins 2 tags :
« qui » → destinataire
« message » → message.
Je n’y connais pas grande chose pour ne pas dire rien dans le formatage curl, donc pour le moment je n’incrimine pas le plugin Telegram (ou Telegram) dans mon soucis. Je verrai à modifier le tag si nécessaire.
Ma problématique est que « message » peut bien entendu contenir des espaces. Je ne peux donc pas utiliser la syntaxe de la doc API HTTP (en tout cas j’ai essayé mais cela n’a mené à rien).
Avec cette syntaxe j’arrive bien à passer « toto1 toto2 » au scénario.
Le tag apparaît sous cette forme, avec la double-quote échappée :
[SCENARIO] Start : Execution provoquee par un appel API . Tags : {"#qui#":"ben","#message#":"\"toto1 toto2\""}
Mais dans Telegram je reçois :
"toto1 toto2"
ce qui est cohérent avec le lot de Telegram qui indique dans le log :
[text] => "toto1 toto2"
Y-a-t-il une astuce de syntaxe qui m’échappe ? Faut-il que je passe en API JSON ?
Ou bien la raison de mon problème vient-il du plugin Telegram (ou de Telegram) ?
Quand on passe de la data dans un paramètre du querystring, on doit faire un « encodage url » dessus (urlencode) pour justement éviter tous les caractères qui sont utilisés par ailleurs dans une URL.
(Espace sera transformé en %20, le = en %3D etc)
Si on utilise les méthodes prévues pour, curl fait cela pour nous mais si tu lui passes directement une URL final alors il ne peut pas savoir si c’est déjà encodé ou pas donc il ne va pas le refaire (avoir un double urlencode est un problème)
Donc soit tu encodes toi même les paramètres avant de générer l’url soit tu passes les paramètres explicitement et curl le fera, ce qui est la bonne solution à mon avis.
avec comme résultat dans le log de mon scénario de notification :
Start : Execution provoquee par un appel API . Tags : {"#qui#":"ben","#message#":"L'IP 66.249.XX.XX vient d'\u00eatre bannie apr\u00e8s 1 tentative(s) contre apache-multiport."}
Par contre, je me rappelle qu’on m’avait appris il y a très longtemps (le développement web était à ses balbutiements) qu’il était préférable de ne pas utiliser les espaces en séparateur de variables pour éviter ce type de problème (aka « les espaces ce n’est pas un vrai caractère »). Or, dans le cas de « tags » pour l’API HTTP scénario c’est ce qui est utilisé pour séparer les différents tags.