Browse Source

Evolution importante de la methode de verification de l'unicite des votes quand ouverts a tous.

On peut maintenant choisie :
- par adresse IP (comme avant, le plus restictif)
- par empreinte du navigateur (meme signature utilisee que pour les stats, permet a plusieurs utilisateurs utilisant une meme IP de voter, mais aussi a un utilisateur de voter plusieurs fois en changeant de navigateur)
- par cookie (attribue forfaitairement au moment du vote, permet a plusieurs utilisateurs utilisant les memes configuration d'ordi derriere la meme IP de voter - grosses entreprises - mais du coup aussi de voter plusieurs fois en vidant ses cookies)

Le reglage par defaut reste l'adresse IP. Dans tous les cas le hash et le cookie sont memorises en base, ce qui permet de changer eventuellement de methode en cours de vote
/!\ Mais attention, pour les votes existants avant cette mise a jour, si on change de methode cela revient a autoriser tout le monde a revoter 1 fois
master
cedric@yterium.com 6 years ago
parent
commit
7a8b52e8ca
  1. 6
      action/editer_notation.php
  2. 10
      base/notation.php
  3. 42
      formulaires/configurer_notation.html
  4. 3
      formulaires/notation.php
  5. 13
      inc/notation.php
  6. 8
      lang/notation_en.php
  7. 8
      lang/notation_fr.php
  8. 6
      notation_administrations.php
  9. 4
      paquet.xml

6
action/editer_notation.php

@ -24,6 +24,8 @@ function notation_inserer($objet, $id_objet){
"id_objet" => $id_objet,
"id_auteur" => 0,
"ip" => "",
"hash" => "",
"cookie" => "",
"note" => 0,
);
@ -64,7 +66,7 @@ function notation_modifier($id_notation, $set=null) {
include_spip('inc/filtres');
$c = collecter_requests(
// white list
array('id_auteur','ip','note'),
array('id_auteur','ip','hash','cookie','note'),
// black list : on ne peut pas changer sur quoi porte une note
array("objet","id_objet"),
// donnees eventuellement fournies
@ -259,5 +261,3 @@ function notation_calculer_total($objet, $id_objet){
function insert_notation($objet, $id_objet){return notation_inserer($objet, $id_objet);}
function modifier_notation($id_notation,$c=array()) {return notation_modifier($id_notation, $c);}
function supprimer_notation($id_notation) { return notation_supprimer($id_notation); }
?>

10
base/notation.php

@ -35,9 +35,11 @@ function notation_declarer_tables_principales($tables_principales){
"id_notation" => "BIGINT(21) NOT NULL auto_increment",
"objet" => "varchar(21) DEFAULT '' NOT NULL",
"id_objet" => "BIGINT(21) NOT NULL DEFAULT '0'",
"id_auteur" => "BIGINT(21) NOT NULL",
"ip" => "VARCHAR(255) NOT NULL",
"note" => "TINYINT(1) NOT NULL",
"id_auteur" => "BIGINT(21) NOT NULL DEFAULT '0'",
"ip" => "VARCHAR(255) NOT NULL DEFAULT ''",
"hash" => "VARCHAR(255) NOT NULL DEFAULT ''",
"cookie" => "VARCHAR(255) NOT NULL DEFAULT ''",
"note" => "TINYINT(1) NOT NULL DEFAULT '0'",
"maj" => "TIMESTAMP"
);
$spip_notations_key = array(
@ -118,5 +120,3 @@ function notation_declarer_tables_interfaces($interface){
$interface['tables_jointures']['spip_notations_objets'][] = 'articles';
return $interface;
}
?>

42
formulaires/configurer_notation.html

@ -40,9 +40,9 @@
</fieldset>
<fieldset>
<legend><:notation:acces:></legend>
<div class="explication"><:notation:info_ip|propre:></div>
<p class="explication"><:notation:info_vote_unique_auteur:></p>
<ul class="editer-groupe">
<li class="editer editer_notation_acces">
<li class="editer long_label editer_notation_acces">
<label><:notation:info_acces:></label>
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{acces})</span>]
<div class="choix">
@ -66,8 +66,27 @@
<label for="notation_acces_all"><:notation:item_all:></label>
</div>
</li>
<li class="editer long_label editer_notation_methode_id[(#ENV{acces}|=={all}|non)none]">
<label><:notation:info_methode_id:></label>
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{methode_id})</span>]
<div class="choix">
<input type="radio" name="methode_id" class="radio" value="ip"
[ (#ENV{methode_id,ip}|=={ip}|oui)checked="checked"] id="notation_methode_id_ip" />
<label for="notation_methode_id_ip"><:notation:item_methode_id_ip:></label>
</div>
<div class="choix">
<input type="radio" name="methode_id" class="radio" value="hash"
[ (#ENV{methode_id,ip}|=={hash}|oui)checked="checked"] id="notation_methode_id_hash" />
<label for="notation_methode_id_hash"><:notation:item_methode_id_hash:></label>
</div>
<div class="choix">
<input type="radio" name="methode_id" class="radio" value="cookie"
[ (#ENV{methode_id,ip}|=={cookie}|oui)checked="checked"] id="notation_methode_id_cookie" />
<label for="notation_methode_id_cookie"><:notation:item_methode_id_cookie:></label>
</div>
</li>
<li class="editer editer_notation_modifier_note">
<li class="editer long_label editer_notation_modifier_note">
<label for="notation_changer_note"><:notation:info_modifications:></label>
<div class="choix">
<input type="checkbox" name="change_note" class="checkbox" id="notation_changer_note"[ (#ENV{change_note}|=={oui}|oui)checked="checked"] value="oui" />
@ -93,3 +112,20 @@
</p>
</div></form>
</div>
<script type="application/javascript">
function update_editer_notation_methode_id_visible() {
var val = jQuery('[name=acces]:checked').attr('value');
console.log(val);
if (val == 'all') {
jQuery('.editer_notation_methode_id:hidden').show('fast');
}
else {
jQuery('.editer_notation_methode_id:visible').hide('fast');
}
}
jQuery(function() {
update_editer_notation_methode_id_visible();
jQuery('[name=acces]').bind('change',update_editer_notation_methode_id_visible);
});
</script>

3
formulaires/notation.php

@ -98,6 +98,7 @@ function formulaires_notation_traiter_dist($objet, $id_objet){
if ($id_notation = notation_retrouver_note($type, $id_objet, $qui)) {
$row = sql_fetsel('id_notation, id_auteur, note', 'spip_notations', 'id_notation=' . intval($id_notation));
}
// verifier ici qu'on avait bien le droit de voter, car on a pu supprimer son cookie pour avoir acces au formulaire
// sans pour autant avoir le droit de voter (idenitification par IP ou hash)
include_spip('inc/autoriser');
@ -126,6 +127,8 @@ function formulaires_notation_traiter_dist($objet, $id_objet){
'note' => $note,
'id_auteur' => $qui['id_auteur'],
'ip' => $qui['ip'],
'hash' => $qui['hash'],
'cookie' => $qui['cookie'],
);
notation_modifier($id_notation,$c);
}

13
inc/notation.php

@ -117,14 +117,23 @@ function notation_identifier_visiteur($set_cookie = false) {
if (!function_exists('lire_config')) {
include_spip('inc/config');
}
$qui['where'] = 'ip='.sql_quote($qui['ip'], '', 'text');
$methode_id = lire_config('notation/methode_id','ip');
if ($methode_id == 'cookie') {
$qui['where'] = 'cookie='.sql_quote($qui['cookie'], '', 'text');
}
elseif($methode_id == 'hash') {
$qui['where'] = 'hash='.sql_quote($qui['hash'], '', 'text');
}
else {
$qui['where'] = 'ip='.sql_quote($qui['ip'], '', 'text');
}
}
return $qui;
}
/**
* Retrouver la note d'un objet/id_objet
* Retrouver la note d'un objet/id_objet
* pour un visiteur decrit par $qui (fourni par la fonction notation_identifier_visiteur)
* @param string $objet
* @param int $id_objet

8
lang/notation_en.php

@ -50,8 +50,12 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
This parameter must be fixed once and for all when creating ratings.',
'info_fonctionnement_note' => 'How rating works',
'info_ip' => 'To be the easiest possible to use, the rating is attached to the IP address of the voter, which avoids two successive votes in the database, with a few drawbacks ... especially if you manage author’s votes.<br />
In this case, we set the note on the user identifier (when he is registered, of course).<br />
If you want to guarantee the uniqueness of the note, limit the voting <b>only</b> to registered users (above).',
In this case, we set the note on the user identifier (when he is registered, of course).',
'info_vote_unique_auteur' => 'If you want to guarantee the uniqueness of the note, limit the voting <b>only</b> to registered users.',
'info_methode_id' => 'Check method for voting uniqueness',
'item_methode_id_ip' => 'with IP address',
'item_methode_id_hash' => 'with browser footprint',
'item_methode_id_cookie' => 'with cookie',
'info_modifications' => 'Changing of the ratings',
'info_ponderation' => 'The weighting factor lends more value to items that have received enough votes.<br />Enter below the number of votes beyond which you think the score is reliable.',
'ip' => 'IP',

8
lang/notation_fr.php

@ -48,8 +48,12 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
Ce paramètres doit être fixé une fois pour toute à la création des notes.',
'info_fonctionnement_note' => 'Fonctionnement de la notation',
'info_ip' => 'Pour être le plus facile possible d’utilisation, la note est fixée sur l’adresse IP du votant, ce qui évite deux votes successifs dans la base, avec quelques inconvénients... en particulier si vous gérez des votes d’auteurs.<br />
Dans ce cas, on fixe la note sur l’identifiant de l’utilisateur (quand celui-ci est enregistré, bien sûr).<br />
Si vous voulez garantir l’unicité de la note, limitez le vote aux <b>seules</b> personnes enregistrées (ci-dessus).',
Dans ce cas, on fixe la note sur l’identifiant de l’utilisateur (quand celui-ci est enregistré, bien sûr).',
'info_vote_unique_auteur' => 'Si vous voulez garantir l’unicité de la note, limitez le vote aux <b>seules</b> personnes enregistrées.',
'info_methode_id' => 'Vérification de l\'unicité des votes',
'item_methode_id_ip' => 'Par adresse IP',
'item_methode_id_hash' => 'Par empreinte du navigateur',
'item_methode_id_cookie' => 'Par cookie',
'info_modifications' => 'Modifications des notes',
'info_ponderation' => 'Le facteur de pondération permet d’accorder plus de valeur aux articles ayant reçu suffisament de votes. <br /> Entrez ci-dessous la nombre de votes au delà duquel vous pensez que la note est fiable.',
'ip' => 'IP',

6
notation_administrations.php

@ -91,6 +91,12 @@ function notation_upgrade($nom_meta_base_version,$version_cible){
array('maj_tables',array('spip_articles')),
);
$maj['0.7.0'] = array(
array('sql_alter',"TABLE spip_notations ADD COLUMN hash VARCHAR(255) NOT NULL DEFAULT '' AFTER ip"),
array('sql_alter',"TABLE spip_notations ADD COLUMN cookie VARCHAR(255) NOT NULL DEFAULT '' AFTER hash"),
);
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);

4
paquet.xml

@ -1,11 +1,11 @@
<paquet
prefix="notation"
categorie="communication"
version="2.2.2"
version="2.3.0"
etat="test"
compatibilite="[3.0.0;3.1.*]"
logo="prive/themes/spip/images/notation-32.png"
schema="0.6.3"
schema="0.7.0"
documentation="http://contrib.spip.net/Notation-d-elements-SPIP"
>

Loading…
Cancel
Save