Your IP : 216.73.216.245


Current Path : /home/bourgleram/www/398a1/
Upload File :
Current File : /home/bourgleram/www/398a1/action.tar

editer_breve.php000066600000014154152522474160007735 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

// http://code.spip.net/@action_editer_breve_dist
function action_editer_breve_dist($arg=null) {

	if (is_null($arg)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}

	// Envoi depuis le formulaire d'edition d'une breve
	if (!$id_breve = intval($arg)) {
		$id_breve = breve_inserer(_request('id_parent'));
	}

	if (!$id_breve)
		return array(0,''); // erreur

	$err = breve_modifier($id_breve);

	return array($id_breve,$err);
}

/**
 * Inserer une breve en base
 * http://code.spip.net/@insert_breve
 *
 * @param int $id_rubrique
 * @return int
 */
function breve_inserer($id_rubrique) {

	include_spip('inc/rubriques');

	// Si id_rubrique vaut 0 ou n'est pas definie, creer la breve
	// dans la premiere rubrique racine
	if (!$id_rubrique = intval($id_rubrique)) {
		$id_rubrique = sql_getfetsel("id_rubrique", "spip_rubriques", "id_parent=0",'', '0+titre,titre', "1");
	}

	// La langue a la creation : c'est la langue de la rubrique
	$row = sql_fetsel("lang, id_secteur", "spip_rubriques", "id_rubrique=$id_rubrique");
	$lang = $row['lang'];
	$id_rubrique = $row['id_secteur']; // garantir la racine

	$champs = array(
		'id_rubrique' => $id_rubrique,
		'statut' => 'prop',
		'date_heure' => date('Y-m-d H:i:s'),
		'lang' => $lang,
		'langue_choisie' => 'non');
	
	// Envoyer aux plugins
	$champs = pipeline('pre_insertion',
		array(
			'args' => array(
				'table' => 'spip_breves',
			),
			'data' => $champs
		)
	);
	$id_breve = sql_insertq("spip_breves", $champs);
	pipeline('post_insertion',
		array(
			'args' => array(
				'table' => 'spip_breves',
				'id_objet' => $id_breve
			),
			'data' => $champs
		)
	);
	return $id_breve;
}


/**
 * Modifier une breve en base
 * $c est un contenu (par defaut on prend le contenu via _request())
 *
 * http://code.spip.net/@revisions_breves
 *
 * @param int $id_breve
 * @param array $set
 * @return string|bool
 */
function breve_modifier ($id_breve, $set=null) {

	include_spip('inc/modifier');
	$c = collecter_requests(
		// white list
		array('titre', 'texte', 'lien_titre', 'lien_url'),
		// black list
		array('id_parent', 'statut'),
		// donnees eventuellement fournies
		$set
	);

	// Si la breve est publiee, invalider les caches et demander sa reindexation
	$t = sql_getfetsel("statut", "spip_breves", "id_breve=$id_breve");
	if ($t == 'publie') {
		$invalideur = "id='breve/$id_breve'";
		$indexation = true;
	}

	if ($err = objet_modifier_champs('breve', $id_breve,
		array(
			'nonvide' => array('titre' => _T('breves:titre_nouvelle_breve')." "._T('info_numero_abbreviation').$id_breve),
			'invalideur' => $invalideur,
			'indexation' => $indexation
		),
		$c))
		return $err;

	$c = collecter_requests(array('id_parent', 'statut'),array(),$set);
	$err = breve_instituer($id_breve, $c);
	return $err;
}

/**
 * Instituer une breve : modifier son statut ou son parent
 *
 * @param int $id_breve
 * @param array $c
 * @return string
 */
function breve_instituer($id_breve, $c) {
	$champs = array();

	// Changer le statut de la breve ?
	$row = sql_fetsel("statut, id_rubrique,lang, langue_choisie", "spip_breves", "id_breve=".intval($id_breve));
	$id_rubrique = $row['id_rubrique'];

	$statut_ancien = $statut = $row['statut'];
	$langue_old = $row['lang'];
	$langue_choisie_old = $row['langue_choisie'];

	if ($c['statut']
	AND $c['statut'] != $statut
	AND autoriser('publierdans', 'rubrique', $id_rubrique)) {
		$statut = $champs['statut'] = $c['statut'];
	}

	// Changer de rubrique ?
	// Verifier que la rubrique demandee est a la racine et differente
	// de la rubrique actuelle
	if ($id_parent = intval($c['id_parent'])
	AND $id_parent != $id_rubrique
	AND (NULL !== ($lang=sql_getfetsel('lang', 'spip_rubriques', "id_parent=0 AND id_rubrique=".intval($id_parent))))) {
		$champs['id_rubrique'] = $id_parent;
		// - changer sa langue (si heritee)
		if ($langue_choisie_old != "oui") {
			if ($lang != $langue_old)
				$champs['lang'] = $lang;
		}
		// si la breve est publiee
		// et que le demandeur n'est pas admin de la rubrique
		// repasser la breve en statut 'prop'.
		if ($statut == 'publie') {
			if (!autoriser('publierdans','rubrique',$id_parent))
				$champs['statut'] = $statut = 'prop';
		}
	}

	// Envoyer aux plugins
	$champs = pipeline('pre_edition',
		array(
			'args' => array(
				'table' => 'spip_breves',
				'id_objet' => $id_breve,
				'action'=>'instituer',
				'statut_ancien' => $statut_ancien,
			),
			'data' => $champs
		)
	);

	if (!$champs) return;

	sql_updateq('spip_breves', $champs, "id_breve=".intval($id_breve));

	//
	// Post-modifications
	//

	// Invalider les caches
	include_spip('inc/invalideur');
	suivre_invalideur("id='breve/$id_breve'");

	// Au besoin, changer le statut des rubriques concernees 
	include_spip('inc/rubriques');
	calculer_rubriques_if($id_rubrique, $champs, $statut_ancien);

	// Pipeline
	pipeline('post_edition',
		array(
			'args' => array(
				'table' => 'spip_breves',
				'id_objet' => $id_breve,
				'action'=>'instituer',
				'statut_ancien' => $statut_ancien,
			),
			'data' => $champs
		)
	);


	// Notifications
	if ($notifications = charger_fonction('notifications', 'inc')) {
		$notifications('instituerbreve', $id_breve,
			array('statut' => $statut, 'statut_ancien' => $statut_ancien)
		);
	}

	return ''; // pas d'erreur
}

function insert_breve($id_rubrique) {
	return breve_inserer($id_rubrique);
}
function revisions_breves ($id_breve, $set=false) {
	return breve_modifier($id_breve,$set);
}
?>verifier_documents_liens.php000066600000002222152522474270012357 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 * Verifier tous les fichiers brises
 *
 */
function action_verifier_documents_liens_dist($id_document=null) {

	if (is_null($id_document)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$id_document = $securiser_action();
	}

	$id_document = ($id_document=='*')?'*':intval($id_document);
	include_spip('action/editer_liens');
	objet_optimiser_liens(array('document'=>$id_document),'*');

}

?>copier_local.php000066600000005603152522474270007732 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 * Fonction appellee lorsque l'utilisateur clique sur le bouton
 * 'copier en local' (document/portfolio).
 * Il s'agit de la partie logique, c'est a dire que cette fonction
 * realise la copie.
 *
 * http://code.spip.net/@action_copier_local_dist
 *
 * @param null $id_document
 * @return bool|mixed|string
 */
function action_copier_local_dist($id_document=null) {

	if (!$id_document){
		// Recupere les arguments.
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	
		$id_document = intval($arg);
	}

	if (!$id_document) {
		spip_log("action_copier_local_dist $arg pas compris");
		return false;
	} else  {
		// arguments recuperes, on peut maintenant appeler la fonction.
		return action_copier_local_post($id_document);
	}
}

/**
 * http://code.spip.net/@action_copier_local_post
 *
 * @param  $id_document
 * @return bool|mixed|string
 */
function action_copier_local_post($id_document) {

	// Il faut la source du document pour le copier
	$row = sql_fetsel("mode,fichier, descriptif, credits", "spip_documents", "id_document=$id_document");
	$source = $row['fichier'];

	// si la source est bien un fichier distant
	// sinon c'est une donnee moisie, on ne fait rien
	if (tester_url_absolue($source)){
	
		include_spip('inc/distant'); // pour 'copie_locale'
		$fichier = copie_locale($source);
		if ($fichier) {
			$fichier = _DIR_RACINE . $fichier;
			$files[] = array('tmp_name'=>$fichier,'name'=>basename($fichier));
			$ajouter_documents = charger_fonction('ajouter_documents','action');
			spip_log("convertit doc $id_document en local: $source => $fichier");
			$liste = array();
			$ajouter_documents($id_document,$files,'',0,$row['mode'],$liste);
	
			spip_unlink($fichier);
			
			// ajouter l'origine du document aux credits
			include_spip('action/editer_document');
			document_modifier($id_document,array('credits'=>($row['credits']?$row['credits'].', ':'').$source));
			return true;
			
		} else {
			spip_log("echec copie locale $source");
		}
	} else {
		spip_log("echec copie locale $source n'est pas une URL distante", "medias" . _LOG_ERREUR);
	}
		
	return _T('medias:erreur_copie_fichier',array('nom'=>$source));
}

?>
ajouter_documents.php000066600000041276152522474270011037 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2014                                                *
 *  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.   *
 *                                                                         *
 *  JYG001 : redimensionnement à la volée dans tous les cas (ex. avec      *
 *           les plugins cycle, nivoslider, etc...)                        *
 *           Basé sur le source de SPIP 3.0.14                             *
 *           (Répertoire d'origine : \plugins-dist\medias\action)          *
 *                                                                         *
\***************************************************************************/

if (!defined("_ECRIRE_INC_VERSION")) return;

include_spip('inc/getdocument');
include_spip('inc/documents');
include_spip('inc/choisir_mode_document'); // compat core
include_spip('inc/renseigner_document');
// JYG001 ***** Debut Ajout *****
include_spip('inc/filtres_images_lib_mini'); // pour la fonction _image_creer_vignette
// JYG001 ***** Fin Ajout *****

/**
 * Ajouter des documents
 *
 * @param int $id_document
 *   document a remplacer, ou pour une vignette, l'id_document de maman
 *   0 ou 'new' pour une insertion
 * @param  $files
 *   tableau de taleau de propriete pour chaque document a inserer
 * @param  $objet
 *   objet auquel associer le document
 * @param  $id_objet
 *   id_objet
 * @param  $mode
 *   mode par defaut si pas precise pour le document
 * @return array
 *   liste des id_documents inseres
 */
function action_ajouter_documents_dist($id_document, $files, $objet, $id_objet, $mode){
	$ajouter_un_document = charger_fonction('ajouter_un_document','action');
	$ajoutes = array();

	// on ne peut mettre qu'un seul document a la place d'un autre ou en vignette d'un autre
	if (intval($id_document)){
		$ajoutes[] = $ajouter_un_document($id_document, reset($files), $objet, $id_objet, $mode);
	}
	else
		foreach($files as $file){
			$ajoutes[] = $ajouter_un_document('new', $file, $objet, $id_objet, $mode);
		}
	return $ajoutes;
}

/**
 * Ajouter un document (au format $_FILES)
 *
 * http://doc.spip.org/@ajouter_un_document
 *
 * @param int $id_document
 *   document a remplacer, ou pour une vignette, l'id_document de maman
 *   0 ou 'new' pour une insertion
 * @param array $file
 *   proprietes au format $_FILE etendu :
 *     string tmp_name : source sur le serveur
 *     string name : nom du fichier envoye
 *     bool titrer : donner ou non un titre a partir du nom du fichier
 *     bool distant : pour utiliser une source distante sur internet
 *     string mode : vignette|image|documents|choix
 * @param string $objet
 *   objet auquel associer le document
 * @param int $id_objet
 *   id_objet
 * @param string $mode
 *   mode par defaut si pas precise pour le document
 * @return array|bool|int|mixed|string|unknown
 * 	 si int : l'id_document ajouté (opération réussie)
 *   si string : une erreur s'est produit, la chaine est le message d'erreur
 *  
 */
function action_ajouter_un_document_dist($id_document, $file, $objet, $id_objet, $mode) {

	$source = $file['tmp_name'];
	$nom_envoye = $file['name'];

	// passer en minuscules le nom du fichier, pour eviter les collisions
	// si le file system fait la difference entre les deux il ne detectera
	// pas que Toto.pdf et toto.pdf
	// et on aura une collision en cas de changement de file system
	$file['name'] = strtolower(translitteration($file['name']));
	
	// Pouvoir definir dans mes_options.php que l'on veut titrer tous les documents par d?faut
	if (!defined('_TITRER_DOCUMENTS')) { define('_TITRER_DOCUMENTS', false); }

	$titrer = isset($file['titrer'])?$file['titrer']:_TITRER_DOCUMENTS;
	$mode = ((isset($file['mode']) AND $file['mode'])?$file['mode']:$mode);

	include_spip('inc/modifier');
	if (isset($file['distant']) AND $file['distant'] AND !in_array($mode,array('choix','auto','image','document'))) {
		include_spip('inc/distant');
		$file['tmp_name'] = _DIR_RACINE . copie_locale($source);
		$source = $file['tmp_name'];
		unset($file['distant']);
	}

	// Documents distants : pas trop de verifications bloquantes, mais un test
	// via une requete HEAD pour savoir si la ressource existe (non 404), si le
	// content-type est connu, et si possible recuperer la taille, voire plus.
	if (isset($file['distant']) AND $file['distant']) {
		include_spip('inc/distant');
		if (is_array($a = renseigner_source_distante($source))) {

			$champs = $a;
			# NB: dans les bonnes conditions (fichier autorise et pas trop gros)
			# $a['fichier'] est une copie locale du fichier

			unset($champs['type_image']);
		}
		// on ne doit plus arriver ici, car l'url distante a ete verifiee a la saisie !
		else {
			spip_log("Echec du lien vers le document $source, abandon");
			return $a; // message d'erreur
		}
	}
	else { // pas distant

		$champs = array(
			'distant' => 'non'
		);
		
		$type_image = ''; // au pire
		$champs['titre'] = '';
		if ($titrer){
			$titre = substr($nom_envoye,0, strrpos($nom_envoye, ".")); // Enlever l'extension du nom du fichier
			$titre = preg_replace(',[[:punct:][:space:]]+,u', ' ', $titre);
			$champs['titre'] = preg_replace(',\.([^.]+)$,', '', $titre);
		}

		if (!is_array($fichier = fixer_fichier_upload($file, $mode)))
			return is_string($fichier)?$fichier:_T("medias:erreur_upload_type_interdit",array('nom'=>$file['name']));
		
		$champs['inclus'] = $fichier['inclus'];
		$champs['extension'] = $fichier['extension'];
		$champs['fichier'] = $fichier['fichier'];

		/**
		 * Récupère les informations du fichier
		 * -* largeur
		 * -* hauteur
		 * -* type_image
		 * -* taille
		 * -* ses metadonnées si une fonction de metadatas/ est présente
		 */
		$infos = renseigner_taille_dimension_image($champs['fichier'],$champs['extension']);
		if (is_string($infos))
			return $infos; // c'est un message d'erreur !
		
// JYG001 ***** Debut Ajout *****
		// On corrige le type image - bug SPIP : 
		// -----------------------------------
		// 'type_image' n'est pas inclus dans la table 'spip_documents' 'champs_editables' (voir \plugins-dist\medias\base\medias.php)
		// Du coup, la fonction objet_info('document','champs_editables') du fichier \plugins-dist\medias\inc\renseigner_document.php ne retourne pas de valeur pour le champ 'type_image',
		// alors que la fonction verifier_taille_document_acceptable($champs) qui suit en a besoin pour déterminer si le document est une image ou non
		if ($champs['inclus'] == 'image')
		{
			$meta_image = array();
			$meta_image = metadata_image_dist($champs['fichier']);
			$infos['type_image'] = $meta_image['type_image'];
		}
// JYG001 ***** Fin Ajout *****
			
		$champs = array_merge($champs,$infos);

		// Si mode == 'choix', fixer le mode image/document
		if (in_array($mode,array('choix','auto'))) {
			$choisir_mode_document = charger_fonction('choisir_mode_document','inc');
			$mode = $choisir_mode_document($champs, $champs['inclus'] == 'image', $objet);
		}
		$champs['mode'] = $mode;

		if (($test = verifier_taille_document_acceptable($champs))!==true){
// JYG001 ***** Debut Ajout *****
			if ($test == "Redimensionner")
			{
				// On redimensionne l'image à la volée et on actualise ses dimensions
				$maxx = _IMG_MAX_WIDTH;
				$maxy = _IMG_MAX_HEIGHT;
				$fonction = array('image_reduire', func_get_args());
				$fichier = $champs['fichier'];
				$image = _image_valeurs_trans($fichier, "reduire-$maxx-$maxy",false,$fonction);
				$image['fichier_dest'] = $image['fichier'];
				$process = $GLOBALS['meta']['image_process'];
				if (_image_creer_vignette($image, _IMG_MAX_WIDTH, _IMG_MAX_HEIGHT, $process, true, false))
				{
					spip_log ("Redimensionnement image : $fichier");
					$champs['largeur'] = $image['largeur_dest'];
					$champs['hauteur'] = $image['hauteur_dest'];
					$champs['taille'] = @intval(filesize($fichier));
				}
			}
			else
			{
// JYG001 ***** Fin Ajout *****
			spip_unlink($champs['fichier']);
			return $test; // erreur sur les dimensions du fichier
// JYG001 ***** Debut Ajout *****
			}
// JYG001 ***** Fin Ajout *****
		}

		unset($champs['type_image']);
		unset($champs['inclus']);
		$champs['fichier'] = set_spip_doc($champs['fichier']);
	}

	// si le media est pas renseigne, le faire, en fonction de l'extension
	if (!isset($champs['media'])){
		$champs['media'] = sql_getfetsel('media_defaut','spip_types_documents','extension='.sql_quote($champs['extension']));
	}
	
	// lier le parent si necessaire
	if ($id_objet=intval($id_objet) AND $objet)
		$champs['parents'][] = "$objet|$id_objet";

	// "mettre a jour un document" si on lui
	// passe un id_document
	if ($id_document=intval($id_document)){
		unset($champs['titre']); // garder le titre d'origine
		unset($champs['date']); // garder la date d'origine
		unset($champs['descriptif']); // garder la desc d'origine
		// unset($a['distant']); # on peut remplacer un doc statique par un doc distant
		// unset($a['mode']); # on peut remplacer une image par un document ?
	}

	include_spip('action/editer_document');
	// Installer le document dans la base
	if (!$id_document){
		if ($id_document = document_inserer())
			spip_log ("ajout du document ".$file['tmp_name']." ".$file['name']."  (M '$mode' T '$objet' L '$id_objet' D '$id_document')",'medias');
		else
			spip_log ("Echec insert_document() du document ".$file['tmp_name']." ".$file['name']."  (M '$mode' T '$objet' L '$id_objet' D '$id_document')",'medias'._LOG_ERREUR);
	}
	if (!$id_document)
		return _T('medias:erreur_insertion_document_base',array('fichier'=>"<em>".$file['name']."</em>"));
	
	document_modifier($id_document,$champs);

	// permettre aux plugins de faire des modifs a l'ajout initial
	// ex EXIF qui tourne les images si necessaire
	// Ce plugin ferait quand même mieux de se placer dans metadata/jpg.php
	pipeline('post_edition',
		array(
			'args' => array(
				'table' => 'spip_documents', // compatibilite
				'table_objet' => 'documents',
				'spip_table_objet' => 'spip_documents',
				'type' =>'document',
				'id_objet' => $id_document,
				'champs' => array_keys($champs),
				'serveur' => '', // serveur par defaut, on ne sait pas faire mieux pour le moment
				'action' => 'ajouter_document',
				'operation' => 'ajouter_document', // compat <= v2.0
			),
			'data' => $champs
		)
	);

	return $id_document ;
}


/**
 * Corrige l'extension du fichier dans quelques cas particuliers
 * (a passer dans ecrire/base/typedoc)
 * A noter : une extension 'pdf ' passe dans la requete de controle
 * mysql> SELECT * FROM spip_types_documents WHERE extension="pdf ";
 *
 * @param string $ext
 * @return string
 */
function corriger_extension($ext) {
	$ext = preg_replace(',[^a-z0-9],i', '', $ext);
	switch ($ext) {
		case 'htm':
			$ext='html';
			break;
		case 'jpeg':
			$ext='jpg';
			break;
		case 'tiff':
			$ext='tif';
			break;
		case 'aif':
			$ext='aiff';
			break;
		case 'mpeg':
			$ext='mpg';
			break;
	}
	return $ext;
}

/**
 * Verifie la possibilite d'uploader une extension
 * renvoie un tableau descriptif si l'extension est acceptee
 * avec un index 'autozip' si il faut zipper
 * false ou message d'erreur si l'extension est refusee
 * Verifie aussi si l'extension est autorisee pour le mode demande
 * si on connait le mode a ce moment la
 * 
 */
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;
}


/**
 * tester le type de document :
 * - interdit a l'upload ?
 * - quelle extension dans spip_types_documents ?
 * - est-ce "inclus" comme une image ?
 * 
 * le zipper si necessaire
 * 
 * @param array $file //format $_FILES
 * @return array
 */
function fixer_fichier_upload($file, $mode=''){

	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;
		}
		// creer un zip comme demande
		// pour encapsuler un fichier dont l'extension n'est pas supportee
		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 zip créé 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
}

/**
 * Verifier si le fichier respecte les contraintes de tailles
 * 
 * @param  array $infos
 * @return bool|mixed|string
 */
function verifier_taille_document_acceptable($infos){
	
	// si ce n'est pas une image
	if (!$infos['type_image']) {
		if (_DOC_MAX_SIZE > 0
		 AND $infos['taille'] > _DOC_MAX_SIZE*1024)
			return _T('medias:info_doc_max_poids', array('maxi' => taille_en_octets(_DOC_MAX_SIZE*1024), 'actuel' => taille_en_octets($infos['taille'])));
	}
	
	// si c'est une image
	else {

		if (_IMG_MAX_SIZE > 0
		 AND $infos['taille'] > _IMG_MAX_SIZE*1024)
			return _T('medias:info_image_max_poids', array('maxi' => taille_en_octets(_IMG_MAX_SIZE*1024), 'actuel' => taille_en_octets($infos['taille'])));
	
		if (_IMG_MAX_WIDTH * _IMG_MAX_HEIGHT
		 AND ($infos['largeur'] > _IMG_MAX_WIDTH
		 OR $infos['hauteur'] > _IMG_MAX_HEIGHT))

// JYG001 ***** Debut Suppression *****
/*
			return _T('medias: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' => $infos['largeur'],
							'hauteur_vignette' => $infos['hauteur']))
				));
*/
// JYG001 ***** Fin Suppression *****

// JYG001 ***** Debut Ajout *****
			// Au lieu d'un message d'erreur, on retourne l'indication qu'il faut redimensionner l'image
			return "Redimensionner";
// JYG001 ***** Fin Ajout *****
	}

	// verifier en fonction du mode si une fonction est proposee
	if ($verifier_document_mode = charger_fonction("verifier_document_mode_".$infos['mode'],"inc",true))
		return $verifier_document_mode($infos);

	return true;
}


?>changer_mode_document.php000066600000003632152522474270011610 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;


/**
 * Cette action permet de basculer du mode image au mode document et vice versa
 *
 * http://code.spip.net/@action_changer_mode_document_dist
 *
 * @param int $id_document
 * @param string $mode
 * @return void
 */
function action_changer_mode_document_dist($id_document=null, $mode=null){
	if (is_null($id_document) OR is_null($mode)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();

		if (!preg_match(",^(\d+)\W(\w+)$,", $arg, $r))
			spip_log("action_changer_mode_document $arg pas compris");
		else {
			array_shift($r);
	    list($id_document, $mode) = $r;
		}
	}

	if ($id_document
		AND include_spip('inc/autoriser')
	  AND autoriser('modifier','document',$id_document))
		action_changer_mode_document_post($id_document, $mode);
}

// http://code.spip.net/@action_changer_mode_document_post
function action_changer_mode_document_post($id_document, $mode){
	// - id_document le doc a modifier
	// - mode le mode a lui donner
	if ($id_document = intval($id_document)
	AND in_array($mode, array('vignette', 'image', 'document'))) {
		include_spip('action/editer_document');
		document_modifier($id_document,array('mode'=>$mode));
	}
}
?>
supprimer_document.php000066600000005724152522474270011227 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

// http://code.spip.net/@supprimer_document
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),'*');
	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', // compat v<=2
				'action' => 'supprimer_document',
				'table' => 'spip_documents',
				'id_objet' => $id_document
			),
			'data' => null
		)
	);
	return true;
}

?>
supprimer_tous_orphelins.php000066600000003641152522474270012462 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

include_spip('base/abstract_sql');

function action_supprimer_tous_orphelins() {

	$securiser_action = charger_fonction('securiser_action','inc');
	$arg = $securiser_action();

	//on recupere le contexte pour ne supprimer les orphelins que de ce dernier
	list($media,$distant,$statut,$sanstitre) = explode('/',$arg);
	
	//critere sur le media
	if($media)
		$select = "media=".sql_quote($media);

	//critere sur le distant
	if($distant)
		$where[] = "distant=".sql_quote($distant);

	//critere sur le statut
	if($statut)
		$where[] = "statut REGEXP ".sql_quote("($statut)");

	//critere sur le sanstitre
	if($sanstitre)
		$where[] = "titre=''";

	//on isole les orphelins
	$select = sql_get_select("DISTINCT id_document","spip_documents_liens as oooo");
	$cond = "spip_documents.id_document NOT IN ($select)";
	$where[] = $cond;

	$ids_doc_orphelins = sql_select( "id_document", "spip_documents", $where );

	$supprimer_document = charger_fonction('supprimer_document','action');
	while ($row = sql_fetch($ids_doc_orphelins)) {
		$supprimer_document($row['id_document']); // pour les orphelins du contexte, on traite avec la fonction existante
	}
}

?>dissocier_document.php000066600000012747152522474270011170 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;


