Ejemplo n.º 1
0
/**
 * http://code.spip.net/@action_copier_local_post
 *
 * @param  $id_document
 * @return bool|mixed|string
 */
function action_copier_local_post($id_document)
{
    // Il faut la source du document pour le copier
    $row = sql_fetsel("mode,fichier, descriptif, credits", "spip_documents", "id_document={$id_document}");
    $source = $row['fichier'];
    // si la source est bien un fichier distant
    // sinon c'est une donnee moisie, on ne fait rien
    if (tester_url_absolue($source)) {
        include_spip('inc/distant');
        // pour 'copie_locale'
        $fichier = copie_locale($source);
        if ($fichier and tester_url_absolue($source)) {
            $fichier = _DIR_RACINE . $fichier;
            $files[] = array('tmp_name' => $fichier, 'name' => basename($fichier));
            $ajouter_documents = charger_fonction('ajouter_documents', 'action');
            spip_log("convertit doc {$id_document} en local: {$source} => {$fichier}", "medias");
            $liste = array();
            $ajouter_documents($id_document, $files, '', 0, $row['mode'], $liste);
            spip_unlink($fichier);
            // ajouter l'origine du document aux credits
            include_spip('action/editer_document');
            document_modifier($id_document, array('credits' => ($row['credits'] ? $row['credits'] . ', ' : '') . $source));
            return true;
        } else {
            spip_log("echec copie locale {$source}", "medias" . _LOG_ERREUR);
        }
    } else {
        spip_log("echec copie locale {$source} n'est pas une URL distante", "medias" . _LOG_ERREUR);
    }
    return _T('medias:erreur_copie_fichier', array('nom' => $source));
}
Ejemplo n.º 2
0
function securiser_redirect_action($redirect){
	if (tester_url_absolue($redirect) AND !defined('_AUTORISER_ACTION_ABS_REDIRECT')){
		$base = $GLOBALS['meta']['adresse_site']."/";
		// si l'url est une url du site, on la laisse passer sans rien faire
		// c'est encore le plus simple
		if (strlen($base) AND strncmp($redirect,$base,strlen($base))==0)
			return $redirect;
		else
			return "";
	}
	return $redirect;
}
Ejemplo n.º 3
0
/**
 * Donne le chemin complet du fichier
 *
 * @uses _DIR_IMG
 *
 * @param string $fichier
 * @return bool|string
 */
function get_spip_doc($fichier)
{
    // fichier distant
    if (tester_url_absolue($fichier)) {
        return $fichier;
    }
    // gestion d'erreurs, fichier=''
    if (!strlen($fichier)) {
        return false;
    }
    $fichier = strncmp($fichier, _DIR_IMG, strlen(_DIR_IMG)) != 0 ? _DIR_IMG . $fichier : $fichier;
    // fichier normal
    return $fichier;
}
Ejemplo n.º 4
0
/**
 * Lit un fichier xml donné et renvoie son arbre.
 *
 * @example
 *     ```
 *     include_spip('inc/xml');
 *     $arbre = spip_xml_load(_DIR_PLUGINS . "$plug/plugin.xml");
 *     ```
 *
 * @uses spip_xml_parse()
 *
 * @param string $fichier
 *     Chemin local ou URL distante du fichier XML
 * @param bool $strict
 *     true pour râler si une balise n'est pas correctement fermée, false sinon.
 * @param bool $clean ?
 * @param int $taille_max
 *     Taille maximale si fichier distant
 * @param string|array $datas
 *     Données à envoyer pour récupérer le fichier distant
 * @param int $profondeur ?
 * @return array|bool
 *     - array : l'arbre XML,
 *     - false si l'arbre xml ne peut être créé ou est vide
 **/
function spip_xml_load($fichier, $strict = true, $clean = true, $taille_max = 1048576, $datas = '', $profondeur = -1)
{
    $contenu = "";
    if (tester_url_absolue($fichier)) {
        include_spip('inc/distant');
        $contenu = recuperer_page($fichier, false, false, $taille_max, $datas);
    } else {
        lire_fichier($fichier, $contenu);
    }
    $arbre = array();
    if ($contenu) {
        $arbre = spip_xml_parse($contenu, $strict, $clean, $profondeur);
    }
    return count($arbre) ? $arbre : false;
}
Ejemplo n.º 5
0
function securiser_redirect_action($redirect)
{
    if ((tester_url_absolue($redirect) or preg_match(',^\\w+:,', trim($redirect))) and !defined('_AUTORISER_ACTION_ABS_REDIRECT')) {
        // si l'url est une url du site, on la laisse passer sans rien faire
        // c'est encore le plus simple
        $base = $GLOBALS['meta']['adresse_site'] . "/";
        if (strlen($base) and strncmp($redirect, $base, strlen($base)) == 0) {
            return $redirect;
        }
        $base = url_de_base();
        if (strlen($base) and strncmp($redirect, $base, strlen($base)) == 0) {
            return $redirect;
        }
        return "";
    }
    return $redirect;
}
function formulaires_configurer_relayeur_verifier_dist()
{
    $erreurs = array();
    $http_proxy = relayeur_saisie_ou_config(_request('http_proxy'), lire_config('http_proxy', ''));
    $http_noproxy = _request('http_noproxy');
    if ($http_proxy and !tester_url_absolue($http_proxy)) {
        $erreurs['http_proxy'] = _T('info_url_proxy_pas_conforme');
    }
    if (!isset($erreurs['http_proxy']) and _request('tester_proxy')) {
        if (!$http_proxy) {
            $erreurs['http_proxy'] = _T('info_obligatoire');
        } else {
            include_spip('inc/distant');
            $test_proxy = _request('test_proxy');
            $t = parse_url($test_proxy);
            if (!@$t['host']) {
                $erreurs['test_proxy'] = _T('info_adresse_non_indiquee');
            } else {
                include_spip('inc/texte');
                // pour aide, couper, lang
                $info = "";
                if (!need_proxy($t['host'], $http_proxy, $http_noproxy)) {
                    $info = "<strong>" . _T('page_pas_proxy') . "</strong><br />";
                }
                // il faut fausser le proxy actuel pour faire le test !
                $cur_http_proxy = $GLOBALS['meta']['http_proxy'];
                $cur_http_noproxy = $GLOBALS['meta']['http_noproxy'];
                $GLOBALS['meta']['http_proxy'] = $http_proxy;
                $GLOBALS['meta']['http_noproxy'] = $http_noproxy;
                $page = recuperer_page($test_proxy, true);
                $GLOBALS['meta']['http_proxy'] = $cur_http_proxy;
                $GLOBALS['meta']['http_noproxy'] = $cur_http_noproxy;
                if ($page) {
                    $erreurs['message_ok'] = _T('info_proxy_ok') . "<br />{$info}\n<tt>" . couper(entites_html($page), 300) . "</tt>";
                    $erreurs['message_erreur'] = '';
                } else {
                    $erreurs['message_erreur'] = $info . _T('info_impossible_lire_page', array('test_proxy' => "<tt>{$test_proxy}</tt>")) . " <b><tt>" . no_password_proxy_url($http_proxy) . "</tt></b>." . aide('confhttpproxy');
                }
            }
        }
    }
    return $erreurs;
}
/**
 * Vérifications du formulaire de configuration du compresseur
 *
 * @return array
 *     Tableau des erreurs
 **/
