[SPIP] +2.1.12
[velocampus/web/www.git] / www / ecrire / inc / admin.php
diff --git a/www/ecrire/inc/admin.php b/www/ecrire/inc/admin.php
new file mode 100644 (file)
index 0000000..e6b0384
--- /dev/null
@@ -0,0 +1,181 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2011                                                *
+ *  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;
+
+// demande/verifie le droit de creation de repertoire par le demandeur;
+// memorise dans les meta que ce script est en cours d'execution
+// si elle y est deja c'est qu'il y a eu suspension du script, on reprend.
+
+// http://doc.spip.org/@inc_admin_dist
+function inc_admin_dist($script, $titre, $comment='', $anonymous=false)
+{
+       $reprise = true;
+       if (!isset($GLOBALS['meta'][$script])
+       OR  !isset($GLOBALS['meta']['admin'])) {
+               $reprise = false;
+               $res = debut_admin($script, $titre, $comment); 
+               if ($res) return $res;
+               spip_log("meta: $script " . join(',', $_POST));
+               ecrire_meta($script, serialize($_POST));
+       } 
+
+       $res = admin_verifie_session($script,$anonymous);
+       if ($res) return $res;
+       $base = charger_fonction($script, 'base');
+       $base($titre,$reprise);
+       fin_admin($script);
+       return '';
+}
+
+// Gestion dans la meta "admin" du script d'administation demande,
+// pour eviter des executions en parallele, notamment apres Time-Out.
+// Cette meta contient le nom du script et, a un hachage pres, du demandeur.
+// Le code de ecrire/index.php devie toute demande d'execution d'un script
+// vers le script d'administration indique par cette meta si elle est l�.
+// Au niveau de la fonction inc_admin, on controle la meta 'admin'.
+// Si la meta n'est pas la, 
+//     c'est le debut on la cree.
+// Sinon, si le hachage actuel est le meme que celui en base, 
+//     c'est une reprise, on continue
+// Sinon, si le hachage differe a cause du connecte,
+//     c'est une arrivee inoppotune, on refuse sa connexion.
+// Enfin, si hachage differe pour une autre raison
+//     c'est que l'operation se passe mal, on la stoppe
+
+// http://doc.spip.org/@admin_verifie_session
+function admin_verifie_session($script, $anonymous=false) {
+
+       include_spip('base/abstract_sql');
+       $pref = sprintf("_%d_",$GLOBALS['visiteur_session']['id_auteur']);
+       $signal = fichier_admin($script, "$script$pref");
+       $valeur = sql_getfetsel('valeur', 'spip_meta', "nom='admin'");
+       if ($valeur === NULL) {
+               ecrire_meta('admin', $signal, 'non');
+       } else {
+               if (!$anonymous AND ($valeur != $signal)) {
+                       if (intval(substr($valeur, strpos($valeur,'_')+1))<>
+                           $GLOBALS['visiteur_session']['id_auteur']) {
+                               include_spip('inc/minipres');
+                               spip_log("refus de lancer $script, priorite a $valeur");
+                               return minipres(_T('info_travaux_texte'));
+                       }
+               }
+       }
+       $journal = "spip";
+       if (autoriser('configurer')) // c'est une action webmestre, soit par ftp soit par statut webmestre
+               $journal = 'webmestre';
+       // on pourrait statuer automatiquement les webmestres a l'init d'une action auth par ftp ... ?
+
+       spip_log("admin $pref" . ($valeur ? " (reprise)" : ' (init)'),$journal);
+       return '';
+}
+
+// http://doc.spip.org/@dir_admin
+function dir_admin()
+{
+       if (autoriser('configurer')) {
+               return _DIR_TMP;
+       } else {
+               return  _DIR_TRANSFERT . $GLOBALS['visiteur_session']['login'] . '/';
+       }
+}
+
+// http://doc.spip.org/@fichier_admin
+function fichier_admin($action, $pref='admin_') {
+
+       return $pref . 
+         substr(md5($action.(time() & ~2047).$GLOBALS['visiteur_session']['login']), 0, 10);
+}
+
+// demande la creation d'un repertoire et sort
+// ou retourne sans rien faire si repertoire deja la.
+
+// http://doc.spip.org/@debut_admin
+function debut_admin($script, $action='', $corps='') {
+
+       if ((!$action) || (!autoriser('chargerftp'))) {
+               include_spip('inc/minipres');
+               return minipres();
+       } else {
+               $dir = dir_admin();
+               $signal = fichier_admin($script);
+               if (@file_exists($dir . $signal)) {
+                       spip_log ("Action admin: $action");
+                       return '';
+               }
+               include_spip('inc/minipres');
+
+       // Si on est un super-admin, un bouton de validation suffit
+       // sauf dans les cas destroy
+               if ((autoriser('webmestre') OR $script === 'admin_repair')
+               AND $script != 'delete_all') {
+                       if (_request('validation_admin') == $signal) {
+                               spip_log ("Action super-admin: $action");
+                               return '';
+                       }
+                       $corps .= '<input type="hidden" name="validation_admin" value="'.$signal.'" />';
+                       $suivant = _T('bouton_valider');
+                       $js = '';
+               } else {
+                       $corps .= "<fieldset><legend>"
+                       . _T('info_authentification_ftp')
+                       . aide("ftp_auth")
+                       . "</legend>\n<label for='fichier'>"
+                       . _T('info_creer_repertoire')
+                       . "</label>\n"
+                       . "<input type='text' class='formo' size='40' id='fichier' name='fichier' value='"
+                       . $signal
+                       . "' /><br />"
+                       . _T('info_creer_repertoire_2', array('repertoire' => joli_repertoire($dir)))
+                       . "</fieldset>";
+
+                       $suivant = _T('bouton_recharger_page');
+
+       // code volontairement tordu:
+       // provoquer la copie dans le presse papier du nom du repertoire
+       // en remettant a vide le champ pour que ca marche aussi en cas
+       // de JavaScript inactif.
+
+                       $js = " onload='document.forms[0].fichier.value=\"\";barre_inserer(\"$signal\", document.forms[0].fichier)'";
+               }
+
+               $form = copy_request($script, $corps, $suivant);
+               $info_action = _T('info_action', array('action' => $action));
+               return minipres($info_action, $form, $js);
+       }
+}
+
+// http://doc.spip.org/@fin_admin
+function fin_admin($action) {
+       $signal = dir_admin() . fichier_admin($action);
+       spip_unlink($signal);
+       if ($action != 'delete_all') {
+               effacer_meta($action);
+               effacer_meta('admin');
+               spip_log("efface les meta admin et $action ");
+       }
+}
+
+// http://doc.spip.org/@copy_request
+function copy_request($script, $suite, $submit='')
+{
+        include_spip('inc/filtres');
+       foreach($_POST as $n => $c) {
+         if (($n != 'fichier') AND !is_array($c))
+               $suite .= "\n<input type='hidden' name='$n' value='" .
+                 entites_html($c) .
+                 "'  />";
+       }
+       return  generer_form_ecrire($script, $suite, '', $submit);
+}
+?>