Your IP : 216.73.216.216


Current Path : /home/e/t/i/etiennec/www/f1f54/
Upload File :
Current File : /home/e/t/i/etiennec/www/f1f54/action.tar

instituer_langue_rubrique.php000066600000003551152502550250012565 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.   *
\***************************************************************************/

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'");
	}
}
?>
inscrire_auteur.php000066600000024154152502550250010473 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.   *
\***************************************************************************/

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
 * @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';

	// eviter aussi qu'il soit trop long (essayer d'attraper le prenom)
	if (strlen($login_base) > 10) {
		$login_base = preg_replace("/^(.{4,}(_.{1,7})?)_.*/",
			'\1', $login_base);
		$login_base = substr($login_base, 0,13);
	}

	$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']);

	$message = recuperer_fond('modeles/mail_inscription',$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));
}purger_queue.php000066600000002007152502550250007771 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.   *
\***************************************************************************/

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();
	}

}

?>supprimer_rubrique.php000066600000004610152502550250011227 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.   *
\***************************************************************************/

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'");
	}
}

?>
iconifier.php000066600000007626152502550250007244 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.   *
\***************************************************************************/

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);
	}
}
?>
purger.php000066600000004314152502550250006570 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.   *
\***************************************************************************/

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

?>
editer_rubrique.php000066600000022714152502550250010462 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.   *
\***************************************************************************/

/**
 * 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(
			'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);
}
activer_plugins.php000066600000005130152502550250010457 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.   *
\***************************************************************************/

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();
}

?>
debloquer_edition.php000066600000002353152502550250010762 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.   *
\***************************************************************************/

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);
		}
	}
}
?>
reorganiser.php000066600000006062152502550250007606 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.   *
\***************************************************************************/

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


?>
confirmer_inscription.php000066600000004651152502550250011675 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.   *
\***************************************************************************/

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

}

?>
supprimer_lien.php000066600000002130152502550250010313 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.   *
\***************************************************************************/

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


?>
etre_webmestre.php000066600000003307152502550250010301 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.   *
\***************************************************************************/

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);
	}
}
?>
ajouter_lien.php000066600000002125152502550250007742 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.   *
\***************************************************************************/

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


?>
cookie.php000066600000006460152502550250006541 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.   *
\***************************************************************************/

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

?>
redirect.php000066600000002572152502550250007071 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.   *
\***************************************************************************/

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

?>
converser.php000066600000004711152502550250007273 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.   *
\***************************************************************************/

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);
		}
	}
}
?>
menu_rubriques.php000066600000011443152502550250010332 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.   *
\***************************************************************************/

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;
}
?>
super_cron.php000066600000003424152502550250007444 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.   *
\***************************************************************************/

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;
}
?>instituer_objet.php000066600000002613152502550250010475 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.   *
\***************************************************************************/

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

}

?>annuler_job.php000066600000002022152502550250007554 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.   *
\***************************************************************************/

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

?>editer_article.php000066600000025265152502550250010253 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.   *
\***************************************************************************/

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(
			'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);
}
?>
auth.php000066600000002716152502550250006231 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.   *
\***************************************************************************/

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


?>
editer_liens.php000066600000050070152502550250007732 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.   *
\***************************************************************************/

/**
 * 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);
	}
}
?>
preferer.php000066600000004207152502550250007077 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.   *
\***************************************************************************/

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;

	}
}
?>
forcer_job.php000066600000002141152502550250007372 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.   *
\***************************************************************************/

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

}

?>referencer_traduction.php000066600000006160152502550250011641 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.   *
\***************************************************************************/

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


?>
instituer_langue_objet.php000066600000003350152502550250012027 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.   *
\***************************************************************************/

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
 * @return string
 */
function action_instituer_langue_objet_dist($objet,$id, $id_rubrique, $changer_lang) {
	if ($changer_lang) {
		$table_objet_sql = table_objet_sql($objet);
		$id_table_objet = id_table_objet($objet);

		if ($changer_lang != "herit") {
			sql_updateq($table_objet_sql, array('lang'=>$changer_lang, 'langue_choisie'=>'oui'), "$id_table_objet=".intval($id));
			include_spip('inc/rubriques');
			$langues = calculer_langues_utilisees();
			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'];
			sql_updateq($table_objet_sql, array('lang'=>$langue_parent, 'langue_choisie'=>'non'), "$id_table_objet=".intval($id));
			$changer_lang = $langue_parent;
		}
	}
	return $changer_lang;
}
editer_objet.php000066600000032254152502550250007727 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.   *
\***************************************************************************/

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(
			'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);
	}
}