/**
 * Dissocier un document
 * $arg fournit les arguments de la fonction dissocier_document
 * sous la forme
 * $id_objet-$objet-$document-suppr-safe
 *
 * 4eme arg : suppr = true, false sinon
 * 5eme arg : safe = true, false sinon
 * 
 * @return void
 */
function action_dissocier_document_dist($arg=null){
	if(is_null($arg)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}

	// attention au cas ou id_objet est negatif !
	if (strncmp($arg,'-',1)==0){
		$arg = explode('-',substr($arg,1));
		list($id_objet, $objet, $document) = $arg;
		$id_objet = -$id_objet;
	}
	else {
		$arg = explode('-',$arg);
		list($id_objet, $objet, $document) = $arg;
	}

	$suppr=false;
	if (count($arg)>3 AND $arg[3]=='suppr')
		$suppr = true;
	if (count($arg)>4 AND $arg[4]=='safe')
		$check = true;
	if ($id_objet=intval($id_objet)
		AND (
			($id_objet<0 AND $id_objet==-$GLOBALS['visiteur_session']['id_auteur'])
			OR autoriser('dissocierdocuments',$objet,$id_objet)
		))
		dissocier_document($document, $objet, $id_objet, $suppr, $check);
	else
		spip_log("Interdit de modifier $objet $id_objet","spip");
}

/**
 * Supprimer un lien entre un document et un objet
 *
 * @param int $id_document
 * @param string $objet
 * @param int $id_objet
 * @param bool $supprime
 *   si true, le document est supprime si plus lie a aucun objet
 * @param bool $check
 *   si true, on verifie les documents references dans le texte de l'objet
 *   et on les associe si pas deja fait
 * @return bool
 */
function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = false, $check = false) {
	if (!$id_document = intval($id_document))
		return false;

	// D'abord on ne supprime pas, on dissocie
	include_spip('action/editer_liens');
	objet_dissocier(array('document'=>$id_document),array($objet=>$id_objet));

	// Si c'est une vignette, l'eliminer du document auquel elle appartient
	// cas tordu peu probable
	sql_updateq("spip_documents", array('id_vignette' => 0), "id_vignette=".$id_document);

	// verifier son statut apres une suppression de lien
	include_spip('action/editer_document');
	document_instituer($id_document);

	pipeline('post_edition',
		array(
			'args' => array(
				'operation' => 'delier_document', // compat v<=2
				'action' => 'delier_document',
				'table' => 'spip_documents',
				'id_objet' => $id_document,
				'objet' => $objet,
				'id' => $id_objet
			),
			'data' => null
		)
	);

	if ($check) {
		// si demande, on verifie que ses documents vus sont bien lies !
		$spip_table_objet = table_objet_sql($objet);
		$table_objet = table_objet($objet);
		$id_table_objet = id_table_objet($objet,$serveur);
		$champs = sql_fetsel('*',$spip_table_objet,addslashes($id_table_objet)."=".intval($id_objet));

		$marquer_doublons_doc = charger_fonction('marquer_doublons_doc','inc');
		$marquer_doublons_doc($champs,$id_objet,$objet,$id_table_objet,$table_objet,$spip_table_objet, '', $serveur);
	}

	// On supprime ensuite s'il est orphelin
	// et si demande
	// ici on ne bloque pas la suppression d'un document rattache a un autre
	if ($supprime AND !sql_countsel('spip_documents_liens', "objet!='document' AND id_document=".$id_document)){
		$supprimer_document = charger_fonction('supprimer_document','action');
		return $supprimer_document($id_document);
	}
}

/**
 * Dissocier un ou des documents
 *
 * @param int|string $document
 *   id_document a dissocier
 *   I/image pour dissocier les images en mode Image
 *   I/document pour dissocier les images en mode document
 *   D/document pour dissocier les documents non image en mode document
 * @param  $objet
 *   objet duquel dissocier
 * @param  $id_objet
 *   id_objet duquel dissocier
 * @param bool $supprime
 *   supprimer les documents orphelins apres dissociation
 * @param bool $check
 *   verifier le texte des documents et relier les documents references dans l'objet
 * @return void
 */
function dissocier_document($document, $objet, $id_objet, $supprime = false, $check = false){
	if ($id_document=intval($document)) {
		supprimer_lien_document($id_document, $objet, $id_objet, $supprime, $check);
	}
	else {
		list($image,$mode) = explode('/',$document);
		$image = ($image=='I');
		$typdoc = sql_in('docs.extension', array('gif', 'jpg', 'png'), $image  ? '' : 'NOT');

		$obj = "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet);

		$s = sql_select('docs.id_document',
			"spip_documents AS docs LEFT JOIN spip_documents_liens AS l ON l.id_document=docs.id_document",
			"$obj AND vu='non' AND docs.mode=".sql_quote($mode)." AND $typdoc");
		while ($t = sql_fetch($s)) {
			supprimer_lien_document($t['id_document'], $objet, $id_objet, $supprime, $check);
		}
	}

	// pas tres generique ca ...
	if ($objet == 'rubrique') {
		include_spip('inc/rubriques');
		depublier_branche_rubrique_if($id_objet);
	}
}
?>
acceder_document.php000066600000007271152522474270010566 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

include_spip('inc/headers');

// 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 ou rubrique publie

// http://code.spip.net/@action_acceder_document_dist
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 = "D.fichier=".sql_quote(set_spip_doc($file))
		. ($arg ? " AND D.id_document=".intval($arg): '');

		$doc = sql_fetsel("D.id_document, D.titre, D.fichier, T.mime_type, T.inclus, D.extension", "spip_documents AS D LEFT JOIN spip_types_documents AS T ON D.extension=T.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('medias: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') {

		  // 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'];

			// 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;
	}

}

?>
verifier_documents_brises.php000066600000002526152522474270012543 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

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

?>editer_document.php000066600000020752152522474270010453 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;


/**
 * Action editer_document
 *
 * @param int $arg
 * @return array
 */
function action_editer_document_dist($arg=null) {

	if (is_null($arg)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}

	// Envoi depuis le formulaire de creation d'un document
	if (!$id_document = intval($arg)) {
		$id_document = document_inserer();
	}

	if (!$id_document)
		return array(0,''); // erreur

	$err = document_modifier($id_document);

	return array($id_document,$err);
}

/**
 * Creer un nouveau document
 *
 * @return int
 */
function document_inserer() {

	$champs = array(
		'statut' => 'prop',
		'date' => 'NOW()',
	);

	// Envoyer aux plugins
	$champs = pipeline('pre_insertion',
		array(
			'args' => array(
				'table' => 'spip_documents',
			),
			'data' => $champs
		)
	);
	$id_document = sql_insertq("spip_documents", $champs);
	pipeline('post_insertion',
		array(
			'args' => array(
				'table' => 'spip_documents',
				'id_objet' => $id_document
			),
			'data' => $champs
		)
	);

	return $id_document;
}


/**
 * 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(
		// white list
		objet_info('document','champs_editables'),
		// black list
		array('parents', 'ajout_parents'),
		// donnees eventuellement fournies
		$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'] // un plugin a pu interdire la modif du fichier en virant le champ
	 AND $ancien_fichier // on avait bien note le nom du fichier avant la modif
	 AND $ancien_fichier!==$champs['fichier'] // et il a ete modifie
	 AND !tester_url_absolue($ancien_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'");	
	}

}


/**
 * determiner le statut d'un document : prepa/publie
 * si on trouve un element joint sans champ statut ou avec un statut='publie' alors le doc est publie aussi
 *
 * @param int $id_document
 * @param array $champs
 * @return bool
 */
function document_instituer($id_document,$champs=array()){
	
	$statut=isset($champs['statut'])?$champs['statut']:null;
	$date_publication = isset($champs['date_publication'])?$champs['date_publication']:null;
	if (isset($champs['parents']))
		medias_revision_document_parents($id_document,$champs['parents']);
	if (isset($champs['ajout_parents']))
		medias_revision_document_parents($id_document,$champs['ajout_parents'],true);
	
	$row = sql_fetsel("statut,date_publication", "spip_documents", "id_document=$id_document");
	$statut_ancien = $row['statut'];
	$date_publication_ancienne = $row['date_publication'];

	/* Autodetermination du statut si non fourni */
	if (is_null($statut)){
		$statut = 'prepa';

		$trouver_table = charger_fonction('trouver_table','base');
		$res = sql_select('id_objet,objet','spip_documents_liens',"objet!='document' AND id_document=".intval($id_document));
		// dans 10 ans, ca nous fera un bug a corriger vers 2018
		// penser a ouvrir un ticket d'ici la :p
		$date_publication=time()+10*365*24*3600;
		include_spip('base/objets');
		while($row = sql_fetch($res)){
			if (
				// cas particulier des rubriques qui sont publiees des qu'elles contiennent un document !
			  $row['objet']=='rubrique'
				// ou si objet publie selon sa declaration
			  OR objet_test_si_publie($row['objet'],$row['id_objet'])){
				$statut = 'publie';
				$date_publication=0;
				continue;
			}
			// si pas publie, et article, il faut checker la date de post-publi eventuelle
			elseif ($row['objet']=='article'
			  AND $row2 = sql_fetsel('date','spip_articles','id_article='.intval($row['id_objet'])." AND statut='publie'")){
				$statut = 'publie';
				$date_publication = min($date_publication,strtotime($row2['date']));
			}
		}
		$date_publication = date('Y-m-d H:i:s',$date_publication);
		if ($statut=='publie' AND $statut_ancien=='publie' AND $date_publication==$date_publication_ancienne)
			return false;
		if ($statut!='publie' AND $statut_ancien!='publie' AND $statut_ancien!='0')
			return false;
	}
	if ($statut!==$statut_ancien
	  OR $date_publication!=$date_publication_ancienne){
		sql_updateq('spip_documents',array('statut'=>$statut,'date_publication'=>$date_publication),'id_document='.intval($id_document));
		if ($statut!==$statut_ancien){
			$publier_rubriques = sql_allfetsel('id_objet','spip_documents_liens',"objet='rubrique' AND id_document=".intval($id_document));
			if (count($publier_rubriques)){
				include_spip('inc/rubriques');
				foreach($publier_rubriques as $r)
					calculer_rubriques_if($r['id_objet'],array('statut'=>$statut),$statut_ancien,false);
			}
		}
		return true;
	}
	return false;
}


/**
 * Revision des parents d'un document
 * chaque parent est liste au format objet|id_objet
 *
 * @param int $id_document
 * @param array $parents
 * @param bool $ajout
 */
function medias_revision_document_parents($id_document, $parents=null, $ajout=false){
	if (!is_array($parents))
		return;
	
	$insertions = array();
	$objets_parents = array(); // array('article'=>array(12,23))
	
	// au format objet|id_objet
	foreach($parents as $p){
		$p = explode('|',$p);
		if (preg_match('/^[a-z0-9_]+$/i', $objet=$p[0])
		  AND $p[1]=intval($p[1])){ // securite
			$objets_parents[$p[0]][] = $p[1];
		}
	}
	
	include_spip('action/editer_liens');
	// les liens actuels
	$liens = objet_trouver_liens(array('document'=>$id_document),'*');
	$deja_parents = array();
	// si ce n'est pas un ajout, il faut supprimer les liens actuels qui ne sont pas dans $objets_parents
	if (!$ajout){
		foreach($liens as $k=>$lien)
			if (!isset($objets_parents[$lien['objet']]) OR !in_array($lien['id_objet'],$objets_parents[$lien['objet']])) {
				if (autoriser('dissocierdocuments',$lien['objet'],$lien['id_objet'])){
					objet_dissocier(array('document'=>$id_document),array($lien['objet']=>$lien['id_objet']));
				}
				unset($liens[$k]);
			}
			else $deja_parents[$lien['objet']][] = $lien['id_objet'];
	}

	// verifier les droits d'associer
	foreach($objets_parents as $objet=>$ids){
		foreach($ids as $k=>$id){
			if (!autoriser('associerdocuments',$objet,$id)){
				unset($objets_parents[$objet][$k]);
			}
		}
	}
	objet_associer(array('document'=>$id_document),$objets_parents);

}


// obsoletes
function insert_document() {
	return document_inserer();
}
function document_set($id_document, $set=false) {
	return document_modifier($id_document, $set);
}
function instituer_document($id_document,$champs=array()){
	return document_instituer($id_document,$champs);
}
function revision_document($id_document, $c=false) {
	return document_modifier($id_document,$c);
}

?>
tourner.php000066600000010666152522474270007002 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 * Tourner un document
 *
 * http://code.spip.net/@action_tourner_dist
 *
 * lorsque les arguments sont passes dans arg en GET :
 * id_document-angle
 *
 * @param int $id_document
 * @param int $angle
 *   angle de rotation en degre>0
 * @return void
 */
function action_tourner_dist($id_document=null, $angle=null) {
	if (is_null($id_document) OR is_null($angle)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();

		if (!preg_match(",^\W*(\d+)\W?(-?\d+)$,", $arg, $r)) {
			spip_log("action_tourner_dist $arg pas compris");
		}
		else{
			array_shift($r);
			list($id_document,$angle) = $r;
		}

	}
	if ($id_document AND autoriser('modifier','document',$id_document))
		action_tourner_post($id_document,$angle);
}

/**
 * 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;

	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' // le document n'est plus distant apres une transformation
			);
		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']),
					'serveur' => $serveur,
					'action'=>'tourner',
				),
				'data' => $set
			)
		);
	}

}

// Appliquer l'EXIF orientation
// cf. http://trac.rezo.net/trac/spip/ticket/1494
// http://code.spip.net/@tourner_selon_exif_orientation
function tourner_selon_exif_orientation($id_document, $fichier) {

	if (function_exists('exif_read_data')
	AND $exif = exif_read_data($fichier)
	AND (
		$ort = $exif['IFD0']['Orientation']
		OR $ort = $exif['Orientation'])
	) {
	spip_log("rotation: $ort");
		$rot = null;
		switch ($ort) {
			case 3:
				$rot = 180;
			case 6:
				$rot = 90;
			case 8:
				$rot = -90;
		}
		if ($rot)
			action_tourner_post(array(null,$id_document, $rot));
	}
}

?>
porte_plume_previsu.php000066600000003313152522551750011402 0ustar00<?php
/**
 * Gestion de l'action porte_plume_previsu
 * 
 * @plugin Porte Plume pour SPIP
 * @license GPL
 * @package SPIP\PortePlume\Actions
 */

if (!defined("_ECRIRE_INC_VERSION")) return;

/**
 * Action affichant la prévisualisation de porte plume
 *
 * Pas besoin de sécuriser outre mesure ici, on ne réalise donc qu'un
 * recuperer_fond
 *
 * On passe par cette action pour éviter les redirection et la perte du $_POST de
 * $forcer_lang=true;
 * cf : ecrire/public.php ligne 80
 */
function action_porte_plume_previsu_dist() {

	// $_POST a ete sanitise par SPIP
	// et le fond injecte des interdire_scripts pour empecher les injections PHP
	// le js est bloque ou non selon les reglages de SPIP et si on est ou non dans l'espace prive
	$contexte = $_POST;

	// mais il faut avoir le droit de previsualiser
	// (par defaut le droit d'aller dans ecrire/)
	if (!autoriser('previsualiser','porteplume'))
		$contexte = array();

	header('Content-type: text/html; charset='.pp_charset());
	echo recuperer_fond('prive/porte_plume_preview', $contexte);
}

/**
 * Retourner le charset SQL
 *
 * Retourne le charset SQL si on le connait, en priorité
 * sinon, on utilise le charset de l'affichage HTML.
 * 
 * Cependant, on peut forcer un charset donné avec une constante :
 * define('PORTE_PLUME_PREVIEW_CHARSET','utf-8');
 *
 * @return string Nom du charset (ex: 'utf-8')
 */
function pp_charset() {
	if (defined('PORTE_PLUME_PREVIEW_CHARSET')) {
		return PORTE_PLUME_PREVIEW_CHARSET;
	}

	$charset = $GLOBALS['meta']['charset'];
	$charset_sql = isset($GLOBALS['charset_sql_base']) ? $GLOBALS['charset_sql_base'] : '';
	if ($charset_sql == 'utf8') {
		$charset_sql = 'utf-8';
	}
	return $charset_sql ? $charset_sql : $charset;
}

?>
relancer_signature.php000066600000003254152522552710011147 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

function action_relancer_signature_dist($id_signature=null){
	if (!$id_signature){
		$securiser_action = charger_fonction('securiser_action','inc');
		$id_signature = $securiser_action();
	}

	if (autoriser('relancer','signature',$id_signature)){
		$row = sql_fetsel('*', 'spip_signatures', 'id_signature='.intval($id_signature));
		$id_article = sql_getfetsel('id_article','spip_petitions','id_petition='.intval($row['id_petition']));
		if ($id_article=intval($id_article)
		  AND autoriser('mordererpetition','article',$id_article)) {
			include_spip('action/editer_signature');
			include_spip('formulaires/signature');
			$url = generer_url_entite_absolue($id_article, 'article','','',true);
			if (signature_a_confirmer($id_article, $url, $row['nom_email'], $row['ad_email'], $row['nom_site'], $row['url_site'], $row['message'], $row['lang'], $row['statut']))
				signature_modifier($id_signature, array("date_time" => date('Y-m-d H:i:s')));
		}
	}
}

?>valider_signature.php000066600000002125152522552710010776 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

function action_valider_signature_dist($id_signature=null){
	if (!$id_signature){
		$securiser_action = charger_fonction('securiser_action','inc');
		$id_signature = $securiser_action();
	}

	if (autoriser('publier','signature',$id_signature)){
		include_spip('action/editer_signature');
		signature_modifier($id_signature, array('statut'=>'publie'));
	}
}

?>traiter_lot_signature.php000066600000003643152522552710011706 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

function action_traiter_lot_signature_dist($arg=null) {

	if (is_null($arg)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}

	/**
	 * $arg contient l'action relancer/supprimer/valider
	 * les id sont dans un tableau non signe ids[]
	 */
	if (preg_match(",^(\w+)$,",$arg,$match)
	 AND in_array($statut=$match[1],array('relancer','supprimer','valider'))
	 AND autoriser('modererlot','petition')){
		$where = '';
		if (intval($id_petition = _request('id_petition'))){
			$where="id_petition=".intval($id_petition);
			// pour relancer ou valider on ne prend que celles en attente
			if (in_array($statut,array('relancer','valider')))
				$where.=" AND statut!='publie' AND statut!='poubelle'";
		}
		else {
			$ids=_request('ids');
			if (is_array($ids)) {
				$ids = array_map('intval',$ids);
				$where = sql_in('id_signature',$ids);
			}
		}

		if ($where){
			$rows = sql_allfetsel("id_signature", "spip_signatures", $where);
			if (!count($rows)) return;
			$rows = array_map('reset',$rows);
			if ($action = charger_fonction($statut."_signature",'action',true))
				foreach ($rows as $id_signature) {
					$action($id_signature);
				}
		}
	}
}

?>
editer_signature.php000066600000014415152522552710010631 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

// http://code.spip.net/@action_editer_signature_dist
function action_editer_signature_dist($arg=null) {

	if (is_null($arg)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}

	// si id_signature n'est pas un nombre, c'est une creation
	// mais on verifie qu'on a toutes les donnees qu'il faut.
	if (!$id_signature = intval($arg)) {
		$id_petition = _request('id_petition');
		if (!($id_petition))
			return array(0,'');
		$id_signature = signature_inserer($id_petition);
	}

	// Enregistre l'envoi dans la BD
	if ($id_signature > 0)
		$err = signature_modifier($id_signature);

	return array($id_signature,$err);
}

/**
 * Mettre a jour une signature existante
 * 
 * @param int $id_signature
 * @param array $set
 * @return string
 */
function signature_modifier($id_signature, $set=null) {
	$err = '';

	include_spip('inc/modifier');
	$c = collecter_requests(
		// white list
		array(
		 "nom_email","ad_email",
		 "nom_site","url_site","message","statut"
		),
		// black list
		array('statut','id_petition','date_time'),
		// donnees eventuellement fournies
		$set
	);

	if ($err = objet_modifier_champs('signature', $id_signature,
		array(
			'nonvide' => array('nom_email' => _T('info_sans_titre'))
		),
		$c))
		return $err;

	// Modification de statut
	$c = collecter_requests(array('statut','id_petition','date_time'),array(),$set);
	$err .= signature_instituer($id_signature, $c);

	return $err;
}

/**
 * Inserer une signature en base
 * @param int $id_petition
 * @return int
 */
function signature_inserer($id_petition) {

	// Si $id_petition vaut 0 ou n'est pas definie, echouer
	if (!$id_petition = intval($id_petition))
		return 0;

	$champs = array(
		'id_petition' => $id_petition,
		'statut' =>  'prepa',
		'date_time' => date('Y-m-d H:i:s'));

	// Envoyer aux plugins
	$champs = pipeline('pre_insertion',
		array(
			'args' => array(
				'table' => 'spip_signatures',
			),
			'data' => $champs
		)
	);

	$id_signature = sql_insertq("spip_signatures", $champs);

	pipeline('post_insertion',
		array(
			'args' => array(
				'table' => 'spip_signatures',
				'id_objet' => $id_signature
			),
			'data' => $champs
		)
	);

	return $id_signature;
}


// $c est un array ('statut', 'id_petition' = changement de petition)
// il n'est pas autoriser de deplacer une signature
// http://code.spip.net/@signature_instituer
function signature_instituer($id_signature, $c, $calcul_rub=true) {

	include_spip('inc/autoriser');
	include_spip('inc/modifier');

	$row = sql_fetsel("S.statut, S.date_time, P.id_article", "spip_signatures AS S JOIN spip_petitions AS P ON S.id_petition=P.id_petition", "S.id_signature=".intval($id_signature));
	$statut_ancien = $statut = $row['statut'];
	$date_ancienne = $date = $row['date_time'];
	$champs = array();

	$d = isset($c['date_time'])?$c['date_time']:null;
	$s = isset($c['statut'])?$c['statut']:$statut;

	// cf autorisations dans inc/signature_instituer
	if ($s != $statut OR ($d AND $d != $date)) {
		$statut = $champs['statut'] = $s;

		// En cas de publication, fixer la date a "maintenant"
		// sauf si $c commande autre chose
		// ou si l'signature est deja date dans le futur
		// En cas de proposition d'un signature (mais pas depublication), idem
		if ($champs['statut'] == 'publie') {
			if ($d)
				$champs['date_time'] = $date = $d;
			else
				$champs['date_time'] = $date = date('Y-m-d H:i:s');
		}
		// on peut redater une signature qu'on relance
		elseif($d)
			$champs['date_time'] = $date = $d;
	}

	// Envoyer aux plugins
	$champs = pipeline('pre_edition',
		array(
			'args' => array(
				'table' => 'spip_signatures',
				'id_objet' => $id_signature,
				'action'=>'instituer',
				'statut_ancien' => $statut_ancien,
			),
			'data' => $champs
		)
	);

	if (!count($champs)) return;

	// Envoyer les modifs.
	sql_updateq('spip_signatures',$champs,'id_signature='.intval($id_signature));

	// Invalider les caches
	include_spip('inc/invalideur');
	suivre_invalideur("id='signature/$id_signature'");
	suivre_invalideur("id='article/".$row['id_article']."'");

	// Pipeline
	pipeline('post_edition',
		array(
			'args' => array(
				'table' => 'spip_signatures',
				'id_objet' => $id_signature,
				'action'=>'instituer',
				'statut_ancien' => $statut_ancien,
			),
			'data' => $champs
		)
	);

	// Notifications
	if ($notifications = charger_fonction('notifications', 'inc')) {
		$notifications('instituersignature', $id_signature,
			array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date'=>$date)
		);
	}

	return ''; // pas d'erreur
}


/**
 * Pour eviter le recours a un verrou (qui bloque l'acces a la base),
 * on commence par inserer systematiquement la signature
 * puis on demande toutes celles ayant la propriete devant etre unique
 * (mail ou site). S'il y en a plus qu'une on les retire sauf la premiere
 * En cas d'acces concurrents il y aura des requetes de retraits d'elements
 * deja detruits. Bizarre ?  C'est mieux que de bloquer!
 *
 * http://code.spip.net/@signature_entrop
 *
 * @param string $where
 * @return array
 */
function signature_entrop($where)
{
	$entrop = array();
	$where .= " AND statut='publie'";
	$res = sql_select('id_signature', 'spip_signatures', $where,'',"date_time desc");
	$n = sql_count($res);
	if ($n>1) {
		while($r=sql_fetch($res))
			$entrop[]=$r['id_signature'];
		// garder la premiere signature
		array_shift($entrop);
	}
	sql_free($res);

	if (count($entrop)){
		sql_delete('spip_signatures', sql_in('id_signature', $entrop));
	}

	return $entrop;
}

// obsolete
function revision_signature($id_signature, $c=false) {
	return signature_modifier($id_signature,$c);
}

?>
editer_petition.php000066600000011663152522552710010465 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

function action_editer_petition_dist($arg=null) {

	if (is_null($arg)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}

	// si id_petition n'est pas un nombre, c'est une creation
	// mais on verifie qu'on a toutes les donnees qu'il faut.
	if (!$id_petition = intval($arg)) {
		$id_article = _request('id_article');
		if (!($id_article)) {
			include_spip('inc/headers');
			redirige_url_ecrire();
		}
		$id_petition = petition_inserer($id_article);
	}

	// Enregistre l'envoi dans la BD
	if ($id_petition > 0)
		$err = petition_modifier($id_petition);

	return array($id_petition,$err);
}

/**
 * Mettre a jour une petition existante
 * 
 * @param int $id_petition
 * @param array $set
 * @return string
 */
function petition_modifier($id_petition, $set=null) {
	$err = '';

	include_spip('inc/modifier');
	$c = collecter_requests(
		// white list
		array(
		  "email_unique","site_obli",
		  "site_unique","message","texte"
		),
		// black list
		array('statut','id_article'),
		// donnees eventuellement fournies
		$set
	);

	if ($err = objet_modifier_champs('petition', $id_petition,array(),$c))
		return $err;

	// changement d'article ou de statut ?
	$c = collecter_requests(array('statut','id_article'),array(),$set);
	$err .= petition_instituer($id_petition, $c);

	return $err;
}

