ryxeo-glpi-git / inc / rule.right.class.php @ b67d8923
Historique | Voir | Annoter | Télécharger (15,4 ko)
1 | b67d8923 | Eric Seigne | <?php
|
---|---|---|---|
2 | /*
|
||
3 | * @version $Id: rule.right.class.php 7875 2009-01-23 15:16:47Z moyo $
|
||
4 | -------------------------------------------------------------------------
|
||
5 | GLPI - Gestionnaire Libre de Parc Informatique
|
||
6 | Copyright (C) 2003-2009 by the INDEPNET Development Team.
|
||
7 | |||
8 | http://indepnet.net/ http://glpi-project.org
|
||
9 | -------------------------------------------------------------------------
|
||
10 | |||
11 | LICENSE
|
||
12 | |||
13 | This file is part of GLPI.
|
||
14 | |||
15 | GLPI is free software; you can redistribute it and/or modify
|
||
16 | it under the terms of the GNU General Public License as published by
|
||
17 | the Free Software Foundation; either version 2 of the License, or
|
||
18 | (at your option) any later version.
|
||
19 | |||
20 | GLPI is distributed in the hope that it will be useful,
|
||
21 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
22 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
23 | GNU General Public License for more details.
|
||
24 | |||
25 | You should have received a copy of the GNU General Public License
|
||
26 | along with GLPI; if not, write to the Free Software
|
||
27 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
28 | --------------------------------------------------------------------------
|
||
29 | */
|
||
30 | |||
31 | // ----------------------------------------------------------------------
|
||
32 | // Original Author of file: Walid Nouh
|
||
33 | // Purpose of file:
|
||
34 | // ----------------------------------------------------------------------
|
||
35 | if (!defined('GLPI_ROOT')) { |
||
36 | die("Sorry. You can't access directly to this file"); |
||
37 | } |
||
38 | |||
39 | /// Rule class for Rights management
|
||
40 | class RightAffectRule extends Rule { |
||
41 | |||
42 | /**
|
||
43 | * Constructor
|
||
44 | **/
|
||
45 | function RightAffectRule() { |
||
46 | global $RULES_CRITERIAS; |
||
47 | |||
48 | $this->table = "glpi_rules_descriptions"; |
||
49 | $this->type = -1; |
||
50 | $this->rule_type = RULE_AFFECT_RIGHTS; |
||
51 | |||
52 | //Dynamically add all the ldap criterias to the current list of rule's criterias
|
||
53 | $this->addLdapCriteriasToArray();
|
||
54 | $this->right="rule_ldap"; |
||
55 | $this->orderby="name"; |
||
56 | } |
||
57 | |||
58 | function maxActionsCount(){ |
||
59 | // Unlimited
|
||
60 | return 4; |
||
61 | } |
||
62 | /**
|
||
63 | * Display form to add rules
|
||
64 | * @param $target where to post form
|
||
65 | * @param $ID entity ID
|
||
66 | */
|
||
67 | function showAndAddRuleForm($target, $ID) { |
||
68 | global $LANG, $CFG_GLPI; |
||
69 | |||
70 | $canedit = haveRight($this->right, "w"); |
||
71 | |||
72 | echo "<form name='ldapaffectation_form' id='ldapaffectation_form' method='post' action=\"$target\">"; |
||
73 | |||
74 | if ($canedit) { |
||
75 | |||
76 | echo "<div class='center'>"; |
||
77 | echo "<table class='tab_cadre_fixe'>"; |
||
78 | echo "<tr class='tab_bg_1'><th colspan='4'>" .$LANG["rulesengine"][19] . "</tr><tr><td class='tab_bg_2' align='center'>"; |
||
79 | echo $LANG["common"][16] . ":"; |
||
80 | echo "</td><td align='center' class='tab_bg_2'>"; |
||
81 | autocompletionTextField("name", "glpi_rules_descriptions", "name", "", 30); |
||
82 | echo $LANG["joblist"][6] . ":"; |
||
83 | autocompletionTextField("description", "glpi_rules_descriptions", "description", "", 30); |
||
84 | echo "</td><td align='center' class='tab_bg_2'>"; |
||
85 | echo $LANG["rulesengine"][9] . ":"; |
||
86 | $this->dropdownRulesMatch("match", "AND"); |
||
87 | echo "</td><td align='center' class='tab_bg_2'>"; |
||
88 | echo "</td></tr>"; |
||
89 | |||
90 | echo "<tr><td align='center' class='tab_bg_2'>"; |
||
91 | echo "</td><td align='center' class='tab_bg_2'>"; |
||
92 | echo $LANG["profiles"][22].":"; |
||
93 | dropdownValue("glpi_profiles","FK_profiles"); |
||
94 | echo "</td><td align='center' class='tab_bg_2'>"; |
||
95 | echo $LANG["profiles"][28].":"; |
||
96 | dropdownYesNo("recursive",0); |
||
97 | echo "</td><td align='center' class='tab_bg_2'>"; |
||
98 | echo "<input type=hidden name='rule_type' value=\"" . $this->rule_type . "\">"; |
||
99 | echo "<input type=hidden name='FK_entities' value=\"-1\">"; |
||
100 | echo "<input type=hidden name='affectentity' value=\"" . $ID . "\">"; |
||
101 | echo "<input type='submit' name='add_user_rule' value=\"" . $LANG["buttons"][8] . "\" class='submit'>"; |
||
102 | echo "</td></tr>"; |
||
103 | |||
104 | echo "</table></div><br>"; |
||
105 | |||
106 | } |
||
107 | |||
108 | echo "<div class='center'><table class='tab_cadrehov'><tr><th colspan='3'>" . $LANG["entity"][6] . "</th></tr>"; |
||
109 | |||
110 | //Get all rules and actions
|
||
111 | $rules = $this->getRulesByID( $ID, 0, 1); |
||
112 | |||
113 | if (!empty ($rules)) { |
||
114 | |||
115 | foreach ($rules as $rule) { |
||
116 | echo "<tr class='tab_bg_1'>"; |
||
117 | |||
118 | if ($canedit) { |
||
119 | echo "<td width='10'>"; |
||
120 | $sel = ""; |
||
121 | if (isset ($_GET["select"]) && $_GET["select"] == "all") |
||
122 | $sel = "checked"; |
||
123 | echo "<input type='checkbox' name='item[" . $rule->fields["ID"] . "]' value='1' $sel>"; |
||
124 | echo "</td>"; |
||
125 | } |
||
126 | |||
127 | if ($canedit) |
||
128 | echo "<td><a href=\"" . $CFG_GLPI["root_doc"] . "/front/rule.right.form.php?ID=" . $rule->fields["ID"] . "&onglet=1\">" . $rule->fields["name"] . "</a></td>"; |
||
129 | else
|
||
130 | echo "<td>" . $rule->fields["name"] . "</td>"; |
||
131 | |||
132 | echo "<td>" . $rule->fields["description"] . "</td>"; |
||
133 | echo "</tr>"; |
||
134 | } |
||
135 | } |
||
136 | echo "</table></div>"; |
||
137 | |||
138 | if ($canedit) { |
||
139 | echo "<div class='center'>"; |
||
140 | echo "<table width='80%'>"; |
||
141 | echo "<tr><td><img src=\"" . $CFG_GLPI["root_doc"] . "/pics/arrow-left.png\" alt=''></td><td class='center'><a onclick= \"if ( markAllRows('ldapaffectation_form') ) return false;\" href='" . $_SERVER['PHP_SELF'] . "?ID=$ID&select=all'>" . $LANG["buttons"][18] . "</a></td>"; |
||
142 | |||
143 | echo "<td>/</td><td class='center'><a onclick= \"if ( unMarkAllRows('ldapaffectation_form') ) return false;\" href='" . $_SERVER['PHP_SELF'] . "?ID=$ID&select=none'>" . $LANG["buttons"][19] . "</a>"; |
||
144 | echo "</td><td align='left' width='80%'>"; |
||
145 | echo "<input type='submit' name='delete_user_rule' value=\"" . $LANG["buttons"][6] . "\" class='submit'>"; |
||
146 | echo "</td>"; |
||
147 | echo "</table>"; |
||
148 | |||
149 | echo "</div>"; |
||
150 | |||
151 | } |
||
152 | echo "</form>"; |
||
153 | } |
||
154 | |||
155 | /**
|
||
156 | * Get all ldap rules criterias from the DB and add them into the RULES_CRITERIAS
|
||
157 | */
|
||
158 | function addLdapCriteriasToArray() |
||
159 | { |
||
160 | global $DB,$RULES_CRITERIAS; |
||
161 | |||
162 | $sql = "SELECT name,value,rule_type FROM glpi_rules_ldap_parameters WHERE rule_type='".$this->rule_type."'"; |
||
163 | $result = $DB->query($sql); |
||
164 | while ($datas = $DB->fetch_array($result)) |
||
165 | { |
||
166 | $RULES_CRITERIAS[$this->rule_type][$datas["value"]]['name']=$datas["name"]; |
||
167 | $RULES_CRITERIAS[$this->rule_type][$datas["value"]]['field']=$datas["value"]; |
||
168 | $RULES_CRITERIAS[$this->rule_type][$datas["value"]]['linkfield']=''; |
||
169 | $RULES_CRITERIAS[$this->rule_type][$datas["value"]]['table']=''; |
||
170 | } |
||
171 | } |
||
172 | |||
173 | /**
|
||
174 | * Execute the actions as defined in the rule
|
||
175 | * @param $output the result of the actions
|
||
176 | * @param $params the parameters
|
||
177 | * @return the fields modified
|
||
178 | */
|
||
179 | function executeActions($output,$params) |
||
180 | { |
||
181 | $entity=''; |
||
182 | $right=''; |
||
183 | $recursive = 0; |
||
184 | |||
185 | if (count($this->actions)){ |
||
186 | foreach ($this->actions as $action){ |
||
187 | switch ($action->fields["action_type"]){ |
||
188 | case "assign" : |
||
189 | if ($action->fields["field"] == "FK_entities") $entity = $action->fields["value"]; |
||
190 | elseif ($action->fields["field"] == "FK_profiles") $right = $action->fields["value"]; |
||
191 | elseif ($action->fields["field"] == "recursive") $recursive = $action->fields["value"]; |
||
192 | elseif ($action->fields["field"] == "active") $output["active"] = $action->fields["value"]; |
||
193 | break;
|
||
194 | } |
||
195 | } |
||
196 | } |
||
197 | |||
198 | //Nothing to be returned by the function :
|
||
199 | //Store in session the entity and/or right
|
||
200 | if ($entity != '' && $right != '') |
||
201 | $output["_ldap_rules"]["rules_entities_rights"][]=array($entity,$right,$recursive); |
||
202 | elseif ($entity != '') |
||
203 | $output["_ldap_rules"]["rules_entities"][]=array($entity,$recursive); |
||
204 | elseif ($right != '') |
||
205 | $output["_ldap_rules"]["rules_rights"][]=$right; |
||
206 | |||
207 | return $output; |
||
208 | } |
||
209 | |||
210 | |||
211 | /**
|
||
212 | * Return all rules from database
|
||
213 | * @param $ID of rules
|
||
214 | * @param $withcriterias import rules criterias too
|
||
215 | * @param $withactions import rules actions too
|
||
216 | */
|
||
217 | function getRulesByID($ID, $withcriterias, $withactions) { |
||
218 | global $DB; |
||
219 | $ldap_affect_user_rules = array (); |
||
220 | // MOYO : quoi donc que ca fout la ca ?
|
||
221 | // MOYO : ca correspond pas deja à un cas particulier de ca : getRuleWithCriteriasAndActions ?
|
||
222 | |||
223 | |||
224 | //Get all the rules whose rule_type is $rule_type and entity is $ID
|
||
225 | $sql="SELECT * FROM `glpi_rules_actions` as gra, glpi_rules_descriptions as grd WHERE gra.FK_rules=grd.ID AND gra.field='FK_entities' and grd.rule_type=".$this->rule_type." and gra.value='".$ID."'"; |
||
226 | |||
227 | $result = $DB->query($sql); |
||
228 | while ($rule = $DB->fetch_array($result)) { |
||
229 | $affect_rule = new Rule; |
||
230 | $affect_rule->getRuleWithCriteriasAndActions($rule["ID"], 0, 1); |
||
231 | $ldap_affect_user_rules[] = $affect_rule; |
||
232 | } |
||
233 | |||
234 | return $ldap_affect_user_rules; |
||
235 | } |
||
236 | |||
237 | function getTitleCriteria($target) { |
||
238 | global $LANG,$CFG_GLPI; |
||
239 | echo "<div class='center'>"; |
||
240 | echo "<table class='tab_cadrehov'>"; |
||
241 | echo "<tr class='tab_bg_2'>"; |
||
242 | echo "<td width='100%'>"; |
||
243 | echo "<a href=\"".$CFG_GLPI["root_doc"]."/front/ldap.parameters.php\">".$LANG["setup"][142]." ".$LANG["ruleldap"][1]."</a>"; |
||
244 | echo "</td></tr>"; |
||
245 | echo "</table></div><br>"; |
||
246 | |||
247 | } |
||
248 | |||
249 | function getTitleRule($target) { |
||
250 | } |
||
251 | |||
252 | function getTitle() |
||
253 | { |
||
254 | global $LANG; |
||
255 | return $LANG["entity"][6]; |
||
256 | } |
||
257 | } |
||
258 | |||
259 | /// Rule collection class for Rights management
|
||
260 | class RightRuleCollection extends RuleCollection { |
||
261 | |||
262 | /// Array containing results : entity + right
|
||
263 | var $rules_entity_rights = array(); |
||
264 | /// Array containing results : only entity
|
||
265 | var $rules_entity = array(); |
||
266 | /// Array containing results : only right
|
||
267 | var $rules_rights = array(); |
||
268 | |||
269 | /**
|
||
270 | * Constructor
|
||
271 | **/
|
||
272 | function RightRuleCollection() { |
||
273 | global $DB; |
||
274 | $this->rule_type = RULE_AFFECT_RIGHTS; |
||
275 | $this->rule_class_name = 'RightAffectRule'; |
||
276 | $this->stop_on_first_match=false; |
||
277 | $this->right="rule_ldap"; |
||
278 | $this->orderby="name"; |
||
279 | } |
||
280 | |||
281 | function getTitle() { |
||
282 | global $LANG; |
||
283 | return $LANG["rulesengine"][19]; |
||
284 | } |
||
285 | |||
286 | |||
287 | function cleanTestOutputCriterias($output){ |
||
288 | if (isset($output["_rule_process"])) |
||
289 | unset($output["_rule_process"]); |
||
290 | |||
291 | return $output; |
||
292 | } |
||
293 | |||
294 | function showTestResults($rule,$output,$global_result){ |
||
295 | global $LANG,$RULES_ACTIONS; |
||
296 | |||
297 | echo "<tr><th colspan='4'>" . $LANG["rulesengine"][81] . "</th></tr>"; |
||
298 | echo "<tr class='tab_bg_2'>"; |
||
299 | echo "<td class='tab_bg_2' colspan='4' align='center'>".$LANG["rulesengine"][41]." : <strong> ".getYesNo($global_result)."</strong></td>"; |
||
300 | |||
301 | |||
302 | if (isset($output["_ldap_rules"]["rules_entities"])) |
||
303 | { |
||
304 | echo "<tr class='tab_bg_2'>"; |
||
305 | echo "<td class='tab_bg_2' colspan='4' align='center'>".$LANG["rulesengine"][111]."</td>"; |
||
306 | |||
307 | foreach ($output["_ldap_rules"]["rules_entities"] as $val) |
||
308 | { |
||
309 | $this->displayActionByName("entity",$val[0]); |
||
310 | if (isset($val[1])) |
||
311 | $this->displayActionByName("recursive",$val[1]); |
||
312 | } |
||
313 | } |
||
314 | |||
315 | if (isset($output["_ldap_rules"]["rules_rights"])) |
||
316 | { |
||
317 | echo "<tr class='tab_bg_2'>"; |
||
318 | echo "<td class='tab_bg_2' colspan='4' align='center'>".$LANG["rulesengine"][110]."</td>"; |
||
319 | |||
320 | foreach ($output["_ldap_rules"]["rules_rights"] as $val) |
||
321 | $this->displayActionByName("profile",$val[0]); |
||
322 | } |
||
323 | |||
324 | if (isset($output["_ldap_rules"]["rules_entities_rights"])) |
||
325 | { |
||
326 | echo "<tr class='tab_bg_2'>"; |
||
327 | echo "<td class='tab_bg_2' colspan='4' align='center'>".$LANG["rulesengine"][112]."</td>"; |
||
328 | |||
329 | foreach ($output["_ldap_rules"]["rules_entities_rights"] as $val) |
||
330 | { |
||
331 | $this->displayActionByName("entity",$val[0]); |
||
332 | if (isset($val[1])) |
||
333 | $this->displayActionByName("profile",$val[1]); |
||
334 | if (isset($val[2])) |
||
335 | $this->displayActionByName("recursive",$val[2]); |
||
336 | } |
||
337 | } |
||
338 | |||
339 | if (isset($output["_ldap_rules"])) |
||
340 | unset($output["_ldap_rules"]); |
||
341 | |||
342 | foreach ($output as $criteria => $value) |
||
343 | { |
||
344 | echo "<tr class='tab_bg_2'>"; |
||
345 | echo "<td class='tab_bg_2' align='center'>"; |
||
346 | echo $RULES_ACTIONS[$this->rule_type][$criteria]["name"]; |
||
347 | echo "</td>"; |
||
348 | echo "<td class='tab_bg_2' align='center'>"; |
||
349 | echo $rule->getActionValue($criteria,$value); |
||
350 | echo "</td>"; |
||
351 | echo "</tr>"; |
||
352 | |||
353 | } |
||
354 | echo "</tr>"; |
||
355 | } |
||
356 | /**
|
||
357 | * Display action using its name
|
||
358 | * @param $name action name
|
||
359 | * @param $value default value
|
||
360 | */
|
||
361 | function displayActionByName($name,$value){ |
||
362 | global $LANG; |
||
363 | echo "<tr>"; |
||
364 | switch ($name){ |
||
365 | case "entity": |
||
366 | echo "<td class='tab_bg_2' align='center'>".$LANG["entity"][0]." </td>\n"; |
||
367 | echo "<td class='tab_bg_2' align='center'>"; |
||
368 | echo getDropdownName("glpi_entities",$value); |
||
369 | echo "</td>"; |
||
370 | break;
|
||
371 | case "profile": |
||
372 | echo "<td class='tab_bg_2' align='center'>".$LANG["Menu"][35]." </td>\n"; |
||
373 | echo "<td class='tab_bg_2' align='center'>"; |
||
374 | echo getDropdownName("glpi_profiles",$value); |
||
375 | echo "</td>"; |
||
376 | break;
|
||
377 | case "recursive": |
||
378 | echo "<td class='tab_bg_2' align='center'>".$LANG["profiles"][28]." </td>\n"; |
||
379 | echo "<td class='tab_bg_2' align='center'>"; |
||
380 | echo ((!$value)?$LANG["choice"][0]:$LANG["choice"][1]); |
||
381 | echo "</td>"; |
||
382 | break;
|
||
383 | } |
||
384 | echo "</tr>"; |
||
385 | } |
||
386 | /**
|
||
387 | * Get all the fields needed to perform the rule
|
||
388 | */
|
||
389 | function getFieldsToLookFor() |
||
390 | { |
||
391 | global $DB; |
||
392 | $params = array(); |
||
393 | $sql = "SELECT DISTINCT value " . |
||
394 | "FROM glpi_rules_descriptions, glpi_rules_criterias, glpi_rules_ldap_parameters " .
|
||
395 | "WHERE glpi_rules_descriptions.rule_type='".$this->rule_type."' AND glpi_rules_criterias.FK_rules=glpi_rules_descriptions.ID AND glpi_rules_criterias.criteria=glpi_rules_ldap_parameters.value"; |
||
396 | |||
397 | $result = $DB->query($sql); |
||
398 | while ($param = $DB->fetch_array($result)) |
||
399 | { |
||
400 | //Dn is alwsays retreived from ldap : don't need to ask for it !
|
||
401 | if ($param["value"] != "dn") |
||
402 | $params[]=strtolower($param["value"]); |
||
403 | } |
||
404 | return $params; |
||
405 | } |
||
406 | |||
407 | /**
|
||
408 | * Get the attributes needed for processing the rules
|
||
409 | * @param $input input datas
|
||
410 | * @param $params extra parameters given
|
||
411 | * @return an array of attributes
|
||
412 | */
|
||
413 | function prepareInputDataForProcess($input,$params){ |
||
414 | global $RULES_CRITERIAS; |
||
415 | |||
416 | $rule_parameters = array(); |
||
417 | |||
418 | //LDAP type method
|
||
419 | if ($params["type"] == "LDAP") |
||
420 | { |
||
421 | //Get all the field to retrieve to be able to process rule matching
|
||
422 | $rule_fields = $this->getFieldsToLookFor(); |
||
423 | |||
424 | //Get all the datas we need from ldap to process the rules
|
||
425 | $sz = @ ldap_read($params["connection"], $params["userdn"], "objectClass=*", $rule_fields); |
||
426 | $rule_input = ldap_get_entries($params["connection"], $sz); |
||
427 | |||
428 | if (count($rule_input)) |
||
429 | { |
||
430 | |||
431 | if (isset($input)) |
||
432 | $groups = $input; |
||
433 | else
|
||
434 | $groups = array(); |
||
435 | |||
436 | $rule_input = $rule_input[0]; |
||
437 | |||
438 | //Get all the ldap fields
|
||
439 | $fields = $this->getFieldsForQuery(); |
||
440 | |||
441 | foreach ($fields as $field) |
||
442 | { |
||
443 | switch(strtoupper($field)) |
||
444 | { |
||
445 | case "LDAP_SERVER": |
||
446 | $rule_parameters["LDAP_SERVER"] = $params["ldap_server"]; |
||
447 | break;
|
||
448 | case "GROUPS" : |
||
449 | foreach ($groups as $group) |
||
450 | $rule_parameters["GROUPS"][] = $group; |
||
451 | break;
|
||
452 | default :
|
||
453 | if (isset($rule_input[$field])) |
||
454 | { |
||
455 | if (!is_array($rule_input[$field])) |
||
456 | $rule_parameters[$field] = $rule_input[$field]; |
||
457 | else
|
||
458 | { |
||
459 | for ($i=0;$i < count($rule_input[$field]) -1;$i++) |
||
460 | $rule_parameters[$field][] = $rule_input[$field][$i]; |
||
461 | break;
|
||
462 | } |
||
463 | } |
||
464 | } |
||
465 | } |
||
466 | |||
467 | return $rule_parameters; |
||
468 | } |
||
469 | else return $rule_input; |
||
470 | } |
||
471 | //IMAP/POP login method
|
||
472 | else
|
||
473 | { |
||
474 | $rule_parameters["MAIL_SERVER"] = $params["mail_server"]; |
||
475 | $rule_parameters["MAIL_EMAIL"] = $params["email"]; |
||
476 | return $rule_parameters; |
||
477 | } |
||
478 | } |
||
479 | |||
480 | /**
|
||
481 | * Get the list of fields to be retreived to process rules
|
||
482 | */
|
||
483 | function getFieldsForQuery() |
||
484 | { |
||
485 | global $RULES_CRITERIAS; |
||
486 | |||
487 | $fields = array(); |
||
488 | foreach ($RULES_CRITERIAS[$this->rule_type] as $criteria){ |
||
489 | if (isset($criteria['virtual']) && $criteria['virtual'] == "true") |
||
490 | $fields[]=$criteria['id']; |
||
491 | else
|
||
492 | $fields[]=$criteria['field']; |
||
493 | } |
||
494 | |||
495 | return $fields; |
||
496 | } |
||
497 | } |
||
498 | ?> |