source: spip-zone/_plugins_/gravatar/gravatar_fonctions.php @ 88538

Last change on this file since 88538 was 88538, checked in by cedric@…, 5 years ago

ce coeff delay n'a plus de sens maintenant qu'on fait un seul hit gravatar qu'on soit en gravatar simple ou en gravatar+identicon|wavatar|monsterid

  • Property svn:keywords set to Id
File size: 8.4 KB
Line 
1<?php
2/**
3 *
4 * Gravatar : Globally Recognized AVATAR
5 *
6 * @package     plugins
7 * @subpackage  gravatar
8 *
9 * @author      Fil, Cedric, Thomas Beaumanoir
10 * @license     GNU/GPL
11 *
12 * @version     $Id: gravatar_fonctions.php 88538 2015-04-09 14:33:26Z cedric@yterium.com $
13 **/
14
15if (!defined("_ECRIRE_INC_VERSION")) return;
16
17// taille max des gravatars à récupérer sur le site
18if (!defined('_TAILLE_MAX_GRAVATAR')) define('_TAILLE_MAX_GRAVATAR',80);
19
20// le host vers gravatar
21if (!defined('_GRAVATAR_HOST')) define('_GRAVATAR_HOST','http://www.gravatar.com');
22
23// les caches
24if (!defined('_GRAVATAR_CACHE_DELAY_REFRESH')) define('_GRAVATAR_CACHE_DELAY_REFRESH',3600*24); // 24h pour checker un existant
25if (!defined('_GRAVATAR_CACHE_DELAY_CHECK_NEW')) define('_GRAVATAR_CACHE_DELAY_CHECK_NEW',3600*8); // 8h pour re-checker un user sans gravatar
26if (!defined('_GRAVATAR_CACHE_DELAY_LOCK')) define('_GRAVATAR_CACHE_DELAY_LOCK',3600*23); // 24h si gravatar nous a locke
27
28/**
29 * notre fonction de recherche de logo
30 *
31 * @deprecated obsolete, on la garde pour ne pas planter les squelettes non recalcules
32 * @param  string $email  Le mail qui sert a recuperer l'image sur gravatar.com
33 * @return Array          Le logo de l'utilisateur
34 */
35function calcule_logo_ou_gravatar($email) {
36        $a = func_get_args();
37        $email = array_shift($a);
38
39        // la fonction normale
40        $c = call_user_func_array('calcule_logo',$a);
41
42        // si elle repond pas, on va chercher le gravatar
43        if (!$c[0])
44                $c[0] = gravatar($email);
45
46        return $c;
47}
48
49/**
50 * Construit la balise HTML <img> affichant le gravatar
51 *
52 * @param  string $img    Chemin de l'image
53 * @param  string $alt    Texte alternatif
54 * @param  string $class  Classe facultativ
55 * @return string         Le code HTML
56 */
57function gravatar_balise_img($img,$alt="",$class=""){
58        $taille = taille_image($img);
59        list($hauteur,$largeur) = $taille;
60        if (!$hauteur OR !$largeur)
61                return "";
62        return
63        "<img src='$img' width='$largeur' height='$hauteur'"
64          ." alt='".attribut_html($alt)."'"
65          .($class?" class='".attribut_html($class)."'":'')
66          .' />';
67}
68
69
70/**
71 * pour 2.1 on se contente de produire une balise IMG
72 *
73 * @param  string $email        le mail qui sert a recuperer l'image sur gravatar.com
74 * @param  string $logo_auteur  Le logo de l'auteur s'il existe
75 * @return string               La balise IMG
76 */
77function gravatar_img($email, $logo_auteur='') {
78        include_spip('inc/config');
79        $config = function_exists('lire_config')?lire_config('gravatar'):unserialize($GLOBALS['meta']['gravatar']);
80        $default = '404'; // par defaut rien si ni logo ni gravatar (consigne a passer a gravatar)
81        $image_default = ''; // image
82
83        if ($config
84          AND strlen($image_default=$config['image_defaut'])
85                AND strpos($image_default,".")===FALSE){
86                $default = $image_default; // c'est une consigne pour l'api gravatar
87                $image_default = ($default=='404')?'':'images/gravatar.png'; // si pas d'email, fournir quand meme une image
88        }
89
90        // retrouver l'image du mieux qu'on peut :
91        // logo_auteur si il existe
92        // ou gravatar si on a un email et si on trouve le gravatar
93        if (!$img = $logo_auteur){
94                if (!$g = gravatar($email,$default)) // chercher le gravatar etendu pour cet email
95                        $img = '';
96                else
97                        $img = gravatar_balise_img($g, "", "spip_logos photo avatar");
98        }
99        else {
100                // changer la class du logo auteur
101                $img = inserer_attribut($img, 'class', 'spip_logos photo avatar');
102        }
103
104        // si pas de config, retourner ce qu'on a
105        if (!$config)
106                return $img;
107       
108        // ensuite le mettre en forme si les options ont ete activees
109        if (!$img
110                AND $image_default
111                AND $img = find_in_path($image_default))
112                $img = gravatar_balise_img($img, "", "spip_logos photo avatar");
113
114        if (!$img)
115                return '';
116
117        // mises en formes optionnelles du gravatar
118        if ($config AND $t=$config['taille']){
119                $img = filtrer('image_passe_partout',$img,$t);
120                $img = filtrer('image_recadre',$img,$t,$t,'center');
121                $img = filtrer('image_graver',$img);
122        }
123
124        return $img;
125}
126
127/**
128 * Verifie (une fois) qu'un index index.php existe dans $tmp
129 *
130 * @staticvar boolean $done  True si la verif a deja ete faite
131 * @param     string  $tmp   Le repertoire dans lequel on posera le gravatar
132 * @return    null
133 */
134function gravatar_verifier_index($tmp) {
135        static $done = false;
136        if ($done) return;
137        $done = true;
138        if (!file_exists($tmp.'index.php'))
139                ecrire_fichier ($tmp.'index.php', '<?php
140        foreach(glob(\'./*.jpg\') as $i)
141                echo "<img src=\'$i\' />\n";
142?>'
143                );
144}
145
146/**
147 * Recupere l'image sur www.gravatar.com et la met en cache
148 *
149 * @staticvar int         $nb       le nombre max d'anciens
150 * @staticvar int         $max      le nombre max de nouveaux
151 * @param     string      $email    le mail qui va servir pour calculer le gravatar
152 * @param     int|string  $default  gravatar par defaut : 404 ou identicon/monsterid/wavatar
153 * @return    null|string           le chemin du fichier gravatar, s'il existe
154 */
155function gravatar($email, $default='404') {
156        static $nb=5; // ne pas en charger plus de 5 anciens par tour
157        static $max=10; // et en tout etat de cause pas plus de 10 nouveaux
158
159        // eviter une requete quand on peut
160        if (!strlen($email) OR !email_valide($email))
161                return '';
162
163        $tmp = sous_repertoire(_DIR_VAR, 'cache-gravatar');
164        $lock_file = $tmp."gravatar.lock";
165
166
167        $md5_email = md5(strtolower($email));
168        // privacy : http://archive.hack.lu/2013/dbongard_hacklu_2013.pdf
169        // eviter de rendre les emails retrouvables par simple reverse sur le md5 de gravatar
170        if (!isset($GLOBALS['meta']['gravatar_salt'])){
171                include_spip('inc/acces');
172                include_spip('auth/sha256.inc');
173                ecrire_meta('gravatar_salt', _nano_sha256($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SERVER_SIGNATURE"] . creer_uniqid()), 'non');
174        }
175        if (function_exists("sha1"))
176                $gravatar_id = sha1(strtolower($email).$GLOBALS['meta']['gravatar_salt']);
177        else
178                $gravatar_id = md5(strtolower($email).$GLOBALS['meta']['gravatar_salt']);
179        $gravatar_id .= ($default=='404'?"":"-$default");
180        $gravatar_cache = $tmp.$gravatar_id.'.jpg';
181
182        $duree = 0;
183       
184        if (!file_exists($lock_file) OR $_SERVER['REQUEST_TIME']-filemtime($lock_file)>_GRAVATAR_CACHE_DELAY_LOCK){
185
186                if ((!file_exists($gravatar_cache)
187                        OR (
188                                (($duree = $_SERVER['REQUEST_TIME']-filemtime($gravatar_cache))>_GRAVATAR_CACHE_DELAY_REFRESH)
189                                AND $nb>0
190                        ))
191                ){
192                        if ($duree){
193                                spip_log("Actualiser gravatar anciennete $duree s (cache maxi " . _GRAVATAR_CACHE_DELAY_REFRESH . "s)", "gravatar");
194                        }
195                        lire_fichier($tmp . 'vides.txt', $vides);
196                        $vides = @unserialize($vides);
197                        if ($vides===false) $vides = array();
198                        if ($duree
199                                OR (
200                                        (!isset($vides[$gravatar_id]) OR (($duree_vide = time()-$vides[$gravatar_id])>_GRAVATAR_CACHE_DELAY_CHECK_NEW))
201                                        AND $max-->0
202                                )
203                        ){
204                                if ($duree_vide){
205                                        spip_log("Actualiser gravatar vide $duree_vide s (cache maxi " . _GRAVATAR_CACHE_DELAY_CHECK_NEW . "s)", "gravatar");
206                                }
207
208                                $nb--;
209                                include_spip("inc/distant");
210                                spip_timer('gravatar');
211                                if ($gravatar
212                                        = recuperer_page(_GRAVATAR_HOST . '/avatar/' . $md5_email . ($default ? "?d=$default" : "") . "&s=" . _TAILLE_MAX_GRAVATAR)
213                                ){
214                                        spip_log('gravatar ok pour ' . $email);
215                                        ecrire_fichier($gravatar_cache, $gravatar);
216                                        // si c'est un png, le convertir en jpg
217                                        $a = @getimagesize($gravatar_cache);
218                                        if ($a[2]==3) // png
219                                        {
220                                                if (!file_exists($gravatar_cache . '.png')){ // pour eviter un warning sous windows si le fichier existe deja
221                                                        rename($gravatar_cache, $gravatar_cache . '.png');
222                                                }
223                                                include_spip('inc/filtres_images');
224                                                $img = imagecreatefrompng($gravatar_cache . '.png');
225                                                // Compatibilite avec la 2.1
226                                                if (function_exists('_image_imagejpg')){
227                                                        _image_imagejpg($img, $gravatar_cache);
228                                                } else
229                                                        image_imagejpg($img, $gravatar_cache);
230                                        }
231                                        if (isset($vides[$gravatar_id])){
232                                                unset($vides[$gravatar_id]);
233                                                ecrire_fichier($tmp . 'vides.txt', serialize($vides));
234                                        }
235                                } else {
236                                        $dt = spip_timer('gravatar', true);
237                                        // si ca a ete trop long, ne pas ressayer (IP serveur ban par gravatar ?)
238                                        if ($dt>10000){
239                                                $nb = 0;
240                                                @touch($lock_file);
241                                                spip_log("gravatar.com trop long a repondre, on lock $lock_file", "gravatar");
242                                        }
243                                        // si on a pas eu de reponse mais qu'un cache existe le prolonger pour eviter de rechecker tout le temps
244                                        if ($duree){
245                                                @touch($gravatar_cache);
246                                        } else {
247                                                $vides[$gravatar_id] = time();
248                                                ecrire_fichier($tmp . 'vides.txt', serialize($vides));
249                                        }
250                                }
251
252                                gravatar_verifier_index($tmp);
253                        }
254                }
255
256        }
257
258        // On verifie si le gravatar existe en controlant la taille du fichier
259        if (@filesize($gravatar_cache))
260                return $gravatar_cache;
261        else
262                return '';
263}
264
265?>
Note: See TracBrowser for help on using the repository browser.