/**
 * Inserer une petition en base
 * @param <type> $id_article
 * @return <type> 
 */
function petition_inserer($id_article) {

	// Si id_article vaut 0 ou n'est pas definie, echouer
	if (!$id_article = intval($id_article))
		return 0;

	$champs = array(
		'id_article' => $id_article,
	);

	// Envoyer aux plugins
	$champs = pipeline('pre_insertion',
		array(
			'args' => array(
				'table' => 'spip_petitions',
			),
			'data' => $champs
		)
	);

	$id_petition = sql_insertq("spip_petitions", $champs);

	pipeline('post_insertion',
		array(
			'args' => array(
				'table' => 'spip_petitions',
				'id_objet' => $id_petition
			),
			'data' => $champs
		)
	);

	return $id_petition;
}


/**
 * $c est un array ('id_article' = changement d'article)
 * il n'est pas autoriser de deplacer une petition
 *
 * @param  $id_petition
 * @param  $c
 * @param bool $calcul_rub
 * @return string
 */
function petition_instituer($id_petition, $c) {

	include_spip('inc/autoriser');
	include_spip('inc/modifier');

	$row = sql_fetsel("id_article", "spip_petitions", "id_petition=".intval($id_petition));
	$statut_ancien = $statut = $row['statut'];
	#$date_ancienne = $date = $row['date_time'];
	$champs = array();

	$s = isset($c['statut'])?$c['statut']:$statut;

	// cf autorisations dans inc/petition_instituer
	if ($s != $statut /*OR ($d AND $d != $date)*/) {
		$statut = $champs['statut'] = $s;

		// En cas de publication, fixer la date a "maintenant"
		// sauf si $c commande autre chose
		// ou si l'petition est deja date dans le futur
		// En cas de proposition d'un petition (mais pas depublication), idem
		/*
		if ($champs['statut'] == 'publie') {
			if ($d)
				$champs['date_time'] = $date = $d;
			else
				$champs['date_time'] = $date = date('Y-m-d H:i:s');
		}*/
	}

	// Envoyer aux plugins
	$champs = pipeline('pre_edition',
		array(
			'args' => array(
				'table' => 'spip_petitions',
				'id_objet' => $id_petition,
				'action'=>'instituer',
				'statut_ancien' => $statut_ancien,
			),
			'data' => $champs
		)
	);

	if (!count($champs)) return;

	// Envoyer les modifs.
	sql_updateq('spip_petitions',$champs,'id_petition='.intval($id_petition));

	// Invalider les caches
	include_spip('inc/invalideur');
	suivre_invalideur("id='petition/$id_petition'");
	suivre_invalideur("id='article/".$row['id_article']."'");

	// Pipeline
	pipeline('post_edition',
		array(
			'args' => array(
				'table' => 'spip_petitions',
				'id_objet' => $id_petition,
				'action'=>'instituer',
				'statut_ancien' => $statut_ancien,
			),
			'data' => $champs
		)
	);

	// Notifications
	if ($notifications = charger_fonction('notifications', 'inc')) {
		$notifications('instituerpetition', $id_petition,
			array('statut' => $statut, 'statut_ancien' => $statut_ancien)
		);
	}

	return ''; // pas d'erreur
}

// http://code.spip.net/@revision_petition
function revision_petition($id_petition, $c=null) {
	return petition_modifier($id_petition,$c);
}


?>confirmer_signature.php000066600000010343152522552710011335 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;



/**
 * Confirmer une signature
 * Retour a l'ecran du lien de confirmation d'une signature de petition.
 * var_confirm contient le hash de la signature.
 * Au premier appel on traite et on publie
 * Au second appel on retourne le resultat a afficher
 *
 * @staticvar string $confirm
 * @param <type> $var_confirm
 * @return string 
 */
function action_confirmer_signature_dist($var_confirm=null) {
	static $confirm = null;

	// reponse mise en cache dans la session ?
	$code_message = 'signature_message_'.strval($var_confirm);
	if (isset($GLOBALS['visiteur_session'][$code_message]))
		return $GLOBALS['visiteur_session'][$code_message];

	// reponse deja calculee depuis public/assembler.php
	if (isset($confirm))
		return $confirm;

	if (is_null($var_confirm)) {
		$securiser_action = charger_fonction('securiser_action','inc');
		$var_confirm = $securiser_action();
	}

	if (!$var_confirm OR $var_confirm == 'publie' OR $var_confirm == 'poubelle')
		return '';

	if (!spip_connect()) {
		$confirm = _T('petitions:form_pet_probleme_technique');
		return '';
	}
	include_spip('inc/texte');
	include_spip('inc/filtres');

	// Suppression d'une signature par un moderateur ?
	// Cf. plugin notifications
	if (isset($_GET['refus'])) {
		// verifier validite de la cle de suppression
		// l'id_signature est dans var_confirm
		include_spip('inc/securiser_action');
		if ($id_signature = intval($var_confirm)
		    AND (
			$_GET['refus'] == _action_auteur("supprimer signature $id_signature", '', '', 'alea_ephemere')
				OR
			$_GET['refus'] == _action_auteur("supprimer signature $id_signature", '', '', 'alea_ephemere_ancien')
			)) {
			include_spip('action/editer_signature');
			signature_modifier($id_signature,array("statut" => 'poubelle'));
			$confirm = _T('petitions:info_signature_supprimee');
		} else $confirm = _T('petitions:info_signature_supprimee_erreur');
		return '';
	}

	$row = sql_fetsel('*', 'spip_signatures', "statut=" . sql_quote($var_confirm), '', "1");

	if (!$row) {
		$confirm = _T('petitions:form_pet_aucune_signature');
		return '';
	}

	$id_signature = $row['id_signature'];
	$id_petition = $row['id_petition'];
	$adresse_email = $row['ad_email'];
	$url_site = $row['url_site'];

	$row = sql_fetsel('email_unique, site_unique, id_article', 'spip_petitions', "id_petition=".intval($id_petition));

	$email_unique = $row['email_unique']  == "oui";
	$site_unique = $row['site_unique']  == "oui";
	$id_article = $row['id_article'];

	include_spip('action/editer_signature');
	signature_modifier($id_signature,array('statut' => 'publie'));

	if ($email_unique) {
		$r = "id_petition=".intval($id_petition)." AND ad_email=" . sql_quote($adresse_email);
		if (signature_entrop($r))
			  $confirm =  _T('petitions:form_pet_deja_signe');
	}

	if ($site_unique) {
		$r = "id_petition=".intval($id_petition)." AND url_site=" . sql_quote($url_site);
		if (signature_entrop($r))
			$confirm = _T('petitions:form_pet_site_deja_enregistre');
	}

	include_spip('inc/session');

	if (!$confirm) {
		$confirm = _T('petitions:form_pet_signature_validee');

		// noter dans la session que l'email est valide
		// de facon a permettre de signer les prochaines
		// petitions sans refaire un tour d'email
		session_set('email_confirme', $adresse_email);

		// invalider les pages ayant des boucles signatures
		include_spip('inc/invalideur');
		suivre_invalideur("id='signature/$id_signature'");
		suivre_invalideur("id='article/$id_article'");
	}

	// Conserver la reponse dans la session du visiteur
	if ($confirm)
		session_set($code_message, $confirm);
}

?>supprimer_signature.php000066600000002523152522552710011400 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

function action_supprimer_signature_dist($id_signature=null){
	if (!$id_signature){
		$securiser_action = charger_fonction('securiser_action','inc');
		$id_signature = $securiser_action();
	}

	if (autoriser('supprimer','signature',$id_signature)){
		$id_article = sql_getfetsel('P.id_article','spip_signatures AS S JOIN spip_petitions AS P ON S.id_petition=P.id_petition','S.id_signature='.intval($id_signature));
		if ($id_article AND autoriser('modererpetition','article',$id_article)) {
			include_spip('action/editer_signature');
			signature_modifier($id_signature, array('statut'=>'poubelle'));
		}
	}
}

?>editer_rubrique.php000066600000022737152525474530010502 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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.   *
\***************************************************************************/

/**
 * Fonctions de modifications des rubriques
 *
 * @package SPIP\Rubriques\Modifications
 */
if (!defined('_ECRIRE_INC_VERSION')) return;

include_spip('inc/rubriques');

/**
 * Action d'édition d'une rubrique
 *
 * Crée la rubrique si elle n'existe pas encore
 * Redirige après l'action sur _request('redirect') si présent
 *
 * @param null|int $arg
 *     - null : vérifie la sécurité de l'action.
 *              Si ok, obtient l'identifiant de rubrique à éditer
 *              (oui 'oui' pour une nouvelle rubrique)
 *     - int  : identifiant de rubrique dont on demande l'édition
 * @return array
 *     Liste : identifiant de la rubrique, message d'erreur éventuel.
 *
 */
function action_editer_rubrique_dist($arg=null) {

	if (is_null($arg)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}

	if (!$id_rubrique = intval($arg)) {
		if ($arg != 'oui') {
			include_spip('inc/headers');
			redirige_url_ecrire();
		}
		$id_rubrique = rubrique_inserer(_request('id_parent'));
	}

	$err = rubrique_modifier($id_rubrique);

	if (_request('redirect')) {
		$redirect = parametre_url(
			urldecode(_request('redirect')),
			'id_rubrique', $id_rubrique, '&');
	
		include_spip('inc/headers');
		redirige_par_entete($redirect);
	}

	return array($id_rubrique,$err);
}


/**
 * Insérer une rubrique en base
 *
 * @param int $id_parent
 *     Identifiant de la rubrique parente.
 *     0 pour la racine.
 * @return int
 *     Identifiant de la rubrique crée
 */
function rubrique_inserer($id_parent) {
	$champs = array(
		'titre' => _T('item_nouvelle_rubrique'),
		'id_parent' => intval($id_parent),
		'statut' => 'new');
	
	// Envoyer aux plugins
	$champs = pipeline('pre_insertion',
		array(
			'args' => array(
				'table' => 'spip_rubriques',
			),
			'data' => $champs
		)
	);
	
	$id_rubrique = sql_insertq("spip_rubriques", $champs);
	pipeline('post_insertion',
		array(
			'args' => array(
				'table' => 'spip_rubriques',
				'id_objet' => $id_rubrique
			),
			'data' => $champs
		)
	);
	propager_les_secteurs();
	calculer_langues_rubriques();
	return $id_rubrique;
}

/**
 * Modifier une rubrique en base
 * 
 * @param int $id_rubrique
 *     Identifiant de la rubrique modifiée
 * @param array|null $set
 *     Tableau qu'on peut proposer en lieu et place de _request()
 * @return bool|string
 *     - false  : Aucune modification, aucun champ n'est à modifier
 *     - chaîne vide : Vide si tout s'est bien passé
 *     - chaîne : Texte d'un message d'erreur
 */
function rubrique_modifier($id_rubrique, $set=null) {
	include_spip('inc/autoriser');
	include_spip('inc/filtres');

	include_spip('inc/modifier');
	$c = collecter_requests(
		// white list
		objet_info('rubrique','champs_editables'),
		// black list
		array('id_parent', 'confirme_deplace'),
		// donnees eventuellement fournies
		$set
	);

	if ($err = objet_modifier_champs('rubrique', $id_rubrique,
		array(
			'data' => $set,
			'nonvide' => array('titre' => _T('titre_nouvelle_rubrique')." "._T('info_numero_abbreviation').$id_rubrique)
		),
		$c))
		return $err;

	$c = collecter_requests(array('id_parent', 'confirme_deplace'),array(),$set);
	// Deplacer la rubrique
	if (isset($c['id_parent'])) {
		$err = rubrique_instituer($id_rubrique, $c);
	}

	// invalider les caches marques de cette rubrique
	include_spip('inc/invalideur');
	suivre_invalideur("id='rubrique/$id_rubrique'");
	// et celui de menu_rubriques 
	effacer_meta("date_calcul_rubriques");
	return $err;
}

/**
 * Déplace les brèves d'une rubrique dans le secteur d'un nouveau parent
 * 
 * Si c'est une rubrique-secteur contenant des brèves, on ne deplace
 * que si $confirme_deplace == 'oui', et change alors l'id_rubrique des
 * brèves en question
 * 
 * @todo À déporter dans le plugin brèves via un pipeline ?
 *
 * @param int $id_rubrique
 *     Identifiant de la rubrique déplacée
 * @param int $id_parent
 *     Identifiant du nouveau parent de la rubrique
 * @param array $c
 *     Informations pour l'institution (id_rubrique, confirme_deplace)
 * @return bool
 *     true si le déplacement est fait ou s'il n'y a rien à faire
 *     false si la confirmation du déplacement n'est pas présente
 */
function editer_rubrique_breves($id_rubrique, $id_parent, $c=array())
{
	if (!sql_countsel('spip_breves', "id_rubrique=$id_rubrique"))
		return true;

	if ($c['confirme_deplace'] != 'oui')
		return false;

	if ($id_secteur = sql_getfetsel("id_secteur",
	"spip_rubriques", "id_rubrique=$id_parent"))
		sql_updateq("spip_breves", array("id_rubrique" => $id_secteur), "id_rubrique=$id_rubrique");

	return true;
}


/**
 * Instituer une rubrique (changer son parent)
 * 
 * Change le parent d'une rubrique, si les autorisations sont correctes,
 * mais n'accèpte pas de déplacer une rubrique dans une de ses filles, tout de même !
 *
 * Recalcule les secteurs, les langues et déplace les brèves au passage.
 * 
 * @param int $id_rubrique
 *     Identifiant de la rubrique à instituer
 * @param array $c
 *     Informations pour l'institution (id_rubrique, confirme_deplace)
 * @return string
 *     Chaine vide : aucune erreur
 *     Chaîne : Texte du message d'erreur
 */
function rubrique_instituer($id_rubrique, $c) {
	// traitement de la rubrique parente
	// interdiction de deplacer vers ou a partir d'une rubrique
	// qu'on n'administre pas.

	if (NULL !== ($id_parent = $c['id_parent'])) {
		$id_parent = intval($id_parent);
		$filles = calcul_branche_in($id_rubrique);
		if (strpos(",$id_parent,", ",$filles,") !== false)
			spip_log("La rubrique $id_rubrique ne peut etre fille de sa descendante $id_parent");
		else {
			$s = sql_fetsel("id_parent, statut", "spip_rubriques", "id_rubrique=$id_rubrique");
			$old_parent = $s['id_parent'];

			if (!($id_parent != $old_parent
			AND autoriser('publierdans', 'rubrique', $id_parent)
			AND autoriser('creerrubriquedans', 'rubrique', $id_parent)
			AND autoriser('publierdans', 'rubrique', $old_parent)
			      )) {
				if ($s['statut'] != 'new') {
					spip_log("deplacement de $id_rubrique vers $id_parent refuse a " . $GLOBALS['visiteur_session']['id_auteur'] . ' '.  $GLOBALS['visiteur_session']['statut']);
				}
			}
			elseif (editer_rubrique_breves($id_rubrique, $id_parent, $c)) {

				$champs = array('id_parent' => $id_parent);
				$statut_ancien = $s['statut'];

				// Envoyer aux plugins
				$champs = pipeline('pre_edition',
					array(
						'args' => array(
							'table' => 'spip_rubriques',
							'id_objet' => $id_rubrique,
							'action'=>'instituer',
							'statut_ancien' => $statut_ancien,
						),
						'data' => $champs
					)
				);

				if (!count($champs)) return '';

				sql_updateq('spip_rubriques', $champs, "id_rubrique=$id_rubrique");

				propager_les_secteurs();

				// Deplacement d'une rubrique publiee ==> chgt general de leur statut
				if ($statut_ancien == 'publie')
					calculer_rubriques_if($old_parent, array('id_rubrique' => $id_parent), $statut_ancien);
				// Creation ou deplacement d'une rubrique non publiee
				// invalider le cache de leur menu
				elseif (!$statut_ancien || $old_parent!=$id_parent)
					effacer_meta("date_calcul_rubriques");

				calculer_langues_rubriques();

				// Pipeline
				pipeline('post_edition',
					array(
						'args' => array(
							'table' => 'spip_rubriques',
							'id_objet' => $id_rubrique,
							'action'=>'instituer',
							'statut_ancien' => $statut_ancien,
						),
						'data' => $champs
					)
				);
			}
		}
	}
	return ''; // pas d'erreur
}

/**
 * Crée une rubrique 
 *
 * @deprecated
 *     Utiliser rubrique_inserer()
 * @see rubrique_inserer()
 * 
 * @param int $id_parent
 *     Identifiant de la rubrique parente.
 *     0 pour la racine.
 * @return int
 *     Identifiant de la rubrique crée
**/
function insert_rubrique($id_parent) {
	return rubrique_inserer($id_parent);
}


/**
 * Modifie les contenus d'une rubrique 
 *
 * @deprecated
 *     Utiliser rubrique_modifier()
 * @see rubrique_modifier()
 *
 * @param int $id_rubrique
 *     Identifiant de la rubrique à instituer
 * @param array|null $set
 *     Tableau qu'on peut proposer en lieu et place de _request()
 * @return bool|string
 *     - false  : Aucune modification, aucun champ n'est à modifier
 *     - chaîne vide : Vide si tout s'est bien passé
 *     - chaîne : Texte d'un message d'erreur
**/
function revisions_rubriques($id_rubrique, $set=null) {
	return rubrique_modifier($id_rubrique,$set);
}

/**
 * Institue une rubrique (change son parent)
 *
 * @deprecated
 *     Utiliser rubrique_instituer()
 * @see rubrique_instituer()
 * 
 * @param int $id_rubrique
 *     Identifiant de la rubrique à instituer
 * @param array $c
 *     Informations pour l'institution (id_rubrique, confirme_deplace)
 * @return string
 *     Chaine vide : aucune erreur
 *     Chaîne : Texte du message d'erreur
**/
function instituer_rubrique($id_rubrique, $c) {
	return rubrique_instituer($id_rubrique, $c);
}
desinstaller_plugin.php000066600000003247152525474530011352 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

// http://doc.spip.org/@action_desinstaller_plugin_dist
function action_desinstaller_plugin_dist() {

	$securiser_action = charger_fonction('securiser_action', 'inc');
	$arg = $securiser_action();
	list($dir_plugins,$plugin) = explode("::",$arg);
	$dir_type = "_DIR_PLUGINS";
	if (defined('_DIR_PLUGINS_SUPPL') AND $dir_plugins==_DIR_PLUGINS_SUPPL)
		$dir_type = "_DIR_PLUGINS_SUPPL";
	$installer_plugins = charger_fonction('installer', 'plugins');
	$infos = $installer_plugins($plugin, 'uninstall',$dir_type);
	if ($infos AND !$infos['install_test'][0]) {
		include_spip('inc/plugin');
		ecrire_plugin_actifs(array($plugin),false,'enleve');
		$erreur = '';
	} else 	$erreur = 'erreur_plugin_desinstalation_echouee';
	if ($redirect = _request('redirect')){
		include_spip('inc/headers');
		if ($erreur)
			$redirect = parametre_url($redirect, 'erreur',$erreur);
		$redirect = str_replace('&amp;','&',$redirect);
		redirige_par_entete($redirect);
	}
}
?>
editer_article.php000066600000025310152525474530010255 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

// http://doc.spip.org/@action_editer_article_dist
function action_editer_article_dist($arg=null) {
	include_spip('inc/autoriser');
	$err="";
	if (is_null($arg)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}

	// si id_article n'est pas un nombre, c'est une creation 
	// mais on verifie qu'on a toutes les donnees qu'il faut.
	if (!$id_article = intval($arg)) {
		$id_parent = _request('id_parent');
		if (!$id_parent)
			$err = _L("creation interdite d'un article sans rubrique");
		elseif(!autoriser('creerarticledans','rubrique',$id_parent))
			$err = _T("info_creerdansrubrique_non_autorise");
		else
			$id_article = article_inserer($id_parent);
	}

	// Enregistre l'envoi dans la BD
	if ($id_article > 0) $err = article_modifier($id_article);

	if ($err)
		spip_log("echec editeur article: $err",_LOG_ERREUR);

	return array($id_article,$err);
}

/**
 * Appelle toutes les fonctions de modification d'un article
 * $err est de la forme chaine de langue ou vide si pas d'erreur
 * http://doc.spip.org/@articles_set
 *
 * @param  $id_article
 * @param null $set
 * @return string
 */
function article_modifier($id_article, $set=null) {

	// unifier $texte en cas de texte trop long
	trop_longs_articles();

	include_spip('inc/modifier');
	include_spip('inc/filtres');
	$c = collecter_requests(
		// white list
		objet_info('article','champs_editables'),
		// black list
		array('date','statut','id_parent'),
		// donnees eventuellement fournies
		$set
	);

	// Si l'article est publie, invalider les caches et demander sa reindexation
	$t = sql_getfetsel("statut", "spip_articles", "id_article=".intval($id_article));
	$invalideur = $indexation = false;
	if ($t == 'publie') {
		$invalideur = "id='article/$id_article'";
		$indexation = true;
	}

	if ($err = objet_modifier_champs('article', $id_article,
		array(
			'data' => $set,
			'nonvide' => array('titre' => _T('info_nouvel_article')." "._T('info_numero_abbreviation').$id_article),
			'invalideur' => $invalideur,
			'indexation' => $indexation,
			'date_modif' => 'date_modif' // champ a mettre a date('Y-m-d H:i:s') s'il y a modif
		),
		$c))
		return $err;

	// Modification de statut, changement de rubrique ?
	$c = collecter_requests(array('date', 'statut', 'id_parent'),array(),$set);
	$err = article_instituer($id_article, $c);

	return $err;
}

/**
 * Inserer un nouvel article en base
 * http://doc.spip.org/@insert_article
 *
 * @param int $id_rubrique
 * @return int
 */
function article_inserer($id_rubrique) {


	// Si id_rubrique vaut 0 ou n'est pas definie, creer l'article
	// dans la premiere rubrique racine
	if (!$id_rubrique = intval($id_rubrique)) {
		$row = sql_fetsel("id_rubrique, id_secteur, lang", "spip_rubriques", "id_parent=0",'', '0+titre,titre', "1");
		$id_rubrique = $row['id_rubrique'];
	} else $row = sql_fetsel("lang, id_secteur", "spip_rubriques", "id_rubrique=$id_rubrique");

	// eviter $id_secteur = NULL (erreur sqlite) si la requete precedente echoue 
	// cas de id_rubrique = -1 par exemple avec plugin "pages"
	$id_secteur = isset($row['id_secteur']) ? $row['id_secteur'] : 0;
	
	$lang_rub = $row['lang'];

	$lang = "";
	$choisie = 'non';
	// La langue a la creation : si les liens de traduction sont autorises
	// dans les rubriques, on essaie avec la langue de l'auteur,
	// ou a defaut celle de la rubrique
	// Sinon c'est la langue de la rubrique qui est choisie + heritee
	if (in_array('spip_articles',explode(',',$GLOBALS['meta']['multi_objets']))) {
		lang_select($GLOBALS['visiteur_session']['lang']);
		if (in_array($GLOBALS['spip_lang'],
		explode(',', $GLOBALS['meta']['langues_multilingue']))) {
			$lang = $GLOBALS['spip_lang'];
			$choisie = 'oui';
		}
	}

	if (!$lang) {
		$choisie = 'non';
		$lang = $lang_rub ? $lang_rub : $GLOBALS['meta']['langue_site'];
	}

	$champs = array(
		'id_rubrique' => $id_rubrique,
		'id_secteur' =>  $id_secteur,
		'statut' =>  'prepa',
		'date' => date('Y-m-d H:i:s'),
		'lang' => $lang,
		'langue_choisie' =>$choisie);

	// Envoyer aux plugins
	$champs = pipeline('pre_insertion',
		array(
			'args' => array(
				'table' => 'spip_articles',
			),
			'data' => $champs
		)
	);

	$id_article = sql_insertq("spip_articles", $champs);

	pipeline('post_insertion',
		array(
			'args' => array(
				'table' => 'spip_articles',
				'id_objet' => $id_article
			),
			'data' => $champs
		)
	);

	// controler si le serveur n'a pas renvoye une erreur
	if ($id_article > 0){
		$id_auteur = ((is_null(_request('id_auteur')) AND isset($GLOBALS['visiteur_session']['id_auteur']))?
			$GLOBALS['visiteur_session']['id_auteur']
			:_request('id_auteur'));
		if ($id_auteur){
			include_spip('action/editer_auteur');
			auteur_associer($id_auteur, array('article'=>$id_article));
		}
	}

	return $id_article;
}


