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"); } }
/** * 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)); }
/** * 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; }
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); }
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 ) ); }
/** * 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); }
/** * 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; }
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); }
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); }
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()); }
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); }
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,''); }
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 ''; }
/** * 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; }
/** * 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; }
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; }
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) ) ); } }