function formulaires_configurer_compresseur_verifier_dist()
{
    $erreurs = array();
    // les checkbox
    foreach (array('auto_compress_js', 'auto_compress_css', 'auto_compress_closure') as $champ) {
        if (_request($champ) != 'oui') {
            set_request($champ, 'non');
        }
    }
    if ($url = _request('url_statique_ressources')) {
        $url = preg_replace(",/?\\s*\$,", "", $url);
        if (!tester_url_absolue($url)) {
            $protocole = explode('://', $GLOBALS['meta']['adresse_site']);
            $protocole = reset($protocole);
            $url = $protocole . "://{$url}";
        }
        set_request('url_statique_ressources', $url);
    }
    return $erreurs;
}
Ejemplo n.º 8
0
function analyser_dtd_lexeme($dtd, &$dtc, $grammaire)
{
    if (!preg_match(_REGEXP_ENTITY_DEF, $dtd, $m)) {
        return -9;
    }
    list(, $s) = $m;
    $n = $dtc->macros[$s];
    if (is_array($n)) {
        // en cas d'inclusion, l'espace de nom est le meme
        // mais gaffe aux DTD dont l'URL est relative a l'engloblante
        if ($n[0] == 'PUBLIC' and !tester_url_absolue($n[1])) {
            $n[1] = substr($grammaire, 0, strrpos($grammaire, '/') + 1) . $n[1];
        }
        analyser_dtd($n[1], $n[0], $dtc);
    }
    return ltrim(substr($dtd, strlen($m[0])));
}
Ejemplo n.º 9
0
Archivo: data.php Proyecto: JLuc/SPIP
 /**
  * Aller chercher les donnees de la boucle DATA
  * depuis une source
  * {source format, [URL], [arg2]...}
  */
 protected function select_source()
 {
     # un peu crado : avant de charger le cache il faut charger
     # les class indispensables, sinon PHP ne saura pas gerer
     # l'objet en cache ; cf plugins/icalendar
     # perf : pas de fonction table_to_array ! (table est deja un array)
     if (isset($this->command['sourcemode']) and !in_array($this->command['sourcemode'], array('table', 'array', 'tableau'))) {
         charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);
     }
     # le premier argument peut etre un array, une URL etc.
     $src = $this->command['source'][0];
     # avons-nous un cache dispo ?
     $cle = null;
     if (is_string($src)) {
         $cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true));
     }
     $cache = $this->cache_get($cle);
     if (isset($this->command['datacache'])) {
         $ttl = intval($this->command['datacache']);
     }
     if ($cache and $cache['time'] + (isset($ttl) ? $ttl : $cache['ttl']) > time() and !(_request('var_mode') === 'recalcul' and include_spip('inc/autoriser') and autoriser('recalcul'))) {
         $this->tableau = $cache['data'];
     } else {
         try {
             # dommage que ca ne soit pas une option de yql_to_array...
             if ($this->command['sourcemode'] == 'yql') {
                 if (!isset($ttl)) {
                     $ttl = 3600;
                 }
             }
             if (isset($this->command['sourcemode']) and in_array($this->command['sourcemode'], array('table', 'array', 'tableau'))) {
                 if (is_array($a = $src) or is_string($a) and $a = str_replace('&quot;', '"', $a) and is_array($a = @unserialize($a))) {
                     $this->tableau = $a;
                 }
             } else {
                 if (tester_url_absolue($src)) {
                     include_spip('inc/distant');
                     $u = recuperer_page($src, false, false, _DATA_SOURCE_MAX_SIZE);
                     if (!$u) {
                         throw new Exception("404");
                     }
                     if (!isset($ttl)) {
                         $ttl = 24 * 3600;
                     }
                 } else {
                     if (@is_dir($src)) {
                         $u = $src;
                         if (!isset($ttl)) {
                             $ttl = 10;
                         }
                     } else {
                         if (@is_readable($src) && @is_file($src)) {
                             $u = spip_file_get_contents($src);
                             if (!isset($ttl)) {
                                 $ttl = 10;
                             }
                         } else {
                             $u = $src;
                             if (!isset($ttl)) {
                                 $ttl = 10;
                             }
                         }
                     }
                 }
                 if (!$this->err and $g = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)) {
                     $args = $this->command['source'];
                     $args[0] = $u;
                     if (is_array($a = call_user_func_array($g, $args))) {
                         $this->tableau = $a;
                     }
                 }
             }
             if (!is_array($this->tableau)) {
                 $this->err = true;
             }
             if (!$this->err and isset($ttl) and $ttl > 0) {
                 $this->cache_set($cle, $ttl);
             }
         } catch (Exception $e) {
             $e = $e->getMessage();
             $err = sprintf("[%s, %s] {$e}", $src, $this->command['sourcemode']);
             erreur_squelette(array($err, array()));
             $this->err = true;
         }
     }
     # en cas d'erreur, utiliser le cache si encore dispo
     if ($this->err and $cache) {
         $this->tableau = $cache['data'];
         $this->err = false;
     }
 }
Ejemplo n.º 10
0
/**
 * Récupérer les infos d'un document distant, sans trop le télécharger
 *
 * @param string $source
 *     URL de la source
 * @param int $max
 *     Taille maximum du fichier à télécharger
 * @param bool $charger_si_petite_image
 *     Pour télécharger le document s'il est petit
 * @return array
 *     Couples des informations obtenues parmis :
 *
 *     - 'body' = chaine
 *     - 'type_image' = booleen
 *     - 'titre' = chaine
 *     - 'largeur' = intval
 *     - 'hauteur' = intval
 *     - 'taille' = intval
 *     - 'extension' = chaine
 *     - 'fichier' = chaine
 *     - 'mime_type' = chaine
 **/
function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image = true)
{
    // pas la peine de perdre son temps
    if (!tester_url_absolue($source)) {
        return false;
    }
    # charger les alias des types mime
    include_spip('base/typedoc');
    $a = array();
    $mime_type = '';
    // On va directement charger le debut des images et des fichiers html,
    // de maniere a attrapper le maximum d'infos (titre, taille, etc). Si
    // ca echoue l'utilisateur devra les entrer...
    if ($headers = recuperer_page($source, false, true, $max, '', '', true)) {
        list($headers, $a['body']) = preg_split(',\\n\\n,', $headers, 2);
        if (preg_match(",\nContent-Type: *([^[:space:];]*),i", "\n{$headers}", $regs)) {
            $mime_type = trim($regs[1]);
        } else {
            $mime_type = '';
        }
        // inconnu
        // Appliquer les alias
        while (isset($GLOBALS['mime_alias'][$mime_type])) {
            $mime_type = $GLOBALS['mime_alias'][$mime_type];
        }
        // Si on a un mime-type insignifiant
        // text/plain,application/octet-stream ou vide
        // c'est peut-etre que le serveur ne sait pas
        // ce qu'il sert ; on va tenter de detecter via l'extension de l'url
        // ou le Content-Disposition: attachment; filename=...
        $t = null;
        if (in_array($mime_type, array('text/plain', '', 'application/octet-stream'))) {
            if (!$t and preg_match(',\\.([a-z0-9]+)(\\?.*)?$,i', $source, $rext)) {
                $t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1], '', 'text'));
            }
            if (!$t and preg_match(",^Content-Disposition:\\s*attachment;\\s*filename=(.*)\$,Uims", $headers, $m) and preg_match(',\\.([a-z0-9]+)(\\?.*)?$,i', $m[1], $rext)) {
                $t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1], '', 'text'));
            }
        }
        // Autre mime/type (ou text/plain avec fichier d'extension inconnue)
        if (!$t) {
            $t = sql_fetsel("extension", "spip_types_documents", "mime_type=" . sql_quote($mime_type));
        }
        // Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg)
        // On essaie de nouveau avec l'extension
        if (!$t and $mime_type != 'text/plain' and preg_match(',\\.([a-z0-9]+)(\\?.*)?$,i', $source, $rext)) {
            $t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1], '', 'text'));
            # eviter xxx.3 => 3gp (> SPIP 3)
        }
        if ($t) {
            spip_log("mime-type {$mime_type} ok, extension " . $t['extension']);
            $a['extension'] = $t['extension'];
        } else {
            # par defaut on retombe sur '.bin' si c'est autorise
            spip_log("mime-type {$mime_type} inconnu");
            $t = sql_fetsel("extension", "spip_types_documents", "extension='bin'");
            if (!$t) {
                return false;
            }
            $a['extension'] = $t['extension'];
        }
        if (preg_match(",\nContent-Length: *([^[:space:]]*),i", "\n{$headers}", $regs)) {
            $a['taille'] = intval($regs[1]);
        }
    }
    // Echec avec HEAD, on tente avec GET
    if (!$a and !$max) {
        spip_log("tenter GET {$source}");
        $a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE);
    }
    // si on a rien trouve pas la peine d'insister
    if (!$a) {
        return false;
    }
    // S'il s'agit d'une image pas trop grosse ou d'un fichier html, on va aller
    // recharger le document en GET et recuperer des donnees supplementaires...
    if (preg_match(',^image/(jpeg|gif|png|swf),', $mime_type)) {
        if ($max == 0 and (empty($a['taille']) or $a['taille'] < _INC_DISTANT_MAX_SIZE) and isset($GLOBALS['meta']['formats_graphiques']) and strpos($GLOBALS['meta']['formats_graphiques'], $a['extension']) !== false and $charger_si_petite_image) {
            $a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE);
        } else {
            if ($a['body']) {
                $a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $a['extension']);
                ecrire_fichier($a['fichier'], $a['body']);
                $size_image = @getimagesize($a['fichier']);
                $a['largeur'] = intval($size_image[0]);
                $a['hauteur'] = intval($size_image[1]);
                $a['type_image'] = true;
            }
        }
    }
    // Fichier swf, si on n'a pas la taille, on va mettre 425x350 par defaut
    // ce sera mieux que 0x0
    if ($a and isset($a['extension']) and $a['extension'] == 'swf' and empty($a['largeur'])) {
        $a['largeur'] = 425;
        $a['hauteur'] = 350;
    }
    if ($mime_type == 'text/html') {
        include_spip('inc/filtres');
        $page = recuperer_page($source, true, false, _INC_DISTANT_MAX_SIZE);
        if (preg_match(',<title>(.*?)</title>,ims', $page, $regs)) {
            $a['titre'] = corriger_caracteres(trim($regs[1]));
        }
        if (!isset($a['taille']) or !$a['taille']) {
            $a['taille'] = strlen($page);
            # a peu pres
        }
    }
    $a['mime_type'] = $mime_type;
    return $a;
}
Ejemplo n.º 11
0
/**
 * Vérifications du formulaire d'édition d'un auteur
 *
 * Vérifie en plus des vérifications prévues :
 * - qu'un rédacteur ne peut pas supprimer son adresse mail,
 * - que le mot de passe choisi n'est pas trop court et identique à sa
 *   deuxième saisie
 *
 * @see formulaires_editer_objet_verifier()
 *
 * @param int|string $id_auteur
 *     Identifiant de l'auteur. 'new' pour une nouvel auteur.
 * @param string $retour
 *     URL de redirection après le traitement
 * @param string $associer_objet
 *     Éventuel 'objet|x' indiquant de lier le mot créé à cet objet,
 *     tel que 'article|3'
 * @param string $config_fonc
 *     Nom de la fonction ajoutant des configurations particulières au formulaire
 * @param array $row
 *     Valeurs de la ligne SQL de l'auteur, si connu
 * @param string $hidden
 *     Contenu HTML ajouté en même temps que les champs cachés du formulaire.
 * @return array
 *     Erreurs des saisies
 **/
