/**
 * 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);
        }
    }
}
Exemple #2
0
/**
 * 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;
}