Valider aaa190c5 rédigé par esj's avatar esj
Parcourir les fichiers

Suite de [6850]: afficher_upload est à présent un filtre appelable dans un...

Suite de [6850]: afficher_upload est à présent un filtre appelable dans un squelette, affichant un formulaire d'envoi de fichier vers le serveur http, avec une valeur de sécurité calculée à partir de l'identifiant de session. Il s'agit donc du formulaire disponible dans l'espace privé, mais étendu aux visiteurs authentifiés. 

Cette extension a été obtenue par une révision générale de la fonction generer_action_auteur qui se fonde sur l'identifiant de session et non plus l'identifiant de connexion (voir [6850]) et peut retourner une URL pour un href (comme avant) mais aussi un formulaire ayant cette URL comme attribut action, moins les variables d'URL qui sont passées en Input-Hidden. De ce fait, cette fonction peut aussi servir dans un squelette comme filtre pour la construction de toute URL ou formulaire nécessitant une sécurisation à partir de l'identifiant de connexion. 

Cette fonction est aussi plus efficace qu'avant, et du coup est utilisé systématiquement dans le reste du code qui diminue. Evacuation aussi de code mort dans inc_auth.
parent 3ae87dd5
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+4 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -62,7 +62,7 @@ function action_spip_cookie_dist()
    $spip_session,
    $test_echec_cookie,
    $url,
    $valeur,
    $hash,
    $var_lang,
    $var_lang_ecrire;

