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

Last change on this file since 105949 was 105949, checked in by marcimat@…, 3 years ago

En 3.2 inc/filtres_images n’est plus.

  • Property svn:keywords set to Id
File size: 10.5 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 105949 2017-08-27 15:10:07Z marcimat@rezo.net $
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_logo spip_logos photo avatar");
98        }
99        else {
100                // changer la class du logo auteur
101                $img = inserer_attribut($img, 'class', 'spip_logo 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_logo 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 * @param     bool        $force    forcer la recuperation synchrone
154 * @return    null|string           le chemin du fichier gravatar, s'il existe
155 */
156function gravatar($email, $default='404', $force=false) {
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 l'email est invalide
161        if (!$email=trim($email)
162                OR !strlen($email)
163                OR !email_valide($email))
164                return '';
165
166        $tmp = sous_repertoire(_DIR_VAR, 'cache-gravatar');
167        $lock_file = $tmp."gravatar.lock";
168
169
170        $md5_email = md5(strtolower($email));
171        // privacy : http://archive.hack.lu/2013/dbongard_hacklu_2013.pdf
172        // eviter de rendre les emails retrouvables par simple reverse sur le md5 de gravatar
173        if (!isset($GLOBALS['meta']['gravatar_salt'])){
174                include_spip('inc/acces');
175                include_spip('auth/sha256.inc');
176                ecrire_meta('gravatar_salt', _nano_sha256($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SERVER_SIGNATURE"] . creer_uniqid()), 'non');
177        }
178        if (function_exists("sha1"))
179                $gravatar_id = sha1(strtolower($email).$GLOBALS['meta']['gravatar_salt']);
180        else
181                $gravatar_id = md5(strtolower($email).$GLOBALS['meta']['gravatar_salt']);
182
183        $gravatar_default = '';
184        if (in_array($default,array('404','mm','identicon','monsterid','wavatar','retro'))){
185                $gravatar_default = $default;
186                $default = '';
187        }
188        elseif(strpos($default,".")!==false AND file_exists($default)){
189                $gravatar_default = '404';
190        }
191        else{
192                $default = '';
193        }
194
195        $gravatar_id .= ($gravatar_default=='404'?"":"-$gravatar_default");
196        $gravatar_cache = $tmp.$gravatar_id.'.jpg';
197        $gravatar_vide = $tmp.$gravatar_id.'.vide';
198
199        $gravatar = "";
200        // On verifie si le gravatar existe en controlant la taille du fichier
201        if (@filesize($gravatar_cache)) {
202                $gravatar = $gravatar_cache;
203        }
204        // sinon si default est un chemin d'image, le prendre en fallback
205        elseif($default){
206                $gravatar = $default;
207        }
208
209
210        // si on est locke, on utilise ce qu'on a
211        if (file_exists($lock_file)
212                AND $_SERVER['REQUEST_TIME']-filemtime($lock_file)<_GRAVATAR_CACHE_DELAY_LOCK){
213                return $gravatar;
214        }
215
216        // si on a un cache valide, on l'utilise
217        if ($gravatar==$gravatar_cache){
218                $duree = $_SERVER['REQUEST_TIME']-filemtime($gravatar_cache);
219                if ($duree<_GRAVATAR_CACHE_DELAY_REFRESH OR $nb--<=0){
220                        return $gravatar;
221                }
222                spip_log("Actualiser gravatar existant $email anciennete $duree s (cache maxi " . _GRAVATAR_CACHE_DELAY_REFRESH . "s)", "gravatar");
223                @touch($gravatar_cache); // un touch pour eviter une autre mise a jour concurrente
224        }
225        // si c'est un email sans gravatar connu (deja verifie), on ne reverifie pas que passe un delai suffisant
226        else {
227                // si un fichier vides.txt existe encore, le transformer en touch unitaires
228                lire_fichier($tmp . 'vides.txt', $vides);
229                if ($vides AND $vides = @unserialize($vides)){
230                        foreach($vides as $id=>$t){
231                                @touch($tmp.$id.".vide",$t);
232                        }
233                        @unlink($tmp . 'vides.txt');
234                }
235
236                if (file_exists($gravatar_vide)){
237                        $duree_vide = $_SERVER['REQUEST_TIME']-filemtime($gravatar_vide);
238                        if ($duree_vide<_GRAVATAR_CACHE_DELAY_CHECK_NEW OR $nb--<=0){
239                                return $gravatar;
240                        }
241                        // un actualise un gravatar vide que si c'est celui du visiteur identifie
242                        if ($force
243                          OR (isset($GLOBALS['visiteur_session']['email']) AND $GLOBALS['visiteur_session']['email']===$email)
244                          OR (isset($GLOBALS['visiteur_session']['session_email']) AND $GLOBALS['visiteur_session']['session_email']===$email) ){
245                                spip_log("Actualiser gravatar vide $email $duree_vide s (cache maxi " . _GRAVATAR_CACHE_DELAY_CHECK_NEW . "s)", "gravatar");
246                                @touch($gravatar_vide); // un touch pour eviter une autre mise a jour concurrente
247                        }
248                        else {
249                                return $gravatar;
250                        }
251                }
252                else {
253                        spip_log("Recherche nouveau gravatar $email", "gravatar");
254                }
255        }
256
257        // pas trop de requetes sur un seul tour
258        if ($max--<=0){
259                return $gravatar;
260        }
261
262        include_spip("inc/distant");
263        spip_timer('gravatar');
264        $url_gravatar = _GRAVATAR_HOST
265                . '/avatar/'
266                . $md5_email
267                . ".jpg"
268                . ($gravatar_default ? "?d=$gravatar_default" : "")
269                . "&s=" . _TAILLE_MAX_GRAVATAR;
270
271        // recuperation OK ?
272        $GLOBALS['inc_distant_allow_fopen'] = false; // pas de fallback sur fopen si on est bloque par gravatar.com
273        $gravatar_bin = recuperer_page($url_gravatar);
274        unset($GLOBALS['inc_distant_allow_fopen']);
275        $dt = spip_timer('gravatar', true);
276        if ($gravatar_bin){
277                spip_log('recuperer gravatar OK pour ' . $email,"gravatar");
278                ecrire_fichier($gravatar_cache, $gravatar_bin);
279                // si c'est un png, le convertir en jpg
280                $a = @getimagesize($gravatar_cache);
281                // png ?
282                if ($a[2]==3) {
283                        // pour eviter un warning sous windows si le fichier existe deja
284                        if (file_exists($gravatar_cache . '.png')){
285                                @unlink($gravatar_cache . '.png');
286                        }
287                        rename($gravatar_cache, $gravatar_cache . '.png');
288                        include_spip('inc/filtres_images');
289                        include_spip('inc/filtres_images_mini');
290                        $img = imagecreatefrompng($gravatar_cache . '.png');
291                        // Compatibilite avec la 2.1
292                        if (function_exists('_image_imagejpg')){
293                                _image_imagejpg($img, $gravatar_cache);
294                        }
295                        else {
296                                image_imagejpg($img, $gravatar_cache);
297                        }
298                }
299                else {
300                        if (file_exists($gravatar_cache . '.png')){
301                                @unlink($gravatar_cache . '.png');
302                        }
303                }
304                if (file_exists($gravatar_vide)){
305                        @unlink($gravatar_vide);
306                }
307
308                if ($gravatar!==$gravatar_cache){
309                        gravatar_verifier_index($tmp);
310                        $gravatar = $gravatar_cache;
311                }
312        }
313        else {
314                // si ca a ete trop long, ne pas ressayer (IP serveur ban par gravatar ?)
315                if ($dt>10000){
316                        $nb = 0;
317                        @touch($lock_file);
318                        spip_log("gravatar.com trop long a repondre pour $email ($dt), on lock $lock_file", "gravatar");
319                }
320                else {
321                        spip_log('gravatar vide pour ' . $email,"gravatar");
322                }
323                // si on a pas eu de reponse mais qu'un cache existe le prolonger pour eviter de rechecker tout le temps
324                if ($gravatar===$gravatar_cache){
325                        @touch($gravatar_cache);
326                }
327                else {
328                        @touch($gravatar_vide);
329                }
330        }
331
332        return $gravatar;
333}
Note: See TracBrowser for help on using the repository browser.