Пример #1
0
function action_copier_local_post($id_document) {

	// Il faut la source du document pour le copier
	$row = sql_fetsel("fichier, descriptif", "spip_documents", "id_document=$id_document");
	$source = $row['fichier'];

	include_spip('inc/distant'); // pour 'copie_locale'
	include_spip('inc/documents'); // pour 'set_spip_doc'
	$fichier = copie_locale($source);
	if ($fichier) {
		$fichier = _DIR_RACINE . $fichier;
		$taille = filesize($fichier);
		// On le sort du repertoire IMG/distant/
		$dest = preg_replace(',^.*/distant/[^/_]+[/_],', '', $fichier);
		$dest = sous_repertoire(_DIR_IMG, preg_replace(',^.*\.,', '', $fichier)) . $dest;
		if ($dest != $fichier
		AND @rename($fichier, $dest))
			$fichier = $dest;

		// On indique l'ancien URL dans le descriptif (pis-aller)
		$row['descriptif'] .= ($row['descriptif'] ? "\n\n":'') . "[->$source]";

		// $fichier contient IMG/distant/...
		// or, dans la table documents, IMG doit etre exclu.
		$fichier = set_spip_doc($fichier);
		spip_log("convertit doc $id_document en local: $source => $fichier");
		sql_updateq('spip_documents', array('fichier' =>$fichier, 'distant'=>'non', 'taille'=>$taille, 'descriptif'=> $row['descriptif']),"id_document=".$id_document);
		
	} else {
		spip_log("echec copie locale $source");
	}
}
Пример #2
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'];
    include_spip('inc/distant');
    // pour 'copie_locale'
    $fichier = copie_locale($source);
    if ($fichier) {
        $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}");
        $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}");
    }
    return _T('medias:erreur_copie_fichier', array('nom' => $source));
}
Пример #3
0
/**
 * Tourner un document
 *
 * http://code.spip.net/@action_tourner_post
 *
 * @param int $id_document
 * @param int $angle
 *   angle de rotation en degre>0
 * @return
 */
