diff --git a/formidable_options.php b/formidable_options.php index c8b59e4c7e8027ac653021b3dcaa8ee565ad926f..19f1cea69137a1b5da3e9363032c3be2c64e7b82 100644 --- a/formidable_options.php +++ b/formidable_options.php @@ -84,6 +84,16 @@ $GLOBALS['formulaires']['editer_formulaire'] = array( ) ); +/* déclaration des différentes variables utilisées pour effectuer l'anonymisation */ +$GLOBALS['formulaires']['variables_anonymisation'] = array( + 'remote_user' => '$_SERVER["REMOTE_USER"]', + 'php_auth_user' => '$_SERVER["PHP_AUTH_USER"]', +); + +$GLOBALS['formulaires']['passwd'] = array( + 'interne' => 'palabresecreta', +); + $GLOBALS['formulaires']['autoriser_admin_restreint'] = false; if (!function_exists('array_fill_keys')) { diff --git a/formulaires/formidable.html b/formulaires/formidable.html index b5f9f99fa080da6bb7c0a8b5b4b2ab021233f4d0..65f288904aa9d38daeb39b83d5a5bb7754538657 100644 --- a/formulaires/formidable.html +++ b/formulaires/formidable.html @@ -2,6 +2,11 @@ [(#REM) Afficher du HTML si prévu par un plugin ou pour les stats ] [(#ENV**{_remplacer_formulaire})] </BOUCLE_remplacer_le_formulaire> +<BOUCLE_formulaire(FORMULAIRES){id_formulaire=#ENV{id}}> + [(#SET{enregistrement,[(#TRAITEMENTS**|unserialize|table_valeur{'enregistrement'})]})] + [(#SET{anonymiser,[(#GET{enregistrement}|table_valeur{'anonymiser'})]})] + [(#GET{anonymiser}|=={on}|oui)<h3><:formidable:formulaire_anonyme_explication:>]</h3> +</BOUCLE_formulaire> <div class="formulaire_spip formulaire_#ENV{form}[ formulaire_#ENV{form}-(#ENV{id,nouveau})]"> [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] diff --git a/formulaires/formidable.php b/formulaires/formidable.php index 1ff68b16d85a2e61831f7e05c8582e0e4e1a5d25..4198c4682596725e32514b82fc2dfd6033e46b8e 100644 --- a/formulaires/formidable.php +++ b/formulaires/formidable.php @@ -90,12 +90,17 @@ function formulaires_formidable_charger($id_formulaire, $valeurs=array(), $id_fo } } else { + // calcul des paramètres d'anonymisation + $anonymisation = (isset($options['anonymiser']) && $options['anonymiser'] == true) + ? isset($options['anonymiser_variable']) ? $options['anonymiser_variable'] : '' + : ''; + // Si multiple = non mais que c'est modifiable, alors on va chercher // la dernière réponse si elle existe if ($options = $traitements['enregistrement'] and !$options['multiple'] and $options['modifiable'] - and $reponses = formidable_verifier_reponse_formulaire($formulaire['id_formulaire'], $options['identification']) + and $reponses = formidable_verifier_reponse_formulaire($formulaire['id_formulaire'], $options['identification'], $anonymisation) ){ $id_formulaires_reponse = array_pop($reponses); $contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok); diff --git a/inc/formidable.php b/inc/formidable.php index 187d8d99a1da8384441c9e4ef11b6e281d8228cf..d50971f880e6979d37b86fabe2f97509a8f6caed 100644 --- a/inc/formidable.php +++ b/inc/formidable.php @@ -95,14 +95,26 @@ function formidable_generer_nom_cookie($id_formulaire){ * * @param int $id_formulaire L'identifiant du formulaire * @param string $choix_identification Comment verifier une reponse. Priorite sur 'cookie' ou sur 'id_auteur' + * @param string $anonymisation : vaut '' si le formulaire n'est pas anonymisé, sinon c'est la variable d'anonymisation * @return unknown_type Retourne un tableau contenant les id des réponses si elles existent, sinon false */ -function formidable_verifier_reponse_formulaire($id_formulaire, $choix_identification='cookie'){ +function formidable_verifier_reponse_formulaire($id_formulaire, $choix_identification='cookie', $anonymisation=''){ global $auteur_session; $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0; $nom_cookie = formidable_generer_nom_cookie($id_formulaire); $cookie = isset($_COOKIE[$nom_cookie]) ? $_COOKIE[$nom_cookie] : false; + $anonymiser = ($anonymisation == '') ? false : true; + if ($anonymiser) $anonymiser_variable = $anonymisation; + + // traitement de l'anonymisation + if ($anonymiser) { + // mod de l'id_auteur + $variables_anonymisation = + $GLOBALS['formulaires']['variables_anonymisation'][$anonymiser_variable]; + $id = eval("return $variables_anonymisation;"); + $id_auteur = formidable_scramble($id); + } // ni cookie ni id, on ne peut rien faire if (!$cookie and !$id_auteur) { return false; @@ -111,17 +123,17 @@ function formidable_verifier_reponse_formulaire($id_formulaire, $choix_identific // priorite sur le cookie if ($choix_identification == 'cookie' or !$choix_identification) { if ($cookie) - $where = '(cookie='.sql_quote($cookie).($id_auteur ? ' OR id_auteur='.intval($id_auteur).')' : ')'); + $where = '(cookie='.sql_quote($cookie).($id_auteur ? ' OR id_auteur='.$id_auteur.')' : ')'); else - $where = 'id_auteur='.intval($id_auteur); + $where = 'id_auteur='.$id_auteur; } // sinon sur l'id_auteur else { if ($id_auteur) - $where = 'id_auteur='.intval($id_auteur); + $where = 'id_auteur='.$id_auteur; else - $where = '(cookie='.sql_quote($cookie).($id_auteur ? ' OR id_auteur='.intval($id_auteur).')' : ')'); + $where = '(cookie='.sql_quote($cookie).($id_auteur ? ' OR id_auteur='.$id_auteur.')' : ')'); } $reponses = sql_allfetsel( @@ -317,4 +329,50 @@ function titre_nb_reponses($nb) { return _T('formidable:reponses_nb', array('nb' => $nb)); } +/** + * Transforme le hash MD5 en une valeur numérique unique + * + * trouvé ici : http://stackoverflow.com/questions/1422725/represent-md5-hash-as-an-integer + * @param string $hex_str La valeur alphanumérique à transformer + * @return string Valeur numérique +*/ +function md5_hex_to_dec($hex_str) { + $arr = str_split($hex_str, 4); + foreach ($arr as $grp) { + $dec[] = str_pad(hexdec($grp), 5, '0', STR_PAD_LEFT); + } + + /* on s'assure que $result ne commence pas par un zero */ + $result = implode('', $dec); + for ($cpt = 0 ; $cpt < strlen($result) ; $cpt++) { + if ($result[$cpt] != '0') break; + } + $result = substr($result, $cpt); + return $result; +} + +/** + * Transforme un login en une valeur numérique de 19 caractères + * + * NOTE: il devient impossible de retrouver la valeur d'origine car le HASH + * est coupé à 19cars et est donc incomplet. L'unicité n'est pas garantie mais + * les chances pour que deux logins tombent sur le même HASH sont de 1 sur + * 10 milliards de milliards + * A la fin, on recherche et supprime les éventuels zéros de début + * @param string $login Login à transformer + * @param string $passwd Chaîne 'secrète' ajoutée au login et id_formulaire pour éviter + * les recoupements d'identité entre plusieurs formulaires + * @return string Un nombre de 19 chiffres +*/ +function formidable_scramble($login, $passwd = '') { + $id_form = (isset($flux['args']['id_form']) ? $flux['args']['id_form'] : ''); + if ($passwd == '') + $passwd = $GLOBALS['formulaires']['passwd']['interne']; + $login_md5 = md5("$login$passwd$id_form"); + $login_num = md5_hex_to_dec($login_md5); + $login_num = substr($login_num, 0, 19); + + return $login_num; +} + ?> diff --git a/traiter/enregistrement.php b/traiter/enregistrement.php index 4a5115af7ace5aab0f768a8a12e4a909c1dda910..8277067c48b64356067c28927d71634682334b2c 100644 --- a/traiter/enregistrement.php +++ b/traiter/enregistrement.php @@ -16,6 +16,14 @@ function traiter_enregistrement_dist($args, $retours){ global $auteur_session; $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0; + // traitement de l'anonymisation + if ($options['anonymiser'] == 'on') { + // mod de l'id_auteur + $variables_anonymisation = + $GLOBALS['formulaires']['variables_anonymisation'][$options['anonymiser_variable']]; + $id = eval("return $variables_anonymisation;"); + $id_auteur = formidable_scramble($id); + } // On cherche le cookie et sinon on le crée $nom_cookie = formidable_generer_nom_cookie($id_formulaire); if (isset($_COOKIE[$nom_cookie])) diff --git a/traiter/enregistrement.yaml b/traiter/enregistrement.yaml index 3fae3210633292047b494c64795a2cc709d11650..41c9ced81d11b7ff95abf4ff9452d69633417214 100644 --- a/traiter/enregistrement.yaml +++ b/traiter/enregistrement.yaml @@ -26,6 +26,24 @@ options: cookie: '<:formidable:identification_par_cookie:>' id_auteur: '<:formidable:identification_par_id_auteur:>' defaut: 'cookie' + - + saisie: 'oui_non' + options: + nom: 'anonymiser' + label: '<:formidable:traiter_enregistrement_option_anonymiser_label:>' + explication: '<:formidable:traiter_enregistrement_option_anonymiser_explication:>' + defaut: '' + - + saisie: 'selection' + options: + option_intro: '<:formidable:traiter_enregistrement_option_choix_select_label:>' + nom: 'anonymiser_variable' + label: '<:formidable:traiter_enregistrement_option_anonymiser_variable_label:>' + explication: '<:formidable:traiter_enregistrement_option_anonymiser_variable_explication:>' + datas: + remote_user: "Variable serveur : REMOTE_USER" + php_auth_user: "Variable serveur : PHP_AUTH_USER" + defaut: '' - saisie: 'radio' options: