/** * Mise a jour automatisee de l'ecran de securite * On se base sur le filemtime de l'ecran source avec un en-tete if_modified_since * Mais on fournit aussi le md5 de notre ecran actuel et la version branche de SPIP * Cela peut permettre de diffuser un ecran different selon la version de SPIP si besoin * ou de ne repondre une 304 que si le md5 est bon */ function mise_a_jour_ecran_securite() { // TODO : url https avec verification du certificat return; // si l'ecran n'est pas deja present ou pas updatable, sortir if (!_URL_ECRAN_SECURITE or !file_exists($filename = _DIR_ETC . "ecran_securite.php") or !is_writable($filename) or !($last_modified = filemtime($filename)) or !($md5 = md5_file($filename))) { return false; } include_spip('inc/distant'); $tmp_file = _DIR_TMP . "ecran_securite.php"; $url = parametre_url(_URL_ECRAN_SECURITE, "md5", $md5); $url = parametre_url($url, "vspip", $GLOBALS['spip_version_branche']); $res = recuperer_url($url, array('if_modified_since' => $last_modified, 'file' => $tmp_file)); // si il y a une version plus recente que l'on a recu correctement if ($res['status'] == 200 and $res['length'] and $tmp_file = $res['file']) { if ($md5 !== md5_file($tmp_file)) { // on essaye de l'inclure pour verifier que ca ne fait pas erreur fatale include_once $tmp_file; // ok, on le copie a la place de l'ecran existant // en backupant l'ecran avant, au cas ou @copy($filename, $filename . "-bck-" . date('Y-m-d-His', $last_modified)); @rename($tmp_file, $filename); } else { @unlink($tmp_file); } } }
/** * yql -> tableau * @throws Exception * @param string $u * @return array|bool */ function inc_yql_to_array_dist($u) { define('_YQL_ENDPOINT', 'http://query.yahooapis.com/v1/public/yql?&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&q='); $v = recuperer_url($url = _YQL_ENDPOINT . urlencode($u) . '&format=json'); if (!$v['page'] or !($w = json_decode($v['page'], true))) { throw new Exception('YQL: réponse vide ou mal formée'); } if (isset($w['error'])) { throw new Exception($w['error']['description']); } return inc_object_to_array($w); }
/** * Obsolete Récupère une page sur le net et au besoin l'encode dans le charset local * * @deprecated * * @uses recuperer_url() * * @param string $url * URL de la page à récupérer * @param bool|null|string $trans * - chaîne longue : c'est un nom de fichier (nom pour sa copie locale) * - true : demande d'encodage/charset * - null : ne retourner que les headers * @param string $get * Type de requête HTTP à faire (HEAD, GET ou POST) * @param int|bool $taille_max * Arrêter le contenu au-delà (0 = seulement les entetes ==> requête HEAD). * Par defaut taille_max = 1Mo. * @param string|array $datas * Pour faire un POST de données * @param bool $refuser_gz * Pour forcer le refus de la compression (cas des serveurs orthographiques) * @param string $date_verif * Un timestamp unix pour arrêter la récuperation si la page distante * n'a pas été modifiée depuis une date donnée * @param string $uri_referer * Pour préciser un référer différent * @return string|array|bool * - Retourne l'URL en cas de 301, * - Un tableau (entête, corps) si ok, * - false sinon **/ function recuperer_lapage($url, $trans = false, $get = 'GET', $taille_max = 1048576, $datas = '', $refuser_gz = false, $date_verif = '', $uri_referer = '') { // $copy = copier le fichier ? $copy = (is_string($trans) and strlen($trans) > 5); // eviter "false" :-) // si on ecrit directement dans un fichier, pour ne pas manipuler // en memoire refuser gz if ($copy) { $refuser_gz = true; } $options = array('transcoder' => $trans === true, 'methode' => $get, 'datas' => $datas, 'refuser_gz' => $refuser_gz, 'if_modified_since' => $date_verif, 'uri_referer' => $uri_referer, 'file' => $copy ? $trans : '', 'follow_location' => false); if (!is_null($taille_max)) { $options['taille_max'] = $taille_max; } // dix tentatives maximum en cas d'entetes 301... $res = recuperer_url($url, $options); if ($res) { return false; } if ($res['status'] !== 200) { return false; } return array($res['headers'], $res['result']); }
/** * Renseigner les informations de taille et dimension d'un document * * Récupère les informations de taille (largeur / hauteur / type_image / taille) d'un document * Utilise pour cela les fonctions du répertoire metadatas/* * * Ces fonctions de récupérations peuvent retourner d'autres champs si ces champs sont définis * comme editable dans la déclaration de la table spip_documents * * @todo * Renommer cette fonction sans "_image" * * @param string $fichier * Le fichier à examiner * @param string $ext * L'extension du fichier à examiner * @param bool $distant * Indique que le fichier peut etre distant, on essaiera alors d'en recuperer un bout pour en lire les meta infos * @return array|string $infos * * - Si c'est une chaîne, c'est une erreur * - Si c'est un tableau, l'ensemble des informations récupérées du fichier */ function renseigner_taille_dimension_image($fichier, $ext, $distant = false) { $infos = array('largeur' => 0, 'hauteur' => 0, 'type_image' => '', 'taille' => 0); // Quelques infos sur le fichier if (!$fichier or !@file_exists($fichier) or !($infos['taille'] = @intval(filesize($fichier)))) { if ($distant) { // on ne saura pas la taille unset($infos['taille']); // recuperer un debut de fichier 512ko semblent suffire $tmp = _DIR_TMP . md5($fichier); $res = recuperer_url($fichier, array('file' => $tmp, 'taille_max' => 512 * 1024)); if (!$res) { spip_log("Echec copie du fichier {$fichier}"); return _T('medias:erreur_copie_fichier', array('nom' => $fichier)); } $fichier = $tmp; } else { spip_log("Echec copie du fichier {$fichier}"); return _T('medias:erreur_copie_fichier', array('nom' => $fichier)); } } // chercher une fonction de description $meta = array(); if ($metadata = charger_fonction($ext, "metadata", true)) { $meta = $metadata($fichier); } else { $media = sql_getfetsel('media_defaut', 'spip_types_documents', 'extension=' . sql_quote($ext)); if ($metadata = charger_fonction($media, "metadata", true)) { $meta = $metadata($fichier); } } $meta = pipeline('renseigner_document', array('args' => array('extension' => $ext, 'fichier' => $fichier), 'data' => $meta)); include_spip('inc/filtres'); # pour objet_info() $editables = objet_info('document', 'champs_editables'); foreach ($meta as $m => $v) { if (isset($infos[$m]) or in_array($m, $editables)) { $infos[$m] = $v; } } return $infos; }