Projet

Général

Profil

Actions

Anomalie #5695

fermé

Erreur JS Uncaught HierarchyRequestError: Failed to execute 'appendChild' on 'Node': The new child element contains the parent.moveFieldset

Ajouté par Jérôme Augé il y a plus de 10 ans. Mis à jour il y a plus de 10 ans.

Statut:
Intégré
Priorité:
Normal
Assigné à:
Version cible:
Début:
01/09/2015
Echéance:
% réalisé:

100%

Temps estimé:
Version source:
Solution proposée:
Principaux fichiers impactés:
Complexité:
Contrôle:
Thème:
Socle technique
Régression:
Non

Description

- Soit un document avec avec un attribut `con_suivi_commentaire` de type "htmltext" contenu dans un array, lui même contenu dans une frame contenue dans un tab :

          id           |   type   |   frameid    | ordered 
-----------------------+----------+--------------+---------
 proc_t_suivi          | tab      |              |    2000
 con_f_suivi           | frame    | proc_t_suivi |    8200
 con_a_suivi           | array    | con_f_suivi  |    8210
 con_suivi_commentaire | htmltext | con_a_suivi  |    8270

- L'attribut `con_suivi_commentaire` contient 3 valeurs dont une valeur avec un tag `<table>` ouvrant main non fermé :

+---
| 
| <p>...</p>
| 
+---
| 
| <p> </p>
| <p>
|     ...
| </p>
| <p> </p>
| <p>
|     ....
| </p>
| <p>--</p>
| <table border="0" cellpadding="0" >     <!-- tag table ouvrant mais non fermé -->
|     <p>
|         ...
|     </p>
|     <p>
|         ...
|     </p>
|                                         <!-- table est non fermé ici -->
+---
| 
| <p>...</p>
| 
+---

Alors, lors de la consultation du document, les onglets du document ne s'affichent pas et on a l'erreur suivante dans la console JS :

Uncaught HierarchyRequestError: Failed to execute 'appendChild' on 'Node': The new child element contains the parent.moveFieldset ?app=FDL&action=ALLVIEWJS&wv=3229:648(anonymous function) ?sole=Y&&app=FDL&action=FDL_CARD&unlock=Y&vid=&zone=&id=110280:1032

Le problème est que ce tag table ouvrant corrompt la structure DOM ce qui mène au fait que "topbar" se retrouve être le fils de l'élément "Fcon_f_suivi" :

<div id="documentBody" class="body" style="cursor: crosshair;">
    <div id="Fcon_f_summary" class="frame">...</div>
    <div id="Fcon_f_suivi" style="display: none;" name="TAGproc_t_suivi" class="frame">         <-------------------------------------.
        <div class="legend" onmousedow="viewornot('Tcon_f_suivi')">Fiche de suivi</div>                                               |
        <div class="content">                                                                                                         |
            <table width="100%" cellspacing="0" id="Tcon_f_suivi">                                                                    |
                <tr class="FREEDOMBack1">...</tr>                                                                                     |
                <tr class="FREEDOMBack1" attrid="con_a_suivi" type="array">                                                           |
                    <td valign="top colspan="3" class="FREEDOMText">                                                                  |
                      <table style="width:100%;" class="tarray border">...</table>                                                    |
                      <div id="Fcon_f_delais" style="display:none;" name="TAGcon_t_delais" class="frame">...</div>                    |
                      ...                                                                                                             |
                      <div class="line" id="toptab"></div>                     <-- "toptab" ne devrait pas être sous "Fcon_f_suivi" --'
                      <script>moveFieldset(); showFirstFieldset()</script>
                      <div id="Fproc_f_synthese" style="display:none;" name="TAGcon_t_contrat" class="frame">...</div>
                      ...
                    </td>
                </tr>
            </table>
        </div>
    </div>
</div>

Possible regression puisque le nettoyage des htmltext a été revu recémment.


Demandes liées 1 (0 ouverte1 fermée)

Lié à Core - Anomalie #5595: [Layout/OOO] HTMLTEXT invalide : en cas de texte html invalide une fatal error est remontée et bloque l'exécution du programmeFerméÉric Brison30/06/2015

Actions

Mis à jour par Marc Claverie il y a plus de 10 ans

  • Statut changé de Nouveau à Assigné
  • Assigné à mis à Jérôme Augé
  • Version cible mis à 3.2.20

Mis à jour par Jérôme Augé il y a plus de 10 ans

J'ai un cas précis ou c'est `Dcp\Utils\htmlclean::xssClean()` qui corrompt le HTML.

Mis à jour par Jérôme Augé il y a plus de 10 ans

L'instruction qui corrompt le HTML original est :

        $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);

Mis à jour par Jérôme Augé il y a plus de 10 ans

Ces trois regexp sont incorrectes car elles ne s'arrêtent pas au caractère de quote (` ou ' ou ") ouvrant utilisé, et "script" vient matcher par exemple la chaîne "Description" qui se trouve loin derrière.

Par conséquent, toute une partie du fragment HTML est effacée par cette règle incorrecte.

Mis à jour par Jérôme Augé il y a plus de 10 ans

--- WHAT/htmlclean.php.orig     2015-09-22 14:43:13.000000000 +0200
+++ WHAT/htmlclean.php  2015-09-22 14:44:45.000000000 +0200
@@ -47,9 +47,9 @@
         $data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data);
         $data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data);
         // Only works in IE: <span style="width: expression(alert('Ping!'));"></span>
-        $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
-        $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
-        $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);
+        $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*([`\'"])(?:.(?!\2))*?expression[\x00-\x20]*\((?:.(?!\2))*[^>]*+>#i', '$1>', $data);
+        $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*([`\'"])(?:.(?!\2))*?behaviour[\x00-\x20]*\((?:.(?!\2))*[^>]*+>#i', '$1>', $data);
+        $data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*([`\'"])(?:.(?!\2))*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*(?:.(?!\2))*[^>]*>#iu', '$1>', $data);
         // Remove namespaced elements (we do not need them)
         $data = preg_replace('#</*\w+:\w[^>]*+>#i', '', $data);

Mis à jour par Jérôme Augé il y a plus de 10 ans

  • % réalisé changé de 0 à 100

Mis à jour par Éric Brison il y a plus de 10 ans

  • Statut changé de Assigné à Intégré

Appliqué par commit dynacase-core|commit:1a7dca9bd982e075df02bd147d6aaaafc6e152ff.

Actions

Formats disponibles : Atom PDF