@@ -217,8 +217,10 @@ if ($var_lang_ecrire) {
	spip_setcookie('spip_lang_ecrire', $var_lang_ecrire, time() + 365 * 24 * 3600);
	spip_setcookie('spip_lang', $var_lang_ecrire, time() + 365 * 24 * 3600);

	// ce ajouter_session me semble deja fait si on arrive jusqu'ici
	// avec id_auteur defini
	if (_FILE_CONNECT AND $id_auteur) {
		if (verifier_action_auteur('var_lang_ecrire', $valeur, $id_auteur)) {
		if (verifier_action_auteur("cookie-var_lang_ecrire", $hash, $id_auteur)) {
			ajouter_session($auteur_session, $spip_session, $var_lang_ecrire);
		}
	}
+7 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -24,6 +24,13 @@ function action_purger_dist()

  switch ($arg) {

  case 'index': 
	include_spip('inc/indexation');
	spip_log("purger_indx");
	purger_index();
	creer_liste_indexation();
	break;

  case 'cache': 
      supprime_invalideurs();
      purger_repertoire(_DIR_CACHE, 0);
+21 −56
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -49,35 +49,14 @@ if ($connect_statut != '0minirezo' OR !$connect_toutes_rubriques) {
	exit;
}

// toujours vrai

if ($purger_index == "oui") {
	if (verifier_action_auteur("purger_index", $hash)) {
		include_spip('inc/indexation');
		purger_index();
		creer_liste_indexation();
	}
}




//
// Purger le cache
//


debut_cadre_trait_couleur("cache-24.gif", false, "", _T('texte_vider_cache'));


echo "\n<p align='justify'>"._T('texte_suppression_fichiers')."</p>",
	"<p align='justify'>"._T('texte_recalcul_page')."</p>";


echo "\n<div>&nbsp;</div>";



//
// Quota et taille du cache
//
@@ -100,22 +79,14 @@ if ($quota_cache) {
	echo _T('taille_cache_infinie');
}

 $action = 'purger';
 $arg = 'cache';
 $hash = calculer_action_auteur("$action-$arg");

 echo ' (', _T('cache_modifiable_webmestre'),')</p>', 
  "\n<form action='", generer_url_action($action), "' method='POST'>", 
  "\n<input type='hidden' name='action' value='$action' />",
  "\n<input type='hidden' name='arg' value='$arg' />",
  "\n<input type='hidden' name='id_auteur' value='$connect_id_auteur' />", 
  "\n<input type='hidden' name='hash' value='$hash' />", 
  "\n<input type='hidden' name='redirect' value='", generer_url_ecrire("admin_vider"),
  "' />", 
  "\n<p><div align='right'><input class='fondo' type='submit' value=\"",
  str_replace('"', '&quot;', _T('bouton_vider_cache')),
  "\"></form></div>";

   generer_action_auteur('purger',
	'cache',
	generer_url_ecrire("admin_vider"),
	"\n<p><div align='right'><input class='fondo' type='submit' value=\"" .
			 str_replace('"', '&quot;', _T('bouton_vider_cache')) .
			 "\">",
	" method='POST'");
 fin_cadre_relief();


@@ -127,20 +98,13 @@ if ($quota_cache) {
   "'></iframe>
</div>";

 $action = 'purger';
 $arg = 'vignettes';
 $hash = calculer_action_auteur("$action-$arg");

 echo   "\n<form action='", generer_url_action($action), "' method='POST'>",
   "\n<input type='hidden' name='action' value='$action' />",
   "\n<input type='hidden' name='arg' value='$arg' />",
   "\n<input type='hidden' name='id_auteur' value='$connect_id_auteur' />",
   "\n<input type='hidden' name='hash' value='$hash' />",
   "\n<input type='hidden' name='redirect' value='",generer_url_ecrire("admin_vider"),
   "' />", 
   "\n<p><DIV align='right'><input class='fondo' type='submit'  value=\"",
   str_replace('"', '&quot;', _T('bouton_vider_cache')),
   "\" /></form></div>";
 echo generer_action_auteur('purger',
	'vignettes',
	generer_url_ecrire("admin_vider"),
	"\n<p><div align='right'><input class='fondo' type='submit' value=\"" .
			 str_replace('"', '&quot;', _T('bouton_vider_cache')) .
			 "\">",
	" method='POST'");

fin_cadre_relief();

@@ -164,12 +128,13 @@ debut_cadre_trait_couleur("racine-site-24.gif", false, "", _T('texte_effacer_don
	
	}
	
	$hash = calculer_action_auteur("purger_index");

	echo generer_url_post_ecrire("admin_vider");
	echo "\n<INPUT TYPE='hidden' NAME='hash' VALUE='$hash' />";
	echo "\n<INPUT TYPE='hidden' NAME='purger_index' VALUE='oui' />";
	echo "\n<p><DIV align='right'><INPUT CLASS='fondo' TYPE='submit' NAME='valider' VALUE=\""._T('bouton_effacer_index')."\"></FORM></DIV>";
	echo generer_action_auteur('purger',
		'index',
		generer_url_ecrire("admin_vider"),
		"\n<p><div align='right'><input class='fondo' type='submit' value=\"" .
			 str_replace('"', '&quot;', _T('bouton_effacer_index')) .
			 "\">",
		" method='POST'");

fin_cadre_trait_couleur();

+57 −75
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -31,6 +31,26 @@ function acces_restreint_rubrique($id_rubrique) {
	return ($connect_statut == "0minirezo" AND isset($connect_id_rubrique[$id_rubrique]));
}

function auth_rubrique()
{
	global $connect_id_auteur, $connect_toutes_rubriques, $connect_id_rubrique;

	$result = spip_query("SELECT id_rubrique FROM spip_auteurs_rubriques WHERE id_auteur=$connect_id_auteur AND id_rubrique!='0'");

	$connect_toutes_rubriques = (@spip_num_rows($result) == 0);
	if (!$connect_toutes_rubriques) {
		for (;;) {
			$r = array();
			while ($row = spip_fetch_array($result)) {
				$id_rubrique = $row['id_rubrique'];
				$r[] = $connect_id_rubrique[$id_rubrique] = $id_rubrique;
			}
			if (!$r) break;
			$r = join(',', $r);
			$result = spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_parent IN ($r) AND id_rubrique NOT IN ($r)");
		}
	}
}

// Un nouvel inscrit prend son statut definitif a la 1ere connexion
// Le statut a ete memorise dans bio (cf formulaire_inscription)
@@ -47,12 +67,11 @@ function acces_statut($id_auteur, $statut, $bio)
	return $statut;
}


function inc_auth_dist() {
	global $_GET, $_COOKIE, $_SERVER;
	global $auth_can_disconnect, $ignore_auth_http, $ignore_remote_user;

	global $connect_id_auteur, $connect_login, $connect_pass;
	global $connect_id_auteur, $connect_login;
	global $connect_statut, $connect_toutes_rubriques, $connect_id_rubrique;

	global $auteur_session, $prefs;
@@ -61,11 +80,10 @@ function inc_auth_dist() {
	// Initialiser variables (eviter hacks par URL)
	//

	$auth_login = "";
	$auth_pass = "";
	$auth_pass_ok = false;
	$connect_login = '';
	$connect_id_rubrique = array();
	$auth_can_disconnect = false;
	$auth_htaccess = false;
	$connect_toutes_rubriques = false;

	//
	// Recuperer les donnees d'identification
@@ -76,8 +94,7 @@ function inc_auth_dist() {
		if (verifier_session($cookie_session)) {
			if ($auteur_session['statut'] == '0minirezo'
			OR $auteur_session['statut'] == '1comite') {
				$auth_login = $auteur_session['login'];
				$auth_pass_ok = true;
				$connect_login = $auteur_session['login'];
				$auth_can_disconnect = true;
			}
		}
@@ -89,8 +106,7 @@ function inc_auth_dist() {

		// Si le login existe dans la base, se loger
		if (verifier_php_auth()) {
			$auth_login = $_SERVER['PHP_AUTH_USER'];
			$auth_pass_ok = true;
			$connect_login = $_SERVER['PHP_AUTH_USER'];
			$auth_can_disconnect = true;
			$_SERVER['PHP_AUTH_PW'] = '';
		}
@@ -101,41 +117,41 @@ function inc_auth_dist() {
	// souvent definir *aussi* PHP_AUTH_USER et PHP_AUTH_PW
	else if ($GLOBALS['_SERVER']['REMOTE_USER']
	&& !$ignore_remote_user) {
		$auth_login = $GLOBALS['_SERVER']['REMOTE_USER'];
		$auth_pass_ok = true;
		$auth_htaccess = true;
		$connect_login = $GLOBALS['_SERVER']['REMOTE_USER'];
	}

	// pas authentifie par cookie ni rien: demander login / mdp

	if (!$auth_login) {
	if (!$connect_login) {
		return auth_arefaire();
	}
	//
	// Chercher le login dans la table auteurs
	// Trouver le login dans la table auteurs pour avoir les autres infos
	//

	$result = @spip_query("SELECT * FROM spip_auteurs WHERE login=" . spip_abstract_quote($auth_login) . " AND statut!='5poubelle'");
	$result = @spip_query("SELECT * FROM spip_auteurs WHERE login=" . spip_abstract_quote($connect_login) . " AND statut!='5poubelle'");

	if (!$row = spip_fetch_array($result)) {
		auth_areconnecter($auth_login);
		auth_areconnecter($connect_login);
		exit;
	} else {
		$connect_id_auteur = $row['id_auteur'];
		$connect_login = $row['login'];
		$connect_pass = $row['pass'];
		$connect_statut = acces_statut($connect_id_auteur, $row['statut'], $row['bio']);
		if ($row['statut']=='6forum') return auth_arefaire();
	}

		// Special : si dans la fiche auteur on modifie les valeurs
		// de messagerie, utiliser ces valeurs plutot que celle de la base.
		// D'ou leger bug si on modifie la fiche de quelqu'un d'autre.
	// Le tableau global auteur_session  contient toutes les infos
	// mais on duplique les plus utiles dans des variables simples

		// regler les preferences de l'auteur
		$prefs = unserialize($row['prefs']);
	$GLOBALS['auteur_session']['id_auteur'] = $connect_id_auteur = $row['id_auteur'];
	$GLOBALS['auteur_session']['pass'] = $row['pass'] ? $row['pass'] : $connect_login;
	$GLOBALS['auteur_session']['statut'] = $connect_statut = acces_statut($connect_id_auteur, $row['statut'], $row['bio']);

	$GLOBALS['auteur_session']['prefs'] = $prefs = unserialize($row['prefs']);

	if ($connect_statut == '6forum') return auth_arefaire();
	if ($connect_statut == '0minirezo') auth_rubrique();

	// ceci n'arrive qu'a la premiere connexion il me semble
	// si oui ce serait mieux de le mettre a la creation de l'auteur
	if (! isset($prefs['display'])) {

		// vieux ! on pourra supprimer post 1.6 finale...
		if (! isset($prefs['display'])) { // recuperer les cookies ou creer defaut
		if (!$GLOBALS['set_disp'] = $GLOBALS['_COOKIE']['spip_display'])
			$GLOBALS['set_disp'] = 2;
		if (!$GLOBALS['set_couleur'] = $GLOBALS['_COOKIE']['spip_couleur'])
@@ -147,43 +163,10 @@ function inc_auth_dist() {
	// Indiquer connexion
	@spip_query("UPDATE spip_auteurs SET en_ligne=NOW() WHERE id_auteur='$connect_id_auteur'");

		// Si administrateur, recuperer les rubriques gerees par l'admin
		if ($connect_statut == '0minirezo') {
			$result_admin = spip_query("SELECT id_rubrique FROM spip_auteurs_rubriques WHERE id_auteur=$connect_id_auteur AND id_rubrique!='0'");

			$connect_toutes_rubriques = (@spip_num_rows($result_admin) == 0);
			if ($connect_toutes_rubriques) {
				$connect_id_rubrique = array();
			}
			else {
				for (;;) {
					$r = '';
					while ($row_admin = spip_fetch_array($result_admin)) {
						$id_rubrique = $row_admin['id_rubrique'];
						$r[] = $id_rubrique;
						$connect_id_rubrique[$id_rubrique] = $id_rubrique;
					}
					if (!$r) break;
					$r = join(',', $r);
				 	$result_admin = spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_parent IN ($r) AND id_rubrique NOT IN ($r)");

				 }
			}
		}
		// Si pas admin, acces egal a toutes rubriques
		else {
			$connect_toutes_rubriques = false;
			$connect_id_rubrique = array();
		}
	}

	if (!$auth_pass_ok)
		return	generer_url_public('login', 'var_erreur=pass', true);

	// vide = pas de message d'erreur (cf exit(0) Unix)
	return "";
}


// Cas ou l'auteur a ete identifie mais on n'a pas d'info sur lui
// C'est soit parce que le serveur MySQL ne repond pas,
// soit parce que la table des auteurs a changee (restauration etc)
@@ -195,10 +178,9 @@ function auth_areconnecter($auth_login)
	if (!$GLOBALS['db_ok']) {
		spip_log("Erreur base de donnees");

		install_debut_html(_T('info_travaux_titre')); echo _T('titre_probleme_technique'), "<p><tt>".spip_sql_errno()." ".spip_sql_error()."</tt></p>";install_fin_html();
		minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'). "<p><tt>".spip_sql_errno()." ".spip_sql_error()."</tt></p>");
	} else {

		install_debut_html(_T('avis_erreur_connexion')); echo "<br><br><p>", _T('texte_inc_auth_1', array('auth_login' => $auth_login)), " <a href='",  generer_url_public('spip_cookie',"logout=$auth_login"), "'>", _T('texte_inc_auth_2'), "</A>",_T('texte_inc_auth_3');install_fin_html();
		minipres(_T('avis_erreur_connexion'), "<br><br><p>" . _T('texte_inc_auth_1', array('auth_login' => $auth_login)). " <a href='".  generer_url_public('spip_cookie',"logout=$auth_login"). "'>". _T('texte_inc_auth_2'). "</a>"._T('texte_inc_auth_3'));
	}
}

+40 −35
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -562,60 +562,65 @@ function afficher_formulaire_taille($document, $type_inclus='AUTO') {
// Afficher un formulaire d'upload
//

function afficher_upload($id, $intitule, $inclus = '', $mode, $type="", $ancre='', $document=0) {
  global   $spip_lang_right,$connect_id_auteur;
function afficher_upload($id, $intitule='', $inclus = '', $mode='', $type="", $ancre='', $id_document=0) {
	global $spip_lang_right;
	static $num_form = 0; $num_form ++;

	$res = "\n<div>" . bouton_block_invisible("ftp$num_form") .
		$intitule . "</div>\n<div>" .
		"\n<input name='fichier' type='file' style='font-size: 10px;' class='forml' size='15' />" .
		"\n<div align='" .
	if (!_DIR_RESTREINT) {
		$dir_ftp = determine_upload();
		$debut = "\n" . bouton_block_invisible("ftp$num_form");
		$milieu = "<div>" . debut_block_invisible("ftp$num_form");
		$fin = "\n" . fin_block();
	} else $dir_ftp = $debut = $fin = '';

	$res =  "\n$debut" .
		(!$intitule ? '' : "\n\t<div>$intitule</div>") .
		"\n\t\t<input name='fichier' type='file' style='font-size: 10px;' class='forml' size='15' />" .
		"\n\t\t<div align='" .
		$GLOBALS['spip_lang_right'] . 
		"'><input name='sousaction1' type='Submit' VALUE='" .
		"'><input name='sousaction1' type='submit' value='" .
		_T('bouton_telecharger') .
		"' CLASS='fondo'></div>\n";
		"' class='fondo' /></div>";

	// Un menu depliant si on a une possibilite supplementaire
	$dir_ftp = determine_upload();

	$test_distant = ($mode == 'document' AND $type);
	if ($dir_ftp OR $test_distant)
		$res .= "<div>" . debut_block_invisible("ftp$num_form");
		$res .= $milieu;

	if ($dir_ftp)
		$res .= afficher_transferer_upload($type, texte_upload_manuel($dir_ftp,$inclus));

	// Lien document distant, jamais en mode image
	if ($test_distant) {
		$res .=
			"<p /><div style='border: 1px #303030 solid; padding: 4px; color: #505050;'>" .
			"<img src='"._DIR_IMG_PACK.'attachment.gif' .
		$res .=	"<p />\n<div style='border: 1px #303030 solid; padding: 4px; color: #505050;'>" .
			"\n\t<img src='"._DIR_IMG_PACK.'attachment.gif' .
			"' style='float: $spip_lang_right;' alt=\"\" />\n" .
			"\n"._T('info_referencer_doc_distant')."<br />" .
			"\n<input name='url' class='fondo' value='http://' />" .
			"\n<div align='".$GLOBALS['spip_lang_right'].
			"'><input name='sousaction2' type='Submit' value='"._T('bouton_choisir')."' class='fondo'></div>" .
			"</div>\n";
			_T('info_referencer_doc_distant') .
			"<br />\n\t<input name='url' class='fondo' value='http://' />" .
			"\n\t<div align='" .
			$GLOBALS['spip_lang_right'] .
			"'><input name='sousaction2' type='Submit' value='".
			_T('bouton_choisir').
			"' class='fondo'></div>" .
			"\n</div>";
	}

	if ($dir_ftp OR $test_distant)
		$res .= "</div>\n";
		$res .= $fin;
	// Fin menu depliant

	$res .= "</div>\n" . fin_block();

	$redirect = generer_url_ecrire($GLOBALS['exec'], "id_$type=$id");
	$res .= "\n\t\t<input type='hidden' name='id' value='$id' />" .
		"\n\t\t<input type='hidden' name='id_document' value='$id_document' />" .
		"\n\t\t<input type='hidden' name='type' value='$type' />" .
		"\n\t\t<input type='hidden' name='ancre' value='$ancre' />" .
		"\n\t$fin";

	return construire_upload($res,
				array(
				'redirect' => $redirect,
				'hash' => calculer_action_auteur("joindre-$mode"),
				'id' => $id, 
				'id_auteur' => $connect_id_auteur,
				'arg' => $mode,
				'type' => $type,
				'id_document' => $document,
				'ancre' => $ancre),
				'multipart/form-data');
	return generer_action_auteur('joindre', 
		$mode,
		generer_url_ecrire($GLOBALS['exec'], "id_$type=$id"),
		$res,
		" method='POST' enctype='multipart/form-data' style='border: 0px; margin: 0px;'");
}

function construire_upload($corps, $args, $enctype='')
@@ -629,7 +634,7 @@ function construire_upload($corps, $args, $enctype='')
	return "\n<form method='post' action='" . generer_url_action('joindre') .
	  "'" .
	  (!$enctype ? '' : " enctype='$enctype'") .
	  " style='border: 0px; margin: 0px;'
	  " 
	  >\n" .
	  "<div>" .
  	  "\n<input type='hidden' name='action' value='joindre' />" .
Chargement en cours