[ Index ] |
|
Code source de SPIP Agora 1.4 |
1 <?php 2 /***************************************************** 3 * This file is part of Agora, web based content management system. 4 * 5 * Agora is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; version 2 of the License. 8 * 9 * Agora is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details (file "COPYING"). 13 * 14 * Copyright © Arnaud Martin, Antoine Pitrou et Philippe Rivière. 15 * List of authors detailed in "copyright_fr.html" file. 16 * E-mail : agora@sig.premier-ministre.gouv.fr 17 * Web site : http://www.agora.gouv.fr 18 *****************************************************/ 19 // Ce fichier ne sera execute qu'une fois 20 if (defined("_INC_SITES")) 21 return; 22 define("_INC_SITES", "1"); 23 24 if ($supprimer_lien = $GLOBALS["supprimer_lien"]) { 25 require_once (dirname(__FILE__). "/include/bd/inc_syndic_factory.php"); 26 $syndicArticleMetier = &recuperer_instance_syndic_articles(); 27 $loadOK = $syndicArticleMetier->load($supprimer_lien); 28 if (PEAR::isError($loadOK)) { 29 //die($loadOK->getMessage()); 30 } 31 else { 32 $syndicArticleMetier->setStatut('refuse'); 33 $updateOK = $syndicArticleMetier->update(); 34 if (PEAR::isError($updateOK)) { 35 die ($updateOK->getMessage()); 36 } 37 } 38 } 39 40 if ($ajouter_lien = $GLOBALS["ajouter_lien"]) { 41 require_once (dirname(__FILE__). "/include/bd/inc_syndic_factory.php"); 42 $syndicArticleMetier = &recuperer_instance_syndic_articles(); 43 $loadOK = $syndicArticleMetier->load($ajouter_lien); 44 if (PEAR::isError($loadOK)) { 45 //die($loadOK->getMessage()); 46 } 47 else { 48 $syndicArticleMetier->setStatut('publie'); 49 $updateOK = $syndicArticleMetier->update(); 50 if (PEAR::isError($updateOK)) { 51 die ($updateOK->getMessage()); 52 } 53 } 54 } 55 56 function recuperer_page ($url) { 57 $url_bcp = $url; 58 $http_proxy = lire_meta("http_proxy"); 59 60 if (!eregi("^http://", $http_proxy)) 61 $http_proxy = ''; 62 else 63 $via_proxy = " (proxy $http_proxy)"; 64 65 if (function_exists(spip_log)) { 66 spip_log ("chargement $url$via_proxy"); 67 } 68 69 for ($i = 0; $i < 10; $i++) { // dix tentatives maximum en cas d'entetes 301... 70 $t = @parse_url($url); 71 $host = $t['host']; 72 73 if (!($port = $t['port'])) 74 $port = 80; 75 76 $query = $t['query']; 77 78 if (!($path = $t['path'])) 79 $path = "/"; 80 81 if ($http_proxy) { 82 $t2 = @parse_url($http_proxy); 83 $proxy_host = $t2['host']; 84 85 if (!($proxy_port = $t2['port'])) 86 $proxy_port = 80; 87 $f = @fsockopen($proxy_host, $proxy_port); 88 } 89 else 90 $f = @fsockopen($host, $port); 91 if ($f) { 92 if ($http_proxy) 93 fputs($f, "GET http://$host" . (($port != 80) ? ":$port" : ""). $path . ($query ? "?$query" 94 : ""). " HTTP/1.0\r\n"); 95 else 96 fputs($f, "GET $path" . ($query ? "?$query" : ""). " HTTP/1.0\r\n"); 97 98 fputs($f, "Host: $host\r\n"); 99 fputs($f, "User-Agent: SPIP-" . $GLOBALS['spip_version_affichee']. " (http://www.spip.net/)\r\n"); 100 101 if ($referer = lire_meta("adresse_site")) 102 fputs($f, "Referer: $referer/\r\n"); 103 104 fputs($f, "\r\n"); 105 106 $s = trim(fgets($f, 16384)); 107 108 if (ereg('^HTTP/[0-9]+\.[0-9]+ ([0-9]+)', $s, $r)) { 109 $status = $r[1]; 110 } 111 else 112 return; 113 114 while ($s = trim(fgets($f, 16384))) { 115 if (ereg('^Location: (.*)', $s, $r)) { 116 $location = $r[1]; 117 } 118 } 119 120 if ($status >= 300 AND $status < 400 AND $location) 121 $url = $location; 122 else if ($status != 200) 123 return; 124 else 125 break; 126 fclose ($f); 127 } 128 else { 129 if (!$GLOBALS['tester_proxy']) { 130 $f = @fopen($url_bcp, "rb"); 131 break; 132 } 133 } 134 } 135 136 if (!$f) { 137 if (function_exists(spip_log)) { 138 spip_log ("ECHEC chargement $url$via_proxy"); 139 } 140 $result = ''; 141 } 142 else { 143 while (!feof($f)) 144 $result .= fread($f, 16384); 145 fclose ($f); 146 } 147 148 return $result; 149 } 150 151 function transcoder_page ($texte) { 152 include_ecrire ('inc_charsets.php'); 153 154 // Si le backend precise son charset et que celui-ci est connu de SPIP, 155 // decoder puis recoder 156 if (ereg('<\\?xml[[:space:]]([^>]*[[:space:]])?encoding[[:space:]]*=[[:space:]]*[\'"]([-_a-zA-Z0-9]+)[\'"]', $texte, 157 $regs)) { 158 $charset_page = strtolower($regs[2]); 159 $texte = importer_charset($texte, $charset_page); 160 } 161 // Si le backend ne precise pas, on considere qu'il est iso-8859-1 162 else 163 $texte = importer_charset($texte, 'iso-8859-1'); 164 165 return $texte; 166 } 167 168 function analyser_site ($url) { 169 include_ecrire ("inc_filtres.php"); 170 171 $texte = transcoder_page(recuperer_page($url)); 172 173 if (!$texte) 174 return false; 175 176 $result = ''; 177 178 if (ereg('<channel[^>]*>(.*)</channel>', $texte, $regs)) { 179 $result['syndic'] = true; 180 $result['url_syndic'] = $url; 181 $channel = $regs[1]; 182 183 if (ereg('<title[^>]*>(([^<]|<[^/]|</[^t]>|</t[^i]>)*)</title>', $channel, $r)) 184 $result['nom_site'] = supprimer_tags(filtrer_entites($r[1])); 185 186 if (ereg('<link[^>]*>([^<]*)</link>', $channel, $r)) 187 $result['url_site'] = filtrer_entites($r[1]); 188 189 // si le channel n'a pas de description, ne pas prendre celle d'un article 190 if ($a = strpos($channel, '<item>')) 191 $channel_desc = substr($channel, 0, $a); 192 else 193 $channel_desc = $channel; 194 if (ereg('<description[^>]*>([^<]*)</description>', $channel_desc, $r)) 195 $result['descriptif'] = filtrer_entites($r[1]); 196 } 197 else { 198 $result['syndic'] = false; 199 $result['url_site'] = $url; 200 201 if (eregi('<head>(.*)', $texte, $regs)) 202 $head = filtrer_entites(eregi_replace('</head>.*', '', $regs[1])); 203 else 204 $head = $texte; 205 206 if (eregi('<title[^>]*>(.*)', $head, $regs)) 207 $result['nom_site'] = filtrer_entites(supprimer_tags(eregi_replace('</title>.*', '', $regs[1]))); 208 if (eregi('<meta[[:space:]]+(name|http\-equiv)[[:space:]]*=[[:space:]]*[\'"]?description[\'"]?[[:space:]]+(content|value)[[:space:]]*=[[:space:]]*[\'"]([^>]+)[\'"]>', 209 $head, 210 $regs)) 211 $result['descriptif'] = filtrer_entites(supprimer_tags($regs[3])); 212 } 213 214 return $result; 215 } 216 217 function syndic_a_jour ($now_id_syndic, $statut = 'off') { 218 include_ecrire ("inc_texte.php"); 219 include_ecrire ("inc_filtres.php"); 220 221 //------------MODIFICATION CLEVER AGE elebescond 222 require_once (dirname(__FILE__). "/include/bd/inc_syndic_factory.php"); 223 require_once (dirname(__FILE__). "/include/bd/inc_syndic_articles_factory.php"); 224 require_once (dirname(__FILE__). "/include/bd/inc_service_factory.php"); 225 $syndicMetier = &recuperer_instance_syndic(); 226 $loadOK = $syndicMetier->load($now_id_syndic); 227 228 if (!PEAR::isError($loadOK)) 229 $url_syndic = $syndicMetier->getUrlSyndic(); 230 else 231 return; 232 233 $moderation = $syndicMetier->getModeration(); 234 235 if ($moderation == 'oui') 236 $moderation = 'dispo'; // a valider 237 else 238 $moderation = 'publie'; // en ligne sans validation 239 240 // Section critique : n'autoriser qu'une seule syndication simultanee pour un site donne 241 $serviceMetier = &recuperer_instance_service(); 242 //if(!$serviceMetier->getLock("syndication $url_syndic")) return; 243 244 include_ecrire ("inc_filtres.php"); 245 //------------MODIFICATION CLEVER AGE elebescond 246 $syndicMetier = &recuperer_instance_syndic(); 247 $loadOK = $syndicMetier->load($now_id_syndic); 248 249 if (PEAR::isError($loadOK)) { 250 die ($loadOK->getMessage()); 251 } 252 else { 253 $syndicMetier->setSyndication($statut); 254 $maDate = new Date(); 255 $syndicMetier->setDateSyndic($maDate->getDate(DATE_FORMAT_ISO)); 256 $updateOK = $syndicMetier->update(); 257 if (PEAR::isError($updateOK)) { 258 die ($updateOK->getMessage()); 259 } 260 } 261 262 $le_retour = transcoder_page(recuperer_page($url_syndic)); 263 $erreur = ""; 264 265 if ($le_retour) { 266 $i = 0; 267 268 while (ereg("<item[>[:space:]]", $le_retour, $regs)) { 269 $debut_item = strpos($le_retour, $regs[0]); 270 $fin_item = strpos($le_retour, "</item>") + strlen("</item>"); 271 $item[$i] = substr($le_retour, $debut_item, $fin_item - $debut_item); 272 273 $debut_texte = substr($le_retour, "0", $debut_item); 274 $fin_texte = substr($le_retour, $fin_item, strlen($le_retour)); 275 $le_retour = $debut_texte . $fin_texte; 276 $i++; 277 } 278 if (is_array($item)) { 279 $now = time(); 280 281 for ($i = 0; $i < count($item); $i++) { 282 // Titre (obligatoire) 283 if (ereg("<title>(([^<]|<[^/]|</[^t]>|</t[^i]>)*)</title>", $item[$i], $match)) 284 //------------MODIFICATION CLEVER AGE elebescond --------------- 285 $le_titre = supprimer_tags(filtrer_entites($match[1])); 286 //$le_titre = addslashes(supprimer_tags(filtrer_entites($match[1]))); 287 //------------FIN MODIFICATION CLEVER AGE elebescond --------------- 288 else 289 continue; 290 291 // URL (obligatoire) 292 if (ereg("<link>([^<]*)</link>", $item[$i], $match)) 293 //------------MODIFICATION CLEVER AGE elebescond --------------- 294 $le_lien = filtrer_entites($match[1]); 295 //$le_lien = addslashes(filtrer_entites($match[1])); 296 //------------FIN MODIFICATION CLEVER AGE elebescond --------------- 297 else if (ereg("<guid>([^<]*)</guid>", $item[$i], $match)) 298 //------------MODIFICATION CLEVER AGE elebescond --------------- 299 $le_lien = filtrer_entites($match[1]); 300 //$le_lien = addslashes(filtrer_entites($match[1])); 301 //------------FIN MODIFICATION CLEVER AGE elebescond --------------- 302 else 303 continue; 304 305 // Date 306 $la_date = ""; 307 308 if (ereg("<([[:alpha:]]+:)?date>([^<]*)</([[:alpha:]]+:)?date>", $item[$i], $match)) 309 $la_date = $match[2]; 310 else if (ereg("<pubDate>([^<]*)</pubDate>", $item[$i], $match)) 311 $la_date = $match[1]; 312 313 if ($GLOBALS['flag_strtotime']AND $la_date) { 314 // http://www.w3.org/TR/NOTE-datetime 315 if (ereg('^([0-9]+-[0-9]+-[0-9]+T[0-9]+:[0-9]+(:[0-9]+)?)(\.[0-9]+)?(Z|([-+][0-9][0-9]):[0-9]+)$', 316 $la_date, 317 $match)) { 318 $la_date = str_replace("T", " ", $match[1]). " GMT"; 319 $la_date = strtotime($la_date) - intval($match[5]) * 3600; 320 } 321 else 322 $la_date = strtotime($la_date); 323 } 324 325 if ($la_date < $now - 365 * 24 * 3600 OR $la_date > $now + 48 * 3600) 326 $la_date = $now; 327 328 // Auteur 329 if (ereg("<author>([^<]*)</author>", $item[$i], $match)) 330 //------------MODIFICATION CLEVER AGE elebescond --------------- 331 $les_auteurs = filtrer_entites($match[1]); 332 //$les_auteurs = addslashes(filtrer_entites($match[1])); 333 //------------FIN MODIFICATION CLEVER AGE elebescond --------------- 334 else if (ereg("<([[:alpha:]]+:)?creator>([^<]*)</([[:alpha:]]+:)?creator>", $item[$i], $match)) 335 //------------MODIFICATION CLEVER AGE elebescond --------------- 336 $les_auteurs = filtrer_entites($match[2]); 337 //$les_auteurs = addslashes(filtrer_entites($match[2])); 338 //------------FIN MODIFICATION CLEVER AGE elebescond --------------- 339 else 340 $les_auteurs = ""; 341 342 // Description 343 if (ereg("<description[^>]*>(.*)</description>", $item[$i], $match)) 344 //------------MODIFICATION CLEVER AGE elebescond --------------- 345 $la_description = supprimer_tags(filtrer_entites($match[1])); 346 //$la_description = supprimer_tags(addslashes(filtrer_entites($match[1]))); 347 //------------FIN MODIFICATION CLEVER AGE elebescond --------------- 348 else 349 $la_description = ""; 350 351 //------------MODIFICATION CLEVER AGE jguillot --------------- 352 353 $syndicArticleMetier = &recuperer_instance_syndic_articles(); 354 $result_deja = $syndicArticleMetier->getSyndicArticleForUrl($le_lien, $now_id_syndic); 355 356 if (PEAR::isError($result_deja)) { 357 die ($result_deja->getMessage()); 358 } 359 if (sizeOf($result_deja) == 0) { 360 $syndicArticleMetier->setSyndicId($now_id_syndic); 361 $syndicArticleMetier->setTitre($le_titre); 362 $syndicArticleMetier->setUrl($le_lien); 363 $maDate = new Date($la_date); 364 $syndicArticleMetier->setDate($maDate->getDate(DATE_FORMAT_ISO)); 365 $syndicArticleMetier->setLesAuteurs($les_auteurs); 366 $syndicArticleMetier->setStatut($moderation); 367 $syndicArticleMetier->setDescriptif($la_description); 368 $createOK = $syndicArticleMetier->create(); 369 370 if (PEAR::isError($createOK)) { 371 die ($createOK->getMessage()); 372 } 373 $flag_ajout_lien = true; 374 } 375 } 376 377 //------------MODIFICATION CLEVER AGE elebescond 378 $syndicMetier = &recuperer_instance_syndic(); 379 $loadOK = $syndicMetier->load($now_id_syndic); 380 if (PEAR::isError($loadOK)) { 381 die ($loadOK->getMessage()); 382 } 383 else { 384 $syndicMetier->setSyndication('oui'); 385 $updateOK = $syndicMetier->update(); 386 if (PEAR::isError($updateOK)) { 387 die ($updateOK->getMessage()); 388 } 389 } 390 } 391 // syndication javascript : y a-t-il quelqu'un qui se sert de ce truc ?? 392 // la question est posee 393 else if (ereg("document\.write", $le_retour)) { 394 $i = 0; 395 396 while ($i < 50 AND eregi("<a[[:space:]]+href[[:space:]]*=[[:space:]]*\"?([^\">]+)\"?[^>]*>(.*)", $le_retour, 397 $reg)) { //" 398 $le_lien = stripslashes($reg[1]); 399 $la_suite = $reg[2]; 400 401 $pos_fin = strpos($la_suite, "</a"); 402 $pos_fin2 = strpos($la_suite, "</A"); 403 404 if ($pos_fin2 > $pos_fin) 405 $pos_fin = $pos_fin2; 406 407 $le_titre = substr($la_suite, 0, $pos_fin); 408 //------------MODIFICATION CLEVER AGE elebescond --------------- 409 $le_titre = stripslashes($le_titre); 410 //$le_titre = addslashes(stripslashes($le_titre)); 411 //------------FIN MODIFICATION CLEVER AGE elebescond --------------- 412 $le_titre = ereg_replace("<[^>]*>", "", $le_titre); 413 $le_retour = substr($la_suite, $pos_fin + 4, strlen($le_retour)); 414 415 echo "<li> $le_titre / $le_lien"; 416 417 if (strlen($la_date) < 4) 418 $la_date = date("Y-m-j H:i:00"); 419 420 $syndicArticleMetier = &recuperer_instance_syndic_articles(); 421 $result_deja = $syndicArticleMetier->getSyndicArticleForUrl($le_lien, $now_id_syndic); 422 423 if (PEAR::isError($result_deja)) { 424 die ($result_deja->getMessage()); 425 } 426 427 if (sizeOf($result_deja) == 0) { 428 $syndicArticleMetier->setSyndicId($now_id_syndic); 429 $syndicArticleMetier->setTitre($le_titre); 430 $syndicArticleMetier->setUrl($le_lien); 431 $maDate = new Date($la_date); 432 $syndicArticleMetier->setDate($maDate->getDate(DATE_FORMAT_ISO)); 433 $syndicArticleMetier->setLesAuteurs($les_auteurs); 434 $syndicArticleMetier->setStatut($moderation); 435 $syndicArticleMetier->setDescriptif($la_description); 436 $createOK = $syndicArticleMetier->create(); 437 438 if (PEAR::isError($createOK)) { 439 die ($createOK->getMessage()); 440 } 441 $flag_ajout_lien = true; 442 } 443 $i++; 444 } 445 446 $syndicMetier = &recuperer_instance_syndic(); 447 $loadOK = $syndicMetier->load($now_id_syndic); 448 if (PEAR::isError($loadOK)) { 449 die ($loadOK->getMessage()); 450 } 451 else { 452 $syndicMetier->setSyndication('oui'); 453 $maDate = new Date(); 454 $syndicMetier->setDateSyndic($maDate->getDate(DATE_FORMAT_ISO)); 455 $updateOK = $syndicMetier->update(); 456 if (PEAR::isError($updateOK)) { 457 die ($updateOK->getMessage()); 458 } 459 } 460 } 461 else 462 $erreur = _T('avis_echec_syndication_01'); 463 } 464 else 465 $erreur = _T('avis_echec_syndication_02'); 466 467 // Ne pas oublier de liberer le verrou 468 $serviceMetier = &recuperer_instance_service(); 469 470 if ($flag_ajout_lien) { 471 include_ecrire ('inc_rubriques.php'); 472 } 473 474 return $erreur; 475 } 476 477 // 478 // Effectuer la syndication d'un unique site 479 // 480 481 function executer_une_syndication() { 482 require_once (dirname(__FILE__)."/include/bd/inc_syndic_factory.php"); 483 $syndicMetier = &recuperer_instance_syndic(); 484 $allSyndics = $syndicMetier->getAllForSyndicationAndStatutAndIntervalHour('sus', 'publie', 24); 485 if(PEAR::isError($allSyndics)) { 486 die($allSyndics->getMessage()); 487 } 488 while(list(, $syndicMetier) = each($allSyndics)) { 489 $id_syndic = $syndicMetier->getSyndicId(); 490 syndic_a_jour($id_syndic); 491 } 492 493 $syndicMetier = &recuperer_instance_syndic(); 494 $allSyndics = $syndicMetier->getAllForSyndicationAndStatutAndIntervalHour('oui', 'publie', 2); 495 if(PEAR::isError($allSyndics)) { 496 die($allSyndics->getMessage()); 497 } 498 while(list(, $syndicMetier) = each($allSyndics)) { 499 $id_syndic = $syndicMetier->getSyndicId(); 500 syndic_a_jour($id_syndic, 'sus'); 501 } 502 } 503 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sat Feb 24 14:40:03 2007 | par Balluche grâce à PHPXref 0.7 |