// $c est un array ('statut', 'id_parent' = changement de rubrique)
//
// statut et rubrique sont lies, car un admin restreint peut deplacer
// un article publie vers une rubrique qu'il n'administre pas
// http://doc.spip.org/@instituer_article
function article_instituer($id_article, $c, $calcul_rub=true) {

	include_spip('inc/autoriser');
	include_spip('inc/rubriques');
	include_spip('inc/modifier');

	$row = sql_fetsel("statut, date, id_rubrique", "spip_articles", "id_article=$id_article");
	$id_rubrique = $row['id_rubrique'];
	$statut_ancien = $statut = $row['statut'];
	$date_ancienne = $date = $row['date'];
	$champs = array();

	$d = isset($c['date'])?$c['date']:null;
	$s = isset($c['statut'])?$c['statut']:$statut;

	// cf autorisations dans inc/instituer_article
	if ($s != $statut OR ($d AND $d != $date)) {
		if (autoriser('publierdans', 'rubrique', $id_rubrique))
			$statut = $champs['statut'] = $s;
		else if (autoriser('modifier', 'article', $id_article) AND $s != 'publie')
			$statut = $champs['statut'] = $s;
		else
			spip_log("editer_article $id_article refus " . join(' ', $c));

		// En cas de publication, fixer la date a "maintenant"
		// sauf si $c commande autre chose
		// ou si l'article est deja date dans le futur
		// En cas de proposition d'un article (mais pas depublication), idem
		if ($champs['statut'] == 'publie'
		 OR ($champs['statut'] == 'prop' AND ($d OR !in_array($statut_ancien, array('publie', 'prop'))))
		) {
			if ($d OR strtotime($d=$date)>time())
				$champs['date'] = $date = $d;
			else
				$champs['date'] = $date = date('Y-m-d H:i:s');
		}
	}

	// Verifier que la rubrique demandee existe et est differente
	// de la rubrique actuelle
	if ($id_parent = $c['id_parent']
	AND $id_parent != $id_rubrique
	AND (sql_fetsel('1', "spip_rubriques", "id_rubrique=$id_parent"))) {
		$champs['id_rubrique'] = $id_parent;

		// si l'article etait publie
		// et que le demandeur n'est pas admin de la rubrique de destination
		// repasser l'article en statut 'propose'.
		if ($statut == 'publie'
		AND !autoriser('publierdans', 'rubrique', $id_parent))
			$champs['statut'] = 'prop';
	}

	// Envoyer aux plugins
	$champs = pipeline('pre_edition',
		array(
			'args' => array(
				'table' => 'spip_articles',
				'id_objet' => $id_article,
				'action'=>'instituer',
				'statut_ancien' => $statut_ancien,
				'date_ancienne' => $date_ancienne,
			),
			'data' => $champs
		)
	);

	if (!count($champs)) return '';

	// Envoyer les modifs.

	editer_article_heritage($id_article, $id_rubrique, $statut_ancien, $champs, $calcul_rub);

	// Invalider les caches
	include_spip('inc/invalideur');
	suivre_invalideur("id='article/$id_article'");

	if ($date) {
		$t = strtotime($date);
		$p = @$GLOBALS['meta']['date_prochain_postdate'];
		if ($t > time() AND (!$p OR ($t < $p))) {
			ecrire_meta('date_prochain_postdate', $t);
		}
	}

	// Pipeline
	pipeline('post_edition',
		array(
			'args' => array(
				'table' => 'spip_articles',
				'id_objet' => $id_article,
				'action'=>'instituer',
				'statut_ancien' => $statut_ancien,
				'date_ancienne' => $date_ancienne,
			),
			'data' => $champs
		)
	);

	// Notifications
	if ($notifications = charger_fonction('notifications', 'inc')) {
		$notifications('instituerarticle', $id_article,
			array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date'=>$date, 'date_ancienne' => $date_ancienne)
		);
	}

	return ''; // pas d'erreur
}

// fabrique la requete de modification de l'article, avec champs herites

// http://doc.spip.org/@editer_article_heritage
function editer_article_heritage($id_article, $id_rubrique, $statut, $champs, $cond=true) {

	// Si on deplace l'article
	//  changer aussi son secteur et sa langue (si heritee)
	if (isset($champs['id_rubrique'])) {

		$row_rub = sql_fetsel("id_secteur, lang", "spip_rubriques", "id_rubrique=".sql_quote($champs['id_rubrique']));

		$langue = $row_rub['lang'];
		$champs['id_secteur'] = $row_rub['id_secteur'];
		if (sql_fetsel('1', 'spip_articles', "id_article=$id_article AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue))) {
			$champs['lang'] = $langue;
		}
	}

	if (!$champs) return;

	sql_updateq('spip_articles', $champs, "id_article=$id_article");

	// Changer le statut des rubriques concernees 

	if ($cond) {
		include_spip('inc/rubriques');
		$postdate = ($GLOBALS['meta']["post_dates"] == "non" AND isset($champs['date']) AND (strtotime($champs['date']) < time()))?$champs['date']:false;
		calculer_rubriques_if($id_rubrique, $champs, $statut, $postdate);
	}
}

//
// Reunit les textes decoupes parce que trop longs
//

// http://doc.spip.org/@trop_longs_articles
function trop_longs_articles() {
	if (is_array($plus = _request('texte_plus'))) {
		foreach ($plus as $n=>$t) {
			$plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,","", $t);
		}
		set_request('texte', join('',$plus) . _request('texte'));
	}
}


// obsoletes
function revisions_articles ($id_article, $c=false) {
	return article_modifier($id_article,$c);
}
function revision_article ($id_article, $c=false) {
	return article_modifier($id_article,$c);
}
function articles_set($id_article, $set=null) {
	return article_modifier($id_article,$set);
}
function insert_article($id_rubrique) {
	return article_inserer($id_rubrique);
}
function instituer_article($id_article, $c, $calcul_rub=true) {
	return article_instituer($id_article,$c,$calcul_rub);
}
?>
reorganiser.php000066600000006062152525474530007621 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

include_spip('inc/autoriser');

// http://doc.spip.org/@gerer_deplacements
function gerer_deplacements($deplacements){
	foreach(explode("\n",$deplacements) as $dep){
		$mouvement=explode(":",$dep);
		list($quoi,$id_quoi) = explode("-",$mouvement[0]);
		list($cible, $id_cible) =explode("-",$mouvement[1]);
		$f = 'reorganiser_' . $quoi . '_' . $cible;
		if (function_exists($f))
			$f(intval($id_quoi), intval($id_cible));
		else spip_log("reorganiser $dep: incompris");
	}
}

// http://doc.spip.org/@reorganiser_article_rubrique
function reorganiser_article_rubrique($id_article, $id_rubrique)
{
	if ($id_rubrique
	AND autoriser('modifier','rubrique',$id_rubrique)
	AND autoriser('modifier','article',$id_article)) {

		include_spip('action/editer_article');
		include_spip('inc/rubriques');
		$s = sql_fetsel("statut, id_rubrique", "spip_articles", "id_article=$id_article");
		editer_article_heritage($id_article,
					$s['id_rubrique'], 
					$s['statut'],
					array('id_rubrique' => $id_rubrique));
	}
}

// http://doc.spip.org/@reorganiser_rubrique_rubrique
function reorganiser_rubrique_rubrique($id_quoi, $id_cible)
{
	if (($id_quoi != $id_cible)
	AND autoriser('modifier','rubrique',$id_cible)
	AND autoriser('modifier','rubrique',$id_quoi)) {
		if (!$id_cible)
			$id_secteur = $id_quoi;
		else {
			$id_secteur = sql_getfetsel("id_secteur", "spip_rubriques", "id_rubrique=$id_cible");
		}

		$s = sql_fetsel("statut, id_parent, id_secteur", "spip_rubriques", "id_rubrique=".intval($id_quoi));

		sql_updateq('spip_rubriques', array('id_parent' => $id_cible, 'id_secteur'=>$id_secteur),  "id_rubrique=".intval($id_quoi));

		include_spip('inc/rubriques');
		// propager les secteurs si besoin
		if ($s['id_secteur']!=$id_secteur)
			propager_les_secteurs();
		// changer le statut de la rubrique source
		if ($s['statut'] == 'publie')
			calculer_rubriques_if($s['id_parent'],
					      array('id_rubrique' => $id_cible),
					      'publie');
	}
}

// http://doc.spip.org/@action_reorganiser_dist
function action_reorganiser_dist(){

	$securiser_action = charger_fonction('securiser_action', 'inc');
	$securiser_action();

	if (_request('deplacements')!==NULL)
		  gerer_deplacements(_request('deplacements'));

	$redirect = _request('redirect');
	if ($redirect==NULL) $redirect="";

	redirige_par_entete(str_replace("&amp;","&",urldecode($redirect)));
}


?>
tester.php000066600000011577152525474530006616 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

// Tester nos capacites
// http://doc.spip.org/@action_tester_dist
function action_tester_dist() {
	$arg = _request('arg');

	$gd_formats = $gd_formats_read_gif = "";
	// verifier les formats acceptes par GD
	if ($arg == "gd1") {
		// Si GD est installe et php >= 4.0.2
		if (function_exists('imagetypes')) {

			if (imagetypes() & IMG_GIF) {
				$gd_formats[] = "gif";
			} else {
				# Attention GD sait lire le gif mais pas forcement l'ecrire
				if (function_exists('ImageCreateFromGIF')) {
					$srcImage = @ImageCreateFromGIF(_ROOT_IMG_PACK."test.gif");
					if ($srcImage) {
						$gd_formats_read_gif = ",gif";
						ImageDestroy( $srcImage );
					}
				}
			}

			if (imagetypes() & IMG_JPG)
				$gd_formats[] = "jpg";
			if (imagetypes() & IMG_PNG)
				$gd_formats[] = "png";
		}

		else {	# ancienne methode de detection des formats, qui en plus
				# est bugguee car elle teste les formats en lecture
				# alors que la valeur deduite sert a identifier
				# les formats disponibles en ecriture... (cf. inc_logos)

			$gd_formats = Array();
			if (function_exists('ImageCreateFromJPEG')) {
				$srcImage = @ImageCreateFromJPEG(_ROOT_IMG_PACK."test.jpg");
				if ($srcImage) {
					$gd_formats[] = "jpg";
					ImageDestroy( $srcImage );
				}
			}
			if (function_exists('ImageCreateFromGIF')) {
				$srcImage = @ImageCreateFromGIF(_ROOT_IMG_PACK."test.gif");
				if ($srcImage) {
					$gd_formats[] = "gif";
					ImageDestroy( $srcImage );
				}
			}
			if (function_exists('ImageCreateFromPNG')) {
				$srcImage = @ImageCreateFromPNG(_ROOT_IMG_PACK."test.png");
				if ($srcImage) {
					$gd_formats[] = "png";
					ImageDestroy( $srcImage );
				}
			}
		}

		if ($gd_formats) $gd_formats = join(",", $gd_formats);
		ecrire_meta("gd_formats_read", $gd_formats.$gd_formats_read_gif);
		ecrire_meta("gd_formats", $gd_formats);
	}

	// verifier les formats netpbm
	else if ($arg == "netpbm") {
		define('_PNMSCALE_COMMAND', 'pnmscale'); // chemin a changer dans mes_options
		if (_PNMSCALE_COMMAND == '') return;
		$netpbm_formats= Array();

		$jpegtopnm_command = str_replace("pnmscale",
			"jpegtopnm", _PNMSCALE_COMMAND);
		$pnmtojpeg_command = str_replace("pnmscale",
			"pnmtojpeg", _PNMSCALE_COMMAND);

		$vignette = _ROOT_IMG_PACK."test.jpg";
		$dest = _DIR_VAR . "test-jpg.jpg";
		$commande = "$jpegtopnm_command $vignette | "._PNMSCALE_COMMAND." -width 10 | $pnmtojpeg_command > $dest";
		spip_log($commande);
		exec($commande);
		if ($taille = @getimagesize($dest)) {
			if ($taille[1] == 10) $netpbm_formats[] = "jpg";
		}
		$giftopnm_command = str_replace("pnmscale", "giftopnm", _PNMSCALE_COMMAND);
		$pnmtojpeg_command = str_replace("pnmscale", "pnmtojpeg", _PNMSCALE_COMMAND);
		$vignette = _ROOT_IMG_PACK."test.gif";
		$dest = _DIR_VAR . "test-gif.jpg";
		$commande = "$giftopnm_command $vignette | "._PNMSCALE_COMMAND." -width 10 | $pnmtojpeg_command > $dest";
		spip_log($commande);
		exec($commande);
		if ($taille = @getimagesize($dest)) {
			if ($taille[1] == 10) $netpbm_formats[] = "gif";
		}

		$pngtopnm_command = str_replace("pnmscale", "pngtopnm", _PNMSCALE_COMMAND);
		$vignette = _ROOT_IMG_PACK."test.png";
		$dest = _DIR_VAR . "test-gif.jpg";
		$commande = "$pngtopnm_command $vignette | "._PNMSCALE_COMMAND." -width 10 | $pnmtojpeg_command > $dest";
		spip_log($commande);
		exec($commande);
		if ($taille = @getimagesize($dest)) {
			if ($taille[1] == 10) $netpbm_formats[] = "png";
		}


		if ($netpbm_formats)
			$netpbm_formats = join(",", $netpbm_formats);
		else
			$netpbm_formats = '';
		ecrire_meta("netpbm_formats", $netpbm_formats);
	}

	// et maintenant envoyer la vignette de tests
	if (in_array($arg,array("gd1","gd2","imagick","convert","netpbm"))) {
		include_spip('inc/filtres');
		include_spip('inc/filtres_images_mini');
		$taille_preview = 150;
		$image = _image_valeurs_trans(_DIR_IMG_PACK.'test_image.jpg',"reduire-$taille_preview-$taille_preview",'jpg');

		$image['fichier_dest']=_DIR_VAR."test_$arg";
		if ($preview = _image_creer_vignette($image, $taille_preview, $taille_preview, $arg, true)
		AND ($preview['width'] * $preview['height'] > 0))
			redirige_par_entete($preview['fichier']);
	}

	# image echec
	redirige_par_entete(chemin_image('puce-rouge-anim.gif'));
}
?>
ajouter_lien.php000066600000002125152525474530007755 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

function action_ajouter_lien_dist($arg=null){
	if (is_null($arg)){
		$securiser_action = charger_fonction('securiser_action','inc');
		$arg = $securiser_action();
	}

	$arg = explode("-",$arg);
	list($objet_source,$ids,$objet_lie,$idl) = $arg;

	include_spip('action/editer_liens');
	objet_associer(array($objet_source=>$ids), array($objet_lie=>$idl));
}


?>
confirmer_inscription.php000066600000004651152525474530011710 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 * Cette action permet de confirmer une inscription
 * @return void
 */
function action_confirmer_inscription_dist() {
	$jeton = _request('jeton');
	$email = _request('email');

	include_spip('action/inscrire_auteur');
	if ($auteur = auteur_verifier_jeton($jeton)
	  AND $auteur['email']==$email
	  AND $auteur['statut']=='nouveau'){

		// OK c'est un nouvel inscrit qui confirme :
		// on le loge => ca va confirmer son statut et c'est plus sympa
		include_spip('inc/auth');
		auth_loger($auteur);

		// et on efface son jeton
		auteur_effacer_jeton($auteur['id_auteur']);

		// si pas de redirection demandee, rediriger vers public ou prive selon le statut de l'auteur
		// TODO: ne semble pas marcher si inscrit non visiteur, a debug
		if (!_request('redirect')){
			// on passe id_auteur explicite pour forcer une lecture en base de toutes les infos
			if (autoriser('ecrire','','',$auteur['id_auteur'])){
				// poser un cookie admin aussi
				$cookie = charger_fonction('cookie','action');
				$cookie("@".$GLOBALS['visiteur_session']['login']);
				$GLOBALS['redirect'] = _DIR_RESTREINT_ABS;
			}
			else
				$GLOBALS['redirect'] = $GLOBALS['meta']['adresse_site'];
		}
	}
	else {
		// lien perime :
		if ($GLOBALS['visiteur_session']['id_auteur']){
			// on passe id_auteur explicite pour forcer une lecture en base de toutes les infos
			if (autoriser('ecrire','','',$GLOBALS['visiteur_session']['id_auteur']))
				$GLOBALS['redirect'] = _DIR_RESTREINT_ABS;
			else
				$GLOBALS['redirect'] = $GLOBALS['meta']['adresse_site'];
		}
		else
			// rediriger vers la page de login si pas encore loge
			$GLOBALS['redirect'] = parametre_url(generer_url_public('login','',false),'url',_request('redirect'));
	}

}

?>
inscrire_auteur.php000066600000024113152525474530010501 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;


/**
 * Inscrire un nouvel auteur sur la base de son nom et son email
 * L'email est utilise pour reperer si il existe deja ou non
 * => identifiant par defaut
 *
 * @param string $statut
 * @param string $mail_complet
 * @param string $nom
 * @param array $options
 *   login : login precalcule
 *   id : id_rubrique fournit en second arg de #FORMULAIRE_INSCRIPTION
 *   from : email de l'envoyeur pour l'envoi du mail d'inscription
 *   force_nouveau : forcer le statut nouveau sur l'auteur inscrit, meme si il existait deja en base
 *   modele_mail : squelette de mail a utiliser
 * @return array|string
 */
function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = array()){
	if (!is_array($options))
		$options = array('id'=>$options);

	if (function_exists('test_inscription'))
		$f = 'test_inscription';
	else 	$f = 'test_inscription_dist';
	$desc = $f($statut, $mail_complet, $nom, $options);

	// erreur ?
	if (!is_array($desc))
		return _T($desc);

	include_spip('base/abstract_sql');
	$res = sql_select("statut, id_auteur, login, email", "spip_auteurs", "email=" . sql_quote($desc['email']));
	// erreur ?
	if (!$res)
		return _T('titre_probleme_technique');

	$row = sql_fetch($res);
	sql_free($res);
	if ($row){
		if (isset($options['force_nouveau']) AND $options['force_nouveau']==true){
			$desc['id_auteur'] = $row['id_auteur'];
			$desc = inscription_nouveau($desc);
		}
		else
			$desc = $row;
	}
	else
		// s'il n'existe pas deja, creer les identifiants
		$desc = inscription_nouveau($desc);

	// erreur ?
	if (!is_array($desc))
		return $desc;


	// generer le mot de passe (ou le refaire si compte inutilise)
	$desc['pass'] = creer_pass_pour_auteur($desc['id_auteur']);

	// attribuer un jeton pour confirmation par clic sur un lien
	$desc['jeton'] = auteur_attribuer_jeton($desc['id_auteur']);

	// charger de suite cette fonction, pour ses utilitaires
	$envoyer_inscription = charger_fonction("envoyer_inscription","");
	list($sujet,$msg,$from,$head) = $envoyer_inscription($desc, $nom, $statut, $options);

	$notifications = charger_fonction('notifications', 'inc');
	notifications_envoyer_mails($mail_complet, $msg, $sujet, $from, $head);

	// Notifications
	$notifications('inscription', $desc['id_auteur'],
		array('nom' => $desc['nom'], 'email' => $desc['email'])
	);

	return $desc;
}


/**
 * fonction qu'on peut redefinir pour filtrer les adresses mail et les noms,
 * et donner des infos supplementaires
 * Std: controler que le nom (qui sert a calculer le login) est plausible
 * et que l'adresse est valide. On les normalise au passage (trim etc).
 * Retour:
 * - si ok un tableau avec au minimum email, nom, mode (redac / forum)
 * - si ko une chaine de langue servant d'argument a  _T expliquant le refus
 *
 * http://doc.spip.org/@test_inscription_dist
 *
 * @param string $statut
 * @param string $mail
 * @param string $nom
 * @param string $options
 * @return array|string
 */
function test_inscription_dist($statut, $mail, $nom, $options) {
	include_spip('inc/filtres');
	if (!$r = email_valide($mail)) return 'info_email_invalide';
	$nom = trim(corriger_caracteres($nom));
	$res = array('email' => $r, 'nom' => $nom, 'prefs' => $statut);
	if (isset($options['login'])) {
		$login = trim(corriger_caracteres($options['login']));
		if((strlen ($login) >= _LOGIN_TROP_COURT) AND (strlen($nom) <= 64))
			$res['login'] = $login;
	}
	if(!isset($res['login']) AND ((strlen ($nom) < _LOGIN_TROP_COURT) OR (strlen($nom) > 64)))
		return 'ecrire:info_login_trop_court';
	return $res;
}


/**
 * On enregistre le demandeur comme 'nouveau', en memorisant le statut final
 * provisoirement dans le champ prefs, afin de ne pas visualiser les inactifs
 * A sa premiere connexion il obtiendra son statut final.
 *
 * http://doc.spip.org/@inscription_nouveau
 *
 * @param array $desc
 * @return mixed|string
 */
function inscription_nouveau($desc)
{
	if (!isset($desc['login']) OR !strlen($desc['login']))
		$desc['login'] = test_login($desc['nom'], $desc['email']);

	$desc['statut'] = 'nouveau';
	include_spip('action/editer_auteur');
	if (isset($desc['id_auteur']))
		$id_auteur = $desc['id_auteur'];
	else
		$id_auteur = auteur_inserer();

	if (!$id_auteur) return _T('titre_probleme_technique');

	include_spip('inc/autoriser');
	// lever l'autorisation pour pouvoir modifier le statut
	autoriser_exception('modifier','auteur',$id_auteur);
	auteur_modifier($id_auteur, $desc);
	autoriser_exception('modifier','auteur',$id_auteur,false);

	$desc['id_auteur'] = $id_auteur;

	return $desc;
}


/**
 * http://doc.spip.org/@test_login
 *
 * @param string $nom
 * @param string $mail
 * @return string
 */
function test_login($nom, $mail) {
	include_spip('inc/charsets');
	$nom = strtolower(translitteration($nom));
	$login_base = preg_replace("/[^\w\d_]/", "_", $nom);

	// il faut eviter que le login soit vraiment trop court
	if (strlen($login_base) < 3) {
		$mail = strtolower(translitteration(preg_replace('/@.*/', '', $mail)));
		$login_base = preg_replace("/[^\w\d]/", "_", $mail);
	}
	if (strlen($login_base) < 3)
		$login_base = 'user';

	$login = $login_base;

	for ($i = 1; ; $i++) {
		if (!sql_countsel('spip_auteurs', "login='$login'"))
			return $login;
		$login = $login_base.$i;
	}
	return $login;
}


/**
 * construction du mail envoyant les identifiants
 * fonction redefinissable qui doit retourner un tableau
 * dont les elements seront les arguments de inc_envoyer_mail
 *
 * http://doc.spip.org/@envoyer_inscription_dist
 *
 * @param array $desc
 * @param string $nom
 * @param string $mode
 * @param array $options
 * @return array
 */
function envoyer_inscription_dist($desc, $nom, $mode, $options=array()) {

	$contexte = array_merge($desc,$options);
	$contexte['nom'] = $nom;
	$contexte['mode'] = $mode;
	$contexte['url_confirm'] = generer_url_action('confirmer_inscription','',true,true);
	$contexte['url_confirm'] = parametre_url($contexte['url_confirm'],'email',$desc['email']);
	$contexte['url_confirm'] = parametre_url($contexte['url_confirm'],'jeton',$desc['jeton']);

	$modele_mail = 'modeles/mail_inscription';
	if (isset($options['modele_mail']) and $options['modele_mail']){
		$modele_mail = $options['modele_mail'];
	}
	$message = recuperer_fond($modele_mail, $contexte);
	$from = (isset($options['from']) ? $options['from'] : null);
	$head = null;
	return array("", $message,$from,$head);
}


/**
 * Creer un mot de passe initial aleatoire
 * 
 * http://doc.spip.org/@creer_pass_pour_auteur
 *
 * @param int $id_auteur
 * @return string
 */
function creer_pass_pour_auteur($id_auteur) {
	include_spip('inc/acces');
	$pass = creer_pass_aleatoire(8, $id_auteur);
	include_spip('action/editer_auteur');
	auteur_instituer($id_auteur, array('pass'=>$pass));
	return $pass;
}

/**
 * Determine le statut d'inscription :
 * si $statut_tmp fourni, verifie qu'il est autorise
 * sinon determine le meilleur statut possible et le renvoie
 *
 * @param string $statut_tmp
 * @param int $id
 * @return string
 */
function tester_statut_inscription($statut_tmp, $id){
	include_spip('inc/autoriser');
	if ($statut_tmp)
		return autoriser('inscrireauteur', $statut_tmp, $id) ? $statut_tmp : '';
	elseif (
		   autoriser('inscrireauteur', $statut_tmp = "1comite", $id)
	  OR autoriser('inscrireauteur', $statut_tmp = "6forum", $id))
		return $statut_tmp;

	return '';
}


/**
 * Un nouvel inscrit prend son statut definitif a la 1ere connexion.
 * Le statut a ete memorise dans prefs (cf test_inscription_dist).
 * On le verifie, car la config a peut-etre change depuis,
 * et pour compatibilite avec les anciennes versions qui n'utilisaient pas "prefs".
 *
 * http://doc.spip.org/@acces_statut
 *
 * @param array $auteur
 * @return array
 */
function confirmer_statut_inscription($auteur){
	// securite
	if ($auteur['statut'] != 'nouveau') return $auteur;

	include_spip('inc/autoriser');
	if (!autoriser('inscrireauteur', $auteur['prefs']))
		return $auteur;
	$s = $auteur['prefs'];

	include_spip('inc/autoriser');
	// accorder l'autorisation de modif du statut auteur
	autoriser_exception('modifier','auteur',$auteur['id_auteur']);
	include_spip('action/editer_auteur');
	// changer le statut
	auteur_modifier($auteur['id_auteur'],array('statut'=> $s));
	unset($_COOKIE['spip_session']); // forcer la maj de la session
	// lever l'autorisation de modif du statut auteur
	autoriser_exception('modifier','auteur',$auteur['id_auteur'],false);

	// mettre a jour le statut
	$auteur['statut'] = $s;
	return $auteur;
}


/**
 * Attribuer un jeton temporaire pour un auteur
 * en assurant l'unicite du jeton
 * @param int $id_auteur
 * @return string
 */
function auteur_attribuer_jeton($id_auteur){
	include_spip('inc/acces');
	// s'assurer de l'unicite du jeton pour le couple (email,cookie)
	do {
		$jeton = creer_uniqid();
		sql_updateq("spip_auteurs", array("cookie_oubli" => $jeton), "id_auteur=" . intval($id_auteur));
	}
	while (sql_countsel("spip_auteurs","cookie_oubli=".sql_quote($jeton))>1);
	return $jeton;
}

/**
 * Retrouver l'auteur par son jeton
 * @param string $jeton
 * @return array|bool
 */
function auteur_verifier_jeton($jeton){
	// refuser un jeton corrompu
	if (preg_match(',[^0-9a-f.],i',$jeton))
		return false;

	$desc = sql_fetsel('*','spip_auteurs',"cookie_oubli=".sql_quote($jeton, $serveur, 'string'));
	return $desc;
}

/**
 * Effacer le jeton d'un auteur apres utilisation
 *
 * @param int $id_auteur
 * @return bool
 */
function auteur_effacer_jeton($id_auteur){
	return sql_updateq("spip_auteurs", array("cookie_oubli" => ''), "id_auteur=" . intval($id_auteur));
}
converser.php000066600000004711152525474530007306 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

include_spip('inc/cookie');

// changer de langue: pas de secu si espace public ou login ou installation
// mais alors on n'accede pas a la base, on pose seulement le cookie.