function action_tourner_post($id_document, $angle)
{
    $row = sql_fetsel("fichier,extension", "spip_documents", "id_document=" . intval($id_document));
    if (!$row) {
        return;
    }
    include_spip('inc/charsets');
    # pour le nom de fichier
    include_spip('inc/documents');
    // Fichier destination : on essaie toujours de repartir de l'original
    $var_rot = $angle;
    $effacer = false;
    include_spip('inc/distant');
    # pour copie_locale
    $src = _DIR_RACINE . copie_locale(get_spip_doc($row['fichier']));
    if (preg_match(',^(.*)-r(90|180|270)\\.([^.]+)$,', $src, $match)) {
        $effacer = $src;
        $src = $match[1] . '.' . $match[3];
        $var_rot += intval($match[2]);
    }
    $var_rot = (360 + $var_rot) % 360;
    // 0, 90, 180 ou 270
    if ($var_rot > 0) {
        $dest = preg_replace(',\\.[^.]+$,', '-r' . $var_rot . '$0', $src);
        spip_log("rotation {$var_rot} {$src} : {$dest}");
        include_spip('inc/filtres');
        include_spip('public/parametrer');
        // charger les fichiers fonctions #bugfix spip 2.1.0
        $res = filtrer('image_rotation', $src, $var_rot);
        $res = filtrer('image_format', $res, $row['extension']);
        list($hauteur, $largeur) = taille_image($res);
        $res = extraire_attribut($res, 'src');
        include_spip('inc/getdocument');
        deplacer_fichier_upload($res, $dest);
    } else {
        $dest = $src;
        $size_image = @getimagesize($dest);
        $largeur = $size_image[0];
        $hauteur = $size_image[1];
    }
    // succes !
    if ($largeur > 0 and $hauteur > 0) {
        $set = array('fichier' => set_spip_doc($dest), 'largeur' => $largeur, 'hauteur' => $hauteur, 'distant' => 'non');
        if ($taille = @filesize($dest)) {
            $set['taille'] = $taille;
        }
        sql_updateq('spip_documents', $set, "id_document=" . intval($id_document));
        if ($effacer) {
            spip_log("rotation : j'efface {$effacer}");
            spip_unlink($effacer);
        }
        // pipeline pour les plugins
        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('rotation' => $angle, 'orientation' => $var_rot, 'fichier' => $row['fichier']), 'action' => 'tourner'), 'data' => $set));
    }
}
function BOUCLE_documents_portfoliohtml_4dc0f36e18dd7a26ebc382429cbc9835(&$Cache, &$Pile, &$doublons, &$Numrows, $SP)
{
    static $command = array();
    static $connect;
    $command['connect'] = $connect = '';
    $doublons_index = array();
    $in = array();
    $in[] = 'png';
    $in[] = 'jpg';
    $in[] = 'gif';
    // Initialise le(s) critère(s) doublons
    if (!isset($doublons[$d = 'documents'])) {
        $doublons[$d] = '';
    }
    if (!isset($command['table'])) {
        $command['table'] = 'documents';
        $command['id'] = '_documents_portfolio';
        $command['from'] = array('documents' => 'spip_documents', 'L1' => 'spip_documents_liens', 'L2' => 'spip_types_documents');
        $command['type'] = array();
        $command['groupby'] = array();
        $command['select'] = array("0+documents.titre AS num", "documents.date", "documents.id_document", "L2.mime_type", "L1.id_objet AS id_rubrique", "documents.titre", "documents.fichier");
        $command['orderby'] = array('num', 'documents.date');
        $command['join'] = array('L1' => array('documents', 'id_document'), 'L2' => array('documents', 'extension'));
        $command['limit'] = '';
        $command['having'] = array();
    }
    $command['where'] = array(quete_condition_statut('documents.statut', 'publie,prop,prepa', 'publie', ''), array('(documents.taille > 0 OR documents.distant=\'oui\')'), array('=', 'L1.id_objet', sql_quote(@$Pile[0]['id_rubrique'], '', 'bigint(21) NOT NULL DEFAULT \'0\'')), array('=', 'L1.objet', sql_quote('rubrique')), array('=', 'documents.mode', "'document'"), sql_in('documents.extension', sql_quote($in)), array('=', 'L1.vu', "'non'"), array(sql_in('documents.id_document', $doublons[$doublons_index[] = 'documents'], 'NOT')));
    if (defined("_BOUCLE_PROFILER")) {
        $timer = time() + microtime();
    }
    $t0 = "";
    // REQUETE
    $iter = IterFactory::create("SQL", $command, array('squelettes/inc/inc-rub-documents.html', 'html_4dc0f36e18dd7a26ebc382429cbc9835', '_documents_portfolio', 2, $GLOBALS['spip_lang']));
    if (!$iter->err()) {
        $SP++;
        // RESULTATS
        while ($Pile[$SP] = $iter->fetch()) {
            foreach ($doublons_index as $k) {
                $doublons[$k] .= "," . $Pile[$SP]['id_document'];
            }
            // doublons
            $t0 .= ($t1 = strval(vider_url(urlencode_1738(generer_url_entite($Pile[$SP]['id_document'], 'document', '', '', true))))) !== '' ? '
		<a href="' . $t1 . ('" type="' . interdire_scripts($Pile[$SP]['mime_type']) . '" onclick="location.href=\'' . parametre_url(vider_url(urlencode_1738(generer_url_entite($Pile[$SP]['id_rubrique'], 'rubrique', '', '', true))), 'id_document', $Pile[$SP]['id_document']) . '#documents_portfolio\';return false;"' . (($t2 = strval(interdire_scripts(@$Pile[0]['exposer']))) !== '' ? ' class="' . $t2 . '"' : '') . (($t2 = strval(interdire_scripts(couper(attribut_html(traiter_doublons_documents($doublons, typo(supprimer_numero($Pile[$SP]['titre']), "TYPO", $connect, $Pile[0]))), '80')))) !== '' ? ' title="' . $t2 . '"' : '') . '>' . interdire_scripts(inserer_attribut(inserer_attribut(filtrer('image_graver', filtrer('image_reduire', copie_locale(get_spip_doc($Pile[$SP]['fichier'])), '0', '100')), 'class', 'spip_vignette_portfolio'), 'alt', interdire_scripts(couper(attribut_html(traiter_doublons_documents($doublons, typo(supprimer_numero($Pile[$SP]['titre']), "TYPO", $connect, $Pile[0]))), '80')))) . '</a>
	') : '';
        }
        $iter->free();
    }
    if (defined("_BOUCLE_PROFILER") and 1000 * ($timer = time() + microtime() - $timer) > _BOUCLE_PROFILER) {
        spip_log(intval(1000 * $timer) . "ms BOUCLE_documents_portfolio @ squelettes/inc/inc-rub-documents.html", "profiler" . _LOG_AVERTISSEMENT);
    }
    return $t0;
}
function action_supprimer_document_dist($id_document = 0)
{
    if (!$id_document) {
        $securiser_action = charger_fonction('securiser_action', 'inc');
        $id_document = $securiser_action();
    }
    include_spip('inc/autoriser');
    if (!autoriser('supprimer', 'document', $id_document)) {
        spip_log("Echec : Suppression document {$id_document} interdite", _LOG_ERREUR);
        return false;
    }
    // si c'etait une vignette, modifier le document source !
    if ($source = sql_getfetsel('id_document', 'spip_documents', 'id_vignette=' . intval($id_document))) {
        include_spip('action/editer_document');
        document_modifier($source, array("id_vignette" => 0));
    }
    include_spip('inc/documents');
    if (!($doc = sql_fetsel('*', 'spip_documents', 'id_document=' . intval($id_document)))) {
        spip_log("Echec : Suppression document {$id_document} : le document n'existe pas en base", _LOG_ERREUR);
        return false;
    }
    spip_log("Suppression du document {$id_document} (" . $doc['fichier'] . ")");
    include_spip('action/editer_liens');
    // Si c'est un document ayant une vignette, supprimer aussi la vignette
    if ($doc['id_vignette']) {
        action_supprimer_document_dist($doc['id_vignette']);
        objet_dissocier(array('document' => $doc['id_vignette']), '*');
    }
    // Si c'est un document ayant des documents annexes (sous-titre, ...)
    // les supprimer aussi
    $annexes = array_map('reset', sql_allfetsel("id_document", "spip_documents_liens", "objet='document' AND id_objet=" . intval($id_document)));
    foreach ($annexes as $id) {
        action_supprimer_document_dist($id);
    }
    // dereferencer dans la base
    objet_dissocier(array('document' => $id_document), '*', array('role' => '*'));
    sql_delete('spip_documents', 'id_document=' . intval($id_document));
    // Supprimer le fichier si le doc est local,
    // et la copie locale si le doc est distant
    if ($doc['distant'] == 'oui') {
        include_spip('inc/distant');
        if ($local = _DIR_RACINE . copie_locale($doc['fichier'], 'test')) {
            spip_unlink($local);
        }
    } else {
        spip_unlink(get_spip_doc($doc['fichier']));
    }
    pipeline('post_edition', array('args' => array('operation' => 'supprimer_document', 'action' => 'supprimer_document', 'table' => 'spip_documents', 'id_objet' => $id_document, 'document' => $doc), 'data' => null));
    return true;
}
Пример #6
0
function action_editer_site_dist($arg = null)
{
    if (is_null($arg)) {
        $securiser_action = charger_fonction('securiser_action', 'inc');
        $arg = $securiser_action();
    }
    if (!($id_syndic = intval($arg))) {
        $id_syndic = site_inserer(_request('id_parent'));
        if ($logo = _request('logo') and $format_logo = _request('format_logo')) {
            include_spip('inc/distant');
            $logo = _DIR_RACINE . copie_locale($logo);
            @rename($logo, _DIR_IMG . 'siteon' . $id_syndic . '.' . $format_logo);
        }
    }
    if (!$id_syndic) {
        return array(0, '');
    }
    $err = site_modifier($id_syndic);
    return array($id_syndic, $err);
}
Пример #7
0
function action_supprimer_document_dist($id_document) {
	include_spip('inc/autoriser');
	if (!autoriser('supprimer','document',$id_document))
		return false;

	include_spip('inc/documents');
	if (!$doc = sql_fetsel('*', 'spip_documents', 'id_document='.$id_document))
		return false;

	spip_log("Suppression du document $id_document (".$doc['fichier'].")");

	// Si c'est un document ayant une vignette, supprimer aussi la vignette
	if ($doc['id_vignette']) {
		action_supprimer_document_dist($doc['id_vignette']);
		sql_delete('spip_documents_liens', 'id_document='.$doc['id_vignette']);
	}

	// Supprimer le fichier si le doc est local,
	// et la copie locale si le doc est distant
	if ($doc['distant'] == 'oui') {
		include_spip('inc/distant');
		if ($local = copie_locale($doc['fichier'],'test'))
			spip_unlink($local);
	}
	else spip_unlink(get_spip_doc($doc['fichier']));

	sql_delete('spip_documents', 'id_document='.$id_document);

	pipeline('post_edition',
		array(
			'args' => array(
				'operation' => 'supprimer_document',
				'table' => 'spip_documents',
				'id_objet' => $id_document
			),
			'data' => null
		)
	);
}
Пример #8
0
/**
 * Récupérer la source et détecter son extension
 *
 * @uses  teleporter_http_extension()
 *
 * @param string $source
 *     URL de la source HTTP
 * @param string $dest_tmp
 *     Répertoire de destination
 * @return array|string
 *     - Texte d'erreur si une erreur survient,
 *     - Liste sinon (répertoire de destination temporaire, extension du fichier source)
 */
function teleporter_http_recuperer_source($source, $dest_tmp)
{
    # securite : ici on repart toujours d'une source neuve
    if (file_exists($dest_tmp)) {
        spip_unlink($dest_tmp);
    }
    $extension = "";
    # si on ne dispose pas encore du fichier
    # verifier que le zip en est bien un (sans se fier a son extension)
    #	en chargeant son entete car l'url initiale peut etre une simple
    # redirection et ne pas comporter d'extension .zip
    include_spip('inc/distant');
    $head = recuperer_page($source, false, true, 0);
    if (preg_match(",^Content-Type:\\s*?(.*)\$,Uims", $head, $m) and include_spip('base/typedoc')) {
        $mime = $m[1];
        // passer du mime a l'extension !
        if ($e = array_search($mime, $GLOBALS['tables_mime'])) {
            $extension = $e;
        }
    }
    if (!$extension or in_array($extension, array('bin', 'gz'))) {
        if (preg_match(",^Content-Disposition:\\s*attachment;\\s*filename=(.*)['\"]?\$,Uims", $head, $m) and $e = teleporter_http_extension($m[1])) {
            $extension = $e;
        } else {
            $extension = teleporter_http_extension($source);
        }
    }
    # format de fichier inconnu
    if (!$extension) {
        spip_log("Type de fichier inconnu pour la source {$source}", "teleport" . _LOG_ERREUR);
        return _T('svp:erreur_teleporter_type_fichier_inconnu', array('source' => $source));
    }
    $dest_tmp = preg_replace(";\\.[\\w]{2,3}\$;i", "", $dest_tmp) . ".{$extension}";
    if (!defined('_SVP_PAQUET_MAX_SIZE')) {
        define('_SVP_PAQUET_MAX_SIZE', 67108864);
    }
    // 64Mo
    include_spip('inc/distant');
    $dest_tmp = copie_locale($source, 'force', $dest_tmp, _SVP_PAQUET_MAX_SIZE);
    if (!$dest_tmp or !file_exists($dest_tmp = _DIR_RACINE . $dest_tmp)) {
        spip_log("Chargement impossible de la source {$source}", "teleport" . _LOG_ERREUR);
        return _T('svp:erreur_teleporter_chargement_source_impossible', array('source' => $source));
    }
    return array($dest_tmp, $extension);
}
Пример #9
0
/**
 * Actualisation des plugins d'un dépot déjà crée
 *
 * Actualise les informations uniquement si la signature du fichier
 * XML de description du dépot a changé
 * 
 * @param int $id
 *     Identifiant du dépot
 * @return bool
 *     false si erreur, true sinon
 */
