Skip to content
Extraits de code Groupes Projets
Valider 29439971 rédigé par camille.sauvage@espci.fr's avatar camille.sauvage@espci.fr
Parcourir les fichiers

Ajout de la possibilité d'anonymiser les formulaires, c'est à dire ne

pas garder de traces des utilisateurs ayant répondu (tout en gardant
la possibilité d'avoir des réponses uniques, modifiables
parent 299fe20b
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -84,6 +84,16 @@ $GLOBALS['formulaires']['editer_formulaire'] = array( ...@@ -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; $GLOBALS['formulaires']['autoriser_admin_restreint'] = false;
if (!function_exists('array_fill_keys')) { if (!function_exists('array_fill_keys')) {
......
...@@ -2,6 +2,11 @@ ...@@ -2,6 +2,11 @@
[(#REM) Afficher du HTML si prévu par un plugin ou pour les stats ] [(#REM) Afficher du HTML si prévu par un plugin ou pour les stats ]
[(#ENV**{_remplacer_formulaire})] [(#ENV**{_remplacer_formulaire})]
</BOUCLE_remplacer_le_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})]"> <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_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
......
...@@ -90,12 +90,17 @@ function formulaires_formidable_charger($id_formulaire, $valeurs=array(), $id_fo ...@@ -90,12 +90,17 @@ function formulaires_formidable_charger($id_formulaire, $valeurs=array(), $id_fo
} }
} else { } 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 // Si multiple = non mais que c'est modifiable, alors on va chercher
// la dernière réponse si elle existe // la dernière réponse si elle existe
if ($options = $traitements['enregistrement'] if ($options = $traitements['enregistrement']
and !$options['multiple'] and !$options['multiple']
and $options['modifiable'] 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); $id_formulaires_reponse = array_pop($reponses);
$contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok); $contexte = formidable_definir_contexte_avec_reponse($contexte, $id_formulaires_reponse, $ok);
......
...@@ -95,14 +95,26 @@ function formidable_generer_nom_cookie($id_formulaire){ ...@@ -95,14 +95,26 @@ function formidable_generer_nom_cookie($id_formulaire){
* *
* @param int $id_formulaire L'identifiant du 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 $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 * @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; global $auteur_session;
$id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0; $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0;
$nom_cookie = formidable_generer_nom_cookie($id_formulaire); $nom_cookie = formidable_generer_nom_cookie($id_formulaire);
$cookie = isset($_COOKIE[$nom_cookie]) ? $_COOKIE[$nom_cookie] : false; $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 // ni cookie ni id, on ne peut rien faire
if (!$cookie and !$id_auteur) { if (!$cookie and !$id_auteur) {
return false; return false;
...@@ -111,17 +123,17 @@ function formidable_verifier_reponse_formulaire($id_formulaire, $choix_identific ...@@ -111,17 +123,17 @@ function formidable_verifier_reponse_formulaire($id_formulaire, $choix_identific
// priorite sur le cookie // priorite sur le cookie
if ($choix_identification == 'cookie' or !$choix_identification) { if ($choix_identification == 'cookie' or !$choix_identification) {
if ($cookie) 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 else
$where = 'id_auteur='.intval($id_auteur); $where = 'id_auteur='.$id_auteur;
} }
// sinon sur l'id_auteur // sinon sur l'id_auteur
else { else {
if ($id_auteur) if ($id_auteur)
$where = 'id_auteur='.intval($id_auteur); $where = 'id_auteur='.$id_auteur;
else 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( $reponses = sql_allfetsel(
...@@ -317,4 +329,50 @@ function titre_nb_reponses($nb) { ...@@ -317,4 +329,50 @@ function titre_nb_reponses($nb) {
return _T('formidable:reponses_nb', array('nb' => $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;
}
?> ?>
...@@ -16,6 +16,14 @@ function traiter_enregistrement_dist($args, $retours){ ...@@ -16,6 +16,14 @@ function traiter_enregistrement_dist($args, $retours){
global $auteur_session; global $auteur_session;
$id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0; $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 // On cherche le cookie et sinon on le crée
$nom_cookie = formidable_generer_nom_cookie($id_formulaire); $nom_cookie = formidable_generer_nom_cookie($id_formulaire);
if (isset($_COOKIE[$nom_cookie])) if (isset($_COOKIE[$nom_cookie]))
......
...@@ -26,6 +26,24 @@ options: ...@@ -26,6 +26,24 @@ options:
cookie: '<:formidable:identification_par_cookie:>' cookie: '<:formidable:identification_par_cookie:>'
id_auteur: '<:formidable:identification_par_id_auteur:>' id_auteur: '<:formidable:identification_par_id_auteur:>'
defaut: 'cookie' 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' saisie: 'radio'
options: options:
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter