/**
 * Generer l'url d'un document dans l'espace public,
 * fonction du statut du document
 *
 * @param int $id
 * @param string $args
 * @param string $ancre
 * @param string $public
 * @param string $connect
 * @return string
 *
 * http://doc.spip.org/@generer_url_ecrire_document
 */
function urls_generer_url_document_dist($id, $args = '', $ancre = '', $public = null, $connect = '')
{
    include_spip('inc/autoriser');
    include_spip('inc/documents');
    if (!autoriser('voir', 'document', $id)) {
        return '';
    }
    $r = sql_fetsel("fichier,distant", "spip_documents", "id_document=" . intval($id));
    if (!$r) {
        return '';
    }
    $f = $r['fichier'];
    if ($r['distant'] == 'oui') {
        return $f;
    }
    // Si droit de voir tous les docs, pas seulement celui-ci
    // il est inutilement couteux de rajouter une protection
    $r = autoriser('voir', 'document');
    if ($r and $r !== 'htaccess') {
        return get_spip_doc($f);
    }
    include_spip('inc/securiser_action');
    // cette url doit etre publique !
    $cle = calculer_cle_action($id . ',' . $f);
    // renvoyer une url plus ou moins jolie
    if ($GLOBALS['meta']['creer_htaccess']) {
        return _DIR_RACINE . "docrestreint.api/{$id}/{$cle}/{$f}";
    } else {
        return get_spip_doc($f) . "?{$id}/{$cle}";
    }
}
Example #2
0
/**
 * Pré-traitement du fichier $nom
 *
 * @param  string $nom
 * @param  Object $cfg
 * @return Object
 */
function cfg_pre_traiter_cfg_fichier($nom, &$cfg){
	include_spip('inc/flock');
	
	// enlever <OLD>
	$cfg->val[$nom] = str_replace('<OLD>','', $cfg->val[$nom]);
	
	// effacement
	if (_request('_cfg_delete')){
		$supprimer_fichier = _COMPAT_CFG_192 ? 'cfg_supprimer_fichier' : 'supprimer_fichier';
		if (!$supprimer_fichier(get_spip_doc($cfg->val[$nom]))) {
			$cfg->messages['erreurs'][$nom] = _T('cfg:erreur_suppression_fichier', array('fichier'=>get_spip_doc($cfg->val[$nom])));		
		}
	// ajout ou modification
	} else {
		$f = cfg_get_info_fichier_upload($nom);
		if ($f['tmp_name']) {
			// suppression de l'ancien fichier
			$supprimer_fichier = _COMPAT_CFG_192 ? 'cfg_supprimer_fichier' : 'supprimer_fichier';
			if ($cfg->val[$nom] && !$supprimer_fichier(get_spip_doc($cfg->val[$nom]))) {
				$cfg->messages['erreurs'][$nom] = _T('cfg:erreur_suppression_fichier', array('fichier'=>get_spip_doc($cfg->val[$nom])));	
			} else {
				if (!$fichier = cfg_ajoute_un_document($f['tmp_name'],$f['name'],$nom, 'config/'.$cfg->vue)){
					$cfg->messages['erreurs'][$nom] = _T('cfg:erreur_copie_fichier', array('fichier'=>'config/'.$cfg->vue . '/' . $f['name']));	
				} else {
					$cfg->val[$nom] = set_spip_doc($fichier);
				}
			}
		}
	}

	return $cfg;
}
Example #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;
}
/**
 * Verifier tous les fichiers brises
 *
 */
function action_verifier_documents_brises_dist()
{
    $securiser_action = charger_fonction('securiser_action', 'inc');
    $arg = $securiser_action();
    include_spip('inc/autoriser');
    if (autoriser('administrer', 'mediatheque')) {
        include_spip('inc/documents');
        $res = sql_select('fichier,brise,id_document', 'spip_documents', "distant='non'");
        while ($row = sql_fetch($res)) {
            if (($brise = !@file_exists(get_spip_doc($row['fichier']))) != $row['brise']) {
                sql_updateq('spip_documents', array('brise' => $brise), 'id_document=' . intval($row['id_document']));
            }
        }
    }
}
function action_elix_sansson_reencode_dist($arg = false)
{
    if (!intval($arg)) {
        $securiser_action = charger_fonction('securiser_action', 'inc');
        $arg = $securiser_action();
    }
    $ps_ffmpeg = exec('ps -C ffmpeg', $retour, $retour_int);
    if ($retour_int == 1 && count($retour) >= 3) {
        return false;
    }
    include_spip('inc/documents');
    $source = sql_fetsel('*', 'spip_documents', 'id_document=' . intval($arg));
    if (isset($source['fichier'])) {
        $chemin = get_spip_doc($source['fichier']);
        $dest = _DIR_TMP . basename($source['fichier']);
        $commande = 'ffmpeg -i ' . escapeshellarg($chemin) . ' -an -vcodec copy ' . escapeshellarg($dest);
        $encodage = exec($commande, $retour, $retour_int);
        if (file_exists($dest) && filesize($dest) > 0) {
            @rename($chemin, "{$chemin}--.old");
            $id_article = sql_getfetsel('id_objet', 'spip_documents_liens', 'id_document=' . intval($arg) . ' AND objet="article"');
            $ajouter_doc = charger_fonction('ajouter_documents', 'action');
            $objet = 'article';
            $id_objet = $id_article;
            $mode = 'document';
            $files = array();
            $filename = basename($dest);
            $files[0]['tmp_name'] = $dest;
            $files[0]['name'] = $filename;
            $id_document_new = $ajouter_doc($arg, $files, $objet, $id_objet, $mode);
            if (intval(reset($id_document_new)) > 0) {
                // retablir le fichier !
                if ($chemin) {
                    @rename("{$chemin}--.old", $chemin);
                }
            } else {
                // supprimer vraiment le fichier initial
                spip_unlink("{$chemin}--.old");
            }
        }
        if (file_exists($dest)) {
            spip_unlink($dest);
        }
    }
}
function formulaires_illustrer_document_charger_dist($id_document)
{
    include_spip('inc/documents');
    $valeurs = sql_fetsel('id_document,mode,id_vignette,extension,media', 'spip_documents', 'id_document=' . intval($id_document));
    if (!$valeurs) {
        return array('editable' => false, 'id' => $id_document);
    }
    $valeurs['id'] = $id_document;
    $valeurs['_hidden'] = "<input name='id_document' value='{$id_document}' type='hidden' />";
    $valeurs['mode'] = 'vignette';
    // pour les id dans le dom
    $vignette = sql_fetsel('fichier,largeur,hauteur,id_document', 'spip_documents', 'id_document=' . $valeurs['id_vignette']);
    $valeurs['vignette'] = get_spip_doc($vignette['fichier']);
    $valeurs['hauteur'] = $vignette['hauteur'];
    $valeurs['largeur'] = $vignette['largeur'];
    $valeurs['id_vignette'] = $vignette['id_document'];
    $valeurs['_pipeline'] = array('editer_contenu_objet', array('type' => 'illustrer_document', 'id' => $id_document));
    return $valeurs;
}
function formulaires_changer_fichier_document_traiter_dist($id_document)
{
    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'] = _T('medias:document_copie_locale_succes');
        } else {
            $res['message_erreur'] = $err;
        }
    } 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 @file_exists($f = get_spip_doc($ancien_fichier))) {
            spip_unlink($f);
        }
        $traiter = charger_fonction('traiter', 'formulaires/joindre_document');
        $res = $traiter($id_document);
    }
    return $res;
}
Example #10
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
		)
	);
}
Example #11
0
/**
 * Enregistre une revision de document.
 * $set est un contenu (par defaut on prend le contenu via _request())
 *
 * @param int $id_document
 * @param array|bool $set
 */
function document_modifier($id_document, $set = false)
{
    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('invalideur' => $invalideur, 'indexation' => $indexation), $champs)) {
        return $err;
    }
    // nettoyer l'ancien fichier si necessaire
    if ($champs['fichier'] and $ancien_fichier and $ancien_fichier !== $champs['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}'");
    }
}
Example #12
0
function vignette_revision($id, $data, $type, $ref) {
	$s = sql_fetsel("*","spip_documents","id_document=".intval($id));
	if (!is_array($s))
		return false;

	include_spip('inc/modifier');
	include_spip('inc/documents');
	// Chargement d'un nouveau doc ?
	if ($data['vignette']) {
		define('FILE_UPLOAD', true);
		if(is_numeric($s['id_vignette']) && ($s['id_vignette']>0)){
			spip_log('suppression de la vignette');
			// Suppression du document
			$vignette = sql_getfetsel('fichier', 'spip_documents', 'id_document='.intval($s['id_vignette']));
			if (@file_exists($f = get_spip_doc($vignette))) { 
				spip_log("efface $f"); 
				supprimer_fichier($f); 
			}
			sql_delete('spip_documents', 'id_document='.intval($s['id_vignette']));
			sql_delete('spip_documents_liens',  'id_document='.intval($s['id_vignette']));

			pipeline('post_edition',
				array(
					'args' => array(
						'operation' => 'supprimer_document',
						'table' => 'spip_documents',
						'id_objet' => $s['id_vignette']
					),
					'data' => null
				)
			);
			
			// On remet l'id_vignette a 0
			revision_document($s['id_document'], array('id_vignette'=>0));
		}
		// Ajout du document comme vignette
		$ajouter_documents = charger_fonction('ajouter_documents', 'inc');
		$arg = $data['vignette'];
		check_upload_error($arg['error']);
		$x = $ajouter_documents($arg['tmp_name'], $arg['name'],'','', 'vignette', $id, $actifs);
	}else
		// Suppression de la vignette ?
		if ($wid = array_pop($ref)
			AND $_POST['content_'.$wid.'_vignette_supprimer'] == 'on') {
			if(is_numeric($s['id_vignette']) && ($s['id_vignette']>0)){
				// Suppression du document
				$vignette = sql_getfetsel('fichier', 'spip_documents', 'id_document='.intval($s['id_vignette']));
				if (@file_exists($f = get_spip_doc($vignette))) { 
					spip_log("efface $f"); 
					supprimer_fichier($f); 
				}
				sql_delete('spip_documents', 'id_document='.intval($s['id_vignette']));
				sql_delete('spip_documents_liens',  'id_document='.intval($s['id_vignette']));
				
				pipeline('post_edition',
					array(
						'args' => array(
							'operation' => 'supprimer_document',
							'table' => 'spip_documents',
							'id_objet' => $s['id_vignette']
						),
						'data' => null
					)
				);
				
				// On remet l'id_vignette a 0
				revision_document($s['id_document'], array('id_vignette'=>0));
			}
		}
	return true;
}
Example #13
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 '';
}
Example #14
0
function action_acceder_document_dist() {
	include_spip('inc/documents');

	// $file exige pour eviter le scan id_document par id_document
	$f = rawurldecode(_request('file'));
	$file = get_spip_doc($f);
	$arg = rawurldecode(_request('arg'));

	$status = $dcc = false;
	if (strpos($f,'../') !== false
	OR preg_match(',^\w+://,', $f)) {
		$status = 403;
	}
	else if (!file_exists($file) OR !is_readable($file)) {
		$status = 404;
	} else {
		$where = "documents.fichier=".sql_quote(set_spip_doc($file))
		. ($arg ? " AND documents.id_document=".intval($arg): '');

		$doc = sql_fetsel("documents.id_document, documents.titre, documents.fichier, types.mime_type, types.inclus, documents.extension", "spip_documents AS documents LEFT JOIN spip_types_documents AS types ON documents.extension=types.extension",$where);
		if (!$doc) {
			$status = 404;
		} else {

			// ETag pour gerer le status 304
			$ETag = md5($file . ': '. filemtime($file));
			if (isset($_SERVER['HTTP_IF_NONE_MATCH'])
			AND $_SERVER['HTTP_IF_NONE_MATCH'] == $ETag) {
				http_status(304); // Not modified
				exit;
			} else {
				header('ETag: '.$ETag);
			}

			//
			// Verifier les droits de lecture du document
			// en controlant la cle passee en argument
			//
			include_spip('inc/securiser_action');
			$cle = _request('cle');
			if (!verifier_cle_action($doc['id_document'].','.$f, $cle)) {
				spip_log("acces interdit $cle erronee");
				$status = 403;
			}
		}
	}

	switch($status) {

	case 403:
		include_spip('inc/minipres');
		echo minipres();
		break;

	case 404:
		http_status(404);
		include_spip('inc/minipres');
		echo minipres(_T('erreur').' 404',
			_T('info_document_indisponible'));
		break;

	default:
		header("Content-Type: ". $doc['mime_type']);

		// pour les images ne pas passer en attachment
		// sinon, lorsqu'on pointe directement sur leur adresse,
		// le navigateur les downloade au lieu de les afficher

		if ($doc['inclus']=='non') {

			$f = basename($file);
			// ce content-type est necessaire pour eviter des corruptions de zip dans ie6
			header('Content-Type: application/octet-stream');

			header("Content-Disposition: attachment; filename=\"$f\";");
			header("Content-Transfer-Encoding: binary");

			// fix for IE catching or PHP bug issue
			header("Pragma: public");
			header("Expires: 0"); // set expiration time
			header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

		}

		if ($cl = filesize($file))
			header("Content-Length: ". $cl);

		readfile($file);
		break;
	}

}
Example #15
0
function boutons_rotateurs($document, $type, $id, $id_document, $script) {
	global $spip_lang_right;

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

	// bloc rotation de l'image
	// si c'est une image, qu'on sait la faire tourner, qu'elle
	// n'est pas distante, qu'elle est bien presente dans IMG/
	// qu'elle n'a pas de vignette perso ; et qu'on a la bibli !
	if ($document['distant']!='oui' 
	AND in_array($document['extension'], array('gif', 'jpg', 'png'))
	AND (strpos($GLOBALS['meta']['formats_graphiques'], $document['extension'])!==false)
	AND ($process == 'imagick'
		OR $process == 'gd2'
		OR $process == 'convert'
		OR $process == 'netpbm')
	AND @file_exists(get_spip_doc($document['fichier']))
	) {

	  return "\n<div class='verdana1' style='float: $spip_lang_right; text-align: $spip_lang_right;'>" .

		bouton_tourner_document($id, $id_document, $script, -90, $type, 'tourner-gauche-10.gif', _T('image_tourner_gauche')) .

		bouton_tourner_document($id, $id_document, $script,  90, $type, 'tourner-droite-10.gif', _T('image_tourner_droite')) .

		bouton_tourner_document($id, $id_document, $script, 180, $type, 'tourner-demitour-10.gif', _T('image_tourner_180')) .
		"</div>\n";
	}
}
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;
}
/**
 * Massicoter un logo document
 *
 * Traitement automatique sur les balises #LOGO_DOCUMENT
 *
 * @param string $fichier : Le logo
 *
 * @return string : Un logo massicoté
 */
function massicoter_logo_document($logo, $doc = array())
{
    include_spip('inc/filtres');
    include_spip('inc/filtres_images_mini');
    /* S'il n'y a pas de fichier dans la pile, on va le chercher dans
       la table documents */
    if (!isset($doc['fichier'])) {
        include_spip('base/abstract_sql');
        $rows = sql_allfetsel('fichier, extension', 'spip_documents', 'id_document=' . intval($doc['id_document']));
        $doc['fichier'] = $rows[0]['fichier'];
        $doc['extension'] = $rows[0]['extension'];
    }
    /* Si le document en question n'est pas une image, on ne fait rien */
    if (!$logo or preg_match('/^(jpe?g|png|gif)$/i', $doc['extension']) === 0) {
        return $logo;
    }
    /* S'il y a un lien sur le logo, on le met de côté pour le
       remettre après massicotage */
    if (preg_match('#(<a.*?>)<img.*$#', $logo) === 1) {
        $lien = preg_replace('#(<a.*?>)<img.*$#', '$1', $logo);
    }
    $fichier = extraire_attribut($logo, 'src');
    /* On se débarasse d'un éventuel query string */
    $fichier = preg_replace('#\\?[0-9]+#', '', $fichier);
    list($largeur_logo, $hauteur_logo) = getimagesize($fichier);
    $balise_img = charger_filtre('balise_img');
    $fichier_massicote = massicoter_document(get_spip_doc($doc['fichier']));
    /* Comme le logo reçu en paramètre peut avoir été réduit grâce aux
       paramètres de la balise LOGO_, il faut s'assurer que l'image
       qu'on renvoie fait bien la même taille que le logo qu'on a
       reçu. */
    $balise = image_reduire($balise_img($fichier_massicote, extraire_attribut($logo, 'alt'), extraire_attribut($logo, 'class')), $largeur_logo, $hauteur_logo);
    if (isset($lien)) {
        $balise = $lien . $balise . '</a>';
    }
    return $balise;
}
function BOUCLE_logo_art_dochtml_d7ab7eee0b09f43b71ae8cf8a6406a91(&$Cache, &$Pile, &$doublons, &$Numrows, $SP)
{
    static $command = array();
    static $connect;
    $command['connect'] = $connect = '';
    if (!isset($command['table'])) {
        $command['table'] = 'documents';
        $command['id'] = '_logo_art_doc';
        $command['from'] = array('documents' => 'spip_documents', 'L1' => 'spip_documents_liens');
        $command['type'] = array();
        $command['groupby'] = array();
        $command['select'] = array("documents.fichier", "documents.titre", "L1.id_objet AS id_article", "documents.descriptif");
        $command['orderby'] = array();
        $command['join'] = array('L1' => array('documents', 'id_document'));
        $command['limit'] = '';
        $command['having'] = array();
    }
    $command['where'] = array(quete_condition_statut('documents.statut', 'publie,prop,prepa', 'publie', ''), array('IN', 'documents.mode', '(\'image\',\'document\')'), array('(documents.taille > 0 OR documents.distant=\'oui\')'), array('=', 'L1.id_objet', sql_quote($Pile[$SP]['id_article'], '', 'bigint(21) NOT NULL DEFAULT \'0\'')), array('=', 'L1.objet', sql_quote('article')), array('=', 'documents.titre', "'Annonce'"));
    if (defined("_BOUCLE_PROFILER")) {
        $timer = time() + microtime();
    }
    $t0 = "";
    // REQUETE
    $iter = IterFactory::create("SQL", $command, array('squelettes/inc/inc-annonces.html', 'html_d7ab7eee0b09f43b71ae8cf8a6406a91', '_logo_art_doc', 41, $GLOBALS['spip_lang']));
    if (!$iter->err()) {
        $SP++;
        // RESULTATS
        while ($Pile[$SP] = $iter->fetch()) {
            $t0 .= '
                ' . (($t1 = strval(interdire_scripts(inserer_attribut(filtrer('image_graver', filtrer('image_reduire', get_spip_doc($Pile[$SP]['fichier']), '150', '0')), 'alt', interdire_scripts(attribut_html(couper(typo(supprimer_numero($Pile[$SP]['titre']), "TYPO", $connect, $Pile[0]), '80'))))))) !== '' ? '<a href="' . vider_url(urlencode_1738(generer_url_entite($Pile[$SP]['id_article'], 'article', '', '', true))) . '"' . (($t2 = strval(interdire_scripts(attribut_html(propre($Pile[$SP]['descriptif'], $connect, $Pile[0]))))) !== '' ? ' title="' . $t2 . '"' : '') . '>' . $t1 . '</a>' : '') . '
              ';
        }
        $iter->free();
    }
    if (defined("_BOUCLE_PROFILER") and 1000 * ($timer = time() + microtime() - $timer) > _BOUCLE_PROFILER) {
        spip_log(intval(1000 * $timer) . "ms BOUCLE_logo_art_doc @ squelettes/inc/inc-annonces.html", "profiler" . _LOG_AVERTISSEMENT);
    }
    return $t0;
}
/**
 * Tester le type de document
 *
 * - le document existe et n'est pas de taille 0 ?
 * - interdit a l'upload ?
 * - quelle extension dans spip_types_documents ?
 * - est-ce "inclus" comme une image ?
 *
 * Le zipper si necessaire
 *
 * @param array $file
 *     Au format $_FILES
 * @param string $mode
 *     Mode d'inclusion du fichier, si connu
 * @return array
 */