function svp_actualiser_depot($id)
{
    include_spip('inc/distant');
    $id = intval($id);
    // pas de depot a cet id ?
    if (!($depot = sql_fetsel('*', 'spip_depots', 'id_depot=' . sql_quote($id)))) {
        return false;
    }
    $fichier_xml = _DIR_RACINE . copie_locale($depot['xml_paquets'], 'modif');
    $sha = sha1_file($fichier_xml);
    if ($depot['sha_paquets'] == $sha) {
        // Le fichier n'a pas change (meme sha1) alors on ne fait qu'actualiser la date
        // de mise a jour du depot en mettant a jour *inutilement* le sha1
        spip_log('Aucune modification du fichier XML, actualisation non declenchee - id_depot = ' . $depot['id_depot'], 'svp_actions.' . _LOG_INFO);
        sql_replace('spip_depots', array_diff_key($depot, array('maj' => '')));
    } else {
        // Le fichier a bien change il faut actualiser tout le depot
        $infos = svp_phraser_depot($fichier_xml);
        if (!$infos) {
            return false;
        }
        // On actualise les paquets dans spip_paquets en premier lieu.
        // Lors de la mise a jour des paquets, les plugins aussi sont actualises
        $ok = svp_actualiser_paquets($depot['id_depot'], $infos['paquets'], $nb_paquets, $nb_plugins, $nb_autres);
        // apres la mise a jour des paquets d'un depot, on actualise les informations des paquets locaux
        // principalement l'info "maj_version" indiquant s'il existe un paquet plus recent
        include_spip('inc/svp_depoter_local');
        svp_actualiser_maj_version();
        if ($ok) {
            // On met à jour :
            // -- les infos ne pouvant pas etre editees par le formulaire d'edition
            //    d'un depot et extraites du xml
            // -- le nombre de paquets et de plugins du depot ainsi que le nouveau sha1
            // ce qui aura pour effet d'actualiser la date de mise a jour
            $champs = array('url_serveur' => $infos['depot']['url_serveur'], 'url_brouteur' => $infos['depot']['url_brouteur'], 'url_archives' => $infos['depot']['url_archives'], 'url_commits' => $infos['depot']['url_commits'], 'nbr_paquets' => $nb_paquets, 'nbr_plugins' => $nb_plugins, 'nbr_autres' => $nb_autres, 'sha_paquets' => $sha);
            sql_updateq('spip_depots', $champs, 'id_depot=' . sql_quote($depot['id_depot']));
        }
    }
    return true;
}
Пример #10
0
function supprimer_documents($liste = array()) {
	if (!count($liste))
		return;

	$in = sql_in('id_document', $liste);

	// Supprimer les fichiers locaux et les copies locales
	// des docs distants
	$s = sql_select("fichier, distant", "spip_documents", $in);
	while ($t = sql_fetch($s)) {
		if ($t['distant'] == 'oui') {
			include_spip('inc/distant');
			if ($local = copie_locale($t['fichier'], 'test'))
				spip_log("efface $local = ".$t['fichier']);
				supprimer_fichier($local);
		}
		else {
			if (@file_exists($f = get_spip_doc($t['fichier']))) {
				spip_log("efface $f");
				supprimer_fichier($f);
			}
		}
	}

	// Supprimer les entrees dans spip_documents et associees
	sql_delete('spip_documents', $in);
	// en principe il ne devrait rien y avoir ici si les documents sont bien orphelins
	sql_delete('spip_documents_liens', $in);
}
Пример #11
0
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 (preg_match(';^(\\w{3,7}://);', $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);
}
Пример #12
0
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());
}
Пример #13
0
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 (preg_match(';^(\w{3,7}://);', $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 ($srcsize = @getimagesize($logo)){
			if (!$srcWidth)	$largeur_img[$logo] = $srcWidth = $srcsize[0];
			if (!$srcHeight)	$hauteur_img[$logo] = $srcHeight = $srcsize[1];
		}
		// $logo peut etre une reference a une image temporaire dont a n'a que le log .src
		// on s'y refere, l'image sera reconstruite en temps utile si necessaire
		elseif(@file_exists($f = "$logo.src")
		  AND lire_fichier($f,$valeurs)
		  AND $valeurs=unserialize($valeurs)) {
			if (!$srcWidth)	$largeur_img[$mem] = $srcWidth = $valeurs["largeur_dest"];
			if (!$srcHeight)	$hauteur_img[$mem] = $srcHeight = $valeurs["hauteur_dest"];
	  }
	}
	return array($srcHeight, $srcWidth);
}
Пример #14
0
function action_editer_site_dist($arg=null) {

	if (is_null($arg)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}
	$resyndiquer = false;

	include_spip('inc/filtres'); // pour vider_url()

	if (preg_match(',options/(\d+),',$arg, $r)) {
		$id_syndic = $r[1];
		$resyndiquer = editer_site_options($id_syndic);
	// Envoi depuis le formulaire d'edition d'un site existant
	} else if ($id_syndic = intval($arg)) {
		// reload si on change une des valeurs de syndication
		if (
		(_request('url_syndic') OR _request('resume') OR _request('syndication'))
		AND $t = sql_fetsel('url_syndic,syndication,resume', 'spip_syndic', "id_syndic=".sql_quote($id_syndic))
		AND (
			(_request('url_syndic') AND _request('url_syndic') != $t['url_syndic'])
			OR
			(_request('syndication') AND _request('syndication') != $t['syndication'])
			OR
			(_request('resume') AND _request('resume') != $t['resume'])
			)
		)
			set_request('reload', 'oui');
		revisions_sites($id_syndic);

	// Envoi normal depuis le formulaire de creation d'un site
	}
	elseif (strlen(vider_url(_request('url_site')))
		AND strlen(_request('nom_site'))) {
			set_request('reload', 'oui');
			$id_syndic = insert_syndic(_request('id_parent'));
			revisions_sites($id_syndic);
			if ($logo = _request('logo')
			 AND $format_logo = _request('format_logo')){
			 	include_spip('inc/distant');
				@rename(copie_locale($logo),
				_DIR_IMG . 'siteon'.$id_syndic.'.'.$format_logo);
			 }
	}
	// Erreur
	else {
		include_spip('inc/headers');
		redirige_url_ecrire();
	}

	// Re-syndiquer le site
	if (_request('reload') == 'oui') {
		// Effacer les messages si on supprime la syndication
		if (_request('syndication') == 'non')
			sql_delete("spip_syndic_articles", "id_syndic=".sql_quote($id_syndic));

		$t = sql_getfetsel('descriptif', 'spip_syndic', "id_syndic=$id_syndic AND syndication IN ('oui', 'sus', 'off')", '','', 1);
		if ($t !== NULL) {

			// Si descriptif vide, chercher le logo si pas deja la
			$chercher_logo = charger_fonction('chercher_logo', 'inc');
			if (!$logo = $chercher_logo($id_syndic, 'id_syndic', 'on')
			OR !$t) {
				if ($auto = vider_url(_request('url_auto'))) {
					$auto = analyser_site($auto);
					if (!strlen($t) AND strlen($auto['descriptif']))
						revisions_sites($id_syndic, array('descriptif' => $auto['descriptif']));
				}
				if (!$logo
				AND $auto['logo'] AND $auto['format_logo'])
					@rename($auto['logo'],
					_DIR_IMG . 'siteon'.$id_syndic.'.'.$auto['format_logo']);
			}
			$resyndiquer = true;
		}
	}

	if ($resyndiquer) {
	  // ah si PHP connaisait les fermetures...
	  // A la place, une constante utilisee exclusivement
	  // dans la fct suivante.
		define('_GENIE_SYNDIC_NOW', $id_syndic);
		// forcer l'execution immediate de cette tache
		// (i.e. appeler la fct suivante avec gestion du verrou)
		cron(0, array('syndic' => -91));
	}
	if (_request('redirect')) {
	$redirect = parametre_url(urldecode(_request('redirect')),
		'id_syndic', $id_syndic, '&');
		include_spip('inc/headers');
		redirige_par_entete($redirect);
	}
	else
		return array($id_syndic,'');
}
Пример #15
0
function image_du_document($document)
{
    $e = $document['extension'];
    if (strpos($GLOBALS['meta']['formats_graphiques'], $e) !== false and (!test_espace_prive() or $GLOBALS['meta']['creer_preview'] == 'oui') and $document['fichier']) {
        if ($document['distant'] == 'oui') {
            $image = _DIR_RACINE . copie_locale($document['fichier']);
        } else {
            $image = get_spip_doc($document['fichier']);
        }
        if (@file_exists($image)) {
            return $image;
        }
    }
    return '';
}
Пример #16
0
/**
 * Fonction volée dans le plugin Vidéo de SPIP (développé par XDjuj,
 * et distribué sous licence GNU GPLv3).
 *
 * Cette fonction est utilisée pour convertir des vidéos YouTube,
 * Dailymotion ou Viméo en des documents SPIP, qui seront intégrables
 * avec le modèle <videoXXX> (si le plugin Vidéo est bien installé).
 *
 * Code du plugin :
 *   http://zone.spip.org/trac/spip-zone/browser/_plugins_/videos
 * Code de la fonction :
 *   http://zone.spip.org/trac/spip-zone/browser/_plugins_/videos/trunk/formulaires/insertion_video.php
 **/
