From 2bae308e35feb460be4123f0980d8417d95bdcea Mon Sep 17 00:00:00 2001
From: Arthur Suzuki <arthur.suzuki@biblibre.com>
Date: Tue, 4 Feb 2020 17:10:56 +0100
Subject: [PATCH] =?UTF-8?q?hotline#105040:=20Formulaire=20:=20l'antispam?=
 =?UTF-8?q?=20filtrait=20des=20donn=C3=A9es=20valides=20et=20empechait=20l?=
 =?UTF-8?q?a=20saisie=20de=20valeurs=20dans=20un=20formulaire?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 VERSIONS_HOTLINE/105040                       |   1 +
 .../opac/controllers/FormulaireController.php |   9 +-
 .../controllers/FormulaireControllerTest.php  | 105 ++++++++++++++++++
 3 files changed, 114 insertions(+), 1 deletion(-)
 create mode 100644 VERSIONS_HOTLINE/105040

diff --git a/VERSIONS_HOTLINE/105040 b/VERSIONS_HOTLINE/105040
new file mode 100644
index 00000000000..7269bda673e
--- /dev/null
+++ b/VERSIONS_HOTLINE/105040
@@ -0,0 +1 @@
+ - ticket #105040 : Formulaire articles ne marche pas avec des noms d'input contenant des espaces, des tirets bas et des crochets droits
\ No newline at end of file
diff --git a/application/modules/opac/controllers/FormulaireController.php b/application/modules/opac/controllers/FormulaireController.php
index 145902b4e22..a5525e7bd37 100644
--- a/application/modules/opac/controllers/FormulaireController.php
+++ b/application/modules/opac/controllers/FormulaireController.php
@@ -56,7 +56,14 @@ class FormulaireController extends ZendAfi_Controller_Action {
                    $article->getContenu(),
                    $all_inputs);
 
-    if (array_diff(array_keys($post), $all_inputs[1]))
+    $clean_input = array_map(function($input)
+                             {
+                               return str_replace(['.',' ','['],
+                                                  '_',
+                                                  $input);
+                             },
+                             $all_inputs[1]);
+    if (array_diff(array_keys($post), $clean_input))
       return true;
 
     return false;
diff --git a/tests/application/modules/opac/controllers/FormulaireControllerTest.php b/tests/application/modules/opac/controllers/FormulaireControllerTest.php
index 94357837739..7eea1070deb 100644
--- a/tests/application/modules/opac/controllers/FormulaireControllerTest.php
+++ b/tests/application/modules/opac/controllers/FormulaireControllerTest.php
@@ -31,6 +31,10 @@ abstract class FormulaireControllerPostActionTestCase extends AbstractController
                                           'contenu' => '<form action="/formulaire/add/id_article/45" method="POST" name="Nous écrire">'
                                           . '<p>Votre nom<input name="nom" type="text" /></p>'
                                           . '<p>Votre prénom<input name="prenom" type="text" /></p>'