function fixer_fichier_upload($file, $mode = '')
{
    /**
     * On vérifie que le fichier existe et qu'il contient quelque chose
     */
    if (is_array($row = verifier_upload_autorise($file['name'], $mode))) {
        if (!isset($row['autozip'])) {
            $row['fichier'] = copier_document($row['extension'], $file['name'], $file['tmp_name']);
            /**
             * On vérifie que le fichier a une taille
             * si non, on le supprime et on affiche une erreur
             */
            if ($row['fichier'] && !($taille = @intval(filesize(get_spip_doc($row['fichier']))))) {
                spip_log("Echec copie du fichier " . $file['tmp_name'] . " (taille de fichier indéfinie)");
                spip_unlink(get_spip_doc($row['fichier']));
                return _T('medias:erreur_copie_fichier', array('nom' => $file['tmp_name']));
            } else {
                return $row;
            }
        } else {
            unset($row['autozip']);
            $ext = 'zip';
            if (!($tmp_dir = tempnam(_DIR_TMP, 'tmp_upload'))) {
                return false;
            }
            spip_unlink($tmp_dir);
            @mkdir($tmp_dir);
            include_spip('inc/charsets');
            $tmp = $tmp_dir . '/' . translitteration($file['name']);
            $file['name'] .= '.' . $ext;
            # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip
            // deplacer le fichier tmp_name dans le dossier tmp
            deplacer_fichier_upload($file['tmp_name'], $tmp, true);
            include_spip('inc/pclzip');
            $source = _DIR_TMP . basename($tmp_dir) . '.' . $ext;
            $archive = new PclZip($source);
            $v_list = $archive->create($tmp, PCLZIP_OPT_REMOVE_PATH, $tmp_dir, PCLZIP_OPT_ADD_PATH, '');
            effacer_repertoire_temporaire($tmp_dir);
            if (!$v_list) {
                spip_log("Echec creation du zip ");
                return false;
            }
            $row['fichier'] = copier_document($row['extension'], $file['name'], $source);
            spip_unlink($source);
            /**
             * On vérifie que le fichier a une taille
             * si non, on le supprime et on affiche une erreur
             */
            if ($row['fichier'] && !($taille = @intval(filesize(get_spip_doc($row['fichier']))))) {
                spip_log("Echec copie du fichier " . $file['tmp_name'] . " (taille de fichier indéfinie)");
                spip_unlink(get_spip_doc($row['fichier']));
                return _T('medias:erreur_copie_fichier', array('nom' => $file['tmp_name']));
            } else {
                return $row;
            }
        }
    } else {
        return $row;
    }
    // retourner le message d'erreur
}
Example #20
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);
}
Example #21
0
/**
 * acces aux documents joints securise
 * verifie soit que le demandeur est authentifie
 * soit que le document est publie, c'est-a-dire
 * joint a au moins 1 article, breve ou rubrique publie
 *
 * URLs de la forme :
 * docrestreint.api/id/cle/file
 *
 * @param null $arg
 */