function formulaires_editer_auteur_verifier_dist($id_auteur = 'new', $retour = '', $associer_objet = '', $config_fonc = 'auteurs_edit_config', $row = array(), $hidden = '')
{
    // auto-renseigner le nom si il n'existe pas, sans couper
    titre_automatique('nom', array('email', 'login'), 255);
    // mais il reste obligatoire si on a rien trouve
    $erreurs = formulaires_editer_objet_verifier('auteur', $id_auteur, array('nom'));
    $auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
    $auth_methode = $auth_methode ? $auth_methode : 'spip';
    include_spip('inc/auth');
    if (!nom_acceptable(_request('nom'))) {
        $erreurs['nom'] = _T("info_nom_pas_conforme");
    }
    if ($email = _request('email')) {
        include_spip('inc/filtres');
        include_spip('inc/autoriser');
        // un redacteur qui modifie son email n'a pas le droit de le vider si il y en avait un
        if (!autoriser('modifier', 'auteur', $id_auteur, null, array('email' => '?')) and $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur and !strlen(trim($email)) and $email != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)))) {
            $erreurs['email'] = $id_auteur == $GLOBALS['visiteur_session']['id_auteur'] ? _T('form_email_non_valide') : _T('form_prop_indiquer_email');
        } else {
            if (!email_valide($email)) {
                $erreurs['email'] = $id_auteur == $GLOBALS['visiteur_session']['id_auteur'] ? _T('form_email_non_valide') : _T('form_prop_indiquer_email');
            }
        }
        # Ne pas autoriser d'avoir deux auteurs avec le même email
        # cette fonctionalité nécessite que la base soit clean à l'activation : pas de
        # doublon sur la requête select email,count(*) from spip_auteurs group by email ;
        if (defined('_INTERDIRE_AUTEUR_MEME_EMAIL')) {
            #Nouvel auteur
            if (intval($id_auteur) == 0) {
                #Un auteur existe deja avec cette adresse ?
                if (sql_countsel("spip_auteurs", "email=" . sql_quote($email)) > 0) {
                    $erreurs['email'] = _T('erreur_email_deja_existant');
                }
            } else {
                #Un auteur existe deja avec cette adresse ? et n'est pas le user courant.
                if (sql_countsel("spip_auteurs", "email=" . sql_quote($email)) > 0 and $id_auteur != ($id_auteur_ancien = sql_getfetsel('id_auteur', 'spip_auteurs', "email=" . sql_quote($email)))) {
                    $erreurs['email'] = _T('erreur_email_deja_existant');
                }
            }
        }
    }
    if ($url = _request('url_site') and !tester_url_absolue($url)) {
        $erreurs['url_site'] = _T('info_url_site_pas_conforme');
    }
    $erreurs['message_erreur'] = '';
    if ($err = auth_verifier_login($auth_methode, _request('new_login'), $id_auteur)) {
        $erreurs['new_login'] = $err;
        $erreurs['message_erreur'] .= $err;
    } else {
        // pass trop court ou confirmation non identique
        if ($p = _request('new_pass')) {
            if ($p != _request('new_pass2')) {
                $erreurs['new_pass'] = _T('info_passes_identiques');
                $erreurs['message_erreur'] .= _T('info_passes_identiques');
            } elseif ($err = auth_verifier_pass($auth_methode, _request('new_login'), $p, $id_auteur)) {
                $erreurs['new_pass'] = $err;
                $erreurs['message_erreur'] .= $err;
            }
        }
    }
    if (!$erreurs['message_erreur']) {
        unset($erreurs['message_erreur']);
    }
    return $erreurs;
}
Ejemplo n.º 12
0
/**
 * Retourne les tailles d'une image
 *
 * Pour les filtres `largeur` et `hauteur`
 * 
 * @param string $img
 *     Balise HTML `<img ... />` ou chemin de l'image (qui peut être une URL distante).
 * @return array
 *     Liste (hauteur, largeur) en pixels
**/
function taille_image($img)
{
    static $largeur_img = array(), $hauteur_img = array();
    $srcWidth = 0;
    $srcHeight = 0;
    $logo = extraire_attribut($img, 'src');
    if (!$logo) {
        $logo = $img;
    } else {
        $srcWidth = extraire_attribut($img, 'width');
        $srcHeight = extraire_attribut($img, 'height');
    }
    // ne jamais operer directement sur une image distante pour des raisons de perfo
    // la copie locale a toutes les chances d'etre la ou de resservir
    if (tester_url_absolue($logo)) {
        include_spip('inc/distant');
        $fichier = copie_locale($logo);
        $logo = $fichier ? _DIR_RACINE . $fichier : $logo;
    }
    if (($p = strpos($logo, '?')) !== FALSE) {
        $logo = substr($logo, 0, $p);
    }
    $srcsize = false;
    if (isset($largeur_img[$logo])) {
        $srcWidth = $largeur_img[$logo];
    }
    if (isset($hauteur_img[$logo])) {
        $srcHeight = $hauteur_img[$logo];
    }
    if (!$srcWidth or !$srcHeight) {
        if (file_exists($logo) and $srcsize = @getimagesize($logo)) {
            if (!$srcWidth) {
                $largeur_img[$logo] = $srcWidth = $srcsize[0];
            }
            if (!$srcHeight) {
                $hauteur_img[$logo] = $srcHeight = $srcsize[1];
            }
        } elseif (@file_exists($f = "{$logo}.src") and lire_fichier($f, $valeurs) and $valeurs = unserialize($valeurs)) {
            if (!$srcWidth) {
                $largeur_img[$logo] = $srcWidth = $valeurs["largeur_dest"];
            }
            if (!$srcHeight) {
                $hauteur_img[$logo] = $srcHeight = $valeurs["hauteur_dest"];
            }
        }
    }
    return array($srcHeight, $srcWidth);
}
Ejemplo n.º 13
0
/**
 * enclosures
 * ajout d'un rel="enclosure" sur les liens mp3 absolus
 * appele en pipeline apres propre pour traiter les [mon son->http://monsite/mon_son.mp3]
 * peut etre appele dans un squelette apres |liens_absolus
 *
 * @param $texte
 * @return mixed
 */
function player_post_propre($texte)
{
    $reg_formats = "mp3";
    // plus vite
    if (stripos($texte, ".{$reg_formats}") !== false and stripos($texte, "<a") !== false) {
        $cfg = unserialize($GLOBALS['meta']['player']);
        // insertion du mini-player inline
        if (isset($cfg['insertion_auto']) and in_array('inline_mini', $cfg['insertion_auto'])) {
            $texte = preg_replace_callback(",<a(\\s[^>]*href=['\"]?(http://[a-zA-Z0-9\\s()\\/\\:\\._%\\?+'=~-]*\\.({$reg_formats}))['\"]?[^>]*)>,Uims", 'player_enclose_link', $texte);
        }
        if (isset($cfg['insertion_auto']) and in_array('player_end', $cfg['insertion_auto'])) {
            preg_match_all(",<a(\\s[^>]*href=['\"]?(http://[a-zA-Z0-9\\s()\\/\\:\\._%\\?+'=~-]*\\.({$reg_formats}))['\"]?[^>]*)>(.*)</a>,Uims", $texte, $matches, PREG_SET_ORDER);
            if (count($matches)) {
                foreach ($matches as $m) {
                    $url = $m[2];
                    $titre = $m[4];
                    $titre = (!strlen(textebrut($titre)) or tester_url_absolue($titre)) ? player_joli_titre($url) : $titre;
                    $emb = recuperer_fond("modeles/player", array('url_document' => $url, 'titre' => $titre));
                    if ($wrap_embed_html = charger_fonction("wrap_embed_html", "inc", true)) {
                        $emb = $wrap_embed_html(' ', $emb);
                    }
                    $texte .= $emb;
                }
            }
        }
    }
    return $texte;
}
Ejemplo n.º 14
0
Archivo: config.php Proyecto: JLuc/SPIP
/**
 * Mettre à jour l'adresse du site à partir d'une valeur saisie
 * (ou auto détection si vide)
 * 
 * @param string $adresse_site
 * @return string
 */