function importer_video($url)
{
    include_spip('inc/acces');
    // Retirer les trucs qui emmerdent : tous les arguments d'ancre / les espaces foireux les http:// et les www. éventuels
    $url = preg_replace('%(#.*$|https?://|www.)%', '', trim($url));
    if (preg_match('/dailymotion/', $url)) {
        $type = 'dist_daily';
        $fichier = preg_replace('#dailymotion\\.com/video/#', '', $url);
    } else {
        if (preg_match('/vimeo/', $url)) {
            $type = 'dist_vimeo';
            $fichier = preg_replace('#vimeo\\.com/#', '', $url);
            sleep(1);
        } else {
            if (preg_match('/(youtube|youtu\\.be)/', $url)) {
                $type = 'dist_youtu';
                $fichier = preg_replace('#(youtu\\.be/|youtube\\.com/watch\\?v=|&.*$|\\?hd=1)#', '', $url);
            }
        }
    }
    $titre = "";
    $descriptif = "";
    $id_vignette = "";
    // On tente de récupérer titre et description à l'aide de Videopian
    if (!preg_match('/culture/', $url) && version_compare(PHP_VERSION, '5.2') >= 0) {
        include_spip('lib_tierces/Videopian');
        // http://www.upian.com/upiansource/videopian/
        $Videopian = new Videopian();
        if ($Videopian) {
            $infosVideo = $Videopian->get($url);
            $titre = $infosVideo->title;
            $descriptif = $infosVideo->description;
            $nbVignette = abs(count($infosVideo->thumbnails) - 1);
            // prendre la plus grande vignette
            $logoDocument = $infosVideo->thumbnails[$nbVignette]->url;
            $logoDocument_width = $infosVideo->thumbnails[$nbVignette]->width;
            $logoDocument_height = $infosVideo->thumbnails[$nbVignette]->height;
        } else {
            //echo 'Exception reçue : ',  $e->getMessage(), "\n";
            spip_log("L'ajout automatique du titre et de la description a echoué", "Plugin Vidéo(s)");
        }
    }
    // On va pour l'instant utiliser le champ extension pour stocker le type de source
    $champs = array('titre' => $titre, 'extension' => $type, 'date' => date("Y-m-d H:i:s", time()), 'descriptif' => $descriptif, 'fichier' => $fichier, 'distant' => 'oui');
    /** Gérer le cas de la présence des champs de Médiathèque (parce que Mediatheque c'est le BIEN mais c'est pas toujours activé) **/
    $trouver_table = charger_fonction('trouver_table', 'base');
    $desc = $trouver_table('spip_documents');
    if (array_key_exists('taille', $desc['field'])) {
        if ($infosVideo) {
            $champs['taille'] = $infosVideo->duration;
        }
    }
    if (array_key_exists('credits', $desc['field'])) {
        if ($infosVideo) {
            $champs['credits'] = $infosVideo->author;
        }
    }
    if (array_key_exists('statut', $desc['field'])) {
        $champs['statut'] = 'publie';
    }
    if (array_key_exists('media', $desc['field'])) {
        $champs['media'] = 'video';
    }
    /* Cas de la présence d'une vignette à attacher */
    if ($logoDocument) {
        include_spip('inc/distant');
        if ($fichier = preg_replace("#IMG/#", '', copie_locale($logoDocument))) {
            // set_spip_doc ne fonctionne pas... Je ne sais pas pourquoi
            $champsVignette['fichier'] = $fichier;
            $champsVignette['mode'] = 'vignette';
            // champs extra à intégrer ds SPIP 3
            if (array_key_exists('statut', $desc['field'])) {
                $champsVignette['statut'] = 'publie';
            }
            if (array_key_exists('media', $desc['field'])) {
                $champsVignette['media'] = 'image';
            }
            // Recuperer les tailles
            $champsVignette['taille'] = @intval(filesize($fichier));
            $size_image = @getimagesize($fichier);
            $champsVignette['largeur'] = intval($size_image[0]);
            $champsVignette['hauteur'] = intval($size_image[1]);
            // $infos['type_image'] = decoder_type_image($size_image[2]);
            if ($champsVignette['largeur'] == 0) {
                // en cas d'echec, recuperer les infos videopian
                $champsVignette['largeur'] = $logoDocument_width;
                $champsVignette['hauteur'] = $logoDocument_height;
            }
            // Ajouter
            $id_vignette = sql_insertq('spip_documents', $champsVignette);
            if ($id_vignette) {
                $champs['id_vignette'] = $id_vignette;
            }
        } else {
            spip_log("Echec de l'insertion du logo {$logoDocument} pour la video {$document}", "Plugin Vidéo(s)");
        }
    }
    $document = sql_insertq('spip_documents', $champs);
    if ($document) {
        $document_lien = sql_insertq('spip_documents_liens', array('id_document' => $document, 'id_objet' => $id_objet, 'objet' => $objet, 'vu' => 'non'));
    }
    return $document;
}
Пример #17
0
/**
 * Teste la validité d'une URL d'un dépot de paquets
 *
 * Pour cela on tente de rapatrier le fichier distant
 * en local. Si on réussi, c'est bon.
 * 
 * @param string $url
 *     URL du fichier xml de description du depot
 * @return bool
 *     Le dépot est-il valide ?
 */