?>
tester_taille.php000066600000006350152502550250010126 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.   *
\***************************************************************************/

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

?>
desinstaller_plugin.php000066600000003235152502550250011334 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.   *
\***************************************************************************/

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');
	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);
	}
}
?>
index.php000066600000000002152502550250006361 0ustar00X
logout.php000066600000011245152502550250006576 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.   *
\***************************************************************************/

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

?>confirmer_email.php000066600000002723152502550250010421 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.   *
\***************************************************************************/

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','');

}

?>
session.php000066600000002530152502550250006745 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.   *
\***************************************************************************/

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


?>
editer_auteur.php000066600000024117152502550250010130 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.   *
\***************************************************************************/

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(
			'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);
}

?>
tester.php000066600000011577152502550250006603 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.   *
\***************************************************************************/

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'));
}
?>
calculer_taille_cache.php000066600000005023152502550250011531 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.   *
\***************************************************************************/

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

?>editer_breve.php000066600000014154152503074350007731 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.   *
\***************************************************************************/

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);
}
?>effacer_messagerecu.php000066600000002452152503076250011247 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.   *
\***************************************************************************/

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);
	}
}supprimer_message.php000066600000002242152503076250011020 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.   *
\***************************************************************************/

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.php000066600000002425152503076250010464 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.   *
\***************************************************************************/

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

}quete_autocomplete.php000066600000002155152503076250011175 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.   *
\***************************************************************************/

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'
		);
	}
}quete_calendrier_prive.php000066600000011406152503076250012010 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.   *
\***************************************************************************/

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;
}
instituer_forum.php000066600000006423152503076300010525 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.   *
\***************************************************************************/

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

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

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

	list($id_forum, $statut) = preg_split('/\W/', $arg);
	$id_forum = intval($id_forum);
	$row = sql_fetsel("*", "spip_forum", "id_forum=$id_forum");
	if (!$row) return;

	instituer_un_forum($statut,$row);
}

function instituer_un_forum($statut,$row){

	$id_forum = $row['id_forum'];
	$old = $row['statut'];
 // rien a faire si pas de changement de statut
 	if ($old==$statut)
		return;

	// changer le statut de toute l'arborescence dependant de ce message
	$id_messages = array($id_forum);
	while ($id_messages) {
		sql_updateq("spip_forum", array("statut" => $statut), sql_in("id_forum", $id_messages) ." AND statut = '$old'");

		$id_messages = array_map('reset',sql_allfetsel("id_forum", "spip_forum", sql_in("id_parent", $id_messages)));
	}

	// Notifier de la publication du message, s'il etait 'prop'
	if ($old=='prop' AND $statut=='publie') {
		if ($notifications = charger_fonction('notifications', 'inc')) {
			$notifications('forumvalide', $id_forum);
		}
	}

	// mettre a jour la date du thread
	// si publie, ou que tout le thread est prive,
	// mettre la date du thread a 'maintenant' (date de publi du message)
	// sinon prendre la date_heure du dernier message public
	// c'est imparfait dans le cas ou les crayons ont ete utilises pour modifier ce message entre temps
	// car la date_thread aurait cette derniere date alors que pas le message
	// mais c'est au mieux de ce que l'on peut faire quand on depublie un SPAM ou supprime un message
	if ($statut=='publie' OR $old=='publie') {
		if ($statut=='publie'
			OR !($date_thread = sql_getfetsel("date_heure", "spip_forum", "statut='publie' AND id_thread=".$row['id_thread'], "", "date_heure DESC","0,1"))){
			$date_thread = date('Y-m-d H:i:s');
		}
		sql_updateq("spip_forum", array("date_thread" => $date_thread), "id_thread=".$row['id_thread']);
	}

	// invalider les pages comportant ce forum
	include_spip('inc/invalideur');
	suivre_invalideur("id='forum/$id_forum'");
	suivre_invalideur("id='".$row['objet']."/".$row['id_objet']."'");

	// Reindexation du thread (par exemple)
	pipeline('post_edition',
		array(
			'args' => array(
				'table' => 'spip_forum',
				'table_objet' => 'forums',
				'spip_table_objet' => 'spip_forum',
				'type' => 'forum',
				'id_objet' => $id_forum,
				'action' => 'instituer',
				'statut_ancien'=> $old,
			),
			'data' => array('statut'=>$statut)
		)
	);
}

