Browse Source

<!> gros changement

Lors de saisies_verifier():
- vérifier que la valeur postée correspond aux valeurs définies comme
possibles lors de création de la saisie (pour éviter que des gens
modifient les valeurs possibles via par ex un inspecteur html)
  - soit une des valeurs définies dans data pour les radio, cases, select, etc
  - soit une valeur fixée pour les hidden, mais aussi pour les input
  readonly etc.
- concrètement appelle à une fonction
saisies_verifier_valeurs_acceptables() qui appelle
<type-de-la-saisie>_verifier_valeurs_acceptables()
- cette dernière fonction est définie dans un fichier
saisies/<type-de-la-saisie>.php
- elle peut s'appuyer sur les fonctions
  - saisies_verifier_gel_saisie() qui retourne true si la saisie est en
  readonly ou bien en disabled avec post
  - saisies_trouver_data() qui renvoie l'option data ou datas de la
  saisie, formatée sous forme de tableau

Pour le moment, on applique cela uniquement aux saisies:
  - avec un .yaml
  - qui ne concernent pas des objets en BDD
Ce qui devrait couvrir une grosse partie des cas.

Testé avec 19 formulaires Formidable.
Comme toutefois cela pourrait potentiellement casser certains formulaires mal fichus,
on passe en 4.0.0 par sécurité.

On ajoute un peu de narcissime dans paquet.xml
svn/attic/tags/v4.0.0/123225
maieul@maieul.net 4 years ago
parent
commit
34c425cecd
  1. 11
      .gitattributes
  2. 99
      inc/saisies.php
  3. 27
      inc/saisies_lister.php
  4. 1
      lang/saisies_fr.php
  5. 3
      paquet.xml
  6. 38
      saisies/case.php
  7. 27
      saisies/checkbox.php
  8. 45
      saisies/date.php
  9. 27
      saisies/email.php
  10. 3
      saisies/hidden.html
  11. 30
      saisies/hidden.php
  12. 27
      saisies/input.php
  13. 36
      saisies/oui_non.php
  14. 28
      saisies/radio.php
  15. 40
      saisies/selection.php
  16. 63
      saisies/selection_multiple.php
  17. 35
      saisies/textarea.php

11
.gitattributes vendored

@ -122,8 +122,10 @@ saisies/articles_originaux.html -text
saisies/auteurs.html -text
saisies/auteurs.yaml -text
saisies/case.html -text
saisies/case.php -text
saisies/case.yaml -text
saisies/checkbox.html -text
saisies/checkbox.php -text
saisies/checkbox.yaml -text
saisies/choisir_objet.html -text
saisies/choisir_objets.html -text
@ -131,11 +133,13 @@ saisies/choisir_objets_edit.html -text
saisies/choix_grille.html -text
saisies/couleur.html -text
saisies/date.html -text
saisies/date.php -text
saisies/date.yaml -text
saisies/date_jour_mois_annee.html -text
saisies/destinataires.html -text
saisies/destinataires.yaml -text
saisies/email.html -text
saisies/email.php -text
saisies/email.yaml -text
saisies/explication.html -text
saisies/explication.yaml -text
@ -143,17 +147,21 @@ saisies/fieldset.html -text
saisies/fieldset.yaml -text
saisies/groupe_mots.html -text
saisies/hidden.html -text
saisies/hidden.php -text
saisies/hidden.yaml -text
saisies/input.html -text
saisies/input.php -text
saisies/input.yaml -text
saisies/mot.html -text
saisies/mot.yaml -text
saisies/oui_non.html -text
saisies/oui_non.php -text
saisies/oui_non.yaml -text
saisies/pays.html -text
saisies/police.html -text
saisies/position_construire_formulaire.html -text
saisies/radio.html -text
saisies/radio.php -text
saisies/radio.yaml -text
saisies/recherche.html -text
saisies/secteur.html -text
@ -169,13 +177,16 @@ saisies/selecteur_rubrique_article.html -text
saisies/selecteur_rubrique_article.yaml -text
saisies/selecteur_site.html -text
saisies/selection.html -text
saisies/selection.php -text
saisies/selection.yaml -text
saisies/selection_multiple.html -text
saisies/selection_multiple.php -text
saisies/selection_multiple.yaml -text
saisies/selection_par_groupe.html -text
saisies/statuts_auteurs.html -text
saisies/telephone.html -text
saisies/textarea.html -text
saisies/textarea.php -text
saisies/textarea.yaml -text
saisies/true_false.html -text
saisies/url.html -text

