[SPIP] ~2.1.12 -->2.1.25
[velocampus/web/www.git] / www / ecrire / inc / admin.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 // demande/verifie le droit de creation de repertoire par le demandeur;
16 // memorise dans les meta que ce script est en cours d'execution
17 // si elle y est deja c'est qu'il y a eu suspension du script, on reprend.
18
19 // http://doc.spip.org/@inc_admin_dist
20 function inc_admin_dist($script, $titre, $comment='', $anonymous=false)
21 {
22 $reprise = true;
23 if (!isset($GLOBALS['meta'][$script])
24 OR !isset($GLOBALS['meta']['admin'])) {
25 $reprise = false;
26 $res = debut_admin($script, $titre, $comment);
27 if ($res) return $res;
28 spip_log("meta: $script " . join(',', $_POST));
29 ecrire_meta($script, serialize($_POST));
30 }
31
32 $res = admin_verifie_session($script,$anonymous);
33 if ($res) return $res;
34 $base = charger_fonction($script, 'base');
35 $base($titre,$reprise);
36 fin_admin($script);
37 return '';
38 }
39
40 // Gestion dans la meta "admin" du script d'administation demande,
41 // pour eviter des executions en parallele, notamment apres Time-Out.
42 // Cette meta contient le nom du script et, a un hachage pres, du demandeur.
43 // Le code de ecrire/index.php devie toute demande d'execution d'un script
44 // vers le script d'administration indique par cette meta si elle est l�.
45 // Au niveau de la fonction inc_admin, on controle la meta 'admin'.
46 // Si la meta n'est pas la,
47 // c'est le debut on la cree.
48 // Sinon, si le hachage actuel est le meme que celui en base,
49 // c'est une reprise, on continue
50 // Sinon, si le hachage differe a cause du connecte,
51 // c'est une arrivee inoppotune, on refuse sa connexion.
52 // Enfin, si hachage differe pour une autre raison
53 // c'est que l'operation se passe mal, on la stoppe
54
55 // http://doc.spip.org/@admin_verifie_session
56 function admin_verifie_session($script, $anonymous=false) {
57
58 include_spip('base/abstract_sql');
59 $pref = sprintf("_%d_",$GLOBALS['visiteur_session']['id_auteur']);
60 $signal = fichier_admin($script, "$script$pref");
61 $valeur = sql_getfetsel('valeur', 'spip_meta', "nom='admin'");
62 if ($valeur === NULL) {
63 ecrire_meta('admin', $signal, 'non');
64 } else {
65 if (!$anonymous AND ($valeur != $signal)) {
66 if (intval(substr($valeur, strpos($valeur,'_')+1))<>
67 $GLOBALS['visiteur_session']['id_auteur']) {
68 include_spip('inc/minipres');
69 spip_log("refus de lancer $script, priorite a $valeur");
70 return minipres(_T('info_travaux_texte'));
71 }
72 }
73 }
74 $journal = "spip";
75 if (autoriser('configurer')) // c'est une action webmestre, soit par ftp soit par statut webmestre
76 $journal = 'webmestre';
77 // on pourrait statuer automatiquement les webmestres a l'init d'une action auth par ftp ... ?
78
79 spip_log("admin $pref" . ($valeur ? " (reprise)" : ' (init)'),$journal);
80 return '';
81 }
82
83 // http://doc.spip.org/@dir_admin
84 function dir_admin()
85 {
86 if (autoriser('configurer')) {
87 return _DIR_TMP;
88 } else {
89 return _DIR_TRANSFERT . $GLOBALS['visiteur_session']['login'] . '/';
90 }
91 }
92
93 // http://doc.spip.org/@fichier_admin
94 function fichier_admin($action, $pref='admin_') {
95
96 return $pref .
97 substr(md5($action.(time() & ~2047).$GLOBALS['visiteur_session']['login']), 0, 10);
98 }
99
100 // demande la creation d'un repertoire et sort
101 // ou retourne sans rien faire si repertoire deja la.
102
103 // http://doc.spip.org/@debut_admin
104 function debut_admin($script, $action='', $corps='') {
105
106 if ((!$action) || (!autoriser('chargerftp'))) {
107 include_spip('inc/minipres');
108 return minipres();
109 } else {
110 $dir = dir_admin();
111 $signal = fichier_admin($script);
112 if (@file_exists($dir . $signal)) {
113 spip_log ("Action admin: $action");
114 return '';
115 }
116 include_spip('inc/minipres');
117
118 // Si on est un super-admin, un bouton de validation suffit
119 // sauf dans les cas destroy
120 if ((autoriser('webmestre') OR $script === 'admin_repair')
121 AND $script != 'delete_all') {
122 if (_request('validation_admin') == $signal) {
123 spip_log ("Action super-admin: $action");
124 return '';
125 }
126 $corps .= '<input type="hidden" name="validation_admin" value="'.$signal.'" />';
127 $suivant = _T('bouton_valider');
128 $js = '';
129 } else {
130 $corps .= "<fieldset><legend>"
131 . _T('info_authentification_ftp')
132 . aide("ftp_auth")
133 . "</legend>\n<label for='fichier'>"
134 . _T('info_creer_repertoire')
135 . "</label>\n"
136 . "<input type='text' class='formo' size='40' id='fichier' name='fichier' value='"
137 . $signal
138 . "' /><br />"
139 . _T('info_creer_repertoire_2', array('repertoire' => joli_repertoire($dir)))
140 . "</fieldset>";
141
142 $suivant = _T('bouton_recharger_page');
143
144 // code volontairement tordu:
145 // provoquer la copie dans le presse papier du nom du repertoire
146 // en remettant a vide le champ pour que ca marche aussi en cas
147 // de JavaScript inactif.
148
149 $js = " onload='document.forms[0].fichier.value=\"\";barre_inserer(\"$signal\", document.forms[0].fichier)'";
150 }
151
152 $form = copy_request($script, $corps, $suivant);
153 $info_action = _T('info_action', array('action' => $action));
154 return minipres($info_action, $form, $js);
155 }
156 }
157
158 // http://doc.spip.org/@fin_admin
159 function fin_admin($action) {
160 $signal = dir_admin() . fichier_admin($action);
161 spip_unlink($signal);
162 if ($action != 'delete_all') {
163 effacer_meta($action);
164 effacer_meta('admin');
165 spip_log("efface les meta admin et $action ");
166 }
167 }
168
169 // http://doc.spip.org/@copy_request
170 function copy_request($script, $suite, $submit='')
171 {
172 include_spip('inc/filtres');
173 foreach($_POST as $n => $c) {
174 if (($n != 'fichier') AND !is_array($c))
175 $suite .= "\n<input type='hidden' name='".htmlspecialchars($n)."' value='" .
176 entites_html($c) .
177 "' />";
178 }
179 return generer_form_ecrire($script, $suite, '', $submit);
180 }
181 ?>