function ajout_fichier($doc_file, $dest, $cpt_doc, $id_groupe) { global $max_size, $total_max_size; /* Vérification du type de fichier */ $ext = ''; //if (my_ereg("\.([^.]+)$", $doc_file['name'][$cpt_doc], $match)) { if (function_exists("mb_ereg") && mb_ereg("\\.([^.]+)\$", $doc_file['name'][$cpt_doc], $match) || function_exists("ereg") && ereg("\\.([^.]+)\$", $doc_file['name'][$cpt_doc], $match)) { $ext = corriger_caracteres(my_strtolower($match[1])); $ext = corriger_extension($ext); } $query = "SELECT id_type FROM ct_types_documents WHERE extension='{$ext}' AND upload='oui'"; $result = sql_query($query); if ($row = @sql_row($result, 0)) { $id_type = $row[0]; } else { echo "Erreur : Ce type de fichier n'est pas autorisé en téléchargement.\nSi vous trouvez cela regrettable, contactez l'administrateur.\nIl pourra modifier ce paramétrage dans\n *Gestion des modules/Cahiers de textes/Types de fichiers autorisés en téléchargement*."; die; } /* Vérification de la taille du fichier */ $max_size_ko = $max_size / 1024; $taille = $doc_file['size'][$cpt_doc]; if ($taille > $max_size) { echo "Erreur : Téléchargement impossible : taille maximale autorisée : " . $max_size_ko . " Ko"; die; } if ($taille == 0) { echo "Le fichier sélectionné semble vide : transfert impossible."; die; } $query = "SELECT DISTINCT sum(taille) somme FROM ct_documents d, ct_entry e WHERE (e.id_groupe='" . $id_groupe . "' and e.id_ct = d.id_ct)"; $total = sql_query1($query); if ($total + $taille > $total_max_size) { echo "Erreur : Téléchargement impossible : espace disque disponible (" . ($total_max_size - $total) / 1024 . " Ko) insuffisant."; die; } /* Crétion du répertoire de destination */ if (!creer_repertoire($dest)) { echo "Erreur : Problème d'écriture sur le répertoire. Veuillez signaler ce problème à l'administrateur du site"; echo $dest; die; } /* Recopier le fichier */ $nom_sans_ext = mb_substr(basename($doc_file['name'][$cpt_doc]), 0, mb_strlen(basename($doc_file['name'][$cpt_doc])) - (mb_strlen($ext) + 1)); $nom_sans_ext = my_ereg_replace("[^.a-zA-Z0-9_=-]+", "_", $nom_sans_ext); if (strstr($nom_sans_ext, "..")) { echo "Erreur : Problème de transfert : le fichier n'a pas pu être transféré sur le répertoire. Veuillez signaler ce problème à l'administrateur du site"; die; } $n = 0; while (file_exists($newFile = $dest . "/" . $nom_sans_ext . ($n++ ? '-' . $n : '') . '.' . $ext)) { } $dest_file_path = $newFile; if (!deplacer_fichier_upload($doc_file['tmp_name'][$cpt_doc], $dest_file_path)) { echo "Erreur : Problème de transfert : le fichier n'a pas pu être transféré sur le répertoire. Veuillez signaler ce problème à l'administrateur du site"; die; } return $dest_file_path; }
/** * Ajouter un document (au format $_FILES)<br> * (n'ajoute pas le contenu en base dans spip_documents...) * * @param string $source Le fichier sur le serveur (/var/tmp/xyz34) * @param string $nom_envoye Son nom chez le client (portequoi.pdf) * @param string $nom_dest Le nom sous lequel le sauvegarder * @param string $dans Où l'enregistrer * @return string */ function cfg_ajoute_un_document($source, $nom_envoye, $nom_dest, $dans='config') { include_spip('inc/modifier'); include_spip('inc/ajouter_documents'); $type_image = ''; // au pire // tester le type de document : // - interdit a l'upload ? // - quelle extension dans spip_types_documents ? // - est-ce "inclus" comme une image ? preg_match(",^(.*)\.([^.]+)$,", $nom_envoye, $match); @list(,$titre,$ext) = $match; $ext = corriger_extension(strtolower($ext)); // ajouter l'extension au nom propose... $row = sql_fetsel("inclus", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'"); if ($row) { $type_inclus_image = ($row['inclus'] == 'image'); // hum stocke dans IMG/$ext ? $fichier = cfg_copier_document($ext, $nom_dest.'.'.$ext, $source, $dans); } else { /* STOCKER LES DOCUMENTS INCONNUS AU FORMAT .ZIP */ $type_inclus_image = false; if (!sql_countsel("spip_types_documents", "extension='zip' AND upload='oui'")) { spip_log("Extension $ext interdite a l'upload"); return; } $ext = 'zip'; if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload')) return; spip_unlink($tmp_dir); @mkdir($tmp_dir); $tmp = $tmp_dir.'/'.translitteration($nom_envoye); $nom_envoye .= '.zip'; # conserver l'extension dans le nom de fichier, par exemple toto.js => toto.js.zip _COMPAT_CFG_192 ? cfg_deplacer_fichier_upload($source, $tmp) : deplacer_fichier_upload($source, $tmp); include_spip('inc/pclzip'); $source = _DIR_TMP . 'archive.zip'; $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; } // hum too ? $fichier = cfg_copier_document($ext, $nom_dest.'.zip', $source, $dans); spip_unlink($source); } if ($ext == "svg") { // supprimer les scripts traite_svg($fichier); } elseif ($ext != "mov") {// image ? // Si c'est une image, recuperer sa taille et son type (detecte aussi swf) $size_image = @getimagesize($fichier); $type_image = decoder_type_image($size_image[2]); } // Quelques infos sur le fichier if (!$fichier OR !@file_exists($fichier) OR !$taille = @intval(filesize($fichier))) { spip_log ("Echec copie du fichier $fichier"); return; } if (!$type_image) { if (_DOC_MAX_SIZE > 0 AND $taille > _DOC_MAX_SIZE*1024) { spip_unlink ($fichier); check_upload_error(6, _T('info_logo_max_poids', array('maxi' => taille_en_octets(_DOC_MAX_SIZE*1024), 'actuel' => taille_en_octets($taille)))); } } else { // image if (_IMG_MAX_SIZE > 0 AND $taille > _IMG_MAX_SIZE*1024) { spip_unlink ($fichier); check_upload_error(6, _T('info_logo_max_poids', array('maxi' => taille_en_octets(_IMG_MAX_SIZE*1024), 'actuel' => taille_en_octets($taille)))); } if (_IMG_MAX_WIDTH * _IMG_MAX_HEIGHT AND ($size_image[0] > _IMG_MAX_WIDTH OR $size_image[1] > _IMG_MAX_HEIGHT)) { spip_unlink ($fichier); check_upload_error(6, _T('info_logo_max_taille', array( 'maxi' => _T('info_largeur_vignette', array('largeur_vignette' => _IMG_MAX_WIDTH, 'hauteur_vignette' => _IMG_MAX_HEIGHT)), 'actuel' => _T('info_largeur_vignette', array('largeur_vignette' => $size_image[0], 'hauteur_vignette' => $size_image[1])) ))); } } return $fichier; }
function accepte_fichier_upload($f) { if (!preg_match(",.*__MACOSX/,", $f) and !preg_match(",^\\.,", basename($f))) { include_spip('action/ajouter_documents'); $ext = corriger_extension(strtolower(substr(strrchr($f, "."), 1))); return sql_countsel('spip_types_documents', "extension=" . sql_quote($ext) . " AND upload='oui'"); } }
function ajout_doc($doc_file, $id_ct, $doc_name, $cpt_doc) { global $max_size, $total_max_size, $edit_devoir, $multisite; /* Vérification du type de fichier */ //if (my_ereg("\.([^.]+)$", $doc_file['name'][$cpt_doc], $match)) { if (function_exists("mb_ereg") && mb_ereg("\\.([^.]+)\$", $doc_file['name'][$cpt_doc], $match) || function_exists("ereg") && ereg("\\.([^.]+)\$", $doc_file['name'][$cpt_doc], $match)) { $ext = corriger_caracteres(my_strtolower($match[1])); $ext = corriger_extension($ext); } else { $ext = ''; } $query = "SELECT id_type FROM ct_types_documents WHERE extension='{$ext}' AND upload='oui'"; $result = sql_query($query); if ($row = @sql_row($result, 0)) { $id_type = $row[0]; } else { return "Erreur : Ce type de fichier n'est pas autorisé en téléchargement.<br />\nSi vous trouvez cela regrettable, contactez l'administrateur.<br />\nIl pourra modifier ce paramétrage dans<br />\n*Gestion des modules/Cahiers de textes/Types de fichiers autorisés en téléchargement*."; die; } /* Vérification de la taille du fichier */ $sql = "select id_groupe from ct_entry where id_ct='{$id_ct}'"; $id_groupe = sql_query1($sql); $max_size_ko = $max_size / 1024; $taille = $doc_file['size'][$cpt_doc]; if ($taille > $max_size) { return "Téléchargement impossible : taille maximale autorisée : " . $max_size_ko . " Ko"; die; } if ($taille == 0) { return "Le fichier sélectionné semble vide : transfert impossible."; die; } $query = "SELECT DISTINCT sum(taille) somme FROM ct_documents d, ct_entry e WHERE (e.id_groupe='" . $id_groupe . "' and e.id_ct = d.id_ct)"; $total = sql_query1($query); if ($total + $taille > $total_max_size) { return "Téléchargement impossible : espace disque disponible (" . ($total_max_size - $total) / 1024 . " Ko) insuffisant."; die; } /* Recopier le fichier */ $dest = '../documents/'; $dossier = ''; $multi = isset($multisite) && $multisite == 'y' ? $_COOKIE['RNE'] . '/' : NULL; if (isset($multisite) && $multisite == 'y' && is_dir('../documents/' . $multi) === false) { @mkdir('../documents/' . $multi); $dest .= $multi; } elseif (isset($multisite) && $multisite == 'y') { $dest .= $multi; } if (isset($edit_devoir)) { $dossier = "cl_dev" . $_POST['id_groupe']; } else { $dossier = "cl" . $_POST['id_groupe']; } if (creer_repertoire($dest, $dossier)) { $dest .= $dossier . '/'; } else { return "Problème d'écriture sur le répertoire. Veuillez signaler ce problème à l'administrateur du site"; die; } $nom_sans_ext = mb_substr(basename($doc_file['name'][$cpt_doc]), 0, mb_strlen(basename($doc_file['name'][$cpt_doc])) - (mb_strlen($ext) + 1)); $nom_sans_ext = my_ereg_replace("[^.a-zA-Z0-9_=-]+", "_", $nom_sans_ext); if (strstr($nom_sans_ext, "..")) { return "Problème de transfert : le fichier n'a pas pu être transféré sur le répertoire. Veuillez signaler ce problème à l'administrateur du site"; die; } $n = 0; while (file_exists($newFile = $dest . $nom_sans_ext . ($n++ ? '-' . $n : '') . '.' . $ext)) { } $dest_path = $newFile; if (!deplacer_fichier_upload($doc_file['tmp_name'][$cpt_doc], $dest_path)) { return "Problème de transfert : le fichier n'a pas pu être transféré sur le répertoire. Veuillez signaler ce problème à l'administrateur du site"; die; } if ($doc_name[$cpt_doc] == '') { $doc_name[$cpt_doc] = basename($newFile); } $nouveau = false; if (!isset($id_document)) { if (isset($edit_devoir)) { $query = "INSERT INTO ct_devoirs_documents SET taille='{$taille}', emplacement='{$dest_path}', id_ct_devoir='{$id_ct}', titre='" . corriger_caracteres($doc_name[$cpt_doc]) . "'"; } else { $query = "INSERT INTO ct_documents SET taille='{$taille}', emplacement='{$dest_path}', id_ct='{$id_ct}', titre='" . corriger_caracteres($doc_name[$cpt_doc]) . "'"; } sql_query($query); $id_document = is_null($___mysqli_res = mysqli_insert_id($GLOBALS["mysqli"])) ? false : $___mysqli_res; $nouveau = true; } else { if (isset($edit_devoir)) { $query = "UPDATE ct_devoirs_documents SET taille='{$taille}', emplacement='{$dest_path}', id_ct_devoir='{$id_ct}', titre='{$titre}' WHERE id_document={$id_document}"; } else { $query = "UPDATE ct_documents SET taille='{$taille}', emplacement='{$dest_path}', id_ct='{$id_ct}', titre='{$titre}' WHERE id_document={$id_document}"; } sql_query($query); } return "Téléchargement réussi !"; }
/** * Retourner le contenu du select HTML d'utilisation de fichiers envoyes par le serveur * * @param string $dir * Le répertoire de recherche des documents * @param string $mode * Le mode d'ajout de document * @return string $texte * Le contenu HTML du selecteur de documents */ function joindre_options_upload_ftp($dir, $mode = 'document') { $fichiers = preg_files($dir); $exts = $dirs = $texte_upload = array(); // en mode "charger une image", ne proposer que les inclus $inclus = ($mode == 'image' or $mode == 'vignette') ? " AND inclus='image'" : ''; foreach ($fichiers as $f) { $f = preg_replace(",^{$dir},", '', $f); if (preg_match(",\\.([^.]+)\$,", $f, $match)) { $ext = strtolower($match[1]); if (!isset($exts[$ext])) { include_spip('action/ajouter_documents'); $ext = corriger_extension($ext); if (sql_fetsel('extension', 'spip_types_documents', $a = "extension='{$ext}'" . $inclus)) { $exts[$ext] = 'oui'; } else { $exts[$ext] = 'non'; } } $k = 2 * substr_count($f, '/'); $n = strrpos($f, "/"); if ($n === false) { $lefichier = $f; } else { $lefichier = substr($f, $n + 1, strlen($f)); $ledossier = substr($f, 0, $n); if (!in_array($ledossier, $dirs)) { $texte_upload[] = "\n<option value=\"{$ledossier}\">" . str_repeat(" ", $k) . _T('medias:tout_dossier_upload', array('upload' => $ledossier)) . "</option>"; $dirs[] = $ledossier; } } if ($exts[$ext] == 'oui') { $texte_upload[] = "\n<option value=\"{$f}\">" . str_repeat(" ", $k + 2) . $lefichier . "</option>"; } } } $texte = join('', $texte_upload); if (count($texte_upload) > 1) { $texte = "\n<option value=\"/\" style='font-weight: bold;'>" . _T('medias:info_installer_tous_documents') . "</option>" . $texte; } return $texte; }
/** * Vérifie la possibilité d'uploader une extension * * Vérifie aussi si l'extension est autorisée pour le mode demandé * si on connait le mode à ce moment là * * @param string $source * Nom du fichier * @param string $mode * Mode d'inclusion du fichier, si connu * @return array|bool|string * * - array : extension acceptée (tableau descriptif). * Avec un index 'autozip' si il faut zipper * - false ou message d'erreur si l'extension est refusée */ function verifier_upload_autorise($source, $mode = '') { $infos = array('fichier' => $source); $res = false; if (preg_match(",\\.([a-z0-9]+)(\\?.*)?\$,i", $source, $match) and $ext = $match[1]) { $ext = corriger_extension(strtolower($ext)); if ($res = sql_fetsel("extension,inclus,media_defaut as media", "spip_types_documents", "extension=" . sql_quote($ext) . " AND upload='oui'")) { $infos = array_merge($infos, $res); } } if (!$res) { if ($res = sql_fetsel("extension,inclus,media_defaut as media", "spip_types_documents", "extension='zip' AND upload='oui'")) { $infos = array_merge($infos, $res); $res['autozip'] = true; } } if ($mode and $res) { // verifier en fonction du mode si une fonction est proposee if ($verifier_document_mode = charger_fonction("verifier_document_mode_" . $mode, "inc", true)) { $check = $verifier_document_mode($infos); // true ou message d'erreur sous forme de chaine if ($check !== true) { $res = $check; } } } if (!$res or is_string($res)) { spip_log("Upload {$source} interdit ({$res})", _LOG_INFO_IMPORTANTE); } return $res; }
function texte_upload_manuel($dir, $mode = 'document') { $fichiers = preg_files($dir); $exts = array(); $dirs = array(); $texte_upload = array(); // en mode "charger une image", ne proposer que les inclus $inclus = ($mode == 'document' OR $mode =='choix') ? '' : " AND inclus='image'"; foreach ($fichiers as $f) { $f = preg_replace(",^$dir,",'',$f); if (!preg_match(",\.([^.]+)$,", $f, $match)) if (strtolower($f) === 'makefile') $match = array(0,'txt'); if ($match) { $ext = strtolower($match[1]); if (!isset($exts[$ext])) { include_spip('inc/ajouter_documents'); $ext = corriger_extension($ext); if (sql_fetsel('extension', 'spip_types_documents', $a = "extension='$ext'" . $inclus)) $exts[$ext] = 'oui'; else $exts[$ext] = 'non'; } $k = 2*substr_count($f,'/'); $n = strrpos($f, "/"); if ($n === false) $lefichier = $f; else { $lefichier = substr($f, $n+1, strlen($f)); $ledossier = substr($f, 0, $n); if (!in_array($ledossier, $dirs)) { $texte_upload[] = "\n<option value=\"$ledossier\">" . str_repeat(" ",$k) ._T('tout_dossier_upload', array('upload' => $ledossier)) ."</option>"; $dirs[]= $ledossier; } } if ($exts[$ext] == 'oui') $texte_upload[] = "\n<option value=\"$f\">" . str_repeat(" ",$k+2) . $lefichier . "</option>"; } } $texte = join('', $texte_upload); if (count($texte_upload)>1) { $texte = "\n<option value=\"/\" style='font-weight: bold;'>" ._T('info_installer_tous_documents') ."</option>" . $texte; } return $texte; }
function fixer_extension_document($doc) { $extension = ''; $name = $doc['name']; if (preg_match(',\.([^.]+)$,', $name, $r) AND $t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote(corriger_extension($r[1])))) { $extension = $t['extension']; $name = preg_replace(',\.[^.]*$,', '', $doc['name']).'.'.$extension; } else { // les navigateur devraient savoir que ceci est mime-type text if (strtolower($name) === 'makefile') $doc['type'] = 'txt'; if ($t = sql_getfetsel("extension", "spip_types_documents", "mime_type=" . sql_quote($doc['type']))) { $name = preg_replace(',\.[^.]*$,', '', $doc['name']).'.'.$t; } } return array($extension,$name); }