99
inc/saisies.php

@ -223,18 +223,7 @@ function saisies_verifier($formulaire, $saisies_masquees_nulles = true, &$erreur
}
// Tout type de saisie, sauf fichiers
else {
// Si le nom du champ est un tableau indexé, il faut parser !
if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)) {
$valeur = _request($separe[1]);
preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
// On va chercher au fond du tableau
foreach ($index[1] as $cle) {
$valeur = isset($valeur[$cle]) ? $valeur[$cle] : null;
}
} else {
// Sinon la valeur est juste celle du nom
$valeur = _request($champ);
}
$valeur = saisies_request($champ);
}
// Pour la saisie "destinataires" il faut filtrer si jamais on a mis un premier choix vide
@ -303,6 +292,8 @@ function saisies_verifier($formulaire, $saisies_masquees_nulles = true, &$erreur
}
}
}
// Vérifier que les valeurs postées sont acceptables, à savoir par exemple que pour un select, ce soit ce qu'on a proposé.
$erreurs = saisies_verifier_valeurs_acceptables($saisies, $erreurs);
// Last but not least, on passe nos résultats à un pipeline
$erreurs = pipeline(
@ -319,6 +310,90 @@ function saisies_verifier($formulaire, $saisies_masquees_nulles = true, &$erreur
return $erreurs;
}
/**
* Vérifier que les valeurs postées sont acceptables,
* c'est-à-dire qu'elles ont été proposées lors de la conception de la saisie.
* Typiquement pour une saisie radio, vérifier que les gens n'ont pas postée une autre fleur.
* @param $saisies array tableau général des saisies, déjà aplati, classé par nom de champ
* @param $erreurs array tableau des erreurs
* @return array table des erreurs modifiés
**/
function saisies_verifier_valeurs_acceptables($saisies, $erreurs) {
foreach ($saisies as $saisie => $description) {
$type = $description['saisie'];
// Pas la peine de vérifier si par ailleurs il y a déjà une erreur
if (isset($erreurs[$saisie])) {
continue;
}
//Il n'y a rien à vérifier sur une description / fieldset
if (in_array($description['saisie'], array('explication','fieldset'))) {
continue;
}
if (include_spip("saisies/$type")) {
$f = $type.'_valeurs_acceptables';
if (function_exists($f)) {
$valeur = saisies_request($saisie);
if (!$f($valeur, $description)) {
$erreurs[$saisie] = _T("saisies:erreur_valeur_inacceptable");
spip_log("Tentative de poste de valeur innaceptable pour $saisie de type $type. Valeur postée : ".print_r(_request($saisie), true), "saisies"._LOG_AVERTISSEMENT);
}
} else {
spip_log("Pas de fonction de vérification pour la saisie $saisie de type $type", "saisies"._LOG_AVERTISSEMENT);
}
} else {
spip_log("Pas de fonction de vérification pour la saisie $saisie de type $type", "saisies"._LOG_AVERTISSEMENT);
}
}
return $erreurs;
}
/**
* Trouve le résultat d'une saisie (_request())
* en tenant compte du fait que la saisie peut être décrit sous forme de sous entrées d'un tableau
* @param string $champ nom du champ de la saisie, y compris avec crochets pour sous entrées
* return string|array résultat du _request()
**/
function saisies_request($champ) {
if (preg_match('/([\w]+)((\[[\w]+\])+)/', $champ, $separe)) {
$valeur = _request($separe[1]);
preg_match_all('/\[([\w]+)\]/', $separe[2], $index);
// On va chercher au fond du tableau
foreach ($index[1] as $cle) {
$valeur = isset($valeur[$cle]) ? $valeur[$cle] : null;
}
} else {
// Sinon la valeur est juste celle du champ
$valeur = _request($champ);
}
return $valeur;
}
/**
* Trouve le champ datas ou datas (pour raison historique)
* parmis les paramètres d'une saisie
* et le retourne après avoir l'avoir transformé en tableau si besoin
* @param array $description description de la saisie
* @bool $disable_choix : si true, supprime les valeurs contenu dans l'option disable_choix des data
* @return array data
**/
function saisies_trouver_data($description, $disable_choix = false) {
$options = $description['options'];
if (isset($options['data'])) {
$data = $options['data'];
} elseif (isset($options['datas'])) {
$data = $options['datas'];
} else {
$data = array();//normalement on peut pas mais bon
}
$data = saisies_chaine2tableau($data);
if ($disable_choix == true and isset($options['disable_choix'])) {
$disable_choix = array_flip(explode(',',$options['disable_choix']));
$data = array_diff_key($data,$disable_choix);
}
return $data;
}
/**
* Aplatit une description tabulaire en supprimant les sous-groupes.
* Ex : les data d'une saisie de type select

27
inc/saisies_lister.php

@ -453,3 +453,30 @@ function saisies_autonomes() {
return $saisies_autonomes;
}
/**
* Indique si une saisie à sa valeur gelée
* - soit par option disabled avec envoi cachée
* - soit par option readonly
* @param array $description description de la saisie
* @return bool true si gélée, false sinon)
**/
function saisies_verifier_gel_saisie($description) {
$options = $description['options'];
//As t-on bloqué d'une manière ou d'une autre la valeur postée?
if ((
isset($options['readonly'])
and $options['readonly']
)
or (
isset($options['disable'])
and isset($options['disable_avec_post'])
and $options['disable']
and $options['disable_avec_post']
)
) {
return true;
} else {
return false;
}
}

1
lang/saisies_fr.php

@ -40,6 +40,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
// E
'erreur_generique' => 'Il y a des erreurs dans les champs ci-dessous, veuillez vérifier vos saisies',
'erreur_option_nom_unique' => 'Ce nom est déjà utilisé par un autre champ et il doit être unique dans ce formulaire.',
'erreur_valeur_inacceptable' => 'Valeur postée non acceptable.',
// I
'info_configurer_saisies' => 'Page de test des Saisies',

3
paquet.xml

@ -1,7 +1,7 @@
<paquet
prefix="saisies"
categorie="outil"
version="3.7.2"
version="4.0.0"
etat="stable"
compatibilite="[3.0.0;3.2.*]"
logo="images/logo_saisie_48.png"
@ -12,6 +12,7 @@
<auteur lien="https://contrib.spip.net/RastaPopoulos">RastaPopoulos</auteur>
<auteur lien="https://contrib.spip.net/Joseph">Joseph</auteur>
<auteur lien="http://www.ldd.fr">Les Développements Durables</auteur>
<auteur>Maïeul</auteur>
<licence>GNU/GPL</licence>
<traduire module="saisies" reference="fr" gestionnaire="salvatore" />

38
saisies/case.php

@ -0,0 +1,38 @@
<?php
/**
* Fonctions spécifiques à une saisie
*
* @package SPIP\Saisies\case
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Vérifie que la valeur postée
* correspond aux valeurs proposées lors de la config de valeur
* @param string $valeur la valeur postée
* @param array $description la description de la saisie
* @return bool true si valeur ok, false sinon,
**/
function case_valeurs_acceptables($valeur, $description) {
$options = $description['options'];
$valeur_oui = isset($options['valeur_oui']) ? $options['valeur_oui'] : 'on';
$valeur_non = isset($options['valeur_non']) ? $options['valeur_non'] : '';
if (saisies_verifier_gel_saisie($description)) {
if (isset($options['defaut'])) {
$defaut = $valeur_oui;
} else {
$defaut = $valeur_non;
}
return $valeur == $defaut;
} else {
return ($valeur == $valeur_oui or $valeur == $valeur_non);
}
}

27
saisies/checkbox.php

@ -0,0 +1,27 @@
<?php
/**
* Fonctions spécifiques à une saisie
*
* @package SPIP\Saisies\checkbox
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Vérifie que la valeur postée
* correspond aux valeurs proposées lors de la config de valeur
* @param string $valeur la valeur postée
* @param array $description la description de la saisie
* @return bool true si valeur ok, false sinon,
**/
function checkbox_valeurs_acceptables($valeur, $description) {
include_spip('saisies/selection_multiple');
return selection_multiple_valeurs_acceptables($valeur, $description);
}

45
saisies/date.php

@ -0,0 +1,45 @@
<?php
/**
* Fonctions spécifiques à une saisie
*
* @package SPIP\Saisies\date
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Vérifie que la valeur postée
* correspond aux valeurs proposées lors de la config de valeur
* @param string $valeur la valeur postée
* @param array $description la description de la saisie
* @return bool true si valeur ok, false sinon,
**/
function date_valeurs_acceptables($valeur, $description) {
if (saisies_verifier_gel_saisie($description) and isset($description['options']['defaut'])) {
$defaut = $description['options']['defaut'];
include_spip('inc/filtres');
$defaut = recup_date($defaut);
$valeur = recup_date($valeur);
foreach ($valeur as &$element) {
if ($element === 0) {
$element = '00';
}
}
foreach ($defaut as &$element) {
if ($element === 0) {
$element = '00';
}
}
if (array_diff_assoc($defaut, $valeur)) {
return false;
}
}
return true;
}

27
saisies/email.php

@ -0,0 +1,27 @@
<?php
/**
* Fonctions spécifiques à une saisie
*
* @package SPIP\Saisies\email
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Vérifie que la valeur postée
* correspond aux valeurs proposées lors de la config de valeur
* @param string $valeur la valeur postée
* @param array $description la description de la saisie
* @return bool true si valeur ok, false sinon,
**/
function email_valeurs_acceptables($valeur, $description) {
include_spip('saisies/textarea');
return textarea_valeurs_acceptables($valeur, $description);
}

3
saisies/hidden.html

@ -1,12 +1,13 @@
<[(#ENV{saisies_base_conteneur,#DIV|sinon{li}})] class="editer editer_[(#ENV{nom})][ (#ENV{conteneur_class,#ENV{li_class}})][ saisie_(#ENV{type_saisie})]" [(#ENV{tout_afficher}|!={oui}|?{style="display:none;"})][ data-id="(#ENV{id_saisie})"]>
#ENV*{inserer_debut}
[(#ENV{tout_afficher}|!={oui}|oui)
[<span class='erreur_message'>(#ENV{erreurs/#ENV{nom}})</span>]
<input type="hidden"[ class="(#ENV{class})"] name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]" value="#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}"[ (#ENV*{attributs})] />
]
[(#ENV{tout_afficher}|!={oui}|non)
[<label for="champ_[(#ENV{nom}|saisie_nom2classe)]">(#ENV*{label})[<span class='obligatoire'>(#ENV{obligatoire}|oui)[(#ENV*{info_obligatoire}|is_null|?{<:info_obligatoire_02:>,#ENV*{info_obligatoire}})]</span>]</label>]
[<span class='erreur_message'>(#ENV{erreurs/#ENV{nom}})</span>]
<input type="text"[ class="(#ENV{class})"] name="#ENV{nom}" id="champ_[(#ENV{nom}|saisie_nom2classe)]" value="#ENV{valeur_forcee,#ENV{valeur,#ENV{defaut}}}" readonly="readonly" />
]
#ENV*{inserer_fin}
</[(#ENV{saisies_base_conteneur,#DIV|sinon{li}})]>

30
saisies/hidden.php

@ -0,0 +1,30 @@
<?php
/**
* Fonctions spécifiques à une saisie
*
* @package SPIP\Saisies\hidden
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Vérifie que la valeur postée
* correspond aux valeurs proposées lors de la config de valeur
* @param string $valeur la valeur postée
* @param array $description la description de la saisie
* @return bool true si valeur ok, false sinon,
**/
function hidden_valeurs_acceptables($valeur, $description) {
if (isset($description['options']['defaut']) and $description['options']['defaut'] != $valeur) {
return false;
} else {
return true;
}
}

27
saisies/input.php

@ -0,0 +1,27 @@
<?php
/**
* Fonctions spécifiques à une saisie
*
* @package SPIP\Saisies\input
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Vérifie que la valeur postée
* correspond aux valeurs proposées lors de la config de valeur
* @param string $valeur la valeur postée
* @param array $description la description de la saisie
* @return bool true si valeur ok, false sinon,
**/
function input_valeurs_acceptables($valeur, $description) {
include_spip('saisies/textarea');
return textarea_valeurs_acceptables($valeur, $description);
}

36
saisies/oui_non.php

@ -0,0 +1,36 @@
<?php
/**
* Fonctions spécifiques à une saisie
*
* @package SPIP\Saisies\oui_non
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Vérifie que la valeur postée
* correspond aux valeurs proposées lors de la config de valeur
* @param string $valeur la valeur postée
* @param array $description la description de la saisie
* @return bool true si valeur ok, false sinon,
**/
function oui_non_valeurs_acceptables($valeur, $description) {
if (saisies_verifier_gel_saisie($description)) {
$options = $description['options'];
if (isset($options['defaut']) and $options['defaut'] == 'on') {
return $valeur == 'on';
} else {
return $valeur === '';// Notons le strictement égale, dès fois que des gens postent 0
}
} elseif ($valeur!='on' and $valeur!='') {
return false;
}
return true;
}

28
saisies/radio.php

@ -0,0 +1,28 @@
<?php
/**
* Fonctions spécifiques à une valeur
*
* @package SPIP\valeurs\radio
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Vérifie que la valeur postée
* correspond aux valeurs proposées lors de la config de valeur
* @param string $valeur la valeur postée
* @param array $description la description de la saisie
* @return bool true si valeur ok, false sinon,
**/
function radio_valeurs_acceptables($valeur, $description) {
include_spip('saisies/selection');
// Structurellement, une saisie radio ou une saisie select, c'est un choix parmis N options.
// Donc la vérif des données postées est la même
return selection_valeurs_acceptables($valeur, $description);
}

40
saisies/selection.php

@ -0,0 +1,40 @@
<?php
/**
* Fonctions spécifiques à une valeur
*
* @package SPIP\valeurs\selection
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Vérifie que la valeur postée
* correspond aux valeurs proposées lors de la config de valeur
* @param string $valeur la valeur postée
* @param array $description la description de la saisie
* @return bool true si valeur ok, false sinon,
**/
function selection_valeurs_acceptables($valeur, $description) {
$options = $description['options'];
if ($valeur == '' and !isset($options['obligatoire'])) {
return true;
}
if (saisies_verifier_gel_saisie($description) and isset($options['defaut'])) {
return $valeur == $options['defaut'];
} else {
$data = saisies_trouver_data($description, true);
$data = saisies_aplatir_tableau($data);
$data = array_keys($data);
if (isset($options['disable_choix'])) {
$disable_choix = explode(',', $options['disable_choix']);
$data = array_diff($data, $disable_choix);
}
return (in_array($valeur ,$data));
}
}

63
saisies/selection_multiple.php

@ -0,0 +1,63 @@
<?php
/**
* Fonctions spécifiques à une saisie
*
* @package SPIP\Saisies\selection_multiple
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Vérifie que la valeur postée
* correspond aux valeurs proposées lors de la config de valeur
* @param string $valeur la valeur postée
* @param array $description la description de la saisie
* @return bool true si valeur ok, false sinon,
**/
function selection_multiple_valeurs_acceptables($valeur, $description) {
if (!is_array($valeur)) {
if ($valeur) {
$valeur = explode(" ", $valeur);
} else {
$valeur = array();
}
}
$data = saisies_trouver_data($description);
if (isset($valeur['choix_alternatif']) and isset($description['options']['choix_alternatif']) and $description['options']['choix_alternatif'] == 'on') {
unset ($valeur['choix_alternatif']);
}
if (saisies_verifier_gel_saisie($description) and isset($description['options']['defaut'])) {
// Si valeur gelée, on vérifie qu'il n'y ni plus ni moins dans ce qui a été postée
$defaut = saisies_valeur2tableau($description['options']['defaut']);
$intersection = array_intersect($defaut, $valeur);
// L'intersection doit avoir le même nombre de valeur que le défaut. S'il a moins, c'est qu'on supprimé des valeurs, ou renommé
// L'intersection doit avoir le même nombre de valeur que posté. S'il y en a moins, c'est qu'on a posté de nouvelle valeur
// Sinon c'est bon
if (count($intersection) != count($defaut)) {
return false;
} elseif (count($intersection) != count($valeur)) {
return false;
} else {
return true;
}
} else {
//A-t-on essayé des poster des valeurs supplémentaires?
$choix_possibles = array_keys($data, true);
if (isset($description['options']['disable_choix'])) {
$disable_choix = explode(',', $description['options']['disable_choix']);
$choix_possibles = array_diff($choix_possibles, $disable_choix);
}
$diff = array_diff($valeur, $choix_possibles);
if (count($diff)) {
return false;
}
}
return true;
}

35
saisies/textarea.php

@ -0,0 +1,35 @@
<?php
/**
* Fonctions spécifiques à une saisie
*
* @package SPIP\Saisies\textarea
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Vérifie que la valeur postée
* correspond aux valeurs proposées lors de la config de valeur
* @param string $valeur la valeur postée
* @param array $description la description de la saisie
* @return bool true si valeur ok, false sinon,
**/
function textarea_valeurs_acceptables($valeur, $description) {
$options = $description['options'];
if (
saisies_verifier_gel_saisie($description)
and
isset($options['defaut'])
and $options['defaut'] != $valeur
) {
return false;
}
return true;
}
Loading…
Cancel
Save