function appliquer_adresse_site($adresse_site)
{
    if ($adresse_site !== NULL) {
        if (!strlen($adresse_site)) {
            $GLOBALS['profondeur_url'] = _DIR_RESTREINT ? 0 : 1;
            $adresse_site = url_de_base();
        }
        $adresse_site = preg_replace(",/?\\s*\$,", "", $adresse_site);
        if (!tester_url_absolue($adresse_site)) {
            $adresse_site = "http://{$adresse_site}";
        }
        ecrire_meta('adresse_site', $adresse_site);
    }
    return $adresse_site;
}
Ejemplo n.º 15
0
function formulaires_login_traiter_dist($cible="",$login="",$prive=null){
	$res = array();
	// Si on se connecte dans l'espace prive, 
	// ajouter "bonjour" (repere a peu pres les cookies desactives)
	if (is_null($prive) ? is_url_prive($cible) : $prive) {
		$cible = parametre_url($cible, 'bonjour', 'oui', '&');
	}
	if ($cible=='@page_auteur')
		$cible = generer_url_entite($GLOBALS['auteur_session']['id_auteur'],'auteur');

	if ($cible) {
		$cible = parametre_url($cible, 'var_login', '', '&');

		// transformer la cible absolue en cible relative
		// pour pas echouer quand la meta adresse_site est foireuse
		if (strncmp($cible,$u = url_de_base(),strlen($u))==0){
			$cible = "./".substr($cible,strlen($u));
		}

		// si c'est une url absolue, refuser la redirection
		// sauf si cette securite est levee volontairement par le webmestre
		elseif (tester_url_absolue($cible) AND !defined('_AUTORISER_LOGIN_ABS_REDIRECT')) {
			$cible = "";
		}
	}


	// Si on est admin, poser le cookie de correspondance
	if ($GLOBALS['auteur_session']['statut'] == '0minirezo') {
		include_spip('inc/cookie');
		spip_setcookie('spip_admin', '@'.$GLOBALS['auteur_session']['login'],
		time() + 7 * 24 * 3600);
	}

	// Si on est connecte, envoyer vers la destination
	if ($cible AND ($cible!=self())) {
		if (!headers_sent() AND !$_GET['var_mode']) {
			include_spip('inc/headers');
			$res['redirect'] = $cible;
		} else {
			$res['message_ok'] .= inserer_attribut(
				"<a>" . _T('login_par_ici') . "</a>",
				'href', $cible
			);
		}
	}
	return $res;
}
Ejemplo n.º 16
0
function formulaires_forum_prive_verifier_dist($objet, $id_objet, $id_forum, $forcer_previsu, $statut, $retour = '')
{
    include_spip('inc/acces');
    include_spip('inc/texte');
    include_spip('inc/forum');
    include_spip('inc/session');
    include_spip('base/abstract_sql');
    $erreurs = array();
    $min_length = defined('_FORUM_LONGUEUR_MINI') ? _FORUM_LONGUEUR_MINI : 10;
    if (strlen($texte = _request('texte')) < $min_length and !_request('ajouter_mot') and $GLOBALS['meta']['forums_texte'] == 'oui') {
        $erreurs['texte'] = _T($min_length == 10 ? 'forum:forum_attention_dix_caracteres' : 'forum:forum_attention_nb_caracteres_mini', array('min' => $min_length));
    } else {
        if (defined('_FORUM_LONGUEUR_MAXI') and _FORUM_LONGUEUR_MAXI > 0 and strlen($texte) > _FORUM_LONGUEUR_MAXI) {
            $erreurs['texte'] = _T('forum:forum_attention_trop_caracteres', array('compte' => strlen($texte), 'max' => _FORUM_LONGUEUR_MAXI));
        }
    }
    if (strlen($titre = _request('titre')) < 3 and $GLOBALS['meta']['forums_titre'] == 'oui') {
        $erreurs['titre'] = _T('forum:forum_attention_trois_caracteres');
    }
    if (array_reduce($_POST, 'reduce_strlen', 20 * 1024) < 0) {
        $erreurs['erreur_message'] = _T('forum:forum_message_trop_long');
    }
    if ($url = _request('url_site') and !tester_url_absolue($url)) {
        $erreurs['url_site'] = _T('info_url_site_pas_conforme');
    }
    if (!count($erreurs) and !_request('envoyer_message') and !_request('confirmer_previsu_forum')) {
        $previsu = inclure_forum_prive_previsu($texte, $titre, _request('url_site'), _request('nom_site'), _request('ajouter_mot'));
        $erreurs['previsu'] = $previsu;
        $erreurs['message_erreur'] = '';
        // on ne veut pas du message_erreur automatique
    }
    return $erreurs;
}
Ejemplo n.º 17
0
function formulaires_editer_document_traiter_dist($id_document = 'new', $id_parent = '', $retour = '', $lier_trad = 0, $config_fonc = 'documents_edit_config', $row = array(), $hidden = '')
{
    if (is_null(_request('parents'))) {
        set_request('parents', array());
    }
    // verifier les infos de taille et dimensions sur les fichiers locaux
    // cas des maj de fichier directes par ftp
    foreach (array('taille', 'largeur', 'hauteur') as $c) {
        if ($v = _request("_{$c}_modif") and !_request($c)) {
            set_request($c, $v);
        }
    }
    $res = formulaires_editer_objet_traiter('document', $id_document, $id_parent, $lier_trad, $retour, $config_fonc, $row, $hidden);
    set_request('parents');
    $autoclose = "<script type='text/javascript'>if (window.jQuery) jQuery.modalboxclose();</script>";
    if (_request('copier_local') or _request('joindre_upload') or _request('joindre_ftp') or _request('joindre_distant') or _request('joindre_zip')) {
        $autoclose = "";
        if (_request('copier_local')) {
            $copier_local = charger_fonction('copier_local', 'action');
            $res = array('editable' => true);
            if (($err = $copier_local($id_document)) === true) {
                $res['message_ok'] = (isset($res['message_ok']) ? $res['message_ok'] . '<br />' : '') . _T('medias:document_copie_locale_succes');
            } else {
                $res['message_erreur'] = (isset($res['message_erreur']) ? $res['message_erreur'] . '<br />' : '') . $err;
            }
            set_request('credits');
            // modifie par la copie locale
        } else {
            // liberer le nom de l'ancien fichier pour permettre le remplacement par un fichier du meme nom
            if ($ancien_fichier = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($id_document)) and !tester_url_absolue($ancien_fichier) and @file_exists($rename = get_spip_doc($ancien_fichier))) {
                @rename($rename, "{$rename}--.old");
            }
            $traiter = charger_fonction('traiter', 'formulaires/joindre_document');
            $res2 = $traiter($id_document);
            if (isset($res2['message_erreur'])) {
                $res['message_erreur'] = $res2['message_erreur'];
                // retablir le fichier !
                if ($rename) {
                    @rename("{$rename}--.old", $rename);
                }
            } else {
                spip_unlink("{$rename}--.old");
            }
        }
        // on annule les saisies largeur/hauteur : l'upload a pu charger les siens
        set_request('largeur');
        set_request('hauteur');
    } else {
        // regarder si une demande de rotation a eu lieu
        // c'est un bouton image, dont on a pas toujours le name en request, on fait avec
        $angle = 0;
        if (_request('tournerL90') or _request('tournerL90_x')) {
            $angle = -90;
        }
        if (_request('tournerR90') or _request('tournerR90_x')) {
            $angle = 90;
        }
        if (_request('tourner180') or _request('tourner180_x')) {
            $angle = 180;
        }
        if ($angle) {
            $autoclose = "";
            $tourner = charger_fonction('tourner', 'action');
            action_tourner_post($id_document, $angle);
        }
    }
    if (!isset($res['redirect'])) {
        $res['editable'] = true;
    }
    if (!isset($res['message_erreur'])) {
        $res['message_ok'] = _T('info_modification_enregistree') . $autoclose;
    }
    if ($res['message_ok']) {
        $res['message_ok'] .= '<script type="text/javascript">if (window.jQuery) ajaxReload("document_infos");</script>';
    }
    return $res;
}
Ejemplo n.º 18
0
function plugins_infos_plugin($desc, $plug = '', $dir_plugins = _DIR_PLUGINS)
{
    include_spip('inc/xml');
    $arbre = spip_xml_parse($desc);
    $verifie_conformite = charger_fonction('verifie_conformite', 'plugins');
    $verifie_conformite($plug, $arbre, $dir_plugins);
    include_spip('inc/charsets');
    // On renvoie la DTD utilisee
    $ret['dtd'] = "plugin";
    if (isset($arbre['categorie'])) {
        $ret['categorie'] = trim(spip_xml_aplatit($arbre['categorie']));
    }
    if (isset($arbre['nom'])) {
        $ret['nom'] = charset2unicode(spip_xml_aplatit($arbre['nom']));
    }
    if (isset($arbre['icon'])) {
        $ret['logo'] = trim(spip_xml_aplatit($arbre['icon']));
    }
    if (isset($arbre['auteur'])) {
        $ret['auteur'][] = trim(spip_xml_aplatit($arbre['auteur']));
    }
    // garder le 1er niveau en tableau mais traiter le multi possible
    if (isset($arbre['licence'])) {
        $ret['licence'][] = trim(spip_xml_aplatit($arbre['licence']));
    }
    if (isset($arbre['version'])) {
        $ret['version'] = trim(spip_xml_aplatit($arbre['version']));
    }
    if (isset($arbre['version_base'])) {
        $ret['schema'] = trim(spip_xml_aplatit($arbre['version_base']));
    }
    if (isset($arbre['etat'])) {
        $ret['etat'] = trim(spip_xml_aplatit($arbre['etat']));
    }
    $ret['description'] = $ret['slogan'] = "";
    if (isset($arbre['slogan'])) {
        $ret['slogan'] = trim(spip_xml_aplatit($arbre['slogan']));
    }
    if (isset($arbre['description'])) {
        $ret['description'] = trim(spip_xml_aplatit($arbre['description']));
    }
    if (isset($arbre['lien'])) {
        $ret['documentation'] = trim(join(' ', $arbre['lien']));
        if ($ret['documentation']) {
            // le lien de doc doit etre une url et c'est tout
            if (!tester_url_absolue($ret['documentation'])) {
                $ret['documentation'] = "";
            }
        }
    }
    if (isset($arbre['options'])) {
        $ret['options'] = $arbre['options'];
    }
    if (isset($arbre['fonctions'])) {
        $ret['fonctions'] = $arbre['fonctions'];
    }
    if (isset($arbre['prefix'][0])) {
        $ret['prefix'] = trim(array_pop($arbre['prefix']));
    }
    if (isset($arbre['install'])) {
        $ret['install'] = $arbre['install'];
    }
    if (isset($arbre['meta'])) {
        $ret['meta'] = trim(spip_xml_aplatit($arbre['meta']));
    }
    $necessite = info_plugin_normalise_necessite(isset($arbre['necessite']) ? $arbre['necessite'] : '');
    $ret['compatibilite'] = isset($necessite['compatible']) ? $necessite['compatible'] : '';
    $ret['necessite'] = $necessite['necessite'];
    $ret['lib'] = $necessite['lib'];
    $ret['utilise'] = info_plugin_normalise_utilise(isset($arbre['utilise']) ? $arbre['utilise'] : '');
    $ret['procure'] = info_plugin_normalise_procure(isset($arbre['procure']) ? $arbre['procure'] : '');
    $ret['chemin'] = info_plugin_normalise_chemin(isset($arbre['path']) ? $arbre['path'] : '');
    if (isset($arbre['pipeline'])) {
        $ret['pipeline'] = $arbre['pipeline'];
    }
    $extraire_boutons = charger_fonction('extraire_boutons', 'plugins');
    $les_boutons = $extraire_boutons($arbre);
    $ret['menu'] = $les_boutons['bouton'];
    $ret['onglet'] = $les_boutons['onglet'];
    $ret['traduire'] = isset($arbre['traduire']) ? $arbre['traduire'] : '';
    if (isset($arbre['config'])) {
        $ret['config'] = spip_xml_aplatit($arbre['config']);
    }
    if (isset($arbre['noisette'])) {
        $ret['noisette'] = $arbre['noisette'];
    }
    if (isset($arbre['erreur'])) {
        $ret['erreur'] = $arbre['erreur'];
        if ($plug) {
            spip_log("infos_plugin {$plug} " . @join(' ', $arbre['erreur']));
        }
    }
    return $ret;
}
Ejemplo n.º 19
0
/**
 * Donne le nom de la copie locale de la source
 *
 * Soit obtient l'extension du fichier directement de l'URL de la source,
 * soit tente de le calculer.
 *
 * @uses nom_fichier_copie_locale()
 * @uses recuperer_infos_distantes()
 *
 * @param string $source
 *      URL de la source distante
 * @return string
 *      Nom du fichier calculé
 **/
