-
Notifications
You must be signed in to change notification settings - Fork 10
Plantage lors du parsing (ValueError: No closing quotation) dû aux guillemets non échappés dans les retours de l'API #22
Description
Description du problème
Lorsqu'un vRouter Stormshield génère un warning lors d'une opération CONFIG FILTER RULE INSERT, son API XML peut renvoyer des attributs corrompus avec un guillemet (") collé en préfixe.
La fonction format_output() du client concatène ces clés sans les sécuriser ni les échapper, ce qui crée une ligne mal formattée. Ensuite, ConfigParser et shlex tentent de parser la ligne mais crashent (raise(e)) à cause des guillemets asymétriques, provoquant une interruption brutale du programme avant même la lecture de la validation pourtant renvoyée par le pare-feu (100 Ok).
Retour XML brut du pare-feu
Voici le retour XML obtenu lors de l'insertion d'une règle :
<section title="Check">
<line>
<key name="slot" value="local_filter_slot"/><key name="type" value="warning"/><key name="code" value="148"/>
</line>
<line>
<key name="" causedby_element_code" value="44"/>
<key name="causedby_element" value="destination if"/>
<key name="causedby_value" value="INTERCO-PUB"/>
</line>
</section>Une fois converti par la méthode format_output du sslclient, cela donne :
" causedby_element_code=44 causedby_element="destination if" causedby_value=INTERCO-PUB
Lorsque shlex traite cette ligne, il trouve 3 guillemets. Il plante alors sur l'erreur fatale non-gérée : ValueError: No closing quotation.
Correction
- Échappement propre
(sslclient/__init__.py): Il faut parser ou stripper plus finement le format .ini construit à partir du XML dans la méthode format_output pour enlever ces guillemets résiduels ou rajouter un échappement àkey_node.get('name')etserverd_node.get('msg'). - Ignorer le crash de configparser
(sns/configparser.py): Remplacer l'exception fatale de ce bloc par un avertissement non bloquant.
except Exception as e:
# Remplacement silencieux pour ne pas perdre la session TCP
import logging
logging.getLogger(__name__).warning("Can't natively shlex the line: %s, error was: %s", line, str(e))
# raise(e) <- à de base ceci fait tout crasher