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

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

coquille qui empechait la bonne mise en fonction du lock

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