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