Exemple #1
0
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;
}
Exemple #2
0
/**
 * 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'");
    }
}
Exemple #4
0
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("&nbsp;", $k) . _T('medias:tout_dossier_upload', array('upload' => $ledossier)) . "</option>";
                    $dirs[] = $ledossier;
                }
            }
            if ($exts[$ext] == 'oui') {
                $texte_upload[] = "\n<option value=\"{$f}\">" . str_repeat("&nbsp;", $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;
}
Exemple #7
0
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("&nbsp;",$k) 
				._T('tout_dossier_upload', array('upload' => $ledossier))
				."</option>";
				$dirs[]= $ledossier;
			  }
			}

			if ($exts[$ext] == 'oui')
			  $texte_upload[] = "\n<option value=\"$f\">" .
			    str_repeat("&nbsp;",$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;
}
Exemple #8
0
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);
}