// http://doc.spip.org/@action_converser_dist
function action_converser_dist()
{
	$update_session = false;
	if ( _request('arg') AND spip_connect()) {
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$securiser_action();
		$update_session = true;
	}

	$lang = action_converser_changer_langue($update_session);
	$redirect = rawurldecode(_request('redirect'));

	if (!$redirect) $redirect = _DIR_RESTREINT_ABS;
	$redirect = parametre_url($redirect,'lang',$lang,'&');
	redirige_par_entete($redirect, true);
}

function action_converser_changer_langue($update_session){
	if ($lang = _request('var_lang'))
		action_converser_post($lang);
	elseif ($lang = _request('var_lang_ecrire')) {
		if ($update_session) {
			sql_updateq("spip_auteurs", array("lang" => $lang), "id_auteur = " . $GLOBALS['visiteur_session']['id_auteur']);
			$GLOBALS['visiteur_session']['lang'] = $lang;
			$session = charger_fonction('session', 'inc');
			if ($spip_session = $session($GLOBALS['visiteur_session'])) {
				spip_setcookie(
					'spip_session',
					$spip_session,
					time() + 3600 * 24 * 14
				);
			}
		}
		action_converser_post($lang, 'spip_lang_ecrire');
	}
	return $lang;
}

// http://doc.spip.org/@action_converser_post
function action_converser_post($lang, $ecrire=false)
{
	if ($lang) {
		include_spip('inc/lang');
		if (changer_langue($lang)) {
			spip_setcookie('spip_lang', $_COOKIE['spip_lang'] = $lang, time() + 365 * 24 * 3600);
			if ($ecrire)
				spip_setcookie('spip_lang_ecrire', $_COOKIE['spip_lang_ecrire'] = $lang, time() + 365 * 24 * 3600);
		}
	}
}
?>
logout.php000066600000011245152525474530006611 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

include_spip('inc/cookie');


/**
 * Se deloger
 * Pour eviter les CSRF on passe par une etape de confirmation si pas de jeton fourni
 * avec un autosubmit js pour ne pas compliquer l'experience utilisateur
 *
 * http://doc.spip.org/@action_logout_dist
 *
 */
function action_logout_dist()
{
	$logout =_request('logout');
	$url = securiser_redirect_action(_request('url'));
	// cas particulier, logout dans l'espace public
	if ($logout == 'public' AND !$url)
		$url = url_de_base();

	// seul le loge peut se deloger (mais id_auteur peut valoir 0 apres une restauration avortee)
	if (isset($GLOBALS['visiteur_session']['id_auteur']) 
		AND is_numeric($GLOBALS['visiteur_session']['id_auteur'])
		// des sessions anonymes avec id_auteur=0 existent, mais elle n'ont pas de statut : double check
	  AND isset($GLOBALS['visiteur_session']['statut'])) {

		// il faut un jeton pour fermer la session (eviter les CSRF)
		if (!$jeton = _request('jeton')
		 OR !verifier_jeton_logout($jeton,$GLOBALS['visiteur_session'])){
			$jeton = generer_jeton_logout($GLOBALS['visiteur_session']);
			$action = generer_url_action("logout","jeton=$jeton");
			$action = parametre_url($action,'logout',_request('logout'));
			$action = parametre_url($action,'url',_request('url'));
			include_spip("inc/minipres");
			include_spip("inc/filtres");
			$texte = bouton_action(_T('spip:icone_deconnecter'),$action);
			$texte = "<div class='boutons'>$texte</div>";
			$texte .= '<script type="text/javascript">document.write("<style>body{visibility:hidden;}</style>");window.document.forms[0].submit();</script>';
			$res = minipres(_T('spip:icone_deconnecter'),$texte,'',true);
			echo $res;
			return;
		}

		include_spip('inc/auth');
		auth_trace($GLOBALS['visiteur_session'], '0000-00-00 00:00:00');
	// le logout explicite vaut destruction de toutes les sessions
		if (isset($_COOKIE['spip_session'])) {
			$session = charger_fonction('session', 'inc');
			$session($GLOBALS['visiteur_session']['id_auteur']);
			spip_setcookie('spip_session', $_COOKIE['spip_session'], time()-3600);
		}
		// si authentification http, et que la personne est loge,
		// pour se deconnecter, il faut proposer un nouveau formulaire de connexion http
		if (isset($_SERVER['PHP_AUTH_USER'])
			AND !$GLOBALS['ignore_auth_http']
			AND $GLOBALS['auth_can_disconnect']) {
			  ask_php_auth(_T('login_deconnexion_ok'),
				       _T('login_verifiez_navigateur'),
				       _T('login_retour_public'),
				       	"redirect=". _DIR_RESTREINT_ABS, 
				       _T('login_test_navigateur'),
				       true);
			
		}
	}

	// Rediriger en contrant le cache navigateur (Safari3)
	include_spip('inc/headers');
	redirige_par_entete($url
		? parametre_url($url, 'var_hasard', uniqid(rand()), '&')
		: generer_url_public('login'));
}

/**
 * Generer un jeton de logout personnel et ephemere
 * @param array $session
 * @param null|string $alea
 * @return string
 */
function generer_jeton_logout($session,$alea=null){
	if (is_null($alea)){
		if (!isset($GLOBALS['meta']['alea_ephemere'])){
			include_spip('base/abstract_sql');
			$GLOBALS['meta']['alea_ephemere'] = sql_getfetsel('valeur', 'spip_meta', "nom='alea_ephemere'");
		}
		$alea = $GLOBALS['meta']['alea_ephemere'];
	}

	$jeton = md5($session['date_session']
	  .$session['id_auteur']
	  .$session['statut']
	  .$alea
	);
	return $jeton;
}

/**
 * Verifier que le jeton de logout est bon
 * il faut verifier avec alea_ephemere_ancien si pas bon avec alea_ephemere
 * pour gerer le cas de la rotation d'alea
 * @param string $jeton
 * @param array $session
 * @return bool
 */
function verifier_jeton_logout($jeton,$session){
	if (generer_jeton_logout($session)===$jeton)
		return true;
	if (!isset($GLOBALS['meta']['alea_ephemere_ancien'])){
		include_spip('base/abstract_sql');
		$GLOBALS['meta']['alea_ephemere_ancien'] = sql_getfetsel('valeur', 'spip_meta', "nom='alea_ephemere_ancien'");
	}
	if (generer_jeton_logout($session,$GLOBALS['meta']['alea_ephemere_ancien'])===$jeton)
		return true;
	return false;
}

?>activer_plugins.php000066600000005130152525474530010472 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

// mise a jour des donnees si envoi via formulaire
// http://doc.spip.org/@enregistre_modif_plugin
function enregistre_modif_plugin(){
	include_spip('inc/plugin');
  // recuperer les plugins dans l'ordre des $_POST
	$test = array();
	foreach(liste_plugin_files() as $file){
	  $test['s'.substr(md5(_DIR_PLUGINS.$file),0,16)] = $file;
	}
	if (defined('_DIR_PLUGINS_SUPPL'))
		foreach(liste_plugin_files(_DIR_PLUGINS_SUPPL) as $file){
		  $test['s'.substr(md5(_DIR_PLUGINS_SUPPL.$file),0,16)] = $file;
		}

	$plugin=array();

	foreach($_POST as $choix=>$val){
		if (isset($test[$choix])&&$val=='O')
			$plugin[]=$test[$choix];
	}

	spip_log("Changement des plugins actifs par l'auteur " . $GLOBALS['visiteur_session']['id_auteur'] . ": " . join(',', $plugin));
	ecrire_plugin_actifs($plugin);

	// Chaque fois que l'on valide des plugins, on memorise la liste de ces plugins comme etant "interessants", avec un score initial, qui sera decremente a chaque tour : ainsi un plugin active pourra reter visible a l'ecran, jusqu'a ce qu'il tombe dans l'oubli.
	$plugins_interessants = @unserialize($GLOBALS['meta']['plugins_interessants']);
	if (!is_array($plugins_interessants))
		$plugins_interessants = array();

	$plugins_interessants2 = array();

	foreach($plugins_interessants as $plug => $score)
		if ($score > 1)
			$plugins_interessants2[$plug] = $score-1;
	foreach ($plugin as $plug)
		$plugins_interessants2[$plug] = 10; // score initial
	ecrire_meta('plugins_interessants', serialize($plugins_interessants2));
}

// http://doc.spip.org/@action_activer_plugins_dist
function action_activer_plugins_dist() {

	$securiser_action = charger_fonction('securiser_action', 'inc');
	$securiser_action();

	if (!autoriser('configurer', '_plugins'))
		die('erreur');
	// forcer la maj des meta pour les cas de modif de numero de version base via phpmyadmin
	lire_metas();
	enregistre_modif_plugin();
}

?>
annuler_job.php000066600000002022152525474530007567 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 * Annuler un travail
 * @return void
 */
function action_annuler_job_dist(){
	$securiser_action = charger_fonction('securiser_action','inc');
	$id_job = $securiser_action();

	if ($id_job = intval($id_job)
		AND autoriser('annuler','job',$id_job)
	){
		job_queue_remove($id_job);
	}
}

?>forcer_job.php000066600000002141152525474530007405 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 * Executer un travaille immediatement
 * @return void
 */
function action_forcer_job_dist(){
	$securiser_action = charger_fonction('securiser_action','inc');
	$id_job = $securiser_action();

	if ($id_job = intval($id_job)
		AND autoriser('forcer','job',$id_job)
	){
		include_spip('inc/queue');
		include_spip('inc/genie');
		queue_schedule(array($id_job));
	}

}

?>redirect.php000066600000002572152525474530007104 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

// Un script utile pour recalculer une URL symbolique des son changement

function action_redirect_dist()
{
	$type = _request('type');
	if (!preg_match('/^\w+$/', $type)) return;
	if ($m = _request('var_mode')) {
		// forcer la mise a jour de l'url de cet objet !
		if (!defined('_VAR_URLS')) define('_VAR_URLS',true);
		$m = 'var_mode='.urlencode($m);
	}
	$h = generer_url_entite_absolue(intval(_request('id')), $type, $m, '', true);
	$status = '302';
	if (_request('status') AND _request('status')=='301')
		$status = '301';

	if ($h)
		redirige_par_entete(str_replace('&amp;', '&', $h),'',$status);
	else
		redirige_par_entete('/','',$status);
}

?>
purger_queue.php000066600000002007152525474530010004 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 * Purger la liste des travaux en attente
 * @return void
 */
function action_purger_queue_dist(){
	$securiser_action = charger_fonction('securiser_action','inc');
	$securiser_action();

	if (autoriser('purger','queue')){
		include_spip('inc/queue');
		queue_purger();
	}

}

?>index.php000066600000000002152525474530006374 0ustar00X
instituer_langue_objet.php000066600000004525152525474530012047 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 * Modifier la langue d'un objet
 * @param string $objet
 * @param int $id
 * @param int $id_rubrique
 * @param string $changer_lang
 * @param string $serveur
 * @return string
 */
function action_instituer_langue_objet_dist($objet, $id, $id_rubrique, $changer_lang, $serveur='') {
	if ($changer_lang) {
		$table_objet_sql = table_objet_sql($objet);
		$id_table_objet = id_table_objet($objet);
		$trouver_table = charger_fonction('trouver_table', 'base');
		$desc = $trouver_table($table_objet_sql, $serveur);
		
		$set = array();
		if (isset($desc['field']['langue_choisie'])){
			$set['langue_choisie'] = 'oui';
		}
		
		if ($changer_lang != "herit") {
			$set['lang'] = $changer_lang;
			sql_updateq($table_objet_sql, $set, "$id_table_objet=" . intval($id),'',$serveur);
			include_spip('inc/rubriques'); // pour calculer_langues_rubriques et calculer_langues_utilisees
			if ($table_objet_sql == 'spip_rubriques') {
				calculer_langues_rubriques();
			}
			$langues = calculer_langues_utilisees($serveur);
			ecrire_meta('langues_utilisees', $langues);
		}
		else {
			$langue_parent = sql_getfetsel("lang", "spip_rubriques", "id_rubrique=" . intval($id_rubrique));
			if (!$langue_parent)
				$langue_parent = $GLOBALS['meta']['langue_site'];
			$changer_lang = $langue_parent;
			$set['lang'] = $changer_lang;
			if (isset($set['langue_choisie'])){
				$set['langue_choisie'] = 'non';
			}
			sql_updateq($table_objet_sql, $set, "$id_table_objet=" . intval($id),'',$serveur);
			if ($table_objet_sql == 'spip_rubriques') {
				include_spip('inc/rubriques');
				calculer_langues_rubriques();
			}
		}
	}
	return $changer_lang;
}
iconifier.php000066600000007626152525474530007257 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 * L'entree par l'action ne sert plus qu'a une retro compat eventuelle
 * le #FORMULAIRE_EDITER_LOGO utilise action_spip_image_ajouter_dist
 */
function action_iconifier_dist()
{
	include_spip('inc/actions');
	$securiser_action = charger_fonction('securiser_action', 'inc');
	$arg = $securiser_action();
	$iframe_redirect = _request('iframe_redirect');

	$arg = rawurldecode($arg);

	if (!preg_match(',^-?\d*(\D)(.*)$,',$arg, $r))
		spip_log("action iconifier: $arg pas compris");
	elseif ($r[1] == '+')
		action_spip_image_ajouter_dist($r[2], _request('sousaction2'), _request('source'));
	else	action_spip_image_effacer_dist($r[2]);
	
	if(_request("iframe") == 'iframe') {
		$redirect = urldecode($iframe_redirect)."&iframe=iframe";
		redirige_par_entete(urldecode($redirect));
	}
}

// http://doc.spip.org/@action_spip_image_effacer_dist
function action_spip_image_effacer_dist($arg) {

	if (!strstr($arg, ".."))
		spip_unlink(_DIR_LOGOS . $arg);
}

//
// Ajouter un logo
//

// $source = $_FILES[0]
// $dest = arton12.xxx
// http://doc.spip.org/@action_spip_image_ajouter_dist
function action_spip_image_ajouter_dist($arg,$sousaction2,$source,$return=false) {
	global $formats_logos;

	include_spip('inc/documents');
	if (!$sousaction2) {
		if (!$_FILES) $_FILES = $GLOBALS['HTTP_POST_FILES'];
		$source = (is_array($_FILES) ? array_pop($_FILES) : "");
	}
	$erreur = "";
	if (!$source)
		spip_log("spip_image_ajouter : source inconnue");
	else {
		$f =_DIR_LOGOS . $arg . '.tmp';

		if (!is_array($source)) 
		// fichier dans upload/
	  		$source = @copy(determine_upload() . $source, $f);
		else {
		// Intercepter une erreur a l'envoi
			if ($erreur = check_upload_error($source['error'],"",$return))
				$source ="";
			else
		// analyse le type de l'image (on ne fait pas confiance au nom de
		// fichier envoye par le browser : pour les Macs c'est plus sur)

				$source = deplacer_fichier_upload($source['tmp_name'], $f);
		}
		if (!$source)
			spip_log("pb de copie pour $f");
	}
	if ($source AND $f) {
		$size = @getimagesize($f);
		$type = !$size ? '': ($size[2] > 3 ? '' : $formats_logos[$size[2]-1]);
		if ($type) {
			$poids = filesize($f);

			if (_LOGO_MAX_SIZE > 0
			AND $poids > _LOGO_MAX_SIZE*1024) {
				spip_unlink ($f);
				$erreur = _T('info_logo_max_poids',
									array('maxi' => taille_en_octets(_LOGO_MAX_SIZE*1024),
									'actuel' => taille_en_octets($poids)));
			}

			elseif (_LOGO_MAX_WIDTH * _LOGO_MAX_HEIGHT
			AND ($size[0] > _LOGO_MAX_WIDTH
			OR $size[1] > _LOGO_MAX_HEIGHT)) {
				spip_unlink ($f);
				$erreur = _T('info_logo_max_poids',
									array(
									'maxi' =>
										_T('info_largeur_vignette',
											array('largeur_vignette' => _LOGO_MAX_WIDTH,
											'hauteur_vignette' => _LOGO_MAX_HEIGHT)),
									'actuel' =>
										_T('info_largeur_vignette',
											array('largeur_vignette' => $size[0],
											'hauteur_vignette' => $size[1]))
									));
			}
			else
				@rename ($f, _DIR_LOGOS . $arg . ".$type");
		}
		else {
			spip_unlink ($f);
			$erreur = _T('info_logo_format_interdit',
									array('formats' => join(', ', $formats_logos)));
		}
	
	}
	if ($erreur){
		if ($return)
			return $erreur;
		else
			check_upload_error(6,$erreur);
	}
}
?>
auth.php000066600000002716152525474530006244 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 * Retour d'authentification pour les SSO
 */
function action_auth_dist() {
	
	$securiser_action = charger_fonction('securiser_action', 'inc');
	$arg = $securiser_action();

	if (!preg_match(",^(\w+)[/](.+)$,", $arg, $r)) {
		spip_log("action_auth_dist $arg pas compris");
	}
	else {
		$auth_methode = $r[1];
		$login = $r[2];
		include_spip('inc/auth');
		$res = auth_terminer_identifier_login($auth_methode, $login);

		if (is_string($res)){ // Erreur
			$redirect = _request('redirect');
			$redirect = parametre_url($redirect,'var_erreur',$res,'&');
			include_spip('inc/headers');
			redirige_par_entete($redirect);
		}

		// sinon on loge l'auteur identifie, et on finit (redirection automatique)
		auth_loger($res);
	}
}


?>
instituer_objet.php000066600000002613152525474530010510 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 * Instituer un objet avec les puces rapides
 * @param null|string $arg
 * @return 
 */
function action_instituer_objet_dist($arg=null) {

	if (is_null($arg)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}

	list($objet, $id_objet, $statut) = preg_split('/\W/', $arg);
	if (!$statut) $statut = _request('statut_nouv'); // cas POST
	if (!$statut) return; // impossible mais sait-on jamais

	if ($id_objet = intval($id_objet)
		AND autoriser('instituer',$objet,$id_objet,'',array('statut'=>$statut))){

		include_spip('action/editer_objet');
		objet_modifier($objet,$id_objet,array('statut' => $statut));
	}

}

?>referencer_traduction.php000066600000006160152525474530011654 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 * Definir le lien de traduction vers un objet de reference
 * si id_trad=0 : dereference le lien de traduction de id_objet
 * si id_trad=NN : reference le lien de traduction de id_objet vers NN
 * si id_objet=id_trad actuel et id_trad=new_id_trad : modifie la reference de tout le groupe de traduction
 * 
 * @param string $objet
 * @param int $id_objet
 * @param int $id_trad
 * @return bool
 */
function action_referencer_traduction_dist($objet, $id_objet, $id_trad) {

	// ne rien faire si id_trad est ambigu
	if (!is_numeric($id_trad)) return false;

	$table_objet_sql = table_objet_sql($objet);
	$id_table_objet = id_table_objet($objet);

	// on a fourni un id_trad : affectation ou modification du groupe de trad
	if ($id_trad) {
		// selectionner l'objet cible, qui doit etre different de nous-meme,
		// et quitter s'il n'existe pas
		$id_lier = sql_getfetsel('id_trad', $table_objet_sql, "$id_table_objet=".intval($id_trad)." AND NOT($id_table_objet=".intval($id_objet).")");
		if ($id_lier === NULL){
			spip_log("echec lien de trad vers objet $objet/$id_objet incorrect ($id_trad)");
			return false;
		}

		// $id_lier est le numero du groupe de traduction
		// Si l'objet vise n'est pas deja traduit, son identifiant devient
		// le nouvel id_trad de ce nouveau groupe et on l'affecte aux deux
		// objets
		if ($id_lier == 0) {
			sql_updateq($table_objet_sql, array("id_trad" => $id_trad), "$id_table_objet IN ($id_trad, $id_objet)");
		}
		// si id_lier = id_objet alors on veut changer la reference de tout le groupe de trad
		elseif ($id_lier == $id_objet) {
			sql_updateq($table_objet_sql, array("id_trad" => $id_trad), "id_trad = $id_lier");
		}
		// sinon ajouter notre objet dans le groupe
		else {
			sql_updateq($table_objet_sql, array("id_trad" => $id_lier), "$id_table_objet=".intval($id_objet));
		}
	}
	// on a fourni un id_trad nul : sortir id_objet du groupe de trad
	else {
		$old_id_trad = sql_getfetsel('id_trad',$table_objet_sql,"$id_table_objet=".intval($id_objet));
		// supprimer le lien de traduction
		sql_updateq($table_objet_sql, array("id_trad" => 0), "$id_table_objet=".intval($id_objet));

		// Verifier si l'ancien groupe ne comporte plus qu'un seul objet. Alors mettre a zero.
		$cpt = sql_countsel($table_objet_sql, "id_trad=".intval($old_id_trad));
		if ($cpt == 1)
			sql_updateq($table_objet_sql, array("id_trad" => 0), "id_trad=".intval($old_id_trad));
	}

	return true;
}


?>
tester_taille.php000066600000006350152525474530010141 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;
include_spip('inc/headers');

function action_tester_taille_error_handler($output)
{
	// on est ici, donc echec lors de la creation de l'image
	if ($GLOBALS['redirect']){
		return redirige_formulaire($GLOBALS['redirect']);
	}
	return $output;
}


// Tester nos capacites a creer des images avec GD2 (taille memoire)
// http://doc.spip.org/@action_tester_taille_dist
function action_tester_taille_dist() {
	
	if (!autoriser('configurer'))
		return;
	
	$taille = _request('arg');
	$taille = explode('-',$taille);

	$GLOBALS['taille_max'] = end($taille);
	$GLOBALS['taille_min'] = 0;
	if (count($taille)>1)
		$GLOBALS['taille_min'] = reset($taille);

	// si l'intervalle est assez petit, on garde la valeur min
	if ($GLOBALS['taille_max']*$GLOBALS['taille_max']-$GLOBALS['taille_min']*$GLOBALS['taille_min']<50000){
		ecrire_meta('max_taille_vignettes',$t=($GLOBALS['taille_min']*$GLOBALS['taille_min'])*0.9,'non');
		echo round($t/1000000,3).' Mpx';
		die();
	}

	$taille = $GLOBALS['taille_test'] = round(($GLOBALS['taille_max']+$GLOBALS['taille_min'])/2);

	include_spip('inc/filtres');
	// des inclusions representatives d'un hit prive et/ou public pour la conso memoire
	include_spip('public/assembler');
	include_spip('public/balises');
	include_spip('public/boucles');
	include_spip('public/cacher');
	include_spip('public/compiler');
	include_spip('public/composer');
	include_spip('public/criteres');
	include_spip('public/interfaces');
	include_spip('public/parametrer');
	include_spip('public/phraser_html');
	include_spip('public/references');

	include_spip('inc/presentation');
	include_spip('inc/charsets');
	include_spip('inc/documents');
	include_spip('inc/header');
	propre("<doc1>"); // charger propre avec le trairement d'un modele

	$i = _request('i')+1;
	$image_source = chemin_image("test.png");
	$GLOBALS['redirect'] = generer_url_action("tester_taille", "i=$i&arg=".$GLOBALS['taille_min']."-".$GLOBALS['taille_test']);

	ob_start('action_tester_taille_error_handler');
	filtrer('image_recadre',$image_source,$taille,$taille);
	$GLOBALS['redirect'] = generer_url_action("tester_taille", "i=$i&arg=$taille-".$GLOBALS['taille_max']);
	// si la valeur intermediaire a reussi, on teste la valeur maxi qui est peut etre sous estimee
	$taille = $GLOBALS['taille_max'];
	filtrer('image_recadre',$image_source,$taille,$taille);
	$GLOBALS['redirect'] = generer_url_action("tester_taille", "i=$i&arg=$taille-".$GLOBALS['taille_max']);
	ob_end_clean();

	// on est ici, donc pas de plantage
	echo redirige_formulaire($GLOBALS['redirect']);
}

?>
instituer_langue_rubrique.php000066600000003551152525474530012600 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

// http://doc.spip.org/@action_instituer_langue_rubrique_dist
function action_instituer_langue_rubrique_dist() {

	$securiser_action = charger_fonction('securiser_action', 'inc');
	$arg = $securiser_action();
	$changer_lang = _request('changer_lang');

	list($id_rubrique, $id_parent) = preg_split('/\W/', $arg);

	if ($changer_lang
	AND $id_rubrique>0
	AND $GLOBALS['meta']['multi_rubriques'] == 'oui'
	AND ($GLOBALS['meta']['multi_secteurs'] == 'non' OR $id_parent == 0)) {
		if ($changer_lang != "herit")
			sql_updateq('spip_rubriques', array('lang'=>$changer_lang, 'langue_choisie'=>'oui'), "id_rubrique=$id_rubrique");
		else {
			if ($id_parent == 0)
				$langue_parent = $GLOBALS['meta']['langue_site'];
			else {
				$langue_parent = sql_getfetsel("lang", "spip_rubriques", "id_rubrique=$id_parent");
			}
			sql_updateq('spip_rubriques', array('lang'=>$langue_parent, 'langue_choisie'=>'non'), "id_rubrique=$id_rubrique");
		}
		include_spip('inc/rubriques');
		calculer_langues_rubriques();

		// invalider les caches marques de cette rubrique
		include_spip('inc/invalideur');
		suivre_invalideur("id='rubrique/$id_rubrique'");
	}
}
?>
supprimer_rubrique.php000066600000004610152525474530011242 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

include_spip('inc/charsets');	# pour le nom de fichier

/**
 * Effacer une rubrique
 *
 * http://doc.spip.org/@action_supprimer_dist
 *
 * @param null $id_rubrique
 * @return void
 */