?>
editer_forum.php000066600000005675152503076300007763 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.   *
\***************************************************************************/

if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/modifier');

// Nota: quand on edite un forum existant, il est de bon ton d'appeler
// au prealable conserver_original($id_forum)
// http://code.spip.net/@revision_forum
if(!function_exists('revision_forum')){
	function revision_forum($id_forum, $c=false) {

		$t = sql_fetsel("*", "spip_forum", "id_forum=".intval($id_forum));
		if (!$t) {
			spip_log("erreur forum $id_forum inexistant");
			return;
		}

		// Calculer l'invalideur des caches lies a ce forum
		if ($t['statut'] == 'publie') {
			include_spip('inc/invalideur');
			$invalideur = array("id='forum/$id_forum'","id='".$t['objet']."/".$t['id_objet']."'");
		} else
			$invalideur = '';

		// Supprimer 'http://' tout seul
		if (isset($c['url_site'])) {
			include_spip('inc/filtres');
			$c['url_site'] = vider_url($c['url_site'], false);
		}

		$err = objet_modifier_champs('forum', $id_forum,
			array(
				'nonvide' => array('titre' => _T('info_sans_titre')),
				'invalideur' => $invalideur
			),
			$c);

		$id_thread = $t["id_thread"];
		$cles = array();
		foreach (array('id_objet', 'objet') as $k) {
			if (isset($c[$k]) AND $c[$k]) $cles[$k] = $c[$k];
		}

		// Modification des id_article etc
		// (non autorise en standard mais utile pour des crayons)
		// on deplace tout le thread {sauf les originaux}.
		if (count($cles) AND $id_thread) {
			spip_log("update thread id_thread=$id_thread avec ".var_export($cles,1),'forum.'. _LOG_INFO_IMPORTANTE);
			sql_updateq("spip_forum", $cles, "id_thread=".$id_thread." AND statut!='original'");
			// on n'affecte pas $r, car un deplacement ne change pas l'auteur
		}

		// s'il y a vraiment eu une modif et que le message est public
		// on enregistre le nouveau date_thread
		if ($err==='' AND $t['statut'] == 'publie') {
			// on ne stocke ni le numero IP courant ni le nouvel id_auteur
			// dans le message modifie (trop penible a l'usage) ; mais du
			// coup attention a la responsabilite editoriale
			/*
			sql_updateq('spip_forum', array('ip'=>($GLOBALS['ip']), 'id_auteur'=>($GLOBALS['visiteur_session']['id_auteur'])),"id_forum=".intval($id_forum));
			*/

			// & meme ca ca pourrait etre optionnel
			sql_updateq("spip_forum", array("date_thread" => date('Y-m-d H:i:s')), "id_thread=".$id_thread);
		}
	}
}
instituer_lot_forum.php000066600000005544152503076300011406 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.   *
\***************************************************************************/

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

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

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

	// verifier les droits
	if (autoriser('instituer','forum',0)){

		/**
		 * Cas 1 : les arguments sont explicites
		 * statut-ip/email/id_auteur/auteur
		 *
		 */
		if (preg_match(",^(\w+)-,",$arg,$match)
		 AND in_array($statut=$match[1],array('publie','off','spam'))){
			$arg = substr($arg,strlen($statut)+1);

			$arg = explode('/',$arg);
			$ip = array_shift($arg);
			$email_auteur = array_shift($arg);
			$id_auteur = intval(array_shift($arg));
			$auteur = implode('/',$arg);
			$where = array();
			// pas de moderation par lot sur les forum prives
			$where[] = sql_in('statut',array('privadm','prive','privrac'),'NOT');
			if ($ip) $where[] = "ip=".sql_quote($ip);
			if ($email_auteur) $where[] = "email_auteur=".sql_quote($email_auteur);
			if ($id_auteur) $where[] = "id_auteur=".intval($id_auteur);
			if ($auteur) $where[] = "auteur=".sql_quote($auteur);
			$rows = sql_allfetsel("*", "spip_forum", $where);
			if (!count($rows)) return;

			include_spip('action/instituer_forum');
			foreach ($rows as $row) {
				instituer_un_forum($statut,$row);
			}
		}
		/**
		 * Cas 2 : seul le statut est explicite et signe
		 * les id concernes sont passes en arg supplementaires
		 * dans un taleau ids[]
		 */
		elseif (preg_match(",^(\w+)$,",$arg,$match)
		 AND in_array($statut=$match[1],array('publie','off','spam'))
		 AND $id=_request('ids')
		 AND is_array($id)){

			$ids = array_map('intval',$id);
			$where = array();
			// pas de moderation par lot sur les forum prives
			$where[] = sql_in('statut',array('privadm','prive','privrac'),'NOT');
			$where[] = sql_in('id_forum',$ids);
			$rows = sql_allfetsel("*", "spip_forum", $where);
			if (!count($rows)) return;

			include_spip('action/instituer_forum');
			foreach ($rows as $row) {
				instituer_un_forum($statut,$row);
			}
		}
	}
	else {
		spip_log("instituer_lot_forum interdit pour auteur ".$GLOBALS['visiteur_session']['id_auteur'],_LOG_ERREUR);
	}

}

