roles multiples possible par user, administrables
[mtweb] / mw / app / mods / admin / users.php
1 <?php
2
3   class mw_admin_users extends mw_mod{
4
5     var $status;
6
7     function validate(&$env){
8       $data = $env->data();
9       if(($this->status = $data->status()) === false) return "impossible de lire la liste des statuts";
10       return true;
11     }
12
13     // ------------------------------------------------------------------------------------
14     //                                                                         utilisateurs
15     //
16
17     function index(&$env){
18       $data = $env->data();
19       if($this->status) $env->set_out("status", $this->status);
20       else{
21         $env->erreur("impossible de lire la liste des status");
22         return;
23       }
24       if(
25         ( $users = $data->users(
26             isset($_GET[$env->param("start")]) ? $_GET[$env->param("start")] : 0,
27             isset($_GET[$env->param("alpha")]) ? $_GET[$env->param("alpha")] : null,
28             isset($_GET[$env->param("status")]) ? $_GET[$env->param("status")] : null
29           )
30         ) !== false
31       ){
32         $env->set_out("users", $users);
33       }
34       else $env->erreur("impossible de lire la liste des utilisateurs");
35     }
36
37     function add(&$env){
38       $data = $env->data();
39       if($this->status){
40         $env->set_out("status", $this->status);
41         $user = array(
42           "login" => "",
43           "email" => "",
44           "status" => array()
45         );
46         if($_POST){
47           $VALID = true;
48           if($_POST["login"]){
49             $user["login"] = $_POST["login"];
50           }
51           else{
52             $env->message("merci de pr&eacute;ciser un login");
53             $VALID = false;
54           }
55           if(($exists = $data->user($_POST["login"])) !== false){
56             if($exists){
57               $env->message("ce login existe d&eacute;j&agrave;");
58               $VALID = false;
59             }
60           }
61           else{
62             $env->erreur("impossible de savoir si cet login existe d&eacute;j&agrave;");
63             return;
64           }
65           if($_POST["email"]) $user["email"] = $_POST["email"];
66           else{
67             $env->message("merci de preciser un email");
68             $VALID = false;
69           }
70           if($_POST["password"]){
71             if($_POST["password"] == $_POST["password_confirm"]) $user["password"] = md5($_POST["password"]);
72             else{
73               $env->message("la confirmation du mot de passe est incorrecte");
74               $VALID = false;
75             }
76           }
77           else{
78             $env->message("merci de preciser un mot de passe");
79             $VALID = false;
80           }
81           $user["status"] = array();
82           foreach($_POST as $key => $value){
83             if(substr($key, 0, 7) == "status_"){
84               $id_role = substr($key, 7);
85               if(preg_match("/^[0-9]+$/", $id_role)){
86                 $user["status"][] = $id_role;
87               }
88             }
89           }
90           if($VALID){
91             if(
92               $data->add_user(
93                 $user["login"],
94                 $user["password"],
95                 $user["email"],
96                 $user["status"]
97               )
98             ){
99               $env->redirect(
100                 $env->url("admin/users/edit", array("id" => $user["login"])),
101                 "l'utilisateur <strong>".$_POST["login"]."</strong> a &eacute;t&eacute; ajout&eacute;"
102               );
103             }
104             else $env->erreur("Impossible d'ajouter l'utilisateur");
105           }
106         }
107         $env->set_out("user", $user);
108       }
109       else $env->erreur("impossible de lire la liste des status");
110     }
111
112     function edit(&$env){
113       $data = $env->data();
114       if($this->status){
115         $env->set_out("status", $this->status);
116         if($user = $data->user($_GET[$env->param("id")])){
117           if($_POST){
118             $VALID = true;
119             if($_POST["email"]) $user["email"] = $_POST["email"];
120             else{
121               $env->message("merci de preciser un email");
122               $VALID = false;
123             }
124             if(isset($_POST["change_password"]) && $_POST["change_password"]){
125               if(!$_POST["password"]){
126                 $env->message("merci de preciser un mot de passe");
127                 $VALID = false;
128               }
129               if($_POST["password"] != $_POST["password_confirm"]){
130                 $env->message("la confirmation du mot de passe est incorrecte");
131                 $VALID = false;
132               }
133               if($VALID) $user["password"] = md5($_POST["password"]);
134             }
135             $user["status"] = array();
136             foreach($_POST as $key => $value){
137               if(substr($key, 0, 7) == "status_"){
138                 $id_role = substr($key, 7);
139                 if(preg_match("/^[0-9]+$/", $id_role) && isset($this->status[$id_role])){
140                   $user["status"][] = $id_role;
141                 }
142               }
143             }
144             if($VALID){
145               if(
146                 $data->set_user(
147                   $user["id"],
148                   $user["login"],
149                   $user["password"],
150                   $user["email"],
151                   $user["status"]
152                 )
153               )
154               $env->redirect(
155                 $env->url("admin/users/edit", array("id" => $user["login"])),
156                 "l'utilisateur a &eacute;t&eacute; modifi&eacute;"
157               );
158               else $env->erreur("Impossible de mettre &agrave; jour l'utilisateur");
159             }
160           }
161           $env->set_out("user", $user);
162         }
163         else $env->erreur("Impossible de lire les informations de cet utilisateur");
164       }
165       else $env->erreur("impossible de lire la liste des status");
166     }
167
168     function del(&$env){
169       $data = $env->data();
170       if($env->set_out("user", $data->user($_GET[$env->param("id")]))){
171         $user = $env->out("user");
172         if($data->del_user($_GET[$env->param("id")])) $env->redirect(
173           $env->url("admin/users"),
174           "l'utilisateur <strong>".$user["login"]."</strong> a &eacute;t&eacute; supprim&eacute;"
175         );
176         else $env->erreur("Impossible de supprimer l'utilisateur");
177       }
178       else $env->erreur("Impossible de lire les informations de cet utilisateur");
179     }
180
181     // ------------------------------------------------------------------------------------
182     //                                                                                roles
183     //
184
185     function set_default_allow(&$env){
186       $default_allow = $_GET[$env->param("id")];
187       if(!isset($default_allow) || ($default_allow !== "0" && $default_allow !== "1")){
188         $env->erreur("parametre default_allow invalide");
189         return;
190       }
191       $data = $env->data();
192       if(!$data->set_config("default_allow", $default_allow)){
193         $env->erreur("impossible de mettre a jour la configuration default_allow");
194         return;
195       }
196       $env->redirect(
197         $env->url("admin/users/roles"),
198         "la configuration default_allow a &eacute;t&eacute; enregistr&eacute;e"
199       );
200     }
201
202     function roles(&$env){
203       $data = $env->data();
204       $roles = $data->status();
205       $id_role = isset($_GET[$env->param("id")]) && $_GET[$env->param("id")] ? $_GET[$env->param("id")] : 0;
206       $env->set_out("id_role", $id_role);
207       if(!isset($roles) || $roles === false){
208         $env->erreur("impossible de lire la liste des roles");
209         return;
210       }
211       $env->set_out("roles", $roles);
212       if(($actions = $data->get_actions($id_role)) === false){
213         $env->erreur("impossible de lire la liste des droits d'acces");
214         return;
215       }
216       $env->set_out("actions", $actions);
217
218     }
219
220     function add_role(&$env){
221       $data = $env->data();
222       $role = array(
223         "nom" => "",
224         "intitule" => ""
225       );
226       if($_POST){
227         if(!($role["nom"] = $_POST["nom"])) $env->message("merci de preciser un nom");
228         if(!($role["intitule"] = $_POST["intitule"])) $env->message("merci de preciser un intitule");
229         if(!$env->messages()){
230           if(($id_role = $data->add_role($role["nom"], $role["intitule"])) !== false){
231             $env->redirect(
232               $env->url("admin/users/roles", array("id" => $id_role)),
233               "le r&ocirc;le a &eacute;t&eacute; enregistr&eacute;"
234             );
235           }
236           else $env->erreur("impossible d'enregistrer les informations du role");
237         }
238       }
239       $env->set_out("role", $role);
240     }
241
242     function edit_role(&$env){
243       $data = $env->data();
244       if(!isset($_GET[$env->param("id")]) || !($role = $data->get_role($_GET[$env->param("id")]))){
245         $env->erreur("impossible de lire les informations du role");
246         return;
247       }
248       if($_POST){
249         if(!($role["nom"] = $_POST["nom"])) $env->message("merci de preciser un nom");
250         if(!($role["intitule"] = $_POST["intitule"])) $env->message("merci de preciser un intitule");
251         if(!$env->messages()){
252           if($data->set_role($role["id"], $role["nom"], $role["intitule"])){
253             $env->redirect(
254               $env->url("admin/users/roles", array("id" => $role["id"])),
255               "le r&ocirc;le a &eacute;t&eacute; enregistr&eacute;"
256             );
257           }
258           else $env->erreur("impossible d'enregistrer les informations du role");
259         }
260       }
261       $env->set_out("role", $role);
262     }
263
264     function save_role(&$env){
265       $data = $env->data();
266       if(!($role = $data->get_role($_POST["id_role"]))){
267         $env->erreur("impossible de lire les informations du role");
268         return;
269       }
270       if(!$data->clear_role_actions($role["id"])){
271         $env->erreur("impossible de supprimer les actions du role");
272         return;
273       }
274       $action_status = array();
275       $als = array();
276       foreach($_POST as $key => $value){
277         if(substr($key, 0, 7) == "module_" && ($action = substr($key, 7))) $action_status[$action] = $role["id"];
278         elseif(substr($key, 0, 11) == "controleur_" && ($action = substr($key, 11))) $action_status[$action] = $role["id"];
279         elseif(substr($key, 0, 3) == "al_" && ($al_index = substr($key, 3))) $als[] = $al_index;
280       }
281       foreach($als as $al_index){
282         $al_prefix = "action_".$al_index."_";
283         $al_prefix_length = strlen($al_prefix);
284         foreach($_POST as $key => $value){
285           if(substr($key, 0, $al_prefix_length) == $al_prefix) $action_status[$value] = $role["id"];
286         }
287       }
288       foreach($action_status as $action => $id_role){
289         if(!$data->add_role_action($id_role, $action)){
290           $env->erreur("impossible d'enregistrer les actions du role");
291           return;
292         }
293       }
294       $env->redirect(
295         $env->url("admin/users/roles", array("id" => $role["id"])),
296         "les actions du r&ocirc;le ont &eacute;t&eacute; enregistr&eacute;es"
297       );
298     }
299
300     function del_role(&$env){
301       $data = $env->data();
302       if(!isset($_GET[$env->param("id")]) || !($role = $data->get_role($_GET[$env->param("id")]))){
303         $env->erreur("impossible de lire les informations du role");
304         return;
305       }
306       if($data->clear_role_actions($role["id"])){
307         if($data->clear_role_users($role["id"])){
308           if($data->del_role($role["id"])){
309             $env->redirect(
310               $env->url("admin/users/roles"),
311               "le r&ocirc;le a &eacute;t&eacute; effac&eacute;"
312             );
313           }
314           else $env->erreur("impossible de supprimer le role");
315         }
316         else $env->erreur("impossible de supprimer le role aux utilisateurs");
317       }
318       else $env->erreur("impossible de supprimer les actions du role");
319     }
320
321   }
322
323 ?>