function action_supprimer_rubrique_dist($id_rubrique=null) {

	if (is_null($id_rubrique)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$id_rubrique = $securiser_action();
	}

	if (intval($id_rubrique)){

		sql_delete("spip_rubriques", "id_rubrique=".intval($id_rubrique));
		// Les admin restreints qui n'administraient que cette rubrique
		// deviennent redacteurs
		// (il y a sans doute moyen de faire ca avec un having)

		$q = sql_select("id_auteur", "spip_auteurs_liens", "objet='rubrique' AND id_objet=".intval($id_rubrique));
		while ($r = sql_fetch($q)) {
			$id_auteur = $r['id_auteur'];
			// degrader avant de supprimer la restriction d'admin
			// section critique sur les droits
			$n = sql_countsel("spip_auteurs_liens", "objet='rubrique' AND id_objet!=".intval($id_rubrique)." AND id_auteur=".intval($id_auteur));
			if (!$n) {
				include_spip('action/editer_auteur');
				auteurs_set($id_auteur,array("statut" => '1comite'));
			}
			sql_delete("spip_auteurs_liens", "objet='rubrique' AND id_objet=".intval($id_rubrique)." AND id_auteur=".intval($id_auteur));
		}
		// menu_rubriques devra recalculer
		effacer_meta("date_calcul_rubriques");

		// Une rubrique supprimable n'avait pas le statut "publie"
		// donc rien de neuf pour la rubrique parente
		include_spip('inc/rubriques');
		calculer_langues_rubriques();

		// invalider les caches marques de cette rubrique
		include_spip('inc/invalideur');
		suivre_invalideur("id='rubrique/$id_rubrique'");
	}
}

?>
super_cron.php000066600000003424152525474530007457 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 * Url pour lancer le cron de manière asynchrone si le serveur
 * le permet
 *
 * On se base sur le même code que celui du pipeline affichage final
 *
 * Cette fonction est utile pour être appelée depuis un cron UNIX par exemple
 * car elle retourne tout de suite
 *
 * Exemple de tache cron Unix pour un appel toutes les minutes :
 * "* * * * * curl  http://www.mondomaine.tld/spip.php?action=super_cron"
 */
function action_super_cron_dist(){
	// Si fsockopen est possible, on lance le cron via un socket
	// en asynchrone
	if(function_exists('fsockopen')){
		$url = generer_url_action('cron');
		$parts=parse_url($url);
		$fp = fsockopen($parts['host'],
	        isset($parts['port'])?$parts['port']:80,
	        $errno, $errstr, 30);
		if ($fp) {
	    	$out = "GET ".$parts['path']."?".$parts['query']." HTTP/1.1\r\n";
    		$out.= "Host: ".$parts['host']."\r\n";
    		$out.= "Connection: Close\r\n\r\n";
			fwrite($fp, $out);
			fclose($fp);
			return;
		}
	}
	// ici lancer le cron par un CURL asynchrone si CURL est présent
	// TBD

	return;
}
?>preferer.php000066600000004207152525474530007112 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;


// http://doc.spip.org/@action_preferer_dist
function action_preferer_dist() {
	//
	// Preferences de presentation de l'espace prive
	//
	if ($_GET['arg'] !== 'display:4') {
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	} else $arg = $_GET['arg'];

	if (!preg_match(",^(.+):(.*)$,", $arg, $r))
		spip_log("action_preferer_dist: $arg pas compris");
	else {
	$prefs_mod = false;

	list(, $op, $val) = $r;
	if ($op == 'couleur') {
		$GLOBALS['visiteur_session']['prefs']['couleur'] = $val;
		$prefs_mod = true;
	}
	elseif ($op == 'display') {
		$GLOBALS['visiteur_session']['prefs']['display'] = $val;
		$prefs_mod = true;
	}
	elseif ($op == 'display_outils') {
		$GLOBALS['visiteur_session']['prefs']['display_outils'] = $val;
		$prefs_mod = true;
	}

	if ($prefs_mod AND intval($GLOBALS['visiteur_session']['id_auteur']))
		sql_updateq('spip_auteurs', array('prefs' => serialize($GLOBALS['visiteur_session']['prefs'])), "id_auteur=" .intval($GLOBALS['visiteur_session']['id_auteur']));
	
	if ($op == 'spip_ecran') {
		// Poser un cookie,
		// car ce reglage depend plus du navigateur que de l'utilisateur
		$GLOBALS['spip_ecran'] = $val;
		include_spip('inc/cookie');
		spip_setcookie('spip_ecran', $val, time() + 365 * 24 * 3600);
	}

	// Si modif des couleurs en ajax, redirect inutile on a change de CSS
	if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') exit;

	}
}
?>
supprimer_lien.php000066600000002130152525474530010326 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

function action_supprimer_lien_dist($arg=null){
	if (is_null($arg)){
		$securiser_action = charger_fonction('securiser_action','inc');
		$arg = $securiser_action();
	}

	$arg = explode("-",$arg);
	list($objet_source,$ids,$objet_lie,$idl) = $arg;

	include_spip('action/editer_liens');
	objet_dissocier(array($objet_source=>$ids), array($objet_lie=>$idl));
}


?>
cookie.php000066600000006460152525474530006554 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

include_spip('inc/actions');
include_spip('inc/cookie');

// http://doc.spip.org/@action_cookie_dist
function action_cookie_dist($set_cookie_admin=null, $change_session = null) {
	$redirect_echec = $redirect = null;
	$test_echec_cookie = null;
	$url = "";
	if (is_null($set_cookie_admin)){
		$set_cookie_admin = _request('cookie_admin');
		$change_session = _request('change_session');
		$test_echec_cookie = _request('test_echec_cookie');

		// La cible de notre operation de connexion
		$url = securiser_redirect_action(_request('url'));
		$redirect = $url ? $url : generer_url_ecrire('accueil');
		$redirect_echec = _request('url_echec');
		if (!isset($redirect_echec)) {
			if (strpos($redirect,_DIR_RESTREINT_ABS)!==false)
				$redirect_echec = generer_url_public('login','',true);
			else
				$redirect_echec = $redirect;
		}
	}


	// rejoue le cookie pour renouveler spip_session
	if ($change_session == 'oui') {
		$session = charger_fonction('session', 'inc');
		$session(true);
		spip_log("statut 204 pour " . $_SERVER['REQUEST_URI']);
		http_status(204); // No Content
		return;
	}

	// tentative de connexion en auth_http
	if (_request('essai_auth_http') AND !$GLOBALS['ignore_auth_http']) {
		include_spip('inc/auth');
		if (@$_SERVER['PHP_AUTH_USER']
		AND @$_SERVER['PHP_AUTH_PW']
		AND $auteur = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])){
			auth_loger($auteur);
			redirige_par_entete(parametre_url($redirect,'t',time(),'&'));
		}
		else {
			ask_php_auth(_T('info_connexion_refusee'),
			     _T('login_login_pass_incorrect'),
			     _T('login_retour_site'),
			     "url=".rawurlencode($redirect),
			     _T('login_nouvelle_tentative'),
			     (strpos($url,_DIR_RESTREINT_ABS)!==false));
		}
	}
	else {
		
		// en cas de login sur bonjour=oui, on tente de poser un cookie
		// puis de passer au login qui diagnostiquera l'echec de cookie
		// le cas echeant.
		if ($test_echec_cookie == 'oui') {
			spip_setcookie('spip_session', 'test_echec_cookie');
			if ($redirect)
				$redirect = parametre_url(parametre_url($redirect_echec,'var_echec_cookie','oui','&'),'url',rawurlencode($redirect),'&');
		}
		else {

			$cook = isset($_COOKIE['spip_admin']) ? $_COOKIE['spip_admin'] : '';
			// Suppression cookie d'admin ?
			if ($set_cookie_admin == "non") {
				if ($cook)
					spip_setcookie('spip_admin', $cook, time() - 3600 * 24);
			}
			// Ajout de cookie d'admin
			else if ($set_cookie_admin) {
				spip_setcookie('spip_admin', $set_cookie_admin,
					time() + 14 * 24 * 3600);
			}
		}
	}
	
	// Redirection finale
	if ($redirect)
		redirige_par_entete($redirect, true);
}

?>
debloquer_edition.php000066600000002353152525474530010775 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

// http://doc.spip.org/@action_instituer_collaboration_dist
function action_debloquer_edition_dist() {

	$securiser_action = charger_fonction('securiser_action', 'inc');
	$arg = $securiser_action();

	if ($arg) {
		include_spip('inc/drapeau_edition');
		if ($arg == 'tous') {
			debloquer_tous($GLOBALS['visiteur_session']['id_auteur']);
		}
		else {
			$arg = explode("-",$arg);
			list($objet,$id_objet) = $arg;
			debloquer_edition($GLOBALS['visiteur_session']['id_auteur'], $id_objet, $objet);
		}
	}
}
?>
editer_liens.php000066600000050070152525474530007745 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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.   *
\***************************************************************************/

/**
 * API d'édition de liens
 *
 * @package SPIP\Liens\API
 */
 
if (!defined('_ECRIRE_INC_VERSION')) return;




/**
 * Teste l'existence de la table de liaison xxx_liens d'un objet
 *
 * @api
 * @param string $objet
 *     Objet à tester
 * @return array|bool
 *     - false si l'objet n'est pas associable.
 *     - array(clé primaire, nom de la table de lien) si associable
 */
function objet_associable($objet){
	$trouver_table = charger_fonction('trouver_table','base');
	$table_sql = table_objet_sql($objet);

	$l="";
	if ($primary = id_table_objet($objet)
	  AND $trouver_table($l = $table_sql."_liens")
		AND !preg_match(',[^\w],',$primary)
		AND !preg_match(',[^\w],',$l))
		return array($primary,$l);

	spip_log("Objet $objet non associable : ne dispose pas d'une cle primaire $primary OU d'une table liens $l");
	return false;
}

/**
 * Associer un ou des objets à des objets listés
 * 
 * $objets_source et $objets_lies sont de la forme
 * array($objet=>$id_objets,...)
 * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
 * ou de la forme array("NOT",$id_objets) pour une selection par exclusion
 *
 * Les objets sources sont les pivots qui portent les liens
 * et pour lesquels une table spip_xxx_liens existe
 * (auteurs, documents, mots)
 *
 * on peut passer optionnellement une qualification du (des) lien(s) qui sera
 * alors appliquee dans la foulee.
 * En cas de lot de liens, c'est la meme qualification qui est appliquee a tous
 * 
 * @api
 * @param array $objets_source
 * @param array|string $objets_lies
 * @param array $qualif
 * @return bool|int
 */
function objet_associer($objets_source, $objets_lies, $qualif = null){
	$modifs = objet_traiter_liaisons('lien_insert', $objets_source, $objets_lies);

	if ($qualif)
		objet_qualifier_liens($objets_source, $objets_lies, $qualif);

	return $modifs; // pas d'erreur
}


/**
 * Dissocier un (ou des) objet(s)  des objets listés
 * 
 * $objets_source et $objets sont de la forme
 * array($objet=>$id_objets,...)
 * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
 *
 * Les objets sources sont les pivots qui portent les liens
 * et pour lesquels une table spip_xxx_liens existe
 * (auteurs, documents, mots)
 *
 * un * pour $objet,$id_objet permet de traiter par lot
 * seul le type de l'objet source ne peut pas accepter de joker et doit etre explicite
 *
 * @api
 * @param array $objets_source
 * @param array|string $objets_lies
 * @return bool|int
 */
function objet_dissocier($objets_source,$objets_lies){
	return objet_traiter_liaisons('lien_delete',$objets_source,$objets_lies);
}



/**
 * Qualifier le lien entre un (ou des) objet(s) et des objets listés
 * 
 * $objets_source et $objets sont de la forme
 * array($objet=>$id_objets,...)
 * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
 * 
 * Les objets sources sont les pivots qui portent les liens
 * et pour lesquels une table spip_xxx_liens existe
 * (auteurs, documents, mots)
 *
 * un * pour $objet,$id_objet permet de traiter par lot
 * seul le type de l'objet source ne peut pas accepter de joker et doit etre explicite
 *
 * @api
 * @param array $objets_source
 * @param array|string $objets_lies
 * @param array $qualif
 * @return bool|int
 */
function objet_qualifier_liens($objets_source,$objets_lies,$qualif){
	return objet_traiter_liaisons('lien_set',$objets_source,$objets_lies,$qualif);
}


/**
 * Trouver les liens entre objets
 * 
 * $objets_source et $objets sont de la forme
 * array($objet=>$id_objets,...)
 * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
 *
 * Les objets sources sont les pivots qui portent les liens
 * et pour lesquels une table spip_xxx_liens existe
 * (auteurs, documents, mots)
 *
 * un * pour $objet,$id_objet permet de traiter par lot
 * seul le type de l'objet source ne peut pas accepter de joker et doit etre explicite
 *
 * renvoie une liste de tableaux decrivant chaque lien
 * dans lequel objet_source et objet_lie sont aussi affectes avec l'id de chaque
 * par facilite
 * ex :
 * array(
 *   array('id_document'=>23,'objet'=>'article','id_objet'=>12,'vu'=>'oui',
 *         'document'=>23,'article'=>12)
 * )
 * 
 * @api
 * @param array $objets_source
 * @param array|string $objets_lies
 * @return array
 */
function objet_trouver_liens($objets_source,$objets_lies){
	return objet_traiter_liaisons('lien_find',$objets_source,$objets_lies);
}


/**
 * Nettoyer les liens morts vers des objets qui n'existent plus
 * 
 * $objets_source et $objets sont de la forme
 * array($objet=>$id_objets,...)
 * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
 *
 * Les objets sources sont les pivots qui portent les liens
 * et pour lesquels une table spip_xxx_liens existe
 * (auteurs, documents, mots)
 *
 * un * pour $objet,$id_objet permet de traiter par lot
 * seul le type de l'objet source ne peut pas accepter de joker et doit etre explicite
 * 
 * @api
 * @param array $objets_source
 * @param array|string $objets_lies
 * @return int
 */
function objet_optimiser_liens($objets_source,$objets_lies){
	return objet_traiter_liaisons('lien_optimise',$objets_source,$objets_lies);
}


/**
 * Dupliquer tous les liens entrant ou sortants d'un objet
 * vers un autre (meme type d'objet, mais id different)
 * si $types est fourni, seuls les liens depuis/vers les types listes seront copies
 * si $exclure_types est fourni, les liens depuis/vers les types listes seront ignores
 *
 * @api
 * @param string $objet
 * @param int $id_source
 * @param int $id_cible
 * @param array $types
 * @param array $exclure_types
 * @return int
 *     Nombre de liens copiés
 */
function objet_dupliquer_liens($objet,$id_source,$id_cible,$types=null,$exclure_types=null){
	include_spip('base/objets');
	$tables = lister_tables_objets_sql();
	$n = 0;
	foreach($tables as $table_sql => $infos){
		if (
			(is_null($types) OR in_array($infos['type'],$types))
			AND (is_null($exclure_types) OR !in_array($infos['type'],$exclure_types))
			){
			if (objet_associable($infos['type'])){
				$liens = (($infos['type']==$objet)?
						objet_trouver_liens(array($objet=>$id_source),'*')
					:
						objet_trouver_liens(array($infos['type']=>'*'),array($objet=>$id_source)));
				foreach($liens as $lien){
					$n++;
					if ($infos['type']==$objet){
						objet_associer(array($objet=>$id_cible),array($lien['objet']=>$lien[$lien['objet']]),$lien);
					}
					else {
						objet_associer(array($infos['type']=>$lien[$infos['type']]),array($objet=>$id_cible),$lien);
					}
				}
			}
		}
	}
	return $n;
}

/**
 * Fonctions techniques
 * ne pas les appeler directement
 */


/**
 * Fonction générique qui
 * applique une operation de liaison entre un ou des objets et des objets listés
 * $objets_source et $objets_lies sont de la forme
 * array($objet=>$id_objets,...)
 * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
 *
 * Les objets sources sont les pivots qui portent les liens
 * et pour lesquels une table spip_xxx_liens existe
 * (auteurs, documents, mots)
 *
 * on peut passer optionnellement une qualification du (des) lien(s) qui sera
 * alors appliquee dans la foulee.
 * En cas de lot de liens, c'est la meme qualification qui est appliquee a tous
 *
 * @internal
 * @param string $operation
 * @param array $objets_source
 * @param array $objets_lies
 * @param array $set
 * @return bool|int|array
 */
function objet_traiter_liaisons($operation,$objets_source,$objets_lies, $set = null){
	// accepter une syntaxe minimale pour supprimer tous les liens
	if ($objets_lies=='*') $objets_lies = array('*'=>'*');
	$modifs = 0; // compter le nombre de modifications
	$echec = null;
	foreach($objets_source as $objet=>$ids){
		if ($a = objet_associable($objet)) {
			list($primary,$l) = $a;
			if (!is_array($ids))
				$ids = array($ids);
			elseif(reset($ids)=="NOT"){
				// si on demande un array('NOT',...) => recuperer la liste d'ids correspondants
				$where = lien_where($primary,$ids,'*','*');
				$ids = sql_allfetsel($primary,$l,$where);
				$ids = array_map('reset',$ids);
			}
			foreach($ids as $id) {
				$res = $operation($objet,$primary,$l,$id,$objets_lies,$set);
				if ($res===false) {
					spip_log("objet_traiter_liaisons [Echec] : $operation sur $objet/$primary/$l/$id",_LOG_ERREUR);
					$echec = true;
				}
				else
					$modifs=($modifs?(is_array($res)?array_merge($modifs,$res):$modifs+$res):$res);
			}
		}
		else
			$echec = true;
	}

	return ($echec?false:$modifs); // pas d'erreur
}


/**
 * Sous fonction insertion
 * qui traite les liens pour un objet source dont la clé primaire
 * et la table de lien sont fournies
 * 
 * $objets et de la forme
 * array($objet=>$id_objets,...)
 *
 * Retourne le nombre d'insertions realisees
 *
 * @internal
 * @param string $objet_source
 * @param string $primary
 * @param sgring $table_lien
 * @param int $id
 * @param array $objets
 * @return bool|int
 */
function lien_insert($objet_source,$primary,$table_lien,$id,$objets) {
	$ins = 0;
	$echec = null;
	foreach($objets as $objet => $id_objets){
		if (!is_array($id_objets)) $id_objets = array($id_objets);
		foreach($id_objets as $id_objet) {
			$objet = ($objet=='*')?$objet:objet_type($objet); # securite
			// Envoyer aux plugins
			$id_objet = pipeline('pre_edition_lien',
				array(
					'args' => array(
						'table_lien' => $table_lien,
						'objet_source' => $objet_source,
						'id_objet_source' => $id,
						'objet' => $objet,
						'id_objet' => $id_objet,
						'action'=>'insert',
					),
					'data' => $id_objet
				)
			);
			if ($id_objet=intval($id_objet)
				AND !sql_getfetsel(
								$primary,
								$table_lien,
								array('id_objet='.intval($id_objet), 'objet='.sql_quote($objet), $primary.'='.intval($id))))
			{

					$e = sql_insertq($table_lien, array('id_objet' => $id_objet, 'objet'=>$objet, $primary=>$id));
					if ($e!==false) {
						$ins++;
						lien_propage_date_modif($objet,$id_objet);
						lien_propage_date_modif($objet_source,$id);
						// Envoyer aux plugins
						pipeline('post_edition_lien',
							array(
								'args' => array(
									'table_lien' => $table_lien,
									'objet_source' => $objet_source,
									'id_objet_source' => $id,
									'objet' => $objet,
									'id_objet' => $id_objet,
									'action'=>'insert',
								),
								'data' => $id_objet
							)
						);
					}
					else
						$echec = true;
			}
		}
	}
	return ($echec?false:$ins);
}

/**
 * Fabriquer la condition where en tenant compte des jokers *
 *
 * @internal
 * @param string $primary
 * @param int|string|array $id_source
 * @param string $objet
 * @param int|string|array $id_objet
 * @return array
 */
function lien_where($primary, $id_source, $objet, $id_objet){
	if ((!is_array($id_source) AND !strlen($id_source))
	  OR !strlen($objet)
	  OR (!is_array($id_objet) AND !strlen($id_objet)))
		return array("0=1"); // securite

	$not="";
	if (is_array($id_source) AND reset($id_source)=="NOT"){
		$not = array_shift($id_source);
		$id_source = reset($id_source);
	}
	$where = array();
	if ($id_source!=='*')
		$where[] = (is_array($id_source)?sql_in(addslashes($primary),array_map('intval',$id_source),$not):addslashes($primary) . ($not?"<>":"=") . intval($id_source));
	elseif ($not)
		$where[] = "0=1"; // idiot mais quand meme

	$not="";
	if (is_array($id_objet) AND reset($id_objet)=="NOT"){
		$not = array_shift($id_objet);
		$id_objet = reset($id_objet);
	}

	if ($objet!=='*')
		$where[] = "objet=".sql_quote($objet);
	if ($id_objet!=='*')
		$where[] = (is_array($id_objet)?sql_in('id_objet',array_map('intval',$id_objet),$not):"id_objet" . ($not?"<>":"=") . intval($id_objet));
	elseif ($not)
		$where[] = "0=1"; // idiot mais quand meme

	return $where;
}

/**
 * Sous fonction suppression
 * qui traite les liens pour un objet source dont la clé primaire
 * et la table de lien sont fournies
 *
 * $objets et de la forme
 * array($objet=>$id_objets,...)
 * un * pour $id,$objet,$id_objets permet de traiter par lot
 *
 * @internal
 * @param string $objet_source
 * @param string $primary
 * @param sgring $table_lien
 * @param int $id
 * @param array $objets
 * @return bool|int
 */
function lien_delete($objet_source,$primary,$table_lien,$id,$objets){
	$retire = array();
	$dels = 0;
	$echec = false;
	foreach($objets as $objet => $id_objets){
		$objet = ($objet=='*')?$objet:objet_type($objet); # securite
		if (!is_array($id_objets) OR reset($id_objets)=="NOT") $id_objets = array($id_objets);
		foreach($id_objets as $id_objet) {
			// id_objet peut valoir '*'
			$where = lien_where($primary, $id, $objet, $id_objet);
			// lire les liens existants pour propager la date de modif
			$liens = sql_allfetsel("$primary,id_objet,objet",$table_lien,$where);
			// iterer sur les liens pour permettre aux plugins de gerer
			foreach($liens as $l){
				// Envoyer aux plugins
				$id_o = pipeline('pre_edition_lien',
					array(
						'args' => array(
							'table_lien' => $table_lien,
							'objet_source' => $objet_source,
							'id_objet_source' => $l[$primary],
							'objet' => $l['objet'],
							'id_objet' => $l['id_objet'],
							'action'=>'delete',
						),
						'data' => $l['id_objet']
					)
				);
				if ($id_o=intval($id_o)){
					$where = lien_where($primary, $l[$primary], $l['objet'], $id_o);
					$e = sql_delete($table_lien, $where);
					if ($e!==false){
						$dels+=$e;
						lien_propage_date_modif($l['objet'],$id_o);
						lien_propage_date_modif($objet_source,$l[$primary]);
					}
					else
						$echec = true;
					$retire[] = array('source'=>array($objet_source=>$l[$primary]),'lien'=>array($l['objet']=>$id_o),'type'=>$l['objet'],'id'=>$id_o);
					// Envoyer aux plugins
					pipeline('post_edition_lien',
						array(
							'args' => array(
								'table_lien' => $table_lien,
								'objet_source' => $objet_source,
								'id_objet_source' => $l[$primary],
								'objet' => $l['objet'],
								'id_objet' => $id_o,
								'action'=>'delete',
							),
							'data' => $id_o
						)
					);
				}
			}
		}
	}
	pipeline('trig_supprimer_objets_lies',$retire);

	return ($echec?false:$dels);
}


/**
 * Sous fonction optimisation
 * qui nettoie les liens morts (vers un objet inexistant)
 * pour un objet source dont la clé primaire
 * et la table de lien sont fournies
 *
 * $objets et de la forme
 * array($objet=>$id_objets,...)
 * un * pour $id,$objet,$id_objets permet de traiter par lot
 *
 * @internal
 * @param string $objet_source
 * @param string $primary
 * @param sgring $table_lien
 * @param int $id
 * @param array $objets
 * @return bool|int
 */
function lien_optimise($objet_source,$primary,$table_lien,$id,$objets){
	include_spip('genie/optimiser');
	$echec = false;
	$dels = 0;
	foreach($objets as $objet => $id_objets){
		$objet = ($objet=='*')?$objet:objet_type($objet); # securite
		if (!is_array($id_objets) OR reset($id_objets)=="NOT") $id_objets = array($id_objets);
		foreach($id_objets as $id_objet) {
			$where = lien_where($primary, $id, $objet, $id_objet);
			# les liens vers un objet inexistant
			$r = sql_select("DISTINCT objet",$table_lien,$where);
			while ($t = sql_fetch($r)){
				$type = $t['objet'];
				$spip_table_objet = table_objet_sql($type);
				$id_table_objet = id_table_objet($type);
				$res = sql_select("L.$primary AS id,L.id_objet",
					// la condition de jointure inclue L.objet='xxx' pour ne joindre que les bonnes lignes
					// du coups toutes les lignes avec un autre objet ont un id_xxx=NULL puisque LEFT JOIN
					// il faut les eliminier en repetant la condition dans le where L.objet='xxx'
								"$table_lien AS L
									LEFT JOIN $spip_table_objet AS O
										ON (O.$id_table_objet=L.id_objet AND L.objet=".sql_quote($type).")",
						"L.objet=".sql_quote($type)." AND O.$id_table_objet IS NULL");
				// sur une cle primaire composee, pas d'autres solutions que de virer un a un
				while ($row = sql_fetch($res)){
					$e = sql_delete($table_lien, array("$primary=".$row['id'],"id_objet=".$row['id_objet'],"objet=".sql_quote($type)));
					if ($e!=false){
						$dels+=$e;
						spip_log("Entree ".$row['id']."/".$row['id_objet']."/$type supprimee dans la table $table_lien",_LOG_INFO_IMPORTANTE);
					}
				}
			}

			# les liens depuis un objet inexistant
			$table_source = table_objet_sql($objet_source);
			// filtrer selon $id, $objet, $id_objet eventuellement fournis
			// (en general '*' pour chaque)
			$where = lien_where("L.$primary", $id, $objet, $id_objet);
			$where[] = "O.$primary IS NULL";
			$res = sql_select("L.$primary AS id",
				      "$table_lien AS L LEFT JOIN $table_source AS O ON L.$primary=O.$primary",
							$where);
			$dels+= optimiser_sansref($table_lien, $primary, $res);
		}
	}
	return ($echec?false:$dels);
}


