uawdijnntqw1x1x1
IP : 216.73.216.249
Hostname : webm001.cluster110.gra.hosting.ovh.net
Kernel : Linux webm001.cluster110.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
OS : Linux
PATH:
/
home
/
etiennec
/
www
/
b9da6
/
..
/
b594c
/
..
/
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("&","&",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('&', '&', $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('&','&',$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; } ?>
/home/etiennec/www/b9da6/../b594c/../f1f54/action.tar