function action_api_docrestreint_dist($arg = null)
{
    $status = 404;
    if (is_null($arg)) {
        $arg = _request('arg');
    }
    $arg = explode("/", $arg);
    // supprimer et vider les buffers qui posent des problemes de memory limit
    // http://www.php.net/manual/en/function.readfile.php#81032
    @ini_set("zlib.output_compression", "0");
    // pour permettre l'affichage au fur et a mesure
    @ini_set("output_buffering", "off");
    @ini_set('implicit_flush', 1);
    @ob_implicit_flush(1);
    $level = ob_get_level();
    while ($level--) {
        @ob_end_clean();
    }
    if (count($arg) >= 3) {
        $id_document = intval(array_shift($arg));
        $cle = array_shift($arg);
        // file exige pour eviter le scan id_document par id_document
        $f = implode("/", $arg);
        if ($id_document == 0 and $cle == 1 and $f == "test/.test") {
            echo "OK";
            return;
        }
        include_spip('inc/documents');
        $file = get_spip_doc($f);
        spip_log($file, 'dbg');
        $status = $dcc = false;
        $dossiers_a_exclure = array('nl');
        // securite : on refuse tout ../ ou url absolue
        if (strpos($f, '../') !== false or preg_match(',^\\w+://,', $f)) {
            $status = 403;
        } else {
            if (!file_exists($file) or !is_readable($file)) {
                $status = 404;
            } elseif (preg_match('%^(' . join('|', $dossiers_a_exclure) . ')/%', $f)) {
                $status = 200;
            } else {
                $where = "documents.fichier=" . sql_quote(set_spip_doc($file)) . ($id_document ? " AND documents.id_document=" . intval($id_document) : '');
                spip_log($where, 'dbg');
                $doc = sql_fetsel("documents.id_document, documents.titre, documents.fichier, types.mime_type, types.inclus, documents.extension", "spip_documents AS documents LEFT JOIN spip_types_documents AS types ON documents.extension=types.extension", $where);
                spip_log($doc, 'dbg');
                if (!$doc) {
                    $status = 404;
                } else {
                    // ETag pour gerer le status 304
                    $ETag = md5($file . ': ' . filemtime($file));
                    if (isset($_SERVER['HTTP_IF_NONE_MATCH']) and $_SERVER['HTTP_IF_NONE_MATCH'] == $ETag) {
                        http_status(304);
                        // Not modified
                        exit;
                    } else {
                        header('ETag: ' . $ETag);
                    }
                    //
                    // Verifier les droits de lecture du document
                    // en controlant la cle passee en argument si elle est dispo
                    // (perf issue : toutes les urls ont en principe cette cle fournie dans la page au moment du calcul de la page)
                    if ($cle) {
                        include_spip('inc/securiser_action');
                        if (!verifier_cle_action($doc['id_document'] . ',' . $f, $cle)) {
                            spip_log("acces interdit {$cle} erronee");
                            $status = 403;
                        }
                    } else {
                        if (!function_exists("autoriser")) {
                            include_spip("inc/autoriser");
                        }
                        if (!autoriser('voir', 'document', $doc['id_document'])) {
                            $status = 403;
                            spip_log("acces interdit {$cle} erronee");
                        }
                    }
                }
            }
        }
    }
    switch ($status) {
        case 403:
            include_spip('inc/minipres');
            echo minipres("", "", "", true);
            break;
        case 404:
            http_status(404);
            include_spip('inc/minipres');
            echo minipres(_T('erreur') . ' 404', _T('medias:info_document_indisponible'), "", true);
            break;
        default:
            header("Content-Type: " . $doc['mime_type']);
            // pour les images ne pas passer en attachment
            // sinon, lorsqu'on pointe directement sur leur adresse,
            // le navigateur les downloade au lieu de les afficher
            if ($doc['inclus'] == 'non') {
                $f = basename($file);
                // ce content-type est necessaire pour eviter des corruptions de zip dans ie6
                header('Content-Type: application/octet-stream');
                header("Content-Disposition: attachment; filename=\"{$f}\";");
                header("Content-Transfer-Encoding: binary");
                // fix for IE catching or PHP bug issue
                header("Pragma: public");
                header("Expires: 0");
                // set expiration time
                header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            } else {
                header("Expires: 3600");
                // set expiration time
            }
            if ($cl = filesize($file)) {
                header("Content-Length: " . $cl);
            }
            readfile($file);
            break;
    }
}
Example #22
0
function action_acceder_document_dist() {
	include_spip('inc/documents');

	// $file exige pour eviter le scan id_document par id_document
	$f = rawurldecode(_request('file'));
	$file = get_spip_doc($f);
	$arg = rawurldecode(_request('arg'));

	$status = $dcc = false;
	if (strpos($f,'../') !== false
	OR preg_match(',^\w+://,', $f)) {
		$status = 403;
	}
	else if (!file_exists($file) OR !is_readable($file)) {
		$status = 404;
	} else {
		$path = set_spip_doc($file);
		$path2 = generer_acceder_document($f, $arg);
		$where = "(documents.fichier=".sql_quote($path)
		  . ' OR documents.fichier=' . sql_quote($path2) . ')'
		  . ($arg ? (" AND documents.id_document=".intval($arg)) : '');

		$doc = sql_fetsel("documents.id_document, documents.titre, documents.fichier, types.mime_type, types.inclus, documents.extension", "spip_documents AS documents LEFT JOIN spip_types_documents AS types ON documents.extension=types.extension",$where);
		if (!$doc) {
			$status = 404;
		} else {

			// ETag pour gerer le status 304
			$ETag = md5($file . ': '. filemtime($file));
			if (isset($_SERVER['HTTP_IF_NONE_MATCH'])
			AND $_SERVER['HTTP_IF_NONE_MATCH'] == $ETag) {
				http_status(304); // Not modified
				exit;
			} else {
				header('ETag: '.$ETag);
			}

			//
			// Verifier les droits de lecture du document
			// en controlant la cle passee en argument
			//
			include_spip('inc/securiser_action');
			$cle = _request('cle');
			if (!verifier_cle_action($doc['id_document'].','.$f, $cle)) {
				spip_log("acces interdit $cle erronee");
				$status = 403;
			}
		}
	}

	switch($status) {

	case 403:
		include_spip('inc/minipres');
		echo minipres();
		break;

	case 404:
		http_status(404);
		include_spip('inc/minipres');
		echo minipres(_T('erreur').' 404',
			_T('info_document_indisponible'));
		break;

	default:
		header("Content-Type: ". $doc['mime_type']);

		// Si le fichier a un titre avec extension,
		// ou si c'est un nom bien connu d'Unix, le prendre
		// sinon l'ignorer car certains navigateurs pataugent

		$f = basename($file);
		if (isset($doc['titre'])
		AND (preg_match('/^\w+[.]\w+$/', $doc['titre']) OR $doc['titre'] == 'Makefile'))
				$f = $doc['titre'];

		$f = "filename=\"$f\"";

		// Pour les document affichables par les navigateurs,
		// ne pas envoyer "Content-Disposition: attachment" sinon 
		// le navigateur cree un fichier au lieu de l'afficher.
		// Mais la propriete "affichable" n'est pas toujours devinable,
		// il faut quand meme donner un nom au fichier eventuel. 
		// Celui-ci est malheureusement souvent ignore, cf
		// http://greenbytes.de/tech/tc2231/

		if ($doc['inclus']!=='non') {
			header("Content-Disposition: inline; $f");
		} else {

			header("Content-Disposition: attachment; $f;");

			// ce content-type est necessaire
			// pour eviter des corruptions de zip dans ie6
			header('Content-Type: application/octet-stream');
			header("Content-Transfer-Encoding: binary");

			// fix for IE catching or PHP bug issue
			header("Pragma: public");
			header("Expires: 0"); // set expiration time
			header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

		}

		if ($cl = filesize($file))
			header("Content-Length: ". $cl);

		readfile($file);
		break;
	}

}
Example #23
0
function vignette_revision($id, $data, $type, $ref)
{
    $s = sql_fetsel("id_document,id_vignette", "spip_documents", "id_document=" . intval($id));
    if (!is_array($s)) {
        return false;
    }
    include_spip('inc/modifier');
    include_spip('inc/documents');
    include_spip('action/editer_document');
    //pour revision_document
    // Chargement d'un nouveau doc ?
    if ($data['vignette']) {
        define('FILE_UPLOAD', true);
        if (is_numeric($s['id_vignette']) && $s['id_vignette'] > 0) {
            spip_log('suppression de la vignette');
            // Suppression du document
            $vignette = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($s['id_vignette']));
            if (@file_exists($f = get_spip_doc($vignette))) {
                spip_log("efface {$f}");
                supprimer_fichier($f);
            }
            sql_delete('spip_documents', 'id_document=' . intval($s['id_vignette']));
            sql_delete('spip_documents_liens', 'id_document=' . intval($s['id_vignette']));
            pipeline('post_edition', array('args' => array('operation' => 'supprimer_document', 'table' => 'spip_documents', 'id_objet' => $s['id_vignette']), 'data' => null));
            $id_vignette = 0;
        }
        $arg = $data['vignette'];
        check_upload_error($arg['error']);
        // Ajout du document comme vignette
        /**
         * Méthode >= SPIP 3.0 
         * ou SPIP 2.x + Mediatheque
         */
        if ($ajouter_documents = charger_fonction('ajouter_documents', 'action', true)) {
            $x = $ajouter_documents(null, array($arg), '', 0, 'vignette');
            $vignette = reset($x);
            if (intval($vignette)) {
                document_modifier($id, array('id_vignette' => $vignette));
            } else {
                if ($id_vignette) {
                    document_modifier($id, array('id_vignette' => $id_vignette));
                }
            }
        } else {
            if ($ajouter_documents = charger_fonction('ajouter_documents', 'inc', true)) {
                // On remet l'id_vignette a 0 si on l'a supprimé
                if ($id_vignette) {
                    revision_document($s['id_document'], array('id_vignette' => 0));
                }
                $x = $ajouter_documents($arg['tmp_name'], $arg['name'], '', '', 'vignette', $id, $actifs);
            }
        }
    } else {
        // Suppression de la vignette ?
        if ($wid = array_pop($ref) and $_POST['content_' . $wid . '_vignette_supprimer'] == 'on') {
            if (is_numeric($s['id_vignette']) && $s['id_vignette'] > 0) {
                // Suppression du document
                $vignette = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($s['id_vignette']));
                if (@file_exists($f = get_spip_doc($vignette))) {
                    spip_log("efface {$f}");
                    supprimer_fichier($f);
                }
                sql_delete('spip_documents', 'id_document=' . intval($s['id_vignette']));
                sql_delete('spip_documents_liens', 'id_document=' . intval($s['id_vignette']));
                pipeline('post_edition', array('args' => array('operation' => 'supprimer_document', 'table' => 'spip_documents', 'id_objet' => $s['id_vignette']), 'data' => null));
                // On remet l'id_vignette a 0
                revision_document($s['id_document'], array('id_vignette' => 0));
            }
        }
    }
    return true;
}
Example #24
0
/**
 * Retourne la vignette explicitement attachee a un document
 * le resutat est un fichier local existant, ou une URL
 * ou vide si pas de vignette
 *
 * @param array $row
 * @param string $connect
 * @return string
 */