+                                          . '<p><input name="Dejeuner" required="required" type="radio" value="libre">Libre</p>'
+                                          . '<p><input name="Dejeuner" required="required" type="radio" value="Restaurant">Restaurant avec le groupe (sur réservation)</p>'
+                                          . '<p><input name="option1" type="checkbox" value="wifi">Wifi</p>'
+                                          . '<p><input name="option2" type="checkbox" value="piscine">Piscine</p>'
                                           . '</form>']);
     $this->fixture('Class_Formulaire',
                    ['id' => 1,
@@ -237,6 +241,107 @@ class FormulaireControllerPostAsBotTest extends FormulaireControllerPostActionTe
 
     $this->assertRedirectTo('/');
   }
+
+
+  /** @test */
+  public function withValidDataShouldCreateANewForm() {
+    $this->postDispatch('/formulaire/add/id_article/45',
+                        ['nom' => 'Tinguette' ,
+                         'prenom' => 'Quentin',
+                         'Dejeuner' => 'libre',
+                         'option1' => 'cafe',
+                         'option2' => 'wifi',
+                         'website' => ''],
+                        true);
+    $this->assertNotRedirectTo('/');
+  }
+
+}
+
+
+
+
+class FormulaireControllerPostActionDebugTestCase extends AbstractControllerTestCase {
+  protected
+    $_storm_default_to_volatile = true;
+
+
+  public function setUp() {
+    parent::setUp();
+
+    Class_Article::newInstanceWithId(45, ['titre' => 'Contactez nous',
+                                          'contenu' => '<form action="/arthur/formulaire/add/id_article/1618" method="POST">
+<p><input name="Inscription Journée Bokeh 2 avril Talence" type="hidden" value="Inscription Journée Bokeh 2 avril Talence" />Nom, Pr&eacute;nom<br />
+<input data-tc-id="w-0.29026469748912975" name="Nom, Prénom" required="required" tc-textcontent="true" type="text" /></p>
+
+<p>Adresse mail<br />
+<input data-tc-id="w-0.07789243529520828" name="Mail" required="required" tc-textcontent="true" type="email" /></p>
+
+<p>Etablissement<br />
+<input data-tc-id="w-0.0005608611335192748" name="Etablissement" required="required" tc-textcontent="true" type="text" /></p>
+
+<p>SIGB (Nanook, Koha, PNB, Orph&eacute;e NX etc....)<br />
+<input data-tc-id="w-0.8095451597979981" name="SIGB" required="required" tc-textcontent="true" type="text" /></p>
+
+<p>Adresse de votre portail Bokeh (url en http/s)<br />
+<input data-tc-id="w-0.20741370069209997" name="Site Web" tc-textcontent="true" type="url" /></p>
+
+<p>D&eacute;jeuner</p>
+
+<p><input data-tc-id="w-0.4082287663760651" name="Dejeuner" required="required" tc-textcontent="true" type="radio" value="libre" />Libre</p>
+
+<p><input data-tc-id="w-0.46758368222915037" name="Dejeuner" required="required" tc-textcontent="true" type="radio" value="Restaurant" />Restaurant avec le groupe (sur r&eacute;servation)</p>
+
+<p>&nbsp;</p>
+
+<p><input data-tc-id="w-0.42382856730050433" tc-textcontent="true" type="submit" value="Envoyer" /></p>
+<input autocomplete="off" data-spambots="true" data-tc-id="w-0.997230006041362" name="website" tc-textcontent="true" type="text" />&nbsp;</form>
+<form action="/arthur/formulaire/add/id_article/1618" method="POST">
+<p><input name="Inscription Journée Bokeh 2 avril Talence" type="hidden" value="Inscription Journée Bokeh 2 avril Talence" />Nom, Pr&eacute;nom<br />
+<input data-tc-id="w-0.29026469748912975" name="Nom, Prénom" required="required" tc-textcontent="true" type="text" /></p>
+
+<p>Adresse mail<br />
+<input data-tc-id="w-0.07789243529520828" name="Mail" required="required" tc-textcontent="true" type="email" /></p>
+
+<p>Etablissement<br />
+<input data-tc-id="w-0.0005608611335192748" name="Etablissement" required="required" tc-textcontent="true" type="text" /></p>
+
+<p>SIGB (Nanook, Koha, PNB, Orph&eacute;e NX etc....)<br />
+<input data-tc-id="w-0.8095451597979981" name="SIGB" required="required" tc-textcontent="true" type="text" /></p>
+
+<p>Adresse de votre portail Bokeh (url en http/s)<br />
+<input data-tc-id="w-0.20741370069209997" name="Site Web" tc-textcontent="true" type="url" /></p>
+
+<p>D&eacute;jeuner</p>
+
+<p><input data-tc-id="w-0.4082287663760651" name="Dejeuner" required="required" tc-textcontent="true" type="radio" value="libre" />Libre</p>
+
+<p><input data-tc-id="w-0.46758368222915037" name="Dejeuner" required="required" tc-textcontent="true" type="radio" value="Restaurant" />Restaurant avec le groupe (sur r&eacute;servation)</p>
+
+<p>&nbsp;</p>
+
+<p><input data-tc-id="w-0.42382856730050433" tc-textcontent="true" type="submit" value="Envoyer" /></p>
+<input autocomplete="off" data-spambots="true" data-tc-id="w-0.997230006041362" name="website" tc-textcontent="true" type="text" />&nbsp;</form>
+']);
+
+    $this->postDispatch('/formulaire/add/id_article/45',
+                        [
+                         'Inscription_Journée_Bokeh_2_avril_Talence' => 'Inscription Journée Bokeh 2 avril Talence',
+                         'Nom,_Prénom' => 'Suzuki',
+                         'Mail' => 'arthur.suzuki@free.fr',
+                         'Etablissement' => 'AFI',
+                         'SIGB' => 'koha',
+                         'Site_Web' => 'http://sandbox.afi-sa.fr/arthur/cms/articleview/id/1618',
+                         'Dejeuner' => 'libre',
+                         'website' => ''
+                        ],
+                        true);
+  }
+
+    /** @test */
+  public function responseShouldNotRedirect() {
+    $this->assertNotRedirectTo('/');
+  }
 }
 
 ?>
\ No newline at end of file
-- 
GitLab