?>
actionner.php000066600000004140152503302550007242 0ustar00<?php

/**
 * Gestion de l'action actionner
 *
 * @plugin SVP pour SPIP
 * @license GPL
 * @package SPIP\SVP\Actions
 */
 
if (!defined("_ECRIRE_INC_VERSION")) return;

/**
 * Action effectuant 1 action dans la liste des actions à réaliser
 * sur les plugins.
 *
 * Cette action sera relancée tant qu'il reste des actions à faire
 */
function action_actionner_dist() {
	// droits
	include_spip('inc/autoriser');
	if (!autoriser('configurer', '_plugins')) {
		include_spip('inc/minipres');
		echo minipres();
		exit;
	}

	include_spip('inc/svp_actionner');
	include_spip('inc/headers');
	$actionneur = new Actionneur();
	$actionneur->get_actions();
	if ($actionneur->one_action()) {
		// si SVP a été enlevé des actifs, on redirige sur la fin...
		// sinon cette page d'action/actionner devient introuvable.
		// dans ce cas précis, les autres actions prévues venant après la desactivation de SVP
		// ne pourront être traitees... SVP n'étant plus là !
		if ($actionneur->tester_si_svp_desactive()) {
			$url = _request('redirect');
		} else {
			$url = generer_action_auteur('actionner', '',  _request('redirect'));
		}

		// en mode pas à pas, on affiche un bilan entre chaque action
		// et on demande a l'utilistateur de cliquer pour realiser
		// l'action suivante.
		include_spip('inc/config');
		if (lire_config('svp/mode_pas_a_pas') == 'oui') {
			include_spip('inc/minipres');
			$pres = $actionneur->presenter_actions();
			$btn = "<a href='$url'>[ Action Suivante ]</a>";
			$styles = "
				<style type='text/css'>
				#minipres #actionner .fail {color:#c30000;}
				#minipres #actionner ul {margin-left: 0.5em;}
				#minipres #actionner li {list-style-type:square; margin-left: 0.5em;}
				</style>";
			echo minipres( _T('svp:installation_en_cours'), $pres . '<br /><br />' . $btn . $styles);
			die();
		}

		redirige_par_entete(str_replace('&amp;','&', $url));
	}
	
	include_spip('inc/svp_depoter_local');
	svp_actualiser_paquets_locaux();

	if (!_request('redirect'))
		$GLOBALS['redirect'] = generer_url_ecrire('admin_plugin');
	else
		$GLOBALS['redirect'] = str_replace('&amp;','&', _request('redirect'));

}

?>
editer_depot.php000066600000005570152503302550007737 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.   *
\***************************************************************************/

/**
 * Gestion de l'action editer_depot
 *
 * @plugin SVP pour SPIP
 * @license GPL
 * @package SPIP\SVP\Actions
 */
if (!defined("_ECRIRE_INC_VERSION")) return;

