X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=www%2Fecrire%2Finc%2Fdocuments.php;h=26048cd8572d2ffdf4b56ccfccf351bec8a963bd;hb=4f443dce95ff6f8221c189880a70c74ce1c1f238;hp=038e1ecf8062885eeaea23938b0124738fee82ed;hpb=4a628e9b277d3617535f99d663ca79fa2e891177;p=lhc%2Fweb%2Fwww.git diff --git a/www/ecrire/inc/documents.php b/www/ecrire/inc/documents.php index 038e1ecf..26048cd8 100644 --- a/www/ecrire/inc/documents.php +++ b/www/ecrire/inc/documents.php @@ -3,77 +3,90 @@ /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * - * Copyright (c) 2001-2016 * + * Copyright (c) 2001-2017 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +/** + * Gestion des documents et de leur emplacement sur le serveur + * + * @package SPIP\Core\Documents + */ + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** - * donne le chemin du fichier relatif a _DIR_IMG - * pour stockage 'tel quel' dans la base de donnees + * Donne le chemin du fichier relatif à `_DIR_IMG` + * pour stockage 'tel quel' dans la base de données * - * http://doc.spip.org/@set_spip_doc + * @uses _DIR_IMG * * @param string $fichier * @return string */ function set_spip_doc($fichier) { - if (strpos($fichier, _DIR_IMG) === 0) + if (strpos($fichier, _DIR_IMG) === 0) { return substr($fichier, strlen(_DIR_IMG)); - else - return $fichier; // ex: fichier distant + } else { + return $fichier; + } // ex: fichier distant } /** - * donne le chemin complet du fichier + * Donne le chemin complet du fichier * - * http://doc.spip.org/@get_spip_doc + * @uses _DIR_IMG * * @param string $fichier * @return bool|string */ function get_spip_doc($fichier) { // fichier distant - if (preg_match(',^\w+://,', $fichier)) + if (tester_url_absolue($fichier)) { return $fichier; + } // gestion d'erreurs, fichier='' - if (!strlen($fichier)) + if (!strlen($fichier)) { return false; + } $fichier = ( - strncmp($fichier,_DIR_IMG, strlen(_DIR_IMG))!=0 - ) + strncmp($fichier, _DIR_IMG, strlen(_DIR_IMG)) != 0 + ) ? _DIR_IMG . $fichier - : $fichier ; + : $fichier; // fichier normal return $fichier; } /** - * Creer IMG/pdf/ + * Créer un sous-répertoire IMG/$ext/ tel que IMG/pdf * - * http://doc.spip.org/@creer_repertoire_documents + * @uses sous_repertoire() + * @uses _DIR_IMG + * @uses verifier_htaccess() * - * @param $ext + * @param string $ext * @return string */ function creer_repertoire_documents($ext) { $rep = sous_repertoire(_DIR_IMG, $ext); - if (!$ext OR !$rep) { + if (!$ext or !$rep) { spip_log("creer_repertoire_documents '$rep' interdit"); exit; } // Cette variable de configuration peut etre posee par un plugin // par exemple acces_restreint - if (isset($GLOBALS['meta']["creer_htaccess"]) AND $GLOBALS['meta']["creer_htaccess"] == 'oui') { + if (isset($GLOBALS['meta']["creer_htaccess"]) and $GLOBALS['meta']["creer_htaccess"] == 'oui') { include_spip('inc/acces'); verifier_htaccess($rep); } @@ -82,20 +95,23 @@ function creer_repertoire_documents($ext) { } /** - * Efface le repertoire de maniere recursive ! - * - * http://doc.spip.org/@effacer_repertoire_temporaire + * Efface le répertoire de manière récursive ! * * @param string $nom */ function effacer_repertoire_temporaire($nom) { - $d = opendir($nom); - while (($f = readdir($d)) !== false) { - if (is_file("$nom/$f")) - spip_unlink("$nom/$f"); - else if ($f <> '.' AND $f <> '..' - AND is_dir("$nom/$f")) - effacer_repertoire_temporaire("$nom/$f"); + if ($d = opendir($nom)) { + while (($f = readdir($d)) !== false) { + if (is_file("$nom/$f")) { + spip_unlink("$nom/$f"); + } else { + if ($f <> '.' and $f <> '..' + and is_dir("$nom/$f") + ) { + effacer_repertoire_temporaire("$nom/$f"); + } + } + } } closedir($d); @rmdir($nom); @@ -103,10 +119,8 @@ function effacer_repertoire_temporaire($nom) { // /** - * Copier un document $source un dossier IMG/$ext/$orig.$ext - * en numerotant eventuellement si un du meme nom existe deja - * - * http://doc.spip.org/@copier_document + * Copier un document `$source` un dossier `IMG/$ext/$orig.$ext` + * en numérotant éventuellement si un fichier de même nom existe déjà * * @param string $ext * @param string $orig @@ -118,39 +132,49 @@ function copier_document($ext, $orig, $source) { $orig = preg_replace(',\.\.+,', '.', $orig); // pas de .. dans le nom du doc $dir = creer_repertoire_documents($ext); $dest = preg_replace("/[^.=\w-]+/", "_", - translitteration(preg_replace("/\.([^.]+)$/", "", - preg_replace("/<[^>]*>/", '', basename($orig))))); + translitteration(preg_replace("/\.([^.]+)$/", "", + preg_replace("/<[^>]*>/", '', basename($orig))))); // ne pas accepter de noms de la forme -r90.jpg qui sont reserves // pour les images transformees par rotation (action/documenter) $dest = preg_replace(',-r(90|180|270)$,', '', $dest); // Si le document "source" est deja au bon endroit, ne rien faire - if ($source == ($dir . $dest . '.' . $ext)) + if ($source == ($dir . $dest . '.' . $ext)) { return $source; + } // sinon tourner jusqu'a trouver un numero correct $n = 0; - while (@file_exists($newFile = $dir . $dest .($n++ ? ('-'.$n) : '').'.'.$ext)); + while (@file_exists($newFile = $dir . $dest . ($n++ ? ('-' . $n) : '') . '.' . $ext)) { + ; + } return deplacer_fichier_upload($source, $newFile); } /** - * Trouver le dossier utilise pour upload un fichier + * Trouver le dossier utilisé pour upload un fichier * - * http://doc.spip.org/@determine_upload + * @uses autoriser() + * @uses _DIR_TRANSFERT + * @uses _DIR_TMP + * @uses sous_repertoire() * * @param string $type * @return bool|string */ -function determine_upload($type='') { - if(!function_exists('autoriser')) +function determine_upload($type = '') { + if (!function_exists('autoriser')) { include_spip('inc/autoriser'); - + } + if (!autoriser('chargerftp') - OR $type == 'logos') # on ne le permet pas pour les logos + or $type == 'logos' + ) # on ne le permet pas pour les logos + { return false; + } $repertoire = _DIR_TRANSFERT; if (!@is_dir($repertoire)) { @@ -158,57 +182,84 @@ function determine_upload($type='') { $repertoire = sous_repertoire(_DIR_TMP, $repertoire); } - if (!$GLOBALS['visiteur_session']['restreint']) + if (!$GLOBALS['visiteur_session']['restreint']) { return $repertoire; - else + } else { return sous_repertoire($repertoire, $GLOBALS['visiteur_session']['login']); + } } /** - * Deplacer ou copier un fichier + * Déplacer ou copier un fichier * - * http://doc.spip.org/@deplacer_fichier_upload + * @uses _DIR_RACINE + * @uses spip_unlink() * * @param string $source + * Fichier source à copier * @param string $dest + * Fichier de destination * @param bool $move + * - `true` : on déplace le fichier source vers le fichier de destination + * - `false` : valeur par défaut. On ne fait que copier le fichier source vers la destination. * @return bool|mixed|string */ -function deplacer_fichier_upload($source, $dest, $move=false) { +function deplacer_fichier_upload($source, $dest, $move = false) { // Securite - if (substr($dest,0,strlen(_DIR_RACINE))==_DIR_RACINE) - $dest = _DIR_RACINE.preg_replace(',\.\.+,', '.', substr($dest,strlen(_DIR_RACINE))); - else + if (substr($dest, 0, strlen(_DIR_RACINE)) == _DIR_RACINE) { + $dest = _DIR_RACINE . preg_replace(',\.\.+,', '.', substr($dest, strlen(_DIR_RACINE))); + } else { $dest = preg_replace(',\.\.+,', '.', $dest); + } - if ($move) $ok = @rename($source, $dest); - else $ok = @copy($source, $dest); - if (!$ok) $ok = @move_uploaded_file($source, $dest); - if ($ok) + if ($move) { + $ok = @rename($source, $dest); + } else { + $ok = @copy($source, $dest); + } + if (!$ok) { + $ok = @move_uploaded_file($source, $dest); + } + if ($ok) { @chmod($dest, _SPIP_CHMOD & ~0111); - else { - $f = @fopen($dest,'w'); + } else { + $f = @fopen($dest, 'w'); if ($f) { - fclose ($f); + fclose($f); } else { include_spip('inc/flock'); raler_fichier($dest); } spip_unlink($dest); } + return $ok ? $dest : false; } -// Erreurs d'upload -// renvoie false si pas d'erreur -// et true si erreur = pas de fichier -// pour les autres erreurs affiche le message d'erreur et meurt -// http://doc.spip.org/@check_upload_error -function check_upload_error($error, $msg='', $return=false) { - global $spip_lang_right; +/** + * Erreurs d'upload + * + * Renvoie `false` si pas d'erreur + * et `true` s'il n'y a pas de fichier à uploader. + * Pour les autres erreurs, on affiche le message d'erreur et on arrête l'action. + * + * @link http://php.net/manual/fr/features.file-upload.errors.php + * Explication sur les messages d'erreurs de chargement de fichiers. + * @uses propre() + * @uses minipres() + * + * @global string $spip_lang_right + * @param integer $error + * @param string $msg + * @param bool $return + * @return boolean|string + */ +function check_upload_error($error, $msg = '', $return = false) { - if (!$error) return false; + if (!$error) { + return false; + } spip_log("Erreur upload $error -- cf. http://php.net/manual/fr/features.file-upload.errors.php"); @@ -220,36 +271,37 @@ function check_upload_error($error, $msg='', $return=false) { # on peut affiner les differents messages d'erreur case 1: /* UPLOAD_ERR_INI_SIZE */ $msg = _T('upload_limit', - array('max' => ini_get('upload_max_filesize'))); + array('max' => ini_get('upload_max_filesize'))); break; case 2: /* UPLOAD_ERR_FORM_SIZE */ $msg = _T('upload_limit', - array('max' => ini_get('upload_max_filesize'))); + array('max' => ini_get('upload_max_filesize'))); break; case 3: /* UPLOAD_ERR_PARTIAL */ $msg = _T('upload_limit', - array('max' => ini_get('upload_max_filesize'))); + array('max' => ini_get('upload_max_filesize'))); break; default: /* autre */ - if (!$msg) - $msg = _T('pass_erreur').' '. $error - . '
' . propre("[->http://php.net/manual/fr/features.file-upload.errors.php]"); + if (!$msg) { + $msg = _T('pass_erreur') . ' ' . $error + . '
' . propre("[->http://php.net/manual/fr/features.file-upload.errors.php]"); + } break; } - spip_log ("erreur upload $error"); - if ($return) + spip_log("erreur upload $error"); + if ($return) { return $msg; + } - if(_request("iframe")=="iframe") { - echo "
$msg
"; - exit; + if (_request("iframe") == "iframe") { + echo "
$msg
"; + exit; } include_spip('inc/minipres'); echo minipres($msg, - "
"); + "
"); exit; } -?>