function vignette_logo_document($row, $connect = '')
{
    if (!$row['id_vignette']) {
        return '';
    }
    $fichier = quete_fichier($row['id_vignette'], $connect);
    if ($connect) {
        $site = quete_meta('adresse_site', $connect);
        $dir = quete_meta('dir_img', $connect);
        return "{$site}/{$dir}{$fichier}";
    }
    $f = get_spip_doc($fichier);
    if ($f and @file_exists($f)) {
        return $f;
    }
    if ($row['mode'] !== 'vignette') {
        return '';
    }
    return generer_url_entite($row['id_document'], 'document', '', '', $connect);
}
Example #25
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)
			)
		);
	}

}
Example #26
0
/**
 * Récupère le contenu d'un média
 * 
 * Arguments possibles :
 * -* login
 * -* pass
 * -* id_article int (Obligatoire)
 * -* champs_demandes string (champs que l'on souhaite récupérer, séparés par une virgule, sinon, on retourne l'ensemble)
 * -* document_largeur int (largeur maximale du document, si c'est une image, défaut largeur du document original)
 * -* document_hauteur int (hauteur maximale du document, si c'est une image, défaut hauteur du document original)
 * -* vignette_format string (carre ou autre, autre n'a pas de fonction)
 * -* vignette_largeur int (largeur de la vignette en px, défaut 100)
 * -* vignette_hauteur int (hauteur de la vignette en px, défaut 100)
 */