function fichier_copie_locale($source)
{
    // Si c'est deja local pas de souci
    if (!tester_url_absolue($source)) {
        if (_DIR_RACINE) {
            $source = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $source);
        }
        return $source;
    }
    // optimisation : on regarde si on peut deviner l'extension dans l'url et si le fichier
    // a deja ete copie en local avec cette extension
    // dans ce cas elle est fiable, pas la peine de requeter en base
    $path_parts = pathinfo($source);
    if (!isset($path_parts['extension'])) {
        $path_parts['extension'] = '';
    }
    $ext = $path_parts ? $path_parts['extension'] : '';
    if ($ext and preg_match(',^\\w+$,', $ext) and $f = nom_fichier_copie_locale($source, $ext) and file_exists(_DIR_RACINE . $f)) {
        return $f;
    }
    // Si c'est deja dans la table des documents,
    // ramener le nom de sa copie potentielle
    $ext = sql_getfetsel("extension", "spip_documents", "fichier=" . sql_quote($source) . " AND distant='oui' AND extension <> ''");
    if ($ext) {
        return nom_fichier_copie_locale($source, $ext);
    }
    // voir si l'extension indiquee dans le nom du fichier est ok
    // et si il n'aurait pas deja ete rapatrie
    $ext = $path_parts ? $path_parts['extension'] : '';
    if ($ext and sql_getfetsel("extension", "spip_types_documents", "extension=" . sql_quote($ext))) {
        $f = nom_fichier_copie_locale($source, $ext);
        if (file_exists(_DIR_RACINE . $f)) {
            return $f;
        }
    }
    // Ping  pour voir si son extension est connue et autorisee
    // avec mise en cache du resultat du ping
    $cache = sous_repertoire(_DIR_CACHE, 'rid') . md5($source);
    if (!@file_exists($cache) or !($path_parts = @unserialize(spip_file_get_contents($cache))) or _request('var_mode') == 'recalcul') {
        $path_parts = recuperer_infos_distantes($source, 0, false);
        ecrire_fichier($cache, serialize($path_parts));
    }
    $ext = !empty($path_parts['extension']) ? $path_parts['extension'] : '';
    if ($ext and sql_getfetsel("extension", "spip_types_documents", "extension=" . sql_quote($ext))) {
        return nom_fichier_copie_locale($source, $ext);
    }
    spip_log("pas de copie locale pour {$source}");
}
/**
 * Ajouter un document (au format $_FILES)
 *
 * @param int $id_document
 *   Document à remplacer, ou pour une vignette, l'id_document de maman
 *   0 ou 'new' pour une insertion
 * @param array $file
 *   Propriétes au format $_FILE étendu :
 *
 *   - string tmp_name : source sur le serveur
 *   - string name : nom du fichier envoye
 *   - bool titrer : donner ou non un titre a partir du nom du fichier
 *   - bool distant : pour utiliser une source distante sur internet
 *   - string mode : vignette|image|documents|choix
 * @param string $objet
 *   Objet auquel associer le document
 * @param int $id_objet
 *   id_objet
 * @param string $mode
 *   Mode par défaut si pas precisé pour le document
 * @return array|bool|int|mixed|string|unknown
 *
 *   - int : l'id_document ajouté (opération réussie)
 *   - string : une erreur s'est produit, la chaine est le message d'erreur
 *
 */
function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet, $mode)
{
    $source = $file['tmp_name'];
    $nom_envoye = $file['name'];
    // passer en minuscules le nom du fichier, pour eviter les collisions
    // si le file system fait la difference entre les deux il ne detectera
    // pas que Toto.pdf et toto.pdf
    // et on aura une collision en cas de changement de file system
    $file['name'] = strtolower(translitteration($file['name']));
    // Pouvoir definir dans mes_options.php que l'on veut titrer tous les documents par d?faut
    if (!defined('_TITRER_DOCUMENTS')) {
        define('_TITRER_DOCUMENTS', false);
    }
    $titrer = isset($file['titrer']) ? $file['titrer'] : _TITRER_DOCUMENTS;
    $mode = (isset($file['mode']) and $file['mode']) ? $file['mode'] : $mode;
    include_spip('inc/modifier');
    if (isset($file['distant']) and $file['distant'] and !in_array($mode, array('choix', 'auto', 'image', 'document'))) {
        spip_log("document distant {$source} accepte sans verification, mode={$mode}", "medias" . _LOG_INFO_IMPORTANTE);
        include_spip('inc/distant');
        $file['tmp_name'] = _DIR_RACINE . copie_locale($source);
        $source = $file['tmp_name'];
        unset($file['distant']);
    }
    // Documents distants : pas trop de verifications bloquantes, mais un test
    // via une requete HEAD pour savoir si la ressource existe (non 404), si le
    // content-type est connu, et si possible recuperer la taille, voire plus.
    if (isset($file['distant']) and $file['distant']) {
        if (!tester_url_absolue($source)) {
            return _T('medias:erreur_chemin_distant', array('nom' => $source));
        }
        include_spip('inc/distant');
        if (is_array($a = renseigner_source_distante($source))) {
            $champs = $a;
            # NB: dans les bonnes conditions (fichier autorise et pas trop gros)
            # $a['fichier'] est une copie locale du fichier
            $infos = renseigner_taille_dimension_image($champs['fichier'], $champs['extension'], true);
            // on ignore erreur eventuelle sur $infos car on est distant, ca ne marche pas forcement
            if (is_array($infos)) {
                $champs = array_merge($champs, $infos);
            }
            unset($champs['type_image']);
        } else {
            spip_log("Echec du lien vers le document {$source}, abandon");
            return $a;
            // message d'erreur
        }
    } else {
        // pas distant
        $champs = array('distant' => 'non');
        $type_image = '';
        // au pire
        $champs['titre'] = '';
        if ($titrer) {
            $titre = substr($nom_envoye, 0, strrpos($nom_envoye, "."));
            // Enlever l'extension du nom du fichier
            $titre = preg_replace(',[[:punct:][:space:]]+,u', ' ', $titre);
            $champs['titre'] = preg_replace(',\\.([^.]+)$,', '', $titre);
        }
        if (!is_array($fichier = fixer_fichier_upload($file, $mode))) {
            return is_string($fichier) ? $fichier : _T("medias:erreur_upload_type_interdit", array('nom' => $file['name']));
        }
        $champs['inclus'] = $fichier['inclus'];
        $champs['extension'] = $fichier['extension'];
        $champs['fichier'] = $fichier['fichier'];
        /**
         * Récupère les informations du fichier
         * -* largeur
         * -* hauteur
         * -* type_image
         * -* taille
         * -* ses metadonnées si une fonction de metadatas/ est présente
         */
        $infos = renseigner_taille_dimension_image($champs['fichier'], $champs['extension']);
        if (is_string($infos)) {
            return $infos;
        }
        // c'est un message d'erreur !
        $champs = array_merge($champs, $infos);
        // Si mode == 'choix', fixer le mode image/document
        if (in_array($mode, array('choix', 'auto'))) {
            $choisir_mode_document = charger_fonction('choisir_mode_document', 'inc');
            $mode = $choisir_mode_document($champs, $champs['inclus'] == 'image', $objet);
        }
        $champs['mode'] = $mode;
        if (($test = verifier_taille_document_acceptable($champs)) !== true) {
            spip_unlink($champs['fichier']);
            return $test;
            // erreur sur les dimensions du fichier
        }
        unset($champs['type_image']);
        unset($champs['inclus']);
        $champs['fichier'] = set_spip_doc($champs['fichier']);
    }
    // si le media est pas renseigne, le faire, en fonction de l'extension
    if (!isset($champs['media'])) {
        $champs['media'] = sql_getfetsel('media_defaut', 'spip_types_documents', 'extension=' . sql_quote($champs['extension']));
    }
    // lier le parent si necessaire
    if ($id_objet = intval($id_objet) and $objet) {
        $champs['parents'][] = "{$objet}|{$id_objet}";
    }
    // "mettre a jour un document" si on lui
    // passe un id_document
    if ($id_document = intval($id_document)) {
        unset($champs['titre']);
        // garder le titre d'origine
        unset($champs['date']);
        // garder la date d'origine
        unset($champs['descriptif']);
        // garder la desc d'origine
        // unset($a['distant']); # on peut remplacer un doc statique par un doc distant
        // unset($a['mode']); # on peut remplacer une image par un document ?
    }
    include_spip('action/editer_document');
    // Installer le document dans la base
    if (!$id_document) {
        if ($id_document = document_inserer()) {
            spip_log("ajout du document " . $file['tmp_name'] . " " . $file['name'] . "  (M '{$mode}' T '{$objet}' L '{$id_objet}' D '{$id_document}')", 'medias');
        } else {
            spip_log("Echec insert_document() du document " . $file['tmp_name'] . " " . $file['name'] . "  (M '{$mode}' T '{$objet}' L '{$id_objet}' D '{$id_document}')", 'medias' . _LOG_ERREUR);
        }
    }
    if (!$id_document) {
        return _T('medias:erreur_insertion_document_base', array('fichier' => "<em>" . $file['name'] . "</em>"));
    }
    document_modifier($id_document, $champs);
    // permettre aux plugins de faire des modifs a l'ajout initial
    // ex EXIF qui tourne les images si necessaire
    // Ce plugin ferait quand même mieux de se placer dans metadata/jpg.php
    pipeline('post_edition', array('args' => array('table' => 'spip_documents', 'table_objet' => 'documents', 'spip_table_objet' => 'spip_documents', 'type' => 'document', 'id_objet' => $id_document, 'champs' => array_keys($champs), 'serveur' => '', 'action' => 'ajouter_document', 'operation' => 'ajouter_document'), 'data' => $champs));
    return $id_document;
}
/**
 * Fonctions de traitement d'image
 *
 * Uniquement pour GD2.
 *
 * @pipeline_appel image_preparer_filtre
 * @uses extraire_attribut()
 * @uses inserer_attribut()
 * @uses tester_url_absolue()
 * @uses copie_locale() Si l'image est distante
 * @uses taille_image()
 * @uses _image_ratio()
 * @uses reconstruire_image_intermediaire()
 *
 * @param string $img
 *     Chemin de l'image ou balise html `<img src=... />`.
 * @param string $effet
 *     Les nom et paramètres de l'effet à apporter sur l'image
 *     (par exemple : reduire-300-200).
 * @param bool|string $forcer_format
 *     Un nom d'extension spécifique demandé (par exemple : jpg, png, txt...).
 *     Par défaut false : GD se débrouille seule).
 * @param array $fonction_creation
 *     Un tableau à 2 éléments :
 *     1) string : indique le nom du filtre de traitement demandé (par exemple : `image_reduire`) ;
 *     2) array : tableau reprenant la valeur de `$img` et chacun des arguments passés au filtre utilisé.
 * @param bool $find_in_path
 *     false (par défaut) indique que l'on travaille sur un fichier
 *     temporaire (.src) ; true, sur un fichier définitif déjà existant.
 * @return bool|string|array
 *
 *     - false si pas de tag `<img`,
 *       -   si l'extension n'existe pas,
 *       -   si le fichier source n'existe pas,
 *       -   si les dimensions de la source ne sont pas accessibles,
 *       -   si le fichier temporaire n'existe pas,
 *       -   si la fonction `_imagecreatefrom{extension}` n'existe pas ;
 *     - "" (chaîne vide) si le fichier source est distant et n'a pas
 *       réussi à être copié sur le serveur ;
 *     - array : tableau décrivant de l'image
 */