/**
 * Action de mise à jour des descriptions d'un dépot 
 *
 * @return array
 *     Liste identifiant du dépot, texte d'erreur éventuel
**/
function action_editer_depot_dist() {

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

	// Verification des autorisations
	if (!autoriser('webmestre')) {
		include_spip('inc/minipres');
		echo minipres();
		exit();
	}

	// Le depot n'est jamais cree par une edition mais via le formulaire ajouter_depot
	// On est toujours en presence d'une mise a jour pour cette action, l'id_depot
	// doit donc etre renseigne sinon c'est une erreur
	if ($id_depot = intval($arg)) {
		// On teste si l'auteur est connecte. Si non on renvoie sur le formulaire login
		$id_auteur = $GLOBALS['visiteur_session']['id_auteur'];
		if (!($id_auteur)) {
			include_spip('inc/headers');
			redirige_url_ecrire();
		}

		// On met a jour le depot avec les saisies
		if (sql_updateq('spip_depots', 
						array('titre'=> _request('titre'), 
							'descriptif'=> _request('descriptif'),
							'type'=> _request('type')),
						'id_depot=' . sql_quote($id_depot)));
			// Enregistre l'envoi dans la BD
			// Dans le cas du depot rien n'est fait actuellement, on garde cette fonction
			// par souci de coherence avec les autres editions d'objet et pour usage futur
			$err = depots_set($id_depot);
			if (!$err)
				spip_log("ACTION MODIFIER DEPOT (manuel) : id_depot = ". $id_depot, 'svp_actions.' . _LOG_INFO);
	}

	return array($id_depot, $err);
}


/**
 * Appelle toutes les fonctions de modification d'un dépot
 * $err est de la forme '&trad_err=1'
 *
 * @note
 *     Cette fonction ne fait rien actuellement !!
 * 
 * @param int $id_depot
 *     Identifiant du dépot
 * @return string
 *     Texte d'une eventuelle erreur
**/
function depots_set($id_depot) {
	$err = '';

	// unifier $texte en cas de texte trop long
	// - non utilisabe sur le descriptif aujourd'huiez

	// Enregistrer les revisions
	// - revisions_depot()

	// Modifier le statut ?
	// - instituer_depot()

	return $err;
}

?>
actualiser_depot.php000066600000002672152503302550010617 0ustar00<?php
/**
 * Gestion de l'action actualiser_depot
 *
 * @plugin SVP pour SPIP
 * @license GPL
 * @package SPIP\SVP\Actions
 */
 
/**
 * Action de mise à jour en base de données de la liste des plugins
 * d'un ou de tous les dépots
 */
function action_actualiser_depot_dist(){

	// Securisation: aucun argument attendu
	$securiser_action = charger_fonction('securiser_action', 'inc');
	$arg = $securiser_action();

	// Verification des autorisations
	if (!autoriser('webmestre')) {
		include_spip('inc/minipres');
		echo minipres();
		exit();
	}

	// Actualisation des plugins du depot ou de tous les plugins suivant l'argument de l'action
	// Le depot lui-meme n'est mis a jour que partiellement via le fichier XML une fois que
	// la premiere insertion a ete effectuee. En effet, seules les infos non editables dans le prive
	// peuvent etre actualisees lors de cette action
	include_spip('inc/svp_depoter_distant');
	if ($arg === 'tout') {
		if ($ids_depots = sql_allfetsel('id_depot', 'spip_depots')) {
			$ids_depots = array_map('reset', $ids_depots);
			foreach ($ids_depots as $_id_depot)
				svp_actualiser_depot($_id_depot);
			// On consigne l'action
			spip_log("ACTION ACTUALISER TOUS LES DEPOTS (manuel)", 'svp_actions.' . _LOG_INFO);
		}
	}
	else if ($id_depot = intval($arg)) {
		svp_actualiser_depot($id_depot);
		// On consigne l'action
		spip_log("ACTION ACTUALISER DEPOT (manuel) : id_depot = ". $id_depot, 'svp_actions.' . _LOG_INFO);
	}
}

?>
supprimer_depot.php000066600000001442152503302550010503 0ustar00<?php
/**
 * Gestion de l'action supprimer_depot
 *
 * @plugin SVP pour SPIP
 * @license GPL
 * @package SPIP\SVP\Actions
 */
 
/**
 * Action de suppression en base de données d'un dépot et de ses plugins
 *
 * @return void
 */