function geodiv_lire_media($args)
{
    global $spip_xmlrpc_serveur;
    if (!intval($args['id_article']) > 0) {
        $erreur = _T('xmlrpc:erreur_identifiant', array('objet' => 'article'));
        return new IXR_Error(-32601, attribut_html($erreur));
    }
    $champs_demandes = is_array($args['champs_demandes']) ? $args['champs_demandes'] : array();
    $format_vignette = $args['vignette_format'];
    $config = lire_config('geol', array());
    $secteur_medias = intval($config['secteur_medias']) > 0 ? $config['secteur_medias'] : 1;
    $args_media = array_merge($args, array('objet' => 'article', 'id_objet' => $args['id_article']));
    $res = $spip_xmlrpc_serveur->read($args_media);
    if (!$res) {
        return $spip_xmlrpc_serveur->error;
    }
    $id_secteur = $res['result'][0]['id_secteur'] ? $res['result'][0]['id_secteur'] : sql_getfetsel('id_secteur', 'spip_articles', 'id_article=' . intval($args['id_article']));
    /**
     * Sécurité : L'article demandé n'est pas un média
     */
    if ($id_secteur != $secteur_medias) {
        $erreur = _T('xmlrpc_geodiv:erreur_article_media', array('id_article' => $args['id_article']));
        return new IXR_Error(-32601, attribut_html($erreur));
    }
    /**
     * Si on demande précisément certains champs, on ne fait que les renvoyer
     */
    if (count($champs_demandes) != 0) {
        foreach ($res['result'][0] as $champ => $valeur) {
            if (!in_array($champ, array('id_article')) && !in_array($champ, $champs_demandes)) {
                unset($res['result'][0][$champ]);
            }
        }
    }
    /**
     * On ajoute le booléen "modifiable" :
     * Uniquement si on ne demande pas de champs spécifique ou qu'il soit dedans
     */
    if (count($champs_demandes) == 0 || in_array('modifiable', $champs_demandes)) {
        if (autoriser('modifier', 'id_article', $args['id_article'], $GLOBALS['visiteur_session'])) {
            $res['result'][0]['modifiable'] = 1;
        } else {
            $res['result'][0]['modifiable'] = 0;
        }
    }
    /**
     * On ajoute le logo de l'article :
     * Uniquement si on ne demande pas de champs spécifique ou qu'il soit dedans
     */
    if (count($champs_demandes) == 0 || in_array('logo', $champs_demandes)) {
        $logo = quete_logo('id_article', 'on', $res['result'][0]['id_article'], '', false);
        if (is_array($logo)) {
            $res['result'][0]['logo'] = url_absolue($logo[0]);
        }
    }
    /**
     * On a les infos de l'article, on récupère maintenant :
     * (si pas de champs demandés spécifiés ou les champs en question sont demandés)
     * -* Son document
     * -* Sa vignette
     * -* Sa géoloc
     * -* Ses mots clés
     * -** tags
     * -** échelle
     * -* Ses commentaires
     */
    /**
     * On commence par le document principal
     */
    if (count($champs_demandes) == 0 || in_array('document', $champs_demandes) || in_array('vignette', $champs_demandes)) {
        $document = sql_fetsel('*', 'spip_documents as documents LEFT JOIN spip_documents_liens AS lien ON documents.id_document=lien.id_document', 'lien.objet=' . sql_quote('article') . ' AND lien.id_objet=' . intval($args['id_article']), array(), array(), 1);
        if (is_array($document)) {
            include_spip('inc/documents');
            include_spip('inc/filtres_images_mini');
            include_spip('filtres/images_transforme');
            if (count($champs_demandes) == 0 || in_array('document', $champs_demandes)) {
                $largeur_document = $args['document_largeur'];
                $hauteur_document = $args['document_hauteur'];
                if (in_array($document['extension'], array('gif', 'png', 'jpg')) && ($largeur_document || $hauteur_document)) {
                    $res['result'][0]['document'] = url_absolue(extraire_attribut(image_reduire(get_spip_doc($document['fichier']), $largeur_document, $hauteur_document), 'src'));
                } else {
                    $res['result'][0]['document'] = url_absolue(get_spip_doc($document['fichier']));
                }
                $res['result'][0]['media'] = $document['media'];
                $res['result'][0]['extension'] = $document['extension'];
            }
            if (count($champs_demandes) == 0 || in_array('vignette', $champs_demandes)) {
                $largeur_vignette = $args['vignette_largeur'] ? $args['vignette_largeur'] : 100;
                $hauteur_vignette = $args['vignette_hauteur'] ? $args['vignette_hauteur'] : 100;
                if ($format_vignette == 'carre') {
                    $vignette = extraire_attribut(quete_logo_document($document, $lien, $align, $mode_logo, '', '', $connect = NULL), 'src');
                    $res['result'][0]['vignette'] = url_absolue(extraire_attribut(image_recadre(image_passe_partout($vignette, $largeur_vignette, $hauteur_vignette), $largeur_vignette, $hauteur_vignette), 'src'));
                } else {
                    $vignette = liens_absolus(quete_logo_document($document, $lien, $align, $mode_logo, $largeur_vignette, $hauteur_vignette, $connect = NULL));
                    $res['result'][0]['vignette'] = extraire_attribut($vignette, 'src');
                }
            }
        }
    }
    /**
     * On ajoute les auteurs
     * On met juste leur id_auteur + nom, si besoin de plus une autre requête sur l'auteur est à effectuer 
     */
    if (count($champs_demandes) == 0 || in_array('auteurs', $champs_demandes)) {
        $auteurs = sql_select('auteurs.nom, auteurs.id_auteur', 'spip_auteurs AS auteurs INNER JOIN spip_auteurs_liens AS L1 ON L1.id_auteur = auteurs.id_auteur INNER JOIN spip_articles AS L2 ON L2.id_article = L1.id_objet', "L1.objet='article' AND auteurs.statut != '5poubelle' AND L2.id_article = " . intval($res['result'][0]['id_article']));
        while ($auteur = sql_fetch($auteurs)) {
            $res['result'][0]['auteurs'][] = $auteur;
        }
    }
    /**
     * On ajoute les points de géoloc
     */
    if (defined('_DIR_PLUGIN_GIS') && count($champs_demandes) == 0 || in_array('gis', $champs_demandes)) {
        include_spip('gis_xmlrpc', 'inc');
        $tous_gis = sql_select('gis.id_gis', 'spip_gis AS `gis` INNER JOIN spip_gis_liens AS L1 ON L1.id_gis = gis.id_gis', 'L1.id_objet = ' . intval($args['id_article']) . ' AND (L1.objet = ' . sql_quote('article') . ')');
        while ($gis = sql_fetch($tous_gis)) {
            $args['id_gis'] = $gis['id_gis'];
            $res['result'][0]['gis'][] = spip_lire_gis($args);
        }
    }
    /**
     * On ajoute les tags
     * On met juste leur id_mot + titr, si besoin de plus une autre requête sur le mot est à effectuer 
     */
    if (count($champs_demandes) == 0 || in_array('tags', $champs_demandes)) {
        $tags_group = intval($config['groupe_tags']) > 0 ? intval($config['groupe_tags']) : intval(lire_config('spipicious/groupe_mot'));
        if ($tags_group > 0) {
            $tous_tags = sql_select('mots.id_mot, mots.titre', 'spip_mots AS `mots` INNER JOIN spip_mots_liens AS L1 ON ( L1.id_mot = mots.id_mot )', 'L1.id_objet = ' . intval($args['id_article']) . ' AND (L1.objet = "article") AND (mots.id_groupe = ' . $tags_group . ')');
            while ($tag = sql_fetch($tous_tags)) {
                $res['result'][0]['tags'][] = $tag;
            }
        }
    }
    /**
     * Et on ajoute l'échelle
     * On met juste son id_mot + titre, si besoin de plus une autre requête sur le mot est à effectuer 
     */
    if (count($champs_demandes) == 0 || in_array('echelle', $champs_demandes)) {
        $echelle_group = intval($config['groupe_echelle']) > 0 ? intval($config['groupe_echelle']) : 0;
        if ($echelle_group > 0) {
            $echelle = sql_fetsel('mots.id_mot, mots.titre', 'spip_mots AS `mots` INNER JOIN spip_mots_liens AS L1 ON ( L1.id_mot = mots.id_mot )', 'L1.id_objet = ' . intval($args['id_article']) . ' AND (L1.objet = "article") AND (mots.id_groupe = ' . $echelle_group . ')');
            if (is_array($echelle)) {
                $res['result'][0]['echelle'][] = $echelle;
            }
        }
    }
    /**
     * Et on ajoute les forums
     * On n'affiche que les forums publiés (statut publie)
     * 
     * On met juste :
     * -* id_forum
     * -* id_thread 
     * -* titre
     * -* auteur
     * -* id_auteur
     * Si besoin de plus une autre requête sur le forum est à effectuer 
     */
    if (count($champs_demandes) == 0 || in_array('forums', $champs_demandes)) {
        $forums = sql_select('id_forum, id_thread,titre,auteur,id_auteur', 'spip_forum', 'objet=' . sql_quote('article') . ' AND id_objet = ' . intval($args['id_article']) . ' AND (statut = ' . sql_quote('publie') . ')');
        while ($forum = sql_fetch($forums)) {
            $res['result'][0]['forums'][] = $forum;
        }
    }
    $media_struct = $res['result'][0];
    $media_struct = array_filter($media_struct);
    return $media_struct;
}
Example #27
0
/**
 * Insertion dans le pipeline em_post_upload_medias (plugin Emballe médias)
 * 
 * Dans le cas des fichiers jpg, si on a récup une date, on l'assigne à l'article
 * 
 * @param array $flux
 * @return array $flux
 */
function geol_em_post_upload_medias($flux)
{
    spip_log("EM EXIFS : mime-type = " . $flux['args']['mime'], "emballe_medias");
    if ($flux['args']['mime'] == 'image/jpeg') {
        $id_document = $flux['args']['id_document'];
        $id_article = $flux['args']['id_objet'];
        $fichier = sql_getfetsel("fichier", "spip_documents", "id_document=" . intval($id_document));
        include_spip('inc/documents');
        $fichier = get_spip_doc($fichier);
        // on recupere la date definie dans les donnees EXIF du document s'il y en a
        if (($exifs = @exif_read_data($fichier, 'EXIF')) && ($date_exifs = $exifs['DateTimeOriginal'])) {
            spip_log("EM EXIFS : recuperation de la date du fichier {$fichier}", "emballe_medias");
            $date = date("Y-m-d H:i:s", strtotime($date_exifs));
            sql_updateq('spip_articles', array('date' => $date), "id_article={$id_article}");
            spip_log("EM EXIFS : Update de la date depuis EXIFS pour l'article {$id_article} => date = {$date}", "emballe_medias");
        }
    }
    return $flux;
}