@@ -135,9 +135,9 @@ discard block |
||
| 135 | 135 | sql_updateq( |
| 136 | 136 | 'spip_rubriques', |
| 137 | 137 | ['statut' => 'publie', 'date' => date('Y-m-d H:i:s')], |
| 138 | - 'id_rubrique=' . intval($id_rubrique) |
|
| 138 | + 'id_rubrique='.intval($id_rubrique) |
|
| 139 | 139 | ); |
| 140 | - $id_parent = sql_getfetsel('id_parent', 'spip_rubriques AS R', 'R.id_rubrique=' . intval($id_rubrique)); |
|
| 140 | + $id_parent = sql_getfetsel('id_parent', 'spip_rubriques AS R', 'R.id_rubrique='.intval($id_rubrique)); |
|
| 141 | 141 | if (!$id_parent) { |
| 142 | 142 | break; |
| 143 | 143 | } |
@@ -172,7 +172,7 @@ discard block |
||
| 172 | 172 | return $id_pred != $id_rubrique; |
| 173 | 173 | } |
| 174 | 174 | // passer au parent si on a depublie |
| 175 | - $r = sql_fetsel('id_parent', 'spip_rubriques', 'id_rubrique=' . intval($id_pred)); |
|
| 175 | + $r = sql_fetsel('id_parent', 'spip_rubriques', 'id_rubrique='.intval($id_pred)); |
|
| 176 | 176 | $id_pred = $r['id_parent']; |
| 177 | 177 | } |
| 178 | 178 | |
@@ -197,14 +197,14 @@ discard block |
||
| 197 | 197 | $date = date('Y-m-d H:i:s'); |
| 198 | 198 | } |
| 199 | 199 | $postdates = ($GLOBALS['meta']['post_dates'] == 'non') ? |
| 200 | - ' AND date <= ' . sql_quote($date) : ''; |
|
| 200 | + ' AND date <= '.sql_quote($date) : ''; |
|
| 201 | 201 | |
| 202 | 202 | if (!$id_rubrique = intval($id_rubrique)) { |
| 203 | 203 | return false; |
| 204 | 204 | } |
| 205 | 205 | |
| 206 | 206 | // verifier qu'elle existe et est bien publiee |
| 207 | - $r = sql_fetsel('id_rubrique,statut', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique)); |
|
| 207 | + $r = sql_fetsel('id_rubrique,statut', 'spip_rubriques', 'id_rubrique='.intval($id_rubrique)); |
|
| 208 | 208 | if (!$r or $r['statut'] !== 'publie') { |
| 209 | 209 | return false; |
| 210 | 210 | } |
@@ -214,12 +214,12 @@ discard block |
||
| 214 | 214 | $compte = [ |
| 215 | 215 | 'articles' => sql_countsel( |
| 216 | 216 | 'spip_articles', |
| 217 | - 'id_rubrique=' . intval($id_rubrique) . " AND statut='publie'$postdates" |
|
| 217 | + 'id_rubrique='.intval($id_rubrique)." AND statut='publie'$postdates" |
|
| 218 | 218 | ), |
| 219 | - 'rubriques' => sql_countsel('spip_rubriques', 'id_parent=' . intval($id_rubrique) . " AND statut='publie'"), |
|
| 219 | + 'rubriques' => sql_countsel('spip_rubriques', 'id_parent='.intval($id_rubrique)." AND statut='publie'"), |
|
| 220 | 220 | 'documents' => sql_countsel( |
| 221 | 221 | 'spip_documents AS D JOIN spip_documents_liens AS L ON D.id_document=L.id_document', |
| 222 | - 'L.id_objet=' . intval($id_rubrique) . " AND L.objet='rubrique' and D.mode NOT IN('logoon', 'logooff') " |
|
| 222 | + 'L.id_objet='.intval($id_rubrique)." AND L.objet='rubrique' and D.mode NOT IN('logoon', 'logooff') " |
|
| 223 | 223 | ) |
| 224 | 224 | ]; |
| 225 | 225 | |
@@ -244,7 +244,7 @@ discard block |
||
| 244 | 244 | } |
| 245 | 245 | } |
| 246 | 246 | |
| 247 | - sql_updateq('spip_rubriques', ['statut' => 'prepa'], 'id_rubrique=' . intval($id_rubrique)); |
|
| 247 | + sql_updateq('spip_rubriques', ['statut' => 'prepa'], 'id_rubrique='.intval($id_rubrique)); |
|
| 248 | 248 | |
| 249 | 249 | # spip_log("depublier_rubrique $id_pred"); |
| 250 | 250 | return true; |
@@ -307,7 +307,7 @@ discard block |
||
| 307 | 307 | |
| 308 | 308 | // Afficher les articles post-dates ? |
| 309 | 309 | $postdates = ($GLOBALS['meta']['post_dates'] == 'non') ? |
| 310 | - 'AND A.date <= ' . sql_quote(date('Y-m-d H:i:s')) : ''; |
|
| 310 | + 'AND A.date <= '.sql_quote(date('Y-m-d H:i:s')) : ''; |
|
| 311 | 311 | |
| 312 | 312 | $r = sql_select( |
| 313 | 313 | 'R.id_rubrique AS id, max(A.date) AS date_h', |
@@ -319,7 +319,7 @@ discard block |
||
| 319 | 319 | sql_updateq( |
| 320 | 320 | 'spip_rubriques', |
| 321 | 321 | ['statut_tmp' => 'publie', 'date_tmp' => $row['date_h']], |
| 322 | - 'id_rubrique=' . intval($row['id']) |
|
| 322 | + 'id_rubrique='.intval($row['id']) |
|
| 323 | 323 | ); |
| 324 | 324 | } |
| 325 | 325 | |
@@ -345,7 +345,7 @@ discard block |
||
| 345 | 345 | sql_updateq( |
| 346 | 346 | 'spip_rubriques', |
| 347 | 347 | ['statut_tmp' => 'publie', 'date_tmp' => $row['date_h']], |
| 348 | - 'id_rubrique=' . intval($row['id']) |
|
| 348 | + 'id_rubrique='.intval($row['id']) |
|
| 349 | 349 | ); |
| 350 | 350 | $continuer = true; |
| 351 | 351 | } |
@@ -398,7 +398,7 @@ discard block |
||
| 398 | 398 | and $rows = sql_allfetsel( |
| 399 | 399 | 'A.id_rubrique AS id, R.id_secteur AS id_secteur, R.profondeur+1 as profondeur', |
| 400 | 400 | 'spip_rubriques AS A JOIN spip_rubriques AS R ON A.id_parent = R.id_rubrique', |
| 401 | - 'R.profondeur=' . intval($prof) . ' AND (A.id_secteur <> R.id_secteur OR A.profondeur > R.profondeur+1)', |
|
| 401 | + 'R.profondeur='.intval($prof).' AND (A.id_secteur <> R.id_secteur OR A.profondeur > R.profondeur+1)', |
|
| 402 | 402 | '', |
| 403 | 403 | 'R.id_secteur', |
| 404 | 404 | '0,100' |
@@ -437,11 +437,11 @@ discard block |
||
| 437 | 437 | and $rows = sql_allfetsel( |
| 438 | 438 | 'id_rubrique as id', |
| 439 | 439 | 'spip_rubriques', |
| 440 | - 'profondeur=' . intval($prof + 1) . ' AND id_parent NOT IN (' . sql_get_select( |
|
| 440 | + 'profondeur='.intval($prof + 1).' AND id_parent NOT IN ('.sql_get_select( |
|
| 441 | 441 | 'zzz.id_rubrique', |
| 442 | 442 | 'spip_rubriques AS zzz', |
| 443 | - 'zzz.profondeur=' . intval($prof) |
|
| 444 | - ) . ')', |
|
| 443 | + 'zzz.profondeur='.intval($prof) |
|
| 444 | + ).')', |
|
| 445 | 445 | '', |
| 446 | 446 | '', |
| 447 | 447 | '0,100' |
@@ -455,7 +455,7 @@ discard block |
||
| 455 | 455 | // si pas de rubrique a profondeur $prof+1 pas la peine de continuer |
| 456 | 456 | // si il reste des rubriques non vues, c'est une branche morte ou reference circulaire (base foireuse) |
| 457 | 457 | // on arrete les frais |
| 458 | - if (sql_countsel('spip_rubriques', 'profondeur=' . intval($prof + 1))) { |
|
| 458 | + if (sql_countsel('spip_rubriques', 'profondeur='.intval($prof + 1))) { |
|
| 459 | 459 | $prof++; |
| 460 | 460 | $continuer = true; |
| 461 | 461 | } |
@@ -463,12 +463,12 @@ discard block |
||
| 463 | 463 | |
| 464 | 464 | // loger si la table des rubriques semble foireuse |
| 465 | 465 | // et mettre un id_secteur=0 sur ces rubriques pour eviter toute selection par les boucles |
| 466 | - if (sql_countsel('spip_rubriques', 'profondeur>' . intval($prof + 1))) { |
|
| 466 | + if (sql_countsel('spip_rubriques', 'profondeur>'.intval($prof + 1))) { |
|
| 467 | 467 | spip_log( |
| 468 | - 'Les rubriques de profondeur>' . ($prof + 1) . ' semblent suspectes (branches morte ou reference circulaire dans les parents)', |
|
| 468 | + 'Les rubriques de profondeur>'.($prof + 1).' semblent suspectes (branches morte ou reference circulaire dans les parents)', |
|
| 469 | 469 | _LOG_CRITIQUE |
| 470 | 470 | ); |
| 471 | - sql_update('spip_rubriques', ['id_secteur' => 0], 'profondeur>' . intval($prof + 1)); |
|
| 471 | + sql_update('spip_rubriques', ['id_secteur' => 0], 'profondeur>'.intval($prof + 1)); |
|
| 472 | 472 | } |
| 473 | 473 | |
| 474 | 474 | // reparer les articles |
@@ -479,7 +479,7 @@ discard block |
||
| 479 | 479 | ); |
| 480 | 480 | |
| 481 | 481 | while ($row = sql_fetch($r)) { |
| 482 | - sql_update('spip_articles', ['id_secteur' => $row['secteur']], 'id_article=' . intval($row['id'])); |
|
| 482 | + sql_update('spip_articles', ['id_secteur' => $row['secteur']], 'id_article='.intval($row['id'])); |
|
| 483 | 483 | } |
| 484 | 484 | |
| 485 | 485 | // avertir les plugins qui peuvent faire leur mises a jour egalement |
@@ -510,7 +510,7 @@ discard block |
||
| 510 | 510 | $t = sql_updateq( |
| 511 | 511 | 'spip_rubriques', |
| 512 | 512 | ['lang' => $row['lang'], 'langue_choisie' => 'non'], |
| 513 | - 'id_rubrique=' . intval($id_rubrique) |
|
| 513 | + 'id_rubrique='.intval($id_rubrique) |
|
| 514 | 514 | ); |
| 515 | 515 | } |
| 516 | 516 | |
@@ -555,7 +555,7 @@ discard block |
||
| 555 | 555 | sql_updateq( |
| 556 | 556 | 'spip_articles', |
| 557 | 557 | ['lang' => $row['lang'], 'langue_choisie' => 'non'], |
| 558 | - 'id_article=' . intval($id_article) |
|
| 558 | + 'id_article='.intval($id_article) |
|
| 559 | 559 | ); |
| 560 | 560 | } |
| 561 | 561 | |
@@ -630,11 +630,11 @@ discard block |
||
| 630 | 630 | ]; |
| 631 | 631 | // generer un nom de fonction "anonyme" unique |
| 632 | 632 | do { |
| 633 | - $functionname = 'f_calculer_langues_utilisees_' . $boucle->id_table . '_' . time() . '_' . random_int(0, mt_getrandmax()); |
|
| 633 | + $functionname = 'f_calculer_langues_utilisees_'.$boucle->id_table.'_'.time().'_'.random_int(0, mt_getrandmax()); |
|
| 634 | 634 | } while (function_exists($functionname)); |
| 635 | 635 | $code = calculer_boucle('calculer_langues_utilisees', $boucles); |
| 636 | - $code = '$SP=0; $command=array();$command["connect"] = $connect = "' . $serveur . '"; $Pile=array(0=>array());' . "\n" . $code; |
|
| 637 | - $code = 'function ' . $functionname . '(){' . $code . '};$res = ' . $functionname . '();'; |
|
| 636 | + $code = '$SP=0; $command=array();$command["connect"] = $connect = "'.$serveur.'"; $Pile=array(0=>array());'."\n".$code; |
|
| 637 | + $code = 'function '.$functionname.'(){'.$code.'};$res = '.$functionname.'();'; |
|
| 638 | 638 | $res = ''; |
| 639 | 639 | eval($code); |
| 640 | 640 | $res = explode(',', $res); |
@@ -736,11 +736,11 @@ discard block |
||
| 736 | 736 | $maxiter-- and $filles = sql_allfetsel( |
| 737 | 737 | 'id_rubrique', |
| 738 | 738 | 'spip_rubriques', |
| 739 | - sql_in('id_parent', $r) . ' AND ' . sql_in('id_rubrique', $r, 'NOT') |
|
| 739 | + sql_in('id_parent', $r).' AND '.sql_in('id_rubrique', $r, 'NOT') |
|
| 740 | 740 | ) |
| 741 | 741 | ) { |
| 742 | 742 | $r = join(',', array_column($filles, 'id_rubrique')); |
| 743 | - $branche .= ',' . $r; |
|
| 743 | + $branche .= ','.$r; |
|
| 744 | 744 | } |
| 745 | 745 | |
| 746 | 746 | # securite pour ne pas plomber la conso memoire sur les sites prolifiques |
@@ -780,7 +780,7 @@ discard block |
||
| 780 | 780 | |
| 781 | 781 | if (isset($b[$id])) { |
| 782 | 782 | // Notre branche commence par la rubrique de depart si $tout=true |
| 783 | - return $tout ? (strlen($b[$id]) ? $b[$id] . ",$id" : $id) : $b[$id]; |
|
| 783 | + return $tout ? (strlen($b[$id]) ? $b[$id].",$id" : $id) : $b[$id]; |
|
| 784 | 784 | } |
| 785 | 785 | |
| 786 | 786 | $hier = ''; |
@@ -793,11 +793,11 @@ discard block |
||
| 793 | 793 | $maxiter-- and $parents = sql_allfetsel( |
| 794 | 794 | 'id_parent', |
| 795 | 795 | 'spip_rubriques', |
| 796 | - sql_in('id_rubrique', $ids_nouveaux_parents) . ' AND ' . sql_in('id_parent', $hier, 'NOT') |
|
| 796 | + sql_in('id_rubrique', $ids_nouveaux_parents).' AND '.sql_in('id_parent', $hier, 'NOT') |
|
| 797 | 797 | ) |
| 798 | 798 | ) { |
| 799 | 799 | $ids_nouveaux_parents = join(',', array_column($parents, 'id_parent')); |
| 800 | - $hier = $ids_nouveaux_parents . (strlen($hier) ? ',' . $hier : ''); |
|
| 800 | + $hier = $ids_nouveaux_parents.(strlen($hier) ? ','.$hier : ''); |
|
| 801 | 801 | } |
| 802 | 802 | |
| 803 | 803 | # securite pour ne pas plomber la conso memoire sur les sites prolifiques |
@@ -829,7 +829,7 @@ discard block |
||
| 829 | 829 | include_spip('base/abstract_sql'); |
| 830 | 830 | if ($check) { |
| 831 | 831 | $postdates = ($GLOBALS['meta']['post_dates'] == 'non') ? |
| 832 | - 'AND A.date <= ' . sql_quote(date('Y-m-d H:i:s')) : ''; |
|
| 832 | + 'AND A.date <= '.sql_quote(date('Y-m-d H:i:s')) : ''; |
|
| 833 | 833 | |
| 834 | 834 | $r = sql_select( |
| 835 | 835 | 'DISTINCT A.id_rubrique AS id', |
@@ -846,7 +846,7 @@ discard block |
||
| 846 | 846 | $t = sql_fetsel( |
| 847 | 847 | 'date', |
| 848 | 848 | 'spip_articles', |
| 849 | - "statut='publie' AND date > " . sql_quote(date('Y-m-d H:i:s')), |
|
| 849 | + "statut='publie' AND date > ".sql_quote(date('Y-m-d H:i:s')), |
|
| 850 | 850 | '', |
| 851 | 851 | 'date', |
| 852 | 852 | '1' |
@@ -902,7 +902,7 @@ discard block |
||
| 902 | 902 | $r = sql_getfetsel( |
| 903 | 903 | 'id_rubrique', |
| 904 | 904 | 'spip_rubriques', |
| 905 | - 'titre = ' . sql_quote($titre) . ' AND id_parent=' . intval($id_parent), |
|
| 905 | + 'titre = '.sql_quote($titre).' AND id_parent='.intval($id_parent), |
|
| 906 | 906 | $groupby = [], |
| 907 | 907 | $orderby = [], |
| 908 | 908 | $limit = '', |
@@ -938,7 +938,7 @@ discard block |
||
| 938 | 938 | sql_updateq( |
| 939 | 939 | 'spip_rubriques', |
| 940 | 940 | ['id_secteur' => $id_secteur, 'lang' => $lang], |
| 941 | - 'id_rubrique=' . intval($id_rubrique), |
|
| 941 | + 'id_rubrique='.intval($id_rubrique), |
|
| 942 | 942 | [], |
| 943 | 943 | $serveur |
| 944 | 944 | ); |
@@ -19,7 +19,7 @@ discard block |
||
| 19 | 19 | */ |
| 20 | 20 | |
| 21 | 21 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 22 | - return; |
|
| 22 | + return; |
|
| 23 | 23 | } |
| 24 | 24 | |
| 25 | 25 | |
@@ -55,65 +55,65 @@ discard block |
||
| 55 | 55 | * @return void |
| 56 | 56 | **/ |
| 57 | 57 | function calculer_rubriques_if($id_rubrique, $modifs, $infos = [], $postdate = false) { |
| 58 | - $statuts_publies = null; |
|
| 59 | - $neuf = false; |
|
| 60 | - |
|
| 61 | - // Compat avec l'ancienne signature |
|
| 62 | - if (is_string($infos)) { |
|
| 63 | - $infos = ['statut_ancien' => $infos]; |
|
| 64 | - } |
|
| 65 | - if (!isset($infos['statut_ancien'])) { |
|
| 66 | - $infos['statut_ancien'] = ''; |
|
| 67 | - } |
|
| 68 | - |
|
| 69 | - // On recherche quels statuts tester |
|
| 70 | - if ( |
|
| 71 | - isset($infos['objet']) |
|
| 72 | - and include_spip('inc/filtres') |
|
| 73 | - and $declaration_statut = objet_info($infos['objet'], 'statut') |
|
| 74 | - and is_array($declaration_statut) |
|
| 75 | - ) { |
|
| 76 | - foreach ($declaration_statut as $champ_statut) { |
|
| 77 | - if ($champ_statut['champ'] == 'statut') { |
|
| 78 | - $statuts_publies = array_map('trim', explode(',', $champ_statut['publie'])); |
|
| 79 | - break; // stop on a trouvé le bon champ |
|
| 80 | - } |
|
| 81 | - } |
|
| 82 | - } else { |
|
| 83 | - $statuts_publies = ['publie']; |
|
| 84 | - } |
|
| 85 | - |
|
| 86 | - if (in_array($infos['statut_ancien'], $statuts_publies)) { |
|
| 87 | - if ( |
|
| 88 | - isset($modifs['statut']) |
|
| 89 | - or isset($modifs['id_rubrique']) |
|
| 90 | - or ($postdate and strtotime($postdate) > time()) |
|
| 91 | - ) { |
|
| 92 | - $neuf |= depublier_branche_rubrique_if($id_rubrique); |
|
| 93 | - } |
|
| 94 | - // ne publier que si c'est pas un postdate, ou si la date n'est pas dans le futur |
|
| 95 | - if ($postdate) { |
|
| 96 | - calculer_prochain_postdate(true); |
|
| 97 | - $neuf |= (strtotime($postdate) <= time()); // par securite |
|
| 98 | - } elseif (isset($modifs['id_rubrique'])) { |
|
| 99 | - $neuf |= publier_branche_rubrique($modifs['id_rubrique']); |
|
| 100 | - } |
|
| 101 | - } elseif (isset($modifs['statut']) and in_array($modifs['statut'], $statuts_publies)) { |
|
| 102 | - if ($postdate) { |
|
| 103 | - calculer_prochain_postdate(true); |
|
| 104 | - $neuf |= (strtotime($postdate) <= time()); // par securite |
|
| 105 | - } else { |
|
| 106 | - $neuf |= publier_branche_rubrique($id_rubrique); |
|
| 107 | - } |
|
| 108 | - } |
|
| 109 | - |
|
| 110 | - if ($neuf) { |
|
| 111 | - // Sauver la date de la derniere mise a jour (pour menu_rubriques) |
|
| 112 | - ecrire_meta('date_calcul_rubriques', date('U')); |
|
| 113 | - } |
|
| 114 | - |
|
| 115 | - $langues = calculer_langues_utilisees(); |
|
| 116 | - ecrire_meta('langues_utilisees', $langues); |
|
| 58 | + $statuts_publies = null; |
|
| 59 | + $neuf = false; |
|
| 60 | + |
|
| 61 | + // Compat avec l'ancienne signature |
|
| 62 | + if (is_string($infos)) { |
|
| 63 | + $infos = ['statut_ancien' => $infos]; |
|
| 64 | + } |
|
| 65 | + if (!isset($infos['statut_ancien'])) { |
|
| 66 | + $infos['statut_ancien'] = ''; |
|
| 67 | + } |
|
| 68 | + |
|
| 69 | + // On recherche quels statuts tester |
|
| 70 | + if ( |
|
| 71 | + isset($infos['objet']) |
|
| 72 | + and include_spip('inc/filtres') |
|
| 73 | + and $declaration_statut = objet_info($infos['objet'], 'statut') |
|
| 74 | + and is_array($declaration_statut) |
|
| 75 | + ) { |
|
| 76 | + foreach ($declaration_statut as $champ_statut) { |
|
| 77 | + if ($champ_statut['champ'] == 'statut') { |
|
| 78 | + $statuts_publies = array_map('trim', explode(',', $champ_statut['publie'])); |
|
| 79 | + break; // stop on a trouvé le bon champ |
|
| 80 | + } |
|
| 81 | + } |
|
| 82 | + } else { |
|
| 83 | + $statuts_publies = ['publie']; |
|
| 84 | + } |
|
| 85 | + |
|
| 86 | + if (in_array($infos['statut_ancien'], $statuts_publies)) { |
|
| 87 | + if ( |
|
| 88 | + isset($modifs['statut']) |
|
| 89 | + or isset($modifs['id_rubrique']) |
|
| 90 | + or ($postdate and strtotime($postdate) > time()) |
|
| 91 | + ) { |
|
| 92 | + $neuf |= depublier_branche_rubrique_if($id_rubrique); |
|
| 93 | + } |
|
| 94 | + // ne publier que si c'est pas un postdate, ou si la date n'est pas dans le futur |
|
| 95 | + if ($postdate) { |
|
| 96 | + calculer_prochain_postdate(true); |
|
| 97 | + $neuf |= (strtotime($postdate) <= time()); // par securite |
|
| 98 | + } elseif (isset($modifs['id_rubrique'])) { |
|
| 99 | + $neuf |= publier_branche_rubrique($modifs['id_rubrique']); |
|
| 100 | + } |
|
| 101 | + } elseif (isset($modifs['statut']) and in_array($modifs['statut'], $statuts_publies)) { |
|
| 102 | + if ($postdate) { |
|
| 103 | + calculer_prochain_postdate(true); |
|
| 104 | + $neuf |= (strtotime($postdate) <= time()); // par securite |
|
| 105 | + } else { |
|
| 106 | + $neuf |= publier_branche_rubrique($id_rubrique); |
|
| 107 | + } |
|
| 108 | + } |
|
| 109 | + |
|
| 110 | + if ($neuf) { |
|
| 111 | + // Sauver la date de la derniere mise a jour (pour menu_rubriques) |
|
| 112 | + ecrire_meta('date_calcul_rubriques', date('U')); |
|
| 113 | + } |
|
| 114 | + |
|
| 115 | + $langues = calculer_langues_utilisees(); |
|
| 116 | + ecrire_meta('langues_utilisees', $langues); |
|
| 117 | 117 | } |
| 118 | 118 | |
| 119 | 119 | |
@@ -131,22 +131,22 @@ discard block |
||
| 131 | 131 | * true si le statut change effectivement |
| 132 | 132 | */ |
| 133 | 133 | function publier_branche_rubrique($id_rubrique) { |
| 134 | - $id_pred = $id_rubrique; |
|
| 135 | - while (true) { |
|
| 136 | - sql_updateq( |
|
| 137 | - 'spip_rubriques', |
|
| 138 | - ['statut' => 'publie', 'date' => date('Y-m-d H:i:s')], |
|
| 139 | - 'id_rubrique=' . intval($id_rubrique) |
|
| 140 | - ); |
|
| 141 | - $id_parent = sql_getfetsel('id_parent', 'spip_rubriques AS R', 'R.id_rubrique=' . intval($id_rubrique)); |
|
| 142 | - if (!$id_parent) { |
|
| 143 | - break; |
|
| 144 | - } |
|
| 145 | - $id_rubrique = $id_parent; |
|
| 146 | - } |
|
| 134 | + $id_pred = $id_rubrique; |
|
| 135 | + while (true) { |
|
| 136 | + sql_updateq( |
|
| 137 | + 'spip_rubriques', |
|
| 138 | + ['statut' => 'publie', 'date' => date('Y-m-d H:i:s')], |
|
| 139 | + 'id_rubrique=' . intval($id_rubrique) |
|
| 140 | + ); |
|
| 141 | + $id_parent = sql_getfetsel('id_parent', 'spip_rubriques AS R', 'R.id_rubrique=' . intval($id_rubrique)); |
|
| 142 | + if (!$id_parent) { |
|
| 143 | + break; |
|
| 144 | + } |
|
| 145 | + $id_rubrique = $id_parent; |
|
| 146 | + } |
|
| 147 | 147 | |
| 148 | 148 | # spip_log(" publier_branche_rubrique($id_rubrique $id_pred"); |
| 149 | - return $id_pred != $id_rubrique; |
|
| 149 | + return $id_pred != $id_rubrique; |
|
| 150 | 150 | } |
| 151 | 151 | |
| 152 | 152 | /** |
@@ -164,20 +164,20 @@ discard block |
||
| 164 | 164 | * true si le statut change effectivement |
| 165 | 165 | */ |
| 166 | 166 | function depublier_branche_rubrique_if($id_rubrique) { |
| 167 | - $date = date('Y-m-d H:i:s'); // figer la date |
|
| 168 | - |
|
| 169 | - # spip_log("depublier_branche_rubrique($id_rubrique ?"); |
|
| 170 | - $id_pred = $id_rubrique; |
|
| 171 | - while ($id_pred) { |
|
| 172 | - if (!depublier_rubrique_if($id_pred, $date)) { |
|
| 173 | - return $id_pred != $id_rubrique; |
|
| 174 | - } |
|
| 175 | - // passer au parent si on a depublie |
|
| 176 | - $r = sql_fetsel('id_parent', 'spip_rubriques', 'id_rubrique=' . intval($id_pred)); |
|
| 177 | - $id_pred = $r['id_parent']; |
|
| 178 | - } |
|
| 179 | - |
|
| 180 | - return $id_pred != $id_rubrique; |
|
| 167 | + $date = date('Y-m-d H:i:s'); // figer la date |
|
| 168 | + |
|
| 169 | + # spip_log("depublier_branche_rubrique($id_rubrique ?"); |
|
| 170 | + $id_pred = $id_rubrique; |
|
| 171 | + while ($id_pred) { |
|
| 172 | + if (!depublier_rubrique_if($id_pred, $date)) { |
|
| 173 | + return $id_pred != $id_rubrique; |
|
| 174 | + } |
|
| 175 | + // passer au parent si on a depublie |
|
| 176 | + $r = sql_fetsel('id_parent', 'spip_rubriques', 'id_rubrique=' . intval($id_pred)); |
|
| 177 | + $id_pred = $r['id_parent']; |
|
| 178 | + } |
|
| 179 | + |
|
| 180 | + return $id_pred != $id_rubrique; |
|
| 181 | 181 | } |
| 182 | 182 | |
| 183 | 183 | /** |
@@ -194,61 +194,61 @@ discard block |
||
| 194 | 194 | * true si la rubrique a été dépubliée |
| 195 | 195 | */ |
| 196 | 196 | function depublier_rubrique_if($id_rubrique, $date = null) { |
| 197 | - if (is_null($date)) { |
|
| 198 | - $date = date('Y-m-d H:i:s'); |
|
| 199 | - } |
|
| 200 | - $postdates = ($GLOBALS['meta']['post_dates'] == 'non') ? |
|
| 201 | - ' AND date <= ' . sql_quote($date) : ''; |
|
| 202 | - |
|
| 203 | - if (!$id_rubrique = intval($id_rubrique)) { |
|
| 204 | - return false; |
|
| 205 | - } |
|
| 206 | - |
|
| 207 | - // verifier qu'elle existe et est bien publiee |
|
| 208 | - $r = sql_fetsel('id_rubrique,statut', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique)); |
|
| 209 | - if (!$r or $r['statut'] !== 'publie') { |
|
| 210 | - return false; |
|
| 211 | - } |
|
| 212 | - |
|
| 213 | - // On met le nombre de chaque type d'enfants dans un tableau |
|
| 214 | - // Le type de l'objet est au pluriel |
|
| 215 | - $compte = [ |
|
| 216 | - 'articles' => sql_countsel( |
|
| 217 | - 'spip_articles', |
|
| 218 | - 'id_rubrique=' . intval($id_rubrique) . " AND statut='publie'$postdates" |
|
| 219 | - ), |
|
| 220 | - 'rubriques' => sql_countsel('spip_rubriques', 'id_parent=' . intval($id_rubrique) . " AND statut='publie'"), |
|
| 221 | - 'documents' => sql_countsel( |
|
| 222 | - 'spip_documents AS D JOIN spip_documents_liens AS L ON D.id_document=L.id_document', |
|
| 223 | - 'L.id_objet=' . intval($id_rubrique) . " AND L.objet='rubrique' and D.mode NOT IN('logoon', 'logooff') " |
|
| 224 | - ) |
|
| 225 | - ]; |
|
| 226 | - |
|
| 227 | - // On passe le tableau des comptes dans un pipeline pour que les plugins puissent ajouter (ou retirer) des enfants |
|
| 228 | - $compte = pipeline( |
|
| 229 | - 'objet_compte_enfants', |
|
| 230 | - [ |
|
| 231 | - 'args' => [ |
|
| 232 | - 'objet' => 'rubrique', |
|
| 233 | - 'id_objet' => $id_rubrique, |
|
| 234 | - 'statut' => 'publie', |
|
| 235 | - 'date' => $date |
|
| 236 | - ], |
|
| 237 | - 'data' => $compte |
|
| 238 | - ] |
|
| 239 | - ); |
|
| 240 | - |
|
| 241 | - // S'il y a au moins un enfant de n'importe quoi, on ne dépublie pas |
|
| 242 | - foreach ($compte as $objet => $n) { |
|
| 243 | - if ($n) { |
|
| 244 | - return false; |
|
| 245 | - } |
|
| 246 | - } |
|
| 247 | - |
|
| 248 | - sql_updateq('spip_rubriques', ['statut' => 'prepa'], 'id_rubrique=' . intval($id_rubrique)); |
|
| 197 | + if (is_null($date)) { |
|
| 198 | + $date = date('Y-m-d H:i:s'); |
|
| 199 | + } |
|
| 200 | + $postdates = ($GLOBALS['meta']['post_dates'] == 'non') ? |
|
| 201 | + ' AND date <= ' . sql_quote($date) : ''; |
|
| 202 | + |
|
| 203 | + if (!$id_rubrique = intval($id_rubrique)) { |
|
| 204 | + return false; |
|
| 205 | + } |
|
| 206 | + |
|
| 207 | + // verifier qu'elle existe et est bien publiee |
|
| 208 | + $r = sql_fetsel('id_rubrique,statut', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique)); |
|
| 209 | + if (!$r or $r['statut'] !== 'publie') { |
|
| 210 | + return false; |
|
| 211 | + } |
|
| 212 | + |
|
| 213 | + // On met le nombre de chaque type d'enfants dans un tableau |
|
| 214 | + // Le type de l'objet est au pluriel |
|
| 215 | + $compte = [ |
|
| 216 | + 'articles' => sql_countsel( |
|
| 217 | + 'spip_articles', |
|
| 218 | + 'id_rubrique=' . intval($id_rubrique) . " AND statut='publie'$postdates" |
|
| 219 | + ), |
|
| 220 | + 'rubriques' => sql_countsel('spip_rubriques', 'id_parent=' . intval($id_rubrique) . " AND statut='publie'"), |
|
| 221 | + 'documents' => sql_countsel( |
|
| 222 | + 'spip_documents AS D JOIN spip_documents_liens AS L ON D.id_document=L.id_document', |
|
| 223 | + 'L.id_objet=' . intval($id_rubrique) . " AND L.objet='rubrique' and D.mode NOT IN('logoon', 'logooff') " |
|
| 224 | + ) |
|
| 225 | + ]; |
|
| 226 | + |
|
| 227 | + // On passe le tableau des comptes dans un pipeline pour que les plugins puissent ajouter (ou retirer) des enfants |
|
| 228 | + $compte = pipeline( |
|
| 229 | + 'objet_compte_enfants', |
|
| 230 | + [ |
|
| 231 | + 'args' => [ |
|
| 232 | + 'objet' => 'rubrique', |
|
| 233 | + 'id_objet' => $id_rubrique, |
|
| 234 | + 'statut' => 'publie', |
|
| 235 | + 'date' => $date |
|
| 236 | + ], |
|
| 237 | + 'data' => $compte |
|
| 238 | + ] |
|
| 239 | + ); |
|
| 240 | + |
|
| 241 | + // S'il y a au moins un enfant de n'importe quoi, on ne dépublie pas |
|
| 242 | + foreach ($compte as $objet => $n) { |
|
| 243 | + if ($n) { |
|
| 244 | + return false; |
|
| 245 | + } |
|
| 246 | + } |
|
| 247 | + |
|
| 248 | + sql_updateq('spip_rubriques', ['statut' => 'prepa'], 'id_rubrique=' . intval($id_rubrique)); |
|
| 249 | 249 | |
| 250 | 250 | # spip_log("depublier_rubrique $id_pred"); |
| 251 | - return true; |
|
| 251 | + return true; |
|
| 252 | 252 | } |
| 253 | 253 | |
| 254 | 254 | |
@@ -271,18 +271,18 @@ discard block |
||
| 271 | 271 | **/ |
| 272 | 272 | function calculer_rubriques() { |
| 273 | 273 | |
| 274 | - calculer_rubriques_publiees(); |
|
| 274 | + calculer_rubriques_publiees(); |
|
| 275 | 275 | |
| 276 | - // Apres chaque (de)publication |
|
| 277 | - // recalculer les langues utilisees sur le site |
|
| 278 | - $langues = calculer_langues_utilisees(); |
|
| 279 | - ecrire_meta('langues_utilisees', $langues); |
|
| 276 | + // Apres chaque (de)publication |
|
| 277 | + // recalculer les langues utilisees sur le site |
|
| 278 | + $langues = calculer_langues_utilisees(); |
|
| 279 | + ecrire_meta('langues_utilisees', $langues); |
|
| 280 | 280 | |
| 281 | - // Sauver la date de la derniere mise a jour (pour menu_rubriques) |
|
| 282 | - ecrire_meta('date_calcul_rubriques', date('U')); |
|
| 281 | + // Sauver la date de la derniere mise a jour (pour menu_rubriques) |
|
| 282 | + ecrire_meta('date_calcul_rubriques', date('U')); |
|
| 283 | 283 | |
| 284 | - // on calcule la date du prochain article post-date |
|
| 285 | - calculer_prochain_postdate(); |
|
| 284 | + // on calcule la date du prochain article post-date |
|
| 285 | + calculer_prochain_postdate(); |
|
| 286 | 286 | } |
| 287 | 287 | |
| 288 | 288 | |
@@ -299,61 +299,61 @@ discard block |
||
| 299 | 299 | **/ |
| 300 | 300 | function calculer_rubriques_publiees() { |
| 301 | 301 | |
| 302 | - // Mettre les compteurs a zero |
|
| 303 | - sql_updateq('spip_rubriques', ['date_tmp' => '0000-00-00 00:00:00', 'statut_tmp' => 'prepa']); |
|
| 304 | - |
|
| 305 | - // |
|
| 306 | - // Publier et dater les rubriques qui ont un article publie |
|
| 307 | - // |
|
| 308 | - |
|
| 309 | - // Afficher les articles post-dates ? |
|
| 310 | - $postdates = ($GLOBALS['meta']['post_dates'] == 'non') ? |
|
| 311 | - 'AND A.date <= ' . sql_quote(date('Y-m-d H:i:s')) : ''; |
|
| 312 | - |
|
| 313 | - $r = sql_select( |
|
| 314 | - 'R.id_rubrique AS id, max(A.date) AS date_h', |
|
| 315 | - 'spip_rubriques AS R JOIN spip_articles AS A ON R.id_rubrique = A.id_rubrique', |
|
| 316 | - "A.date>R.date_tmp AND A.statut='publie' $postdates ", |
|
| 317 | - 'R.id_rubrique' |
|
| 318 | - ); |
|
| 319 | - while ($row = sql_fetch($r)) { |
|
| 320 | - sql_updateq( |
|
| 321 | - 'spip_rubriques', |
|
| 322 | - ['statut_tmp' => 'publie', 'date_tmp' => $row['date_h']], |
|
| 323 | - 'id_rubrique=' . intval($row['id']) |
|
| 324 | - ); |
|
| 325 | - } |
|
| 326 | - |
|
| 327 | - // point d'entree pour permettre a des plugins de gerer le statut |
|
| 328 | - // autrement (par ex: toute rubrique est publiee des sa creation) |
|
| 329 | - // Ce pipeline fait ce qu'il veut, mais s'il touche aux statuts/dates |
|
| 330 | - // c'est statut_tmp/date_tmp qu'il doit modifier |
|
| 331 | - // [C'est un trigger... a renommer en trig_calculer_rubriques ?] |
|
| 332 | - pipeline('calculer_rubriques', null); |
|
| 333 | - |
|
| 334 | - |
|
| 335 | - // Les rubriques qui ont une rubrique fille plus recente |
|
| 336 | - // on tourne tant que les donnees remontent vers la racine. |
|
| 337 | - do { |
|
| 338 | - $continuer = false; |
|
| 339 | - $r = sql_select( |
|
| 340 | - 'R.id_rubrique AS id, max(SR.date_tmp) AS date_h', |
|
| 341 | - 'spip_rubriques AS R JOIN spip_rubriques AS SR ON R.id_rubrique = SR.id_parent', |
|
| 342 | - "(SR.date_tmp>R.date_tmp OR R.statut_tmp<>'publie') AND SR.statut_tmp='publie' ", |
|
| 343 | - 'R.id_rubrique' |
|
| 344 | - ); |
|
| 345 | - while ($row = sql_fetch($r)) { |
|
| 346 | - sql_updateq( |
|
| 347 | - 'spip_rubriques', |
|
| 348 | - ['statut_tmp' => 'publie', 'date_tmp' => $row['date_h']], |
|
| 349 | - 'id_rubrique=' . intval($row['id']) |
|
| 350 | - ); |
|
| 351 | - $continuer = true; |
|
| 352 | - } |
|
| 353 | - } while ($continuer); |
|
| 354 | - |
|
| 355 | - // Enregistrement des modifs |
|
| 356 | - sql_update('spip_rubriques', ['date' => 'date_tmp', 'statut' => 'statut_tmp']); |
|
| 302 | + // Mettre les compteurs a zero |
|
| 303 | + sql_updateq('spip_rubriques', ['date_tmp' => '0000-00-00 00:00:00', 'statut_tmp' => 'prepa']); |
|
| 304 | + |
|
| 305 | + // |
|
| 306 | + // Publier et dater les rubriques qui ont un article publie |
|
| 307 | + // |
|
| 308 | + |
|
| 309 | + // Afficher les articles post-dates ? |
|
| 310 | + $postdates = ($GLOBALS['meta']['post_dates'] == 'non') ? |
|
| 311 | + 'AND A.date <= ' . sql_quote(date('Y-m-d H:i:s')) : ''; |
|
| 312 | + |
|
| 313 | + $r = sql_select( |
|
| 314 | + 'R.id_rubrique AS id, max(A.date) AS date_h', |
|
| 315 | + 'spip_rubriques AS R JOIN spip_articles AS A ON R.id_rubrique = A.id_rubrique', |
|
| 316 | + "A.date>R.date_tmp AND A.statut='publie' $postdates ", |
|
| 317 | + 'R.id_rubrique' |
|
| 318 | + ); |
|
| 319 | + while ($row = sql_fetch($r)) { |
|
| 320 | + sql_updateq( |
|
| 321 | + 'spip_rubriques', |
|
| 322 | + ['statut_tmp' => 'publie', 'date_tmp' => $row['date_h']], |
|
| 323 | + 'id_rubrique=' . intval($row['id']) |
|
| 324 | + ); |
|
| 325 | + } |
|
| 326 | + |
|
| 327 | + // point d'entree pour permettre a des plugins de gerer le statut |
|
| 328 | + // autrement (par ex: toute rubrique est publiee des sa creation) |
|
| 329 | + // Ce pipeline fait ce qu'il veut, mais s'il touche aux statuts/dates |
|
| 330 | + // c'est statut_tmp/date_tmp qu'il doit modifier |
|
| 331 | + // [C'est un trigger... a renommer en trig_calculer_rubriques ?] |
|
| 332 | + pipeline('calculer_rubriques', null); |
|
| 333 | + |
|
| 334 | + |
|
| 335 | + // Les rubriques qui ont une rubrique fille plus recente |
|
| 336 | + // on tourne tant que les donnees remontent vers la racine. |
|
| 337 | + do { |
|
| 338 | + $continuer = false; |
|
| 339 | + $r = sql_select( |
|
| 340 | + 'R.id_rubrique AS id, max(SR.date_tmp) AS date_h', |
|
| 341 | + 'spip_rubriques AS R JOIN spip_rubriques AS SR ON R.id_rubrique = SR.id_parent', |
|
| 342 | + "(SR.date_tmp>R.date_tmp OR R.statut_tmp<>'publie') AND SR.statut_tmp='publie' ", |
|
| 343 | + 'R.id_rubrique' |
|
| 344 | + ); |
|
| 345 | + while ($row = sql_fetch($r)) { |
|
| 346 | + sql_updateq( |
|
| 347 | + 'spip_rubriques', |
|
| 348 | + ['statut_tmp' => 'publie', 'date_tmp' => $row['date_h']], |
|
| 349 | + 'id_rubrique=' . intval($row['id']) |
|
| 350 | + ); |
|
| 351 | + $continuer = true; |
|
| 352 | + } |
|
| 353 | + } while ($continuer); |
|
| 354 | + |
|
| 355 | + // Enregistrement des modifs |
|
| 356 | + sql_update('spip_rubriques', ['date' => 'date_tmp', 'statut' => 'statut_tmp']); |
|
| 357 | 357 | } |
| 358 | 358 | |
| 359 | 359 | /** |
@@ -368,123 +368,123 @@ discard block |
||
| 368 | 368 | * @return void |
| 369 | 369 | **/ |
| 370 | 370 | function propager_les_secteurs() { |
| 371 | - // Profondeur 0 |
|
| 372 | - // Toutes les rubriques racines sont de profondeur 0 |
|
| 373 | - // et fixer les id_secteur des rubriques racines |
|
| 374 | - sql_update('spip_rubriques', ['id_secteur' => 'id_rubrique', 'profondeur' => 0], 'id_parent=0'); |
|
| 375 | - // Toute rubrique non racine est de profondeur >0 |
|
| 376 | - sql_updateq('spip_rubriques', ['profondeur' => 1], 'id_parent<>0 AND profondeur=0'); |
|
| 377 | - |
|
| 378 | - // securite : pas plus d'iteration que de rubriques dans la base |
|
| 379 | - $maxiter = sql_countsel('spip_rubriques'); |
|
| 380 | - |
|
| 381 | - // reparer les rubriques qui n'ont pas l'id_secteur de leur parent |
|
| 382 | - // on fait profondeur par profondeur |
|
| 383 | - |
|
| 384 | - $prof = 0; |
|
| 385 | - do { |
|
| 386 | - $continuer = false; |
|
| 387 | - |
|
| 388 | - // Par recursivite : si toutes les rubriques de profondeur $prof sont bonnes |
|
| 389 | - // on fixe le profondeur $prof+1 |
|
| 390 | - |
|
| 391 | - // Toutes les rubriques dont le parent est de profondeur $prof ont une profondeur $prof+1 |
|
| 392 | - // on teste A.profondeur > $prof+1 car : |
|
| 393 | - // - toutes les rubriques de profondeur 0 à $prof sont bonnes |
|
| 394 | - // - si A.profondeur = $prof+1 c'est bon |
|
| 395 | - // - cela nous protege de la boucle infinie en cas de reference circulaire dans les rubriques |
|
| 396 | - $maxiter2 = $maxiter; |
|
| 397 | - while ( |
|
| 398 | - $maxiter2-- |
|
| 399 | - and $rows = sql_allfetsel( |
|
| 400 | - 'A.id_rubrique AS id, R.id_secteur AS id_secteur, R.profondeur+1 as profondeur', |
|
| 401 | - 'spip_rubriques AS A JOIN spip_rubriques AS R ON A.id_parent = R.id_rubrique', |
|
| 402 | - 'R.profondeur=' . intval($prof) . ' AND (A.id_secteur <> R.id_secteur OR A.profondeur > R.profondeur+1)', |
|
| 403 | - '', |
|
| 404 | - 'R.id_secteur', |
|
| 405 | - '0,100' |
|
| 406 | - ) |
|
| 407 | - ) { |
|
| 408 | - $id_secteur = null; |
|
| 409 | - $ids = []; |
|
| 410 | - while ($row = array_shift($rows)) { |
|
| 411 | - if ($row['id_secteur'] !== $id_secteur) { |
|
| 412 | - if (count($ids)) { |
|
| 413 | - sql_updateq( |
|
| 414 | - 'spip_rubriques', |
|
| 415 | - ['id_secteur' => $id_secteur, 'profondeur' => $prof + 1], |
|
| 416 | - sql_in('id_rubrique', $ids) |
|
| 417 | - ); |
|
| 418 | - } |
|
| 419 | - $id_secteur = $row['id_secteur']; |
|
| 420 | - $ids = []; |
|
| 421 | - } |
|
| 422 | - $ids[] = $row['id']; |
|
| 423 | - } |
|
| 424 | - if (count($ids)) { |
|
| 425 | - sql_updateq( |
|
| 426 | - 'spip_rubriques', |
|
| 427 | - ['id_secteur' => $id_secteur, 'profondeur' => $prof + 1], |
|
| 428 | - sql_in('id_rubrique', $ids) |
|
| 429 | - ); |
|
| 430 | - } |
|
| 431 | - } |
|
| 432 | - |
|
| 433 | - |
|
| 434 | - // Toutes les rubriques de profondeur $prof+1 qui n'ont pas un parent de profondeur $prof sont decalees |
|
| 435 | - $maxiter2 = $maxiter; |
|
| 436 | - while ( |
|
| 437 | - $maxiter2-- |
|
| 438 | - and $rows = sql_allfetsel( |
|
| 439 | - 'id_rubrique as id', |
|
| 440 | - 'spip_rubriques', |
|
| 441 | - 'profondeur=' . intval($prof + 1) . ' AND id_parent NOT IN (' . sql_get_select( |
|
| 442 | - 'zzz.id_rubrique', |
|
| 443 | - 'spip_rubriques AS zzz', |
|
| 444 | - 'zzz.profondeur=' . intval($prof) |
|
| 445 | - ) . ')', |
|
| 446 | - '', |
|
| 447 | - '', |
|
| 448 | - '0,100' |
|
| 449 | - ) |
|
| 450 | - ) { |
|
| 451 | - $rows = array_column($rows, 'id'); |
|
| 452 | - sql_updateq('spip_rubriques', ['profondeur' => $prof + 2], sql_in('id_rubrique', $rows)); |
|
| 453 | - } |
|
| 454 | - |
|
| 455 | - // ici on a fini de valider $prof+1, toutes les rubriques de prondeur 0 a $prof+1 sont OK |
|
| 456 | - // si pas de rubrique a profondeur $prof+1 pas la peine de continuer |
|
| 457 | - // si il reste des rubriques non vues, c'est une branche morte ou reference circulaire (base foireuse) |
|
| 458 | - // on arrete les frais |
|
| 459 | - if (sql_countsel('spip_rubriques', 'profondeur=' . intval($prof + 1))) { |
|
| 460 | - $prof++; |
|
| 461 | - $continuer = true; |
|
| 462 | - } |
|
| 463 | - } while ($continuer and $maxiter--); |
|
| 464 | - |
|
| 465 | - // loger si la table des rubriques semble foireuse |
|
| 466 | - // et mettre un id_secteur=0 sur ces rubriques pour eviter toute selection par les boucles |
|
| 467 | - if (sql_countsel('spip_rubriques', 'profondeur>' . intval($prof + 1))) { |
|
| 468 | - spip_log( |
|
| 469 | - 'Les rubriques de profondeur>' . ($prof + 1) . ' semblent suspectes (branches morte ou reference circulaire dans les parents)', |
|
| 470 | - _LOG_CRITIQUE |
|
| 471 | - ); |
|
| 472 | - sql_update('spip_rubriques', ['id_secteur' => 0], 'profondeur>' . intval($prof + 1)); |
|
| 473 | - } |
|
| 474 | - |
|
| 475 | - // reparer les articles |
|
| 476 | - $r = sql_select( |
|
| 477 | - 'A.id_article AS id, R.id_secteur AS secteur', |
|
| 478 | - 'spip_articles AS A, spip_rubriques AS R', |
|
| 479 | - 'A.id_rubrique = R.id_rubrique AND A.id_secteur <> R.id_secteur' |
|
| 480 | - ); |
|
| 481 | - |
|
| 482 | - while ($row = sql_fetch($r)) { |
|
| 483 | - sql_update('spip_articles', ['id_secteur' => $row['secteur']], 'id_article=' . intval($row['id'])); |
|
| 484 | - } |
|
| 485 | - |
|
| 486 | - // avertir les plugins qui peuvent faire leur mises a jour egalement |
|
| 487 | - pipeline('trig_propager_les_secteurs', ''); |
|
| 371 | + // Profondeur 0 |
|
| 372 | + // Toutes les rubriques racines sont de profondeur 0 |
|
| 373 | + // et fixer les id_secteur des rubriques racines |
|
| 374 | + sql_update('spip_rubriques', ['id_secteur' => 'id_rubrique', 'profondeur' => 0], 'id_parent=0'); |
|
| 375 | + // Toute rubrique non racine est de profondeur >0 |
|
| 376 | + sql_updateq('spip_rubriques', ['profondeur' => 1], 'id_parent<>0 AND profondeur=0'); |
|
| 377 | + |
|
| 378 | + // securite : pas plus d'iteration que de rubriques dans la base |
|
| 379 | + $maxiter = sql_countsel('spip_rubriques'); |
|
| 380 | + |
|
| 381 | + // reparer les rubriques qui n'ont pas l'id_secteur de leur parent |
|
| 382 | + // on fait profondeur par profondeur |
|
| 383 | + |
|
| 384 | + $prof = 0; |
|
| 385 | + do { |
|
| 386 | + $continuer = false; |
|
| 387 | + |
|
| 388 | + // Par recursivite : si toutes les rubriques de profondeur $prof sont bonnes |
|
| 389 | + // on fixe le profondeur $prof+1 |
|
| 390 | + |
|
| 391 | + // Toutes les rubriques dont le parent est de profondeur $prof ont une profondeur $prof+1 |
|
| 392 | + // on teste A.profondeur > $prof+1 car : |
|
| 393 | + // - toutes les rubriques de profondeur 0 à $prof sont bonnes |
|
| 394 | + // - si A.profondeur = $prof+1 c'est bon |
|
| 395 | + // - cela nous protege de la boucle infinie en cas de reference circulaire dans les rubriques |
|
| 396 | + $maxiter2 = $maxiter; |
|
| 397 | + while ( |
|
| 398 | + $maxiter2-- |
|
| 399 | + and $rows = sql_allfetsel( |
|
| 400 | + 'A.id_rubrique AS id, R.id_secteur AS id_secteur, R.profondeur+1 as profondeur', |
|
| 401 | + 'spip_rubriques AS A JOIN spip_rubriques AS R ON A.id_parent = R.id_rubrique', |
|
| 402 | + 'R.profondeur=' . intval($prof) . ' AND (A.id_secteur <> R.id_secteur OR A.profondeur > R.profondeur+1)', |
|
| 403 | + '', |
|
| 404 | + 'R.id_secteur', |
|
| 405 | + '0,100' |
|
| 406 | + ) |
|
| 407 | + ) { |
|
| 408 | + $id_secteur = null; |
|
| 409 | + $ids = []; |
|
| 410 | + while ($row = array_shift($rows)) { |
|
| 411 | + if ($row['id_secteur'] !== $id_secteur) { |
|
| 412 | + if (count($ids)) { |
|
| 413 | + sql_updateq( |
|
| 414 | + 'spip_rubriques', |
|
| 415 | + ['id_secteur' => $id_secteur, 'profondeur' => $prof + 1], |
|
| 416 | + sql_in('id_rubrique', $ids) |
|
| 417 | + ); |
|
| 418 | + } |
|
| 419 | + $id_secteur = $row['id_secteur']; |
|
| 420 | + $ids = []; |
|
| 421 | + } |
|
| 422 | + $ids[] = $row['id']; |
|
| 423 | + } |
|
| 424 | + if (count($ids)) { |
|
| 425 | + sql_updateq( |
|
| 426 | + 'spip_rubriques', |
|
| 427 | + ['id_secteur' => $id_secteur, 'profondeur' => $prof + 1], |
|
| 428 | + sql_in('id_rubrique', $ids) |
|
| 429 | + ); |
|
| 430 | + } |
|
| 431 | + } |
|
| 432 | + |
|
| 433 | + |
|
| 434 | + // Toutes les rubriques de profondeur $prof+1 qui n'ont pas un parent de profondeur $prof sont decalees |
|
| 435 | + $maxiter2 = $maxiter; |
|
| 436 | + while ( |
|
| 437 | + $maxiter2-- |
|
| 438 | + and $rows = sql_allfetsel( |
|
| 439 | + 'id_rubrique as id', |
|
| 440 | + 'spip_rubriques', |
|
| 441 | + 'profondeur=' . intval($prof + 1) . ' AND id_parent NOT IN (' . sql_get_select( |
|
| 442 | + 'zzz.id_rubrique', |
|
| 443 | + 'spip_rubriques AS zzz', |
|
| 444 | + 'zzz.profondeur=' . intval($prof) |
|
| 445 | + ) . ')', |
|
| 446 | + '', |
|
| 447 | + '', |
|
| 448 | + '0,100' |
|
| 449 | + ) |
|
| 450 | + ) { |
|
| 451 | + $rows = array_column($rows, 'id'); |
|
| 452 | + sql_updateq('spip_rubriques', ['profondeur' => $prof + 2], sql_in('id_rubrique', $rows)); |
|
| 453 | + } |
|
| 454 | + |
|
| 455 | + // ici on a fini de valider $prof+1, toutes les rubriques de prondeur 0 a $prof+1 sont OK |
|
| 456 | + // si pas de rubrique a profondeur $prof+1 pas la peine de continuer |
|
| 457 | + // si il reste des rubriques non vues, c'est une branche morte ou reference circulaire (base foireuse) |
|
| 458 | + // on arrete les frais |
|
| 459 | + if (sql_countsel('spip_rubriques', 'profondeur=' . intval($prof + 1))) { |
|
| 460 | + $prof++; |
|
| 461 | + $continuer = true; |
|
| 462 | + } |
|
| 463 | + } while ($continuer and $maxiter--); |
|
| 464 | + |
|
| 465 | + // loger si la table des rubriques semble foireuse |
|
| 466 | + // et mettre un id_secteur=0 sur ces rubriques pour eviter toute selection par les boucles |
|
| 467 | + if (sql_countsel('spip_rubriques', 'profondeur>' . intval($prof + 1))) { |
|
| 468 | + spip_log( |
|
| 469 | + 'Les rubriques de profondeur>' . ($prof + 1) . ' semblent suspectes (branches morte ou reference circulaire dans les parents)', |
|
| 470 | + _LOG_CRITIQUE |
|
| 471 | + ); |
|
| 472 | + sql_update('spip_rubriques', ['id_secteur' => 0], 'profondeur>' . intval($prof + 1)); |
|
| 473 | + } |
|
| 474 | + |
|
| 475 | + // reparer les articles |
|
| 476 | + $r = sql_select( |
|
| 477 | + 'A.id_article AS id, R.id_secteur AS secteur', |
|
| 478 | + 'spip_articles AS A, spip_rubriques AS R', |
|
| 479 | + 'A.id_rubrique = R.id_rubrique AND A.id_secteur <> R.id_secteur' |
|
| 480 | + ); |
|
| 481 | + |
|
| 482 | + while ($row = sql_fetch($r)) { |
|
| 483 | + sql_update('spip_articles', ['id_secteur' => $row['secteur']], 'id_article=' . intval($row['id'])); |
|
| 484 | + } |
|
| 485 | + |
|
| 486 | + // avertir les plugins qui peuvent faire leur mises a jour egalement |
|
| 487 | + pipeline('trig_propager_les_secteurs', ''); |
|
| 488 | 488 | } |
| 489 | 489 | |
| 490 | 490 | |
@@ -499,23 +499,23 @@ discard block |
||
| 499 | 499 | * true si un changement a eu lieu |
| 500 | 500 | **/ |
| 501 | 501 | function calculer_langues_rubriques_etape() { |
| 502 | - $s = sql_select( |
|
| 503 | - 'A.id_rubrique AS id_rubrique, R.lang AS lang', |
|
| 504 | - 'spip_rubriques AS A, spip_rubriques AS R', |
|
| 505 | - "A.id_parent = R.id_rubrique AND A.langue_choisie != 'oui' AND R.lang<>'' AND R.lang<>A.lang" |
|
| 506 | - ); |
|
| 507 | - |
|
| 508 | - $t = false; |
|
| 509 | - while ($row = sql_fetch($s)) { |
|
| 510 | - $id_rubrique = $row['id_rubrique']; |
|
| 511 | - $t = sql_updateq( |
|
| 512 | - 'spip_rubriques', |
|
| 513 | - ['lang' => $row['lang'], 'langue_choisie' => 'non'], |
|
| 514 | - 'id_rubrique=' . intval($id_rubrique) |
|
| 515 | - ); |
|
| 516 | - } |
|
| 517 | - |
|
| 518 | - return $t; |
|
| 502 | + $s = sql_select( |
|
| 503 | + 'A.id_rubrique AS id_rubrique, R.lang AS lang', |
|
| 504 | + 'spip_rubriques AS A, spip_rubriques AS R', |
|
| 505 | + "A.id_parent = R.id_rubrique AND A.langue_choisie != 'oui' AND R.lang<>'' AND R.lang<>A.lang" |
|
| 506 | + ); |
|
| 507 | + |
|
| 508 | + $t = false; |
|
| 509 | + while ($row = sql_fetch($s)) { |
|
| 510 | + $id_rubrique = $row['id_rubrique']; |
|
| 511 | + $t = sql_updateq( |
|
| 512 | + 'spip_rubriques', |
|
| 513 | + ['lang' => $row['lang'], 'langue_choisie' => 'non'], |
|
| 514 | + 'id_rubrique=' . intval($id_rubrique) |
|
| 515 | + ); |
|
| 516 | + } |
|
| 517 | + |
|
| 518 | + return $t; |
|
| 519 | 519 | } |
| 520 | 520 | |
| 521 | 521 | /** |
@@ -535,38 +535,38 @@ discard block |
||
| 535 | 535 | **/ |
| 536 | 536 | function calculer_langues_rubriques() { |
| 537 | 537 | |
| 538 | - // rubriques (recursivite) |
|
| 539 | - sql_updateq( |
|
| 540 | - 'spip_rubriques', |
|
| 541 | - ['lang' => $GLOBALS['meta']['langue_site'], 'langue_choisie' => 'non'], |
|
| 542 | - "id_parent=0 AND langue_choisie != 'oui'" |
|
| 543 | - ); |
|
| 544 | - while (calculer_langues_rubriques_etape()) { |
|
| 545 | - ; |
|
| 546 | - } |
|
| 547 | - |
|
| 548 | - // articles |
|
| 549 | - $s = sql_select( |
|
| 550 | - 'A.id_article AS id_article, R.lang AS lang', |
|
| 551 | - 'spip_articles AS A, spip_rubriques AS R', |
|
| 552 | - "A.id_rubrique = R.id_rubrique AND A.langue_choisie != 'oui' AND (length(A.lang)=0 OR length(R.lang)>0) AND R.lang<>A.lang" |
|
| 553 | - ); |
|
| 554 | - while ($row = sql_fetch($s)) { |
|
| 555 | - $id_article = $row['id_article']; |
|
| 556 | - sql_updateq( |
|
| 557 | - 'spip_articles', |
|
| 558 | - ['lang' => $row['lang'], 'langue_choisie' => 'non'], |
|
| 559 | - 'id_article=' . intval($id_article) |
|
| 560 | - ); |
|
| 561 | - } |
|
| 562 | - |
|
| 563 | - if ($GLOBALS['meta']['multi_rubriques'] == 'oui') { |
|
| 564 | - $langues = calculer_langues_utilisees(); |
|
| 565 | - ecrire_meta('langues_utilisees', $langues); |
|
| 566 | - } |
|
| 567 | - |
|
| 568 | - // avertir les plugins qui peuvent faire leur mises a jour egalement |
|
| 569 | - pipeline('trig_calculer_langues_rubriques', ''); |
|
| 538 | + // rubriques (recursivite) |
|
| 539 | + sql_updateq( |
|
| 540 | + 'spip_rubriques', |
|
| 541 | + ['lang' => $GLOBALS['meta']['langue_site'], 'langue_choisie' => 'non'], |
|
| 542 | + "id_parent=0 AND langue_choisie != 'oui'" |
|
| 543 | + ); |
|
| 544 | + while (calculer_langues_rubriques_etape()) { |
|
| 545 | + ; |
|
| 546 | + } |
|
| 547 | + |
|
| 548 | + // articles |
|
| 549 | + $s = sql_select( |
|
| 550 | + 'A.id_article AS id_article, R.lang AS lang', |
|
| 551 | + 'spip_articles AS A, spip_rubriques AS R', |
|
| 552 | + "A.id_rubrique = R.id_rubrique AND A.langue_choisie != 'oui' AND (length(A.lang)=0 OR length(R.lang)>0) AND R.lang<>A.lang" |
|
| 553 | + ); |
|
| 554 | + while ($row = sql_fetch($s)) { |
|
| 555 | + $id_article = $row['id_article']; |
|
| 556 | + sql_updateq( |
|
| 557 | + 'spip_articles', |
|
| 558 | + ['lang' => $row['lang'], 'langue_choisie' => 'non'], |
|
| 559 | + 'id_article=' . intval($id_article) |
|
| 560 | + ); |
|
| 561 | + } |
|
| 562 | + |
|
| 563 | + if ($GLOBALS['meta']['multi_rubriques'] == 'oui') { |
|
| 564 | + $langues = calculer_langues_utilisees(); |
|
| 565 | + ecrire_meta('langues_utilisees', $langues); |
|
| 566 | + } |
|
| 567 | + |
|
| 568 | + // avertir les plugins qui peuvent faire leur mises a jour egalement |
|
| 569 | + pipeline('trig_calculer_langues_rubriques', ''); |
|
| 570 | 570 | } |
| 571 | 571 | |
| 572 | 572 | |
@@ -583,80 +583,80 @@ discard block |
||
| 583 | 583 | * Liste des langues utilisées séparées par des virgules |
| 584 | 584 | **/ |
| 585 | 585 | function calculer_langues_utilisees($serveur = '') { |
| 586 | - include_spip('public/interfaces'); |
|
| 587 | - include_spip('public/compiler'); |
|
| 588 | - include_spip('public/composer'); |
|
| 589 | - include_spip('public/phraser_html'); |
|
| 590 | - $langues = []; |
|
| 591 | - |
|
| 592 | - $langues[$GLOBALS['meta']['langue_site']] = 1; |
|
| 593 | - |
|
| 594 | - include_spip('base/objets'); |
|
| 595 | - $tables = lister_tables_objets_sql(); |
|
| 596 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 597 | - |
|
| 598 | - foreach (array_keys($tables) as $t) { |
|
| 599 | - $desc = $trouver_table($t, $serveur); |
|
| 600 | - // c'est une table avec des langues |
|
| 601 | - if ( |
|
| 602 | - $desc['exist'] |
|
| 603 | - and isset($desc['field']['lang']) |
|
| 604 | - and isset($desc['field']['langue_choisie']) |
|
| 605 | - ) { |
|
| 606 | - $boucle = new Boucle(); |
|
| 607 | - $boucle->show = $desc; |
|
| 608 | - $boucle->nom = 'calculer_langues_utilisees'; |
|
| 609 | - $boucle->id_boucle = $desc['table_objet']; |
|
| 610 | - $boucle->id_table = $desc['table_objet']; |
|
| 611 | - $boucle->primary = $desc['key']['PRIMARY KEY'] ?? ''; |
|
| 612 | - $boucle->sql_serveur = $serveur; |
|
| 613 | - $boucle->select[] = 'DISTINCT lang'; |
|
| 614 | - $boucle->from[$desc['table_objet']] = $t; |
|
| 615 | - $boucle->separateur[] = ','; |
|
| 616 | - $boucle->return = '$Pile[$SP][\'lang\']'; |
|
| 617 | - $boucle->iterateur = 'sql'; |
|
| 618 | - |
|
| 619 | - $boucle->descr['nom'] = 'calculer_langues_utilisees'; // eviter notice php |
|
| 620 | - $boucle->descr['sourcefile'] = 'internal'; |
|
| 621 | - $boucle->descr['gram'] = 'html'; |
|
| 622 | - |
|
| 623 | - $boucle = pipeline('pre_boucle', $boucle); |
|
| 624 | - |
|
| 625 | - if ( |
|
| 626 | - isset($desc['statut']) |
|
| 627 | - and $desc['statut'] |
|
| 628 | - ) { |
|
| 629 | - $boucles = [ |
|
| 630 | - 'calculer_langues_utilisees' => $boucle, |
|
| 631 | - ]; |
|
| 632 | - // generer un nom de fonction "anonyme" unique |
|
| 633 | - do { |
|
| 634 | - $functionname = 'f_calculer_langues_utilisees_' . $boucle->id_table . '_' . time() . '_' . random_int(0, mt_getrandmax()); |
|
| 635 | - } while (function_exists($functionname)); |
|
| 636 | - $code = calculer_boucle('calculer_langues_utilisees', $boucles); |
|
| 637 | - $code = '$SP=0; $command=array();$command["connect"] = $connect = "' . $serveur . '"; $Pile=array(0=>array());' . "\n" . $code; |
|
| 638 | - $code = 'function ' . $functionname . '(){' . $code . '};$res = ' . $functionname . '();'; |
|
| 639 | - $res = ''; |
|
| 640 | - eval($code); |
|
| 641 | - $res = explode(',', $res); |
|
| 642 | - foreach ($res as $lang) { |
|
| 643 | - $langues[$lang] = 1; |
|
| 644 | - } |
|
| 645 | - } else { |
|
| 646 | - $res = sql_select(implode(',', $boucle->select), $boucle->from); |
|
| 647 | - while ($row = sql_fetch($res)) { |
|
| 648 | - $langues[$row['lang']] = 1; |
|
| 649 | - } |
|
| 650 | - } |
|
| 651 | - } |
|
| 652 | - } |
|
| 653 | - |
|
| 654 | - $langues = array_filter(array_keys($langues)); |
|
| 655 | - sort($langues); |
|
| 656 | - $langues = join(',', $langues); |
|
| 657 | - spip_log("langues utilisees: $langues"); |
|
| 658 | - |
|
| 659 | - return $langues; |
|
| 586 | + include_spip('public/interfaces'); |
|
| 587 | + include_spip('public/compiler'); |
|
| 588 | + include_spip('public/composer'); |
|
| 589 | + include_spip('public/phraser_html'); |
|
| 590 | + $langues = []; |
|
| 591 | + |
|
| 592 | + $langues[$GLOBALS['meta']['langue_site']] = 1; |
|
| 593 | + |
|
| 594 | + include_spip('base/objets'); |
|
| 595 | + $tables = lister_tables_objets_sql(); |
|
| 596 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 597 | + |
|
| 598 | + foreach (array_keys($tables) as $t) { |
|
| 599 | + $desc = $trouver_table($t, $serveur); |
|
| 600 | + // c'est une table avec des langues |
|
| 601 | + if ( |
|
| 602 | + $desc['exist'] |
|
| 603 | + and isset($desc['field']['lang']) |
|
| 604 | + and isset($desc['field']['langue_choisie']) |
|
| 605 | + ) { |
|
| 606 | + $boucle = new Boucle(); |
|
| 607 | + $boucle->show = $desc; |
|
| 608 | + $boucle->nom = 'calculer_langues_utilisees'; |
|
| 609 | + $boucle->id_boucle = $desc['table_objet']; |
|
| 610 | + $boucle->id_table = $desc['table_objet']; |
|
| 611 | + $boucle->primary = $desc['key']['PRIMARY KEY'] ?? ''; |
|
| 612 | + $boucle->sql_serveur = $serveur; |
|
| 613 | + $boucle->select[] = 'DISTINCT lang'; |
|
| 614 | + $boucle->from[$desc['table_objet']] = $t; |
|
| 615 | + $boucle->separateur[] = ','; |
|
| 616 | + $boucle->return = '$Pile[$SP][\'lang\']'; |
|
| 617 | + $boucle->iterateur = 'sql'; |
|
| 618 | + |
|
| 619 | + $boucle->descr['nom'] = 'calculer_langues_utilisees'; // eviter notice php |
|
| 620 | + $boucle->descr['sourcefile'] = 'internal'; |
|
| 621 | + $boucle->descr['gram'] = 'html'; |
|
| 622 | + |
|
| 623 | + $boucle = pipeline('pre_boucle', $boucle); |
|
| 624 | + |
|
| 625 | + if ( |
|
| 626 | + isset($desc['statut']) |
|
| 627 | + and $desc['statut'] |
|
| 628 | + ) { |
|
| 629 | + $boucles = [ |
|
| 630 | + 'calculer_langues_utilisees' => $boucle, |
|
| 631 | + ]; |
|
| 632 | + // generer un nom de fonction "anonyme" unique |
|
| 633 | + do { |
|
| 634 | + $functionname = 'f_calculer_langues_utilisees_' . $boucle->id_table . '_' . time() . '_' . random_int(0, mt_getrandmax()); |
|
| 635 | + } while (function_exists($functionname)); |
|
| 636 | + $code = calculer_boucle('calculer_langues_utilisees', $boucles); |
|
| 637 | + $code = '$SP=0; $command=array();$command["connect"] = $connect = "' . $serveur . '"; $Pile=array(0=>array());' . "\n" . $code; |
|
| 638 | + $code = 'function ' . $functionname . '(){' . $code . '};$res = ' . $functionname . '();'; |
|
| 639 | + $res = ''; |
|
| 640 | + eval($code); |
|
| 641 | + $res = explode(',', $res); |
|
| 642 | + foreach ($res as $lang) { |
|
| 643 | + $langues[$lang] = 1; |
|
| 644 | + } |
|
| 645 | + } else { |
|
| 646 | + $res = sql_select(implode(',', $boucle->select), $boucle->from); |
|
| 647 | + while ($row = sql_fetch($res)) { |
|
| 648 | + $langues[$row['lang']] = 1; |
|
| 649 | + } |
|
| 650 | + } |
|
| 651 | + } |
|
| 652 | + } |
|
| 653 | + |
|
| 654 | + $langues = array_filter(array_keys($langues)); |
|
| 655 | + sort($langues); |
|
| 656 | + $langues = join(',', $langues); |
|
| 657 | + spip_log("langues utilisees: $langues"); |
|
| 658 | + |
|
| 659 | + return $langues; |
|
| 660 | 660 | } |
| 661 | 661 | |
| 662 | 662 | /** |
@@ -673,9 +673,9 @@ discard block |
||
| 673 | 673 | * incluant les rubriques noeuds et toutes leurs descendances |
| 674 | 674 | */ |
| 675 | 675 | function calcul_branche_in($id) { |
| 676 | - $calcul_branche_in = charger_fonction('calcul_branche_in', 'inc'); |
|
| 676 | + $calcul_branche_in = charger_fonction('calcul_branche_in', 'inc'); |
|
| 677 | 677 | |
| 678 | - return $calcul_branche_in($id); |
|
| 678 | + return $calcul_branche_in($id); |
|
| 679 | 679 | } |
| 680 | 680 | |
| 681 | 681 | /** |
@@ -693,9 +693,9 @@ discard block |
||
| 693 | 693 | * incluant les rubriques transmises et toutes leurs parentées |
| 694 | 694 | */ |
| 695 | 695 | function calcul_hierarchie_in($id, $tout = true) { |
| 696 | - $calcul_hierarchie_in = charger_fonction('calcul_hierarchie_in', 'inc'); |
|
| 696 | + $calcul_hierarchie_in = charger_fonction('calcul_hierarchie_in', 'inc'); |
|
| 697 | 697 | |
| 698 | - return $calcul_hierarchie_in($id, $tout); |
|
| 698 | + return $calcul_hierarchie_in($id, $tout); |
|
| 699 | 699 | } |
| 700 | 700 | |
| 701 | 701 | |
@@ -716,40 +716,40 @@ discard block |
||
| 716 | 716 | * incluant les rubriques noeuds et toutes leurs descendances |
| 717 | 717 | */ |
| 718 | 718 | function inc_calcul_branche_in_dist($id) { |
| 719 | - static $b = []; |
|
| 720 | - |
|
| 721 | - // normaliser $id qui a pu arriver comme un array, comme un entier, ou comme une chaine NN,NN,NN |
|
| 722 | - if (!is_array($id)) { |
|
| 723 | - $id = explode(',', $id); |
|
| 724 | - } |
|
| 725 | - $id = join(',', array_map('intval', $id)); |
|
| 726 | - if (isset($b[$id])) { |
|
| 727 | - return $b[$id]; |
|
| 728 | - } |
|
| 729 | - |
|
| 730 | - // Notre branche commence par la rubrique de depart |
|
| 731 | - $branche = $r = $id; |
|
| 732 | - |
|
| 733 | - // On ajoute une generation (les filles de la generation precedente) |
|
| 734 | - // jusqu'a epuisement, en se protegeant des references circulaires |
|
| 735 | - $maxiter = 10000; |
|
| 736 | - while ( |
|
| 737 | - $maxiter-- and $filles = sql_allfetsel( |
|
| 738 | - 'id_rubrique', |
|
| 739 | - 'spip_rubriques', |
|
| 740 | - sql_in('id_parent', $r) . ' AND ' . sql_in('id_rubrique', $r, 'NOT') |
|
| 741 | - ) |
|
| 742 | - ) { |
|
| 743 | - $r = join(',', array_column($filles, 'id_rubrique')); |
|
| 744 | - $branche .= ',' . $r; |
|
| 745 | - } |
|
| 746 | - |
|
| 747 | - # securite pour ne pas plomber la conso memoire sur les sites prolifiques |
|
| 748 | - if (strlen($branche) < 10000) { |
|
| 749 | - $b[$id] = $branche; |
|
| 750 | - } |
|
| 751 | - |
|
| 752 | - return $branche; |
|
| 719 | + static $b = []; |
|
| 720 | + |
|
| 721 | + // normaliser $id qui a pu arriver comme un array, comme un entier, ou comme une chaine NN,NN,NN |
|
| 722 | + if (!is_array($id)) { |
|
| 723 | + $id = explode(',', $id); |
|
| 724 | + } |
|
| 725 | + $id = join(',', array_map('intval', $id)); |
|
| 726 | + if (isset($b[$id])) { |
|
| 727 | + return $b[$id]; |
|
| 728 | + } |
|
| 729 | + |
|
| 730 | + // Notre branche commence par la rubrique de depart |
|
| 731 | + $branche = $r = $id; |
|
| 732 | + |
|
| 733 | + // On ajoute une generation (les filles de la generation precedente) |
|
| 734 | + // jusqu'a epuisement, en se protegeant des references circulaires |
|
| 735 | + $maxiter = 10000; |
|
| 736 | + while ( |
|
| 737 | + $maxiter-- and $filles = sql_allfetsel( |
|
| 738 | + 'id_rubrique', |
|
| 739 | + 'spip_rubriques', |
|
| 740 | + sql_in('id_parent', $r) . ' AND ' . sql_in('id_rubrique', $r, 'NOT') |
|
| 741 | + ) |
|
| 742 | + ) { |
|
| 743 | + $r = join(',', array_column($filles, 'id_rubrique')); |
|
| 744 | + $branche .= ',' . $r; |
|
| 745 | + } |
|
| 746 | + |
|
| 747 | + # securite pour ne pas plomber la conso memoire sur les sites prolifiques |
|
| 748 | + if (strlen($branche) < 10000) { |
|
| 749 | + $b[$id] = $branche; |
|
| 750 | + } |
|
| 751 | + |
|
| 752 | + return $branche; |
|
| 753 | 753 | } |
| 754 | 754 | |
| 755 | 755 | |
@@ -771,45 +771,45 @@ discard block |
||
| 771 | 771 | * incluant les rubriques transmises et toutes leurs parentées |
| 772 | 772 | */ |
| 773 | 773 | function inc_calcul_hierarchie_in_dist($id, $tout = true) { |
| 774 | - static $b = []; |
|
| 775 | - |
|
| 776 | - // normaliser $id qui a pu arriver comme un array, comme un entier, ou comme une chaine NN,NN,NN |
|
| 777 | - if (!is_array($id)) { |
|
| 778 | - $id = explode(',', $id); |
|
| 779 | - } |
|
| 780 | - $id = join(',', array_map('intval', $id)); |
|
| 781 | - |
|
| 782 | - if (isset($b[$id])) { |
|
| 783 | - // Notre branche commence par la rubrique de depart si $tout=true |
|
| 784 | - return $tout ? (strlen($b[$id]) ? $b[$id] . ",$id" : $id) : $b[$id]; |
|
| 785 | - } |
|
| 786 | - |
|
| 787 | - $hier = ''; |
|
| 788 | - |
|
| 789 | - // On ajoute une generation (les filles de la generation precedente) |
|
| 790 | - // jusqu'a epuisement, en se protegeant des references circulaires |
|
| 791 | - $ids_nouveaux_parents = $id; |
|
| 792 | - $maxiter = 10000; |
|
| 793 | - while ( |
|
| 794 | - $maxiter-- and $parents = sql_allfetsel( |
|
| 795 | - 'id_parent', |
|
| 796 | - 'spip_rubriques', |
|
| 797 | - sql_in('id_rubrique', $ids_nouveaux_parents) . ' AND ' . sql_in('id_parent', $hier, 'NOT') |
|
| 798 | - ) |
|
| 799 | - ) { |
|
| 800 | - $ids_nouveaux_parents = join(',', array_column($parents, 'id_parent')); |
|
| 801 | - $hier = $ids_nouveaux_parents . (strlen($hier) ? ',' . $hier : ''); |
|
| 802 | - } |
|
| 803 | - |
|
| 804 | - # securite pour ne pas plomber la conso memoire sur les sites prolifiques |
|
| 805 | - if (strlen($hier) < 10000) { |
|
| 806 | - $b[$id] = $hier; |
|
| 807 | - } |
|
| 808 | - |
|
| 809 | - // Notre branche commence par la rubrique de depart si $tout=true |
|
| 810 | - $hier = $tout ? (strlen($hier) ? "$hier,$id" : $id) : $hier; |
|
| 811 | - |
|
| 812 | - return $hier; |
|
| 774 | + static $b = []; |
|
| 775 | + |
|
| 776 | + // normaliser $id qui a pu arriver comme un array, comme un entier, ou comme une chaine NN,NN,NN |
|
| 777 | + if (!is_array($id)) { |
|
| 778 | + $id = explode(',', $id); |
|
| 779 | + } |
|
| 780 | + $id = join(',', array_map('intval', $id)); |
|
| 781 | + |
|
| 782 | + if (isset($b[$id])) { |
|
| 783 | + // Notre branche commence par la rubrique de depart si $tout=true |
|
| 784 | + return $tout ? (strlen($b[$id]) ? $b[$id] . ",$id" : $id) : $b[$id]; |
|
| 785 | + } |
|
| 786 | + |
|
| 787 | + $hier = ''; |
|
| 788 | + |
|
| 789 | + // On ajoute une generation (les filles de la generation precedente) |
|
| 790 | + // jusqu'a epuisement, en se protegeant des references circulaires |
|
| 791 | + $ids_nouveaux_parents = $id; |
|
| 792 | + $maxiter = 10000; |
|
| 793 | + while ( |
|
| 794 | + $maxiter-- and $parents = sql_allfetsel( |
|
| 795 | + 'id_parent', |
|
| 796 | + 'spip_rubriques', |
|
| 797 | + sql_in('id_rubrique', $ids_nouveaux_parents) . ' AND ' . sql_in('id_parent', $hier, 'NOT') |
|
| 798 | + ) |
|
| 799 | + ) { |
|
| 800 | + $ids_nouveaux_parents = join(',', array_column($parents, 'id_parent')); |
|
| 801 | + $hier = $ids_nouveaux_parents . (strlen($hier) ? ',' . $hier : ''); |
|
| 802 | + } |
|
| 803 | + |
|
| 804 | + # securite pour ne pas plomber la conso memoire sur les sites prolifiques |
|
| 805 | + if (strlen($hier) < 10000) { |
|
| 806 | + $b[$id] = $hier; |
|
| 807 | + } |
|
| 808 | + |
|
| 809 | + // Notre branche commence par la rubrique de depart si $tout=true |
|
| 810 | + $hier = $tout ? (strlen($hier) ? "$hier,$id" : $id) : $hier; |
|
| 811 | + |
|
| 812 | + return $hier; |
|
| 813 | 813 | } |
| 814 | 814 | |
| 815 | 815 | |
@@ -827,47 +827,47 @@ discard block |
||
| 827 | 827 | * @return void |
| 828 | 828 | **/ |
| 829 | 829 | function calculer_prochain_postdate($check = false) { |
| 830 | - include_spip('base/abstract_sql'); |
|
| 831 | - if ($check) { |
|
| 832 | - $postdates = ($GLOBALS['meta']['post_dates'] == 'non') ? |
|
| 833 | - 'AND A.date <= ' . sql_quote(date('Y-m-d H:i:s')) : ''; |
|
| 834 | - |
|
| 835 | - $r = sql_select( |
|
| 836 | - 'DISTINCT A.id_rubrique AS id', |
|
| 837 | - 'spip_articles AS A LEFT JOIN spip_rubriques AS R ON A.id_rubrique=R.id_rubrique', |
|
| 838 | - "R.statut != 'publie' AND A.statut='publie'$postdates" |
|
| 839 | - ); |
|
| 840 | - while ($row = sql_fetch($r)) { |
|
| 841 | - publier_branche_rubrique($row['id']); |
|
| 842 | - } |
|
| 843 | - |
|
| 844 | - pipeline('trig_calculer_prochain_postdate', ''); |
|
| 845 | - } |
|
| 846 | - |
|
| 847 | - $t = sql_fetsel( |
|
| 848 | - 'date', |
|
| 849 | - 'spip_articles', |
|
| 850 | - "statut='publie' AND date > " . sql_quote(date('Y-m-d H:i:s')), |
|
| 851 | - '', |
|
| 852 | - 'date', |
|
| 853 | - '1' |
|
| 854 | - ); |
|
| 855 | - |
|
| 856 | - if ($t) { |
|
| 857 | - $t = $t['date']; |
|
| 858 | - if ( |
|
| 859 | - !isset($GLOBALS['meta']['date_prochain_postdate']) |
|
| 860 | - or $t <> $GLOBALS['meta']['date_prochain_postdate'] |
|
| 861 | - ) { |
|
| 862 | - ecrire_meta('date_prochain_postdate', strtotime($t)); |
|
| 863 | - ecrire_meta('derniere_modif', time()); |
|
| 864 | - } |
|
| 865 | - } else { |
|
| 866 | - effacer_meta('date_prochain_postdate'); |
|
| 867 | - ecrire_meta('derniere_modif', time()); |
|
| 868 | - } |
|
| 869 | - |
|
| 870 | - spip_log("prochain postdate: $t"); |
|
| 830 | + include_spip('base/abstract_sql'); |
|
| 831 | + if ($check) { |
|
| 832 | + $postdates = ($GLOBALS['meta']['post_dates'] == 'non') ? |
|
| 833 | + 'AND A.date <= ' . sql_quote(date('Y-m-d H:i:s')) : ''; |
|
| 834 | + |
|
| 835 | + $r = sql_select( |
|
| 836 | + 'DISTINCT A.id_rubrique AS id', |
|
| 837 | + 'spip_articles AS A LEFT JOIN spip_rubriques AS R ON A.id_rubrique=R.id_rubrique', |
|
| 838 | + "R.statut != 'publie' AND A.statut='publie'$postdates" |
|
| 839 | + ); |
|
| 840 | + while ($row = sql_fetch($r)) { |
|
| 841 | + publier_branche_rubrique($row['id']); |
|
| 842 | + } |
|
| 843 | + |
|
| 844 | + pipeline('trig_calculer_prochain_postdate', ''); |
|
| 845 | + } |
|
| 846 | + |
|
| 847 | + $t = sql_fetsel( |
|
| 848 | + 'date', |
|
| 849 | + 'spip_articles', |
|
| 850 | + "statut='publie' AND date > " . sql_quote(date('Y-m-d H:i:s')), |
|
| 851 | + '', |
|
| 852 | + 'date', |
|
| 853 | + '1' |
|
| 854 | + ); |
|
| 855 | + |
|
| 856 | + if ($t) { |
|
| 857 | + $t = $t['date']; |
|
| 858 | + if ( |
|
| 859 | + !isset($GLOBALS['meta']['date_prochain_postdate']) |
|
| 860 | + or $t <> $GLOBALS['meta']['date_prochain_postdate'] |
|
| 861 | + ) { |
|
| 862 | + ecrire_meta('date_prochain_postdate', strtotime($t)); |
|
| 863 | + ecrire_meta('derniere_modif', time()); |
|
| 864 | + } |
|
| 865 | + } else { |
|
| 866 | + effacer_meta('date_prochain_postdate'); |
|
| 867 | + ecrire_meta('derniere_modif', time()); |
|
| 868 | + } |
|
| 869 | + |
|
| 870 | + spip_log("prochain postdate: $t"); |
|
| 871 | 871 | } |
| 872 | 872 | |
| 873 | 873 | /** |
@@ -892,62 +892,62 @@ discard block |
||
| 892 | 892 | */ |
| 893 | 893 | function creer_rubrique_nommee($titre, $id_parent = 0, $serveur = '') { |
| 894 | 894 | |
| 895 | - // eclater l'arborescence demandee |
|
| 896 | - // echapper les </multi> et autres balises fermantes html |
|
| 897 | - $titre = preg_replace(',</([a-z][^>]*)>,ims', "<@\\1>", $titre); |
|
| 898 | - $arbo = explode('/', preg_replace(',^/,', '', $titre)); |
|
| 899 | - include_spip('base/abstract_sql'); |
|
| 900 | - foreach ($arbo as $titre) { |
|
| 901 | - // retablir les </multi> et autres balises fermantes html |
|
| 902 | - $titre = preg_replace(',<@([a-z][^>]*)>,ims', "</\\1>", $titre); |
|
| 903 | - $r = sql_getfetsel( |
|
| 904 | - 'id_rubrique', |
|
| 905 | - 'spip_rubriques', |
|
| 906 | - 'titre = ' . sql_quote($titre) . ' AND id_parent=' . intval($id_parent), |
|
| 907 | - $groupby = [], |
|
| 908 | - $orderby = [], |
|
| 909 | - $limit = '', |
|
| 910 | - $having = [], |
|
| 911 | - $serveur |
|
| 912 | - ); |
|
| 913 | - if ($r !== null) { |
|
| 914 | - $id_parent = $r; |
|
| 915 | - } else { |
|
| 916 | - $id_rubrique = sql_insertq('spip_rubriques', [ |
|
| 917 | - 'titre' => $titre, |
|
| 918 | - 'id_parent' => $id_parent, |
|
| 919 | - 'statut' => 'prepa' |
|
| 920 | - ], $desc = [], $serveur); |
|
| 921 | - if ($id_parent > 0) { |
|
| 922 | - $data = sql_fetsel( |
|
| 923 | - 'id_secteur,lang', |
|
| 924 | - 'spip_rubriques', |
|
| 925 | - "id_rubrique=$id_parent", |
|
| 926 | - $groupby = [], |
|
| 927 | - $orderby = [], |
|
| 928 | - $limit = '', |
|
| 929 | - $having = [], |
|
| 930 | - $serveur |
|
| 931 | - ); |
|
| 932 | - $id_secteur = $data['id_secteur']; |
|
| 933 | - $lang = $data['lang']; |
|
| 934 | - } else { |
|
| 935 | - $id_secteur = $id_rubrique; |
|
| 936 | - $lang = $GLOBALS['meta']['langue_site']; |
|
| 937 | - } |
|
| 938 | - |
|
| 939 | - sql_updateq( |
|
| 940 | - 'spip_rubriques', |
|
| 941 | - ['id_secteur' => $id_secteur, 'lang' => $lang], |
|
| 942 | - 'id_rubrique=' . intval($id_rubrique), |
|
| 943 | - [], |
|
| 944 | - $serveur |
|
| 945 | - ); |
|
| 946 | - |
|
| 947 | - // pour la recursion |
|
| 948 | - $id_parent = $id_rubrique; |
|
| 949 | - } |
|
| 950 | - } |
|
| 951 | - |
|
| 952 | - return intval($id_parent); |
|
| 895 | + // eclater l'arborescence demandee |
|
| 896 | + // echapper les </multi> et autres balises fermantes html |
|
| 897 | + $titre = preg_replace(',</([a-z][^>]*)>,ims', "<@\\1>", $titre); |
|
| 898 | + $arbo = explode('/', preg_replace(',^/,', '', $titre)); |
|
| 899 | + include_spip('base/abstract_sql'); |
|
| 900 | + foreach ($arbo as $titre) { |
|
| 901 | + // retablir les </multi> et autres balises fermantes html |
|
| 902 | + $titre = preg_replace(',<@([a-z][^>]*)>,ims', "</\\1>", $titre); |
|
| 903 | + $r = sql_getfetsel( |
|
| 904 | + 'id_rubrique', |
|
| 905 | + 'spip_rubriques', |
|
| 906 | + 'titre = ' . sql_quote($titre) . ' AND id_parent=' . intval($id_parent), |
|
| 907 | + $groupby = [], |
|
| 908 | + $orderby = [], |
|
| 909 | + $limit = '', |
|
| 910 | + $having = [], |
|
| 911 | + $serveur |
|
| 912 | + ); |
|
| 913 | + if ($r !== null) { |
|
| 914 | + $id_parent = $r; |
|
| 915 | + } else { |
|
| 916 | + $id_rubrique = sql_insertq('spip_rubriques', [ |
|
| 917 | + 'titre' => $titre, |
|
| 918 | + 'id_parent' => $id_parent, |
|
| 919 | + 'statut' => 'prepa' |
|
| 920 | + ], $desc = [], $serveur); |
|
| 921 | + if ($id_parent > 0) { |
|
| 922 | + $data = sql_fetsel( |
|
| 923 | + 'id_secteur,lang', |
|
| 924 | + 'spip_rubriques', |
|
| 925 | + "id_rubrique=$id_parent", |
|
| 926 | + $groupby = [], |
|
| 927 | + $orderby = [], |
|
| 928 | + $limit = '', |
|
| 929 | + $having = [], |
|
| 930 | + $serveur |
|
| 931 | + ); |
|
| 932 | + $id_secteur = $data['id_secteur']; |
|
| 933 | + $lang = $data['lang']; |
|
| 934 | + } else { |
|
| 935 | + $id_secteur = $id_rubrique; |
|
| 936 | + $lang = $GLOBALS['meta']['langue_site']; |
|
| 937 | + } |
|
| 938 | + |
|
| 939 | + sql_updateq( |
|
| 940 | + 'spip_rubriques', |
|
| 941 | + ['id_secteur' => $id_secteur, 'lang' => $lang], |
|
| 942 | + 'id_rubrique=' . intval($id_rubrique), |
|
| 943 | + [], |
|
| 944 | + $serveur |
|
| 945 | + ); |
|
| 946 | + |
|
| 947 | + // pour la recursion |
|
| 948 | + $id_parent = $id_rubrique; |
|
| 949 | + } |
|
| 950 | + } |
|
| 951 | + |
|
| 952 | + return intval($id_parent); |
|
| 953 | 953 | } |
@@ -17,7 +17,7 @@ discard block |
||
| 17 | 17 | **/ |
| 18 | 18 | |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | include_spip('inc/presentation'); |
@@ -31,7 +31,7 @@ discard block |
||
| 31 | 31 | * @uses exec_puce_statut_args() |
| 32 | 32 | **/ |
| 33 | 33 | function exec_puce_statut_dist(): void { |
| 34 | - exec_puce_statut_args(_request('id'), _request('type')); |
|
| 34 | + exec_puce_statut_args(_request('id'), _request('type')); |
|
| 35 | 35 | } |
| 36 | 36 | |
| 37 | 37 | /** |
@@ -50,26 +50,26 @@ discard block |
||
| 50 | 50 | * Type d'objet |
| 51 | 51 | **/ |
| 52 | 52 | function exec_puce_statut_args($id, $type): void { |
| 53 | - $id = intval($id); |
|
| 54 | - if ( |
|
| 55 | - $table_objet_sql = table_objet_sql($type) |
|
| 56 | - and $d = lister_tables_objets_sql($table_objet_sql) |
|
| 57 | - and isset($d['statut_textes_instituer']) |
|
| 58 | - and $d['statut_textes_instituer'] |
|
| 59 | - ) { |
|
| 60 | - $prim = id_table_objet($type); |
|
| 61 | - if (isset($d['field']['id_rubrique'])) { |
|
| 62 | - $select = 'id_rubrique,statut'; |
|
| 63 | - } else { |
|
| 64 | - $select = '0 as id_rubrique,statut'; |
|
| 65 | - } |
|
| 66 | - $r = sql_fetsel($select, $table_objet_sql, "$prim=$id"); |
|
| 67 | - $statut = $r['statut']; |
|
| 68 | - $id_rubrique = $r['id_rubrique']; |
|
| 69 | - } else { |
|
| 70 | - $id_rubrique = $id; |
|
| 71 | - $statut = 'prop'; // arbitraire |
|
| 72 | - } |
|
| 73 | - $puce_statut = charger_fonction('puce_statut', 'inc'); |
|
| 74 | - ajax_retour($puce_statut($id, $statut, $id_rubrique, $type, true)); |
|
| 53 | + $id = intval($id); |
|
| 54 | + if ( |
|
| 55 | + $table_objet_sql = table_objet_sql($type) |
|
| 56 | + and $d = lister_tables_objets_sql($table_objet_sql) |
|
| 57 | + and isset($d['statut_textes_instituer']) |
|
| 58 | + and $d['statut_textes_instituer'] |
|
| 59 | + ) { |
|
| 60 | + $prim = id_table_objet($type); |
|
| 61 | + if (isset($d['field']['id_rubrique'])) { |
|
| 62 | + $select = 'id_rubrique,statut'; |
|
| 63 | + } else { |
|
| 64 | + $select = '0 as id_rubrique,statut'; |
|
| 65 | + } |
|
| 66 | + $r = sql_fetsel($select, $table_objet_sql, "$prim=$id"); |
|
| 67 | + $statut = $r['statut']; |
|
| 68 | + $id_rubrique = $r['id_rubrique']; |
|
| 69 | + } else { |
|
| 70 | + $id_rubrique = $id; |
|
| 71 | + $statut = 'prop'; // arbitraire |
|
| 72 | + } |
|
| 73 | + $puce_statut = charger_fonction('puce_statut', 'inc'); |
|
| 74 | + ajax_retour($puce_statut($id, $statut, $id_rubrique, $type, true)); |
|
| 75 | 75 | } |
@@ -9,384 +9,384 @@ |
||
| 9 | 9 | |
| 10 | 10 | $GLOBALS['CHARSET']['translit'] = [ |
| 11 | 11 | // latin [fausse plage] |
| 12 | - 128 => 'EUR', |
|
| 13 | - 131 => 'f', |
|
| 14 | - 140 => 'OE', |
|
| 15 | - 147 => '\'\'', |
|
| 16 | - 148 => '\'\'', |
|
| 17 | - 153 => '(TM)', |
|
| 18 | - 156 => 'oe', |
|
| 19 | - 159 => 'Y', |
|
| 12 | + 128 => 'EUR', |
|
| 13 | + 131 => 'f', |
|
| 14 | + 140 => 'OE', |
|
| 15 | + 147 => '\'\'', |
|
| 16 | + 148 => '\'\'', |
|
| 17 | + 153 => '(TM)', |
|
| 18 | + 156 => 'oe', |
|
| 19 | + 159 => 'Y', |
|
| 20 | 20 | |
| 21 | 21 | // latin [legal] |
| 22 | - 160 => ' ', |
|
| 23 | - 161 => '!', |
|
| 24 | - 162 => 'c', |
|
| 25 | - 163 => 'L', |
|
| 26 | - 164 => 'O', |
|
| 27 | - 165 => 'yen', |
|
| 28 | - 166 => '|', |
|
| 29 | - 167 => 'p', |
|
| 30 | - 169 => '(c)', |
|
| 31 | - 171 => '<<', |
|
| 32 | - 172 => '-', |
|
| 33 | - 173 => '-', |
|
| 34 | - 174 => '(R)', |
|
| 35 | - 176 => 'o', |
|
| 36 | - 177 => '+-', |
|
| 37 | - 181 => 'mu', |
|
| 38 | - 182 => 'p', |
|
| 39 | - 183 => '.', |
|
| 40 | - 186 => 'o ', |
|
| 41 | - 187 => '>>', |
|
| 42 | - 191 => '?', |
|
| 43 | - 192 => 'A', |
|
| 44 | - 193 => 'A', |
|
| 45 | - 194 => 'A', |
|
| 46 | - 195 => 'A', |
|
| 47 | - 196 => 'A', |
|
| 48 | - 197 => 'A', |
|
| 49 | - 198 => 'AE', |
|
| 50 | - 199 => 'C', |
|
| 51 | - 200 => 'E', |
|
| 52 | - 201 => 'E', |
|
| 53 | - 202 => 'E', |
|
| 54 | - 203 => 'E', |
|
| 55 | - 204 => 'I', |
|
| 56 | - 205 => 'I', |
|
| 57 | - 206 => 'I', |
|
| 58 | - 207 => 'I', |
|
| 59 | - 209 => 'N', |
|
| 60 | - 210 => 'O', |
|
| 61 | - 211 => 'O', |
|
| 62 | - 212 => 'O', |
|
| 63 | - 213 => 'O', |
|
| 64 | - 214 => 'O', |
|
| 65 | - 216 => 'O', |
|
| 66 | - 217 => 'U', |
|
| 67 | - 218 => 'U', |
|
| 68 | - 219 => 'U', |
|
| 69 | - 220 => 'U', |
|
| 70 | - 223 => 'ss', |
|
| 71 | - 224 => 'a', |
|
| 72 | - 225 => 'a', |
|
| 73 | - 226 => 'a', |
|
| 74 | - 227 => 'a', |
|
| 75 | - 228 => 'a', |
|
| 76 | - 229 => 'a', |
|
| 77 | - 230 => 'ae', |
|
| 78 | - 231 => 'c', |
|
| 79 | - 232 => 'e', |
|
| 80 | - 233 => 'e', |
|
| 81 | - 234 => 'e', |
|
| 82 | - 235 => 'e', |
|
| 83 | - 236 => 'i', |
|
| 84 | - 237 => 'i', |
|
| 85 | - 238 => 'i', |
|
| 86 | - 239 => 'i', |
|
| 87 | - 241 => 'n', |
|
| 88 | - 242 => 'o', |
|
| 89 | - 243 => 'o', |
|
| 90 | - 244 => 'o', |
|
| 91 | - 245 => 'o', |
|
| 92 | - 246 => 'o', |
|
| 93 | - 248 => 'o', |
|
| 94 | - 249 => 'u', |
|
| 95 | - 250 => 'u', |
|
| 96 | - 251 => 'u', |
|
| 97 | - 252 => 'u', |
|
| 98 | - 255 => 'y', |
|
| 22 | + 160 => ' ', |
|
| 23 | + 161 => '!', |
|
| 24 | + 162 => 'c', |
|
| 25 | + 163 => 'L', |
|
| 26 | + 164 => 'O', |
|
| 27 | + 165 => 'yen', |
|
| 28 | + 166 => '|', |
|
| 29 | + 167 => 'p', |
|
| 30 | + 169 => '(c)', |
|
| 31 | + 171 => '<<', |
|
| 32 | + 172 => '-', |
|
| 33 | + 173 => '-', |
|
| 34 | + 174 => '(R)', |
|
| 35 | + 176 => 'o', |
|
| 36 | + 177 => '+-', |
|
| 37 | + 181 => 'mu', |
|
| 38 | + 182 => 'p', |
|
| 39 | + 183 => '.', |
|
| 40 | + 186 => 'o ', |
|
| 41 | + 187 => '>>', |
|
| 42 | + 191 => '?', |
|
| 43 | + 192 => 'A', |
|
| 44 | + 193 => 'A', |
|
| 45 | + 194 => 'A', |
|
| 46 | + 195 => 'A', |
|
| 47 | + 196 => 'A', |
|
| 48 | + 197 => 'A', |
|
| 49 | + 198 => 'AE', |
|
| 50 | + 199 => 'C', |
|
| 51 | + 200 => 'E', |
|
| 52 | + 201 => 'E', |
|
| 53 | + 202 => 'E', |
|
| 54 | + 203 => 'E', |
|
| 55 | + 204 => 'I', |
|
| 56 | + 205 => 'I', |
|
| 57 | + 206 => 'I', |
|
| 58 | + 207 => 'I', |
|
| 59 | + 209 => 'N', |
|
| 60 | + 210 => 'O', |
|
| 61 | + 211 => 'O', |
|
| 62 | + 212 => 'O', |
|
| 63 | + 213 => 'O', |
|
| 64 | + 214 => 'O', |
|
| 65 | + 216 => 'O', |
|
| 66 | + 217 => 'U', |
|
| 67 | + 218 => 'U', |
|
| 68 | + 219 => 'U', |
|
| 69 | + 220 => 'U', |
|
| 70 | + 223 => 'ss', |
|
| 71 | + 224 => 'a', |
|
| 72 | + 225 => 'a', |
|
| 73 | + 226 => 'a', |
|
| 74 | + 227 => 'a', |
|
| 75 | + 228 => 'a', |
|
| 76 | + 229 => 'a', |
|
| 77 | + 230 => 'ae', |
|
| 78 | + 231 => 'c', |
|
| 79 | + 232 => 'e', |
|
| 80 | + 233 => 'e', |
|
| 81 | + 234 => 'e', |
|
| 82 | + 235 => 'e', |
|
| 83 | + 236 => 'i', |
|
| 84 | + 237 => 'i', |
|
| 85 | + 238 => 'i', |
|
| 86 | + 239 => 'i', |
|
| 87 | + 241 => 'n', |
|
| 88 | + 242 => 'o', |
|
| 89 | + 243 => 'o', |
|
| 90 | + 244 => 'o', |
|
| 91 | + 245 => 'o', |
|
| 92 | + 246 => 'o', |
|
| 93 | + 248 => 'o', |
|
| 94 | + 249 => 'u', |
|
| 95 | + 250 => 'u', |
|
| 96 | + 251 => 'u', |
|
| 97 | + 252 => 'u', |
|
| 98 | + 255 => 'y', |
|
| 99 | 99 | |
| 100 | 100 | // turc |
| 101 | - 286 => 'G', |
|
| 102 | - 287 => 'g', |
|
| 103 | - 304 => 'I', |
|
| 104 | - 305 => 'i', |
|
| 101 | + 286 => 'G', |
|
| 102 | + 287 => 'g', |
|
| 103 | + 304 => 'I', |
|
| 104 | + 305 => 'i', |
|
| 105 | 105 | |
| 106 | 106 | // esperanto |
| 107 | - 264 => 'Cx', |
|
| 108 | - 265 => 'cx', |
|
| 109 | - 284 => 'Gx', |
|
| 110 | - 285 => 'gx', |
|
| 111 | - 292 => 'Hx', |
|
| 112 | - 293 => 'hx', |
|
| 113 | - 308 => 'Jx', |
|
| 114 | - 309 => 'jx', |
|
| 115 | - 348 => 'Sx', |
|
| 116 | - 349 => 'sx', |
|
| 117 | - 364 => 'Ux', |
|
| 118 | - 365 => 'ux', |
|
| 107 | + 264 => 'Cx', |
|
| 108 | + 265 => 'cx', |
|
| 109 | + 284 => 'Gx', |
|
| 110 | + 285 => 'gx', |
|
| 111 | + 292 => 'Hx', |
|
| 112 | + 293 => 'hx', |
|
| 113 | + 308 => 'Jx', |
|
| 114 | + 309 => 'jx', |
|
| 115 | + 348 => 'Sx', |
|
| 116 | + 349 => 'sx', |
|
| 117 | + 364 => 'Ux', |
|
| 118 | + 365 => 'ux', |
|
| 119 | 119 | |
| 120 | 120 | |
| 121 | 121 | // latin2 [Czech] |
| 122 | - 283 => 'e', |
|
| 123 | - 353 => 's', |
|
| 124 | - 269 => 'c', |
|
| 125 | - 345 => 'r', |
|
| 126 | - 382 => 'z', |
|
| 127 | - 367 => 'u', |
|
| 128 | - 328 => 'n', |
|
| 129 | - 357 => 't', |
|
| 130 | - 271 => 'd', |
|
| 131 | - 449 => 'o', |
|
| 132 | - 282 => 'E', |
|
| 133 | - 352 => 'S', |
|
| 134 | - 268 => 'C', |
|
| 135 | - 344 => 'R', |
|
| 136 | - 381 => 'Z', |
|
| 137 | - 366 => 'U', |
|
| 138 | - 327 => 'N', |
|
| 139 | - 356 => 'T', |
|
| 140 | - 270 => 'D', |
|
| 141 | - 467 => 'O', |
|
| 122 | + 283 => 'e', |
|
| 123 | + 353 => 's', |
|
| 124 | + 269 => 'c', |
|
| 125 | + 345 => 'r', |
|
| 126 | + 382 => 'z', |
|
| 127 | + 367 => 'u', |
|
| 128 | + 328 => 'n', |
|
| 129 | + 357 => 't', |
|
| 130 | + 271 => 'd', |
|
| 131 | + 449 => 'o', |
|
| 132 | + 282 => 'E', |
|
| 133 | + 352 => 'S', |
|
| 134 | + 268 => 'C', |
|
| 135 | + 344 => 'R', |
|
| 136 | + 381 => 'Z', |
|
| 137 | + 366 => 'U', |
|
| 138 | + 327 => 'N', |
|
| 139 | + 356 => 'T', |
|
| 140 | + 270 => 'D', |
|
| 141 | + 467 => 'O', |
|
| 142 | 142 | |
| 143 | 143 | // francais |
| 144 | - 338 => 'OE', |
|
| 145 | - 339 => 'oe', |
|
| 146 | - 376 => 'Y', |
|
| 147 | - 402 => 'f', |
|
| 144 | + 338 => 'OE', |
|
| 145 | + 339 => 'oe', |
|
| 146 | + 376 => 'Y', |
|
| 147 | + 402 => 'f', |
|
| 148 | 148 | |
| 149 | 149 | //polskie |
| 150 | - 260 => 'A', |
|
| 151 | - 261 => 'a', |
|
| 152 | - 262 => 'C', |
|
| 153 | - 263 => 'c', |
|
| 154 | - 280 => 'E', |
|
| 155 | - 281 => 'e', |
|
| 156 | - 321 => 'L', |
|
| 157 | - 322 => 'l', |
|
| 158 | - 323 => 'N', |
|
| 159 | - 324 => 'n', |
|
| 160 | - 346 => 'S', |
|
| 161 | - 347 => 's', |
|
| 162 | - 377 => 'Z', |
|
| 163 | - 378 => 'z', |
|
| 164 | - 379 => 'Z', |
|
| 165 | - 380 => 'z', |
|
| 150 | + 260 => 'A', |
|
| 151 | + 261 => 'a', |
|
| 152 | + 262 => 'C', |
|
| 153 | + 263 => 'c', |
|
| 154 | + 280 => 'E', |
|
| 155 | + 281 => 'e', |
|
| 156 | + 321 => 'L', |
|
| 157 | + 322 => 'l', |
|
| 158 | + 323 => 'N', |
|
| 159 | + 324 => 'n', |
|
| 160 | + 346 => 'S', |
|
| 161 | + 347 => 's', |
|
| 162 | + 377 => 'Z', |
|
| 163 | + 378 => 'z', |
|
| 164 | + 379 => 'Z', |
|
| 165 | + 380 => 'z', |
|
| 166 | 166 | |
| 167 | 167 | //roumain |
| 168 | - 258 => 'A', |
|
| 169 | - 259 => 'a', |
|
| 170 | - 354 => 'T', |
|
| 171 | - 355 => 't', |
|
| 168 | + 258 => 'A', |
|
| 169 | + 259 => 'a', |
|
| 170 | + 354 => 'T', |
|
| 171 | + 355 => 't', |
|
| 172 | 172 | |
| 173 | 173 | //turc & roumain |
| 174 | - 350 => 'S', |
|
| 175 | - 351 => 's', |
|
| 174 | + 350 => 'S', |
|
| 175 | + 351 => 's', |
|
| 176 | 176 | |
| 177 | 177 | // cyrillique |
| 178 | - 1026 => 'D%', |
|
| 179 | - 1027 => 'G%', |
|
| 180 | - 8218 => '\'', |
|
| 181 | - 1107 => 'g%', |
|
| 182 | - 8222 => '"', |
|
| 183 | - 8230 => '...', |
|
| 184 | - 8224 => '/-', |
|
| 185 | - 8225 => '/=', |
|
| 186 | - 8364 => 'EUR', |
|
| 187 | - 8240 => '0/00', |
|
| 188 | - 1033 => 'LJ', |
|
| 189 | - 8249 => '<', |
|
| 190 | - 1034 => 'NJ', |
|
| 191 | - 1036 => 'KJ', |
|
| 192 | - 1035 => 'Ts', |
|
| 193 | - 1039 => 'DZ', |
|
| 194 | - 1106 => 'd%', |
|
| 195 | - 8216 => '`', |
|
| 196 | - 8217 => '\'', |
|
| 197 | - 8220 => '"', |
|
| 198 | - 8221 => '"', |
|
| 199 | - 8226 => ' o ', |
|
| 200 | - 8211 => '-', |
|
| 201 | - 8212 => '~', |
|
| 202 | - 8482 => '(TM)', |
|
| 203 | - 1113 => 'lj', |
|
| 204 | - 8250 => '>', |
|
| 205 | - 1114 => 'nj', |
|
| 206 | - 1116 => 'kj', |
|
| 207 | - 1115 => 'ts', |
|
| 208 | - 1119 => 'dz', |
|
| 209 | - 1038 => 'V%', |
|
| 210 | - 1118 => 'v%', |
|
| 211 | - 1032 => 'J%', |
|
| 212 | - 1168 => 'G3', |
|
| 213 | - 1025 => 'IO', |
|
| 214 | - 1028 => 'IE', |
|
| 215 | - 1031 => 'YI', |
|
| 216 | - 1030 => 'II', |
|
| 217 | - 1110 => 'ii', |
|
| 218 | - 1169 => 'g3', |
|
| 219 | - 1105 => 'io', |
|
| 220 | - 8470 => 'No.', |
|
| 221 | - 1108 => 'ie', |
|
| 222 | - 1112 => 'j%', |
|
| 223 | - 1029 => 'DS', |
|
| 224 | - 1109 => 'ds', |
|
| 225 | - 1111 => 'yi', |
|
| 226 | - 1040 => 'A', |
|
| 227 | - 1041 => 'B', |
|
| 228 | - 1042 => 'V', |
|
| 229 | - 1043 => 'G', |
|
| 230 | - 1044 => 'D', |
|
| 231 | - 1045 => 'E', |
|
| 232 | - 1046 => 'ZH', |
|
| 233 | - 1047 => 'Z', |
|
| 234 | - 1048 => 'I', |
|
| 235 | - 1049 => 'J', |
|
| 236 | - 1050 => 'K', |
|
| 237 | - 1051 => 'L', |
|
| 238 | - 1052 => 'M', |
|
| 239 | - 1053 => 'N', |
|
| 240 | - 1054 => 'O', |
|
| 241 | - 1055 => 'P', |
|
| 242 | - 1056 => 'R', |
|
| 243 | - 1057 => 'S', |
|
| 244 | - 1058 => 'T', |
|
| 245 | - 1059 => 'U', |
|
| 246 | - 1060 => 'F', |
|
| 247 | - 1061 => 'H', |
|
| 248 | - 1062 => 'C', |
|
| 249 | - 1063 => 'CH', |
|
| 250 | - 1064 => 'SH', |
|
| 251 | - 1065 => 'SCH', |
|
| 252 | - 1066 => '"', |
|
| 253 | - 1067 => 'Y', |
|
| 254 | - 1068 => '\'', |
|
| 255 | - 1069 => '`E', |
|
| 256 | - 1070 => 'YU', |
|
| 257 | - 1071 => 'YA', |
|
| 258 | - 1072 => 'a', |
|
| 259 | - 1073 => 'b', |
|
| 260 | - 1074 => 'v', |
|
| 261 | - 1075 => 'g', |
|
| 262 | - 1076 => 'd', |
|
| 263 | - 1077 => 'e', |
|
| 264 | - 1078 => 'zh', |
|
| 265 | - 1079 => 'z', |
|
| 266 | - 1080 => 'i', |
|
| 267 | - 1081 => 'j', |
|
| 268 | - 1082 => 'k', |
|
| 269 | - 1083 => 'l', |
|
| 270 | - 1084 => 'm', |
|
| 271 | - 1085 => 'n', |
|
| 272 | - 1086 => 'o', |
|
| 273 | - 1087 => 'p', |
|
| 274 | - 1088 => 'r', |
|
| 275 | - 1089 => 's', |
|
| 276 | - 1090 => 't', |
|
| 277 | - 1091 => 'u', |
|
| 278 | - 1092 => 'f', |
|
| 279 | - 1093 => 'h', |
|
| 280 | - 1094 => 'c', |
|
| 281 | - 1095 => 'ch', |
|
| 282 | - 1096 => 'sh', |
|
| 283 | - 1097 => 'sch', |
|
| 284 | - 1098 => '"', |
|
| 285 | - 1099 => 'y', |
|
| 286 | - 1100 => '\'', |
|
| 287 | - 1101 => '`e', |
|
| 288 | - 1102 => 'yu', |
|
| 289 | - 1103 => 'ya', |
|
| 178 | + 1026 => 'D%', |
|
| 179 | + 1027 => 'G%', |
|
| 180 | + 8218 => '\'', |
|
| 181 | + 1107 => 'g%', |
|
| 182 | + 8222 => '"', |
|
| 183 | + 8230 => '...', |
|
| 184 | + 8224 => '/-', |
|
| 185 | + 8225 => '/=', |
|
| 186 | + 8364 => 'EUR', |
|
| 187 | + 8240 => '0/00', |
|
| 188 | + 1033 => 'LJ', |
|
| 189 | + 8249 => '<', |
|
| 190 | + 1034 => 'NJ', |
|
| 191 | + 1036 => 'KJ', |
|
| 192 | + 1035 => 'Ts', |
|
| 193 | + 1039 => 'DZ', |
|
| 194 | + 1106 => 'd%', |
|
| 195 | + 8216 => '`', |
|
| 196 | + 8217 => '\'', |
|
| 197 | + 8220 => '"', |
|
| 198 | + 8221 => '"', |
|
| 199 | + 8226 => ' o ', |
|
| 200 | + 8211 => '-', |
|
| 201 | + 8212 => '~', |
|
| 202 | + 8482 => '(TM)', |
|
| 203 | + 1113 => 'lj', |
|
| 204 | + 8250 => '>', |
|
| 205 | + 1114 => 'nj', |
|
| 206 | + 1116 => 'kj', |
|
| 207 | + 1115 => 'ts', |
|
| 208 | + 1119 => 'dz', |
|
| 209 | + 1038 => 'V%', |
|
| 210 | + 1118 => 'v%', |
|
| 211 | + 1032 => 'J%', |
|
| 212 | + 1168 => 'G3', |
|
| 213 | + 1025 => 'IO', |
|
| 214 | + 1028 => 'IE', |
|
| 215 | + 1031 => 'YI', |
|
| 216 | + 1030 => 'II', |
|
| 217 | + 1110 => 'ii', |
|
| 218 | + 1169 => 'g3', |
|
| 219 | + 1105 => 'io', |
|
| 220 | + 8470 => 'No.', |
|
| 221 | + 1108 => 'ie', |
|
| 222 | + 1112 => 'j%', |
|
| 223 | + 1029 => 'DS', |
|
| 224 | + 1109 => 'ds', |
|
| 225 | + 1111 => 'yi', |
|
| 226 | + 1040 => 'A', |
|
| 227 | + 1041 => 'B', |
|
| 228 | + 1042 => 'V', |
|
| 229 | + 1043 => 'G', |
|
| 230 | + 1044 => 'D', |
|
| 231 | + 1045 => 'E', |
|
| 232 | + 1046 => 'ZH', |
|
| 233 | + 1047 => 'Z', |
|
| 234 | + 1048 => 'I', |
|
| 235 | + 1049 => 'J', |
|
| 236 | + 1050 => 'K', |
|
| 237 | + 1051 => 'L', |
|
| 238 | + 1052 => 'M', |
|
| 239 | + 1053 => 'N', |
|
| 240 | + 1054 => 'O', |
|
| 241 | + 1055 => 'P', |
|
| 242 | + 1056 => 'R', |
|
| 243 | + 1057 => 'S', |
|
| 244 | + 1058 => 'T', |
|
| 245 | + 1059 => 'U', |
|
| 246 | + 1060 => 'F', |
|
| 247 | + 1061 => 'H', |
|
| 248 | + 1062 => 'C', |
|
| 249 | + 1063 => 'CH', |
|
| 250 | + 1064 => 'SH', |
|
| 251 | + 1065 => 'SCH', |
|
| 252 | + 1066 => '"', |
|
| 253 | + 1067 => 'Y', |
|
| 254 | + 1068 => '\'', |
|
| 255 | + 1069 => '`E', |
|
| 256 | + 1070 => 'YU', |
|
| 257 | + 1071 => 'YA', |
|
| 258 | + 1072 => 'a', |
|
| 259 | + 1073 => 'b', |
|
| 260 | + 1074 => 'v', |
|
| 261 | + 1075 => 'g', |
|
| 262 | + 1076 => 'd', |
|
| 263 | + 1077 => 'e', |
|
| 264 | + 1078 => 'zh', |
|
| 265 | + 1079 => 'z', |
|
| 266 | + 1080 => 'i', |
|
| 267 | + 1081 => 'j', |
|
| 268 | + 1082 => 'k', |
|
| 269 | + 1083 => 'l', |
|
| 270 | + 1084 => 'm', |
|
| 271 | + 1085 => 'n', |
|
| 272 | + 1086 => 'o', |
|
| 273 | + 1087 => 'p', |
|
| 274 | + 1088 => 'r', |
|
| 275 | + 1089 => 's', |
|
| 276 | + 1090 => 't', |
|
| 277 | + 1091 => 'u', |
|
| 278 | + 1092 => 'f', |
|
| 279 | + 1093 => 'h', |
|
| 280 | + 1094 => 'c', |
|
| 281 | + 1095 => 'ch', |
|
| 282 | + 1096 => 'sh', |
|
| 283 | + 1097 => 'sch', |
|
| 284 | + 1098 => '"', |
|
| 285 | + 1099 => 'y', |
|
| 286 | + 1100 => '\'', |
|
| 287 | + 1101 => '`e', |
|
| 288 | + 1102 => 'yu', |
|
| 289 | + 1103 => 'ya', |
|
| 290 | 290 | |
| 291 | 291 | // vietnamien en translitteration de base |
| 292 | - 7843 => 'a', |
|
| 293 | - 7841 => 'a', |
|
| 294 | - 7845 => 'a', |
|
| 295 | - 7847 => 'a', |
|
| 296 | - 7849 => 'a', |
|
| 297 | - 7851 => 'a', |
|
| 298 | - 7853 => 'a', |
|
| 299 | - 7855 => 'a', |
|
| 300 | - 7857 => 'a', |
|
| 301 | - 7859 => 'a', |
|
| 302 | - 7861 => 'a', |
|
| 303 | - 7863 => 'a', |
|
| 304 | - 7842 => 'A', |
|
| 305 | - 7840 => 'A', |
|
| 306 | - 7844 => 'A', |
|
| 307 | - 7846 => 'A', |
|
| 308 | - 7848 => 'A', |
|
| 309 | - 7850 => 'A', |
|
| 310 | - 7852 => 'A', |
|
| 311 | - 7854 => 'A', |
|
| 312 | - 7856 => 'A', |
|
| 313 | - 7858 => 'A', |
|
| 314 | - 7860 => 'A', |
|
| 315 | - 7862 => 'A', |
|
| 316 | - 7867 => 'e', |
|
| 317 | - 7869 => 'e', |
|
| 318 | - 7865 => 'e', |
|
| 319 | - 7871 => 'e', |
|
| 320 | - 7873 => 'e', |
|
| 321 | - 7875 => 'e', |
|
| 322 | - 7877 => 'e', |
|
| 323 | - 7879 => 'e', |
|
| 324 | - 7866 => 'E', |
|
| 325 | - 7868 => 'E', |
|
| 326 | - 7864 => 'E', |
|
| 327 | - 7870 => 'E', |
|
| 328 | - 7872 => 'E', |
|
| 329 | - 7874 => 'E', |
|
| 330 | - 7876 => 'E', |
|
| 331 | - 7878 => 'E', |
|
| 332 | - 7881 => 'i', |
|
| 333 | - 7883 => 'i', |
|
| 334 | - 7880 => 'I', |
|
| 335 | - 7882 => 'I', |
|
| 336 | - 7887 => 'o', |
|
| 337 | - 7885 => 'o', |
|
| 338 | - 7889 => 'o', |
|
| 339 | - 7891 => 'o', |
|
| 340 | - 7893 => 'o', |
|
| 341 | - 7895 => 'o', |
|
| 342 | - 7897 => 'o', |
|
| 343 | - 417 => 'o', |
|
| 344 | - 7899 => 'o', |
|
| 345 | - 7901 => 'o', |
|
| 346 | - 7903 => 'o', |
|
| 347 | - 7905 => 'o', |
|
| 348 | - 7907 => 'o', |
|
| 349 | - 7886 => 'O', |
|
| 350 | - 7884 => 'O', |
|
| 351 | - 7888 => 'O', |
|
| 352 | - 7890 => 'O', |
|
| 353 | - 7892 => 'O', |
|
| 354 | - 7894 => 'O', |
|
| 355 | - 7896 => 'O', |
|
| 356 | - 416 => 'O', |
|
| 357 | - 7898 => 'O', |
|
| 358 | - 7900 => 'O', |
|
| 359 | - 7902 => 'O', |
|
| 360 | - 7904 => 'O', |
|
| 361 | - 7906 => 'O', |
|
| 362 | - 7911 => 'u', |
|
| 363 | - 361 => 'u', |
|
| 364 | - 7909 => 'u', |
|
| 365 | - 432 => 'u', |
|
| 366 | - 7913 => 'u', |
|
| 367 | - 7915 => 'u', |
|
| 368 | - 7917 => 'u', |
|
| 369 | - 7919 => 'u', |
|
| 370 | - 7921 => 'u', |
|
| 371 | - 7910 => 'U', |
|
| 372 | - 360 => 'U', |
|
| 373 | - 7908 => 'U', |
|
| 374 | - 431 => 'U', |
|
| 375 | - 7912 => 'U', |
|
| 376 | - 7914 => 'U', |
|
| 377 | - 7916 => 'U', |
|
| 378 | - 7918 => 'U', |
|
| 379 | - 7920 => 'U', |
|
| 380 | - 253 => 'y', |
|
| 381 | - 7923 => 'y', |
|
| 382 | - 7927 => 'y', |
|
| 383 | - 7929 => 'y', |
|
| 384 | - 7925 => 'y', |
|
| 385 | - 221 => 'Y', |
|
| 386 | - 7922 => 'Y', |
|
| 387 | - 7926 => 'Y', |
|
| 388 | - 7928 => 'Y', |
|
| 389 | - 7924 => 'Y', |
|
| 390 | - 273 => 'd' |
|
| 292 | + 7843 => 'a', |
|
| 293 | + 7841 => 'a', |
|
| 294 | + 7845 => 'a', |
|
| 295 | + 7847 => 'a', |
|
| 296 | + 7849 => 'a', |
|
| 297 | + 7851 => 'a', |
|
| 298 | + 7853 => 'a', |
|
| 299 | + 7855 => 'a', |
|
| 300 | + 7857 => 'a', |
|
| 301 | + 7859 => 'a', |
|
| 302 | + 7861 => 'a', |
|
| 303 | + 7863 => 'a', |
|
| 304 | + 7842 => 'A', |
|
| 305 | + 7840 => 'A', |
|
| 306 | + 7844 => 'A', |
|
| 307 | + 7846 => 'A', |
|
| 308 | + 7848 => 'A', |
|
| 309 | + 7850 => 'A', |
|
| 310 | + 7852 => 'A', |
|
| 311 | + 7854 => 'A', |
|
| 312 | + 7856 => 'A', |
|
| 313 | + 7858 => 'A', |
|
| 314 | + 7860 => 'A', |
|
| 315 | + 7862 => 'A', |
|
| 316 | + 7867 => 'e', |
|
| 317 | + 7869 => 'e', |
|
| 318 | + 7865 => 'e', |
|
| 319 | + 7871 => 'e', |
|
| 320 | + 7873 => 'e', |
|
| 321 | + 7875 => 'e', |
|
| 322 | + 7877 => 'e', |
|
| 323 | + 7879 => 'e', |
|
| 324 | + 7866 => 'E', |
|
| 325 | + 7868 => 'E', |
|
| 326 | + 7864 => 'E', |
|
| 327 | + 7870 => 'E', |
|
| 328 | + 7872 => 'E', |
|
| 329 | + 7874 => 'E', |
|
| 330 | + 7876 => 'E', |
|
| 331 | + 7878 => 'E', |
|
| 332 | + 7881 => 'i', |
|
| 333 | + 7883 => 'i', |
|
| 334 | + 7880 => 'I', |
|
| 335 | + 7882 => 'I', |
|
| 336 | + 7887 => 'o', |
|
| 337 | + 7885 => 'o', |
|
| 338 | + 7889 => 'o', |
|
| 339 | + 7891 => 'o', |
|
| 340 | + 7893 => 'o', |
|
| 341 | + 7895 => 'o', |
|
| 342 | + 7897 => 'o', |
|
| 343 | + 417 => 'o', |
|
| 344 | + 7899 => 'o', |
|
| 345 | + 7901 => 'o', |
|
| 346 | + 7903 => 'o', |
|
| 347 | + 7905 => 'o', |
|
| 348 | + 7907 => 'o', |
|
| 349 | + 7886 => 'O', |
|
| 350 | + 7884 => 'O', |
|
| 351 | + 7888 => 'O', |
|
| 352 | + 7890 => 'O', |
|
| 353 | + 7892 => 'O', |
|
| 354 | + 7894 => 'O', |
|
| 355 | + 7896 => 'O', |
|
| 356 | + 416 => 'O', |
|
| 357 | + 7898 => 'O', |
|
| 358 | + 7900 => 'O', |
|
| 359 | + 7902 => 'O', |
|
| 360 | + 7904 => 'O', |
|
| 361 | + 7906 => 'O', |
|
| 362 | + 7911 => 'u', |
|
| 363 | + 361 => 'u', |
|
| 364 | + 7909 => 'u', |
|
| 365 | + 432 => 'u', |
|
| 366 | + 7913 => 'u', |
|
| 367 | + 7915 => 'u', |
|
| 368 | + 7917 => 'u', |
|
| 369 | + 7919 => 'u', |
|
| 370 | + 7921 => 'u', |
|
| 371 | + 7910 => 'U', |
|
| 372 | + 360 => 'U', |
|
| 373 | + 7908 => 'U', |
|
| 374 | + 431 => 'U', |
|
| 375 | + 7912 => 'U', |
|
| 376 | + 7914 => 'U', |
|
| 377 | + 7916 => 'U', |
|
| 378 | + 7918 => 'U', |
|
| 379 | + 7920 => 'U', |
|
| 380 | + 253 => 'y', |
|
| 381 | + 7923 => 'y', |
|
| 382 | + 7927 => 'y', |
|
| 383 | + 7929 => 'y', |
|
| 384 | + 7925 => 'y', |
|
| 385 | + 221 => 'Y', |
|
| 386 | + 7922 => 'Y', |
|
| 387 | + 7926 => 'Y', |
|
| 388 | + 7928 => 'Y', |
|
| 389 | + 7924 => 'Y', |
|
| 390 | + 273 => 'd' |
|
| 391 | 391 | |
| 392 | 392 | ]; |
@@ -4,123 +4,123 @@ |
||
| 4 | 4 | // ** ne pas modifier le fichier ** |
| 5 | 5 | |
| 6 | 6 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 7 | - return; |
|
| 7 | + return; |
|
| 8 | 8 | } |
| 9 | 9 | |
| 10 | 10 | $GLOBALS[$GLOBALS['idx_lang']] = array( |
| 11 | 11 | |
| 12 | - // A |
|
| 13 | - 'accueil_site' => 'Startseite', |
|
| 14 | - 'article' => 'Artikel', |
|
| 15 | - 'articles' => 'Artikel', |
|
| 16 | - 'articles_auteur' => 'Artikel dieses Autors', |
|
| 17 | - 'articles_populaires' => 'Die beliebtesten Artikel', |
|
| 18 | - 'articles_rubrique' => 'Artikel dieser Rubrik', |
|
| 19 | - 'aucun_article' => 'Unter dieser Adresse gibt es keinen Artikel.', |
|
| 20 | - 'aucun_auteur' => 'Unter dieser Adresse gibt es keinen Autor.', |
|
| 21 | - 'aucun_site' => 'Unter dieser Adresse gibt es keien Website.', |
|
| 22 | - 'aucune_breve' => 'Unter dieser Adresse gibt es keine Meldung.', |
|
| 23 | - 'aucune_rubrique' => 'Unter dieser Adresse gibt es keine Rubrik.', |
|
| 24 | - 'auteur' => 'Autor', |
|
| 25 | - 'autres' => 'Andere', |
|
| 26 | - 'autres_breves' => 'Weitere Meldungen.', |
|
| 27 | - 'autres_groupes_mots_clefs' => 'Weitere Schlagwortgruppen', |
|
| 28 | - 'autres_sites' => 'Weitere Websites', |
|
| 29 | - |
|
| 30 | - // B |
|
| 31 | - 'bonjour' => 'Hallo', |
|
| 32 | - |
|
| 33 | - // C |
|
| 34 | - 'commenter_site' => 'Website kommentieren', |
|
| 35 | - 'contact' => 'Kontakt', |
|
| 36 | - 'copie_document_impossible' => 'Dokument kann nicht kopiert werden', |
|
| 37 | - |
|
| 38 | - // D |
|
| 39 | - 'date' => 'Datum', |
|
| 40 | - 'dernier_ajout' => 'Neuester Eintrag', |
|
| 41 | - 'dernieres_breves' => 'Neue Meldungen', |
|
| 42 | - 'derniers_articles' => 'Neueste Artikel', |
|
| 43 | - 'derniers_commentaires' => 'Neueste Kommentare', |
|
| 44 | - 'derniers_messages_forum' => 'Neue Forumsbeiträge', |
|
| 45 | - |
|
| 46 | - // E |
|
| 47 | - 'edition_mode_texte' => 'Im Textmodus bearbeiten ', |
|
| 48 | - 'en_reponse' => 'Antwort auf:', |
|
| 49 | - 'en_resume' => 'Als Zusammenfassung', |
|
| 50 | - 'envoyer_message' => 'Nachricht senden', |
|
| 51 | - 'espace_prive' => 'Redaktion', |
|
| 52 | - |
|
| 53 | - // F |
|
| 54 | - 'formats_acceptes' => 'Akzeptierte Formate: @formats@.', |
|
| 55 | - |
|
| 56 | - // H |
|
| 57 | - 'hierarchie_site' => 'Baumstruktur der Website', |
|
| 58 | - |
|
| 59 | - // J |
|
| 60 | - 'jours' => 'Tage', |
|
| 61 | - |
|
| 62 | - // L |
|
| 63 | - 'lien_connecter' => 'Login', |
|
| 64 | - |
|
| 65 | - // M |
|
| 66 | - 'meme_auteur' => 'Vom gleichen Autor', |
|
| 67 | - 'meme_rubrique' => 'In der gleichen Rubrik', |
|
| 68 | - 'memes_auteurs' => 'Von den gleichen Autoren', |
|
| 69 | - 'message' => 'Nachricht', |
|
| 70 | - 'messages_forum' => 'Nachrichten', |
|
| 71 | - 'messages_recents' => 'Neue Forumsbeiträge', |
|
| 72 | - 'mots_clef' => 'Schlagwort', |
|
| 73 | - 'mots_clefs' => 'Schlagworte', |
|
| 74 | - 'mots_clefs_meme_groupe' => 'Schlagworte der gleichen Kategorie', |
|
| 75 | - |
|
| 76 | - // N |
|
| 77 | - 'navigation' => 'Navigation', |
|
| 78 | - 'nom' => 'Name', |
|
| 79 | - 'nouveautes' => 'Neuigkeiten', |
|
| 80 | - 'nouveautes_web' => 'Neues im WWW', |
|
| 81 | - 'nouveaux_articles' => 'Neue Artikel', |
|
| 82 | - 'nouvelles_breves' => 'Neue Meldungen', |
|
| 83 | - |
|
| 84 | - // P |
|
| 85 | - 'page_precedente' => 'vorige Seite', |
|
| 86 | - 'page_suivante' => 'nächste Seite', |
|
| 87 | - 'par_auteur' => 'von ', |
|
| 88 | - 'participer_site' => 'Sie können bei dieser Website mitmachen, wenn Sie sich anmelden. Sie erhalten sofort eine E-Mail mit den Zugangsdaten zum Redaktionssystem.', |
|
| 89 | - 'plan_site' => 'Sitemap', |
|
| 90 | - 'popularite' => 'Beliebtheit', |
|
| 91 | - 'poster_message' => 'Nachricht senden', |
|
| 92 | - 'proposer_site' => 'Sie können in dieser Rubrik eine Seite vorschlagen :', |
|
| 93 | - |
|
| 94 | - // R |
|
| 95 | - 'repondre_article' => 'auf diesen Artikel antworten', |
|
| 96 | - 'repondre_breve' => 'auf diese Meldung antworten', |
|
| 97 | - 'resultats_recherche' => 'Suchergebnis(se)', |
|
| 98 | - 'retour_debut_forums' => 'Zurück zum Beginn des Forums', |
|
| 99 | - 'rss_abonnement' => 'Kopieren Sie die folgende URL in Ihren Feedreader:', |
|
| 100 | - 'rss_abonnement_titre' => 'Abonnieren', |
|
| 101 | - 'rss_abonnement_titre_page' => 'Abonnieren von', |
|
| 102 | - 'rss_explication' => 'Ein RSS-Feed sammelt Informationen über die Aktualisierungen einer Website. Er liefert den Inhalt von Einträgen oder Kommentaren oder einen Auszug daraus sowie einen Link zu den Vollversionen und einige andere Informationen. Der Feed ist dazu gedacht, von einem RSS-Aggregator (Feedreader) gelesen zu werden', |
|
| 103 | - 'rss_explication_titre' => 'Was ist ein RSS-Feed ?', |
|
| 104 | - 'rubrique' => 'Rubrik', |
|
| 105 | - 'rubriques' => 'Rubriken', |
|
| 106 | - |
|
| 107 | - // S |
|
| 108 | - 'signatures_petition' => 'Unterschrift', |
|
| 109 | - 'site_realise_avec_spip' => 'Realisiert mit SPIP', |
|
| 110 | - 'sites_web' => 'Websites', |
|
| 111 | - 'sous_rubriques' => 'Unterrubriken', |
|
| 112 | - 'spam' => 'SPAM', |
|
| 113 | - 'suite' => 'weiter', |
|
| 114 | - 'sur_web' => 'Im WWW', |
|
| 115 | - 'syndiquer_rubrique' => 'Diese Rubrik per RSS einbinden', |
|
| 116 | - 'syndiquer_site' => 'Die ganze Website mit RSS einbinden', |
|
| 117 | - |
|
| 118 | - // T |
|
| 119 | - 'texte_lettre_information' => 'Dies ist der Newsletter der Website ', |
|
| 120 | - 'texte_lettre_information_2' => 'Diese Mail informiert über die Neuerscheinungen der letzten', |
|
| 121 | - |
|
| 122 | - // V |
|
| 123 | - 'ver_imprimer' => 'Druckversion', |
|
| 124 | - 'voir_en_ligne' => 'Online ansehen', |
|
| 125 | - 'voir_squelette' => 'Layoutvorlage dieser Seite ansehen' |
|
| 12 | + // A |
|
| 13 | + 'accueil_site' => 'Startseite', |
|
| 14 | + 'article' => 'Artikel', |
|
| 15 | + 'articles' => 'Artikel', |
|
| 16 | + 'articles_auteur' => 'Artikel dieses Autors', |
|
| 17 | + 'articles_populaires' => 'Die beliebtesten Artikel', |
|
| 18 | + 'articles_rubrique' => 'Artikel dieser Rubrik', |
|
| 19 | + 'aucun_article' => 'Unter dieser Adresse gibt es keinen Artikel.', |
|
| 20 | + 'aucun_auteur' => 'Unter dieser Adresse gibt es keinen Autor.', |
|
| 21 | + 'aucun_site' => 'Unter dieser Adresse gibt es keien Website.', |
|
| 22 | + 'aucune_breve' => 'Unter dieser Adresse gibt es keine Meldung.', |
|
| 23 | + 'aucune_rubrique' => 'Unter dieser Adresse gibt es keine Rubrik.', |
|
| 24 | + 'auteur' => 'Autor', |
|
| 25 | + 'autres' => 'Andere', |
|
| 26 | + 'autres_breves' => 'Weitere Meldungen.', |
|
| 27 | + 'autres_groupes_mots_clefs' => 'Weitere Schlagwortgruppen', |
|
| 28 | + 'autres_sites' => 'Weitere Websites', |
|
| 29 | + |
|
| 30 | + // B |
|
| 31 | + 'bonjour' => 'Hallo', |
|
| 32 | + |
|
| 33 | + // C |
|
| 34 | + 'commenter_site' => 'Website kommentieren', |
|
| 35 | + 'contact' => 'Kontakt', |
|
| 36 | + 'copie_document_impossible' => 'Dokument kann nicht kopiert werden', |
|
| 37 | + |
|
| 38 | + // D |
|
| 39 | + 'date' => 'Datum', |
|
| 40 | + 'dernier_ajout' => 'Neuester Eintrag', |
|
| 41 | + 'dernieres_breves' => 'Neue Meldungen', |
|
| 42 | + 'derniers_articles' => 'Neueste Artikel', |
|
| 43 | + 'derniers_commentaires' => 'Neueste Kommentare', |
|
| 44 | + 'derniers_messages_forum' => 'Neue Forumsbeiträge', |
|
| 45 | + |
|
| 46 | + // E |
|
| 47 | + 'edition_mode_texte' => 'Im Textmodus bearbeiten ', |
|
| 48 | + 'en_reponse' => 'Antwort auf:', |
|
| 49 | + 'en_resume' => 'Als Zusammenfassung', |
|
| 50 | + 'envoyer_message' => 'Nachricht senden', |
|
| 51 | + 'espace_prive' => 'Redaktion', |
|
| 52 | + |
|
| 53 | + // F |
|
| 54 | + 'formats_acceptes' => 'Akzeptierte Formate: @formats@.', |
|
| 55 | + |
|
| 56 | + // H |
|
| 57 | + 'hierarchie_site' => 'Baumstruktur der Website', |
|
| 58 | + |
|
| 59 | + // J |
|
| 60 | + 'jours' => 'Tage', |
|
| 61 | + |
|
| 62 | + // L |
|
| 63 | + 'lien_connecter' => 'Login', |
|
| 64 | + |
|
| 65 | + // M |
|
| 66 | + 'meme_auteur' => 'Vom gleichen Autor', |
|
| 67 | + 'meme_rubrique' => 'In der gleichen Rubrik', |
|
| 68 | + 'memes_auteurs' => 'Von den gleichen Autoren', |
|
| 69 | + 'message' => 'Nachricht', |
|
| 70 | + 'messages_forum' => 'Nachrichten', |
|
| 71 | + 'messages_recents' => 'Neue Forumsbeiträge', |
|
| 72 | + 'mots_clef' => 'Schlagwort', |
|
| 73 | + 'mots_clefs' => 'Schlagworte', |
|
| 74 | + 'mots_clefs_meme_groupe' => 'Schlagworte der gleichen Kategorie', |
|
| 75 | + |
|
| 76 | + // N |
|
| 77 | + 'navigation' => 'Navigation', |
|
| 78 | + 'nom' => 'Name', |
|
| 79 | + 'nouveautes' => 'Neuigkeiten', |
|
| 80 | + 'nouveautes_web' => 'Neues im WWW', |
|
| 81 | + 'nouveaux_articles' => 'Neue Artikel', |
|
| 82 | + 'nouvelles_breves' => 'Neue Meldungen', |
|
| 83 | + |
|
| 84 | + // P |
|
| 85 | + 'page_precedente' => 'vorige Seite', |
|
| 86 | + 'page_suivante' => 'nächste Seite', |
|
| 87 | + 'par_auteur' => 'von ', |
|
| 88 | + 'participer_site' => 'Sie können bei dieser Website mitmachen, wenn Sie sich anmelden. Sie erhalten sofort eine E-Mail mit den Zugangsdaten zum Redaktionssystem.', |
|
| 89 | + 'plan_site' => 'Sitemap', |
|
| 90 | + 'popularite' => 'Beliebtheit', |
|
| 91 | + 'poster_message' => 'Nachricht senden', |
|
| 92 | + 'proposer_site' => 'Sie können in dieser Rubrik eine Seite vorschlagen :', |
|
| 93 | + |
|
| 94 | + // R |
|
| 95 | + 'repondre_article' => 'auf diesen Artikel antworten', |
|
| 96 | + 'repondre_breve' => 'auf diese Meldung antworten', |
|
| 97 | + 'resultats_recherche' => 'Suchergebnis(se)', |
|
| 98 | + 'retour_debut_forums' => 'Zurück zum Beginn des Forums', |
|
| 99 | + 'rss_abonnement' => 'Kopieren Sie die folgende URL in Ihren Feedreader:', |
|
| 100 | + 'rss_abonnement_titre' => 'Abonnieren', |
|
| 101 | + 'rss_abonnement_titre_page' => 'Abonnieren von', |
|
| 102 | + 'rss_explication' => 'Ein RSS-Feed sammelt Informationen über die Aktualisierungen einer Website. Er liefert den Inhalt von Einträgen oder Kommentaren oder einen Auszug daraus sowie einen Link zu den Vollversionen und einige andere Informationen. Der Feed ist dazu gedacht, von einem RSS-Aggregator (Feedreader) gelesen zu werden', |
|
| 103 | + 'rss_explication_titre' => 'Was ist ein RSS-Feed ?', |
|
| 104 | + 'rubrique' => 'Rubrik', |
|
| 105 | + 'rubriques' => 'Rubriken', |
|
| 106 | + |
|
| 107 | + // S |
|
| 108 | + 'signatures_petition' => 'Unterschrift', |
|
| 109 | + 'site_realise_avec_spip' => 'Realisiert mit SPIP', |
|
| 110 | + 'sites_web' => 'Websites', |
|
| 111 | + 'sous_rubriques' => 'Unterrubriken', |
|
| 112 | + 'spam' => 'SPAM', |
|
| 113 | + 'suite' => 'weiter', |
|
| 114 | + 'sur_web' => 'Im WWW', |
|
| 115 | + 'syndiquer_rubrique' => 'Diese Rubrik per RSS einbinden', |
|
| 116 | + 'syndiquer_site' => 'Die ganze Website mit RSS einbinden', |
|
| 117 | + |
|
| 118 | + // T |
|
| 119 | + 'texte_lettre_information' => 'Dies ist der Newsletter der Website ', |
|
| 120 | + 'texte_lettre_information_2' => 'Diese Mail informiert über die Neuerscheinungen der letzten', |
|
| 121 | + |
|
| 122 | + // V |
|
| 123 | + 'ver_imprimer' => 'Druckversion', |
|
| 124 | + 'voir_en_ligne' => 'Online ansehen', |
|
| 125 | + 'voir_squelette' => 'Layoutvorlage dieser Seite ansehen' |
|
| 126 | 126 | ); |
@@ -37,7 +37,7 @@ discard block |
||
| 37 | 37 | $pass_poivre = hash_hmac('sha256', $password_clair, $key); |
| 38 | 38 | return password_verify($pass_poivre, $password_hash); |
| 39 | 39 | } |
| 40 | - spip_log('Aucune clé pour vérifier le mot de passe', 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 40 | + spip_log('Aucune clé pour vérifier le mot de passe', 'chiffrer'._LOG_INFO_IMPORTANTE); |
|
| 41 | 41 | return false; |
| 42 | 42 | } |
| 43 | 43 | |
@@ -59,7 +59,7 @@ discard block |
||
| 59 | 59 | $pass_poivre = hash_hmac('sha256', $password_clair, $key); |
| 60 | 60 | return password_hash($pass_poivre, PASSWORD_DEFAULT); |
| 61 | 61 | } |
| 62 | - spip_log('Aucune clé pour chiffrer le mot de passe', 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 62 | + spip_log('Aucune clé pour chiffrer le mot de passe', 'chiffrer'._LOG_INFO_IMPORTANTE); |
|
| 63 | 63 | return null; |
| 64 | 64 | } |
| 65 | 65 | |
@@ -13,49 +13,49 @@ |
||
| 13 | 13 | |
| 14 | 14 | /** Vérification et hachage de mot de passe */ |
| 15 | 15 | class Password { |
| 16 | - /** |
|
| 17 | - * verifier qu'un mot de passe en clair est correct a l'aide de son hash |
|
| 18 | - * |
|
| 19 | - * Le mot de passe est poivre via la cle secret_des_auth |
|
| 20 | - */ |
|
| 21 | - public static function verifier( |
|
| 22 | - #[\SensitiveParameter] |
|
| 23 | - string $password_clair, |
|
| 24 | - #[\SensitiveParameter] |
|
| 25 | - string $password_hash, |
|
| 26 | - #[\SensitiveParameter] |
|
| 27 | - ?string $key = null |
|
| 28 | - ): bool { |
|
| 29 | - $key ??= self::getDefaultKey(); |
|
| 30 | - if ($key) { |
|
| 31 | - $pass_poivre = hash_hmac('sha256', $password_clair, $key); |
|
| 32 | - return password_verify($pass_poivre, $password_hash); |
|
| 33 | - } |
|
| 34 | - spip_log('Aucune clé pour vérifier le mot de passe', 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 35 | - return false; |
|
| 36 | - } |
|
| 16 | + /** |
|
| 17 | + * verifier qu'un mot de passe en clair est correct a l'aide de son hash |
|
| 18 | + * |
|
| 19 | + * Le mot de passe est poivre via la cle secret_des_auth |
|
| 20 | + */ |
|
| 21 | + public static function verifier( |
|
| 22 | + #[\SensitiveParameter] |
|
| 23 | + string $password_clair, |
|
| 24 | + #[\SensitiveParameter] |
|
| 25 | + string $password_hash, |
|
| 26 | + #[\SensitiveParameter] |
|
| 27 | + ?string $key = null |
|
| 28 | + ): bool { |
|
| 29 | + $key ??= self::getDefaultKey(); |
|
| 30 | + if ($key) { |
|
| 31 | + $pass_poivre = hash_hmac('sha256', $password_clair, $key); |
|
| 32 | + return password_verify($pass_poivre, $password_hash); |
|
| 33 | + } |
|
| 34 | + spip_log('Aucune clé pour vérifier le mot de passe', 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 35 | + return false; |
|
| 36 | + } |
|
| 37 | 37 | |
| 38 | - /** |
|
| 39 | - * Calculer un hash salé du mot de passe |
|
| 40 | - */ |
|
| 41 | - public static function hacher( |
|
| 42 | - #[\SensitiveParameter] |
|
| 43 | - string $password_clair, |
|
| 44 | - #[\SensitiveParameter] |
|
| 45 | - ?string $key = null |
|
| 46 | - ): ?string { |
|
| 47 | - $key ??= self::getDefaultKey(); |
|
| 48 | - // ne pas fournir un hash errone si la cle nous manque |
|
| 49 | - if ($key) { |
|
| 50 | - $pass_poivre = hash_hmac('sha256', $password_clair, $key); |
|
| 51 | - return password_hash($pass_poivre, PASSWORD_DEFAULT); |
|
| 52 | - } |
|
| 53 | - spip_log('Aucune clé pour chiffrer le mot de passe', 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 54 | - return null; |
|
| 55 | - } |
|
| 38 | + /** |
|
| 39 | + * Calculer un hash salé du mot de passe |
|
| 40 | + */ |
|
| 41 | + public static function hacher( |
|
| 42 | + #[\SensitiveParameter] |
|
| 43 | + string $password_clair, |
|
| 44 | + #[\SensitiveParameter] |
|
| 45 | + ?string $key = null |
|
| 46 | + ): ?string { |
|
| 47 | + $key ??= self::getDefaultKey(); |
|
| 48 | + // ne pas fournir un hash errone si la cle nous manque |
|
| 49 | + if ($key) { |
|
| 50 | + $pass_poivre = hash_hmac('sha256', $password_clair, $key); |
|
| 51 | + return password_hash($pass_poivre, PASSWORD_DEFAULT); |
|
| 52 | + } |
|
| 53 | + spip_log('Aucune clé pour chiffrer le mot de passe', 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 54 | + return null; |
|
| 55 | + } |
|
| 56 | 56 | |
| 57 | - private static function getDefaultKey(): ?string { |
|
| 58 | - $keys = SpipCles::instance(); |
|
| 59 | - return $keys->getSecretAuth(); |
|
| 60 | - } |
|
| 57 | + private static function getDefaultKey(): ?string { |
|
| 58 | + $keys = SpipCles::instance(); |
|
| 59 | + return $keys->getSecretAuth(); |
|
| 60 | + } |
|
| 61 | 61 | } |
@@ -30,7 +30,7 @@ |
||
| 30 | 30 | public function generate(string $name): string { |
| 31 | 31 | $key = Chiffrement::keygen(); |
| 32 | 32 | $this->keys[$name] = $key; |
| 33 | - spip_log("Création de la cle $name", 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 33 | + spip_log("Création de la cle $name", 'chiffrer'._LOG_INFO_IMPORTANTE); |
|
| 34 | 34 | return $key; |
| 35 | 35 | } |
| 36 | 36 | |
@@ -13,46 +13,46 @@ |
||
| 13 | 13 | |
| 14 | 14 | /** Conteneur de clés (chiffrement, authentification) */ |
| 15 | 15 | class Cles implements \Countable /* , ContainerInterface */ { |
| 16 | - public function __construct(private array $keys) { |
|
| 17 | - } |
|
| 18 | - |
|
| 19 | - public function has(string $name): bool { |
|
| 20 | - return array_key_exists($name, $this->keys); |
|
| 21 | - } |
|
| 22 | - |
|
| 23 | - public function get(string $name): ?string { |
|
| 24 | - return $this->keys[$name] ?? null; |
|
| 25 | - } |
|
| 26 | - |
|
| 27 | - public function generate(string $name): string { |
|
| 28 | - $key = Chiffrement::keygen(); |
|
| 29 | - $this->keys[$name] = $key; |
|
| 30 | - spip_log("Création de la cle $name", 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 31 | - return $key; |
|
| 32 | - } |
|
| 33 | - |
|
| 34 | - public function set( |
|
| 35 | - string $name, |
|
| 36 | - #[\SensitiveParameter] |
|
| 37 | - string $key |
|
| 38 | - ): void { |
|
| 39 | - $this->keys[$name] = $key; |
|
| 40 | - } |
|
| 41 | - |
|
| 42 | - public function delete(string $name): bool { |
|
| 43 | - if (isset($this->keys[$name])) { |
|
| 44 | - unset($this->keys[$name]); |
|
| 45 | - return true; |
|
| 46 | - }; |
|
| 47 | - return false; |
|
| 48 | - } |
|
| 49 | - |
|
| 50 | - public function count(): int { |
|
| 51 | - return count($this->keys); |
|
| 52 | - } |
|
| 53 | - |
|
| 54 | - public function toJson(): string { |
|
| 55 | - $json = array_map('base64_encode', $this->keys); |
|
| 56 | - return \json_encode($json); |
|
| 57 | - } |
|
| 16 | + public function __construct(private array $keys) { |
|
| 17 | + } |
|
| 18 | + |
|
| 19 | + public function has(string $name): bool { |
|
| 20 | + return array_key_exists($name, $this->keys); |
|
| 21 | + } |
|
| 22 | + |
|
| 23 | + public function get(string $name): ?string { |
|
| 24 | + return $this->keys[$name] ?? null; |
|
| 25 | + } |
|
| 26 | + |
|
| 27 | + public function generate(string $name): string { |
|
| 28 | + $key = Chiffrement::keygen(); |
|
| 29 | + $this->keys[$name] = $key; |
|
| 30 | + spip_log("Création de la cle $name", 'chiffrer' . _LOG_INFO_IMPORTANTE); |
|
| 31 | + return $key; |
|
| 32 | + } |
|
| 33 | + |
|
| 34 | + public function set( |
|
| 35 | + string $name, |
|
| 36 | + #[\SensitiveParameter] |
|
| 37 | + string $key |
|
| 38 | + ): void { |
|
| 39 | + $this->keys[$name] = $key; |
|
| 40 | + } |
|
| 41 | + |
|
| 42 | + public function delete(string $name): bool { |
|
| 43 | + if (isset($this->keys[$name])) { |
|
| 44 | + unset($this->keys[$name]); |
|
| 45 | + return true; |
|
| 46 | + }; |
|
| 47 | + return false; |
|
| 48 | + } |
|
| 49 | + |
|
| 50 | + public function count(): int { |
|
| 51 | + return count($this->keys); |
|
| 52 | + } |
|
| 53 | + |
|
| 54 | + public function toJson(): string { |
|
| 55 | + $json = array_map('base64_encode', $this->keys); |
|
| 56 | + return \json_encode($json); |
|
| 57 | + } |
|
| 58 | 58 | } |
@@ -16,7 +16,7 @@ discard block |
||
| 16 | 16 | * @package SPIP\Core\Queue |
| 17 | 17 | **/ |
| 18 | 18 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 19 | - return; |
|
| 19 | + return; |
|
| 20 | 20 | } |
| 21 | 21 | |
| 22 | 22 | define('_JQ_SCHEDULED', 1); |
@@ -50,103 +50,103 @@ discard block |
||
| 50 | 50 | * id of job |
| 51 | 51 | */ |
| 52 | 52 | function queue_add_job( |
| 53 | - $function, |
|
| 54 | - $description, |
|
| 55 | - $arguments = [], |
|
| 56 | - $file = '', |
|
| 57 | - $no_duplicate = false, |
|
| 58 | - $time = 0, |
|
| 59 | - $priority = 0 |
|
| 53 | + $function, |
|
| 54 | + $description, |
|
| 55 | + $arguments = [], |
|
| 56 | + $file = '', |
|
| 57 | + $no_duplicate = false, |
|
| 58 | + $time = 0, |
|
| 59 | + $priority = 0 |
|
| 60 | 60 | ) { |
| 61 | - include_spip('base/abstract_sql'); |
|
| 62 | - |
|
| 63 | - // cas pourri de ecrire/action/editer_site avec l'option reload=oui |
|
| 64 | - if (defined('_GENIE_SYNDIC_NOW')) { |
|
| 65 | - $arguments['id_syndic'] = _GENIE_SYNDIC_NOW; |
|
| 66 | - } |
|
| 67 | - |
|
| 68 | - // serialiser les arguments |
|
| 69 | - $arguments = serialize($arguments); |
|
| 70 | - $md5args = md5($arguments); |
|
| 71 | - |
|
| 72 | - // si pas de date programee, des que possible |
|
| 73 | - $duplicate_where = 'status=' . intval(_JQ_SCHEDULED) . ' AND '; |
|
| 74 | - if (!$time) { |
|
| 75 | - $time = time(); |
|
| 76 | - $duplicate_where = ''; // ne pas dupliquer si deja le meme job en cours d'execution |
|
| 77 | - } |
|
| 78 | - $date = date('Y-m-d H:i:s', $time); |
|
| 79 | - |
|
| 80 | - $set_job = [ |
|
| 81 | - 'fonction' => $function, |
|
| 82 | - 'descriptif' => $description, |
|
| 83 | - 'args' => $arguments, |
|
| 84 | - 'md5args' => $md5args, |
|
| 85 | - 'inclure' => $file, |
|
| 86 | - 'priorite' => max(-10, min(10, intval($priority))), |
|
| 87 | - 'date' => $date, |
|
| 88 | - 'status' => _JQ_SCHEDULED, |
|
| 89 | - ]; |
|
| 90 | - // si option ne pas dupliquer, regarder si la fonction existe deja |
|
| 91 | - // avec les memes args et file |
|
| 92 | - if ( |
|
| 93 | - $no_duplicate |
|
| 94 | - and |
|
| 95 | - $id_job = sql_getfetsel( |
|
| 96 | - 'id_job', |
|
| 97 | - 'spip_jobs', |
|
| 98 | - $duplicate_where = |
|
| 99 | - $duplicate_where . 'fonction=' . sql_quote($function) |
|
| 100 | - . (($no_duplicate === 'function_only') ? '' : |
|
| 101 | - ' AND md5args=' . sql_quote($md5args) . ' AND inclure=' . sql_quote($file)) |
|
| 102 | - ) |
|
| 103 | - ) { |
|
| 104 | - return $id_job; |
|
| 105 | - } |
|
| 106 | - |
|
| 107 | - $id_job = sql_insertq('spip_jobs', $set_job); |
|
| 108 | - // en cas de concurrence, deux process peuvent arriver jusqu'ici en parallele |
|
| 109 | - // avec le meme job unique a inserer. Dans ce cas, celui qui a eu l'id le plus grand |
|
| 110 | - // doit s'effacer |
|
| 111 | - if ( |
|
| 112 | - $no_duplicate |
|
| 113 | - and |
|
| 114 | - $id_prev = sql_getfetsel('id_job', 'spip_jobs', 'id_job<' . intval($id_job) . " AND $duplicate_where") |
|
| 115 | - ) { |
|
| 116 | - sql_delete('spip_jobs', 'id_job=' . intval($id_job)); |
|
| 117 | - |
|
| 118 | - return $id_prev; |
|
| 119 | - } |
|
| 120 | - |
|
| 121 | - // verifier la non duplication qui peut etre problematique en cas de concurence |
|
| 122 | - // il faut dans ce cas que seul le dernier ajoute se supprime ! |
|
| 123 | - |
|
| 124 | - // une option de debug pour verifier que les arguments en base sont bons |
|
| 125 | - // ie cas d'un char non acceptables sur certains type de champs |
|
| 126 | - // qui coupe la valeur |
|
| 127 | - if (defined('_JQ_INSERT_CHECK_ARGS') and $id_job) { |
|
| 128 | - $args = sql_getfetsel('args', 'spip_jobs', 'id_job=' . intval($id_job)); |
|
| 129 | - if ($args !== $arguments) { |
|
| 130 | - spip_log('arguments job errones / longueur ' . strlen($args) . ' vs ' . strlen($arguments) . ' / valeur : ' . var_export( |
|
| 131 | - $arguments, |
|
| 132 | - true |
|
| 133 | - ), 'queue'); |
|
| 134 | - } |
|
| 135 | - } |
|
| 136 | - |
|
| 137 | - if ($id_job) { |
|
| 138 | - queue_update_next_job_time($time); |
|
| 139 | - } |
|
| 140 | - // si la mise en file d'attente du job echoue, |
|
| 141 | - // il ne faut pas perdre l'execution de la fonction |
|
| 142 | - // on la lance immediatement, c'est un fallback |
|
| 143 | - // sauf en cas d'upgrade necessaire (table spip_jobs inexistante) |
|
| 144 | - elseif ($GLOBALS['meta']['version_installee'] == $GLOBALS['spip_version_base']) { |
|
| 145 | - $set_job['id_job'] = 0; |
|
| 146 | - queue_start_job($set_job); |
|
| 147 | - } |
|
| 148 | - |
|
| 149 | - return $id_job; |
|
| 61 | + include_spip('base/abstract_sql'); |
|
| 62 | + |
|
| 63 | + // cas pourri de ecrire/action/editer_site avec l'option reload=oui |
|
| 64 | + if (defined('_GENIE_SYNDIC_NOW')) { |
|
| 65 | + $arguments['id_syndic'] = _GENIE_SYNDIC_NOW; |
|
| 66 | + } |
|
| 67 | + |
|
| 68 | + // serialiser les arguments |
|
| 69 | + $arguments = serialize($arguments); |
|
| 70 | + $md5args = md5($arguments); |
|
| 71 | + |
|
| 72 | + // si pas de date programee, des que possible |
|
| 73 | + $duplicate_where = 'status=' . intval(_JQ_SCHEDULED) . ' AND '; |
|
| 74 | + if (!$time) { |
|
| 75 | + $time = time(); |
|
| 76 | + $duplicate_where = ''; // ne pas dupliquer si deja le meme job en cours d'execution |
|
| 77 | + } |
|
| 78 | + $date = date('Y-m-d H:i:s', $time); |
|
| 79 | + |
|
| 80 | + $set_job = [ |
|
| 81 | + 'fonction' => $function, |
|
| 82 | + 'descriptif' => $description, |
|
| 83 | + 'args' => $arguments, |
|
| 84 | + 'md5args' => $md5args, |
|
| 85 | + 'inclure' => $file, |
|
| 86 | + 'priorite' => max(-10, min(10, intval($priority))), |
|
| 87 | + 'date' => $date, |
|
| 88 | + 'status' => _JQ_SCHEDULED, |
|
| 89 | + ]; |
|
| 90 | + // si option ne pas dupliquer, regarder si la fonction existe deja |
|
| 91 | + // avec les memes args et file |
|
| 92 | + if ( |
|
| 93 | + $no_duplicate |
|
| 94 | + and |
|
| 95 | + $id_job = sql_getfetsel( |
|
| 96 | + 'id_job', |
|
| 97 | + 'spip_jobs', |
|
| 98 | + $duplicate_where = |
|
| 99 | + $duplicate_where . 'fonction=' . sql_quote($function) |
|
| 100 | + . (($no_duplicate === 'function_only') ? '' : |
|
| 101 | + ' AND md5args=' . sql_quote($md5args) . ' AND inclure=' . sql_quote($file)) |
|
| 102 | + ) |
|
| 103 | + ) { |
|
| 104 | + return $id_job; |
|
| 105 | + } |
|
| 106 | + |
|
| 107 | + $id_job = sql_insertq('spip_jobs', $set_job); |
|
| 108 | + // en cas de concurrence, deux process peuvent arriver jusqu'ici en parallele |
|
| 109 | + // avec le meme job unique a inserer. Dans ce cas, celui qui a eu l'id le plus grand |
|
| 110 | + // doit s'effacer |
|
| 111 | + if ( |
|
| 112 | + $no_duplicate |
|
| 113 | + and |
|
| 114 | + $id_prev = sql_getfetsel('id_job', 'spip_jobs', 'id_job<' . intval($id_job) . " AND $duplicate_where") |
|
| 115 | + ) { |
|
| 116 | + sql_delete('spip_jobs', 'id_job=' . intval($id_job)); |
|
| 117 | + |
|
| 118 | + return $id_prev; |
|
| 119 | + } |
|
| 120 | + |
|
| 121 | + // verifier la non duplication qui peut etre problematique en cas de concurence |
|
| 122 | + // il faut dans ce cas que seul le dernier ajoute se supprime ! |
|
| 123 | + |
|
| 124 | + // une option de debug pour verifier que les arguments en base sont bons |
|
| 125 | + // ie cas d'un char non acceptables sur certains type de champs |
|
| 126 | + // qui coupe la valeur |
|
| 127 | + if (defined('_JQ_INSERT_CHECK_ARGS') and $id_job) { |
|
| 128 | + $args = sql_getfetsel('args', 'spip_jobs', 'id_job=' . intval($id_job)); |
|
| 129 | + if ($args !== $arguments) { |
|
| 130 | + spip_log('arguments job errones / longueur ' . strlen($args) . ' vs ' . strlen($arguments) . ' / valeur : ' . var_export( |
|
| 131 | + $arguments, |
|
| 132 | + true |
|
| 133 | + ), 'queue'); |
|
| 134 | + } |
|
| 135 | + } |
|
| 136 | + |
|
| 137 | + if ($id_job) { |
|
| 138 | + queue_update_next_job_time($time); |
|
| 139 | + } |
|
| 140 | + // si la mise en file d'attente du job echoue, |
|
| 141 | + // il ne faut pas perdre l'execution de la fonction |
|
| 142 | + // on la lance immediatement, c'est un fallback |
|
| 143 | + // sauf en cas d'upgrade necessaire (table spip_jobs inexistante) |
|
| 144 | + elseif ($GLOBALS['meta']['version_installee'] == $GLOBALS['spip_version_base']) { |
|
| 145 | + $set_job['id_job'] = 0; |
|
| 146 | + queue_start_job($set_job); |
|
| 147 | + } |
|
| 148 | + |
|
| 149 | + return $id_job; |
|
| 150 | 150 | } |
| 151 | 151 | |
| 152 | 152 | /** |
@@ -155,11 +155,11 @@ discard block |
||
| 155 | 155 | * @return void |
| 156 | 156 | */ |
| 157 | 157 | function queue_purger() { |
| 158 | - include_spip('base/abstract_sql'); |
|
| 159 | - sql_delete('spip_jobs'); |
|
| 160 | - sql_delete('spip_jobs_liens', 'id_job NOT IN (' . sql_get_select('id_job', 'spip_jobs') . ')'); |
|
| 161 | - include_spip('inc/genie'); |
|
| 162 | - genie_queue_watch_dist(); |
|
| 158 | + include_spip('base/abstract_sql'); |
|
| 159 | + sql_delete('spip_jobs'); |
|
| 160 | + sql_delete('spip_jobs_liens', 'id_job NOT IN (' . sql_get_select('id_job', 'spip_jobs') . ')'); |
|
| 161 | + include_spip('inc/genie'); |
|
| 162 | + genie_queue_watch_dist(); |
|
| 163 | 163 | } |
| 164 | 164 | |
| 165 | 165 | /** |
@@ -170,25 +170,25 @@ discard block |
||
| 170 | 170 | * @return int|bool |
| 171 | 171 | */ |
| 172 | 172 | function queue_remove_job($id_job) { |
| 173 | - include_spip('base/abstract_sql'); |
|
| 174 | - |
|
| 175 | - if ( |
|
| 176 | - $row = sql_fetsel('fonction,inclure,date', 'spip_jobs', 'id_job=' . intval($id_job)) |
|
| 177 | - and $res = sql_delete('spip_jobs', 'id_job=' . intval($id_job)) |
|
| 178 | - ) { |
|
| 179 | - queue_unlink_job($id_job); |
|
| 180 | - // est-ce une tache cron qu'il faut relancer ? |
|
| 181 | - if ($periode = queue_is_cron_job($row['fonction'], $row['inclure'])) { |
|
| 182 | - // relancer avec les nouveaux arguments de temps |
|
| 183 | - include_spip('inc/genie'); |
|
| 184 | - // relancer avec la periode prevue |
|
| 185 | - queue_genie_replan_job($row['fonction'], $periode, strtotime($row['date'])); |
|
| 186 | - } |
|
| 187 | - queue_update_next_job_time(); |
|
| 188 | - return $res; |
|
| 189 | - } |
|
| 190 | - |
|
| 191 | - return false; |
|
| 173 | + include_spip('base/abstract_sql'); |
|
| 174 | + |
|
| 175 | + if ( |
|
| 176 | + $row = sql_fetsel('fonction,inclure,date', 'spip_jobs', 'id_job=' . intval($id_job)) |
|
| 177 | + and $res = sql_delete('spip_jobs', 'id_job=' . intval($id_job)) |
|
| 178 | + ) { |
|
| 179 | + queue_unlink_job($id_job); |
|
| 180 | + // est-ce une tache cron qu'il faut relancer ? |
|
| 181 | + if ($periode = queue_is_cron_job($row['fonction'], $row['inclure'])) { |
|
| 182 | + // relancer avec les nouveaux arguments de temps |
|
| 183 | + include_spip('inc/genie'); |
|
| 184 | + // relancer avec la periode prevue |
|
| 185 | + queue_genie_replan_job($row['fonction'], $periode, strtotime($row['date'])); |
|
| 186 | + } |
|
| 187 | + queue_update_next_job_time(); |
|
| 188 | + return $res; |
|
| 189 | + } |
|
| 190 | + |
|
| 191 | + return false; |
|
| 192 | 192 | } |
| 193 | 193 | |
| 194 | 194 | /** |
@@ -201,18 +201,18 @@ discard block |
||
| 201 | 201 | * ou un tableau composé de tableaux simples pour lieur plusieurs objets en une fois |
| 202 | 202 | */ |
| 203 | 203 | function queue_link_job($id_job, $objets) { |
| 204 | - include_spip('base/abstract_sql'); |
|
| 205 | - |
|
| 206 | - if (is_array($objets) and count($objets)) { |
|
| 207 | - if (is_array(reset($objets))) { |
|
| 208 | - foreach ($objets as $k => $o) { |
|
| 209 | - $objets[$k]['id_job'] = $id_job; |
|
| 210 | - } |
|
| 211 | - sql_insertq_multi('spip_jobs_liens', $objets); |
|
| 212 | - } else { |
|
| 213 | - sql_insertq('spip_jobs_liens', array_merge(['id_job' => $id_job], $objets)); |
|
| 214 | - } |
|
| 215 | - } |
|
| 204 | + include_spip('base/abstract_sql'); |
|
| 205 | + |
|
| 206 | + if (is_array($objets) and count($objets)) { |
|
| 207 | + if (is_array(reset($objets))) { |
|
| 208 | + foreach ($objets as $k => $o) { |
|
| 209 | + $objets[$k]['id_job'] = $id_job; |
|
| 210 | + } |
|
| 211 | + sql_insertq_multi('spip_jobs_liens', $objets); |
|
| 212 | + } else { |
|
| 213 | + sql_insertq('spip_jobs_liens', array_merge(['id_job' => $id_job], $objets)); |
|
| 214 | + } |
|
| 215 | + } |
|
| 216 | 216 | } |
| 217 | 217 | |
| 218 | 218 | /** |
@@ -224,7 +224,7 @@ discard block |
||
| 224 | 224 | * resultat du sql_delete |
| 225 | 225 | */ |
| 226 | 226 | function queue_unlink_job($id_job) { |
| 227 | - return sql_delete('spip_jobs_liens', 'id_job=' . intval($id_job)); |
|
| 227 | + return sql_delete('spip_jobs_liens', 'id_job=' . intval($id_job)); |
|
| 228 | 228 | } |
| 229 | 229 | |
| 230 | 230 | /** |
@@ -237,36 +237,36 @@ discard block |
||
| 237 | 237 | */ |
| 238 | 238 | function queue_start_job($row) { |
| 239 | 239 | |
| 240 | - // deserialiser les arguments |
|
| 241 | - $args = unserialize($row['args']); |
|
| 242 | - if (!is_array($args)) { |
|
| 243 | - spip_log('arguments job errones ' . var_export($row, true), 'queue'); |
|
| 244 | - $args = []; |
|
| 245 | - } |
|
| 246 | - |
|
| 247 | - $fonction = $row['fonction']; |
|
| 248 | - if (strlen($inclure = trim($row['inclure']))) { |
|
| 249 | - if (substr($inclure, -1) == '/') { // c'est un chemin pour charger_fonction |
|
| 250 | - $f = charger_fonction($fonction, rtrim($inclure, '/'), false); |
|
| 251 | - if ($f) { |
|
| 252 | - $fonction = $f; |
|
| 253 | - } |
|
| 254 | - } else { |
|
| 255 | - include_spip($inclure); |
|
| 256 | - } |
|
| 257 | - } |
|
| 258 | - |
|
| 259 | - if (!function_exists($fonction)) { |
|
| 260 | - spip_log("fonction $fonction ($inclure) inexistante " . var_export($row, true), 'queue'); |
|
| 261 | - |
|
| 262 | - return false; |
|
| 263 | - } |
|
| 264 | - |
|
| 265 | - spip_log('queue [' . $row['id_job'] . "]: $fonction() start", 'queue'); |
|
| 266 | - $res = $fonction(...$args); |
|
| 267 | - spip_log('queue [' . $row['id_job'] . "]: $fonction() end", 'queue'); |
|
| 268 | - |
|
| 269 | - return $res; |
|
| 240 | + // deserialiser les arguments |
|
| 241 | + $args = unserialize($row['args']); |
|
| 242 | + if (!is_array($args)) { |
|
| 243 | + spip_log('arguments job errones ' . var_export($row, true), 'queue'); |
|
| 244 | + $args = []; |
|
| 245 | + } |
|
| 246 | + |
|
| 247 | + $fonction = $row['fonction']; |
|
| 248 | + if (strlen($inclure = trim($row['inclure']))) { |
|
| 249 | + if (substr($inclure, -1) == '/') { // c'est un chemin pour charger_fonction |
|
| 250 | + $f = charger_fonction($fonction, rtrim($inclure, '/'), false); |
|
| 251 | + if ($f) { |
|
| 252 | + $fonction = $f; |
|
| 253 | + } |
|
| 254 | + } else { |
|
| 255 | + include_spip($inclure); |
|
| 256 | + } |
|
| 257 | + } |
|
| 258 | + |
|
| 259 | + if (!function_exists($fonction)) { |
|
| 260 | + spip_log("fonction $fonction ($inclure) inexistante " . var_export($row, true), 'queue'); |
|
| 261 | + |
|
| 262 | + return false; |
|
| 263 | + } |
|
| 264 | + |
|
| 265 | + spip_log('queue [' . $row['id_job'] . "]: $fonction() start", 'queue'); |
|
| 266 | + $res = $fonction(...$args); |
|
| 267 | + spip_log('queue [' . $row['id_job'] . "]: $fonction() end", 'queue'); |
|
| 268 | + |
|
| 269 | + return $res; |
|
| 270 | 270 | } |
| 271 | 271 | |
| 272 | 272 | /** |
@@ -293,89 +293,89 @@ discard block |
||
| 293 | 293 | * - true : une planification a été faite. |
| 294 | 294 | */ |
| 295 | 295 | function queue_schedule($force_jobs = null) { |
| 296 | - $time = time(); |
|
| 297 | - if (defined('_DEBUG_BLOCK_QUEUE')) { |
|
| 298 | - spip_log('_DEBUG_BLOCK_QUEUE : schedule stop', 'jq' . _LOG_DEBUG); |
|
| 299 | - |
|
| 300 | - return; |
|
| 301 | - } |
|
| 302 | - |
|
| 303 | - // rien a faire si le prochain job est encore dans le futur |
|
| 304 | - if (queue_sleep_time_to_next_job() > 0 and (!$force_jobs or !count($force_jobs))) { |
|
| 305 | - spip_log('queue_sleep_time_to_next_job', 'jq' . _LOG_DEBUG); |
|
| 306 | - |
|
| 307 | - return; |
|
| 308 | - } |
|
| 309 | - |
|
| 310 | - include_spip('base/abstract_sql'); |
|
| 311 | - // on ne peut rien faire si pas de connexion SQL |
|
| 312 | - if (!spip_connect()) { |
|
| 313 | - return false; |
|
| 314 | - } |
|
| 315 | - |
|
| 316 | - if (!defined('_JQ_MAX_JOBS_TIME_TO_EXECUTE')) { |
|
| 317 | - $max_time = ini_get('max_execution_time') / 2; |
|
| 318 | - // valeur conservatrice si on a pas reussi a lire le max_execution_time |
|
| 319 | - if (!$max_time) { |
|
| 320 | - $max_time = 5; |
|
| 321 | - } |
|
| 322 | - define('_JQ_MAX_JOBS_TIME_TO_EXECUTE', min($max_time, 15)); // une valeur maxi en temps. |
|
| 323 | - } |
|
| 324 | - $end_time = $time + _JQ_MAX_JOBS_TIME_TO_EXECUTE; |
|
| 325 | - |
|
| 326 | - spip_log("JQ schedule $time / $end_time", 'jq' . _LOG_DEBUG); |
|
| 327 | - |
|
| 328 | - if (!defined('_JQ_MAX_JOBS_EXECUTE')) { |
|
| 329 | - define('_JQ_MAX_JOBS_EXECUTE', 200); |
|
| 330 | - } |
|
| 331 | - $nbj = 0; |
|
| 332 | - // attraper les jobs |
|
| 333 | - // dont la date est passee (echus en attente), |
|
| 334 | - // par ordre : |
|
| 335 | - // - de priorite |
|
| 336 | - // - de date |
|
| 337 | - // lorsqu'un job cron n'a pas fini, sa priorite est descendue |
|
| 338 | - // pour qu'il ne bloque pas les autres jobs en attente |
|
| 339 | - if (is_array($force_jobs) and count($force_jobs)) { |
|
| 340 | - $cond = 'status=' . intval(_JQ_SCHEDULED) . ' AND ' . sql_in('id_job', $force_jobs); |
|
| 341 | - } else { |
|
| 342 | - $now = date('Y-m-d H:i:s', $time); |
|
| 343 | - $cond = 'status=' . intval(_JQ_SCHEDULED) . ' AND date<=' . sql_quote($now); |
|
| 344 | - } |
|
| 345 | - |
|
| 346 | - register_shutdown_function('queue_error_handler'); // recuperer les erreurs auant que possible |
|
| 347 | - $res = sql_allfetsel('*', 'spip_jobs', $cond, '', 'priorite DESC,date', '0,' . (_JQ_MAX_JOBS_EXECUTE + 1)); |
|
| 348 | - do { |
|
| 349 | - if ($row = array_shift($res)) { |
|
| 350 | - $nbj++; |
|
| 351 | - // il faut un verrou, a base de sql_delete |
|
| 352 | - if (sql_delete('spip_jobs', 'id_job=' . intval($row['id_job']) . ' AND status=' . intval(_JQ_SCHEDULED))) { |
|
| 353 | - #spip_log("JQ schedule job ".$nbj." OK",'jq'); |
|
| 354 | - // on reinsert dans la base aussitot avec un status=_JQ_PENDING |
|
| 355 | - $row['status'] = _JQ_PENDING; |
|
| 356 | - $row['date'] = date('Y-m-d H:i:s', $time); |
|
| 357 | - sql_insertq('spip_jobs', $row); |
|
| 358 | - |
|
| 359 | - // on a la main sur le job : |
|
| 360 | - // l'executer |
|
| 361 | - $result = queue_start_job($row); |
|
| 362 | - |
|
| 363 | - $time = time(); |
|
| 364 | - queue_close_job($row, $time, $result); |
|
| 365 | - } |
|
| 366 | - } |
|
| 367 | - spip_log('JQ schedule job end time ' . $time, 'jq' . _LOG_DEBUG); |
|
| 368 | - } while ($nbj < _JQ_MAX_JOBS_EXECUTE and $row and $time < $end_time); |
|
| 369 | - spip_log('JQ schedule end time ' . time(), 'jq' . _LOG_DEBUG); |
|
| 370 | - |
|
| 371 | - if ($row = array_shift($res)) { |
|
| 372 | - queue_update_next_job_time(0); // on sait qu'il y a encore des jobs a lancer ASAP |
|
| 373 | - spip_log('JQ encore !', 'jq' . _LOG_DEBUG); |
|
| 374 | - } else { |
|
| 375 | - queue_update_next_job_time(); |
|
| 376 | - } |
|
| 377 | - |
|
| 378 | - return true; |
|
| 296 | + $time = time(); |
|
| 297 | + if (defined('_DEBUG_BLOCK_QUEUE')) { |
|
| 298 | + spip_log('_DEBUG_BLOCK_QUEUE : schedule stop', 'jq' . _LOG_DEBUG); |
|
| 299 | + |
|
| 300 | + return; |
|
| 301 | + } |
|
| 302 | + |
|
| 303 | + // rien a faire si le prochain job est encore dans le futur |
|
| 304 | + if (queue_sleep_time_to_next_job() > 0 and (!$force_jobs or !count($force_jobs))) { |
|
| 305 | + spip_log('queue_sleep_time_to_next_job', 'jq' . _LOG_DEBUG); |
|
| 306 | + |
|
| 307 | + return; |
|
| 308 | + } |
|
| 309 | + |
|
| 310 | + include_spip('base/abstract_sql'); |
|
| 311 | + // on ne peut rien faire si pas de connexion SQL |
|
| 312 | + if (!spip_connect()) { |
|
| 313 | + return false; |
|
| 314 | + } |
|
| 315 | + |
|
| 316 | + if (!defined('_JQ_MAX_JOBS_TIME_TO_EXECUTE')) { |
|
| 317 | + $max_time = ini_get('max_execution_time') / 2; |
|
| 318 | + // valeur conservatrice si on a pas reussi a lire le max_execution_time |
|
| 319 | + if (!$max_time) { |
|
| 320 | + $max_time = 5; |
|
| 321 | + } |
|
| 322 | + define('_JQ_MAX_JOBS_TIME_TO_EXECUTE', min($max_time, 15)); // une valeur maxi en temps. |
|
| 323 | + } |
|
| 324 | + $end_time = $time + _JQ_MAX_JOBS_TIME_TO_EXECUTE; |
|
| 325 | + |
|
| 326 | + spip_log("JQ schedule $time / $end_time", 'jq' . _LOG_DEBUG); |
|
| 327 | + |
|
| 328 | + if (!defined('_JQ_MAX_JOBS_EXECUTE')) { |
|
| 329 | + define('_JQ_MAX_JOBS_EXECUTE', 200); |
|
| 330 | + } |
|
| 331 | + $nbj = 0; |
|
| 332 | + // attraper les jobs |
|
| 333 | + // dont la date est passee (echus en attente), |
|
| 334 | + // par ordre : |
|
| 335 | + // - de priorite |
|
| 336 | + // - de date |
|
| 337 | + // lorsqu'un job cron n'a pas fini, sa priorite est descendue |
|
| 338 | + // pour qu'il ne bloque pas les autres jobs en attente |
|
| 339 | + if (is_array($force_jobs) and count($force_jobs)) { |
|
| 340 | + $cond = 'status=' . intval(_JQ_SCHEDULED) . ' AND ' . sql_in('id_job', $force_jobs); |
|
| 341 | + } else { |
|
| 342 | + $now = date('Y-m-d H:i:s', $time); |
|
| 343 | + $cond = 'status=' . intval(_JQ_SCHEDULED) . ' AND date<=' . sql_quote($now); |
|
| 344 | + } |
|
| 345 | + |
|
| 346 | + register_shutdown_function('queue_error_handler'); // recuperer les erreurs auant que possible |
|
| 347 | + $res = sql_allfetsel('*', 'spip_jobs', $cond, '', 'priorite DESC,date', '0,' . (_JQ_MAX_JOBS_EXECUTE + 1)); |
|
| 348 | + do { |
|
| 349 | + if ($row = array_shift($res)) { |
|
| 350 | + $nbj++; |
|
| 351 | + // il faut un verrou, a base de sql_delete |
|
| 352 | + if (sql_delete('spip_jobs', 'id_job=' . intval($row['id_job']) . ' AND status=' . intval(_JQ_SCHEDULED))) { |
|
| 353 | + #spip_log("JQ schedule job ".$nbj." OK",'jq'); |
|
| 354 | + // on reinsert dans la base aussitot avec un status=_JQ_PENDING |
|
| 355 | + $row['status'] = _JQ_PENDING; |
|
| 356 | + $row['date'] = date('Y-m-d H:i:s', $time); |
|
| 357 | + sql_insertq('spip_jobs', $row); |
|
| 358 | + |
|
| 359 | + // on a la main sur le job : |
|
| 360 | + // l'executer |
|
| 361 | + $result = queue_start_job($row); |
|
| 362 | + |
|
| 363 | + $time = time(); |
|
| 364 | + queue_close_job($row, $time, $result); |
|
| 365 | + } |
|
| 366 | + } |
|
| 367 | + spip_log('JQ schedule job end time ' . $time, 'jq' . _LOG_DEBUG); |
|
| 368 | + } while ($nbj < _JQ_MAX_JOBS_EXECUTE and $row and $time < $end_time); |
|
| 369 | + spip_log('JQ schedule end time ' . time(), 'jq' . _LOG_DEBUG); |
|
| 370 | + |
|
| 371 | + if ($row = array_shift($res)) { |
|
| 372 | + queue_update_next_job_time(0); // on sait qu'il y a encore des jobs a lancer ASAP |
|
| 373 | + spip_log('JQ encore !', 'jq' . _LOG_DEBUG); |
|
| 374 | + } else { |
|
| 375 | + queue_update_next_job_time(); |
|
| 376 | + } |
|
| 377 | + |
|
| 378 | + return true; |
|
| 379 | 379 | } |
| 380 | 380 | |
| 381 | 381 | /** |
@@ -393,21 +393,21 @@ discard block |
||
| 393 | 393 | * @param int $result |
| 394 | 394 | */ |
| 395 | 395 | function queue_close_job(&$row, $time, $result = 0) { |
| 396 | - // est-ce une tache cron qu'il faut relancer ? |
|
| 397 | - if ($periode = queue_is_cron_job($row['fonction'], $row['inclure'])) { |
|
| 398 | - // relancer avec les nouveaux arguments de temps |
|
| 399 | - include_spip('inc/genie'); |
|
| 400 | - if ($result < 0) { // relancer tout de suite, mais en baissant la priorite |
|
| 401 | - queue_genie_replan_job($row['fonction'], $periode, 0 - $result, null, $row['priorite'] - 1); |
|
| 402 | - } else // relancer avec la periode prevue |
|
| 403 | - { |
|
| 404 | - queue_genie_replan_job($row['fonction'], $periode, $time); |
|
| 405 | - } |
|
| 406 | - } |
|
| 407 | - // purger ses liens eventuels avec des objets |
|
| 408 | - sql_delete('spip_jobs_liens', 'id_job=' . intval($row['id_job'])); |
|
| 409 | - // supprimer le job fini |
|
| 410 | - sql_delete('spip_jobs', 'id_job=' . intval($row['id_job'])); |
|
| 396 | + // est-ce une tache cron qu'il faut relancer ? |
|
| 397 | + if ($periode = queue_is_cron_job($row['fonction'], $row['inclure'])) { |
|
| 398 | + // relancer avec les nouveaux arguments de temps |
|
| 399 | + include_spip('inc/genie'); |
|
| 400 | + if ($result < 0) { // relancer tout de suite, mais en baissant la priorite |
|
| 401 | + queue_genie_replan_job($row['fonction'], $periode, 0 - $result, null, $row['priorite'] - 1); |
|
| 402 | + } else // relancer avec la periode prevue |
|
| 403 | + { |
|
| 404 | + queue_genie_replan_job($row['fonction'], $periode, $time); |
|
| 405 | + } |
|
| 406 | + } |
|
| 407 | + // purger ses liens eventuels avec des objets |
|
| 408 | + sql_delete('spip_jobs_liens', 'id_job=' . intval($row['id_job'])); |
|
| 409 | + // supprimer le job fini |
|
| 410 | + sql_delete('spip_jobs', 'id_job=' . intval($row['id_job'])); |
|
| 411 | 411 | } |
| 412 | 412 | |
| 413 | 413 | /** |
@@ -417,10 +417,10 @@ discard block |
||
| 417 | 417 | * @uses queue_update_next_job_time() |
| 418 | 418 | */ |
| 419 | 419 | function queue_error_handler() { |
| 420 | - // se remettre dans le bon dossier, car Apache le change parfois (toujours?) |
|
| 421 | - chdir(_ROOT_CWD); |
|
| 420 | + // se remettre dans le bon dossier, car Apache le change parfois (toujours?) |
|
| 421 | + chdir(_ROOT_CWD); |
|
| 422 | 422 | |
| 423 | - queue_update_next_job_time(); |
|
| 423 | + queue_update_next_job_time(); |
|
| 424 | 424 | } |
| 425 | 425 | |
| 426 | 426 | |
@@ -437,18 +437,18 @@ discard block |
||
| 437 | 437 | * Périodicité de la tâche en secondes, si tâche périodique, sinon false. |
| 438 | 438 | */ |
| 439 | 439 | function queue_is_cron_job($function, $inclure) { |
| 440 | - static $taches = null; |
|
| 441 | - if (strncmp($inclure, 'genie/', 6) == 0) { |
|
| 442 | - if (is_null($taches)) { |
|
| 443 | - include_spip('inc/genie'); |
|
| 444 | - $taches = taches_generales(); |
|
| 445 | - } |
|
| 446 | - if (isset($taches[$function])) { |
|
| 447 | - return $taches[$function]; |
|
| 448 | - } |
|
| 449 | - } |
|
| 450 | - |
|
| 451 | - return false; |
|
| 440 | + static $taches = null; |
|
| 441 | + if (strncmp($inclure, 'genie/', 6) == 0) { |
|
| 442 | + if (is_null($taches)) { |
|
| 443 | + include_spip('inc/genie'); |
|
| 444 | + $taches = taches_generales(); |
|
| 445 | + } |
|
| 446 | + if (isset($taches[$function])) { |
|
| 447 | + return $taches[$function]; |
|
| 448 | + } |
|
| 449 | + } |
|
| 450 | + |
|
| 451 | + return false; |
|
| 452 | 452 | } |
| 453 | 453 | |
| 454 | 454 | /** |
@@ -462,62 +462,62 @@ discard block |
||
| 462 | 462 | * temps de la tache ajoutee ou 0 pour ASAP |
| 463 | 463 | */ |
| 464 | 464 | function queue_update_next_job_time($next_time = null) { |
| 465 | - static $nb_jobs_scheduled = null; |
|
| 466 | - static $deja_la = false; |
|
| 467 | - // prendre le min des $next_time que l'on voit passer ici, en cas de reentrance |
|
| 468 | - static $next = null; |
|
| 469 | - // queue_close_job peut etre reentrant ici |
|
| 470 | - if ($deja_la) { |
|
| 471 | - return; |
|
| 472 | - } |
|
| 473 | - $deja_la = true; |
|
| 474 | - |
|
| 475 | - include_spip('base/abstract_sql'); |
|
| 476 | - $time = time(); |
|
| 477 | - |
|
| 478 | - // traiter les jobs morts au combat (_JQ_PENDING depuis plus de 180s) |
|
| 479 | - // pour cause de timeout ou autre erreur fatale |
|
| 480 | - $res = sql_allfetsel( |
|
| 481 | - '*', |
|
| 482 | - 'spip_jobs', |
|
| 483 | - 'status=' . intval(_JQ_PENDING) . ' AND date<' . sql_quote(date('Y-m-d H:i:s', $time - 180)) |
|
| 484 | - ); |
|
| 485 | - if (is_array($res)) { |
|
| 486 | - foreach ($res as $row) { |
|
| 487 | - queue_close_job($row, $time); |
|
| 488 | - spip_log('queue_close_job car _JQ_PENDING depuis +180s : ' . print_r($row, 1), 'job_mort' . _LOG_ERREUR); |
|
| 489 | - } |
|
| 490 | - } |
|
| 491 | - |
|
| 492 | - // chercher la date du prochain job si pas connu |
|
| 493 | - if (is_null($next) or is_null(queue_sleep_time_to_next_job())) { |
|
| 494 | - $date = sql_getfetsel('date', 'spip_jobs', 'status=' . intval(_JQ_SCHEDULED), '', 'date', '0,1'); |
|
| 495 | - $next = strtotime($date); |
|
| 496 | - } |
|
| 497 | - if (!is_null($next_time)) { |
|
| 498 | - if (is_null($next) or $next > $next_time) { |
|
| 499 | - $next = $next_time; |
|
| 500 | - } |
|
| 501 | - } |
|
| 502 | - |
|
| 503 | - if ($next) { |
|
| 504 | - if (is_null($nb_jobs_scheduled)) { |
|
| 505 | - $nb_jobs_scheduled = sql_countsel( |
|
| 506 | - 'spip_jobs', |
|
| 507 | - 'status=' . intval(_JQ_SCHEDULED) . ' AND date<' . sql_quote(date('Y-m-d H:i:s', $time)) |
|
| 508 | - ); |
|
| 509 | - } elseif ($next <= $time) { |
|
| 510 | - $nb_jobs_scheduled++; |
|
| 511 | - } |
|
| 512 | - // si trop de jobs en attente, on force la purge en fin de hit |
|
| 513 | - // pour assurer le coup |
|
| 514 | - if ($nb_jobs_scheduled > (defined('_JQ_NB_JOBS_OVERFLOW') ? _JQ_NB_JOBS_OVERFLOW : 10000)) { |
|
| 515 | - define('_DIRECT_CRON_FORCE', true); |
|
| 516 | - } |
|
| 517 | - } |
|
| 518 | - |
|
| 519 | - queue_set_next_job_time($next); |
|
| 520 | - $deja_la = false; |
|
| 465 | + static $nb_jobs_scheduled = null; |
|
| 466 | + static $deja_la = false; |
|
| 467 | + // prendre le min des $next_time que l'on voit passer ici, en cas de reentrance |
|
| 468 | + static $next = null; |
|
| 469 | + // queue_close_job peut etre reentrant ici |
|
| 470 | + if ($deja_la) { |
|
| 471 | + return; |
|
| 472 | + } |
|
| 473 | + $deja_la = true; |
|
| 474 | + |
|
| 475 | + include_spip('base/abstract_sql'); |
|
| 476 | + $time = time(); |
|
| 477 | + |
|
| 478 | + // traiter les jobs morts au combat (_JQ_PENDING depuis plus de 180s) |
|
| 479 | + // pour cause de timeout ou autre erreur fatale |
|
| 480 | + $res = sql_allfetsel( |
|
| 481 | + '*', |
|
| 482 | + 'spip_jobs', |
|
| 483 | + 'status=' . intval(_JQ_PENDING) . ' AND date<' . sql_quote(date('Y-m-d H:i:s', $time - 180)) |
|
| 484 | + ); |
|
| 485 | + if (is_array($res)) { |
|
| 486 | + foreach ($res as $row) { |
|
| 487 | + queue_close_job($row, $time); |
|
| 488 | + spip_log('queue_close_job car _JQ_PENDING depuis +180s : ' . print_r($row, 1), 'job_mort' . _LOG_ERREUR); |
|
| 489 | + } |
|
| 490 | + } |
|
| 491 | + |
|
| 492 | + // chercher la date du prochain job si pas connu |
|
| 493 | + if (is_null($next) or is_null(queue_sleep_time_to_next_job())) { |
|
| 494 | + $date = sql_getfetsel('date', 'spip_jobs', 'status=' . intval(_JQ_SCHEDULED), '', 'date', '0,1'); |
|
| 495 | + $next = strtotime($date); |
|
| 496 | + } |
|
| 497 | + if (!is_null($next_time)) { |
|
| 498 | + if (is_null($next) or $next > $next_time) { |
|
| 499 | + $next = $next_time; |
|
| 500 | + } |
|
| 501 | + } |
|
| 502 | + |
|
| 503 | + if ($next) { |
|
| 504 | + if (is_null($nb_jobs_scheduled)) { |
|
| 505 | + $nb_jobs_scheduled = sql_countsel( |
|
| 506 | + 'spip_jobs', |
|
| 507 | + 'status=' . intval(_JQ_SCHEDULED) . ' AND date<' . sql_quote(date('Y-m-d H:i:s', $time)) |
|
| 508 | + ); |
|
| 509 | + } elseif ($next <= $time) { |
|
| 510 | + $nb_jobs_scheduled++; |
|
| 511 | + } |
|
| 512 | + // si trop de jobs en attente, on force la purge en fin de hit |
|
| 513 | + // pour assurer le coup |
|
| 514 | + if ($nb_jobs_scheduled > (defined('_JQ_NB_JOBS_OVERFLOW') ? _JQ_NB_JOBS_OVERFLOW : 10000)) { |
|
| 515 | + define('_DIRECT_CRON_FORCE', true); |
|
| 516 | + } |
|
| 517 | + } |
|
| 518 | + |
|
| 519 | + queue_set_next_job_time($next); |
|
| 520 | + $deja_la = false; |
|
| 521 | 521 | } |
| 522 | 522 | |
| 523 | 523 | |
@@ -528,26 +528,26 @@ discard block |
||
| 528 | 528 | */ |
| 529 | 529 | function queue_set_next_job_time($next) { |
| 530 | 530 | |
| 531 | - // utiliser le temps courant reel plutot que temps de la requete ici |
|
| 532 | - $time = time(); |
|
| 533 | - |
|
| 534 | - // toujours relire la valeur pour comparer, pour tenir compte des maj concourrantes |
|
| 535 | - // et ne mettre a jour que si il y a un interet a le faire |
|
| 536 | - // permet ausis d'initialiser le nom de fichier a coup sur |
|
| 537 | - $curr_next = $_SERVER['REQUEST_TIME'] + max(0, queue_sleep_time_to_next_job(true)); |
|
| 538 | - if ( |
|
| 539 | - ($curr_next <= $time and $next > $time) // le prochain job est dans le futur mais pas la date planifiee actuelle |
|
| 540 | - or $curr_next > $next // le prochain job est plus tot que la date planifiee actuelle |
|
| 541 | - ) { |
|
| 542 | - if (function_exists('cache_set') and defined('_MEMOIZE_MEMORY') and _MEMOIZE_MEMORY) { |
|
| 543 | - cache_set(_JQ_NEXT_JOB_TIME_FILENAME, intval($next)); |
|
| 544 | - } else { |
|
| 545 | - ecrire_fichier(_JQ_NEXT_JOB_TIME_FILENAME, intval($next)); |
|
| 546 | - } |
|
| 547 | - queue_sleep_time_to_next_job($next); |
|
| 548 | - } |
|
| 549 | - |
|
| 550 | - return queue_sleep_time_to_next_job(); |
|
| 531 | + // utiliser le temps courant reel plutot que temps de la requete ici |
|
| 532 | + $time = time(); |
|
| 533 | + |
|
| 534 | + // toujours relire la valeur pour comparer, pour tenir compte des maj concourrantes |
|
| 535 | + // et ne mettre a jour que si il y a un interet a le faire |
|
| 536 | + // permet ausis d'initialiser le nom de fichier a coup sur |
|
| 537 | + $curr_next = $_SERVER['REQUEST_TIME'] + max(0, queue_sleep_time_to_next_job(true)); |
|
| 538 | + if ( |
|
| 539 | + ($curr_next <= $time and $next > $time) // le prochain job est dans le futur mais pas la date planifiee actuelle |
|
| 540 | + or $curr_next > $next // le prochain job est plus tot que la date planifiee actuelle |
|
| 541 | + ) { |
|
| 542 | + if (function_exists('cache_set') and defined('_MEMOIZE_MEMORY') and _MEMOIZE_MEMORY) { |
|
| 543 | + cache_set(_JQ_NEXT_JOB_TIME_FILENAME, intval($next)); |
|
| 544 | + } else { |
|
| 545 | + ecrire_fichier(_JQ_NEXT_JOB_TIME_FILENAME, intval($next)); |
|
| 546 | + } |
|
| 547 | + queue_sleep_time_to_next_job($next); |
|
| 548 | + } |
|
| 549 | + |
|
| 550 | + return queue_sleep_time_to_next_job(); |
|
| 551 | 551 | } |
| 552 | 552 | |
| 553 | 553 | /** |
@@ -564,60 +564,60 @@ discard block |
||
| 564 | 564 | * @return string |
| 565 | 565 | */ |
| 566 | 566 | function queue_affichage_cron() { |
| 567 | - $texte = ''; |
|
| 568 | - |
|
| 569 | - $time_to_next = queue_sleep_time_to_next_job(); |
|
| 570 | - // rien a faire si le prochain job est encore dans le futur |
|
| 571 | - if ($time_to_next > 0 or defined('_DEBUG_BLOCK_QUEUE')) { |
|
| 572 | - return $texte; |
|
| 573 | - } |
|
| 574 | - |
|
| 575 | - // ne pas relancer si on vient de lancer dans la meme seconde par un hit concurent |
|
| 576 | - if (file_exists($lock = _DIR_TMP . 'cron.lock') and !(@filemtime($lock) < $_SERVER['REQUEST_TIME'])) { |
|
| 577 | - return $texte; |
|
| 578 | - } |
|
| 579 | - |
|
| 580 | - @touch($lock); |
|
| 581 | - |
|
| 582 | - // il y a des taches en attentes |
|
| 583 | - // si depuis plus de 5min, on essaye de lancer le cron par tous les moyens pour rattraper le coup |
|
| 584 | - // on est sans doute sur un site qui n'autorise pas http sortant ou avec peu de trafic |
|
| 585 | - $urgent = false; |
|
| 586 | - if ($time_to_next < -300) { |
|
| 587 | - $urgent = true; |
|
| 588 | - } |
|
| 589 | - |
|
| 590 | - $url_cron = generer_url_action('cron', '', false, true); |
|
| 591 | - |
|
| 592 | - if (!defined('_HTML_BG_CRON_FORCE') or !_HTML_BG_CRON_FORCE) { |
|
| 593 | - if (queue_lancer_url_http_async($url_cron) and !$urgent) { |
|
| 594 | - return $texte; |
|
| 595 | - } |
|
| 596 | - } |
|
| 597 | - |
|
| 598 | - // si deja force, on retourne sans rien |
|
| 599 | - if (defined('_DIRECT_CRON_FORCE')) { |
|
| 600 | - return $texte; |
|
| 601 | - } |
|
| 602 | - |
|
| 603 | - // si c'est un bot |
|
| 604 | - // inutile de faire un appel par image background, |
|
| 605 | - // on force un appel direct en fin de hit |
|
| 606 | - if ((defined('_IS_BOT') and _IS_BOT)) { |
|
| 607 | - define('_DIRECT_CRON_FORCE', true); |
|
| 608 | - |
|
| 609 | - return $texte; |
|
| 610 | - } |
|
| 611 | - |
|
| 612 | - if (!defined('_HTML_BG_CRON_INHIB') or !_HTML_BG_CRON_INHIB) { |
|
| 613 | - // en derniere solution, on insere un appel xhr non bloquant ou une image background dans la page si pas de JS |
|
| 614 | - $url_cron = generer_url_action('cron'); |
|
| 615 | - $texte = '<!-- SPIP-CRON -->' |
|
| 616 | - . "<script>setTimeout(function(){var xo = new XMLHttpRequest();xo.open('GET', '$url_cron', true);xo.send('');},100);</script>" |
|
| 617 | - . "<noscript><div style=\"background-image: url('$url_cron');\"></div></noscript>"; |
|
| 618 | - } |
|
| 619 | - |
|
| 620 | - return $texte; |
|
| 567 | + $texte = ''; |
|
| 568 | + |
|
| 569 | + $time_to_next = queue_sleep_time_to_next_job(); |
|
| 570 | + // rien a faire si le prochain job est encore dans le futur |
|
| 571 | + if ($time_to_next > 0 or defined('_DEBUG_BLOCK_QUEUE')) { |
|
| 572 | + return $texte; |
|
| 573 | + } |
|
| 574 | + |
|
| 575 | + // ne pas relancer si on vient de lancer dans la meme seconde par un hit concurent |
|
| 576 | + if (file_exists($lock = _DIR_TMP . 'cron.lock') and !(@filemtime($lock) < $_SERVER['REQUEST_TIME'])) { |
|
| 577 | + return $texte; |
|
| 578 | + } |
|
| 579 | + |
|
| 580 | + @touch($lock); |
|
| 581 | + |
|
| 582 | + // il y a des taches en attentes |
|
| 583 | + // si depuis plus de 5min, on essaye de lancer le cron par tous les moyens pour rattraper le coup |
|
| 584 | + // on est sans doute sur un site qui n'autorise pas http sortant ou avec peu de trafic |
|
| 585 | + $urgent = false; |
|
| 586 | + if ($time_to_next < -300) { |
|
| 587 | + $urgent = true; |
|
| 588 | + } |
|
| 589 | + |
|
| 590 | + $url_cron = generer_url_action('cron', '', false, true); |
|
| 591 | + |
|
| 592 | + if (!defined('_HTML_BG_CRON_FORCE') or !_HTML_BG_CRON_FORCE) { |
|
| 593 | + if (queue_lancer_url_http_async($url_cron) and !$urgent) { |
|
| 594 | + return $texte; |
|
| 595 | + } |
|
| 596 | + } |
|
| 597 | + |
|
| 598 | + // si deja force, on retourne sans rien |
|
| 599 | + if (defined('_DIRECT_CRON_FORCE')) { |
|
| 600 | + return $texte; |
|
| 601 | + } |
|
| 602 | + |
|
| 603 | + // si c'est un bot |
|
| 604 | + // inutile de faire un appel par image background, |
|
| 605 | + // on force un appel direct en fin de hit |
|
| 606 | + if ((defined('_IS_BOT') and _IS_BOT)) { |
|
| 607 | + define('_DIRECT_CRON_FORCE', true); |
|
| 608 | + |
|
| 609 | + return $texte; |
|
| 610 | + } |
|
| 611 | + |
|
| 612 | + if (!defined('_HTML_BG_CRON_INHIB') or !_HTML_BG_CRON_INHIB) { |
|
| 613 | + // en derniere solution, on insere un appel xhr non bloquant ou une image background dans la page si pas de JS |
|
| 614 | + $url_cron = generer_url_action('cron'); |
|
| 615 | + $texte = '<!-- SPIP-CRON -->' |
|
| 616 | + . "<script>setTimeout(function(){var xo = new XMLHttpRequest();xo.open('GET', '$url_cron', true);xo.send('');},100);</script>" |
|
| 617 | + . "<noscript><div style=\"background-image: url('$url_cron');\"></div></noscript>"; |
|
| 618 | + } |
|
| 619 | + |
|
| 620 | + return $texte; |
|
| 621 | 621 | } |
| 622 | 622 | |
| 623 | 623 | /** |
@@ -626,73 +626,73 @@ discard block |
||
| 626 | 626 | * @return bool : true si l'url a pu être appelée en asynchrone, false sinon |
| 627 | 627 | */ |
| 628 | 628 | function queue_lancer_url_http_async($url_cron) { |
| 629 | - // methode la plus rapide : |
|
| 630 | - // Si fsockopen est possible, on lance le cron via un socket en asynchrone |
|
| 631 | - // si fsockopen echoue (disponibilite serveur, firewall) on essaye pas cURL |
|
| 632 | - // car on a toutes les chances d'echouer pareil mais sans moyen de le savoir |
|
| 633 | - // mais on renvoie false direct |
|
| 634 | - if (function_exists('fsockopen')) { |
|
| 635 | - $parts = parse_url($url_cron); |
|
| 636 | - |
|
| 637 | - switch ($parts['scheme']) { |
|
| 638 | - case 'https': |
|
| 639 | - $scheme = 'ssl://'; |
|
| 640 | - $port = 443; |
|
| 641 | - break; |
|
| 642 | - case 'http': |
|
| 643 | - default: |
|
| 644 | - $scheme = ''; |
|
| 645 | - $port = 80; |
|
| 646 | - } |
|
| 647 | - $fp = @fsockopen( |
|
| 648 | - $scheme . $parts['host'], |
|
| 649 | - $parts['port'] ?? $port, |
|
| 650 | - $errno, |
|
| 651 | - $errstr, |
|
| 652 | - 1 |
|
| 653 | - ); |
|
| 654 | - |
|
| 655 | - if ($fp) { |
|
| 656 | - $host_sent = $parts['host']; |
|
| 657 | - if (isset($parts['port']) and $parts['port'] !== $port) { |
|
| 658 | - $host_sent .= ':' . $parts['port']; |
|
| 659 | - } |
|
| 660 | - $timeout = 200; // ms |
|
| 661 | - stream_set_timeout($fp, 0, $timeout * 1000); |
|
| 662 | - $query = $parts['path'] . ($parts['query'] ? '?' . $parts['query'] : ''); |
|
| 663 | - $out = 'GET ' . $query . " HTTP/1.1\r\n"; |
|
| 664 | - $out .= 'Host: ' . $host_sent . "\r\n"; |
|
| 665 | - $out .= "Connection: Close\r\n\r\n"; |
|
| 666 | - fwrite($fp, $out); |
|
| 667 | - spip_timer('read'); |
|
| 668 | - $t = 0; |
|
| 669 | - // on lit la reponse si possible pour fermer proprement la connexion |
|
| 670 | - // avec un timeout total de 200ms pour ne pas se bloquer |
|
| 671 | - while (!feof($fp) and $t < $timeout) { |
|
| 672 | - @fgets($fp, 1024); |
|
| 673 | - $t += spip_timer('read', true); |
|
| 674 | - spip_timer('read'); |
|
| 675 | - } |
|
| 676 | - fclose($fp); |
|
| 677 | - return true; |
|
| 678 | - } |
|
| 679 | - } |
|
| 680 | - // si fsockopen n'est pas dispo on essaye cURL : |
|
| 681 | - // lancer le cron par un cURL asynchrone si cURL est present |
|
| 682 | - elseif (function_exists('curl_init')) { |
|
| 683 | - //setting the curl parameters. |
|
| 684 | - $ch = curl_init($url_cron); |
|
| 685 | - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
|
| 686 | - // cf bug : http://www.php.net/manual/en/function.curl-setopt.php#104597 |
|
| 687 | - curl_setopt($ch, CURLOPT_NOSIGNAL, 1); |
|
| 688 | - // valeur mini pour que la requete soit lancee |
|
| 689 | - curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); |
|
| 690 | - // lancer |
|
| 691 | - curl_exec($ch); |
|
| 692 | - // fermer |
|
| 693 | - curl_close($ch); |
|
| 694 | - return true; |
|
| 695 | - } |
|
| 696 | - |
|
| 697 | - return false; |
|
| 629 | + // methode la plus rapide : |
|
| 630 | + // Si fsockopen est possible, on lance le cron via un socket en asynchrone |
|
| 631 | + // si fsockopen echoue (disponibilite serveur, firewall) on essaye pas cURL |
|
| 632 | + // car on a toutes les chances d'echouer pareil mais sans moyen de le savoir |
|
| 633 | + // mais on renvoie false direct |
|
| 634 | + if (function_exists('fsockopen')) { |
|
| 635 | + $parts = parse_url($url_cron); |
|
| 636 | + |
|
| 637 | + switch ($parts['scheme']) { |
|
| 638 | + case 'https': |
|
| 639 | + $scheme = 'ssl://'; |
|
| 640 | + $port = 443; |
|
| 641 | + break; |
|
| 642 | + case 'http': |
|
| 643 | + default: |
|
| 644 | + $scheme = ''; |
|
| 645 | + $port = 80; |
|
| 646 | + } |
|
| 647 | + $fp = @fsockopen( |
|
| 648 | + $scheme . $parts['host'], |
|
| 649 | + $parts['port'] ?? $port, |
|
| 650 | + $errno, |
|
| 651 | + $errstr, |
|
| 652 | + 1 |
|
| 653 | + ); |
|
| 654 | + |
|
| 655 | + if ($fp) { |
|
| 656 | + $host_sent = $parts['host']; |
|
| 657 | + if (isset($parts['port']) and $parts['port'] !== $port) { |
|
| 658 | + $host_sent .= ':' . $parts['port']; |
|
| 659 | + } |
|
| 660 | + $timeout = 200; // ms |
|
| 661 | + stream_set_timeout($fp, 0, $timeout * 1000); |
|
| 662 | + $query = $parts['path'] . ($parts['query'] ? '?' . $parts['query'] : ''); |
|
| 663 | + $out = 'GET ' . $query . " HTTP/1.1\r\n"; |
|
| 664 | + $out .= 'Host: ' . $host_sent . "\r\n"; |
|
| 665 | + $out .= "Connection: Close\r\n\r\n"; |
|
| 666 | + fwrite($fp, $out); |
|
| 667 | + spip_timer('read'); |
|
| 668 | + $t = 0; |
|
| 669 | + // on lit la reponse si possible pour fermer proprement la connexion |
|
| 670 | + // avec un timeout total de 200ms pour ne pas se bloquer |
|
| 671 | + while (!feof($fp) and $t < $timeout) { |
|
| 672 | + @fgets($fp, 1024); |
|
| 673 | + $t += spip_timer('read', true); |
|
| 674 | + spip_timer('read'); |
|
| 675 | + } |
|
| 676 | + fclose($fp); |
|
| 677 | + return true; |
|
| 678 | + } |
|
| 679 | + } |
|
| 680 | + // si fsockopen n'est pas dispo on essaye cURL : |
|
| 681 | + // lancer le cron par un cURL asynchrone si cURL est present |
|
| 682 | + elseif (function_exists('curl_init')) { |
|
| 683 | + //setting the curl parameters. |
|
| 684 | + $ch = curl_init($url_cron); |
|
| 685 | + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
|
| 686 | + // cf bug : http://www.php.net/manual/en/function.curl-setopt.php#104597 |
|
| 687 | + curl_setopt($ch, CURLOPT_NOSIGNAL, 1); |
|
| 688 | + // valeur mini pour que la requete soit lancee |
|
| 689 | + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); |
|
| 690 | + // lancer |
|
| 691 | + curl_exec($ch); |
|
| 692 | + // fermer |
|
| 693 | + curl_close($ch); |
|
| 694 | + return true; |
|
| 695 | + } |
|
| 696 | + |
|
| 697 | + return false; |
|
| 698 | 698 | } |
@@ -70,7 +70,7 @@ discard block |
||
| 70 | 70 | $md5args = md5($arguments); |
| 71 | 71 | |
| 72 | 72 | // si pas de date programee, des que possible |
| 73 | - $duplicate_where = 'status=' . intval(_JQ_SCHEDULED) . ' AND '; |
|
| 73 | + $duplicate_where = 'status='.intval(_JQ_SCHEDULED).' AND '; |
|
| 74 | 74 | if (!$time) { |
| 75 | 75 | $time = time(); |
| 76 | 76 | $duplicate_where = ''; // ne pas dupliquer si deja le meme job en cours d'execution |
@@ -96,9 +96,8 @@ discard block |
||
| 96 | 96 | 'id_job', |
| 97 | 97 | 'spip_jobs', |
| 98 | 98 | $duplicate_where = |
| 99 | - $duplicate_where . 'fonction=' . sql_quote($function) |
|
| 100 | - . (($no_duplicate === 'function_only') ? '' : |
|
| 101 | - ' AND md5args=' . sql_quote($md5args) . ' AND inclure=' . sql_quote($file)) |
|
| 99 | + $duplicate_where.'fonction='.sql_quote($function) |
|
| 100 | + . (($no_duplicate === 'function_only') ? '' : ' AND md5args='.sql_quote($md5args).' AND inclure='.sql_quote($file)) |
|
| 102 | 101 | ) |
| 103 | 102 | ) { |
| 104 | 103 | return $id_job; |
@@ -111,9 +110,9 @@ discard block |
||
| 111 | 110 | if ( |
| 112 | 111 | $no_duplicate |
| 113 | 112 | and |
| 114 | - $id_prev = sql_getfetsel('id_job', 'spip_jobs', 'id_job<' . intval($id_job) . " AND $duplicate_where") |
|
| 113 | + $id_prev = sql_getfetsel('id_job', 'spip_jobs', 'id_job<'.intval($id_job)." AND $duplicate_where") |
|
| 115 | 114 | ) { |
| 116 | - sql_delete('spip_jobs', 'id_job=' . intval($id_job)); |
|
| 115 | + sql_delete('spip_jobs', 'id_job='.intval($id_job)); |
|
| 117 | 116 | |
| 118 | 117 | return $id_prev; |
| 119 | 118 | } |
@@ -125,9 +124,9 @@ discard block |
||
| 125 | 124 | // ie cas d'un char non acceptables sur certains type de champs |
| 126 | 125 | // qui coupe la valeur |
| 127 | 126 | if (defined('_JQ_INSERT_CHECK_ARGS') and $id_job) { |
| 128 | - $args = sql_getfetsel('args', 'spip_jobs', 'id_job=' . intval($id_job)); |
|
| 127 | + $args = sql_getfetsel('args', 'spip_jobs', 'id_job='.intval($id_job)); |
|
| 129 | 128 | if ($args !== $arguments) { |
| 130 | - spip_log('arguments job errones / longueur ' . strlen($args) . ' vs ' . strlen($arguments) . ' / valeur : ' . var_export( |
|
| 129 | + spip_log('arguments job errones / longueur '.strlen($args).' vs '.strlen($arguments).' / valeur : '.var_export( |
|
| 131 | 130 | $arguments, |
| 132 | 131 | true |
| 133 | 132 | ), 'queue'); |
@@ -157,7 +156,7 @@ discard block |
||
| 157 | 156 | function queue_purger() { |
| 158 | 157 | include_spip('base/abstract_sql'); |
| 159 | 158 | sql_delete('spip_jobs'); |
| 160 | - sql_delete('spip_jobs_liens', 'id_job NOT IN (' . sql_get_select('id_job', 'spip_jobs') . ')'); |
|
| 159 | + sql_delete('spip_jobs_liens', 'id_job NOT IN ('.sql_get_select('id_job', 'spip_jobs').')'); |
|
| 161 | 160 | include_spip('inc/genie'); |
| 162 | 161 | genie_queue_watch_dist(); |
| 163 | 162 | } |
@@ -173,8 +172,8 @@ discard block |
||
| 173 | 172 | include_spip('base/abstract_sql'); |
| 174 | 173 | |
| 175 | 174 | if ( |
| 176 | - $row = sql_fetsel('fonction,inclure,date', 'spip_jobs', 'id_job=' . intval($id_job)) |
|
| 177 | - and $res = sql_delete('spip_jobs', 'id_job=' . intval($id_job)) |
|
| 175 | + $row = sql_fetsel('fonction,inclure,date', 'spip_jobs', 'id_job='.intval($id_job)) |
|
| 176 | + and $res = sql_delete('spip_jobs', 'id_job='.intval($id_job)) |
|
| 178 | 177 | ) { |
| 179 | 178 | queue_unlink_job($id_job); |
| 180 | 179 | // est-ce une tache cron qu'il faut relancer ? |
@@ -224,7 +223,7 @@ discard block |
||
| 224 | 223 | * resultat du sql_delete |
| 225 | 224 | */ |
| 226 | 225 | function queue_unlink_job($id_job) { |
| 227 | - return sql_delete('spip_jobs_liens', 'id_job=' . intval($id_job)); |
|
| 226 | + return sql_delete('spip_jobs_liens', 'id_job='.intval($id_job)); |
|
| 228 | 227 | } |
| 229 | 228 | |
| 230 | 229 | /** |
@@ -240,7 +239,7 @@ discard block |
||
| 240 | 239 | // deserialiser les arguments |
| 241 | 240 | $args = unserialize($row['args']); |
| 242 | 241 | if (!is_array($args)) { |
| 243 | - spip_log('arguments job errones ' . var_export($row, true), 'queue'); |
|
| 242 | + spip_log('arguments job errones '.var_export($row, true), 'queue'); |
|
| 244 | 243 | $args = []; |
| 245 | 244 | } |
| 246 | 245 | |
@@ -257,14 +256,14 @@ discard block |
||
| 257 | 256 | } |
| 258 | 257 | |
| 259 | 258 | if (!function_exists($fonction)) { |
| 260 | - spip_log("fonction $fonction ($inclure) inexistante " . var_export($row, true), 'queue'); |
|
| 259 | + spip_log("fonction $fonction ($inclure) inexistante ".var_export($row, true), 'queue'); |
|
| 261 | 260 | |
| 262 | 261 | return false; |
| 263 | 262 | } |
| 264 | 263 | |
| 265 | - spip_log('queue [' . $row['id_job'] . "]: $fonction() start", 'queue'); |
|
| 264 | + spip_log('queue ['.$row['id_job']."]: $fonction() start", 'queue'); |
|
| 266 | 265 | $res = $fonction(...$args); |
| 267 | - spip_log('queue [' . $row['id_job'] . "]: $fonction() end", 'queue'); |
|
| 266 | + spip_log('queue ['.$row['id_job']."]: $fonction() end", 'queue'); |
|
| 268 | 267 | |
| 269 | 268 | return $res; |
| 270 | 269 | } |
@@ -295,14 +294,14 @@ discard block |
||
| 295 | 294 | function queue_schedule($force_jobs = null) { |
| 296 | 295 | $time = time(); |
| 297 | 296 | if (defined('_DEBUG_BLOCK_QUEUE')) { |
| 298 | - spip_log('_DEBUG_BLOCK_QUEUE : schedule stop', 'jq' . _LOG_DEBUG); |
|
| 297 | + spip_log('_DEBUG_BLOCK_QUEUE : schedule stop', 'jq'._LOG_DEBUG); |
|
| 299 | 298 | |
| 300 | 299 | return; |
| 301 | 300 | } |
| 302 | 301 | |
| 303 | 302 | // rien a faire si le prochain job est encore dans le futur |
| 304 | 303 | if (queue_sleep_time_to_next_job() > 0 and (!$force_jobs or !count($force_jobs))) { |
| 305 | - spip_log('queue_sleep_time_to_next_job', 'jq' . _LOG_DEBUG); |
|
| 304 | + spip_log('queue_sleep_time_to_next_job', 'jq'._LOG_DEBUG); |
|
| 306 | 305 | |
| 307 | 306 | return; |
| 308 | 307 | } |
@@ -323,7 +322,7 @@ discard block |
||
| 323 | 322 | } |
| 324 | 323 | $end_time = $time + _JQ_MAX_JOBS_TIME_TO_EXECUTE; |
| 325 | 324 | |
| 326 | - spip_log("JQ schedule $time / $end_time", 'jq' . _LOG_DEBUG); |
|
| 325 | + spip_log("JQ schedule $time / $end_time", 'jq'._LOG_DEBUG); |
|
| 327 | 326 | |
| 328 | 327 | if (!defined('_JQ_MAX_JOBS_EXECUTE')) { |
| 329 | 328 | define('_JQ_MAX_JOBS_EXECUTE', 200); |
@@ -337,19 +336,19 @@ discard block |
||
| 337 | 336 | // lorsqu'un job cron n'a pas fini, sa priorite est descendue |
| 338 | 337 | // pour qu'il ne bloque pas les autres jobs en attente |
| 339 | 338 | if (is_array($force_jobs) and count($force_jobs)) { |
| 340 | - $cond = 'status=' . intval(_JQ_SCHEDULED) . ' AND ' . sql_in('id_job', $force_jobs); |
|
| 339 | + $cond = 'status='.intval(_JQ_SCHEDULED).' AND '.sql_in('id_job', $force_jobs); |
|
| 341 | 340 | } else { |
| 342 | 341 | $now = date('Y-m-d H:i:s', $time); |
| 343 | - $cond = 'status=' . intval(_JQ_SCHEDULED) . ' AND date<=' . sql_quote($now); |
|
| 342 | + $cond = 'status='.intval(_JQ_SCHEDULED).' AND date<='.sql_quote($now); |
|
| 344 | 343 | } |
| 345 | 344 | |
| 346 | 345 | register_shutdown_function('queue_error_handler'); // recuperer les erreurs auant que possible |
| 347 | - $res = sql_allfetsel('*', 'spip_jobs', $cond, '', 'priorite DESC,date', '0,' . (_JQ_MAX_JOBS_EXECUTE + 1)); |
|
| 346 | + $res = sql_allfetsel('*', 'spip_jobs', $cond, '', 'priorite DESC,date', '0,'.(_JQ_MAX_JOBS_EXECUTE + 1)); |
|
| 348 | 347 | do { |
| 349 | 348 | if ($row = array_shift($res)) { |
| 350 | 349 | $nbj++; |
| 351 | 350 | // il faut un verrou, a base de sql_delete |
| 352 | - if (sql_delete('spip_jobs', 'id_job=' . intval($row['id_job']) . ' AND status=' . intval(_JQ_SCHEDULED))) { |
|
| 351 | + if (sql_delete('spip_jobs', 'id_job='.intval($row['id_job']).' AND status='.intval(_JQ_SCHEDULED))) { |
|
| 353 | 352 | #spip_log("JQ schedule job ".$nbj." OK",'jq'); |
| 354 | 353 | // on reinsert dans la base aussitot avec un status=_JQ_PENDING |
| 355 | 354 | $row['status'] = _JQ_PENDING; |
@@ -364,13 +363,13 @@ discard block |
||
| 364 | 363 | queue_close_job($row, $time, $result); |
| 365 | 364 | } |
| 366 | 365 | } |
| 367 | - spip_log('JQ schedule job end time ' . $time, 'jq' . _LOG_DEBUG); |
|
| 366 | + spip_log('JQ schedule job end time '.$time, 'jq'._LOG_DEBUG); |
|
| 368 | 367 | } while ($nbj < _JQ_MAX_JOBS_EXECUTE and $row and $time < $end_time); |
| 369 | - spip_log('JQ schedule end time ' . time(), 'jq' . _LOG_DEBUG); |
|
| 368 | + spip_log('JQ schedule end time '.time(), 'jq'._LOG_DEBUG); |
|
| 370 | 369 | |
| 371 | 370 | if ($row = array_shift($res)) { |
| 372 | 371 | queue_update_next_job_time(0); // on sait qu'il y a encore des jobs a lancer ASAP |
| 373 | - spip_log('JQ encore !', 'jq' . _LOG_DEBUG); |
|
| 372 | + spip_log('JQ encore !', 'jq'._LOG_DEBUG); |
|
| 374 | 373 | } else { |
| 375 | 374 | queue_update_next_job_time(); |
| 376 | 375 | } |
@@ -405,9 +404,9 @@ discard block |
||
| 405 | 404 | } |
| 406 | 405 | } |
| 407 | 406 | // purger ses liens eventuels avec des objets |
| 408 | - sql_delete('spip_jobs_liens', 'id_job=' . intval($row['id_job'])); |
|
| 407 | + sql_delete('spip_jobs_liens', 'id_job='.intval($row['id_job'])); |
|
| 409 | 408 | // supprimer le job fini |
| 410 | - sql_delete('spip_jobs', 'id_job=' . intval($row['id_job'])); |
|
| 409 | + sql_delete('spip_jobs', 'id_job='.intval($row['id_job'])); |
|
| 411 | 410 | } |
| 412 | 411 | |
| 413 | 412 | /** |
@@ -480,18 +479,18 @@ discard block |
||
| 480 | 479 | $res = sql_allfetsel( |
| 481 | 480 | '*', |
| 482 | 481 | 'spip_jobs', |
| 483 | - 'status=' . intval(_JQ_PENDING) . ' AND date<' . sql_quote(date('Y-m-d H:i:s', $time - 180)) |
|
| 482 | + 'status='.intval(_JQ_PENDING).' AND date<'.sql_quote(date('Y-m-d H:i:s', $time - 180)) |
|
| 484 | 483 | ); |
| 485 | 484 | if (is_array($res)) { |
| 486 | 485 | foreach ($res as $row) { |
| 487 | 486 | queue_close_job($row, $time); |
| 488 | - spip_log('queue_close_job car _JQ_PENDING depuis +180s : ' . print_r($row, 1), 'job_mort' . _LOG_ERREUR); |
|
| 487 | + spip_log('queue_close_job car _JQ_PENDING depuis +180s : '.print_r($row, 1), 'job_mort'._LOG_ERREUR); |
|
| 489 | 488 | } |
| 490 | 489 | } |
| 491 | 490 | |
| 492 | 491 | // chercher la date du prochain job si pas connu |
| 493 | 492 | if (is_null($next) or is_null(queue_sleep_time_to_next_job())) { |
| 494 | - $date = sql_getfetsel('date', 'spip_jobs', 'status=' . intval(_JQ_SCHEDULED), '', 'date', '0,1'); |
|
| 493 | + $date = sql_getfetsel('date', 'spip_jobs', 'status='.intval(_JQ_SCHEDULED), '', 'date', '0,1'); |
|
| 495 | 494 | $next = strtotime($date); |
| 496 | 495 | } |
| 497 | 496 | if (!is_null($next_time)) { |
@@ -504,7 +503,7 @@ discard block |
||
| 504 | 503 | if (is_null($nb_jobs_scheduled)) { |
| 505 | 504 | $nb_jobs_scheduled = sql_countsel( |
| 506 | 505 | 'spip_jobs', |
| 507 | - 'status=' . intval(_JQ_SCHEDULED) . ' AND date<' . sql_quote(date('Y-m-d H:i:s', $time)) |
|
| 506 | + 'status='.intval(_JQ_SCHEDULED).' AND date<'.sql_quote(date('Y-m-d H:i:s', $time)) |
|
| 508 | 507 | ); |
| 509 | 508 | } elseif ($next <= $time) { |
| 510 | 509 | $nb_jobs_scheduled++; |
@@ -573,7 +572,7 @@ discard block |
||
| 573 | 572 | } |
| 574 | 573 | |
| 575 | 574 | // ne pas relancer si on vient de lancer dans la meme seconde par un hit concurent |
| 576 | - if (file_exists($lock = _DIR_TMP . 'cron.lock') and !(@filemtime($lock) < $_SERVER['REQUEST_TIME'])) { |
|
| 575 | + if (file_exists($lock = _DIR_TMP.'cron.lock') and !(@filemtime($lock) < $_SERVER['REQUEST_TIME'])) { |
|
| 577 | 576 | return $texte; |
| 578 | 577 | } |
| 579 | 578 | |
@@ -645,7 +644,7 @@ discard block |
||
| 645 | 644 | $port = 80; |
| 646 | 645 | } |
| 647 | 646 | $fp = @fsockopen( |
| 648 | - $scheme . $parts['host'], |
|
| 647 | + $scheme.$parts['host'], |
|
| 649 | 648 | $parts['port'] ?? $port, |
| 650 | 649 | $errno, |
| 651 | 650 | $errstr, |
@@ -655,13 +654,13 @@ discard block |
||
| 655 | 654 | if ($fp) { |
| 656 | 655 | $host_sent = $parts['host']; |
| 657 | 656 | if (isset($parts['port']) and $parts['port'] !== $port) { |
| 658 | - $host_sent .= ':' . $parts['port']; |
|
| 657 | + $host_sent .= ':'.$parts['port']; |
|
| 659 | 658 | } |
| 660 | 659 | $timeout = 200; // ms |
| 661 | 660 | stream_set_timeout($fp, 0, $timeout * 1000); |
| 662 | - $query = $parts['path'] . ($parts['query'] ? '?' . $parts['query'] : ''); |
|
| 663 | - $out = 'GET ' . $query . " HTTP/1.1\r\n"; |
|
| 664 | - $out .= 'Host: ' . $host_sent . "\r\n"; |
|
| 661 | + $query = $parts['path'].($parts['query'] ? '?'.$parts['query'] : ''); |
|
| 662 | + $out = 'GET '.$query." HTTP/1.1\r\n"; |
|
| 663 | + $out .= 'Host: '.$host_sent."\r\n"; |
|
| 665 | 664 | $out .= "Connection: Close\r\n\r\n"; |
| 666 | 665 | fwrite($fp, $out); |
| 667 | 666 | spip_timer('read'); |
@@ -39,8 +39,7 @@ |
||
| 39 | 39 | } else { |
| 40 | 40 | $tls = true; |
| 41 | 41 | } |
| 42 | - } |
|
| 43 | - else { |
|
| 42 | + } else { |
|
| 44 | 43 | $tls_ldap == 'non'; |
| 45 | 44 | } |
| 46 | 45 | |
@@ -10,88 +10,88 @@ |
||
| 10 | 10 | \***************************************************************************/ |
| 11 | 11 | |
| 12 | 12 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 13 | - return; |
|
| 13 | + return; |
|
| 14 | 14 | } |
| 15 | 15 | |
| 16 | 16 | function install_etape_ldap2_dist() { |
| 17 | - $minipage = new Spip\Afficher\Minipage\Installation(); |
|
| 18 | - echo $minipage->installDebutPage(['onload' => 'document.getElementById(\'suivant\').focus();return false;']); |
|
| 19 | - |
|
| 20 | - $adresse_ldap = _request('adresse_ldap'); |
|
| 21 | - |
|
| 22 | - $port_ldap = _request('port_ldap'); |
|
| 23 | - |
|
| 24 | - $tls_ldap = _request('tls_ldap'); |
|
| 25 | - |
|
| 26 | - $protocole_ldap = _request('protocole_ldap'); |
|
| 27 | - |
|
| 28 | - $login_ldap = _request('login_ldap'); |
|
| 29 | - |
|
| 30 | - $pass_ldap = _request('pass_ldap'); |
|
| 31 | - |
|
| 32 | - $port_ldap = (int) $port_ldap; |
|
| 33 | - |
|
| 34 | - $tls = false; |
|
| 35 | - |
|
| 36 | - if ($tls_ldap == 'oui') { |
|
| 37 | - if ($port_ldap == 636) { |
|
| 38 | - $adresse_ldap = "ldaps://$adresse_ldap"; |
|
| 39 | - } else { |
|
| 40 | - $tls = true; |
|
| 41 | - } |
|
| 42 | - } |
|
| 43 | - else { |
|
| 44 | - $tls_ldap == 'non'; |
|
| 45 | - } |
|
| 46 | - |
|
| 47 | - // Verifions que l'adresse demandee est valide |
|
| 48 | - $adresse_ldap = filter_var($adresse_ldap, FILTER_SANITIZE_URL) ?: ''; |
|
| 49 | - |
|
| 50 | - $ldap_link = ldap_connect($adresse_ldap, $port_ldap); |
|
| 51 | - $erreur = 'ldap_connect(' . spip_htmlspecialchars($adresse_ldap) . ', ' . spip_htmlspecialchars($port_ldap) . ')'; |
|
| 52 | - |
|
| 53 | - if ($ldap_link) { |
|
| 54 | - if (!ldap_set_option($ldap_link, LDAP_OPT_PROTOCOL_VERSION, $protocole_ldap)) { |
|
| 55 | - $protocole_ldap = 2; |
|
| 56 | - ldap_set_option($ldap_link, LDAP_OPT_PROTOCOL_VERSION, $protocole_ldap); |
|
| 57 | - } |
|
| 58 | - if ($tls && !ldap_start_tls($ldap_link)) { |
|
| 59 | - $erreur = 'ldap_start_tls(' . spip_htmlspecialchars($ldap_link) |
|
| 60 | - . ' ' . spip_htmlspecialchars($adresse_ldap) |
|
| 61 | - . ', ' . spip_htmlspecialchars($port_ldap) . ')'; |
|
| 62 | - $ldap_link = false; |
|
| 63 | - } |
|
| 64 | - if ($ldap_link) { |
|
| 65 | - $ldap_link = ldap_bind($ldap_link, $login_ldap, $pass_ldap); |
|
| 66 | - $erreur = "ldap_bind('" . spip_htmlspecialchars($ldap_link) |
|
| 67 | - . "', '" . spip_htmlspecialchars($login_ldap) |
|
| 68 | - . "', '" . spip_htmlspecialchars($pass_ldap) |
|
| 69 | - . "'): " . spip_htmlspecialchars($adresse_ldap) |
|
| 70 | - . ', ' . spip_htmlspecialchars($port_ldap); |
|
| 71 | - } |
|
| 72 | - } |
|
| 73 | - |
|
| 74 | - if ($ldap_link) { |
|
| 75 | - echo info_etape( |
|
| 76 | - _T('titre_connexion_ldap'), |
|
| 77 | - info_progression_etape(2, 'etape_ldap', 'install/') |
|
| 78 | - ), _T('info_connexion_ldap_ok'); |
|
| 79 | - echo generer_form_ecrire('install', ( |
|
| 80 | - "\n<input type='hidden' name='etape' value='ldap3' />" |
|
| 81 | - . "\n<input type='hidden' name='adresse_ldap' value=\"" . spip_htmlspecialchars($adresse_ldap) . '" />' |
|
| 82 | - . "\n<input type='hidden' name='port_ldap' value=\"" . spip_htmlspecialchars($port_ldap) . '" />' |
|
| 83 | - . "\n<input type='hidden' name='login_ldap' value=\"" . spip_htmlspecialchars($login_ldap) . '" />' |
|
| 84 | - . "\n<input type='hidden' name='pass_ldap' value=\"" . spip_htmlspecialchars($pass_ldap) . '" />' |
|
| 85 | - . "\n<input type='hidden' name='protocole_ldap' value=\"" . spip_htmlspecialchars($protocole_ldap) . '" />' |
|
| 86 | - . "\n<input type='hidden' name='tls_ldap' value=\"" . spip_htmlspecialchars($tls_ldap) . '" />' |
|
| 87 | - . bouton_suivant())); |
|
| 88 | - } else { |
|
| 89 | - echo info_etape(_T('titre_connexion_ldap')), info_progression_etape(1, 'etape_ldap', 'install/', true), |
|
| 90 | - "<div class='error'><p>" . _T('avis_connexion_ldap_echec_1') . '</p>', |
|
| 91 | - '<p>' . _T('avis_connexion_ldap_echec_2') . |
|
| 92 | - "<br />\n" . _T('avis_connexion_ldap_echec_3') . |
|
| 93 | - '<br /><br />' . $erreur . '<b> ?</b></p></div>'; |
|
| 94 | - } |
|
| 95 | - |
|
| 96 | - echo $minipage->installFinPage(); |
|
| 17 | + $minipage = new Spip\Afficher\Minipage\Installation(); |
|
| 18 | + echo $minipage->installDebutPage(['onload' => 'document.getElementById(\'suivant\').focus();return false;']); |
|
| 19 | + |
|
| 20 | + $adresse_ldap = _request('adresse_ldap'); |
|
| 21 | + |
|
| 22 | + $port_ldap = _request('port_ldap'); |
|
| 23 | + |
|
| 24 | + $tls_ldap = _request('tls_ldap'); |
|
| 25 | + |
|
| 26 | + $protocole_ldap = _request('protocole_ldap'); |
|
| 27 | + |
|
| 28 | + $login_ldap = _request('login_ldap'); |
|
| 29 | + |
|
| 30 | + $pass_ldap = _request('pass_ldap'); |
|
| 31 | + |
|
| 32 | + $port_ldap = (int) $port_ldap; |
|
| 33 | + |
|
| 34 | + $tls = false; |
|
| 35 | + |
|
| 36 | + if ($tls_ldap == 'oui') { |
|
| 37 | + if ($port_ldap == 636) { |
|
| 38 | + $adresse_ldap = "ldaps://$adresse_ldap"; |
|
| 39 | + } else { |
|
| 40 | + $tls = true; |
|
| 41 | + } |
|
| 42 | + } |
|
| 43 | + else { |
|
| 44 | + $tls_ldap == 'non'; |
|
| 45 | + } |
|
| 46 | + |
|
| 47 | + // Verifions que l'adresse demandee est valide |
|
| 48 | + $adresse_ldap = filter_var($adresse_ldap, FILTER_SANITIZE_URL) ?: ''; |
|
| 49 | + |
|
| 50 | + $ldap_link = ldap_connect($adresse_ldap, $port_ldap); |
|
| 51 | + $erreur = 'ldap_connect(' . spip_htmlspecialchars($adresse_ldap) . ', ' . spip_htmlspecialchars($port_ldap) . ')'; |
|
| 52 | + |
|
| 53 | + if ($ldap_link) { |
|
| 54 | + if (!ldap_set_option($ldap_link, LDAP_OPT_PROTOCOL_VERSION, $protocole_ldap)) { |
|
| 55 | + $protocole_ldap = 2; |
|
| 56 | + ldap_set_option($ldap_link, LDAP_OPT_PROTOCOL_VERSION, $protocole_ldap); |
|
| 57 | + } |
|
| 58 | + if ($tls && !ldap_start_tls($ldap_link)) { |
|
| 59 | + $erreur = 'ldap_start_tls(' . spip_htmlspecialchars($ldap_link) |
|
| 60 | + . ' ' . spip_htmlspecialchars($adresse_ldap) |
|
| 61 | + . ', ' . spip_htmlspecialchars($port_ldap) . ')'; |
|
| 62 | + $ldap_link = false; |
|
| 63 | + } |
|
| 64 | + if ($ldap_link) { |
|
| 65 | + $ldap_link = ldap_bind($ldap_link, $login_ldap, $pass_ldap); |
|
| 66 | + $erreur = "ldap_bind('" . spip_htmlspecialchars($ldap_link) |
|
| 67 | + . "', '" . spip_htmlspecialchars($login_ldap) |
|
| 68 | + . "', '" . spip_htmlspecialchars($pass_ldap) |
|
| 69 | + . "'): " . spip_htmlspecialchars($adresse_ldap) |
|
| 70 | + . ', ' . spip_htmlspecialchars($port_ldap); |
|
| 71 | + } |
|
| 72 | + } |
|
| 73 | + |
|
| 74 | + if ($ldap_link) { |
|
| 75 | + echo info_etape( |
|
| 76 | + _T('titre_connexion_ldap'), |
|
| 77 | + info_progression_etape(2, 'etape_ldap', 'install/') |
|
| 78 | + ), _T('info_connexion_ldap_ok'); |
|
| 79 | + echo generer_form_ecrire('install', ( |
|
| 80 | + "\n<input type='hidden' name='etape' value='ldap3' />" |
|
| 81 | + . "\n<input type='hidden' name='adresse_ldap' value=\"" . spip_htmlspecialchars($adresse_ldap) . '" />' |
|
| 82 | + . "\n<input type='hidden' name='port_ldap' value=\"" . spip_htmlspecialchars($port_ldap) . '" />' |
|
| 83 | + . "\n<input type='hidden' name='login_ldap' value=\"" . spip_htmlspecialchars($login_ldap) . '" />' |
|
| 84 | + . "\n<input type='hidden' name='pass_ldap' value=\"" . spip_htmlspecialchars($pass_ldap) . '" />' |
|
| 85 | + . "\n<input type='hidden' name='protocole_ldap' value=\"" . spip_htmlspecialchars($protocole_ldap) . '" />' |
|
| 86 | + . "\n<input type='hidden' name='tls_ldap' value=\"" . spip_htmlspecialchars($tls_ldap) . '" />' |
|
| 87 | + . bouton_suivant())); |
|
| 88 | + } else { |
|
| 89 | + echo info_etape(_T('titre_connexion_ldap')), info_progression_etape(1, 'etape_ldap', 'install/', true), |
|
| 90 | + "<div class='error'><p>" . _T('avis_connexion_ldap_echec_1') . '</p>', |
|
| 91 | + '<p>' . _T('avis_connexion_ldap_echec_2') . |
|
| 92 | + "<br />\n" . _T('avis_connexion_ldap_echec_3') . |
|
| 93 | + '<br /><br />' . $erreur . '<b> ?</b></p></div>'; |
|
| 94 | + } |
|
| 95 | + |
|
| 96 | + echo $minipage->installFinPage(); |
|
| 97 | 97 | } |
@@ -48,7 +48,7 @@ discard block |
||
| 48 | 48 | $adresse_ldap = filter_var($adresse_ldap, FILTER_SANITIZE_URL) ?: ''; |
| 49 | 49 | |
| 50 | 50 | $ldap_link = ldap_connect($adresse_ldap, $port_ldap); |
| 51 | - $erreur = 'ldap_connect(' . spip_htmlspecialchars($adresse_ldap) . ', ' . spip_htmlspecialchars($port_ldap) . ')'; |
|
| 51 | + $erreur = 'ldap_connect('.spip_htmlspecialchars($adresse_ldap).', '.spip_htmlspecialchars($port_ldap).')'; |
|
| 52 | 52 | |
| 53 | 53 | if ($ldap_link) { |
| 54 | 54 | if (!ldap_set_option($ldap_link, LDAP_OPT_PROTOCOL_VERSION, $protocole_ldap)) { |
@@ -56,18 +56,18 @@ discard block |
||
| 56 | 56 | ldap_set_option($ldap_link, LDAP_OPT_PROTOCOL_VERSION, $protocole_ldap); |
| 57 | 57 | } |
| 58 | 58 | if ($tls && !ldap_start_tls($ldap_link)) { |
| 59 | - $erreur = 'ldap_start_tls(' . spip_htmlspecialchars($ldap_link) |
|
| 60 | - . ' ' . spip_htmlspecialchars($adresse_ldap) |
|
| 61 | - . ', ' . spip_htmlspecialchars($port_ldap) . ')'; |
|
| 59 | + $erreur = 'ldap_start_tls('.spip_htmlspecialchars($ldap_link) |
|
| 60 | + . ' '.spip_htmlspecialchars($adresse_ldap) |
|
| 61 | + . ', '.spip_htmlspecialchars($port_ldap).')'; |
|
| 62 | 62 | $ldap_link = false; |
| 63 | 63 | } |
| 64 | 64 | if ($ldap_link) { |
| 65 | 65 | $ldap_link = ldap_bind($ldap_link, $login_ldap, $pass_ldap); |
| 66 | - $erreur = "ldap_bind('" . spip_htmlspecialchars($ldap_link) |
|
| 67 | - . "', '" . spip_htmlspecialchars($login_ldap) |
|
| 68 | - . "', '" . spip_htmlspecialchars($pass_ldap) |
|
| 69 | - . "'): " . spip_htmlspecialchars($adresse_ldap) |
|
| 70 | - . ', ' . spip_htmlspecialchars($port_ldap); |
|
| 66 | + $erreur = "ldap_bind('".spip_htmlspecialchars($ldap_link) |
|
| 67 | + . "', '".spip_htmlspecialchars($login_ldap) |
|
| 68 | + . "', '".spip_htmlspecialchars($pass_ldap) |
|
| 69 | + . "'): ".spip_htmlspecialchars($adresse_ldap) |
|
| 70 | + . ', '.spip_htmlspecialchars($port_ldap); |
|
| 71 | 71 | } |
| 72 | 72 | } |
| 73 | 73 | |
@@ -75,22 +75,22 @@ discard block |
||
| 75 | 75 | echo info_etape( |
| 76 | 76 | _T('titre_connexion_ldap'), |
| 77 | 77 | info_progression_etape(2, 'etape_ldap', 'install/') |
| 78 | - ), _T('info_connexion_ldap_ok'); |
|
| 78 | + ), _T('info_connexion_ldap_ok'); |
|
| 79 | 79 | echo generer_form_ecrire('install', ( |
| 80 | 80 | "\n<input type='hidden' name='etape' value='ldap3' />" |
| 81 | - . "\n<input type='hidden' name='adresse_ldap' value=\"" . spip_htmlspecialchars($adresse_ldap) . '" />' |
|
| 82 | - . "\n<input type='hidden' name='port_ldap' value=\"" . spip_htmlspecialchars($port_ldap) . '" />' |
|
| 83 | - . "\n<input type='hidden' name='login_ldap' value=\"" . spip_htmlspecialchars($login_ldap) . '" />' |
|
| 84 | - . "\n<input type='hidden' name='pass_ldap' value=\"" . spip_htmlspecialchars($pass_ldap) . '" />' |
|
| 85 | - . "\n<input type='hidden' name='protocole_ldap' value=\"" . spip_htmlspecialchars($protocole_ldap) . '" />' |
|
| 86 | - . "\n<input type='hidden' name='tls_ldap' value=\"" . spip_htmlspecialchars($tls_ldap) . '" />' |
|
| 81 | + . "\n<input type='hidden' name='adresse_ldap' value=\"".spip_htmlspecialchars($adresse_ldap).'" />' |
|
| 82 | + . "\n<input type='hidden' name='port_ldap' value=\"".spip_htmlspecialchars($port_ldap).'" />' |
|
| 83 | + . "\n<input type='hidden' name='login_ldap' value=\"".spip_htmlspecialchars($login_ldap).'" />' |
|
| 84 | + . "\n<input type='hidden' name='pass_ldap' value=\"".spip_htmlspecialchars($pass_ldap).'" />' |
|
| 85 | + . "\n<input type='hidden' name='protocole_ldap' value=\"".spip_htmlspecialchars($protocole_ldap).'" />' |
|
| 86 | + . "\n<input type='hidden' name='tls_ldap' value=\"".spip_htmlspecialchars($tls_ldap).'" />' |
|
| 87 | 87 | . bouton_suivant())); |
| 88 | 88 | } else { |
| 89 | 89 | echo info_etape(_T('titre_connexion_ldap')), info_progression_etape(1, 'etape_ldap', 'install/', true), |
| 90 | - "<div class='error'><p>" . _T('avis_connexion_ldap_echec_1') . '</p>', |
|
| 91 | - '<p>' . _T('avis_connexion_ldap_echec_2') . |
|
| 92 | - "<br />\n" . _T('avis_connexion_ldap_echec_3') . |
|
| 93 | - '<br /><br />' . $erreur . '<b> ?</b></p></div>'; |
|
| 90 | + "<div class='error'><p>"._T('avis_connexion_ldap_echec_1').'</p>', |
|
| 91 | + '<p>'._T('avis_connexion_ldap_echec_2'). |
|
| 92 | + "<br />\n"._T('avis_connexion_ldap_echec_3'). |
|
| 93 | + '<br /><br />'.$erreur.'<b> ?</b></p></div>'; |
|
| 94 | 94 | } |
| 95 | 95 | |
| 96 | 96 | echo $minipage->installFinPage(); |
@@ -121,8 +121,7 @@ discard block |
||
| 121 | 121 | if (!$res or (!$res['length'] and $res['status'] != 304)) { |
| 122 | 122 | spip_log("copie_locale : Echec recuperation $source sur $localrac_tmp status : " . ($res ? $res['status'] : '-'), 'distant' . _LOG_INFO_IMPORTANTE); |
| 123 | 123 | @unlink($localrac_tmp); |
| 124 | - } |
|
| 125 | - else { |
|
| 124 | + } else { |
|
| 126 | 125 | spip_log("copie_locale : recuperation $source sur $localrac_tmp OK | taille " . $res['length'] . ' status ' . $res['status'], 'distant'); |
| 127 | 126 | } |
| 128 | 127 | if (!$res or !$res['length']) { |
@@ -240,8 +239,7 @@ discard block |
||
| 240 | 239 | break; |
| 241 | 240 | } |
| 242 | 241 | } |
| 243 | - } |
|
| 244 | - else { |
|
| 242 | + } else { |
|
| 245 | 243 | $ip = false; |
| 246 | 244 | } |
| 247 | 245 | } |
@@ -17,32 +17,32 @@ discard block |
||
| 17 | 17 | * @package SPIP\Core\Distant |
| 18 | 18 | **/ |
| 19 | 19 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 20 | - return; |
|
| 20 | + return; |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | if (!defined('_INC_DISTANT_VERSION_HTTP')) { |
| 24 | - define('_INC_DISTANT_VERSION_HTTP', 'HTTP/1.0'); |
|
| 24 | + define('_INC_DISTANT_VERSION_HTTP', 'HTTP/1.0'); |
|
| 25 | 25 | } |
| 26 | 26 | if (!defined('_INC_DISTANT_CONTENT_ENCODING')) { |
| 27 | - define('_INC_DISTANT_CONTENT_ENCODING', 'gzip'); |
|
| 27 | + define('_INC_DISTANT_CONTENT_ENCODING', 'gzip'); |
|
| 28 | 28 | } |
| 29 | 29 | if (!defined('_INC_DISTANT_USER_AGENT')) { |
| 30 | - define('_INC_DISTANT_USER_AGENT', 'SPIP-' . $GLOBALS['spip_version_affichee'] . ' (' . $GLOBALS['home_server'] . ')'); |
|
| 30 | + define('_INC_DISTANT_USER_AGENT', 'SPIP-' . $GLOBALS['spip_version_affichee'] . ' (' . $GLOBALS['home_server'] . ')'); |
|
| 31 | 31 | } |
| 32 | 32 | if (!defined('_INC_DISTANT_MAX_SIZE')) { |
| 33 | - define('_INC_DISTANT_MAX_SIZE', 2_097_152); |
|
| 33 | + define('_INC_DISTANT_MAX_SIZE', 2_097_152); |
|
| 34 | 34 | } |
| 35 | 35 | if (!defined('_INC_DISTANT_CONNECT_TIMEOUT')) { |
| 36 | - define('_INC_DISTANT_CONNECT_TIMEOUT', 10); |
|
| 36 | + define('_INC_DISTANT_CONNECT_TIMEOUT', 10); |
|
| 37 | 37 | } |
| 38 | 38 | |
| 39 | 39 | define('_REGEXP_COPIE_LOCALE', ',' . |
| 40 | - preg_replace( |
|
| 41 | - '@^https?:@', |
|
| 42 | - 'https?:', |
|
| 43 | - ($GLOBALS['meta']['adresse_site'] ?? '') |
|
| 44 | - ) |
|
| 45 | - . '/?spip.php[?]action=acceder_document.*file=(.*)$,'); |
|
| 40 | + preg_replace( |
|
| 41 | + '@^https?:@', |
|
| 42 | + 'https?:', |
|
| 43 | + ($GLOBALS['meta']['adresse_site'] ?? '') |
|
| 44 | + ) |
|
| 45 | + . '/?spip.php[?]action=acceder_document.*file=(.*)$,'); |
|
| 46 | 46 | |
| 47 | 47 | //@define('_COPIE_LOCALE_MAX_SIZE',2097152); // poids (inc/utils l'a fait) |
| 48 | 48 | |
@@ -71,107 +71,107 @@ discard block |
||
| 71 | 71 | */ |
| 72 | 72 | function copie_locale($source, $mode = 'auto', $local = null, $taille_max = null, $callback_valider_url = null) { |
| 73 | 73 | |
| 74 | - // si c'est la protection de soi-meme, retourner le path |
|
| 75 | - if ($mode !== 'force' and preg_match(_REGEXP_COPIE_LOCALE, $source, $match)) { |
|
| 76 | - $source = substr(_DIR_IMG, strlen(_DIR_RACINE)) . urldecode($match[1]); |
|
| 77 | - |
|
| 78 | - return @file_exists($source) ? $source : false; |
|
| 79 | - } |
|
| 80 | - |
|
| 81 | - if (is_null($local)) { |
|
| 82 | - $local = fichier_copie_locale($source); |
|
| 83 | - } else { |
|
| 84 | - if (_DIR_RACINE and strncmp(_DIR_RACINE, $local, strlen(_DIR_RACINE)) == 0) { |
|
| 85 | - $local = substr($local, strlen(_DIR_RACINE)); |
|
| 86 | - } |
|
| 87 | - } |
|
| 88 | - |
|
| 89 | - // si $local = '' c'est un fichier refuse par fichier_copie_locale(), |
|
| 90 | - // par exemple un fichier qui ne figure pas dans nos documents ; |
|
| 91 | - // dans ce cas on n'essaie pas de le telecharger pour ensuite echouer |
|
| 92 | - if (!$local) { |
|
| 93 | - return false; |
|
| 94 | - } |
|
| 95 | - |
|
| 96 | - $localrac = _DIR_RACINE . $local; |
|
| 97 | - $t = ($mode === 'force') ? false : @file_exists($localrac); |
|
| 98 | - |
|
| 99 | - // test d'existence du fichier |
|
| 100 | - if ($mode === 'test') { |
|
| 101 | - return $t ? $local : ''; |
|
| 102 | - } |
|
| 103 | - |
|
| 104 | - // sinon voir si on doit/peut le telecharger |
|
| 105 | - if ($local === $source or !tester_url_absolue($source)) { |
|
| 106 | - return $t ? $local : ''; |
|
| 107 | - } |
|
| 108 | - |
|
| 109 | - if ($mode === 'modif' or !$t) { |
|
| 110 | - // passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation |
|
| 111 | - // et des eventuelles recuperations concurantes |
|
| 112 | - include_spip('inc/acces'); |
|
| 113 | - if (!$taille_max) { |
|
| 114 | - $taille_max = _COPIE_LOCALE_MAX_SIZE; |
|
| 115 | - } |
|
| 116 | - $localrac_tmp = $localrac . '.tmp'; |
|
| 117 | - $res = recuperer_url( |
|
| 118 | - $source, |
|
| 119 | - ['file' => $localrac_tmp, 'taille_max' => $taille_max, 'if_modified_since' => $t ? filemtime($localrac) : ''] |
|
| 120 | - ); |
|
| 121 | - |
|
| 122 | - if (!$res or (!$res['length'] and $res['status'] != 304)) { |
|
| 123 | - spip_log("copie_locale : Echec recuperation $source sur $localrac_tmp status : " . ($res ? $res['status'] : '-'), 'distant' . _LOG_INFO_IMPORTANTE); |
|
| 124 | - @unlink($localrac_tmp); |
|
| 125 | - } |
|
| 126 | - else { |
|
| 127 | - spip_log("copie_locale : recuperation $source sur $localrac_tmp OK | taille " . $res['length'] . ' status ' . $res['status'], 'distant'); |
|
| 128 | - } |
|
| 129 | - if (!$res or !$res['length']) { |
|
| 130 | - // si $t c'est sans doute juste un not-modified-since |
|
| 131 | - return $t ? $local : false; |
|
| 132 | - } |
|
| 133 | - |
|
| 134 | - // si option valider url, verifions que l'URL finale est acceptable |
|
| 135 | - if ( |
|
| 136 | - $callback_valider_url |
|
| 137 | - and is_callable($callback_valider_url) |
|
| 138 | - and !$callback_valider_url($res['url']) |
|
| 139 | - ) { |
|
| 140 | - spip_log('copie_locale : url finale ' . $res['url'] . " non valide, on refuse le fichier $localrac_tmp", 'distant' . _LOG_INFO_IMPORTANTE); |
|
| 141 | - @unlink($localrac_tmp); |
|
| 142 | - return $t ? $local : false; |
|
| 143 | - } |
|
| 144 | - |
|
| 145 | - // on peut renommer le fichier tmp |
|
| 146 | - @rename($localrac_tmp, $localrac); |
|
| 147 | - |
|
| 148 | - // si on retrouve l'extension |
|
| 149 | - if ( |
|
| 150 | - !empty($res['headers']) |
|
| 151 | - and $extension = distant_trouver_extension_selon_headers($source, $res['headers']) |
|
| 152 | - ) { |
|
| 153 | - if ($sanitizer = charger_fonction($extension, 'sanitizer', true)) { |
|
| 154 | - $sanitizer($localrac); |
|
| 155 | - } |
|
| 156 | - } |
|
| 157 | - |
|
| 158 | - // pour une eventuelle indexation |
|
| 159 | - pipeline( |
|
| 160 | - 'post_edition', |
|
| 161 | - [ |
|
| 162 | - 'args' => [ |
|
| 163 | - 'operation' => 'copie_locale', |
|
| 164 | - 'source' => $source, |
|
| 165 | - 'fichier' => $local, |
|
| 166 | - 'http_res' => $res['length'], |
|
| 167 | - 'url' => $res['url'], |
|
| 168 | - ], |
|
| 169 | - 'data' => null |
|
| 170 | - ] |
|
| 171 | - ); |
|
| 172 | - } |
|
| 173 | - |
|
| 174 | - return $local; |
|
| 74 | + // si c'est la protection de soi-meme, retourner le path |
|
| 75 | + if ($mode !== 'force' and preg_match(_REGEXP_COPIE_LOCALE, $source, $match)) { |
|
| 76 | + $source = substr(_DIR_IMG, strlen(_DIR_RACINE)) . urldecode($match[1]); |
|
| 77 | + |
|
| 78 | + return @file_exists($source) ? $source : false; |
|
| 79 | + } |
|
| 80 | + |
|
| 81 | + if (is_null($local)) { |
|
| 82 | + $local = fichier_copie_locale($source); |
|
| 83 | + } else { |
|
| 84 | + if (_DIR_RACINE and strncmp(_DIR_RACINE, $local, strlen(_DIR_RACINE)) == 0) { |
|
| 85 | + $local = substr($local, strlen(_DIR_RACINE)); |
|
| 86 | + } |
|
| 87 | + } |
|
| 88 | + |
|
| 89 | + // si $local = '' c'est un fichier refuse par fichier_copie_locale(), |
|
| 90 | + // par exemple un fichier qui ne figure pas dans nos documents ; |
|
| 91 | + // dans ce cas on n'essaie pas de le telecharger pour ensuite echouer |
|
| 92 | + if (!$local) { |
|
| 93 | + return false; |
|
| 94 | + } |
|
| 95 | + |
|
| 96 | + $localrac = _DIR_RACINE . $local; |
|
| 97 | + $t = ($mode === 'force') ? false : @file_exists($localrac); |
|
| 98 | + |
|
| 99 | + // test d'existence du fichier |
|
| 100 | + if ($mode === 'test') { |
|
| 101 | + return $t ? $local : ''; |
|
| 102 | + } |
|
| 103 | + |
|
| 104 | + // sinon voir si on doit/peut le telecharger |
|
| 105 | + if ($local === $source or !tester_url_absolue($source)) { |
|
| 106 | + return $t ? $local : ''; |
|
| 107 | + } |
|
| 108 | + |
|
| 109 | + if ($mode === 'modif' or !$t) { |
|
| 110 | + // passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation |
|
| 111 | + // et des eventuelles recuperations concurantes |
|
| 112 | + include_spip('inc/acces'); |
|
| 113 | + if (!$taille_max) { |
|
| 114 | + $taille_max = _COPIE_LOCALE_MAX_SIZE; |
|
| 115 | + } |
|
| 116 | + $localrac_tmp = $localrac . '.tmp'; |
|
| 117 | + $res = recuperer_url( |
|
| 118 | + $source, |
|
| 119 | + ['file' => $localrac_tmp, 'taille_max' => $taille_max, 'if_modified_since' => $t ? filemtime($localrac) : ''] |
|
| 120 | + ); |
|
| 121 | + |
|
| 122 | + if (!$res or (!$res['length'] and $res['status'] != 304)) { |
|
| 123 | + spip_log("copie_locale : Echec recuperation $source sur $localrac_tmp status : " . ($res ? $res['status'] : '-'), 'distant' . _LOG_INFO_IMPORTANTE); |
|
| 124 | + @unlink($localrac_tmp); |
|
| 125 | + } |
|
| 126 | + else { |
|
| 127 | + spip_log("copie_locale : recuperation $source sur $localrac_tmp OK | taille " . $res['length'] . ' status ' . $res['status'], 'distant'); |
|
| 128 | + } |
|
| 129 | + if (!$res or !$res['length']) { |
|
| 130 | + // si $t c'est sans doute juste un not-modified-since |
|
| 131 | + return $t ? $local : false; |
|
| 132 | + } |
|
| 133 | + |
|
| 134 | + // si option valider url, verifions que l'URL finale est acceptable |
|
| 135 | + if ( |
|
| 136 | + $callback_valider_url |
|
| 137 | + and is_callable($callback_valider_url) |
|
| 138 | + and !$callback_valider_url($res['url']) |
|
| 139 | + ) { |
|
| 140 | + spip_log('copie_locale : url finale ' . $res['url'] . " non valide, on refuse le fichier $localrac_tmp", 'distant' . _LOG_INFO_IMPORTANTE); |
|
| 141 | + @unlink($localrac_tmp); |
|
| 142 | + return $t ? $local : false; |
|
| 143 | + } |
|
| 144 | + |
|
| 145 | + // on peut renommer le fichier tmp |
|
| 146 | + @rename($localrac_tmp, $localrac); |
|
| 147 | + |
|
| 148 | + // si on retrouve l'extension |
|
| 149 | + if ( |
|
| 150 | + !empty($res['headers']) |
|
| 151 | + and $extension = distant_trouver_extension_selon_headers($source, $res['headers']) |
|
| 152 | + ) { |
|
| 153 | + if ($sanitizer = charger_fonction($extension, 'sanitizer', true)) { |
|
| 154 | + $sanitizer($localrac); |
|
| 155 | + } |
|
| 156 | + } |
|
| 157 | + |
|
| 158 | + // pour une eventuelle indexation |
|
| 159 | + pipeline( |
|
| 160 | + 'post_edition', |
|
| 161 | + [ |
|
| 162 | + 'args' => [ |
|
| 163 | + 'operation' => 'copie_locale', |
|
| 164 | + 'source' => $source, |
|
| 165 | + 'fichier' => $local, |
|
| 166 | + 'http_res' => $res['length'], |
|
| 167 | + 'url' => $res['url'], |
|
| 168 | + ], |
|
| 169 | + 'data' => null |
|
| 170 | + ] |
|
| 171 | + ); |
|
| 172 | + } |
|
| 173 | + |
|
| 174 | + return $local; |
|
| 175 | 175 | } |
| 176 | 176 | |
| 177 | 177 | /** |
@@ -186,99 +186,99 @@ discard block |
||
| 186 | 186 | * url ou false en cas d'echec |
| 187 | 187 | */ |
| 188 | 188 | function valider_url_distante($url, $known_hosts = []) { |
| 189 | - if (!function_exists('protocole_verifier')) { |
|
| 190 | - include_spip('inc/filtres_mini'); |
|
| 191 | - } |
|
| 192 | - |
|
| 193 | - if (!protocole_verifier($url, ['http', 'https'])) { |
|
| 194 | - return false; |
|
| 195 | - } |
|
| 196 | - |
|
| 197 | - $parsed_url = parse_url($url); |
|
| 198 | - if (!$parsed_url or empty($parsed_url['host'])) { |
|
| 199 | - return false; |
|
| 200 | - } |
|
| 201 | - |
|
| 202 | - if (isset($parsed_url['user']) or isset($parsed_url['pass'])) { |
|
| 203 | - return false; |
|
| 204 | - } |
|
| 205 | - |
|
| 206 | - if (false !== strpbrk($parsed_url['host'], ':#?[]')) { |
|
| 207 | - return false; |
|
| 208 | - } |
|
| 209 | - |
|
| 210 | - if (!is_array($known_hosts)) { |
|
| 211 | - $known_hosts = [$known_hosts]; |
|
| 212 | - } |
|
| 213 | - $known_hosts[] = $GLOBALS['meta']['adresse_site']; |
|
| 214 | - $known_hosts[] = url_de_base(); |
|
| 215 | - $known_hosts = pipeline('declarer_hosts_distants', $known_hosts); |
|
| 216 | - |
|
| 217 | - $is_known_host = false; |
|
| 218 | - foreach ($known_hosts as $known_host) { |
|
| 219 | - $parse_known = parse_url($known_host); |
|
| 220 | - if ( |
|
| 221 | - $parse_known |
|
| 222 | - and strtolower($parse_known['host']) === strtolower($parsed_url['host']) |
|
| 223 | - ) { |
|
| 224 | - $is_known_host = true; |
|
| 225 | - break; |
|
| 226 | - } |
|
| 227 | - } |
|
| 228 | - |
|
| 229 | - if (!$is_known_host) { |
|
| 230 | - $host = trim($parsed_url['host'], '.'); |
|
| 231 | - if (! $ip = filter_var($host, FILTER_VALIDATE_IP)) { |
|
| 232 | - $ip = gethostbyname($host); |
|
| 233 | - if ($ip === $host) { |
|
| 234 | - // Error condition for gethostbyname() |
|
| 235 | - $ip = false; |
|
| 236 | - } |
|
| 237 | - if ($records = dns_get_record($host)) { |
|
| 238 | - foreach ($records as $record) { |
|
| 239 | - // il faut que le TTL soit suffisant afin d'etre certain que le copie_locale eventuel qui suit |
|
| 240 | - // se fasse sur la meme IP |
|
| 241 | - if ($record['ttl'] < 10) { |
|
| 242 | - $ip = false; |
|
| 243 | - break; |
|
| 244 | - } |
|
| 245 | - } |
|
| 246 | - } |
|
| 247 | - else { |
|
| 248 | - $ip = false; |
|
| 249 | - } |
|
| 250 | - } |
|
| 251 | - if ($ip) { |
|
| 252 | - if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { |
|
| 253 | - return false; |
|
| 254 | - } |
|
| 255 | - } |
|
| 256 | - } |
|
| 257 | - |
|
| 258 | - if (empty($parsed_url['port'])) { |
|
| 259 | - return $url; |
|
| 260 | - } |
|
| 261 | - |
|
| 262 | - $port = $parsed_url['port']; |
|
| 263 | - if ($port === 80 or $port === 443 or $port === 8080) { |
|
| 264 | - return $url; |
|
| 265 | - } |
|
| 266 | - |
|
| 267 | - if ($is_known_host) { |
|
| 268 | - foreach ($known_hosts as $known_host) { |
|
| 269 | - $parse_known = parse_url($known_host); |
|
| 270 | - if ( |
|
| 271 | - $parse_known |
|
| 272 | - and !empty($parse_known['port']) |
|
| 273 | - and strtolower($parse_known['host']) === strtolower($parsed_url['host']) |
|
| 274 | - and $parse_known['port'] == $port |
|
| 275 | - ) { |
|
| 276 | - return $url; |
|
| 277 | - } |
|
| 278 | - } |
|
| 279 | - } |
|
| 280 | - |
|
| 281 | - return false; |
|
| 189 | + if (!function_exists('protocole_verifier')) { |
|
| 190 | + include_spip('inc/filtres_mini'); |
|
| 191 | + } |
|
| 192 | + |
|
| 193 | + if (!protocole_verifier($url, ['http', 'https'])) { |
|
| 194 | + return false; |
|
| 195 | + } |
|
| 196 | + |
|
| 197 | + $parsed_url = parse_url($url); |
|
| 198 | + if (!$parsed_url or empty($parsed_url['host'])) { |
|
| 199 | + return false; |
|
| 200 | + } |
|
| 201 | + |
|
| 202 | + if (isset($parsed_url['user']) or isset($parsed_url['pass'])) { |
|
| 203 | + return false; |
|
| 204 | + } |
|
| 205 | + |
|
| 206 | + if (false !== strpbrk($parsed_url['host'], ':#?[]')) { |
|
| 207 | + return false; |
|
| 208 | + } |
|
| 209 | + |
|
| 210 | + if (!is_array($known_hosts)) { |
|
| 211 | + $known_hosts = [$known_hosts]; |
|
| 212 | + } |
|
| 213 | + $known_hosts[] = $GLOBALS['meta']['adresse_site']; |
|
| 214 | + $known_hosts[] = url_de_base(); |
|
| 215 | + $known_hosts = pipeline('declarer_hosts_distants', $known_hosts); |
|
| 216 | + |
|
| 217 | + $is_known_host = false; |
|
| 218 | + foreach ($known_hosts as $known_host) { |
|
| 219 | + $parse_known = parse_url($known_host); |
|
| 220 | + if ( |
|
| 221 | + $parse_known |
|
| 222 | + and strtolower($parse_known['host']) === strtolower($parsed_url['host']) |
|
| 223 | + ) { |
|
| 224 | + $is_known_host = true; |
|
| 225 | + break; |
|
| 226 | + } |
|
| 227 | + } |
|
| 228 | + |
|
| 229 | + if (!$is_known_host) { |
|
| 230 | + $host = trim($parsed_url['host'], '.'); |
|
| 231 | + if (! $ip = filter_var($host, FILTER_VALIDATE_IP)) { |
|
| 232 | + $ip = gethostbyname($host); |
|
| 233 | + if ($ip === $host) { |
|
| 234 | + // Error condition for gethostbyname() |
|
| 235 | + $ip = false; |
|
| 236 | + } |
|
| 237 | + if ($records = dns_get_record($host)) { |
|
| 238 | + foreach ($records as $record) { |
|
| 239 | + // il faut que le TTL soit suffisant afin d'etre certain que le copie_locale eventuel qui suit |
|
| 240 | + // se fasse sur la meme IP |
|
| 241 | + if ($record['ttl'] < 10) { |
|
| 242 | + $ip = false; |
|
| 243 | + break; |
|
| 244 | + } |
|
| 245 | + } |
|
| 246 | + } |
|
| 247 | + else { |
|
| 248 | + $ip = false; |
|
| 249 | + } |
|
| 250 | + } |
|
| 251 | + if ($ip) { |
|
| 252 | + if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { |
|
| 253 | + return false; |
|
| 254 | + } |
|
| 255 | + } |
|
| 256 | + } |
|
| 257 | + |
|
| 258 | + if (empty($parsed_url['port'])) { |
|
| 259 | + return $url; |
|
| 260 | + } |
|
| 261 | + |
|
| 262 | + $port = $parsed_url['port']; |
|
| 263 | + if ($port === 80 or $port === 443 or $port === 8080) { |
|
| 264 | + return $url; |
|
| 265 | + } |
|
| 266 | + |
|
| 267 | + if ($is_known_host) { |
|
| 268 | + foreach ($known_hosts as $known_host) { |
|
| 269 | + $parse_known = parse_url($known_host); |
|
| 270 | + if ( |
|
| 271 | + $parse_known |
|
| 272 | + and !empty($parse_known['port']) |
|
| 273 | + and strtolower($parse_known['host']) === strtolower($parsed_url['host']) |
|
| 274 | + and $parse_known['port'] == $port |
|
| 275 | + ) { |
|
| 276 | + return $url; |
|
| 277 | + } |
|
| 278 | + } |
|
| 279 | + } |
|
| 280 | + |
|
| 281 | + return false; |
|
| 282 | 282 | } |
| 283 | 283 | |
| 284 | 284 | /** |
@@ -298,86 +298,86 @@ discard block |
||
| 298 | 298 | */ |
| 299 | 299 | function prepare_donnees_post($donnees, $boundary = '') { |
| 300 | 300 | |
| 301 | - // permettre a la fonction qui a demande le post de formater elle meme ses donnees |
|
| 302 | - // pour un appel soap par exemple |
|
| 303 | - // l'entete est separe des donnees par un double retour a la ligne |
|
| 304 | - // on s'occupe ici de passer tous les retours lignes (\r\n, \r ou \n) en \r\n |
|
| 305 | - if (is_string($donnees) && strlen($donnees)) { |
|
| 306 | - $entete = ''; |
|
| 307 | - // on repasse tous les \r\n et \r en simples \n |
|
| 308 | - $donnees = str_replace("\r\n", "\n", $donnees); |
|
| 309 | - $donnees = str_replace("\r", "\n", $donnees); |
|
| 310 | - // un double retour a la ligne signifie la fin de l'entete et le debut des donnees |
|
| 311 | - $p = strpos($donnees, "\n\n"); |
|
| 312 | - if ($p !== false) { |
|
| 313 | - $entete = str_replace("\n", "\r\n", substr($donnees, 0, $p + 1)); |
|
| 314 | - $donnees = substr($donnees, $p + 2); |
|
| 315 | - } |
|
| 316 | - $chaine = str_replace("\n", "\r\n", $donnees); |
|
| 317 | - } else { |
|
| 318 | - /* boundary automatique */ |
|
| 319 | - // Si on a plus de 500 octects de donnees, on "boundarise" |
|
| 320 | - if ($boundary === '') { |
|
| 321 | - $taille = 0; |
|
| 322 | - foreach ($donnees as $cle => $valeur) { |
|
| 323 | - if (is_array($valeur)) { |
|
| 324 | - foreach ($valeur as $val2) { |
|
| 325 | - $taille += strlen($val2); |
|
| 326 | - } |
|
| 327 | - } else { |
|
| 328 | - // faut-il utiliser spip_strlen() dans inc/charsets ? |
|
| 329 | - $taille += strlen($valeur); |
|
| 330 | - } |
|
| 331 | - } |
|
| 332 | - if ($taille > 500) { |
|
| 333 | - $boundary = substr(md5(random_int(0, mt_getrandmax()) . 'spip'), 0, 8); |
|
| 334 | - } |
|
| 335 | - } |
|
| 336 | - |
|
| 337 | - if (is_string($boundary) and strlen($boundary)) { |
|
| 338 | - // fabrique une chaine HTTP pour un POST avec boundary |
|
| 339 | - $entete = "Content-Type: multipart/form-data; boundary=$boundary\r\n"; |
|
| 340 | - $chaine = ''; |
|
| 341 | - if (is_array($donnees)) { |
|
| 342 | - foreach ($donnees as $cle => $valeur) { |
|
| 343 | - if (is_array($valeur)) { |
|
| 344 | - foreach ($valeur as $val2) { |
|
| 345 | - $chaine .= "\r\n--$boundary\r\n"; |
|
| 346 | - $chaine .= "Content-Disposition: form-data; name=\"{$cle}[]\"\r\n"; |
|
| 347 | - $chaine .= "\r\n"; |
|
| 348 | - $chaine .= $val2; |
|
| 349 | - } |
|
| 350 | - } else { |
|
| 351 | - $chaine .= "\r\n--$boundary\r\n"; |
|
| 352 | - $chaine .= "Content-Disposition: form-data; name=\"$cle\"\r\n"; |
|
| 353 | - $chaine .= "\r\n"; |
|
| 354 | - $chaine .= $valeur; |
|
| 355 | - } |
|
| 356 | - } |
|
| 357 | - $chaine .= "\r\n--$boundary\r\n"; |
|
| 358 | - } |
|
| 359 | - } else { |
|
| 360 | - // fabrique une chaine HTTP simple pour un POST |
|
| 361 | - $entete = 'Content-Type: application/x-www-form-urlencoded' . "\r\n"; |
|
| 362 | - $chaine = []; |
|
| 363 | - if (is_array($donnees)) { |
|
| 364 | - foreach ($donnees as $cle => $valeur) { |
|
| 365 | - if (is_array($valeur)) { |
|
| 366 | - foreach ($valeur as $val2) { |
|
| 367 | - $chaine[] = rawurlencode($cle) . '[]=' . rawurlencode($val2); |
|
| 368 | - } |
|
| 369 | - } else { |
|
| 370 | - $chaine[] = rawurlencode($cle) . '=' . rawurlencode($valeur); |
|
| 371 | - } |
|
| 372 | - } |
|
| 373 | - $chaine = implode('&', $chaine); |
|
| 374 | - } else { |
|
| 375 | - $chaine = $donnees; |
|
| 376 | - } |
|
| 377 | - } |
|
| 378 | - } |
|
| 379 | - |
|
| 380 | - return [$entete, $chaine]; |
|
| 301 | + // permettre a la fonction qui a demande le post de formater elle meme ses donnees |
|
| 302 | + // pour un appel soap par exemple |
|
| 303 | + // l'entete est separe des donnees par un double retour a la ligne |
|
| 304 | + // on s'occupe ici de passer tous les retours lignes (\r\n, \r ou \n) en \r\n |
|
| 305 | + if (is_string($donnees) && strlen($donnees)) { |
|
| 306 | + $entete = ''; |
|
| 307 | + // on repasse tous les \r\n et \r en simples \n |
|
| 308 | + $donnees = str_replace("\r\n", "\n", $donnees); |
|
| 309 | + $donnees = str_replace("\r", "\n", $donnees); |
|
| 310 | + // un double retour a la ligne signifie la fin de l'entete et le debut des donnees |
|
| 311 | + $p = strpos($donnees, "\n\n"); |
|
| 312 | + if ($p !== false) { |
|
| 313 | + $entete = str_replace("\n", "\r\n", substr($donnees, 0, $p + 1)); |
|
| 314 | + $donnees = substr($donnees, $p + 2); |
|
| 315 | + } |
|
| 316 | + $chaine = str_replace("\n", "\r\n", $donnees); |
|
| 317 | + } else { |
|
| 318 | + /* boundary automatique */ |
|
| 319 | + // Si on a plus de 500 octects de donnees, on "boundarise" |
|
| 320 | + if ($boundary === '') { |
|
| 321 | + $taille = 0; |
|
| 322 | + foreach ($donnees as $cle => $valeur) { |
|
| 323 | + if (is_array($valeur)) { |
|
| 324 | + foreach ($valeur as $val2) { |
|
| 325 | + $taille += strlen($val2); |
|
| 326 | + } |
|
| 327 | + } else { |
|
| 328 | + // faut-il utiliser spip_strlen() dans inc/charsets ? |
|
| 329 | + $taille += strlen($valeur); |
|
| 330 | + } |
|
| 331 | + } |
|
| 332 | + if ($taille > 500) { |
|
| 333 | + $boundary = substr(md5(random_int(0, mt_getrandmax()) . 'spip'), 0, 8); |
|
| 334 | + } |
|
| 335 | + } |
|
| 336 | + |
|
| 337 | + if (is_string($boundary) and strlen($boundary)) { |
|
| 338 | + // fabrique une chaine HTTP pour un POST avec boundary |
|
| 339 | + $entete = "Content-Type: multipart/form-data; boundary=$boundary\r\n"; |
|
| 340 | + $chaine = ''; |
|
| 341 | + if (is_array($donnees)) { |
|
| 342 | + foreach ($donnees as $cle => $valeur) { |
|
| 343 | + if (is_array($valeur)) { |
|
| 344 | + foreach ($valeur as $val2) { |
|
| 345 | + $chaine .= "\r\n--$boundary\r\n"; |
|
| 346 | + $chaine .= "Content-Disposition: form-data; name=\"{$cle}[]\"\r\n"; |
|
| 347 | + $chaine .= "\r\n"; |
|
| 348 | + $chaine .= $val2; |
|
| 349 | + } |
|
| 350 | + } else { |
|
| 351 | + $chaine .= "\r\n--$boundary\r\n"; |
|
| 352 | + $chaine .= "Content-Disposition: form-data; name=\"$cle\"\r\n"; |
|
| 353 | + $chaine .= "\r\n"; |
|
| 354 | + $chaine .= $valeur; |
|
| 355 | + } |
|
| 356 | + } |
|
| 357 | + $chaine .= "\r\n--$boundary\r\n"; |
|
| 358 | + } |
|
| 359 | + } else { |
|
| 360 | + // fabrique une chaine HTTP simple pour un POST |
|
| 361 | + $entete = 'Content-Type: application/x-www-form-urlencoded' . "\r\n"; |
|
| 362 | + $chaine = []; |
|
| 363 | + if (is_array($donnees)) { |
|
| 364 | + foreach ($donnees as $cle => $valeur) { |
|
| 365 | + if (is_array($valeur)) { |
|
| 366 | + foreach ($valeur as $val2) { |
|
| 367 | + $chaine[] = rawurlencode($cle) . '[]=' . rawurlencode($val2); |
|
| 368 | + } |
|
| 369 | + } else { |
|
| 370 | + $chaine[] = rawurlencode($cle) . '=' . rawurlencode($valeur); |
|
| 371 | + } |
|
| 372 | + } |
|
| 373 | + $chaine = implode('&', $chaine); |
|
| 374 | + } else { |
|
| 375 | + $chaine = $donnees; |
|
| 376 | + } |
|
| 377 | + } |
|
| 378 | + } |
|
| 379 | + |
|
| 380 | + return [$entete, $chaine]; |
|
| 381 | 381 | } |
| 382 | 382 | |
| 383 | 383 | /** |
@@ -388,19 +388,19 @@ discard block |
||
| 388 | 388 | */ |
| 389 | 389 | function url_to_ascii($url_idn) { |
| 390 | 390 | |
| 391 | - if ($parts = parse_url($url_idn)) { |
|
| 392 | - $host = $parts['host']; |
|
| 393 | - if (!preg_match(',^[a-z0-9_\.\-]+$,i', $host)) { |
|
| 394 | - $converter = new ToIdn(); |
|
| 395 | - $host_ascii = $converter->convert($host); |
|
| 396 | - $url_idn = explode($host, $url_idn, 2); |
|
| 397 | - $url_idn = implode($host_ascii, $url_idn); |
|
| 398 | - } |
|
| 399 | - // et on urlencode les char utf si besoin dans le path |
|
| 400 | - $url_idn = preg_replace_callback('/[^\x20-\x7f]/', fn($match) => urlencode($match[0]), $url_idn); |
|
| 401 | - } |
|
| 402 | - |
|
| 403 | - return $url_idn; |
|
| 391 | + if ($parts = parse_url($url_idn)) { |
|
| 392 | + $host = $parts['host']; |
|
| 393 | + if (!preg_match(',^[a-z0-9_\.\-]+$,i', $host)) { |
|
| 394 | + $converter = new ToIdn(); |
|
| 395 | + $host_ascii = $converter->convert($host); |
|
| 396 | + $url_idn = explode($host, $url_idn, 2); |
|
| 397 | + $url_idn = implode($host_ascii, $url_idn); |
|
| 398 | + } |
|
| 399 | + // et on urlencode les char utf si besoin dans le path |
|
| 400 | + $url_idn = preg_replace_callback('/[^\x20-\x7f]/', fn($match) => urlencode($match[0]), $url_idn); |
|
| 401 | + } |
|
| 402 | + |
|
| 403 | + return $url_idn; |
|
| 404 | 404 | } |
| 405 | 405 | |
| 406 | 406 | /** |
@@ -441,209 +441,209 @@ discard block |
||
| 441 | 441 | * string file : nom du fichier si enregistre dans un fichier |
| 442 | 442 | */ |
| 443 | 443 | function recuperer_url($url, $options = []) { |
| 444 | - // Conserve la mémoire de la méthode fournit éventuellement |
|
| 445 | - $methode_demandee = $options['methode'] ?? ''; |
|
| 446 | - $default = [ |
|
| 447 | - 'transcoder' => false, |
|
| 448 | - 'methode' => 'GET', |
|
| 449 | - 'taille_max' => null, |
|
| 450 | - 'headers' => [], |
|
| 451 | - 'datas' => '', |
|
| 452 | - 'boundary' => '', |
|
| 453 | - 'refuser_gz' => false, |
|
| 454 | - 'if_modified_since' => '', |
|
| 455 | - 'uri_referer' => '', |
|
| 456 | - 'file' => '', |
|
| 457 | - 'follow_location' => 10, |
|
| 458 | - 'version_http' => _INC_DISTANT_VERSION_HTTP, |
|
| 459 | - ]; |
|
| 460 | - $options = array_merge($default, $options); |
|
| 461 | - // copier directement dans un fichier ? |
|
| 462 | - $copy = $options['file']; |
|
| 463 | - |
|
| 464 | - if ($options['methode'] == 'HEAD') { |
|
| 465 | - $options['taille_max'] = 0; |
|
| 466 | - } |
|
| 467 | - if (is_null($options['taille_max'])) { |
|
| 468 | - $options['taille_max'] = $copy ? _COPIE_LOCALE_MAX_SIZE : _INC_DISTANT_MAX_SIZE; |
|
| 469 | - } |
|
| 470 | - |
|
| 471 | - spip_log('recuperer_url ' . $options['methode'] . " sur $url", 'distant' . _LOG_DEBUG); |
|
| 472 | - |
|
| 473 | - // Ajout des en-têtes spécifiques si besoin |
|
| 474 | - $formatted_data = ''; |
|
| 475 | - if (!empty($options['headers'])) { |
|
| 476 | - foreach ($options['headers'] as $champ => $valeur) { |
|
| 477 | - $formatted_data .= $champ . ': ' . $valeur . "\r\n"; |
|
| 478 | - } |
|
| 479 | - } |
|
| 480 | - |
|
| 481 | - if (!empty($options['datas'])) { |
|
| 482 | - [$head, $postdata] = prepare_donnees_post($options['datas'], $options['boundary']); |
|
| 483 | - $head .= $formatted_data; |
|
| 484 | - if (stripos($head, 'Content-Length:') === false) { |
|
| 485 | - $head .= 'Content-Length: ' . strlen($postdata) . "\r\n"; |
|
| 486 | - } |
|
| 487 | - $formatted_data = $head . "\r\n" . $postdata; |
|
| 488 | - if ( |
|
| 489 | - strlen($postdata) |
|
| 490 | - and !$methode_demandee |
|
| 491 | - ) { |
|
| 492 | - $options['methode'] = 'POST'; |
|
| 493 | - } |
|
| 494 | - } elseif ($formatted_data) { |
|
| 495 | - $formatted_data .= "\r\n"; |
|
| 496 | - } |
|
| 497 | - |
|
| 498 | - // Accepter les URLs au format feed:// ou qui ont oublie le http:// ou les urls relatives au protocole |
|
| 499 | - $url = preg_replace(',^feed://,i', 'http://', $url); |
|
| 500 | - if (!tester_url_absolue($url)) { |
|
| 501 | - $url = 'http://' . $url; |
|
| 502 | - } elseif (strncmp($url, '//', 2) == 0) { |
|
| 503 | - $url = 'http:' . $url; |
|
| 504 | - } |
|
| 505 | - |
|
| 506 | - $url = url_to_ascii($url); |
|
| 507 | - |
|
| 508 | - $result = [ |
|
| 509 | - 'status' => 0, |
|
| 510 | - 'headers' => '', |
|
| 511 | - 'page' => '', |
|
| 512 | - 'length' => 0, |
|
| 513 | - 'last_modified' => '', |
|
| 514 | - 'location' => '', |
|
| 515 | - 'url' => $url |
|
| 516 | - ]; |
|
| 517 | - |
|
| 518 | - // si on ecrit directement dans un fichier, pour ne pas manipuler en memoire refuser gz |
|
| 519 | - $refuser_gz = (($options['refuser_gz'] or $copy) ? true : false); |
|
| 520 | - |
|
| 521 | - // ouvrir la connexion et envoyer la requete et ses en-tetes |
|
| 522 | - [$handle, $fopen] = init_http( |
|
| 523 | - $options['methode'], |
|
| 524 | - $url, |
|
| 525 | - $refuser_gz, |
|
| 526 | - $options['uri_referer'], |
|
| 527 | - $formatted_data, |
|
| 528 | - $options['version_http'], |
|
| 529 | - $options['if_modified_since'] |
|
| 530 | - ); |
|
| 531 | - if (!$handle) { |
|
| 532 | - spip_log("ECHEC init_http $url", 'distant' . _LOG_ERREUR); |
|
| 533 | - |
|
| 534 | - return false; |
|
| 535 | - } |
|
| 536 | - |
|
| 537 | - // Sauf en fopen, envoyer le flux d'entree |
|
| 538 | - // et recuperer les en-tetes de reponses |
|
| 539 | - if (!$fopen) { |
|
| 540 | - $res = recuperer_entetes_complets($handle, $options['if_modified_since']); |
|
| 541 | - if (!$res) { |
|
| 542 | - fclose($handle); |
|
| 543 | - $t = @parse_url($url); |
|
| 544 | - $host = $t['host']; |
|
| 545 | - // Chinoisierie inexplicable pour contrer |
|
| 546 | - // les actions liberticides de l'empire du milieu |
|
| 547 | - if ( |
|
| 548 | - !need_proxy($host) |
|
| 549 | - and $res = @file_get_contents($url) |
|
| 550 | - ) { |
|
| 551 | - $result['length'] = strlen($res); |
|
| 552 | - if ($copy) { |
|
| 553 | - ecrire_fichier($copy, $res); |
|
| 554 | - $result['file'] = $copy; |
|
| 555 | - } else { |
|
| 556 | - $result['page'] = $res; |
|
| 557 | - } |
|
| 558 | - $res = [ |
|
| 559 | - 'status' => 200, |
|
| 560 | - ]; |
|
| 561 | - } else { |
|
| 562 | - spip_log("ECHEC chinoiserie $url", 'distant' . _LOG_ERREUR); |
|
| 563 | - return false; |
|
| 564 | - } |
|
| 565 | - } elseif ($res['location'] and $options['follow_location']) { |
|
| 566 | - $options['follow_location']--; |
|
| 567 | - fclose($handle); |
|
| 568 | - include_spip('inc/filtres'); |
|
| 569 | - $url = suivre_lien($url, $res['location']); |
|
| 570 | - |
|
| 571 | - // une redirection doit se faire en GET, sauf status explicite 307 ou 308 qui indique de garder la meme methode |
|
| 572 | - if ($options['methode'] !== 'GET') { |
|
| 573 | - if (empty($res['status']) or !in_array($res['status'], [307, 308])) { |
|
| 574 | - $options['methode'] = 'GET'; |
|
| 575 | - $options['datas'] = ''; |
|
| 576 | - } |
|
| 577 | - } |
|
| 578 | - spip_log('recuperer_url recommence ' . $options['methode'] . " sur $url", 'distant' . _LOG_DEBUG); |
|
| 579 | - |
|
| 580 | - return recuperer_url($url, $options); |
|
| 581 | - } elseif ($res['status'] !== 200) { |
|
| 582 | - spip_log('HTTP status ' . $res['status'] . " pour $url", 'distant'); |
|
| 583 | - } |
|
| 584 | - $result['status'] = $res['status']; |
|
| 585 | - if (isset($res['headers'])) { |
|
| 586 | - $result['headers'] = $res['headers']; |
|
| 587 | - } |
|
| 588 | - if (isset($res['last_modified'])) { |
|
| 589 | - $result['last_modified'] = $res['last_modified']; |
|
| 590 | - } |
|
| 591 | - if (isset($res['location'])) { |
|
| 592 | - $result['location'] = $res['location']; |
|
| 593 | - } |
|
| 594 | - } |
|
| 595 | - |
|
| 596 | - // on ne veut que les entetes |
|
| 597 | - if (!$options['taille_max'] or $options['methode'] == 'HEAD' or $result['status'] == '304') { |
|
| 598 | - spip_log('RESULTAT recuperer_url ' . $options['methode'] . " sur $url : " . json_encode($result), 'distant' . _LOG_DEBUG); |
|
| 599 | - return $result; |
|
| 600 | - } |
|
| 601 | - |
|
| 602 | - |
|
| 603 | - // s'il faut deballer, le faire via un fichier temporaire |
|
| 604 | - // sinon la memoire explose pour les gros flux |
|
| 605 | - |
|
| 606 | - $gz = false; |
|
| 607 | - if (preg_match(",\bContent-Encoding: .*gzip,is", $result['headers'])) { |
|
| 608 | - $gz = (_DIR_TMP . md5(uniqid(random_int(0, mt_getrandmax()))) . '.tmp.gz'); |
|
| 609 | - } |
|
| 610 | - |
|
| 611 | - // si on a pas deja recuperer le contenu par une methode detournee |
|
| 612 | - if (!$result['length']) { |
|
| 613 | - $res = recuperer_body($handle, $options['taille_max'], $gz ?: $copy); |
|
| 614 | - fclose($handle); |
|
| 615 | - if ($copy) { |
|
| 616 | - $result['length'] = $res; |
|
| 617 | - $result['file'] = $copy; |
|
| 618 | - } elseif ($res) { |
|
| 619 | - $result['page'] = &$res; |
|
| 620 | - $result['length'] = strlen($result['page']); |
|
| 621 | - } |
|
| 622 | - if (!$result['status']) { |
|
| 623 | - $result['status'] = 200; // on a reussi, donc ! |
|
| 624 | - } |
|
| 625 | - } |
|
| 626 | - if (!$result['page']) { |
|
| 627 | - return $result; |
|
| 628 | - } |
|
| 629 | - |
|
| 630 | - // Decompresser au besoin |
|
| 631 | - if ($gz) { |
|
| 632 | - $result['page'] = implode('', gzfile($gz)); |
|
| 633 | - supprimer_fichier($gz); |
|
| 634 | - } |
|
| 635 | - |
|
| 636 | - // Faut-il l'importer dans notre charset local ? |
|
| 637 | - if ($options['transcoder']) { |
|
| 638 | - include_spip('inc/charsets'); |
|
| 639 | - $result['page'] = transcoder_page($result['page'], $result['headers']); |
|
| 640 | - } |
|
| 641 | - |
|
| 642 | - $trace = json_decode(json_encode($result), true); |
|
| 643 | - $trace['page'] = '...'; |
|
| 644 | - spip_log('RESULTAT recuperer_url ' . $options['methode'] . " sur $url : " . json_encode($trace), 'distant' . _LOG_DEBUG); |
|
| 645 | - |
|
| 646 | - return $result; |
|
| 444 | + // Conserve la mémoire de la méthode fournit éventuellement |
|
| 445 | + $methode_demandee = $options['methode'] ?? ''; |
|
| 446 | + $default = [ |
|
| 447 | + 'transcoder' => false, |
|
| 448 | + 'methode' => 'GET', |
|
| 449 | + 'taille_max' => null, |
|
| 450 | + 'headers' => [], |
|
| 451 | + 'datas' => '', |
|
| 452 | + 'boundary' => '', |
|
| 453 | + 'refuser_gz' => false, |
|
| 454 | + 'if_modified_since' => '', |
|
| 455 | + 'uri_referer' => '', |
|
| 456 | + 'file' => '', |
|
| 457 | + 'follow_location' => 10, |
|
| 458 | + 'version_http' => _INC_DISTANT_VERSION_HTTP, |
|
| 459 | + ]; |
|
| 460 | + $options = array_merge($default, $options); |
|
| 461 | + // copier directement dans un fichier ? |
|
| 462 | + $copy = $options['file']; |
|
| 463 | + |
|
| 464 | + if ($options['methode'] == 'HEAD') { |
|
| 465 | + $options['taille_max'] = 0; |
|
| 466 | + } |
|
| 467 | + if (is_null($options['taille_max'])) { |
|
| 468 | + $options['taille_max'] = $copy ? _COPIE_LOCALE_MAX_SIZE : _INC_DISTANT_MAX_SIZE; |
|
| 469 | + } |
|
| 470 | + |
|
| 471 | + spip_log('recuperer_url ' . $options['methode'] . " sur $url", 'distant' . _LOG_DEBUG); |
|
| 472 | + |
|
| 473 | + // Ajout des en-têtes spécifiques si besoin |
|
| 474 | + $formatted_data = ''; |
|
| 475 | + if (!empty($options['headers'])) { |
|
| 476 | + foreach ($options['headers'] as $champ => $valeur) { |
|
| 477 | + $formatted_data .= $champ . ': ' . $valeur . "\r\n"; |
|
| 478 | + } |
|
| 479 | + } |
|
| 480 | + |
|
| 481 | + if (!empty($options['datas'])) { |
|
| 482 | + [$head, $postdata] = prepare_donnees_post($options['datas'], $options['boundary']); |
|
| 483 | + $head .= $formatted_data; |
|
| 484 | + if (stripos($head, 'Content-Length:') === false) { |
|
| 485 | + $head .= 'Content-Length: ' . strlen($postdata) . "\r\n"; |
|
| 486 | + } |
|
| 487 | + $formatted_data = $head . "\r\n" . $postdata; |
|
| 488 | + if ( |
|
| 489 | + strlen($postdata) |
|
| 490 | + and !$methode_demandee |
|
| 491 | + ) { |
|
| 492 | + $options['methode'] = 'POST'; |
|
| 493 | + } |
|
| 494 | + } elseif ($formatted_data) { |
|
| 495 | + $formatted_data .= "\r\n"; |
|
| 496 | + } |
|
| 497 | + |
|
| 498 | + // Accepter les URLs au format feed:// ou qui ont oublie le http:// ou les urls relatives au protocole |
|
| 499 | + $url = preg_replace(',^feed://,i', 'http://', $url); |
|
| 500 | + if (!tester_url_absolue($url)) { |
|
| 501 | + $url = 'http://' . $url; |
|
| 502 | + } elseif (strncmp($url, '//', 2) == 0) { |
|
| 503 | + $url = 'http:' . $url; |
|
| 504 | + } |
|
| 505 | + |
|
| 506 | + $url = url_to_ascii($url); |
|
| 507 | + |
|
| 508 | + $result = [ |
|
| 509 | + 'status' => 0, |
|
| 510 | + 'headers' => '', |
|
| 511 | + 'page' => '', |
|
| 512 | + 'length' => 0, |
|
| 513 | + 'last_modified' => '', |
|
| 514 | + 'location' => '', |
|
| 515 | + 'url' => $url |
|
| 516 | + ]; |
|
| 517 | + |
|
| 518 | + // si on ecrit directement dans un fichier, pour ne pas manipuler en memoire refuser gz |
|
| 519 | + $refuser_gz = (($options['refuser_gz'] or $copy) ? true : false); |
|
| 520 | + |
|
| 521 | + // ouvrir la connexion et envoyer la requete et ses en-tetes |
|
| 522 | + [$handle, $fopen] = init_http( |
|
| 523 | + $options['methode'], |
|
| 524 | + $url, |
|
| 525 | + $refuser_gz, |
|
| 526 | + $options['uri_referer'], |
|
| 527 | + $formatted_data, |
|
| 528 | + $options['version_http'], |
|
| 529 | + $options['if_modified_since'] |
|
| 530 | + ); |
|
| 531 | + if (!$handle) { |
|
| 532 | + spip_log("ECHEC init_http $url", 'distant' . _LOG_ERREUR); |
|
| 533 | + |
|
| 534 | + return false; |
|
| 535 | + } |
|
| 536 | + |
|
| 537 | + // Sauf en fopen, envoyer le flux d'entree |
|
| 538 | + // et recuperer les en-tetes de reponses |
|
| 539 | + if (!$fopen) { |
|
| 540 | + $res = recuperer_entetes_complets($handle, $options['if_modified_since']); |
|
| 541 | + if (!$res) { |
|
| 542 | + fclose($handle); |
|
| 543 | + $t = @parse_url($url); |
|
| 544 | + $host = $t['host']; |
|
| 545 | + // Chinoisierie inexplicable pour contrer |
|
| 546 | + // les actions liberticides de l'empire du milieu |
|
| 547 | + if ( |
|
| 548 | + !need_proxy($host) |
|
| 549 | + and $res = @file_get_contents($url) |
|
| 550 | + ) { |
|
| 551 | + $result['length'] = strlen($res); |
|
| 552 | + if ($copy) { |
|
| 553 | + ecrire_fichier($copy, $res); |
|
| 554 | + $result['file'] = $copy; |
|
| 555 | + } else { |
|
| 556 | + $result['page'] = $res; |
|
| 557 | + } |
|
| 558 | + $res = [ |
|
| 559 | + 'status' => 200, |
|
| 560 | + ]; |
|
| 561 | + } else { |
|
| 562 | + spip_log("ECHEC chinoiserie $url", 'distant' . _LOG_ERREUR); |
|
| 563 | + return false; |
|
| 564 | + } |
|
| 565 | + } elseif ($res['location'] and $options['follow_location']) { |
|
| 566 | + $options['follow_location']--; |
|
| 567 | + fclose($handle); |
|
| 568 | + include_spip('inc/filtres'); |
|
| 569 | + $url = suivre_lien($url, $res['location']); |
|
| 570 | + |
|
| 571 | + // une redirection doit se faire en GET, sauf status explicite 307 ou 308 qui indique de garder la meme methode |
|
| 572 | + if ($options['methode'] !== 'GET') { |
|
| 573 | + if (empty($res['status']) or !in_array($res['status'], [307, 308])) { |
|
| 574 | + $options['methode'] = 'GET'; |
|
| 575 | + $options['datas'] = ''; |
|
| 576 | + } |
|
| 577 | + } |
|
| 578 | + spip_log('recuperer_url recommence ' . $options['methode'] . " sur $url", 'distant' . _LOG_DEBUG); |
|
| 579 | + |
|
| 580 | + return recuperer_url($url, $options); |
|
| 581 | + } elseif ($res['status'] !== 200) { |
|
| 582 | + spip_log('HTTP status ' . $res['status'] . " pour $url", 'distant'); |
|
| 583 | + } |
|
| 584 | + $result['status'] = $res['status']; |
|
| 585 | + if (isset($res['headers'])) { |
|
| 586 | + $result['headers'] = $res['headers']; |
|
| 587 | + } |
|
| 588 | + if (isset($res['last_modified'])) { |
|
| 589 | + $result['last_modified'] = $res['last_modified']; |
|
| 590 | + } |
|
| 591 | + if (isset($res['location'])) { |
|
| 592 | + $result['location'] = $res['location']; |
|
| 593 | + } |
|
| 594 | + } |
|
| 595 | + |
|
| 596 | + // on ne veut que les entetes |
|
| 597 | + if (!$options['taille_max'] or $options['methode'] == 'HEAD' or $result['status'] == '304') { |
|
| 598 | + spip_log('RESULTAT recuperer_url ' . $options['methode'] . " sur $url : " . json_encode($result), 'distant' . _LOG_DEBUG); |
|
| 599 | + return $result; |
|
| 600 | + } |
|
| 601 | + |
|
| 602 | + |
|
| 603 | + // s'il faut deballer, le faire via un fichier temporaire |
|
| 604 | + // sinon la memoire explose pour les gros flux |
|
| 605 | + |
|
| 606 | + $gz = false; |
|
| 607 | + if (preg_match(",\bContent-Encoding: .*gzip,is", $result['headers'])) { |
|
| 608 | + $gz = (_DIR_TMP . md5(uniqid(random_int(0, mt_getrandmax()))) . '.tmp.gz'); |
|
| 609 | + } |
|
| 610 | + |
|
| 611 | + // si on a pas deja recuperer le contenu par une methode detournee |
|
| 612 | + if (!$result['length']) { |
|
| 613 | + $res = recuperer_body($handle, $options['taille_max'], $gz ?: $copy); |
|
| 614 | + fclose($handle); |
|
| 615 | + if ($copy) { |
|
| 616 | + $result['length'] = $res; |
|
| 617 | + $result['file'] = $copy; |
|
| 618 | + } elseif ($res) { |
|
| 619 | + $result['page'] = &$res; |
|
| 620 | + $result['length'] = strlen($result['page']); |
|
| 621 | + } |
|
| 622 | + if (!$result['status']) { |
|
| 623 | + $result['status'] = 200; // on a reussi, donc ! |
|
| 624 | + } |
|
| 625 | + } |
|
| 626 | + if (!$result['page']) { |
|
| 627 | + return $result; |
|
| 628 | + } |
|
| 629 | + |
|
| 630 | + // Decompresser au besoin |
|
| 631 | + if ($gz) { |
|
| 632 | + $result['page'] = implode('', gzfile($gz)); |
|
| 633 | + supprimer_fichier($gz); |
|
| 634 | + } |
|
| 635 | + |
|
| 636 | + // Faut-il l'importer dans notre charset local ? |
|
| 637 | + if ($options['transcoder']) { |
|
| 638 | + include_spip('inc/charsets'); |
|
| 639 | + $result['page'] = transcoder_page($result['page'], $result['headers']); |
|
| 640 | + } |
|
| 641 | + |
|
| 642 | + $trace = json_decode(json_encode($result), true); |
|
| 643 | + $trace['page'] = '...'; |
|
| 644 | + spip_log('RESULTAT recuperer_url ' . $options['methode'] . " sur $url : " . json_encode($trace), 'distant' . _LOG_DEBUG); |
|
| 645 | + |
|
| 646 | + return $result; |
|
| 647 | 647 | } |
| 648 | 648 | |
| 649 | 649 | /** |
@@ -659,73 +659,73 @@ discard block |
||
| 659 | 659 | * @return array|bool|mixed |
| 660 | 660 | */ |
| 661 | 661 | function recuperer_url_cache($url, $options = []) { |
| 662 | - if (!defined('_DELAI_RECUPERER_URL_CACHE')) { |
|
| 663 | - define('_DELAI_RECUPERER_URL_CACHE', 3600); |
|
| 664 | - } |
|
| 665 | - $default = [ |
|
| 666 | - 'transcoder' => false, |
|
| 667 | - 'methode' => 'GET', |
|
| 668 | - 'taille_max' => null, |
|
| 669 | - 'datas' => '', |
|
| 670 | - 'boundary' => '', |
|
| 671 | - 'refuser_gz' => false, |
|
| 672 | - 'if_modified_since' => '', |
|
| 673 | - 'uri_referer' => '', |
|
| 674 | - 'file' => '', |
|
| 675 | - 'follow_location' => 10, |
|
| 676 | - 'version_http' => _INC_DISTANT_VERSION_HTTP, |
|
| 677 | - 'delai_cache' => in_array(_VAR_MODE, ['preview', 'recalcul']) ? 0 : _DELAI_RECUPERER_URL_CACHE, |
|
| 678 | - ]; |
|
| 679 | - $options = array_merge($default, $options); |
|
| 680 | - |
|
| 681 | - // cas ou il n'est pas possible de cacher |
|
| 682 | - if (!empty($options['data']) or $options['methode'] == 'POST') { |
|
| 683 | - return recuperer_url($url, $options); |
|
| 684 | - } |
|
| 685 | - |
|
| 686 | - // ne pas tenter plusieurs fois la meme url en erreur (non cachee donc) |
|
| 687 | - static $errors = []; |
|
| 688 | - if (isset($errors[$url])) { |
|
| 689 | - return $errors[$url]; |
|
| 690 | - } |
|
| 691 | - |
|
| 692 | - $sig = $options; |
|
| 693 | - unset($sig['if_modified_since']); |
|
| 694 | - unset($sig['delai_cache']); |
|
| 695 | - $sig['url'] = $url; |
|
| 696 | - |
|
| 697 | - $dir = sous_repertoire(_DIR_CACHE, 'curl'); |
|
| 698 | - $cache = md5(serialize($sig)) . '-' . substr(preg_replace(',\W+,', '_', $url), 0, 80); |
|
| 699 | - $sub = sous_repertoire($dir, substr($cache, 0, 2)); |
|
| 700 | - $cache = "$sub$cache"; |
|
| 701 | - |
|
| 702 | - $res = false; |
|
| 703 | - $is_cached = file_exists($cache); |
|
| 704 | - if ( |
|
| 705 | - $is_cached |
|
| 706 | - and (filemtime($cache) > $_SERVER['REQUEST_TIME'] - $options['delai_cache']) |
|
| 707 | - ) { |
|
| 708 | - lire_fichier($cache, $res); |
|
| 709 | - if ($res = unserialize($res)) { |
|
| 710 | - // mettre le last_modified et le status=304 ? |
|
| 711 | - } |
|
| 712 | - } |
|
| 713 | - if (!$res) { |
|
| 714 | - $res = recuperer_url($url, $options); |
|
| 715 | - // ne pas recharger cette url non cachee dans le meme hit puisque non disponible |
|
| 716 | - if (!$res) { |
|
| 717 | - if ($is_cached) { |
|
| 718 | - // on a pas reussi a recuperer mais on avait un cache : l'utiliser |
|
| 719 | - lire_fichier($cache, $res); |
|
| 720 | - $res = unserialize($res); |
|
| 721 | - } |
|
| 722 | - |
|
| 723 | - return $errors[$url] = $res; |
|
| 724 | - } |
|
| 725 | - ecrire_fichier($cache, serialize($res)); |
|
| 726 | - } |
|
| 727 | - |
|
| 728 | - return $res; |
|
| 662 | + if (!defined('_DELAI_RECUPERER_URL_CACHE')) { |
|
| 663 | + define('_DELAI_RECUPERER_URL_CACHE', 3600); |
|
| 664 | + } |
|
| 665 | + $default = [ |
|
| 666 | + 'transcoder' => false, |
|
| 667 | + 'methode' => 'GET', |
|
| 668 | + 'taille_max' => null, |
|
| 669 | + 'datas' => '', |
|
| 670 | + 'boundary' => '', |
|
| 671 | + 'refuser_gz' => false, |
|
| 672 | + 'if_modified_since' => '', |
|
| 673 | + 'uri_referer' => '', |
|
| 674 | + 'file' => '', |
|
| 675 | + 'follow_location' => 10, |
|
| 676 | + 'version_http' => _INC_DISTANT_VERSION_HTTP, |
|
| 677 | + 'delai_cache' => in_array(_VAR_MODE, ['preview', 'recalcul']) ? 0 : _DELAI_RECUPERER_URL_CACHE, |
|
| 678 | + ]; |
|
| 679 | + $options = array_merge($default, $options); |
|
| 680 | + |
|
| 681 | + // cas ou il n'est pas possible de cacher |
|
| 682 | + if (!empty($options['data']) or $options['methode'] == 'POST') { |
|
| 683 | + return recuperer_url($url, $options); |
|
| 684 | + } |
|
| 685 | + |
|
| 686 | + // ne pas tenter plusieurs fois la meme url en erreur (non cachee donc) |
|
| 687 | + static $errors = []; |
|
| 688 | + if (isset($errors[$url])) { |
|
| 689 | + return $errors[$url]; |
|
| 690 | + } |
|
| 691 | + |
|
| 692 | + $sig = $options; |
|
| 693 | + unset($sig['if_modified_since']); |
|
| 694 | + unset($sig['delai_cache']); |
|
| 695 | + $sig['url'] = $url; |
|
| 696 | + |
|
| 697 | + $dir = sous_repertoire(_DIR_CACHE, 'curl'); |
|
| 698 | + $cache = md5(serialize($sig)) . '-' . substr(preg_replace(',\W+,', '_', $url), 0, 80); |
|
| 699 | + $sub = sous_repertoire($dir, substr($cache, 0, 2)); |
|
| 700 | + $cache = "$sub$cache"; |
|
| 701 | + |
|
| 702 | + $res = false; |
|
| 703 | + $is_cached = file_exists($cache); |
|
| 704 | + if ( |
|
| 705 | + $is_cached |
|
| 706 | + and (filemtime($cache) > $_SERVER['REQUEST_TIME'] - $options['delai_cache']) |
|
| 707 | + ) { |
|
| 708 | + lire_fichier($cache, $res); |
|
| 709 | + if ($res = unserialize($res)) { |
|
| 710 | + // mettre le last_modified et le status=304 ? |
|
| 711 | + } |
|
| 712 | + } |
|
| 713 | + if (!$res) { |
|
| 714 | + $res = recuperer_url($url, $options); |
|
| 715 | + // ne pas recharger cette url non cachee dans le meme hit puisque non disponible |
|
| 716 | + if (!$res) { |
|
| 717 | + if ($is_cached) { |
|
| 718 | + // on a pas reussi a recuperer mais on avait un cache : l'utiliser |
|
| 719 | + lire_fichier($cache, $res); |
|
| 720 | + $res = unserialize($res); |
|
| 721 | + } |
|
| 722 | + |
|
| 723 | + return $errors[$url] = $res; |
|
| 724 | + } |
|
| 725 | + ecrire_fichier($cache, serialize($res)); |
|
| 726 | + } |
|
| 727 | + |
|
| 728 | + return $res; |
|
| 729 | 729 | } |
| 730 | 730 | |
| 731 | 731 | /** |
@@ -743,42 +743,42 @@ discard block |
||
| 743 | 743 | * string contenu de la resource |
| 744 | 744 | */ |
| 745 | 745 | function recuperer_body($handle, $taille_max = _INC_DISTANT_MAX_SIZE, $fichier = '') { |
| 746 | - $tmpfile = null; |
|
| 747 | - $taille = 0; |
|
| 748 | - $result = ''; |
|
| 749 | - $fp = false; |
|
| 750 | - if ($fichier) { |
|
| 751 | - include_spip('inc/acces'); |
|
| 752 | - $tmpfile = "$fichier." . creer_uniqid() . '.tmp'; |
|
| 753 | - $fp = spip_fopen_lock($tmpfile, 'w', LOCK_EX); |
|
| 754 | - if (!$fp and file_exists($fichier)) { |
|
| 755 | - return filesize($fichier); |
|
| 756 | - } |
|
| 757 | - if (!$fp) { |
|
| 758 | - return false; |
|
| 759 | - } |
|
| 760 | - $result = 0; // on renvoie la taille du fichier |
|
| 761 | - } |
|
| 762 | - while (!feof($handle) and $taille < $taille_max) { |
|
| 763 | - $res = fread($handle, 16384); |
|
| 764 | - $taille += strlen($res); |
|
| 765 | - if ($fp) { |
|
| 766 | - fwrite($fp, $res); |
|
| 767 | - $result = $taille; |
|
| 768 | - } else { |
|
| 769 | - $result .= $res; |
|
| 770 | - } |
|
| 771 | - } |
|
| 772 | - if ($fp) { |
|
| 773 | - spip_fclose_unlock($fp); |
|
| 774 | - spip_unlink($fichier); |
|
| 775 | - @rename($tmpfile, $fichier); |
|
| 776 | - if (!file_exists($fichier)) { |
|
| 777 | - return false; |
|
| 778 | - } |
|
| 779 | - } |
|
| 780 | - |
|
| 781 | - return $result; |
|
| 746 | + $tmpfile = null; |
|
| 747 | + $taille = 0; |
|
| 748 | + $result = ''; |
|
| 749 | + $fp = false; |
|
| 750 | + if ($fichier) { |
|
| 751 | + include_spip('inc/acces'); |
|
| 752 | + $tmpfile = "$fichier." . creer_uniqid() . '.tmp'; |
|
| 753 | + $fp = spip_fopen_lock($tmpfile, 'w', LOCK_EX); |
|
| 754 | + if (!$fp and file_exists($fichier)) { |
|
| 755 | + return filesize($fichier); |
|
| 756 | + } |
|
| 757 | + if (!$fp) { |
|
| 758 | + return false; |
|
| 759 | + } |
|
| 760 | + $result = 0; // on renvoie la taille du fichier |
|
| 761 | + } |
|
| 762 | + while (!feof($handle) and $taille < $taille_max) { |
|
| 763 | + $res = fread($handle, 16384); |
|
| 764 | + $taille += strlen($res); |
|
| 765 | + if ($fp) { |
|
| 766 | + fwrite($fp, $res); |
|
| 767 | + $result = $taille; |
|
| 768 | + } else { |
|
| 769 | + $result .= $res; |
|
| 770 | + } |
|
| 771 | + } |
|
| 772 | + if ($fp) { |
|
| 773 | + spip_fclose_unlock($fp); |
|
| 774 | + spip_unlink($fichier); |
|
| 775 | + @rename($tmpfile, $fichier); |
|
| 776 | + if (!file_exists($fichier)) { |
|
| 777 | + return false; |
|
| 778 | + } |
|
| 779 | + } |
|
| 780 | + |
|
| 781 | + return $result; |
|
| 782 | 782 | } |
| 783 | 783 | |
| 784 | 784 | /** |
@@ -800,35 +800,35 @@ discard block |
||
| 800 | 800 | * string location |
| 801 | 801 | */ |
| 802 | 802 | function recuperer_entetes_complets($handle, $if_modified_since = false) { |
| 803 | - $result = ['status' => 0, 'headers' => [], 'last_modified' => 0, 'location' => '']; |
|
| 804 | - |
|
| 805 | - $s = @trim(fgets($handle, 16384)); |
|
| 806 | - if (!preg_match(',^HTTP/[0-9]+\.[0-9]+ ([0-9]+),', $s, $r)) { |
|
| 807 | - return false; |
|
| 808 | - } |
|
| 809 | - $result['status'] = intval($r[1]); |
|
| 810 | - while ($s = trim(fgets($handle, 16384))) { |
|
| 811 | - $result['headers'][] = $s . "\n"; |
|
| 812 | - preg_match(',^([^:]*): *(.*)$,i', $s, $r); |
|
| 813 | - [, $d, $v] = $r; |
|
| 814 | - if (strtolower(trim($d)) == 'location' and $result['status'] >= 300 and $result['status'] < 400) { |
|
| 815 | - $result['location'] = $v; |
|
| 816 | - } elseif ($d == 'Last-Modified') { |
|
| 817 | - $result['last_modified'] = strtotime($v); |
|
| 818 | - } |
|
| 819 | - } |
|
| 820 | - if ( |
|
| 821 | - $if_modified_since |
|
| 822 | - and $result['last_modified'] |
|
| 823 | - and $if_modified_since > $result['last_modified'] |
|
| 824 | - and $result['status'] == 200 |
|
| 825 | - ) { |
|
| 826 | - $result['status'] = 304; |
|
| 827 | - } |
|
| 828 | - |
|
| 829 | - $result['headers'] = implode('', $result['headers']); |
|
| 830 | - |
|
| 831 | - return $result; |
|
| 803 | + $result = ['status' => 0, 'headers' => [], 'last_modified' => 0, 'location' => '']; |
|
| 804 | + |
|
| 805 | + $s = @trim(fgets($handle, 16384)); |
|
| 806 | + if (!preg_match(',^HTTP/[0-9]+\.[0-9]+ ([0-9]+),', $s, $r)) { |
|
| 807 | + return false; |
|
| 808 | + } |
|
| 809 | + $result['status'] = intval($r[1]); |
|
| 810 | + while ($s = trim(fgets($handle, 16384))) { |
|
| 811 | + $result['headers'][] = $s . "\n"; |
|
| 812 | + preg_match(',^([^:]*): *(.*)$,i', $s, $r); |
|
| 813 | + [, $d, $v] = $r; |
|
| 814 | + if (strtolower(trim($d)) == 'location' and $result['status'] >= 300 and $result['status'] < 400) { |
|
| 815 | + $result['location'] = $v; |
|
| 816 | + } elseif ($d == 'Last-Modified') { |
|
| 817 | + $result['last_modified'] = strtotime($v); |
|
| 818 | + } |
|
| 819 | + } |
|
| 820 | + if ( |
|
| 821 | + $if_modified_since |
|
| 822 | + and $result['last_modified'] |
|
| 823 | + and $if_modified_since > $result['last_modified'] |
|
| 824 | + and $result['status'] == 200 |
|
| 825 | + ) { |
|
| 826 | + $result['status'] = 304; |
|
| 827 | + } |
|
| 828 | + |
|
| 829 | + $result['headers'] = implode('', $result['headers']); |
|
| 830 | + |
|
| 831 | + return $result; |
|
| 832 | 832 | } |
| 833 | 833 | |
| 834 | 834 | /** |
@@ -850,22 +850,22 @@ discard block |
||
| 850 | 850 | * Nom du fichier pour copie locale |
| 851 | 851 | **/ |
| 852 | 852 | function nom_fichier_copie_locale($source, $extension) { |
| 853 | - include_spip('inc/documents'); |
|
| 853 | + include_spip('inc/documents'); |
|
| 854 | 854 | |
| 855 | - $d = creer_repertoire_documents('distant'); # IMG/distant/ |
|
| 856 | - $d = sous_repertoire($d, $extension); # IMG/distant/pdf/ |
|
| 855 | + $d = creer_repertoire_documents('distant'); # IMG/distant/ |
|
| 856 | + $d = sous_repertoire($d, $extension); # IMG/distant/pdf/ |
|
| 857 | 857 | |
| 858 | - // on se place tout le temps comme si on etait a la racine |
|
| 859 | - if (_DIR_RACINE) { |
|
| 860 | - $d = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $d); |
|
| 861 | - } |
|
| 858 | + // on se place tout le temps comme si on etait a la racine |
|
| 859 | + if (_DIR_RACINE) { |
|
| 860 | + $d = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $d); |
|
| 861 | + } |
|
| 862 | 862 | |
| 863 | - $m = md5($source); |
|
| 863 | + $m = md5($source); |
|
| 864 | 864 | |
| 865 | - return $d |
|
| 866 | - . substr(preg_replace(',[^\w-],', '', basename($source)) . '-' . $m, 0, 12) |
|
| 867 | - . substr($m, 0, 4) |
|
| 868 | - . ".$extension"; |
|
| 865 | + return $d |
|
| 866 | + . substr(preg_replace(',[^\w-],', '', basename($source)) . '-' . $m, 0, 12) |
|
| 867 | + . substr($m, 0, 4) |
|
| 868 | + . ".$extension"; |
|
| 869 | 869 | } |
| 870 | 870 | |
| 871 | 871 | /** |
@@ -884,72 +884,72 @@ discard block |
||
| 884 | 884 | * - null: Copie locale impossible |
| 885 | 885 | **/ |
| 886 | 886 | function fichier_copie_locale($source) { |
| 887 | - // Si c'est deja local pas de souci |
|
| 888 | - if (!tester_url_absolue($source)) { |
|
| 889 | - if (_DIR_RACINE) { |
|
| 890 | - $source = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $source); |
|
| 891 | - } |
|
| 892 | - |
|
| 893 | - return $source; |
|
| 894 | - } |
|
| 895 | - |
|
| 896 | - // optimisation : on regarde si on peut deviner l'extension dans l'url et si le fichier |
|
| 897 | - // a deja ete copie en local avec cette extension |
|
| 898 | - // dans ce cas elle est fiable, pas la peine de requeter en base |
|
| 899 | - $path_parts = pathinfo($source); |
|
| 900 | - if (!isset($path_parts['extension'])) { |
|
| 901 | - $path_parts['extension'] = ''; |
|
| 902 | - } |
|
| 903 | - $ext = $path_parts ? $path_parts['extension'] : ''; |
|
| 904 | - if ( |
|
| 905 | - $ext |
|
| 906 | - and preg_match(',^\w+$,', $ext) // pas de php?truc=1&... |
|
| 907 | - and $f = nom_fichier_copie_locale($source, $ext) |
|
| 908 | - and file_exists(_DIR_RACINE . $f) |
|
| 909 | - ) { |
|
| 910 | - return $f; |
|
| 911 | - } |
|
| 912 | - |
|
| 913 | - |
|
| 914 | - // Si c'est deja dans la table des documents, |
|
| 915 | - // ramener le nom de sa copie potentielle |
|
| 916 | - $ext = sql_getfetsel('extension', 'spip_documents', 'fichier=' . sql_quote($source) . " AND distant='oui' AND extension <> ''"); |
|
| 917 | - |
|
| 918 | - if ($ext) { |
|
| 919 | - return nom_fichier_copie_locale($source, $ext); |
|
| 920 | - } |
|
| 921 | - |
|
| 922 | - // voir si l'extension indiquee dans le nom du fichier est ok |
|
| 923 | - // et si il n'aurait pas deja ete rapatrie |
|
| 924 | - |
|
| 925 | - $ext = $path_parts ? $path_parts['extension'] : ''; |
|
| 926 | - |
|
| 927 | - if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) { |
|
| 928 | - $f = nom_fichier_copie_locale($source, $ext); |
|
| 929 | - if (file_exists(_DIR_RACINE . $f)) { |
|
| 930 | - return $f; |
|
| 931 | - } |
|
| 932 | - } |
|
| 933 | - |
|
| 934 | - // Ping pour voir si son extension est connue et autorisee |
|
| 935 | - // avec mise en cache du resultat du ping |
|
| 936 | - |
|
| 937 | - $cache = sous_repertoire(_DIR_CACHE, 'rid') . md5($source); |
|
| 938 | - if ( |
|
| 939 | - !@file_exists($cache) |
|
| 940 | - or !$path_parts = @unserialize(spip_file_get_contents($cache)) |
|
| 941 | - or _request('var_mode') === 'recalcul' |
|
| 942 | - ) { |
|
| 943 | - $path_parts = recuperer_infos_distantes($source, ['charger_si_petite_image' => false]); |
|
| 944 | - ecrire_fichier($cache, serialize($path_parts)); |
|
| 945 | - } |
|
| 946 | - $ext = !empty($path_parts['extension']) ? $path_parts['extension'] : ''; |
|
| 947 | - if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) { |
|
| 948 | - return nom_fichier_copie_locale($source, $ext); |
|
| 949 | - } |
|
| 950 | - |
|
| 951 | - spip_log("pas de copie locale pour $source", 'distant' . _LOG_ERREUR); |
|
| 952 | - return null; |
|
| 887 | + // Si c'est deja local pas de souci |
|
| 888 | + if (!tester_url_absolue($source)) { |
|
| 889 | + if (_DIR_RACINE) { |
|
| 890 | + $source = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $source); |
|
| 891 | + } |
|
| 892 | + |
|
| 893 | + return $source; |
|
| 894 | + } |
|
| 895 | + |
|
| 896 | + // optimisation : on regarde si on peut deviner l'extension dans l'url et si le fichier |
|
| 897 | + // a deja ete copie en local avec cette extension |
|
| 898 | + // dans ce cas elle est fiable, pas la peine de requeter en base |
|
| 899 | + $path_parts = pathinfo($source); |
|
| 900 | + if (!isset($path_parts['extension'])) { |
|
| 901 | + $path_parts['extension'] = ''; |
|
| 902 | + } |
|
| 903 | + $ext = $path_parts ? $path_parts['extension'] : ''; |
|
| 904 | + if ( |
|
| 905 | + $ext |
|
| 906 | + and preg_match(',^\w+$,', $ext) // pas de php?truc=1&... |
|
| 907 | + and $f = nom_fichier_copie_locale($source, $ext) |
|
| 908 | + and file_exists(_DIR_RACINE . $f) |
|
| 909 | + ) { |
|
| 910 | + return $f; |
|
| 911 | + } |
|
| 912 | + |
|
| 913 | + |
|
| 914 | + // Si c'est deja dans la table des documents, |
|
| 915 | + // ramener le nom de sa copie potentielle |
|
| 916 | + $ext = sql_getfetsel('extension', 'spip_documents', 'fichier=' . sql_quote($source) . " AND distant='oui' AND extension <> ''"); |
|
| 917 | + |
|
| 918 | + if ($ext) { |
|
| 919 | + return nom_fichier_copie_locale($source, $ext); |
|
| 920 | + } |
|
| 921 | + |
|
| 922 | + // voir si l'extension indiquee dans le nom du fichier est ok |
|
| 923 | + // et si il n'aurait pas deja ete rapatrie |
|
| 924 | + |
|
| 925 | + $ext = $path_parts ? $path_parts['extension'] : ''; |
|
| 926 | + |
|
| 927 | + if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) { |
|
| 928 | + $f = nom_fichier_copie_locale($source, $ext); |
|
| 929 | + if (file_exists(_DIR_RACINE . $f)) { |
|
| 930 | + return $f; |
|
| 931 | + } |
|
| 932 | + } |
|
| 933 | + |
|
| 934 | + // Ping pour voir si son extension est connue et autorisee |
|
| 935 | + // avec mise en cache du resultat du ping |
|
| 936 | + |
|
| 937 | + $cache = sous_repertoire(_DIR_CACHE, 'rid') . md5($source); |
|
| 938 | + if ( |
|
| 939 | + !@file_exists($cache) |
|
| 940 | + or !$path_parts = @unserialize(spip_file_get_contents($cache)) |
|
| 941 | + or _request('var_mode') === 'recalcul' |
|
| 942 | + ) { |
|
| 943 | + $path_parts = recuperer_infos_distantes($source, ['charger_si_petite_image' => false]); |
|
| 944 | + ecrire_fichier($cache, serialize($path_parts)); |
|
| 945 | + } |
|
| 946 | + $ext = !empty($path_parts['extension']) ? $path_parts['extension'] : ''; |
|
| 947 | + if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) { |
|
| 948 | + return nom_fichier_copie_locale($source, $ext); |
|
| 949 | + } |
|
| 950 | + |
|
| 951 | + spip_log("pas de copie locale pour $source", 'distant' . _LOG_ERREUR); |
|
| 952 | + return null; |
|
| 953 | 953 | } |
| 954 | 954 | |
| 955 | 955 | |
@@ -978,110 +978,110 @@ discard block |
||
| 978 | 978 | **/ |
| 979 | 979 | function recuperer_infos_distantes($source, $options = []) { |
| 980 | 980 | |
| 981 | - // pas la peine de perdre son temps |
|
| 982 | - if (!tester_url_absolue($source)) { |
|
| 983 | - return false; |
|
| 984 | - } |
|
| 985 | - |
|
| 986 | - $taille_max = $options['taille_max'] ?? 0; |
|
| 987 | - $charger_si_petite_image = !!($options['charger_si_petite_image'] ?? true); |
|
| 988 | - $callback_valider_url = $options['callback_valider_url'] ?? null; |
|
| 989 | - |
|
| 990 | - # charger les alias des types mime |
|
| 991 | - include_spip('base/typedoc'); |
|
| 992 | - |
|
| 993 | - $a = []; |
|
| 994 | - $mime_type = ''; |
|
| 995 | - // On va directement charger le debut des images et des fichiers html, |
|
| 996 | - // de maniere a attrapper le maximum d'infos (titre, taille, etc). Si |
|
| 997 | - // ca echoue l'utilisateur devra les entrer... |
|
| 998 | - $reponse = recuperer_url($source, ['taille_max' => $taille_max, 'refuser_gz' => true]); |
|
| 999 | - if ( |
|
| 1000 | - $callback_valider_url |
|
| 1001 | - and is_callable($callback_valider_url) |
|
| 1002 | - and !$callback_valider_url($reponse['url']) |
|
| 1003 | - ) { |
|
| 1004 | - return false; |
|
| 1005 | - } |
|
| 1006 | - $headers = $reponse['headers'] ?? ''; |
|
| 1007 | - $a['body'] = $reponse['page'] ?? ''; |
|
| 1008 | - if ($headers) { |
|
| 1009 | - if (!$extension = distant_trouver_extension_selon_headers($source, $headers)) { |
|
| 1010 | - return false; |
|
| 1011 | - } |
|
| 1012 | - |
|
| 1013 | - $a['extension'] = $extension; |
|
| 1014 | - |
|
| 1015 | - if (preg_match(",\nContent-Length: *([^[:space:]]*),i", "\n$headers", $regs)) { |
|
| 1016 | - $a['taille'] = intval($regs[1]); |
|
| 1017 | - } |
|
| 1018 | - } |
|
| 1019 | - |
|
| 1020 | - // Echec avec HEAD, on tente avec GET |
|
| 1021 | - if (!$a and !$taille_max) { |
|
| 1022 | - spip_log("tenter GET $source", 'distant'); |
|
| 1023 | - $options['taille_max'] = _INC_DISTANT_MAX_SIZE; |
|
| 1024 | - $a = recuperer_infos_distantes($source, $options); |
|
| 1025 | - } |
|
| 1026 | - |
|
| 1027 | - // si on a rien trouve pas la peine d'insister |
|
| 1028 | - if (!$a) { |
|
| 1029 | - return false; |
|
| 1030 | - } |
|
| 1031 | - |
|
| 1032 | - // S'il s'agit d'une image pas trop grosse ou d'un fichier html, on va aller |
|
| 1033 | - // recharger le document en GET et recuperer des donnees supplementaires... |
|
| 1034 | - include_spip('inc/filtres_images_lib_mini'); |
|
| 1035 | - if ( |
|
| 1036 | - strpos($mime_type, 'image/') === 0 |
|
| 1037 | - and $extension = _image_trouver_extension_depuis_mime($mime_type) |
|
| 1038 | - ) { |
|
| 1039 | - if ( |
|
| 1040 | - $taille_max == 0 |
|
| 1041 | - and (empty($a['taille']) or $a['taille'] < _INC_DISTANT_MAX_SIZE) |
|
| 1042 | - and in_array($extension, formats_image_acceptables()) |
|
| 1043 | - and $charger_si_petite_image |
|
| 1044 | - ) { |
|
| 1045 | - $options['taille_max'] = _INC_DISTANT_MAX_SIZE; |
|
| 1046 | - $a = recuperer_infos_distantes($source, $options); |
|
| 1047 | - } else { |
|
| 1048 | - if ($a['body']) { |
|
| 1049 | - $a['extension'] = $extension; |
|
| 1050 | - $a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $extension); |
|
| 1051 | - ecrire_fichier($a['fichier'], $a['body']); |
|
| 1052 | - $size_image = @spip_getimagesize($a['fichier']); |
|
| 1053 | - $a['largeur'] = intval($size_image[0]); |
|
| 1054 | - $a['hauteur'] = intval($size_image[1]); |
|
| 1055 | - $a['type_image'] = true; |
|
| 1056 | - } |
|
| 1057 | - } |
|
| 1058 | - } |
|
| 1059 | - |
|
| 1060 | - // Fichier swf, si on n'a pas la taille, on va mettre 425x350 par defaut |
|
| 1061 | - // ce sera mieux que 0x0 |
|
| 1062 | - // Flash is dead! |
|
| 1063 | - if ( |
|
| 1064 | - $a and isset($a['extension']) and $a['extension'] == 'swf' |
|
| 1065 | - and empty($a['largeur']) |
|
| 1066 | - ) { |
|
| 1067 | - $a['largeur'] = 425; |
|
| 1068 | - $a['hauteur'] = 350; |
|
| 1069 | - } |
|
| 1070 | - |
|
| 1071 | - if ($mime_type == 'text/html') { |
|
| 1072 | - include_spip('inc/filtres'); |
|
| 1073 | - $page = recuperer_url($source, ['transcoder' => true, 'taille_max' => _INC_DISTANT_MAX_SIZE]); |
|
| 1074 | - $page = $page['page'] ?? ''; |
|
| 1075 | - if (preg_match(',<title>(.*?)</title>,ims', $page, $regs)) { |
|
| 1076 | - $a['titre'] = corriger_caracteres(trim($regs[1])); |
|
| 1077 | - } |
|
| 1078 | - if (!isset($a['taille']) or !$a['taille']) { |
|
| 1079 | - $a['taille'] = strlen($page); # a peu pres |
|
| 1080 | - } |
|
| 1081 | - } |
|
| 1082 | - $a['mime_type'] = $mime_type; |
|
| 1083 | - |
|
| 1084 | - return $a; |
|
| 981 | + // pas la peine de perdre son temps |
|
| 982 | + if (!tester_url_absolue($source)) { |
|
| 983 | + return false; |
|
| 984 | + } |
|
| 985 | + |
|
| 986 | + $taille_max = $options['taille_max'] ?? 0; |
|
| 987 | + $charger_si_petite_image = !!($options['charger_si_petite_image'] ?? true); |
|
| 988 | + $callback_valider_url = $options['callback_valider_url'] ?? null; |
|
| 989 | + |
|
| 990 | + # charger les alias des types mime |
|
| 991 | + include_spip('base/typedoc'); |
|
| 992 | + |
|
| 993 | + $a = []; |
|
| 994 | + $mime_type = ''; |
|
| 995 | + // On va directement charger le debut des images et des fichiers html, |
|
| 996 | + // de maniere a attrapper le maximum d'infos (titre, taille, etc). Si |
|
| 997 | + // ca echoue l'utilisateur devra les entrer... |
|
| 998 | + $reponse = recuperer_url($source, ['taille_max' => $taille_max, 'refuser_gz' => true]); |
|
| 999 | + if ( |
|
| 1000 | + $callback_valider_url |
|
| 1001 | + and is_callable($callback_valider_url) |
|
| 1002 | + and !$callback_valider_url($reponse['url']) |
|
| 1003 | + ) { |
|
| 1004 | + return false; |
|
| 1005 | + } |
|
| 1006 | + $headers = $reponse['headers'] ?? ''; |
|
| 1007 | + $a['body'] = $reponse['page'] ?? ''; |
|
| 1008 | + if ($headers) { |
|
| 1009 | + if (!$extension = distant_trouver_extension_selon_headers($source, $headers)) { |
|
| 1010 | + return false; |
|
| 1011 | + } |
|
| 1012 | + |
|
| 1013 | + $a['extension'] = $extension; |
|
| 1014 | + |
|
| 1015 | + if (preg_match(",\nContent-Length: *([^[:space:]]*),i", "\n$headers", $regs)) { |
|
| 1016 | + $a['taille'] = intval($regs[1]); |
|
| 1017 | + } |
|
| 1018 | + } |
|
| 1019 | + |
|
| 1020 | + // Echec avec HEAD, on tente avec GET |
|
| 1021 | + if (!$a and !$taille_max) { |
|
| 1022 | + spip_log("tenter GET $source", 'distant'); |
|
| 1023 | + $options['taille_max'] = _INC_DISTANT_MAX_SIZE; |
|
| 1024 | + $a = recuperer_infos_distantes($source, $options); |
|
| 1025 | + } |
|
| 1026 | + |
|
| 1027 | + // si on a rien trouve pas la peine d'insister |
|
| 1028 | + if (!$a) { |
|
| 1029 | + return false; |
|
| 1030 | + } |
|
| 1031 | + |
|
| 1032 | + // S'il s'agit d'une image pas trop grosse ou d'un fichier html, on va aller |
|
| 1033 | + // recharger le document en GET et recuperer des donnees supplementaires... |
|
| 1034 | + include_spip('inc/filtres_images_lib_mini'); |
|
| 1035 | + if ( |
|
| 1036 | + strpos($mime_type, 'image/') === 0 |
|
| 1037 | + and $extension = _image_trouver_extension_depuis_mime($mime_type) |
|
| 1038 | + ) { |
|
| 1039 | + if ( |
|
| 1040 | + $taille_max == 0 |
|
| 1041 | + and (empty($a['taille']) or $a['taille'] < _INC_DISTANT_MAX_SIZE) |
|
| 1042 | + and in_array($extension, formats_image_acceptables()) |
|
| 1043 | + and $charger_si_petite_image |
|
| 1044 | + ) { |
|
| 1045 | + $options['taille_max'] = _INC_DISTANT_MAX_SIZE; |
|
| 1046 | + $a = recuperer_infos_distantes($source, $options); |
|
| 1047 | + } else { |
|
| 1048 | + if ($a['body']) { |
|
| 1049 | + $a['extension'] = $extension; |
|
| 1050 | + $a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $extension); |
|
| 1051 | + ecrire_fichier($a['fichier'], $a['body']); |
|
| 1052 | + $size_image = @spip_getimagesize($a['fichier']); |
|
| 1053 | + $a['largeur'] = intval($size_image[0]); |
|
| 1054 | + $a['hauteur'] = intval($size_image[1]); |
|
| 1055 | + $a['type_image'] = true; |
|
| 1056 | + } |
|
| 1057 | + } |
|
| 1058 | + } |
|
| 1059 | + |
|
| 1060 | + // Fichier swf, si on n'a pas la taille, on va mettre 425x350 par defaut |
|
| 1061 | + // ce sera mieux que 0x0 |
|
| 1062 | + // Flash is dead! |
|
| 1063 | + if ( |
|
| 1064 | + $a and isset($a['extension']) and $a['extension'] == 'swf' |
|
| 1065 | + and empty($a['largeur']) |
|
| 1066 | + ) { |
|
| 1067 | + $a['largeur'] = 425; |
|
| 1068 | + $a['hauteur'] = 350; |
|
| 1069 | + } |
|
| 1070 | + |
|
| 1071 | + if ($mime_type == 'text/html') { |
|
| 1072 | + include_spip('inc/filtres'); |
|
| 1073 | + $page = recuperer_url($source, ['transcoder' => true, 'taille_max' => _INC_DISTANT_MAX_SIZE]); |
|
| 1074 | + $page = $page['page'] ?? ''; |
|
| 1075 | + if (preg_match(',<title>(.*?)</title>,ims', $page, $regs)) { |
|
| 1076 | + $a['titre'] = corriger_caracteres(trim($regs[1])); |
|
| 1077 | + } |
|
| 1078 | + if (!isset($a['taille']) or !$a['taille']) { |
|
| 1079 | + $a['taille'] = strlen($page); # a peu pres |
|
| 1080 | + } |
|
| 1081 | + } |
|
| 1082 | + $a['mime_type'] = $mime_type; |
|
| 1083 | + |
|
| 1084 | + return $a; |
|
| 1085 | 1085 | } |
| 1086 | 1086 | |
| 1087 | 1087 | /** |
@@ -1090,70 +1090,70 @@ discard block |
||
| 1090 | 1090 | * @return false|mixed |
| 1091 | 1091 | */ |
| 1092 | 1092 | function distant_trouver_extension_selon_headers($source, $headers) { |
| 1093 | - if (preg_match(",\nContent-Type: *([^[:space:];]*),i", "\n$headers", $regs)) { |
|
| 1094 | - $mime_type = (trim($regs[1])); |
|
| 1095 | - } else { |
|
| 1096 | - $mime_type = ''; |
|
| 1097 | - } // inconnu |
|
| 1098 | - |
|
| 1099 | - // Appliquer les alias |
|
| 1100 | - while (isset($GLOBALS['mime_alias'][$mime_type])) { |
|
| 1101 | - $mime_type = $GLOBALS['mime_alias'][$mime_type]; |
|
| 1102 | - } |
|
| 1103 | - |
|
| 1104 | - // pour corriger_extension() |
|
| 1105 | - include_spip('inc/documents'); |
|
| 1106 | - |
|
| 1107 | - // Si on a un mime-type insignifiant |
|
| 1108 | - // text/plain,application/octet-stream ou vide |
|
| 1109 | - // c'est peut-etre que le serveur ne sait pas |
|
| 1110 | - // ce qu'il sert ; on va tenter de detecter via l'extension de l'url |
|
| 1111 | - // ou le Content-Disposition: attachment; filename=... |
|
| 1112 | - $t = null; |
|
| 1113 | - if (in_array($mime_type, ['text/plain', '', 'application/octet-stream'])) { |
|
| 1114 | - if ( |
|
| 1115 | - !$t |
|
| 1116 | - and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext) |
|
| 1117 | - ) { |
|
| 1118 | - $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1119 | - } |
|
| 1120 | - if ( |
|
| 1121 | - !$t |
|
| 1122 | - and preg_match(',^Content-Disposition:\s*attachment;\s*filename=(.*)$,Uims', $headers, $m) |
|
| 1123 | - and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $m[1], $rext) |
|
| 1124 | - ) { |
|
| 1125 | - $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1126 | - } |
|
| 1127 | - } |
|
| 1128 | - |
|
| 1129 | - // Autre mime/type (ou text/plain avec fichier d'extension inconnue) |
|
| 1130 | - if (!$t) { |
|
| 1131 | - $t = sql_fetsel('extension', 'spip_types_documents', 'mime_type=' . sql_quote($mime_type)); |
|
| 1132 | - } |
|
| 1133 | - |
|
| 1134 | - // Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg) |
|
| 1135 | - // On essaie de nouveau avec l'extension |
|
| 1136 | - if ( |
|
| 1137 | - !$t |
|
| 1138 | - and $mime_type != 'text/plain' |
|
| 1139 | - and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext) |
|
| 1140 | - ) { |
|
| 1141 | - # eviter xxx.3 => 3gp (> SPIP 3) |
|
| 1142 | - $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1143 | - } |
|
| 1144 | - |
|
| 1145 | - if ($t) { |
|
| 1146 | - spip_log("mime-type $mime_type ok, extension " . $t['extension'], 'distant'); |
|
| 1147 | - return $t['extension']; |
|
| 1148 | - } else { |
|
| 1149 | - # par defaut on retombe sur '.bin' si c'est autorise |
|
| 1150 | - spip_log("mime-type $mime_type inconnu", 'distant'); |
|
| 1151 | - $t = sql_fetsel('extension', 'spip_types_documents', "extension='bin'"); |
|
| 1152 | - if (!$t) { |
|
| 1153 | - return false; |
|
| 1154 | - } |
|
| 1155 | - return $t['extension']; |
|
| 1156 | - } |
|
| 1093 | + if (preg_match(",\nContent-Type: *([^[:space:];]*),i", "\n$headers", $regs)) { |
|
| 1094 | + $mime_type = (trim($regs[1])); |
|
| 1095 | + } else { |
|
| 1096 | + $mime_type = ''; |
|
| 1097 | + } // inconnu |
|
| 1098 | + |
|
| 1099 | + // Appliquer les alias |
|
| 1100 | + while (isset($GLOBALS['mime_alias'][$mime_type])) { |
|
| 1101 | + $mime_type = $GLOBALS['mime_alias'][$mime_type]; |
|
| 1102 | + } |
|
| 1103 | + |
|
| 1104 | + // pour corriger_extension() |
|
| 1105 | + include_spip('inc/documents'); |
|
| 1106 | + |
|
| 1107 | + // Si on a un mime-type insignifiant |
|
| 1108 | + // text/plain,application/octet-stream ou vide |
|
| 1109 | + // c'est peut-etre que le serveur ne sait pas |
|
| 1110 | + // ce qu'il sert ; on va tenter de detecter via l'extension de l'url |
|
| 1111 | + // ou le Content-Disposition: attachment; filename=... |
|
| 1112 | + $t = null; |
|
| 1113 | + if (in_array($mime_type, ['text/plain', '', 'application/octet-stream'])) { |
|
| 1114 | + if ( |
|
| 1115 | + !$t |
|
| 1116 | + and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext) |
|
| 1117 | + ) { |
|
| 1118 | + $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1119 | + } |
|
| 1120 | + if ( |
|
| 1121 | + !$t |
|
| 1122 | + and preg_match(',^Content-Disposition:\s*attachment;\s*filename=(.*)$,Uims', $headers, $m) |
|
| 1123 | + and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $m[1], $rext) |
|
| 1124 | + ) { |
|
| 1125 | + $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1126 | + } |
|
| 1127 | + } |
|
| 1128 | + |
|
| 1129 | + // Autre mime/type (ou text/plain avec fichier d'extension inconnue) |
|
| 1130 | + if (!$t) { |
|
| 1131 | + $t = sql_fetsel('extension', 'spip_types_documents', 'mime_type=' . sql_quote($mime_type)); |
|
| 1132 | + } |
|
| 1133 | + |
|
| 1134 | + // Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg) |
|
| 1135 | + // On essaie de nouveau avec l'extension |
|
| 1136 | + if ( |
|
| 1137 | + !$t |
|
| 1138 | + and $mime_type != 'text/plain' |
|
| 1139 | + and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext) |
|
| 1140 | + ) { |
|
| 1141 | + # eviter xxx.3 => 3gp (> SPIP 3) |
|
| 1142 | + $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1143 | + } |
|
| 1144 | + |
|
| 1145 | + if ($t) { |
|
| 1146 | + spip_log("mime-type $mime_type ok, extension " . $t['extension'], 'distant'); |
|
| 1147 | + return $t['extension']; |
|
| 1148 | + } else { |
|
| 1149 | + # par defaut on retombe sur '.bin' si c'est autorise |
|
| 1150 | + spip_log("mime-type $mime_type inconnu", 'distant'); |
|
| 1151 | + $t = sql_fetsel('extension', 'spip_types_documents', "extension='bin'"); |
|
| 1152 | + if (!$t) { |
|
| 1153 | + return false; |
|
| 1154 | + } |
|
| 1155 | + return $t['extension']; |
|
| 1156 | + } |
|
| 1157 | 1157 | } |
| 1158 | 1158 | |
| 1159 | 1159 | /** |
@@ -1169,45 +1169,45 @@ discard block |
||
| 1169 | 1169 | */ |
| 1170 | 1170 | function need_proxy($host, $http_proxy = null, $http_noproxy = null) { |
| 1171 | 1171 | |
| 1172 | - $http_proxy ??= $GLOBALS['meta']['http_proxy'] ?? null; |
|
| 1173 | - |
|
| 1174 | - // rien a faire si pas de proxy :) |
|
| 1175 | - if (is_null($http_proxy) or !$http_proxy = trim($http_proxy)) { |
|
| 1176 | - return ''; |
|
| 1177 | - } |
|
| 1178 | - |
|
| 1179 | - if (is_null($http_noproxy)) { |
|
| 1180 | - $http_noproxy = $GLOBALS['meta']['http_noproxy'] ?? null; |
|
| 1181 | - } |
|
| 1182 | - // si pas d'exception, on retourne le proxy |
|
| 1183 | - if (is_null($http_noproxy) or !$http_noproxy = trim($http_noproxy)) { |
|
| 1184 | - return $http_proxy; |
|
| 1185 | - } |
|
| 1186 | - |
|
| 1187 | - // si le host ou l'un des domaines parents est dans $http_noproxy on fait exception |
|
| 1188 | - // $http_noproxy peut contenir plusieurs domaines separes par des espaces ou retour ligne |
|
| 1189 | - $http_noproxy = str_replace("\n", ' ', $http_noproxy); |
|
| 1190 | - $http_noproxy = str_replace("\r", ' ', $http_noproxy); |
|
| 1191 | - $http_noproxy = " $http_noproxy "; |
|
| 1192 | - $domain = $host; |
|
| 1193 | - // si le domaine exact www.example.org est dans les exceptions |
|
| 1194 | - if (strpos($http_noproxy, (string) " $domain ") !== false) { |
|
| 1195 | - return ''; |
|
| 1196 | - } |
|
| 1197 | - |
|
| 1198 | - while (strpos($domain, '.') !== false) { |
|
| 1199 | - $domain = explode('.', $domain); |
|
| 1200 | - array_shift($domain); |
|
| 1201 | - $domain = implode('.', $domain); |
|
| 1202 | - |
|
| 1203 | - // ou si un domaine parent commencant par un . est dans les exceptions (indiquant qu'il couvre tous les sous-domaines) |
|
| 1204 | - if (strpos($http_noproxy, (string) " .$domain ") !== false) { |
|
| 1205 | - return ''; |
|
| 1206 | - } |
|
| 1207 | - } |
|
| 1208 | - |
|
| 1209 | - // ok c'est pas une exception |
|
| 1210 | - return $http_proxy; |
|
| 1172 | + $http_proxy ??= $GLOBALS['meta']['http_proxy'] ?? null; |
|
| 1173 | + |
|
| 1174 | + // rien a faire si pas de proxy :) |
|
| 1175 | + if (is_null($http_proxy) or !$http_proxy = trim($http_proxy)) { |
|
| 1176 | + return ''; |
|
| 1177 | + } |
|
| 1178 | + |
|
| 1179 | + if (is_null($http_noproxy)) { |
|
| 1180 | + $http_noproxy = $GLOBALS['meta']['http_noproxy'] ?? null; |
|
| 1181 | + } |
|
| 1182 | + // si pas d'exception, on retourne le proxy |
|
| 1183 | + if (is_null($http_noproxy) or !$http_noproxy = trim($http_noproxy)) { |
|
| 1184 | + return $http_proxy; |
|
| 1185 | + } |
|
| 1186 | + |
|
| 1187 | + // si le host ou l'un des domaines parents est dans $http_noproxy on fait exception |
|
| 1188 | + // $http_noproxy peut contenir plusieurs domaines separes par des espaces ou retour ligne |
|
| 1189 | + $http_noproxy = str_replace("\n", ' ', $http_noproxy); |
|
| 1190 | + $http_noproxy = str_replace("\r", ' ', $http_noproxy); |
|
| 1191 | + $http_noproxy = " $http_noproxy "; |
|
| 1192 | + $domain = $host; |
|
| 1193 | + // si le domaine exact www.example.org est dans les exceptions |
|
| 1194 | + if (strpos($http_noproxy, (string) " $domain ") !== false) { |
|
| 1195 | + return ''; |
|
| 1196 | + } |
|
| 1197 | + |
|
| 1198 | + while (strpos($domain, '.') !== false) { |
|
| 1199 | + $domain = explode('.', $domain); |
|
| 1200 | + array_shift($domain); |
|
| 1201 | + $domain = implode('.', $domain); |
|
| 1202 | + |
|
| 1203 | + // ou si un domaine parent commencant par un . est dans les exceptions (indiquant qu'il couvre tous les sous-domaines) |
|
| 1204 | + if (strpos($http_noproxy, (string) " .$domain ") !== false) { |
|
| 1205 | + return ''; |
|
| 1206 | + } |
|
| 1207 | + } |
|
| 1208 | + |
|
| 1209 | + // ok c'est pas une exception |
|
| 1210 | + return $http_proxy; |
|
| 1211 | 1211 | } |
| 1212 | 1212 | |
| 1213 | 1213 | |
@@ -1230,59 +1230,59 @@ discard block |
||
| 1230 | 1230 | * @return array |
| 1231 | 1231 | */ |
| 1232 | 1232 | function init_http($method, $url, $refuse_gz = false, $referer = '', $datas = '', $vers = 'HTTP/1.0', $date = '') { |
| 1233 | - $user = $via_proxy = $proxy_user = ''; |
|
| 1234 | - $fopen = false; |
|
| 1235 | - |
|
| 1236 | - $t = @parse_url($url); |
|
| 1237 | - $host = $t['host']; |
|
| 1238 | - if ($t['scheme'] == 'http') { |
|
| 1239 | - $scheme = 'http'; |
|
| 1240 | - $noproxy = ''; |
|
| 1241 | - } elseif ($t['scheme'] == 'https') { |
|
| 1242 | - $scheme = 'ssl'; |
|
| 1243 | - $noproxy = 'ssl://'; |
|
| 1244 | - if (!isset($t['port']) || !($port = $t['port'])) { |
|
| 1245 | - $t['port'] = 443; |
|
| 1246 | - } |
|
| 1247 | - } else { |
|
| 1248 | - $scheme = $t['scheme']; |
|
| 1249 | - $noproxy = $scheme . '://'; |
|
| 1250 | - } |
|
| 1251 | - if (isset($t['user'])) { |
|
| 1252 | - $user = [$t['user'], $t['pass']]; |
|
| 1253 | - } |
|
| 1254 | - |
|
| 1255 | - if (!isset($t['port']) || !($port = $t['port'])) { |
|
| 1256 | - $port = 80; |
|
| 1257 | - } |
|
| 1258 | - if (!isset($t['path']) || !($path = $t['path'])) { |
|
| 1259 | - $path = '/'; |
|
| 1260 | - } |
|
| 1261 | - |
|
| 1262 | - if (!empty($t['query'])) { |
|
| 1263 | - $path .= '?' . $t['query']; |
|
| 1264 | - } |
|
| 1265 | - |
|
| 1266 | - $f = lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $refuse_gz, $referer, $datas, $vers, $date); |
|
| 1267 | - if (!$f or !is_resource($f)) { |
|
| 1268 | - // fallback : fopen si on a pas fait timeout dans lance_requete |
|
| 1269 | - // ce qui correspond a $f===110 |
|
| 1270 | - if ( |
|
| 1271 | - $f !== 110 |
|
| 1272 | - and !need_proxy($host) |
|
| 1273 | - and !_request('tester_proxy') |
|
| 1274 | - and (!isset($GLOBALS['inc_distant_allow_fopen']) or $GLOBALS['inc_distant_allow_fopen']) |
|
| 1275 | - ) { |
|
| 1276 | - $f = @fopen($url, 'rb'); |
|
| 1277 | - spip_log("connexion vers $url par simple fopen", 'distant'); |
|
| 1278 | - $fopen = true; |
|
| 1279 | - } else { |
|
| 1280 | - // echec total |
|
| 1281 | - $f = false; |
|
| 1282 | - } |
|
| 1283 | - } |
|
| 1284 | - |
|
| 1285 | - return [$f, $fopen]; |
|
| 1233 | + $user = $via_proxy = $proxy_user = ''; |
|
| 1234 | + $fopen = false; |
|
| 1235 | + |
|
| 1236 | + $t = @parse_url($url); |
|
| 1237 | + $host = $t['host']; |
|
| 1238 | + if ($t['scheme'] == 'http') { |
|
| 1239 | + $scheme = 'http'; |
|
| 1240 | + $noproxy = ''; |
|
| 1241 | + } elseif ($t['scheme'] == 'https') { |
|
| 1242 | + $scheme = 'ssl'; |
|
| 1243 | + $noproxy = 'ssl://'; |
|
| 1244 | + if (!isset($t['port']) || !($port = $t['port'])) { |
|
| 1245 | + $t['port'] = 443; |
|
| 1246 | + } |
|
| 1247 | + } else { |
|
| 1248 | + $scheme = $t['scheme']; |
|
| 1249 | + $noproxy = $scheme . '://'; |
|
| 1250 | + } |
|
| 1251 | + if (isset($t['user'])) { |
|
| 1252 | + $user = [$t['user'], $t['pass']]; |
|
| 1253 | + } |
|
| 1254 | + |
|
| 1255 | + if (!isset($t['port']) || !($port = $t['port'])) { |
|
| 1256 | + $port = 80; |
|
| 1257 | + } |
|
| 1258 | + if (!isset($t['path']) || !($path = $t['path'])) { |
|
| 1259 | + $path = '/'; |
|
| 1260 | + } |
|
| 1261 | + |
|
| 1262 | + if (!empty($t['query'])) { |
|
| 1263 | + $path .= '?' . $t['query']; |
|
| 1264 | + } |
|
| 1265 | + |
|
| 1266 | + $f = lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $refuse_gz, $referer, $datas, $vers, $date); |
|
| 1267 | + if (!$f or !is_resource($f)) { |
|
| 1268 | + // fallback : fopen si on a pas fait timeout dans lance_requete |
|
| 1269 | + // ce qui correspond a $f===110 |
|
| 1270 | + if ( |
|
| 1271 | + $f !== 110 |
|
| 1272 | + and !need_proxy($host) |
|
| 1273 | + and !_request('tester_proxy') |
|
| 1274 | + and (!isset($GLOBALS['inc_distant_allow_fopen']) or $GLOBALS['inc_distant_allow_fopen']) |
|
| 1275 | + ) { |
|
| 1276 | + $f = @fopen($url, 'rb'); |
|
| 1277 | + spip_log("connexion vers $url par simple fopen", 'distant'); |
|
| 1278 | + $fopen = true; |
|
| 1279 | + } else { |
|
| 1280 | + // echec total |
|
| 1281 | + $f = false; |
|
| 1282 | + } |
|
| 1283 | + } |
|
| 1284 | + |
|
| 1285 | + return [$f, $fopen]; |
|
| 1286 | 1286 | } |
| 1287 | 1287 | |
| 1288 | 1288 | /** |
@@ -1317,124 +1317,124 @@ discard block |
||
| 1317 | 1317 | * resource socket vers l'url demandee |
| 1318 | 1318 | */ |
| 1319 | 1319 | function lance_requete( |
| 1320 | - $method, |
|
| 1321 | - $scheme, |
|
| 1322 | - $user, |
|
| 1323 | - $host, |
|
| 1324 | - $path, |
|
| 1325 | - $port, |
|
| 1326 | - $noproxy, |
|
| 1327 | - $refuse_gz = false, |
|
| 1328 | - $referer = '', |
|
| 1329 | - $datas = '', |
|
| 1330 | - $vers = 'HTTP/1.0', |
|
| 1331 | - $date = '' |
|
| 1320 | + $method, |
|
| 1321 | + $scheme, |
|
| 1322 | + $user, |
|
| 1323 | + $host, |
|
| 1324 | + $path, |
|
| 1325 | + $port, |
|
| 1326 | + $noproxy, |
|
| 1327 | + $refuse_gz = false, |
|
| 1328 | + $referer = '', |
|
| 1329 | + $datas = '', |
|
| 1330 | + $vers = 'HTTP/1.0', |
|
| 1331 | + $date = '' |
|
| 1332 | 1332 | ) { |
| 1333 | 1333 | |
| 1334 | - $proxy_user = ''; |
|
| 1335 | - $http_proxy = need_proxy($host); |
|
| 1336 | - if ($user) { |
|
| 1337 | - $user = urlencode($user[0]) . ':' . urlencode($user[1]); |
|
| 1338 | - } |
|
| 1339 | - |
|
| 1340 | - $connect = ''; |
|
| 1341 | - if ($http_proxy) { |
|
| 1342 | - if (!defined('_PROXY_HTTPS_NOT_VIA_CONNECT') and in_array($scheme, ['tls','ssl'])) { |
|
| 1343 | - $path_host = (!$user ? '' : "$user@") . $host . (($port != 80) ? ":$port" : ''); |
|
| 1344 | - $connect = 'CONNECT ' . $path_host . " $vers\r\n" |
|
| 1345 | - . "Host: $path_host\r\n" |
|
| 1346 | - . "Proxy-Connection: Keep-Alive\r\n"; |
|
| 1347 | - } else { |
|
| 1348 | - $path = (in_array($scheme, ['tls','ssl']) ? 'https://' : "$scheme://") |
|
| 1349 | - . (!$user ? '' : "$user@") |
|
| 1350 | - . "$host" . (($port != 80) ? ":$port" : '') . $path; |
|
| 1351 | - } |
|
| 1352 | - $t2 = @parse_url($http_proxy); |
|
| 1353 | - $first_host = $t2['host']; |
|
| 1354 | - $first_port = ($t2['port'] ?? null) ?: 80; |
|
| 1355 | - if ($t2['user'] ?? null) { |
|
| 1356 | - $proxy_user = base64_encode($t2['user'] . ':' . $t2['pass']); |
|
| 1357 | - } |
|
| 1358 | - } else { |
|
| 1359 | - $first_host = $noproxy . $host; |
|
| 1360 | - $first_port = $port; |
|
| 1361 | - } |
|
| 1362 | - |
|
| 1363 | - if ($connect) { |
|
| 1364 | - $streamContext = stream_context_create([ |
|
| 1365 | - 'ssl' => [ |
|
| 1366 | - 'verify_peer' => false, |
|
| 1367 | - 'allow_self_signed' => true, |
|
| 1368 | - 'SNI_enabled' => true, |
|
| 1369 | - 'peer_name' => $host, |
|
| 1370 | - ] |
|
| 1371 | - ]); |
|
| 1372 | - $f = @stream_socket_client( |
|
| 1373 | - "tcp://$first_host:$first_port", |
|
| 1374 | - $errno, |
|
| 1375 | - $errstr, |
|
| 1376 | - _INC_DISTANT_CONNECT_TIMEOUT, |
|
| 1377 | - STREAM_CLIENT_CONNECT, |
|
| 1378 | - $streamContext |
|
| 1379 | - ); |
|
| 1380 | - spip_log("Recuperer $path sur $first_host:$first_port par $f (via CONNECT)", 'connect'); |
|
| 1381 | - if (!$f) { |
|
| 1382 | - spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR); |
|
| 1383 | - return $errno; |
|
| 1384 | - } |
|
| 1385 | - stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT); |
|
| 1386 | - |
|
| 1387 | - fputs($f, $connect); |
|
| 1388 | - fputs($f, "\r\n"); |
|
| 1389 | - $res = fread($f, 1024); |
|
| 1390 | - if ( |
|
| 1391 | - !$res |
|
| 1392 | - or !count($res = explode(' ', $res)) |
|
| 1393 | - or $res[1] !== '200' |
|
| 1394 | - ) { |
|
| 1395 | - spip_log("Echec CONNECT sur $first_host:$first_port", 'connect' . _LOG_INFO_IMPORTANTE); |
|
| 1396 | - fclose($f); |
|
| 1397 | - |
|
| 1398 | - return false; |
|
| 1399 | - } |
|
| 1400 | - // important, car sinon on lit trop vite et les donnees ne sont pas encore dispo |
|
| 1401 | - stream_set_blocking($f, true); |
|
| 1402 | - // envoyer le handshake |
|
| 1403 | - stream_socket_enable_crypto($f, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT); |
|
| 1404 | - spip_log("OK CONNECT sur $first_host:$first_port", 'connect'); |
|
| 1405 | - } else { |
|
| 1406 | - $ntry = 3; |
|
| 1407 | - do { |
|
| 1408 | - $f = @fsockopen($first_host, $first_port, $errno, $errstr, _INC_DISTANT_CONNECT_TIMEOUT); |
|
| 1409 | - } while (!$f and $ntry-- and $errno !== 110 and sleep(1)); |
|
| 1410 | - spip_log("Recuperer $path sur $first_host:$first_port par $f"); |
|
| 1411 | - if (!$f) { |
|
| 1412 | - spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR); |
|
| 1413 | - |
|
| 1414 | - return $errno; |
|
| 1415 | - } |
|
| 1416 | - stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT); |
|
| 1417 | - } |
|
| 1418 | - |
|
| 1419 | - $site = $GLOBALS['meta']['adresse_site'] ?? ''; |
|
| 1420 | - |
|
| 1421 | - $host_port = $host; |
|
| 1422 | - if ($port != (in_array($scheme, ['tls','ssl']) ? 443 : 80)) { |
|
| 1423 | - $host_port .= ":$port"; |
|
| 1424 | - } |
|
| 1425 | - $req = "$method $path $vers\r\n" |
|
| 1426 | - . "Host: $host_port\r\n" |
|
| 1427 | - . 'User-Agent: ' . _INC_DISTANT_USER_AGENT . "\r\n" |
|
| 1428 | - . ($refuse_gz ? '' : ('Accept-Encoding: ' . _INC_DISTANT_CONTENT_ENCODING . "\r\n")) |
|
| 1429 | - . (!$site ? '' : "Referer: $site/$referer\r\n") |
|
| 1430 | - . (!$date ? '' : 'If-Modified-Since: ' . (gmdate('D, d M Y H:i:s', $date) . " GMT\r\n")) |
|
| 1431 | - . (!$user ? '' : ('Authorization: Basic ' . base64_encode($user) . "\r\n")) |
|
| 1432 | - . (!$proxy_user ? '' : "Proxy-Authorization: Basic $proxy_user\r\n") |
|
| 1433 | - . (!strpos($vers, '1.1') ? '' : "Keep-Alive: 300\r\nConnection: keep-alive\r\n"); |
|
| 1334 | + $proxy_user = ''; |
|
| 1335 | + $http_proxy = need_proxy($host); |
|
| 1336 | + if ($user) { |
|
| 1337 | + $user = urlencode($user[0]) . ':' . urlencode($user[1]); |
|
| 1338 | + } |
|
| 1339 | + |
|
| 1340 | + $connect = ''; |
|
| 1341 | + if ($http_proxy) { |
|
| 1342 | + if (!defined('_PROXY_HTTPS_NOT_VIA_CONNECT') and in_array($scheme, ['tls','ssl'])) { |
|
| 1343 | + $path_host = (!$user ? '' : "$user@") . $host . (($port != 80) ? ":$port" : ''); |
|
| 1344 | + $connect = 'CONNECT ' . $path_host . " $vers\r\n" |
|
| 1345 | + . "Host: $path_host\r\n" |
|
| 1346 | + . "Proxy-Connection: Keep-Alive\r\n"; |
|
| 1347 | + } else { |
|
| 1348 | + $path = (in_array($scheme, ['tls','ssl']) ? 'https://' : "$scheme://") |
|
| 1349 | + . (!$user ? '' : "$user@") |
|
| 1350 | + . "$host" . (($port != 80) ? ":$port" : '') . $path; |
|
| 1351 | + } |
|
| 1352 | + $t2 = @parse_url($http_proxy); |
|
| 1353 | + $first_host = $t2['host']; |
|
| 1354 | + $first_port = ($t2['port'] ?? null) ?: 80; |
|
| 1355 | + if ($t2['user'] ?? null) { |
|
| 1356 | + $proxy_user = base64_encode($t2['user'] . ':' . $t2['pass']); |
|
| 1357 | + } |
|
| 1358 | + } else { |
|
| 1359 | + $first_host = $noproxy . $host; |
|
| 1360 | + $first_port = $port; |
|
| 1361 | + } |
|
| 1362 | + |
|
| 1363 | + if ($connect) { |
|
| 1364 | + $streamContext = stream_context_create([ |
|
| 1365 | + 'ssl' => [ |
|
| 1366 | + 'verify_peer' => false, |
|
| 1367 | + 'allow_self_signed' => true, |
|
| 1368 | + 'SNI_enabled' => true, |
|
| 1369 | + 'peer_name' => $host, |
|
| 1370 | + ] |
|
| 1371 | + ]); |
|
| 1372 | + $f = @stream_socket_client( |
|
| 1373 | + "tcp://$first_host:$first_port", |
|
| 1374 | + $errno, |
|
| 1375 | + $errstr, |
|
| 1376 | + _INC_DISTANT_CONNECT_TIMEOUT, |
|
| 1377 | + STREAM_CLIENT_CONNECT, |
|
| 1378 | + $streamContext |
|
| 1379 | + ); |
|
| 1380 | + spip_log("Recuperer $path sur $first_host:$first_port par $f (via CONNECT)", 'connect'); |
|
| 1381 | + if (!$f) { |
|
| 1382 | + spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR); |
|
| 1383 | + return $errno; |
|
| 1384 | + } |
|
| 1385 | + stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT); |
|
| 1386 | + |
|
| 1387 | + fputs($f, $connect); |
|
| 1388 | + fputs($f, "\r\n"); |
|
| 1389 | + $res = fread($f, 1024); |
|
| 1390 | + if ( |
|
| 1391 | + !$res |
|
| 1392 | + or !count($res = explode(' ', $res)) |
|
| 1393 | + or $res[1] !== '200' |
|
| 1394 | + ) { |
|
| 1395 | + spip_log("Echec CONNECT sur $first_host:$first_port", 'connect' . _LOG_INFO_IMPORTANTE); |
|
| 1396 | + fclose($f); |
|
| 1397 | + |
|
| 1398 | + return false; |
|
| 1399 | + } |
|
| 1400 | + // important, car sinon on lit trop vite et les donnees ne sont pas encore dispo |
|
| 1401 | + stream_set_blocking($f, true); |
|
| 1402 | + // envoyer le handshake |
|
| 1403 | + stream_socket_enable_crypto($f, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT); |
|
| 1404 | + spip_log("OK CONNECT sur $first_host:$first_port", 'connect'); |
|
| 1405 | + } else { |
|
| 1406 | + $ntry = 3; |
|
| 1407 | + do { |
|
| 1408 | + $f = @fsockopen($first_host, $first_port, $errno, $errstr, _INC_DISTANT_CONNECT_TIMEOUT); |
|
| 1409 | + } while (!$f and $ntry-- and $errno !== 110 and sleep(1)); |
|
| 1410 | + spip_log("Recuperer $path sur $first_host:$first_port par $f"); |
|
| 1411 | + if (!$f) { |
|
| 1412 | + spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR); |
|
| 1413 | + |
|
| 1414 | + return $errno; |
|
| 1415 | + } |
|
| 1416 | + stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT); |
|
| 1417 | + } |
|
| 1418 | + |
|
| 1419 | + $site = $GLOBALS['meta']['adresse_site'] ?? ''; |
|
| 1420 | + |
|
| 1421 | + $host_port = $host; |
|
| 1422 | + if ($port != (in_array($scheme, ['tls','ssl']) ? 443 : 80)) { |
|
| 1423 | + $host_port .= ":$port"; |
|
| 1424 | + } |
|
| 1425 | + $req = "$method $path $vers\r\n" |
|
| 1426 | + . "Host: $host_port\r\n" |
|
| 1427 | + . 'User-Agent: ' . _INC_DISTANT_USER_AGENT . "\r\n" |
|
| 1428 | + . ($refuse_gz ? '' : ('Accept-Encoding: ' . _INC_DISTANT_CONTENT_ENCODING . "\r\n")) |
|
| 1429 | + . (!$site ? '' : "Referer: $site/$referer\r\n") |
|
| 1430 | + . (!$date ? '' : 'If-Modified-Since: ' . (gmdate('D, d M Y H:i:s', $date) . " GMT\r\n")) |
|
| 1431 | + . (!$user ? '' : ('Authorization: Basic ' . base64_encode($user) . "\r\n")) |
|
| 1432 | + . (!$proxy_user ? '' : "Proxy-Authorization: Basic $proxy_user\r\n") |
|
| 1433 | + . (!strpos($vers, '1.1') ? '' : "Keep-Alive: 300\r\nConnection: keep-alive\r\n"); |
|
| 1434 | 1434 | |
| 1435 | 1435 | # spip_log("Requete\n$req", 'distant'); |
| 1436 | - fputs($f, $req); |
|
| 1437 | - fputs($f, $datas ?: "\r\n"); |
|
| 1436 | + fputs($f, $req); |
|
| 1437 | + fputs($f, $datas ?: "\r\n"); |
|
| 1438 | 1438 | |
| 1439 | - return $f; |
|
| 1439 | + return $f; |
|
| 1440 | 1440 | } |
@@ -27,7 +27,7 @@ discard block |
||
| 27 | 27 | define('_INC_DISTANT_CONTENT_ENCODING', 'gzip'); |
| 28 | 28 | } |
| 29 | 29 | if (!defined('_INC_DISTANT_USER_AGENT')) { |
| 30 | - define('_INC_DISTANT_USER_AGENT', 'SPIP-' . $GLOBALS['spip_version_affichee'] . ' (' . $GLOBALS['home_server'] . ')'); |
|
| 30 | + define('_INC_DISTANT_USER_AGENT', 'SPIP-'.$GLOBALS['spip_version_affichee'].' ('.$GLOBALS['home_server'].')'); |
|
| 31 | 31 | } |
| 32 | 32 | if (!defined('_INC_DISTANT_MAX_SIZE')) { |
| 33 | 33 | define('_INC_DISTANT_MAX_SIZE', 2_097_152); |
@@ -36,7 +36,7 @@ discard block |
||
| 36 | 36 | define('_INC_DISTANT_CONNECT_TIMEOUT', 10); |
| 37 | 37 | } |
| 38 | 38 | |
| 39 | -define('_REGEXP_COPIE_LOCALE', ',' . |
|
| 39 | +define('_REGEXP_COPIE_LOCALE', ','. |
|
| 40 | 40 | preg_replace( |
| 41 | 41 | '@^https?:@', |
| 42 | 42 | 'https?:', |
@@ -73,7 +73,7 @@ discard block |
||
| 73 | 73 | |
| 74 | 74 | // si c'est la protection de soi-meme, retourner le path |
| 75 | 75 | if ($mode !== 'force' and preg_match(_REGEXP_COPIE_LOCALE, $source, $match)) { |
| 76 | - $source = substr(_DIR_IMG, strlen(_DIR_RACINE)) . urldecode($match[1]); |
|
| 76 | + $source = substr(_DIR_IMG, strlen(_DIR_RACINE)).urldecode($match[1]); |
|
| 77 | 77 | |
| 78 | 78 | return @file_exists($source) ? $source : false; |
| 79 | 79 | } |
@@ -93,7 +93,7 @@ discard block |
||
| 93 | 93 | return false; |
| 94 | 94 | } |
| 95 | 95 | |
| 96 | - $localrac = _DIR_RACINE . $local; |
|
| 96 | + $localrac = _DIR_RACINE.$local; |
|
| 97 | 97 | $t = ($mode === 'force') ? false : @file_exists($localrac); |
| 98 | 98 | |
| 99 | 99 | // test d'existence du fichier |
@@ -113,18 +113,18 @@ discard block |
||
| 113 | 113 | if (!$taille_max) { |
| 114 | 114 | $taille_max = _COPIE_LOCALE_MAX_SIZE; |
| 115 | 115 | } |
| 116 | - $localrac_tmp = $localrac . '.tmp'; |
|
| 116 | + $localrac_tmp = $localrac.'.tmp'; |
|
| 117 | 117 | $res = recuperer_url( |
| 118 | 118 | $source, |
| 119 | 119 | ['file' => $localrac_tmp, 'taille_max' => $taille_max, 'if_modified_since' => $t ? filemtime($localrac) : ''] |
| 120 | 120 | ); |
| 121 | 121 | |
| 122 | 122 | if (!$res or (!$res['length'] and $res['status'] != 304)) { |
| 123 | - spip_log("copie_locale : Echec recuperation $source sur $localrac_tmp status : " . ($res ? $res['status'] : '-'), 'distant' . _LOG_INFO_IMPORTANTE); |
|
| 123 | + spip_log("copie_locale : Echec recuperation $source sur $localrac_tmp status : ".($res ? $res['status'] : '-'), 'distant'._LOG_INFO_IMPORTANTE); |
|
| 124 | 124 | @unlink($localrac_tmp); |
| 125 | 125 | } |
| 126 | 126 | else { |
| 127 | - spip_log("copie_locale : recuperation $source sur $localrac_tmp OK | taille " . $res['length'] . ' status ' . $res['status'], 'distant'); |
|
| 127 | + spip_log("copie_locale : recuperation $source sur $localrac_tmp OK | taille ".$res['length'].' status '.$res['status'], 'distant'); |
|
| 128 | 128 | } |
| 129 | 129 | if (!$res or !$res['length']) { |
| 130 | 130 | // si $t c'est sans doute juste un not-modified-since |
@@ -137,7 +137,7 @@ discard block |
||
| 137 | 137 | and is_callable($callback_valider_url) |
| 138 | 138 | and !$callback_valider_url($res['url']) |
| 139 | 139 | ) { |
| 140 | - spip_log('copie_locale : url finale ' . $res['url'] . " non valide, on refuse le fichier $localrac_tmp", 'distant' . _LOG_INFO_IMPORTANTE); |
|
| 140 | + spip_log('copie_locale : url finale '.$res['url']." non valide, on refuse le fichier $localrac_tmp", 'distant'._LOG_INFO_IMPORTANTE); |
|
| 141 | 141 | @unlink($localrac_tmp); |
| 142 | 142 | return $t ? $local : false; |
| 143 | 143 | } |
@@ -228,7 +228,7 @@ discard block |
||
| 228 | 228 | |
| 229 | 229 | if (!$is_known_host) { |
| 230 | 230 | $host = trim($parsed_url['host'], '.'); |
| 231 | - if (! $ip = filter_var($host, FILTER_VALIDATE_IP)) { |
|
| 231 | + if (!$ip = filter_var($host, FILTER_VALIDATE_IP)) { |
|
| 232 | 232 | $ip = gethostbyname($host); |
| 233 | 233 | if ($ip === $host) { |
| 234 | 234 | // Error condition for gethostbyname() |
@@ -249,7 +249,7 @@ discard block |
||
| 249 | 249 | } |
| 250 | 250 | } |
| 251 | 251 | if ($ip) { |
| 252 | - if (! filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { |
|
| 252 | + if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { |
|
| 253 | 253 | return false; |
| 254 | 254 | } |
| 255 | 255 | } |
@@ -260,7 +260,7 @@ discard block |
||
| 260 | 260 | } |
| 261 | 261 | |
| 262 | 262 | $port = $parsed_url['port']; |
| 263 | - if ($port === 80 or $port === 443 or $port === 8080) { |
|
| 263 | + if ($port === 80 or $port === 443 or $port === 8080) { |
|
| 264 | 264 | return $url; |
| 265 | 265 | } |
| 266 | 266 | |
@@ -330,7 +330,7 @@ discard block |
||
| 330 | 330 | } |
| 331 | 331 | } |
| 332 | 332 | if ($taille > 500) { |
| 333 | - $boundary = substr(md5(random_int(0, mt_getrandmax()) . 'spip'), 0, 8); |
|
| 333 | + $boundary = substr(md5(random_int(0, mt_getrandmax()).'spip'), 0, 8); |
|
| 334 | 334 | } |
| 335 | 335 | } |
| 336 | 336 | |
@@ -358,16 +358,16 @@ discard block |
||
| 358 | 358 | } |
| 359 | 359 | } else { |
| 360 | 360 | // fabrique une chaine HTTP simple pour un POST |
| 361 | - $entete = 'Content-Type: application/x-www-form-urlencoded' . "\r\n"; |
|
| 361 | + $entete = 'Content-Type: application/x-www-form-urlencoded'."\r\n"; |
|
| 362 | 362 | $chaine = []; |
| 363 | 363 | if (is_array($donnees)) { |
| 364 | 364 | foreach ($donnees as $cle => $valeur) { |
| 365 | 365 | if (is_array($valeur)) { |
| 366 | 366 | foreach ($valeur as $val2) { |
| 367 | - $chaine[] = rawurlencode($cle) . '[]=' . rawurlencode($val2); |
|
| 367 | + $chaine[] = rawurlencode($cle).'[]='.rawurlencode($val2); |
|
| 368 | 368 | } |
| 369 | 369 | } else { |
| 370 | - $chaine[] = rawurlencode($cle) . '=' . rawurlencode($valeur); |
|
| 370 | + $chaine[] = rawurlencode($cle).'='.rawurlencode($valeur); |
|
| 371 | 371 | } |
| 372 | 372 | } |
| 373 | 373 | $chaine = implode('&', $chaine); |
@@ -468,13 +468,13 @@ discard block |
||
| 468 | 468 | $options['taille_max'] = $copy ? _COPIE_LOCALE_MAX_SIZE : _INC_DISTANT_MAX_SIZE; |
| 469 | 469 | } |
| 470 | 470 | |
| 471 | - spip_log('recuperer_url ' . $options['methode'] . " sur $url", 'distant' . _LOG_DEBUG); |
|
| 471 | + spip_log('recuperer_url '.$options['methode']." sur $url", 'distant'._LOG_DEBUG); |
|
| 472 | 472 | |
| 473 | 473 | // Ajout des en-têtes spécifiques si besoin |
| 474 | 474 | $formatted_data = ''; |
| 475 | 475 | if (!empty($options['headers'])) { |
| 476 | 476 | foreach ($options['headers'] as $champ => $valeur) { |
| 477 | - $formatted_data .= $champ . ': ' . $valeur . "\r\n"; |
|
| 477 | + $formatted_data .= $champ.': '.$valeur."\r\n"; |
|
| 478 | 478 | } |
| 479 | 479 | } |
| 480 | 480 | |
@@ -482,9 +482,9 @@ discard block |
||
| 482 | 482 | [$head, $postdata] = prepare_donnees_post($options['datas'], $options['boundary']); |
| 483 | 483 | $head .= $formatted_data; |
| 484 | 484 | if (stripos($head, 'Content-Length:') === false) { |
| 485 | - $head .= 'Content-Length: ' . strlen($postdata) . "\r\n"; |
|
| 485 | + $head .= 'Content-Length: '.strlen($postdata)."\r\n"; |
|
| 486 | 486 | } |
| 487 | - $formatted_data = $head . "\r\n" . $postdata; |
|
| 487 | + $formatted_data = $head."\r\n".$postdata; |
|
| 488 | 488 | if ( |
| 489 | 489 | strlen($postdata) |
| 490 | 490 | and !$methode_demandee |
@@ -498,9 +498,9 @@ discard block |
||
| 498 | 498 | // Accepter les URLs au format feed:// ou qui ont oublie le http:// ou les urls relatives au protocole |
| 499 | 499 | $url = preg_replace(',^feed://,i', 'http://', $url); |
| 500 | 500 | if (!tester_url_absolue($url)) { |
| 501 | - $url = 'http://' . $url; |
|
| 501 | + $url = 'http://'.$url; |
|
| 502 | 502 | } elseif (strncmp($url, '//', 2) == 0) { |
| 503 | - $url = 'http:' . $url; |
|
| 503 | + $url = 'http:'.$url; |
|
| 504 | 504 | } |
| 505 | 505 | |
| 506 | 506 | $url = url_to_ascii($url); |
@@ -529,7 +529,7 @@ discard block |
||
| 529 | 529 | $options['if_modified_since'] |
| 530 | 530 | ); |
| 531 | 531 | if (!$handle) { |
| 532 | - spip_log("ECHEC init_http $url", 'distant' . _LOG_ERREUR); |
|
| 532 | + spip_log("ECHEC init_http $url", 'distant'._LOG_ERREUR); |
|
| 533 | 533 | |
| 534 | 534 | return false; |
| 535 | 535 | } |
@@ -559,7 +559,7 @@ discard block |
||
| 559 | 559 | 'status' => 200, |
| 560 | 560 | ]; |
| 561 | 561 | } else { |
| 562 | - spip_log("ECHEC chinoiserie $url", 'distant' . _LOG_ERREUR); |
|
| 562 | + spip_log("ECHEC chinoiserie $url", 'distant'._LOG_ERREUR); |
|
| 563 | 563 | return false; |
| 564 | 564 | } |
| 565 | 565 | } elseif ($res['location'] and $options['follow_location']) { |
@@ -575,11 +575,11 @@ discard block |
||
| 575 | 575 | $options['datas'] = ''; |
| 576 | 576 | } |
| 577 | 577 | } |
| 578 | - spip_log('recuperer_url recommence ' . $options['methode'] . " sur $url", 'distant' . _LOG_DEBUG); |
|
| 578 | + spip_log('recuperer_url recommence '.$options['methode']." sur $url", 'distant'._LOG_DEBUG); |
|
| 579 | 579 | |
| 580 | 580 | return recuperer_url($url, $options); |
| 581 | 581 | } elseif ($res['status'] !== 200) { |
| 582 | - spip_log('HTTP status ' . $res['status'] . " pour $url", 'distant'); |
|
| 582 | + spip_log('HTTP status '.$res['status']." pour $url", 'distant'); |
|
| 583 | 583 | } |
| 584 | 584 | $result['status'] = $res['status']; |
| 585 | 585 | if (isset($res['headers'])) { |
@@ -595,7 +595,7 @@ discard block |
||
| 595 | 595 | |
| 596 | 596 | // on ne veut que les entetes |
| 597 | 597 | if (!$options['taille_max'] or $options['methode'] == 'HEAD' or $result['status'] == '304') { |
| 598 | - spip_log('RESULTAT recuperer_url ' . $options['methode'] . " sur $url : " . json_encode($result), 'distant' . _LOG_DEBUG); |
|
| 598 | + spip_log('RESULTAT recuperer_url '.$options['methode']." sur $url : ".json_encode($result), 'distant'._LOG_DEBUG); |
|
| 599 | 599 | return $result; |
| 600 | 600 | } |
| 601 | 601 | |
@@ -605,7 +605,7 @@ discard block |
||
| 605 | 605 | |
| 606 | 606 | $gz = false; |
| 607 | 607 | if (preg_match(",\bContent-Encoding: .*gzip,is", $result['headers'])) { |
| 608 | - $gz = (_DIR_TMP . md5(uniqid(random_int(0, mt_getrandmax()))) . '.tmp.gz'); |
|
| 608 | + $gz = (_DIR_TMP.md5(uniqid(random_int(0, mt_getrandmax()))).'.tmp.gz'); |
|
| 609 | 609 | } |
| 610 | 610 | |
| 611 | 611 | // si on a pas deja recuperer le contenu par une methode detournee |
@@ -641,7 +641,7 @@ discard block |
||
| 641 | 641 | |
| 642 | 642 | $trace = json_decode(json_encode($result), true); |
| 643 | 643 | $trace['page'] = '...'; |
| 644 | - spip_log('RESULTAT recuperer_url ' . $options['methode'] . " sur $url : " . json_encode($trace), 'distant' . _LOG_DEBUG); |
|
| 644 | + spip_log('RESULTAT recuperer_url '.$options['methode']." sur $url : ".json_encode($trace), 'distant'._LOG_DEBUG); |
|
| 645 | 645 | |
| 646 | 646 | return $result; |
| 647 | 647 | } |
@@ -695,7 +695,7 @@ discard block |
||
| 695 | 695 | $sig['url'] = $url; |
| 696 | 696 | |
| 697 | 697 | $dir = sous_repertoire(_DIR_CACHE, 'curl'); |
| 698 | - $cache = md5(serialize($sig)) . '-' . substr(preg_replace(',\W+,', '_', $url), 0, 80); |
|
| 698 | + $cache = md5(serialize($sig)).'-'.substr(preg_replace(',\W+,', '_', $url), 0, 80); |
|
| 699 | 699 | $sub = sous_repertoire($dir, substr($cache, 0, 2)); |
| 700 | 700 | $cache = "$sub$cache"; |
| 701 | 701 | |
@@ -749,7 +749,7 @@ discard block |
||
| 749 | 749 | $fp = false; |
| 750 | 750 | if ($fichier) { |
| 751 | 751 | include_spip('inc/acces'); |
| 752 | - $tmpfile = "$fichier." . creer_uniqid() . '.tmp'; |
|
| 752 | + $tmpfile = "$fichier.".creer_uniqid().'.tmp'; |
|
| 753 | 753 | $fp = spip_fopen_lock($tmpfile, 'w', LOCK_EX); |
| 754 | 754 | if (!$fp and file_exists($fichier)) { |
| 755 | 755 | return filesize($fichier); |
@@ -808,7 +808,7 @@ discard block |
||
| 808 | 808 | } |
| 809 | 809 | $result['status'] = intval($r[1]); |
| 810 | 810 | while ($s = trim(fgets($handle, 16384))) { |
| 811 | - $result['headers'][] = $s . "\n"; |
|
| 811 | + $result['headers'][] = $s."\n"; |
|
| 812 | 812 | preg_match(',^([^:]*): *(.*)$,i', $s, $r); |
| 813 | 813 | [, $d, $v] = $r; |
| 814 | 814 | if (strtolower(trim($d)) == 'location' and $result['status'] >= 300 and $result['status'] < 400) { |
@@ -857,13 +857,13 @@ discard block |
||
| 857 | 857 | |
| 858 | 858 | // on se place tout le temps comme si on etait a la racine |
| 859 | 859 | if (_DIR_RACINE) { |
| 860 | - $d = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $d); |
|
| 860 | + $d = preg_replace(',^'.preg_quote(_DIR_RACINE).',', '', $d); |
|
| 861 | 861 | } |
| 862 | 862 | |
| 863 | 863 | $m = md5($source); |
| 864 | 864 | |
| 865 | 865 | return $d |
| 866 | - . substr(preg_replace(',[^\w-],', '', basename($source)) . '-' . $m, 0, 12) |
|
| 866 | + . substr(preg_replace(',[^\w-],', '', basename($source)).'-'.$m, 0, 12) |
|
| 867 | 867 | . substr($m, 0, 4) |
| 868 | 868 | . ".$extension"; |
| 869 | 869 | } |
@@ -887,7 +887,7 @@ discard block |
||
| 887 | 887 | // Si c'est deja local pas de souci |
| 888 | 888 | if (!tester_url_absolue($source)) { |
| 889 | 889 | if (_DIR_RACINE) { |
| 890 | - $source = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $source); |
|
| 890 | + $source = preg_replace(',^'.preg_quote(_DIR_RACINE).',', '', $source); |
|
| 891 | 891 | } |
| 892 | 892 | |
| 893 | 893 | return $source; |
@@ -905,7 +905,7 @@ discard block |
||
| 905 | 905 | $ext |
| 906 | 906 | and preg_match(',^\w+$,', $ext) // pas de php?truc=1&... |
| 907 | 907 | and $f = nom_fichier_copie_locale($source, $ext) |
| 908 | - and file_exists(_DIR_RACINE . $f) |
|
| 908 | + and file_exists(_DIR_RACINE.$f) |
|
| 909 | 909 | ) { |
| 910 | 910 | return $f; |
| 911 | 911 | } |
@@ -913,7 +913,7 @@ discard block |
||
| 913 | 913 | |
| 914 | 914 | // Si c'est deja dans la table des documents, |
| 915 | 915 | // ramener le nom de sa copie potentielle |
| 916 | - $ext = sql_getfetsel('extension', 'spip_documents', 'fichier=' . sql_quote($source) . " AND distant='oui' AND extension <> ''"); |
|
| 916 | + $ext = sql_getfetsel('extension', 'spip_documents', 'fichier='.sql_quote($source)." AND distant='oui' AND extension <> ''"); |
|
| 917 | 917 | |
| 918 | 918 | if ($ext) { |
| 919 | 919 | return nom_fichier_copie_locale($source, $ext); |
@@ -924,9 +924,9 @@ discard block |
||
| 924 | 924 | |
| 925 | 925 | $ext = $path_parts ? $path_parts['extension'] : ''; |
| 926 | 926 | |
| 927 | - if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) { |
|
| 927 | + if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension='.sql_quote($ext))) { |
|
| 928 | 928 | $f = nom_fichier_copie_locale($source, $ext); |
| 929 | - if (file_exists(_DIR_RACINE . $f)) { |
|
| 929 | + if (file_exists(_DIR_RACINE.$f)) { |
|
| 930 | 930 | return $f; |
| 931 | 931 | } |
| 932 | 932 | } |
@@ -934,7 +934,7 @@ discard block |
||
| 934 | 934 | // Ping pour voir si son extension est connue et autorisee |
| 935 | 935 | // avec mise en cache du resultat du ping |
| 936 | 936 | |
| 937 | - $cache = sous_repertoire(_DIR_CACHE, 'rid') . md5($source); |
|
| 937 | + $cache = sous_repertoire(_DIR_CACHE, 'rid').md5($source); |
|
| 938 | 938 | if ( |
| 939 | 939 | !@file_exists($cache) |
| 940 | 940 | or !$path_parts = @unserialize(spip_file_get_contents($cache)) |
@@ -944,11 +944,11 @@ discard block |
||
| 944 | 944 | ecrire_fichier($cache, serialize($path_parts)); |
| 945 | 945 | } |
| 946 | 946 | $ext = !empty($path_parts['extension']) ? $path_parts['extension'] : ''; |
| 947 | - if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension=' . sql_quote($ext))) { |
|
| 947 | + if ($ext and sql_getfetsel('extension', 'spip_types_documents', 'extension='.sql_quote($ext))) { |
|
| 948 | 948 | return nom_fichier_copie_locale($source, $ext); |
| 949 | 949 | } |
| 950 | 950 | |
| 951 | - spip_log("pas de copie locale pour $source", 'distant' . _LOG_ERREUR); |
|
| 951 | + spip_log("pas de copie locale pour $source", 'distant'._LOG_ERREUR); |
|
| 952 | 952 | return null; |
| 953 | 953 | } |
| 954 | 954 | |
@@ -1047,7 +1047,7 @@ discard block |
||
| 1047 | 1047 | } else { |
| 1048 | 1048 | if ($a['body']) { |
| 1049 | 1049 | $a['extension'] = $extension; |
| 1050 | - $a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $extension); |
|
| 1050 | + $a['fichier'] = _DIR_RACINE.nom_fichier_copie_locale($source, $extension); |
|
| 1051 | 1051 | ecrire_fichier($a['fichier'], $a['body']); |
| 1052 | 1052 | $size_image = @spip_getimagesize($a['fichier']); |
| 1053 | 1053 | $a['largeur'] = intval($size_image[0]); |
@@ -1115,20 +1115,20 @@ discard block |
||
| 1115 | 1115 | !$t |
| 1116 | 1116 | and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext) |
| 1117 | 1117 | ) { |
| 1118 | - $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1118 | + $t = sql_fetsel('extension', 'spip_types_documents', 'extension='.sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1119 | 1119 | } |
| 1120 | 1120 | if ( |
| 1121 | 1121 | !$t |
| 1122 | 1122 | and preg_match(',^Content-Disposition:\s*attachment;\s*filename=(.*)$,Uims', $headers, $m) |
| 1123 | 1123 | and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $m[1], $rext) |
| 1124 | 1124 | ) { |
| 1125 | - $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1125 | + $t = sql_fetsel('extension', 'spip_types_documents', 'extension='.sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1126 | 1126 | } |
| 1127 | 1127 | } |
| 1128 | 1128 | |
| 1129 | 1129 | // Autre mime/type (ou text/plain avec fichier d'extension inconnue) |
| 1130 | 1130 | if (!$t) { |
| 1131 | - $t = sql_fetsel('extension', 'spip_types_documents', 'mime_type=' . sql_quote($mime_type)); |
|
| 1131 | + $t = sql_fetsel('extension', 'spip_types_documents', 'mime_type='.sql_quote($mime_type)); |
|
| 1132 | 1132 | } |
| 1133 | 1133 | |
| 1134 | 1134 | // Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg) |
@@ -1139,11 +1139,11 @@ discard block |
||
| 1139 | 1139 | and preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext) |
| 1140 | 1140 | ) { |
| 1141 | 1141 | # eviter xxx.3 => 3gp (> SPIP 3) |
| 1142 | - $t = sql_fetsel('extension', 'spip_types_documents', 'extension=' . sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1142 | + $t = sql_fetsel('extension', 'spip_types_documents', 'extension='.sql_quote(corriger_extension($rext[1]), '', 'text')); |
|
| 1143 | 1143 | } |
| 1144 | 1144 | |
| 1145 | 1145 | if ($t) { |
| 1146 | - spip_log("mime-type $mime_type ok, extension " . $t['extension'], 'distant'); |
|
| 1146 | + spip_log("mime-type $mime_type ok, extension ".$t['extension'], 'distant'); |
|
| 1147 | 1147 | return $t['extension']; |
| 1148 | 1148 | } else { |
| 1149 | 1149 | # par defaut on retombe sur '.bin' si c'est autorise |
@@ -1246,7 +1246,7 @@ discard block |
||
| 1246 | 1246 | } |
| 1247 | 1247 | } else { |
| 1248 | 1248 | $scheme = $t['scheme']; |
| 1249 | - $noproxy = $scheme . '://'; |
|
| 1249 | + $noproxy = $scheme.'://'; |
|
| 1250 | 1250 | } |
| 1251 | 1251 | if (isset($t['user'])) { |
| 1252 | 1252 | $user = [$t['user'], $t['pass']]; |
@@ -1260,7 +1260,7 @@ discard block |
||
| 1260 | 1260 | } |
| 1261 | 1261 | |
| 1262 | 1262 | if (!empty($t['query'])) { |
| 1263 | - $path .= '?' . $t['query']; |
|
| 1263 | + $path .= '?'.$t['query']; |
|
| 1264 | 1264 | } |
| 1265 | 1265 | |
| 1266 | 1266 | $f = lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $refuse_gz, $referer, $datas, $vers, $date); |
@@ -1334,29 +1334,29 @@ discard block |
||
| 1334 | 1334 | $proxy_user = ''; |
| 1335 | 1335 | $http_proxy = need_proxy($host); |
| 1336 | 1336 | if ($user) { |
| 1337 | - $user = urlencode($user[0]) . ':' . urlencode($user[1]); |
|
| 1337 | + $user = urlencode($user[0]).':'.urlencode($user[1]); |
|
| 1338 | 1338 | } |
| 1339 | 1339 | |
| 1340 | 1340 | $connect = ''; |
| 1341 | 1341 | if ($http_proxy) { |
| 1342 | - if (!defined('_PROXY_HTTPS_NOT_VIA_CONNECT') and in_array($scheme, ['tls','ssl'])) { |
|
| 1343 | - $path_host = (!$user ? '' : "$user@") . $host . (($port != 80) ? ":$port" : ''); |
|
| 1344 | - $connect = 'CONNECT ' . $path_host . " $vers\r\n" |
|
| 1342 | + if (!defined('_PROXY_HTTPS_NOT_VIA_CONNECT') and in_array($scheme, ['tls', 'ssl'])) { |
|
| 1343 | + $path_host = (!$user ? '' : "$user@").$host.(($port != 80) ? ":$port" : ''); |
|
| 1344 | + $connect = 'CONNECT '.$path_host." $vers\r\n" |
|
| 1345 | 1345 | . "Host: $path_host\r\n" |
| 1346 | 1346 | . "Proxy-Connection: Keep-Alive\r\n"; |
| 1347 | 1347 | } else { |
| 1348 | - $path = (in_array($scheme, ['tls','ssl']) ? 'https://' : "$scheme://") |
|
| 1348 | + $path = (in_array($scheme, ['tls', 'ssl']) ? 'https://' : "$scheme://") |
|
| 1349 | 1349 | . (!$user ? '' : "$user@") |
| 1350 | - . "$host" . (($port != 80) ? ":$port" : '') . $path; |
|
| 1350 | + . "$host".(($port != 80) ? ":$port" : '').$path; |
|
| 1351 | 1351 | } |
| 1352 | 1352 | $t2 = @parse_url($http_proxy); |
| 1353 | 1353 | $first_host = $t2['host']; |
| 1354 | 1354 | $first_port = ($t2['port'] ?? null) ?: 80; |
| 1355 | 1355 | if ($t2['user'] ?? null) { |
| 1356 | - $proxy_user = base64_encode($t2['user'] . ':' . $t2['pass']); |
|
| 1356 | + $proxy_user = base64_encode($t2['user'].':'.$t2['pass']); |
|
| 1357 | 1357 | } |
| 1358 | 1358 | } else { |
| 1359 | - $first_host = $noproxy . $host; |
|
| 1359 | + $first_host = $noproxy.$host; |
|
| 1360 | 1360 | $first_port = $port; |
| 1361 | 1361 | } |
| 1362 | 1362 | |
@@ -1379,7 +1379,7 @@ discard block |
||
| 1379 | 1379 | ); |
| 1380 | 1380 | spip_log("Recuperer $path sur $first_host:$first_port par $f (via CONNECT)", 'connect'); |
| 1381 | 1381 | if (!$f) { |
| 1382 | - spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR); |
|
| 1382 | + spip_log("Erreur connexion $errno $errstr", 'distant'._LOG_ERREUR); |
|
| 1383 | 1383 | return $errno; |
| 1384 | 1384 | } |
| 1385 | 1385 | stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT); |
@@ -1392,7 +1392,7 @@ discard block |
||
| 1392 | 1392 | or !count($res = explode(' ', $res)) |
| 1393 | 1393 | or $res[1] !== '200' |
| 1394 | 1394 | ) { |
| 1395 | - spip_log("Echec CONNECT sur $first_host:$first_port", 'connect' . _LOG_INFO_IMPORTANTE); |
|
| 1395 | + spip_log("Echec CONNECT sur $first_host:$first_port", 'connect'._LOG_INFO_IMPORTANTE); |
|
| 1396 | 1396 | fclose($f); |
| 1397 | 1397 | |
| 1398 | 1398 | return false; |
@@ -1409,7 +1409,7 @@ discard block |
||
| 1409 | 1409 | } while (!$f and $ntry-- and $errno !== 110 and sleep(1)); |
| 1410 | 1410 | spip_log("Recuperer $path sur $first_host:$first_port par $f"); |
| 1411 | 1411 | if (!$f) { |
| 1412 | - spip_log("Erreur connexion $errno $errstr", 'distant' . _LOG_ERREUR); |
|
| 1412 | + spip_log("Erreur connexion $errno $errstr", 'distant'._LOG_ERREUR); |
|
| 1413 | 1413 | |
| 1414 | 1414 | return $errno; |
| 1415 | 1415 | } |
@@ -1419,16 +1419,16 @@ discard block |
||
| 1419 | 1419 | $site = $GLOBALS['meta']['adresse_site'] ?? ''; |
| 1420 | 1420 | |
| 1421 | 1421 | $host_port = $host; |
| 1422 | - if ($port != (in_array($scheme, ['tls','ssl']) ? 443 : 80)) { |
|
| 1422 | + if ($port != (in_array($scheme, ['tls', 'ssl']) ? 443 : 80)) { |
|
| 1423 | 1423 | $host_port .= ":$port"; |
| 1424 | 1424 | } |
| 1425 | 1425 | $req = "$method $path $vers\r\n" |
| 1426 | 1426 | . "Host: $host_port\r\n" |
| 1427 | - . 'User-Agent: ' . _INC_DISTANT_USER_AGENT . "\r\n" |
|
| 1428 | - . ($refuse_gz ? '' : ('Accept-Encoding: ' . _INC_DISTANT_CONTENT_ENCODING . "\r\n")) |
|
| 1427 | + . 'User-Agent: '._INC_DISTANT_USER_AGENT."\r\n" |
|
| 1428 | + . ($refuse_gz ? '' : ('Accept-Encoding: '._INC_DISTANT_CONTENT_ENCODING."\r\n")) |
|
| 1429 | 1429 | . (!$site ? '' : "Referer: $site/$referer\r\n") |
| 1430 | - . (!$date ? '' : 'If-Modified-Since: ' . (gmdate('D, d M Y H:i:s', $date) . " GMT\r\n")) |
|
| 1431 | - . (!$user ? '' : ('Authorization: Basic ' . base64_encode($user) . "\r\n")) |
|
| 1430 | + . (!$date ? '' : 'If-Modified-Since: '.(gmdate('D, d M Y H:i:s', $date)." GMT\r\n")) |
|
| 1431 | + . (!$user ? '' : ('Authorization: Basic '.base64_encode($user)."\r\n")) |
|
| 1432 | 1432 | . (!$proxy_user ? '' : "Proxy-Authorization: Basic $proxy_user\r\n") |
| 1433 | 1433 | . (!strpos($vers, '1.1') ? '' : "Keep-Alive: 300\r\nConnection: keep-alive\r\n"); |
| 1434 | 1434 | |