function action_supprimer_depot_dist(){

	// Securisation: aucun argument attendu
	$securiser_action = charger_fonction('securiser_action', 'inc');
	$arg = $securiser_action();

	// Verification des autorisations
	if (!autoriser('webmestre')) {
		include_spip('inc/minipres');
		echo minipres();
		exit();
	}

	// Suppression du depot et de ses plugins
	if ($id_depot = intval($arg)) {
		include_spip('inc/svp_depoter_distant');
		svp_supprimer_depot($id_depot);
		spip_log("ACTION SUPPRIMER DEPOT (manuel) : id_depot = ". $id_depot, 'svp_actions.' . _LOG_INFO);
	}
}

?>
teleporter.php000066600000006133152503302550007451 0ustar00<?php
/**
 * Gestion de l'action teleporter
 *
 * @plugin SVP pour SPIP
 * @license GPL
 * @package SPIP\SVP\Actions
 */
 

/**
 * Téléporter et déballer un composant
 * 
 * @param string $methode
 *   http|git|svn|...
 * @param string $source
 *   URL source du composant
 * @param string $dest
 *   Chemin du répertoire où déballer le composant. Inclus le dernier segment
 * @param array $options
 *   revision => ''
 *   --ignore-externals
 * @return bool|string
 *   String : texte d'une erreur
 *   true si l'opération est correctement réalisée
 */
function action_teleporter_composant_dist($methode,$source,$dest,$options=array()){
	# Si definie a '', le chargeur est interdit ; mais on n'aurait de toutes
	# facons jamais pu venir ici avec toutes les securisations faites :^)

	if (!preg_match(','.substr(_DIR_LIB,0,-1).',',$dest) && !_DIR_PLUGINS_AUTO) 
		die('Vous ne pouvez pas télécharger, absence de _DIR_PLUGINS_AUTO');

	// verifier que la methode est connue
	if (!$teleporter =  charger_fonction($methode,"teleporter",true)){
		spip_log("Methode $methode inconnue pour teleporter $source vers $dest","teleport"._LOG_ERREUR);
		return _T('svp:erreur_teleporter_methode_inconue',array('methode' => $methode));
	}

	if (!$dest = teleporter_verifier_destination($d = $dest)){
		spip_log("Rerpertoire $d non accessible pour teleporter $source vers $d","teleport"._LOG_ERREUR);
		return _T('svp:erreur_teleporter_destination_erreur',array('dir' => $d));
		#$texte = "<p>"._T('plugin_erreur_droit1',array('dest'=>$dest))."</p>"
		#  . "<p>"._T('plugin_erreur_droit2').aide('install0')."</p>";
	}

	# destination temporaire des fichiers si besoin
	$options['dir_tmp'] = sous_repertoire(_DIR_CACHE, 'chargeur');

	return $teleporter($methode,$source,$dest,$options);
}


/**
 * Vérifier et préparer l'arborescence jusqu'au répertoire parent
 *
 * @param string $dest
 * @return bool|string
 *     false en cas d'échec
 *     Chemin du répertoire sinon
 */
function teleporter_verifier_destination($dest){
	$dest = rtrim($dest,"/");
	$final = basename($dest);
	$base = dirname($dest);
	$create = array();
	// on cree tout le chemin jusqu'a dest non inclus
	while (!is_dir($base)){
		$create[] = basename($base);
		$base = dirname($base);
	}
	while (count($create)){
		if (!is_writable($base))
			return false;
		$base = sous_repertoire($base,array_pop($create));
		if (!$base)
			return false;
	}

	if (!is_writable($base))
		return false;

	return $base."/$final";
}

/**
 * Déplace un répertoire pour libérer l'emplacement.
 *
 * Si le répertoire donné existe, le déplace dans un répertoire de backup.
 * Si ce backup existe déjà, il est supprimé auparavant.
 * Retourne le nouveau chemin du répertoire.
 * 
 * @param string $dest
 *     Chemin du répertoire à déplacer
 * @return string
 *     Nouveau chemin du répertoire s'il existait,
 *     Chaîne vide sinon
**/
function teleporter_nettoyer_vieille_version($dest){
	$old = "";
	if (is_dir($dest)){
		$dir = dirname($dest);
		$base = basename($dest);
		$old="$dir/.$base.bck";
		if (is_dir($old))
			supprimer_repertoire($old);
		rename($dest,$old);
	}
	return $old;
}