function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_creation = null, $find_in_path = false)
{
    static $images_recalcul = array();
    if (strlen($img) == 0) {
        return false;
    }
    $source = trim(extraire_attribut($img, 'src'));
    if (strlen($source) < 1) {
        $source = $img;
        $img = "<img src='{$source}' />";
    } elseif (preg_match('@^data:image/(jpe?g|png|gif);base64,(.*)$@isS', $source, $regs)) {
        $local = sous_repertoire(_DIR_VAR, 'image-data') . md5($regs[2]) . '.' . str_replace('jpeg', 'jpg', $regs[1]);
        if (!file_exists($local)) {
            ecrire_fichier($local, base64_decode($regs[2]));
        }
        $source = $local;
        $img = inserer_attribut($img, 'src', $source);
        # eviter les mauvaises surprises lors de conversions de format
        $img = inserer_attribut($img, 'width', '');
        $img = inserer_attribut($img, 'height', '');
    }
    // les protocoles web prennent au moins 3 lettres
    if (tester_url_absolue($source)) {
        include_spip('inc/distant');
        $fichier = _DIR_RACINE . copie_locale($source);
        if (!$fichier) {
            return "";
        }
    } else {
        // enlever le timestamp eventuel
        if (strpos($source, "?") !== false) {
            $source = preg_replace(',[?][0-9]+$,', '', $source);
        }
        if (strpos($source, "?") !== false and strncmp($source, _DIR_IMG, strlen(_DIR_IMG)) == 0 and file_exists($f = preg_replace(',[?].*$,', '', $source))) {
            $source = $f;
        }
        $fichier = $source;
    }
    $terminaison = $terminaison_dest = "";
    if (preg_match(",\\.(gif|jpe?g|png)(\$|[?]),i", $fichier, $regs)) {
        $terminaison = strtolower($regs[1]);
        $terminaison_dest = $terminaison;
        if ($terminaison == "gif") {
            $terminaison_dest = "png";
        }
    }
    if ($forcer_format !== false) {
        $terminaison_dest = $forcer_format;
    }
    if (!$terminaison_dest) {
        return false;
    }
    $term_fonction = $terminaison;
    if ($term_fonction == "jpg") {
        $term_fonction = "jpeg";
    }
    $nom_fichier = substr($fichier, 0, strlen($fichier) - (strlen($terminaison) + 1));
    $fichier_dest = $nom_fichier;
    if ($find_in_path and $f = find_in_path($fichier) and $fichier = $f or @file_exists($f = $fichier)) {
        // on passe la balise img a taille image qui exraira les attributs si possible
        // au lieu de faire un acces disque sur le fichier
        list($ret["hauteur"], $ret["largeur"]) = taille_image($find_in_path ? $f : $img);
        $date_src = @filemtime($f);
    } elseif (@file_exists($f = "{$fichier}.src") and lire_fichier($f, $valeurs) and $valeurs = unserialize($valeurs) and isset($valeurs["hauteur_dest"]) and isset($valeurs["largeur_dest"])) {
        $ret["hauteur"] = $valeurs["hauteur_dest"];
        $ret["largeur"] = $valeurs["largeur_dest"];
        $date_src = $valeurs["date"];
    } else {
        return false;
    }
    // pas de taille mesurable
    if (!($ret["hauteur"] or $ret["largeur"])) {
        return false;
    }
    // cas general :
    // on a un dossier cache commun et un nom de fichier qui varie avec l'effet
    // cas particulier de reduire :
    // un cache par dimension, et le nom de fichier est conserve, suffixe par la dimension aussi
    $cache = "cache-gd2";
    if (substr($effet, 0, 7) == 'reduire') {
        list(, $maxWidth, $maxHeight) = explode('-', $effet);
        list($destWidth, $destHeight) = _image_ratio($ret['largeur'], $ret['hauteur'], $maxWidth, $maxHeight);
        $ret['largeur_dest'] = $destWidth;
        $ret['hauteur_dest'] = $destHeight;
        $effet = "L{$destWidth}xH{$destHeight}";
        $cache = "cache-vignettes";
        $fichier_dest = basename($fichier_dest);
        if ($ret['largeur'] <= $maxWidth && $ret['hauteur'] <= $maxHeight) {
            // on garde la terminaison initiale car image simplement copiee
            // et on postfixe son nom avec un md5 du path
            $terminaison_dest = $terminaison;
            $fichier_dest .= '-' . substr(md5("{$fichier}"), 0, 5);
        } else {
            $fichier_dest .= '-' . substr(md5("{$fichier}-{$effet}"), 0, 5);
        }
        $cache = sous_repertoire(_DIR_VAR, $cache);
        $cache = sous_repertoire($cache, $effet);
        # cherche un cache existant
        /*foreach (array('gif','jpg','png') as $fmt)
        		if (@file_exists($cache . $fichier_dest . '.' . $fmt)) {
        			$terminaison_dest = $fmt;
        		}*/
    } else {
        $fichier_dest = md5("{$fichier}-{$effet}");
        $cache = sous_repertoire(_DIR_VAR, $cache);
        $cache = sous_repertoire($cache, substr($fichier_dest, 0, 2));
        $fichier_dest = substr($fichier_dest, 2);
    }
    $fichier_dest = $cache . $fichier_dest . "." . $terminaison_dest;
    $GLOBALS["images_calculees"][] = $fichier_dest;
    $creer = true;
    // si recalcul des images demande, recalculer chaque image une fois
    if (defined('_VAR_IMAGES') and _VAR_IMAGES and !isset($images_recalcul[$fichier_dest])) {
        $images_recalcul[$fichier_dest] = true;
    } else {
        if (@file_exists($f = $fichier_dest)) {
            if (filemtime($f) >= $date_src) {
                $creer = false;
            }
        } else {
            if (@file_exists($f = "{$fichier_dest}.src") and lire_fichier($f, $valeurs) and $valeurs = unserialize($valeurs) and $valeurs["date"] >= $date_src) {
                $creer = false;
            }
        }
    }
    if ($creer) {
        if (!@file_exists($fichier)) {
            if (!@file_exists("{$fichier}.src")) {
                spip_log("Image absente : {$fichier}");
                return false;
            }
            # on reconstruit l'image source absente a partir de la chaine des .src
            reconstruire_image_intermediaire($fichier);
        }
    }
    if ($creer) {
        spip_log("filtre image " . ($fonction_creation ? reset($fonction_creation) : '') . "[{$effet}] sur {$fichier}", "images" . _LOG_DEBUG);
    }
    // TODO: si une image png est nommee .jpg, le reconnaitre avec le bon $f
    $ret["fonction_imagecreatefrom"] = "_imagecreatefrom" . $term_fonction;
    $ret["fichier"] = $fichier;
    $ret["fonction_image"] = "_image_image" . $terminaison_dest;
    $ret["fichier_dest"] = $fichier_dest;
    $ret["format_source"] = $terminaison != 'jpeg' ? $terminaison : 'jpg';
    $ret["format_dest"] = $terminaison_dest;
    $ret["date_src"] = $date_src;
    $ret["creer"] = $creer;
    $ret["class"] = extraire_attribut($img, 'class');
    $ret["alt"] = extraire_attribut($img, 'alt');
    $ret["style"] = extraire_attribut($img, 'style');
    $ret["tag"] = $img;
    if ($fonction_creation) {
        $ret["reconstruction"] = $fonction_creation;
        # ecrire ici comment creer le fichier, car il est pas sur qu'on l'ecrira reelement
        # cas de image_reduire qui finalement ne reduit pas l'image source
        # ca evite d'essayer de le creer au prochain hit si il n'est pas la
        #ecrire_fichier($ret['fichier_dest'].'.src',serialize($ret),true);
    }
    $ret = pipeline('image_preparer_filtre', array('args' => array('img' => $img, 'effet' => $effet, 'forcer_format' => $forcer_format, 'fonction_creation' => $fonction_creation, 'find_in_path' => $find_in_path), 'data' => $ret));
    // une globale pour le debug en cas de crash memoire
    $GLOBALS["derniere_image_calculee"] = $ret;
    if (!function_exists($ret["fonction_imagecreatefrom"])) {
        return false;
    }
    return $ret;
}
Ejemplo n.º 22
0
/**
 * Script : plusieurs declarations possibles.
 * Traitement de l'attribut source pour générer en remplacement les attributs url et path
 *
 * @param object $phraseur
 * @param array $attrs
 * @param string $texte
 */