/**
 * Sous fonction qualification
 * qui traite les liens pour un objet source dont la clé primaire
 * et la table de lien sont fournies
 *
 * $objets et de la forme
 * array($objet=>$id_objets,...)
 * un * pour $id,$objet,$id_objets permet de traiter par lot
 * 
 * exemple :
 * $qualif = array('vu'=>'oui');
 *
 * @internal
 * @param string $objet_source
 * @param string $primary
 * @param sgring $table_lien
 * @param int $id
 * @param array $objets
 * @param array $qualif
 * @return bool|int
 */
function lien_set($objet_source,$primary,$table_lien,$id,$objets,$qualif){
	$echec = null;
	$ok = 0;
	if (!$qualif)
		return false;
	// nettoyer qualif qui peut venir directement d'un objet_trouver_lien :
	unset($qualif[$primary]);
	unset($qualif[$objet_source]);
	if (isset($qualif['objet'])) {
		unset($qualif[$qualif['objet']]);
	}
	unset($qualif['objet']);
	unset($qualif['id_objet']);
	foreach($objets as $objet => $id_objets){
		$objet = ($objet=='*')?$objet:objet_type($objet); # securite
		if (!is_array($id_objets) OR reset($id_objets)=="NOT") $id_objets = array($id_objets);
		foreach($id_objets as $id_objet) {
			$where = lien_where($primary, $id, $objet, $id_objet);
			$e = sql_updateq($table_lien,$qualif,$where);
			if ($e===false)
				$echec = true;
		  else
			  $ok++;
		}
	}
	return ($echec?false:$ok);
}

/**
 * Sous fonction trouver
 * qui cherche les liens pour un objet source dont la clé primaire
 * et la table de lien sont fournies
 *
 * $objets et de la forme
 * array($objet=>$id_objets,...)
 * un * pour $id,$objet,$id_objets permet de traiter par lot
 *
 *
 * @internal
 * @param string $objet_source
 * @param string $primary
 * @param sgring $table_lien
 * @param int $id
 * @param array $objets
 * @return array
 */
function lien_find($objet_source,$primary,$table_lien,$id,$objets){
	$trouve = array();
	foreach($objets as $objet => $id_objets){
		$objet = ($objet=='*')?$objet:objet_type($objet); # securite
		// lien_where prend en charge les $id_objets sous forme int ou array
		$where = lien_where($primary, $id, $objet, $id_objets);
		$liens = sql_allfetsel('*',$table_lien,$where);
		// ajouter les entrees objet_source et objet cible par convenance
		foreach($liens as $l) {
			$l[$objet_source] = $l[$primary];
			$l[$objet] = $l['id_objet'];
			$trouve[] = $l;
		}
	}
	return $trouve;
}

/**
 * Propager la date_modif sur les objets dont un lien a été modifié
 *
 * @internal
 * @param string $objet
 * @param array|int $ids
 */
function lien_propage_date_modif($objet,$ids){
	$trouver_table = charger_fonction('trouver_table','base');

	$table = table_objet_sql($objet);
	if ($desc = $trouver_table($table)
	 AND isset($desc['field']['date_modif'])){
		$primary = id_table_objet($objet);
		$where = (is_array($ids)?sql_in($primary, array_map('intval',$ids)):"$primary=".intval($ids));
		sql_updateq($table, array('date_modif'=>date('Y-m-d H:i:s')), $where);
	}
}
?>
session.php000066600000002530152525474530006760 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

// Pour poser une variable de session
// poster sur cette action en indiquant var/val
// reponse : json contenant toutes les variables publiques de la session
// http://doc.spip.org/@action_session_dist
function action_session_dist()
{
	if ($var = _request('var')
	AND preg_match(',^[a-z_0-9-]+$,i', $var)
	) {
		if ($_SERVER['REQUEST_METHOD'] == 'POST'){
			include_spip('inc/session');
			session_set('session_'.$var, $val=_request('val'));
			#spip_log("autosave:$var:$val",'autosave');
		}
	}

	# TODO: mode lecture de session ; n'afficher que ce qu'il faut
	#echo json_encode($GLOBALS['visiteur_session']);
}


?>
calculer_taille_cache.php000066600000005023152525474530011544 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;



/**
 * Calculer la taille du cache ou du cache image pour l'afficher en ajax sur la page d'admin de SPIP
 *
 * @param string|null $arg
 */
function action_calculer_taille_cache_dist($arg=null){
	if (is_null($arg)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}
	include_spip('inc/filtres');

	if ($arg=='images'){
		$taille = calculer_taille_dossier(_DIR_VAR);
		$res = _T('ecrire:taille_cache_image',
		array(
			'dir' => joli_repertoire(_DIR_VAR),
			'taille' => "<b>".(taille_en_octets($taille) > 0 ? taille_en_octets($taille) : "0 octet")."</b>"
			)
		);
	}
	else {
		include_spip('inc/invalideur');
		$taille =
			calculer_taille_dossier(_DIR_CACHE_XML)
			+calculer_taille_dossier(_DIR_CACHE.'skel/')
			+calculer_taille_dossier(_DIR_CACHE.'wheels/')
			+calculer_taille_dossier(_DIR_CACHE.'contextes/')
		;
		$taille += intval(taille_du_cache());
		if ($taille<=150000){
			$res = _T('taille_cache_vide');
		}
		elseif ($taille<=1024*1024){
			$res = _T('taille_cache_moins_de',array('octets'=>taille_en_octets(1024*1024)));
		}
		else {
			$res = _T('taille_cache_octets',array('octets'=>taille_en_octets($taille)));
		}
		$res = "<b>$res</b>";
	}
	
	$res = "<p>$res</p>";
	ajax_retour($res);
}


/**
 * Calculer la taille d'un dossier, sous dossiers inclus
 *
 * http://doc.spip.org/@calculer_taille_dossier
 *
 * @param $dir
 * @return int
 */
function calculer_taille_dossier ($dir) {
	$handle = @opendir($dir);
	if (!$handle) return 0;
	$taille = 0;
	while (($fichier = @readdir($handle)) !== false) {
		// Eviter ".", "..", ".htaccess", etc.
		if ($fichier[0] == '.') continue;
		if (is_file($d = "$dir/$fichier")) {
			$taille += filesize($d);
		}
		else if (is_dir($d))
			$taille += calculer_taille_dossier($d);
	}
	closedir($handle);
	return $taille;
}

?>etre_webmestre.php000066600000003307152525474530010314 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

include_spip('inc/actions');

/**
 * Prouver qu'on a les droits de webmestre via un ftp, et
 * devenir webmestre sans refaire l'install
 * @return void
 */
function action_etre_webmestre_dist() {
	$securiser_action = charger_fonction('securiser_action', 'inc');
	$time = $securiser_action();

	if (time()-$time<15*60
		AND $GLOBALS['visiteur_session']['statut']=='0minirezo'
		AND $GLOBALS['visiteur_session']['webmestre']!=='oui') {
		$action = _T('info_admin_etre_webmestre');
		$admin = charger_fonction('admin', 'inc');
		// lance la verif par ftp et l'appel
		// a base_etre_webmestre_dist quand c'est OK
		if ($r = $admin('etre_webmestre', $action)) {
			echo $r;
			exit;
		}
	}

}

function base_etre_webmestre_dist() {
	if ($GLOBALS['visiteur_session']['statut']=='0minirezo' AND $GLOBALS['visiteur_session']['webmestre']!=='oui') {
		include_spip('action/editer_auteur');
		instituer_auteur($GLOBALS['visiteur_session']['id_auteur'], array('webmestre'=>'oui'), true);
	}
}
?>
editer_auteur.php000066600000024142152525474530010141 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

// http://doc.spip.org/@action_editer_auteur_dist
function action_editer_auteur_dist($arg=null) {

	if (is_null($arg)){
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}


	// si id_auteur n'est pas un nombre, c'est une creation
	if (!$id_auteur = intval($arg)) {

		if (($id_auteur = auteur_inserer()) > 0){

			# cf. GROS HACK
			# recuperer l'eventuel logo charge avant la creation
			# ils ont un id = 0-id_auteur de la session
			$id_hack = 0 - $GLOBALS['visiteur_session']['id_auteur'];
			$chercher_logo = charger_fonction('chercher_logo', 'inc');
			if (list($logo) = $chercher_logo($id_hack, 'id_auteur', 'on'))
				rename($logo, str_replace($id_hack, $id_auteur, $logo));
			if (list($logo) = $chercher_logo($id_hack, 'id_auteur', 'off'))
				rename($logo, str_replace($id_hack, $id_auteur, $logo));
		}
	}

	// Enregistre l'envoi dans la BD
	$err = "";
	if ($id_auteur > 0)
		$err = auteur_modifier($id_auteur);

	if ($err)
		spip_log("echec editeur auteur: $err",_LOG_ERREUR);

	return array($id_auteur,$err);
}

/**
 * Inserer un auteur en base
 * @param string $source
 * @return int
 */
function auteur_inserer($source=null) {

	// Ce qu'on va demander comme modifications
	$champs = array();
	$champs['source'] = $source?$source:'spip';

	$champs['login'] = '';
	$champs['statut'] = '5poubelle';  // inutilisable tant qu'il n'a pas ete renseigne et institue
	$champs['webmestre'] = 'non';

	// Envoyer aux plugins
	$champs = pipeline('pre_insertion',
		array(
			'args' => array(
				'table' => 'spip_auteurs',
			),
			'data' => $champs
		)
	);
	$id_auteur = sql_insertq("spip_auteurs", $champs);
	pipeline('post_insertion',
		array(
			'args' => array(
				'table' => 'spip_auteurs',
				'id_objet' => $id_auteur
			),
			'data' => $champs
		)
	);
	return $id_auteur;
}


/**
 * Appelle toutes les fonctions de modification d'un auteur
 *
 * @param int $id_auteur
 * @param array $set
 * @param bool $force_update
 *   permet de forcer la maj en base des champs fournis, sans passer par instancier
 *   utilise par auth/spip
 * @return string
 */
function auteur_modifier($id_auteur, $set = null, $force_update=false) {

	include_spip('inc/modifier');
	include_spip('inc/filtres');
	$c = collecter_requests(
		// white list
		objet_info('auteur','champs_editables'),
		// black list
		$force_update?array():array('webmestre','pass','login'),
		// donnees eventuellement fournies
		$set
	);

	if ($err = objet_modifier_champs('auteur', $id_auteur,
		array(
			'data' => $set,
			'nonvide' => array('nom' => _T('ecrire:item_nouvel_auteur'))
		),
		$c))
		return $err;
	$session = $c;

	$err = '';
	if (!$force_update){
		// Modification de statut, changement de rubrique ?
		$c = collecter_requests(
			// white list
			array(
			 'statut', 'new_login','new_pass','login','pass','webmestre','restreintes','id_parent'
			),
			// black list
			array(),
			// donnees eventuellement fournies
			$set
		);
		if (isset($c['new_login']) AND !isset($c['login']))
			$c['login'] = $c['new_login'];
		if (isset($c['new_pass']) AND !isset($c['pass']))
			$c['pass'] = $c['new_pass'];
		$err = auteur_instituer($id_auteur, $c);
		$session = array_merge($session,$c);
	}

	// .. mettre a jour les sessions de cet auteur
	include_spip('inc/session');
	$session['id_auteur'] = $id_auteur;
	unset($session['new_login']);
	unset($session['new_pass']);
	actualiser_sessions($session);

	return $err;
}

/**
 * Associer un auteur a des objets listes sous forme
 * array($objet=>$id_objets,...)
 * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
 *
 * on peut passer optionnellement une qualification du (des) lien(s) qui sera
 * alors appliquee dans la foulee.
 * En cas de lot de liens, c'est la meme qualification qui est appliquee a tous
 *
 * @param int $id_auteur
 * @param array $objets
 * @param array $qualif
 * @return string
 */
function auteur_associer($id_auteur,$objets, $qualif = null){
	include_spip('action/editer_liens');
	return objet_associer(array('auteur'=>$id_auteur), $objets, $qualif);
}


/**
 * Ancien nommage pour compatibilite
 * @param int $id_auteur
 * @param array $c
 * @return string
 */
function auteur_referent($id_auteur,$c){
	return auteur_associer($id_auteur,$c);
}

/**
 * Dossocier un auteur des objets listes sous forme
 * array($objet=>$id_objets,...)
 * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
 *
 * un * pour $id_auteur,$objet,$id_objet permet de traiter par lot
 *
 * @param int $id_auteur
 * @param array $objets
 * @return string
 */
function auteur_dissocier($id_auteur,$objets){
	include_spip('action/editer_liens');
	return objet_dissocier(array('auteur'=>$id_auteur), $objets);
}

/**
 * Qualifier le lien d'un auteur avec les objets listes
 * array($objet=>$id_objets,...)
 * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type
 * exemple :
 * $c = array('vu'=>'oui');
 * un * pour $id_auteur,$objet,$id_objet permet de traiter par lot
 *
 * @param int $id_auteur
 * @param array $objets
 * @param array $qualif
 * @return bool|int
 */
function auteur_qualifier($id_auteur,$objets,$qualif){
	include_spip('action/editer_liens');
	return objet_qualifier_liens(array('auteur'=>$id_auteur), $objets, $qualif);
}


/**
 * Modifier le statut d'un auteur, ou son login/pass
 * http://doc.spip.org/@instituer_auteur
 * @param  $id_auteur
 * @param  $c
 * @param bool $force_webmestre
 * @return bool|string
 */
function auteur_instituer($id_auteur, $c, $force_webmestre = false) {
	if (!$id_auteur=intval($id_auteur))
		return false;
	$erreurs = array(); // contiendra les differentes erreurs a traduire par _T()
	$champs = array();

	// les memoriser pour les faire passer dans le pipeline pre_edition
	if (isset($c['login']) AND strlen($c['login']))
		$champs['login'] = $c['login'];
	if (isset($c['pass']) AND strlen($c['pass']))
		$champs['pass'] = $c['pass'];

	$statut =	$statut_ancien = sql_getfetsel('statut','spip_auteurs','id_auteur='.intval($id_auteur));
	
	if (isset($c['statut'])
	  AND (autoriser('modifier', 'auteur', $id_auteur,null, array('statut' => $c['statut']))))
		$statut = $champs['statut'] = $c['statut'];

	// Restreindre avant de declarer l'auteur
	// (section critique sur les droits)
	if ($c['id_parent']) {
		if (is_array($c['restreintes']))
			$c['restreintes'][] = $c['id_parent'];
		else
			$c['restreintes'] = array($c['id_parent']);
	}

	if (isset($c['webmestre'])
	  AND ($force_webmestre OR autoriser('modifier', 'auteur', $id_auteur,null, array('webmestre' => '?'))))
		$champs['webmestre'] = $c['webmestre']=='oui'?'oui':'non';
	
	// Envoyer aux plugins
	$champs = pipeline('pre_edition',
		array(
			'args' => array(
				'table' => 'spip_auteurs',
				'id_objet' => $id_auteur,
				'action' => 'instituer',
				'statut_ancien' => $statut_ancien,
			),
			'data' => $champs
		)
	);
	
	if (is_array($c['restreintes'])
	AND autoriser('modifier', 'auteur', $id_auteur, NULL, array('restreint'=>$c['restreintes']))) {
		$rubriques = array_map('intval',$c['restreintes']);
		$rubriques = array_unique($rubriques);
		$rubriques = array_diff($rubriques,array(0));
		auteur_dissocier($id_auteur, array('rubrique'=>'*'));
		auteur_associer($id_auteur,array('rubrique'=>$rubriques));
	}

	$flag_ecrire_acces = false;
	// commencer par traiter les cas particuliers des logins et pass
	// avant les autres ecritures en base
	if (isset($champs['login']) OR isset($champs['pass'])){
		$auth_methode = sql_getfetsel('source','spip_auteurs','id_auteur='.intval($id_auteur));
		include_spip('inc/auth');
		if (isset($champs['login']) AND strlen($champs['login']))
			if (!auth_modifier_login($auth_methode, $champs['login'], $id_auteur))
				$erreurs[] = 'ecrire:impossible_modifier_login_auteur';
		if (isset($champs['pass']) AND strlen($champs['pass'])){
			$champs['login'] = sql_getfetsel('login','spip_auteurs','id_auteur='.intval($id_auteur));
			if (!auth_modifier_pass($auth_methode, $champs['login'], $champs['pass'], $id_auteur))
				$erreurs[] = 'ecrire:impossible_modifier_pass_auteur';
		}
		unset($champs['login']);
		unset($champs['pass']);
		$flag_ecrire_acces = true;
	}

	if (!count($champs)) return implode(' ', array_map('_T', $erreurs));
	sql_updateq('spip_auteurs', $champs , 'id_auteur='.$id_auteur);

	// .. mettre a jour les fichiers .htpasswd et .htpasswd-admin
	if ($flag_ecrire_acces
	  OR isset($champs['statut'])
	  ) {
		include_spip('inc/acces');
		ecrire_acces();
	}

	// Invalider les caches
	include_spip('inc/invalideur');
	suivre_invalideur("id='auteur/$id_auteur'");
	
	// Pipeline
	pipeline('post_edition',
		array(
			'args' => array(
				'table' => 'spip_auteurs',
				'id_objet' => $id_auteur,
				'action' => 'instituer',
				'statut_ancien' => $statut_ancien,
			),
			'data' => $champs
		)
	);


	// Notifications
	if ($notifications = charger_fonction('notifications', 'inc')) {
		$notifications('instituerauteur', $id_auteur,
			array('statut' => $statut, 'statut_ancien' => $statut_ancien)
		);
	}

	return implode(' ', array_map('_T', $erreurs));

}




function insert_auteur($source=null) {
	return auteur_inserer($source);
}
function auteurs_set($id_auteur, $set = null) {
	return auteur_modifier($id_auteur,$set);
}
function instituer_auteur($id_auteur, $c, $force_webmestre = false) {
	return auteur_instituer($id_auteur,$c,$force_webmestre);
}
// http://doc.spip.org/@revision_auteur
function revision_auteur($id_auteur, $c=false) {
	return auteur_modifier($id_auteur,$c);
}

?>
confirmer_email.php000066600000002723152525474530010434 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;


// Cette action permet de confirmer un changement d'email

function action_confirmer_email_dist()
{
	$securiser_action = charger_fonction('securiser_action', 'inc');
	$arg = $securiser_action();

	include_spip('inc/filtres');
	if ($GLOBALS['visiteur_session']['id_auteur'] AND email_valide($arg)){
		include_spip('action/editer_auteur');
		auteur_modifier($GLOBALS['visiteur_session']['id_auteur'],array('email'=>$arg));
	}
	// verifier avant de rediriger pour invalider le message de confirmation
	// si ca n'a pas marche
	if ($redirect = _request('redirect') AND !$arg == sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.intval($GLOBALS['visiteur_session'])))
		$GLOBALS['redirect'] = parametre_url($redirect, 'email_modif','');

}

?>
purger.php000066600000004314152525474530006603 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

// http://doc.spip.org/@action_purger_dist
function action_purger_dist($arg=null)
{
	if (is_null($arg)) {
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}

	include_spip('inc/invalideur');

	spip_log("purger $arg");

	switch ($arg) {
		case 'inhibe_cache':
			// inhiber le cache pendant 24h
			ecrire_meta('cache_inhib',$_SERVER['REQUEST_TIME']+24*3600);
			break;
		case 'reactive_cache':
			effacer_meta('cache_inhib');
			break;

		case 'cache':
			supprime_invalideurs();
			@spip_unlink(_CACHE_RUBRIQUES);
			@spip_unlink(_CACHE_CHEMIN);
			@spip_unlink(_DIR_TMP."plugin_xml_cache.gz");
			// on ne supprime que _CACHE_PLUGINS_OPT qui declenche la reconstruction des 3
			// _CACHE_PIPELINES _CACHE_PLUGINS_PATH et _CACHE_PLUGINS_FCT
			// pour eviter des problemes de concurence
			// cf http://core.spip.org/issues/2989
			//@spip_unlink(_CACHE_PIPELINES);
			//@spip_unlink(_CACHE_PLUGINS_PATH);
			//@spip_unlink(_CACHE_PLUGINS_FCT);
			@spip_unlink(_CACHE_PLUGINS_OPT);
			purger_repertoire(_DIR_CACHE,array('subdir'=>true));
			purger_repertoire(_DIR_AIDE);
			purger_repertoire(_DIR_VAR.'cache-css');
			purger_repertoire(_DIR_VAR.'cache-js');
			break;

		case 'squelettes':
			purger_repertoire(_DIR_SKELS);
			break;

		case 'vignettes':
			purger_repertoire(_DIR_VAR,array('subdir'=>true));
			supprime_invalideurs();
			purger_repertoire(_DIR_CACHE);
			break;
	}

	// le faire savoir aux plugins
	pipeline('trig_purger',$arg);
}

?>
menu_rubriques.php000066600000011443152525474530010345 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

include_spip('inc/autoriser');
include_spip('inc/texte');
include_spip('inc/filtres');

function action_menu_rubriques_dist() {

	// si pas acces a ecrire, pas acces au menu
	// on renvoi un 401 qui fait echouer la requete ajax silencieusement
	if (!autoriser('ecrire')){
		$retour = "<ul class='cols_1'><li class='toutsite'><a href='".generer_url_ecrire('accueil')."'>"._T('public:lien_connecter')."</a></li></ul>";
		include_spip('inc/actions');
		ajax_retour($retour);
		exit;
	}

	if ($date = intval(_request('date')))
		header("Last-Modified: ".gmdate("D, d M Y H:i:s", $date)." GMT");

	$r = gen_liste_rubriques();
	if (!$r
	AND isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
	AND !strstr($_SERVER['SERVER_SOFTWARE'],'IIS/')) {
		include_spip('inc/headers');
		header('Content-Type: text/html; charset='. $GLOBALS['meta']['charset']);
		http_status(304);
		exit;
	} else {
		include_spip('inc/actions');
		$ret = menu_rubriques();
		ajax_retour($ret);
	}
}

function menu_rubriques($complet = true){
	$ret = "<li class='toutsite'><a href='".generer_url_ecrire('plan')."'>"._T('info_tout_site')."</a></li>";

	if (!$complet) {
		return "<ul class='cols_1'>$ret\n</ul>\n";
	}

	if (!isset($GLOBALS['db_art_cache'])){
		gen_liste_rubriques();
	}
	$arr_low = extraire_article(0, $GLOBALS['db_art_cache']);

	$total_lignes = $i = sizeof($arr_low);

	if ($i > 0) {
		$nb_col = min(8,ceil($total_lignes / 30));
		if ($nb_col <= 1) $nb_col =  ceil($total_lignes / 10);
		foreach( $arr_low as $id_rubrique => $titre_rubrique) {
			if (autoriser('voir','rubrique',$id_rubrique)){
			  $ret .= bandeau_rubrique($id_rubrique, $titre_rubrique, $i);
			  $i++;
			}
		}

		$ret = "<ul class='cols_$nb_col'>"
		  . $ret
		  . "\n</ul>\n";
	}
	else
		$ret = "<ul class='cols_1'>$ret\n</ul>\n";
	
	return $ret;
}

// http://doc.spip.org/@bandeau_rubrique
function bandeau_rubrique($id_rubrique, $titre_rubrique, $zdecal) {
	static $zmax = 6;

	$nav = "<a href='"
	. generer_url_entite($id_rubrique,'rubrique','','',false)
	. "'>"
	. supprimer_tags(preg_replace(',[\x00-\x1f]+,', ' ', $titre_rubrique))
	. "</a>\n";

	// Limiter volontairement le nombre de sous-menus
	if (!(--$zmax)) {
		$zmax++;
		return "\n<li>$nav</li>";
	}

	$arr_rub = extraire_article($id_rubrique, $GLOBALS['db_art_cache']);
	$i = sizeof($arr_rub);
	if (!$i) {
		$zmax++;
		return "\n<li>$nav</li>";
	}


	$nb_col = 1;
	if ($nb_rub = count($arr_rub)) {
		$nb_col = min(10,max(1,ceil($nb_rub / 10)));
	}
	$ret = "<li class='haschild'>$nav<ul class='cols_$nb_col'>";
	foreach( $arr_rub as $id_rub => $titre_rub) {
		if (autoriser('voir','rubrique',$id_rub)){
			$titre = supprimer_numero(typo($titre_rub));
			$ret .= bandeau_rubrique($id_rub, $titre, $zdecal+$i);
			$i++;
		}
	}
	$ret .= "</ul></li>\n";
	$zmax++;
	return $ret;
}


// http://doc.spip.org/@extraire_article
function extraire_article($id_p, $t) {
	return array_key_exists($id_p, $t) ?  $t[$id_p]: array();
}

// http://doc.spip.org/@gen_liste_rubriques
function gen_liste_rubriques() {

	include_spip('inc/config');
	// ici, un petit fichier cache ne fait pas de mal
	$last = lire_config('date_calcul_rubriques', 0);
	if (lire_fichier(_CACHE_RUBRIQUES, $cache)) {
		list($date,$GLOBALS['db_art_cache']) = @unserialize($cache);
		if ($date == $last) return false; // c'etait en cache :-)
	}
	// se restreindre aux rubriques utilisees recemment +secteurs

	$where = sql_in_select("id_rubrique", "id_rubrique", "spip_rubriques", "", "", "id_parent=0 DESC, date DESC", _CACHE_RUBRIQUES_MAX);

	// puis refaire la requete pour avoir l'ordre alphabetique

	$res = sql_select("id_rubrique, titre, id_parent", "spip_rubriques", $where, '', 'id_parent, 0+titre, titre');

	// il ne faut pas filtrer le autoriser voir ici
	// car on met le resultat en cache, commun a tout le monde
	$GLOBALS['db_art_cache'] = array();
	while ($r = sql_fetch($res)) {
		$t = sinon($r['titre'], _T('ecrire:info_sans_titre'));
		$GLOBALS['db_art_cache'][$r['id_parent']][$r['id_rubrique']] = supprimer_numero(typo($t));
	}

	$t = array($last ? $last : time(), $GLOBALS['db_art_cache']);
	ecrire_fichier(_CACHE_RUBRIQUES, serialize($t));
	return true;
}
?>
editer_objet.php000066600000032277152525474530007747 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 * Point d'entree d'edition d'un objet
 * on ne peut entrer que par un appel en fournissant $id et $objet
 * mais pas pas une url
 *
 * @param int $id
 * @param string $objet
 * @param array $set
 * @return array
 */