function svp_verifier_adresse_depot($url)
{
    include_spip('inc/distant');
    // evitons de recuperer 2 fois le XML demandé.
    // si on le recupere ici, il sera deja a jour pour le prochain copie_locale
    // lors du traitement.
    return copie_locale($url) ? true : false;
    #return (!$xml = recuperer_page($url)) ? false : true;
}
/**
 * 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;
}
Пример #19
0
function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_creation = NULL) {
	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' />";
	}
	# gerer img src="data:....base64"
	else if (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 (preg_match(';^(\w{3,7}://);', $source)){
		include_spip('inc/distant');
		$fichier = _DIR_RACINE . copie_locale($source);
		if (!$fichier) return "";
	}	else {
		// enlever le timestamp eventuel
		$source=preg_replace(',[?][0-9]+$,','',$source);
		$fichier = $source;
	}

	$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 (@file_exists($f = $fichier)){
		list ($ret["hauteur"],$ret["largeur"]) = taille_image($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"];
	}
	// pas de fichier source par la
	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);
	}
	
	$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 (isset($GLOBALS['var_images']) && $GLOBALS['var_images'] && !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);
		}
	}
	// todo: si une image png est nommee .jpg, le reconnaitre avec le bon $f
	$f = "imagecreatefrom".$term_fonction;
	if (!function_exists($f)) return false;
	$ret["fonction_imagecreatefrom"] = $f;
	$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);
	}
	return $ret;
}
/**
 * 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;
}
Пример #21
0
function action_tourner_post($r)
{
	$arg = $r[1];
	$row = sql_fetsel("fichier", "spip_documents", "id_document=$arg");

	if (!$row) return;

	include_spip('inc/charsets');	# pour le nom de fichier
	include_spip('inc/documents');
	// Fichier destination : on essaie toujours de repartir de l'original
	$var_rot = $r[2];
	include_spip('inc/distant'); # pour copie_locale
	$src = _DIR_RACINE . copie_locale(get_spip_doc($row['fichier']));
	if (preg_match(',^(.*)-r(90|180|270)\.([^.]+)$,', $src, $match)) {
		$effacer = $src;
		$src = $match[1].'.'.$match[3];
		$var_rot += intval($match[2]);
	}
	$var_rot = ((360 + $var_rot) % 360); // 0, 90, 180 ou 270

	if ($var_rot > 0) {
		$dest = preg_replace(',\.[^.]+$,', '-r'.$var_rot.'$0', $src);
		spip_log("rotation $var_rot $src : $dest");

		$process = $GLOBALS['meta']['image_process'];

		// imagick (php4-imagemagick)
		if ($process == 'imagick') {
			$handle = imagick_readimage($src);
			imagick_rotate($handle, $var_rot);
			imagick_write($handle, $dest);
			if (!@file_exists($dest)) return;	// echec imagick
		}
		else if ($process == "gd2") { // theoriquement compatible gd1, mais trop forte degradation d'image
			gdRotate ($src, $dest, $var_rot);
		}
		else if ($process == "convert") {
			if (_CONVERT_COMMAND!='') {
				define ('_CONVERT_COMMAND', 'convert');
				define ('_ROTATE_COMMAND', _CONVERT_COMMAND.' -rotate %t %src %dest');
			} else
				define ('_ROTATE_COMMAND', '');
			if (_ROTATE_COMMAND!=='') {
				$commande = str_replace(
					array('%t', '%src', '%dest'),
					array(
						$var_rot,
						escapeshellcmd($src),
						escapeshellcmd($dest)
					),
					_ROTATE_COMMAND);
				spip_log($commande);
				exec($commande);
			} else
				$dest = $src;
		}
	}
	else
		$dest = $src;

	$size_image = @getimagesize($dest);
	$largeur = $size_image[0];
	$hauteur = $size_image[1];

	// succes !
	if ($largeur>0 AND $hauteur>0) {
		sql_updateq('spip_documents', array('fichier' => set_spip_doc($dest), 'largeur'=>$largeur, 'hauteur'=>$hauteur), "id_document=$arg");
		if ($effacer) {
			spip_log("j'efface $effacer");
			spip_unlink($effacer);
		}
		// pipeline pour les plugins
		pipeline('post_edition',
			array(
				'args' => array(
					'table' => 'spip_documents',
					'table_objet' => 'documents',
					'spip_table_objet' => 'spip_documents',
					'type' =>'document',
					'id_objet' => $arg,
					'champs' => array('rotation'=>$r[2],'orientation'=>$var_rot,'fichier'=>$row),
					'serveur' => $serveur,
					'action'=>'tourner',
				),
				'data' => array('fichier'=>$row)
			)
		);
	}

}