function info_paquet_script($phraseur, $attrs, $texte)
{
    $lien = $chemin = $type = $media = '';
    include_spip('inc/utils');
    if (tester_url_absolue($attrs['source'])) {
        $lien = $attrs['source'];
    } else {
        $chemin = $attrs['source'];
    }
    if (isset($attrs['type'])) {
        $type = $attrs['type'];
    }
    $n = $phraseur->contenu['compatible'];
    $phraseur->versions[$n]['script'][] = array('url' => $lien, 'path' => $chemin, 'type' => $type);
}
Ejemplo n.º 23
0
function formulaires_login_traiter_dist($cible = "", $login = "", $prive = null)
{
    $res = array();
    // Si on se connecte dans l'espace prive,
    // ajouter "bonjour" (repere a peu pres les cookies desactives)
    if (is_null($prive) ? is_url_prive($cible) : $prive) {
        $cible = parametre_url($cible, 'bonjour', 'oui', '&');
    }
    if ($cible == '@page_auteur') {
        $cible = generer_url_entite($GLOBALS['auteur_session']['id_auteur'], 'auteur');
    }
    if ($cible) {
        $cible = parametre_url($cible, 'var_login', '', '&');
        // transformer la cible absolue en cible relative
        // pour pas echouer quand la meta adresse_site est foireuse
        if (strncmp($cible, $u = url_de_base(), strlen($u)) == 0) {
            $cible = "./" . substr($cible, strlen($u));
        } elseif (tester_url_absolue($cible) and !defined('_AUTORISER_LOGIN_ABS_REDIRECT')) {
            $cible = "";
        }
    }
    // Si on est connecte, envoyer vers la destination
    if ($cible and $cible != self()) {
        if (!headers_sent() and !$_GET['var_mode']) {
            include_spip('inc/headers');
            $res['redirect'] = $cible;
        } else {
            $res['message_ok'] = inserer_attribut("<a>" . _T('login_par_ici') . "</a>", 'href', $cible);
        }
    }
    return $res;
}
Ejemplo n.º 24
0
/**
 * Enregistre une revision de document.
 * $set est un contenu (par defaut on prend le contenu via _request())
 *
 * @param int $id_document
 * @param array|null $set
 * @return string|null
 */
function document_modifier($id_document, $set = null)
{
    include_spip('inc/modifier');
    include_spip('inc/filtres');
    // champs normaux
    $champs = collecter_requests(objet_info('document', 'champs_editables'), array('parents', 'ajout_parents'), $set);
    $invalideur = "";
    $indexation = false;
    // Si le document est publie, invalider les caches et demander sa reindexation
    $t = sql_getfetsel("statut", "spip_documents", 'id_document=' . intval($id_document));
    if ($t == 'publie') {
        $invalideur = "id='id_document/{$id_document}'";
        $indexation = true;
    }
    $ancien_fichier = "";
    // si le fichier est modifie, noter le nom de l'ancien pour faire le menage
    if (isset($champs['fichier'])) {
        $ancien_fichier = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($id_document));
    }
    if ($err = objet_modifier_champs('document', $id_document, array('data' => $set, 'invalideur' => $invalideur, 'indexation' => $indexation), $champs)) {
        return $err;
    }
    // nettoyer l'ancien fichier si necessaire
    if (isset($champs['fichier']) and $champs['fichier'] and $ancien_fichier and $ancien_fichier !== $champs['fichier'] and !tester_url_absolue($ancien_fichier) and @file_exists($f = get_spip_doc($ancien_fichier))) {
        spip_unlink($f);
    }
    // Changer le statut du document ?
    // le statut n'est jamais fixe manuellement mais decoule de celui des objets lies
    $champs = collecter_requests(array('parents', 'ajouts_parents'), array(), $set);
    if (document_instituer($id_document, $champs)) {
        //
        // Post-modifications
        //
        // Invalider les caches
        include_spip('inc/invalideur');
        suivre_invalideur("id='id_document/{$id_document}'");
    }
}