function action_editer_objet_dist($id=null, $objet=null, $set=null) {

	// appel direct depuis une url interdit
	if (is_null($id) OR is_null($objet)){
		include_spip('inc/minipres');
		echo minipres(_T('info_acces_interdit'));
		die();
	}

	// si id n'est pas un nombre, c'est une creation
	// mais on verifie qu'on a toutes les donnees qu'il faut.
	if (!$id = intval($id)) {
		// on ne sait pas si un parent existe mais on essaye
		$id_parent = _request('id_parent');
		$id = objet_inserer($objet, $id_parent);
	}

	if (!($id = intval($id))>0)
		return array($id,_L('echec enregistrement en base'));

	// Enregistre l'envoi dans la BD
	$err = objet_modifier($objet, $id, $set);

	return array($id,$err);
}

/**
 * Appelle toutes les fonctions de modification d'un objet
 * $err est un message d'erreur eventuelle
 *
 * @param string $objet
 * @param int $id
 * @param array|null $set
 * @return mixed|string
 */
function objet_modifier($objet, $id, $set=null) {
	if (include_spip('action/editer_'.$objet)
	  AND function_exists($modifier = $objet."_modifier"))
		return $modifier($id,$set);

	$table_sql = table_objet_sql($objet);
	$trouver_table = charger_fonction('trouver_table','base');
	$desc = $trouver_table($table_sql);
	if (!$desc OR !isset($desc['field'])) {
		spip_log("Objet $objet inconnu dans objet_modifier",_LOG_ERREUR);
		return _L("Erreur objet $objet inconnu");
	}
	include_spip('inc/modifier');

	$champ_date = '';
	if (isset($desc['date']) AND $desc['date'])
		$champ_date = $desc['date'];
	elseif (isset($desc['field']['date']))
		$champ_date = 'date';

	$white = array_keys($desc['field']);
	// on ne traite pas la cle primaire par defaut, notamment car
	// sur une creation, id_x vaut 'oui', et serait enregistre en id_x=0 dans la base
	$white = array_diff($white, array($desc['key']['PRIMARY KEY']));

	if (isset($desc['champs_editables']) AND is_array($desc['champs_editables'])) {
		$white = $desc['champs_editables'];
	}
	$c = collecter_requests(
		// white list
		$white,
		// black list
		array($champ_date,'statut','id_parent','id_secteur'),
		// donnees eventuellement fournies
		$set
	);

	// Si l'objet est publie, invalider les caches et demander sa reindexation
	if (objet_test_si_publie($objet,$id)){
		$invalideur = "id='$objet/$id'";
		$indexation = true;
	}
	else {
		$invalideur = "";
		$indexation = false;
	}

	if ($err = objet_modifier_champs($objet, $id,
		array(
			'data' => $set,
			'nonvide' => '',
			'invalideur' => $invalideur,
			'indexation' => $indexation,
			 // champ a mettre a date('Y-m-d H:i:s') s'il y a modif
			'date_modif' => (isset($desc['field']['date_modif'])?'date_modif':'')
		),
		$c))
		return $err;

	// Modification de statut, changement de rubrique ?
	// FIXME: Ici lorsqu'un $set est passé, la fonction collecter_requests() retourne tout
	//         le tableau $set hors black liste, mais du coup on a possiblement des champs en trop. 
	$c = collecter_requests(array($champ_date, 'statut', 'id_parent'),array(),$set);
	$err = objet_instituer($objet, $id, $c);

	return $err;
}

/**
 * Inserer en base un objet generique
 * @param string $objet
 * @param int $id_parent
 * @param array|null $set
 * @return bool|int
 */
function objet_inserer($objet, $id_parent=null, $set=null) {
	if (include_spip('action/editer_'.$objet)
	  AND function_exists($inserer = $objet."_inserer"))
		return $inserer($id_parent);

	$table_sql = table_objet_sql($objet);
	$trouver_table = charger_fonction('trouver_table','base');
	$desc = $trouver_table($table_sql);
	if (!$desc OR !isset($desc['field']))
		return 0;

	$lang_rub = "";
	$champs = array();
	if (isset($desc['field']['id_rubrique'])){
		// Si id_rubrique vaut 0 ou n'est pas definie, creer l'objet
		// dans la premiere rubrique racine
		if (!$id_rubrique = intval($id_parent)) {
			$row = sql_fetsel("id_rubrique, id_secteur, lang", "spip_rubriques", "id_parent=0",'', '0+titre,titre', "1");
			$id_rubrique = $row['id_rubrique'];
		}
		else
			$row = sql_fetsel("lang, id_secteur", "spip_rubriques", "id_rubrique=".intval($id_rubrique));

		$champs['id_rubrique'] = $id_rubrique;
		if (isset($desc['field']['id_secteur']))
			$champs['id_secteur'] = $row['id_secteur'];
		$lang_rub = $row['lang'];
	}

	// La langue a la creation : si les liens de traduction sont autorises
	// dans les rubriques, on essaie avec la langue de l'auteur,
	// ou a defaut celle de la rubrique
	// Sinon c'est la langue de la rubrique qui est choisie + heritee
	if (isset($desc['field']['lang']) AND $GLOBALS['meta']['multi_objets'] AND in_array($table_sql, explode(',', $GLOBALS['meta']['multi_objets']))) {
		lang_select($GLOBALS['visiteur_session']['lang']);
		if (in_array($GLOBALS['spip_lang'],
		explode(',', $GLOBALS['meta']['langues_multilingue']))) {
			$champs['lang'] = $GLOBALS['spip_lang'];
			if (isset($desc['field']['langue_choisie']))
				$champs['langue_choisie'] = 'oui';
		}
	}
	elseif (isset($desc['field']['lang']) AND isset($desc['field']['langue_choisie'])) {
		$champs['lang'] = ($lang_rub ? $lang_rub : $GLOBALS['meta']['langue_site']);
		$champs['langue_choisie'] = 'non';
	}

	if (isset($desc['field']['statut'])){
		if (isset($desc['statut_textes_instituer'])){
			$cles_statut = array_keys($desc['statut_textes_instituer']); 
			$champs['statut'] = reset($cles_statut);
		}
		else
			$champs['statut'] = 'prepa';
	}


	if ((isset($desc['date']) AND $d=$desc['date']) OR isset($desc['field'][$d='date']))
		$champs[$d] = date('Y-m-d H:i:s');

	if ($set)
		$champs = array_merge($champs, $set);

	// Envoyer aux plugins
	$champs = pipeline('pre_insertion',
		array(
			'args' => array(
				'table' => $table_sql,
			),
			'data' => $champs
		)
	);

	$id = sql_insertq($table_sql, $champs);

	if ($id){
		pipeline('post_insertion',
			array(
				'args' => array(
					'table' => $table_sql,
					'id_objet' => $id,
				),
				'data' => $champs
			)
		);

		// controler si le serveur n'a pas renvoye une erreur
		// et associer l'auteur sinon
		// si la table n'a pas deja un champ id_auteur
		// et si le form n'a pas poste un id_auteur (meme vide, ce qui sert a annuler cette auto association)
		if ($id > 0
		  AND !isset($desc['field']['id_auteur'])){
			$id_auteur = ((is_null(_request('id_auteur')) AND isset($GLOBALS['visiteur_session']['id_auteur']))?
				$GLOBALS['visiteur_session']['id_auteur']
				:_request('id_auteur'));
		  if ($id_auteur) {
				include_spip('action/editer_auteur');
				auteur_associer($id_auteur, array($objet=>$id));
		  }
		}
	}

	return $id;
}


/**
 * $c est un array ('statut', 'id_parent' = changement de rubrique)
 * statut et rubrique sont lies, car un admin restreint peut deplacer
 * un objet publie vers une rubrique qu'il n'administre pas
 *
 * @param string $objet
 * @param int $id
 * @param array $c
 * @param bool $calcul_rub
 * @return mixed|string
 */
function objet_instituer($objet, $id, $c, $calcul_rub=true) {
	if (include_spip('action/editer_'.$objet)
	  AND function_exists($instituer = $objet."_instituer"))
		return $instituer($id,$c,$calcul_rub);

	$table_sql = table_objet_sql($objet);
	$trouver_table = charger_fonction('trouver_table','base');
	$desc = $trouver_table($table_sql);
	if (!$desc OR !isset($desc['field']))
		return _L("Impossible d'instituer $objet : non connu en base");

	include_spip('inc/autoriser');
	include_spip('inc/rubriques');
	include_spip('inc/modifier');

	$sel = array();
	$sel[] = (isset($desc['field']['statut'])?"statut":"'' as statut");

	$champ_date = '';
	if (isset($desc['date']) AND $desc['date'])
		$champ_date = $desc['date'];
	elseif (isset($desc['field']['date']))
		$champ_date = 'date';

	$sel[] = ($champ_date ? "$champ_date as date" : "'' as date");
	$sel[] = (isset($desc['field']['id_rubrique'])?'id_rubrique':"0 as id_rubrique");

	$row = sql_fetsel($sel, $table_sql, id_table_objet($objet).'='.intval($id));

	$id_rubrique = $row['id_rubrique'];
	$statut_ancien = $statut = $row['statut'];
	$date_ancienne = $date = $row['date'];
	$champs = array();

	$d = ($date AND isset($c[$champ_date]))?$c[$champ_date]:null;
	$s = (isset($desc['field']['statut']) AND isset($c['statut']))?$c['statut']:$statut;

	// cf autorisations dans inc/instituer_objet
	if ($s != $statut OR ($d AND $d != $date)) {
		if ($id_rubrique ?
				autoriser('publierdans', 'rubrique', $id_rubrique)
			:
				autoriser('instituer', $objet, $id, null, array('statut'=>$s))
			)
			$statut = $champs['statut'] = $s;
		else if ($s!='publie' AND autoriser('modifier', $objet, $id))
			$statut = $champs['statut'] = $s;
		else
			spip_log("editer_objet $id refus " . join(' ', $c));

		// En cas de publication, fixer la date a "maintenant"
		// sauf si $c commande autre chose
		// ou si l'objet est deja date dans le futur
		// En cas de proposition d'un objet (mais pas depublication), idem
		if ($champ_date) {
			if ($champs['statut'] == 'publie'
			 OR ($champs['statut'] == 'prop' AND !in_array($statut_ancien, array('publie', 'prop')))
			 OR $d
			) {
				if ($d OR strtotime($d=$date)>time())
					$champs[$champ_date] = $date = $d;
				else
					$champs[$champ_date] = $date = date('Y-m-d H:i:s');
			}
		}
	}

	// Verifier que la rubrique demandee existe et est differente
	// de la rubrique actuelle
	if ($id_rubrique
	  AND $id_parent = $c['id_parent']
	  AND $id_parent != $id_rubrique
	  AND (sql_fetsel('1', "spip_rubriques", "id_rubrique=".intval($id_parent)))) {
		$champs['id_rubrique'] = $id_parent;

		// si l'objet etait publie
		// et que le demandeur n'est pas admin de la rubrique
		// repasser l'objet en statut 'propose'.
		if ($statut == 'publie'
		AND !autoriser('publierdans', 'rubrique', $id_rubrique))
			$champs['statut'] = 'prop';
	}


	// Envoyer aux plugins
	$champs = pipeline('pre_edition',
		array(
			'args' => array(
				'table' => $table_sql,
				'id_objet' => $id,
				'action'=>'instituer',
				'statut_ancien' => $statut_ancien,
				'date_ancienne' => $date_ancienne,
				'id_parent_ancien' => $id_rubrique,
			),
			'data' => $champs
		)
	);

	if (!count($champs)) return '';

	// Envoyer les modifs.
	objet_editer_heritage($objet, $id, $id_rubrique, $statut_ancien, $champs, $calcul_rub);

	// Invalider les caches
	include_spip('inc/invalideur');
	suivre_invalideur("id='$objet/$id'");

	/*
	if ($date) {
		$t = strtotime($date);
		$p = @$GLOBALS['meta']['date_prochain_postdate'];
		if ($t > time() AND (!$p OR ($t < $p))) {
			ecrire_meta('date_prochain_postdate', $t);
		}
	}*/

	// Pipeline
	pipeline('post_edition',
		array(
			'args' => array(
				'table' => $table_sql,
				'id_objet' => $id,
				'action'=>'instituer',
				'statut_ancien' => $statut_ancien,
				'date_ancienne' => $date_ancienne,
				'id_parent_ancien' => $id_rubrique,
			),
			'data' => $champs
		)
	);

	// Notifications
	if ($notifications = charger_fonction('notifications', 'inc')) {
		$notifications("instituer$objet", $id,
			array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date'=>$date, 'date_ancienne' => $date_ancienne)
		);
	}

	return ''; // pas d'erreur
}

/**
 * fabrique la requete d'institution de l'objet, avec champs herites
 *
 * @param string $objet
 * @param int $id
 * @param int $id_rubrique
 * @param string $statut
 * @param array $champs
 * @param bool $cond
 * @return 
 */
function objet_editer_heritage($objet, $id, $id_rubrique, $statut, $champs, $cond=true) {
	$table_sql = table_objet_sql($objet);
	$trouver_table = charger_fonction('trouver_table','base');
	$desc = $trouver_table($table_sql);

	// Si on deplace l'objet
	// changer aussi son secteur et sa langue (si heritee)
	if (isset($champs['id_rubrique'])) {

		$row_rub = sql_fetsel("id_secteur, lang", "spip_rubriques", "id_rubrique=".sql_quote($champs['id_rubrique']));
		$langue = $row_rub['lang'];

		if (isset($desc['field']['id_secteur']))
			$champs['id_secteur'] = $row_rub['id_secteur'];

		if (isset($desc['field']['lang']) AND isset($desc['field']['langue_choisie']))
			if (sql_fetsel('1', $table_sql, id_table_objet($objet)."=".intval($id)." AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue))) {
				$champs['lang'] = $langue;
			}
	}

	if (!$champs) return;
	sql_updateq($table_sql, $champs, id_table_objet($objet).'='.intval($id));

	// Changer le statut des rubriques concernees
	if ($cond) {
		include_spip('inc/rubriques');
		//$postdate = ($GLOBALS['meta']["post_dates"] == "non" AND isset($champs['date']) AND (strtotime($champs['date']) < time()))?$champs['date']:false;
		$postdate = false;
		calculer_rubriques_if($id_rubrique, $champs, $statut, $postdate);
	}
}

?>
sauvegarder.php000066600000004106152525602650007602 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 *
 * On arrive ici depuis le #FORMULAIRE_SAUVEGARDER
 * - l'initialisation a ete faite avant redirection
 * - on enchaine sur inc/sauvegarder, qui remplit le dump et renvoie ici a chaque timeout
 * - a chaque coup on relance inc/sauvegarder
 * - lorsque inc/sauvegarder a fini, il retourne true
 * - on renvoie vers exec=sauvegarder pour afficher le resume
 *
 */

include_spip('base/dump');
include_spip('inc/dump');

/**
 * Sauvegarder par morceaux
 * 
 * @param string $arg
 */
function action_sauvegarder_dist($arg=null){
	if (!$arg) {
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}

	$status_file = $arg;
	$redirect = parametre_url(generer_action_auteur('sauvegarder',$status_file),"step",intval(_request('step')+1),'&');

	// lancer export qui va se relancer jusqu'a sa fin
	$sauvegarder = charger_fonction('sauvegarder', 'inc');
	utiliser_langue_visiteur();
	// quand on sort de $export avec true c'est qu'on a fini
	if ($sauvegarder($status_file,$redirect)) {
		dump_end($status_file,'sauvegarder');
		include_spip('inc/headers');
		echo redirige_formulaire(generer_url_ecrire("sauvegarder",'status='.$status_file,'',true, true));
	}

	// forcer l'envoi du buffer par tous les moyens !
	echo(str_repeat("<br />\r\n",256));
	while (@ob_get_level()){
		@ob_flush();
		@flush();
		@ob_end_flush();
	}
}

?>restaurer.php000066600000004171152525602650007310 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 *
 * On arrive ici depuis le #FORMULAIRE_RESTAURER
 * - l'initialisation a ete faite avant redirection
 * - on enchaine sur inc/restaurer, qui remplit le dump et renvoie ici a chaque timeout
 * - a chaque coup on relance inc/restaurer
 * - lorsque inc/restaurer a fini, il retourne true
 * - on renvoie vers exec=restaurer pour afficher le resume
 *
 */

include_spip('base/dump');
include_spip('inc/dump');

/**
 * Sauvegarder par morceaux
 * 
 * @param string $arg
 */
function action_restaurer_dist($arg=null){
	if (!$arg) {
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}

	$status_file = $arg;
	define('_DUMP_STATUS_FILE',$status_file);
	$status_file = _DIR_TMP.basename($status_file).".txt";
	if (!lire_fichier($status_file, $status)
		OR !$status = unserialize($status)) {

		include_spip('inc/headers');
		echo redirige_formulaire(generer_url_ecrire("restaurer",'status='._DUMP_STATUS_FILE,'',true, true));
	}
	else {
		utiliser_langue_visiteur();
		$archive = "<br />".joli_repertoire($status['archive']);
		$action = _T('dump:info_restauration_sauvegarde', array('archive' => $archive));
		$admin = charger_fonction('admin', 'inc');
		echo $admin('restaurer', $action, "", true);
	}

	// forcer l'envoi du buffer par tous les moyens !
	echo(str_repeat("<br />\r\n",256));
	while (@ob_get_level()){
		@ob_flush();
		@flush();
		@ob_end_flush();
	}

}

?>telecharger_dump.php000066600000003552152525602650010610 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

include_spip('inc/dump');
include_spip('inc/autoriser');

/**
 * Telecharger un dump quand on est webmestre
 * 
 * @param string $arg
 */
function action_telecharger_dump_dist($arg=null){
	if (!$arg) {
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}

	$file = dump_repertoire().basename($arg,'.sqlite').'.sqlite';

	if (
		file_exists($file)
		AND autoriser('webmestre')){

		$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);
	}
	else{
		http_status(404);
		include_spip('inc/minipres');
		echo minipres(_T('erreur').' 404',
			_T('info_acces_interdit'));
	}

	// et on finit comme ca d'un coup
	exit;
}

?>quete_calendrier_prive.php000066600000011406152525604770012020 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

/**
 * Fournir une liste d'"evenements" entre deux dates start et end
 * au format json
 * utilise pour l'affichage du calendrier prive et public
 * 
 * @return void
 */
function action_quete_calendrier_prive_dist(){
	$securiser_action = charger_fonction('securiser_action','inc');
	$securiser_action();

	$start = _request('start');
	$end = _request('end');
	$quoi = _request('quoi');

	include_spip('inc/quete_calendrier');

	$evt = array();

	// recuperer la liste des evenements au format ics
	$start = date('Y-m-d H:i:s',$start);
	$end = date('Y-m-d H:i:s',$end);
	$limites = array(sql_quote($start),sql_quote($end));

	// on fonction de quoi on récupère : tout (rv + publication) ou l'un ou l'autre.
	$entier = $duree = array();

	if (!$quoi OR $quoi=='rv') {
		$duree = quete_calendrier_interval_rv(reset($limites), end($limites));
		$evt = convert_fullcalendar_quete_calendrier_interval_rv($duree, $evt);
	}

	if (!$quoi OR $quoi=='publication') {
		list($entier,) = quete_calendrier_interval($limites);
		$evt = convert_fullcalendar_quete_calendrier_interval($entier, $evt);
	}


	// permettre aux plugins d'afficher leurs evenements dans ce calendrier
	$evt = pipeline('quete_calendrier_prive',
		array(
			'args' => array('start' => $start, 'end' => $end, 'quoi'=>$quoi),
			'data' => $evt,
		)
	);

	// format json
	include_spip('inc/json');
	echo json_encode($evt);
}

/**
 * Convertir une date au format ical renvoyee par quete_calendrier_interval
 * dans le format attendu par fullcalendar : yyyy-mm-dd H:i:s
 * @param $dateical
 * @return string
 */
function convert_dateical($dateical){
	$d = explode('T',$dateical);
	$amj = reset($d);
	$s = substr($amj,0,4).'-'.substr($amj,4,2).'-'.substr($amj,6,2);
	if (count($d)>1){
		$his = end($d);
		$s .= ' '.substr($his,0,2).":".substr($his,2,2).":".substr($his,4,2);
	}
	return $s;
}

/**
 * Convertir une sortie événement de quète calendrier_interval
 * dans le format attendu par fullcalendar
 *
 * @param array $messages
 *     Les événements / messages au format de la quete calendrier_interval
 * @param array $evt
 *     Les événements au format fullcalendar déjà présents
 * @return array
 *     Les événements au format fullcalendar
**/
function convert_fullcalendar_quete_calendrier_interval($messages, $evt = array()) {
	if (!$messages) return $evt;

	// la retransformer au format attendu par fullcalendar
	// facile : chaque evt n'est mentionne qu'une fois, a une date
	foreach($messages as $amj=>$l){
		$date = substr($amj,0,4).'-'.substr($amj,4,2).'-'.substr($amj,6,2);
		foreach($l as $e){
			$evt[] = array(
				'id' => 0,
				'title' => $e['SUMMARY'],
				'allDay' => true,
				'start' => $date,
				'end' => $date,
				'url' => str_replace('&amp;','&',$e['URL']),
				'className' => "calendrier-event ".$e['CATEGORIES'],
				'description' => $e['DESCRIPTION'],
			);
		}
	}

	return $evt;
}

/**
 * Convertir une sortie événement de quete calendrier_interval_rv
 * dans le format attendu par fullcalendar
 *
 * @param array $messages
 *     Les événements / messages au format issu de la quete calendrier_interval_rv
 * @param array $evt
 *     Les événements au format fullcalendar déjà présents
 * @return array
 *     Les événements au format fullcalendar
**/
function convert_fullcalendar_quete_calendrier_interval_rv($messages, $evt = array()) {
	if (!$messages) return $evt;

	// ici il faut faire attention : un evt apparait N fois
	// mais on a son id
	$seen = array();

	// toutes les messages déjà inscrits qu'on ne remet pas
	foreach ($evt as $e) {
		$seen[$e['url']] = true;
	}

	foreach($messages as $amj=>$l){
		foreach($l as $id=>$e){
			$url = str_replace('&amp;','&',$e['URL']);
			if (!isset($seen[$url])) {
				$evt[] = array(
					'id' => $id,
					'title' => $e['SUMMARY'],
					'allDay' => false,
					'start' => convert_dateical($e['DTSTART']), //Ymd\THis
					'end' => convert_dateical($e['DTEND']), // Ymd\THis
					'url' => $url,
					'className' => "calendrier-event ".$e['CATEGORIES'],
					'description' => $e['DESCRIPTION'],
				);
				$seen[$url] = true;
			}
		}
	}

	return $evt;
}
quete_autocomplete.php000066600000002155152525604770011205 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;

function action_quete_autocomplete_dist(){
	$securiser_action = charger_fonction('securiser_action','inc');
	$arg = $securiser_action();
	if ($arg
	  AND $arg==$GLOBALS['visiteur_session']['id_auteur']){
		include_spip('inc/actions');
		echo ajax_retour(
			recuperer_fond('prive/squelettes/inclure/organiseur-autocomplete-auteur',array('q'=>_request('q'))),
			'text/plain'
		);
	}
}supprimer_message.php000066600000002242152525604770011030 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;


/**
 * @param int $id_message
 * @return void
 */
function action_supprimer_message_dist($id_message=null){
	if (is_null($id_message)){
		$securiser_action = charger_fonction('securiser_action','inc');
		$id_message = $securiser_action();
	}


	include_spip('inc/autoriser');
	if (autoriser('supprimer','message',$id_message)){
		include_spip('action/editer_objet');
		objet_modifier('message',$id_message,array('statut'=>'poub'));
	}
}envoyer_message.php000066600000002425152525604770010474 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;


/**
 * @param int $id_message
 * @return void
 */
function action_envoyer_message_dist($id_message=null){

	if (is_null($id_message)){
		$securiser_action = charger_fonction('securiser_action','inc');
		$id_message = $securiser_action();
	}

	include_spip('inc/autoriser');
	if (intval($id_message)
		AND $type=sql_getfetsel('type','spip_messages','id_message='.intval($id_message))
	  AND autoriser('envoyermessage',$type, $id_message)){

		include_spip('action/editer_objet');
		objet_modifier('message',$id_message,array('statut'=>'publie'));
	}

}effacer_messagerecu.php000066600000002452152525604770011257 0ustar00<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2016                                                *
 *  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;


/**
 * @param int $id_auteur
 * @param int $id_message
 * @return void
 */
function action_effacer_messagerecu_dist($id_auteur=null,$id_message=null){
	if (is_null($id_auteur) OR is_null($id_message)){
		$securiser_action = charger_fonction('securiser_action','inc');
		$arg = $securiser_action();
		list($id_auteur,$id_message) = explode('-',$arg);
	}


	include_spip('inc/autoriser');
	if (autoriser('effacer','messagerecu',$id_message,null,array('id_auteur'=>$id_auteur))){
		include_spip('inc/messages');
		messagerie_effacer_message_recu($id_auteur,$id_message);
	}
}compagnon.php000066600000000757152525605640007265 0ustar00<?php

if (!defined('_ECRIRE_INC_VERSION')) return;


function action_compagnon_dist() {
	$securiser_action = charger_fonction('securiser_action','inc');
	$arg = $securiser_action();
	
	if (substr($arg,0,8) !== 'compris/') {
		include_spip('inc/minipres');
		echo minipres("Arguments de l'action compagnon non compris");
		exit;
	}
	$quoi = substr($arg,8);
	$auteur = $GLOBALS['visiteur_session']['id_auteur'];

	include_spip('inc/config');
	ecrire_config("compagnon/$auteur/$quoi", 1);
	
}

?>