.
* ---------------------------------------------------------------------
*/
if (!defined('GLPI_ROOT')) {
die("Sorry. You can't access this file directly");
}
/// Rule collection class for Rights management
class RuleRightCollection extends RuleCollection {
// From RuleCollection
public $stop_on_first_match = false;
static $rightname = 'rule_ldap';
public $orderby = "name";
public $menu_option = 'right';
// Specific ones
/// Array containing results : entity + right
public $rules_entity_rights = [];
/// Array containing results : only entity
public $rules_entity = [];
/// Array containing results : only right
public $rules_rights = [];
function getTitle() {
return __('Authorizations assignment rules');
}
/**
* @see RuleCollection::cleanTestOutputCriterias()
*/
function cleanTestOutputCriterias(array $output) {
if (isset($output["_rule_process"])) {
unset($output["_rule_process"]);
}
return $output;
}
/**
* @see RuleCollection::showTestResults()
*/
function showTestResults($rule, array $output, $global_result) {
$actions = $rule->getActions();
echo "
| " . __('Rule results') . " |
";
echo "";
echo "| "._n('Validation', 'Validations', 1)." | ".
"".Dropdown::getYesNo($global_result)." | ";
if (isset($output["_ldap_rules"]["rules_entities"])) {
echo "
";
echo "| ".__('Entities assignment')." | ";
foreach ($output["_ldap_rules"]["rules_entities"] as $entities) {
foreach ($entities as $entity) {
$this->displayActionByName("entity", $entity[0]);
if (isset($entity[1])) {
$this->displayActionByName("recursive", $entity[1]);
}
}
}
}
if (isset($output["_ldap_rules"]["rules_rights"])) {
echo "
";
echo "| ".__('Rights assignment')." | ";
foreach ($output["_ldap_rules"]["rules_rights"] as $val) {
$this->displayActionByName("profile", $val[0]);
}
}
if (isset($output["_ldap_rules"]["rules_entities_rights"])) {
echo "
";
echo "| ".__('Rights and entities assignment')." | ";
foreach ($output["_ldap_rules"]["rules_entities_rights"] as $val) {
if (is_array($val[0])) {
foreach ($val[0] as $tmp) {
$this->displayActionByName("entity", $tmp);
}
} else {
$this->displayActionByName("entity", $val[0]);
}
if (isset($val[1])) {
$this->displayActionByName("profile", $val[1]);
}
if (isset($val[2])) {
$this->displayActionByName("is_recursive", $val[2]);
}
}
}
if (isset($output["_ldap_rules"])) {
unset($output["_ldap_rules"]);
}
foreach ($output as $criteria => $value) {
if (isset($actions[$criteria])) { // ignore _* fields
if (isset($actions[$criteria]['action_type'])) {
$actiontype = $actions[$criteria]['action_type'];
} else {
$actiontype ='';
}
echo "
";
echo "| ".$actions[$criteria]["name"]." | ";
echo "".$rule->getActionValue($criteria, $actiontype, $value);
echo " |
\n";
}
}
echo "";
}
/**
* Display action using its name
*
* @param $name action name
* @param $value default value
**/
function displayActionByName($name, $value) {
echo "";
switch ($name) {
case "entity" :
echo "| ".Entity::getTypeName(1)." | \n";
echo "".Dropdown::getDropdownName("glpi_entities", $value)." | ";
break;
case "profile" :
echo ""._n('Profile', 'Profiles', Session::getPluralNumber())." | \n";
echo "".Dropdown::getDropdownName("glpi_profiles", $value)." | ";
break;
case "is_recursive" :
echo "".__('Recursive')." | \n";
echo "".Dropdown::getYesNo($value)." | ";
break;
}
echo "
";
}
/**
* Get all the fields needed to perform the rule
*
* @see RuleCollection::getFieldsToLookFor()
**/
function getFieldsToLookFor() {
global $DB;
$params = [];
$iterator = $DB->request([
'SELECT' => 'value',
'DISTINCT' => true,
'FROM' => 'glpi_rulerightparameters',
'LEFT JOIN' => [
'glpi_rulecriterias' => [
'ON' => [
'glpi_rulerightparameters' => 'value',
'glpi_rulecriterias' => 'criteria'
]
],
'glpi_rules' => [
'ON' => [
'glpi_rulecriterias' => 'rules_id',
'glpi_rules' => 'id'
]
]
],
'WHERE' => ['glpi_rules.sub_type' => 'RuleRight']
]);
while ($param = $iterator->next()) {
//Dn is alwsays retreived from ldap : don't need to ask for it !
if ($param["value"] != "dn") {
$params[] = Toolbox::strtolower($param["value"]);
}
}
return $params;
}
/**
* Get the attributes needed for processing the rules
*
* @see RuleCollection::prepareInputDataForProcess()
*
* @param $input input datas
* @param $params extra parameters given
*
* @return an array of attributes
**/
function prepareInputDataForProcess($input, $params) {
$groups = [];
if (isset($input) && is_array($input)) {
$groups = $input;
}
//common parameters
$rule_parameters = [
'TYPE' => $params["type"] ?? "",
'LOGIN' => $params["login"] ?? "",
'MAIL_EMAIL' => $params["email"] ?? $params["mail_email"] ?? "",
'GROUPS' => $groups
];
//IMAP/POP login method
if ($params["type"] == Auth::MAIL) {
$rule_parameters["MAIL_SERVER"] = $params["mail_server"] ?? "";
}
//LDAP type method
if ($params["type"] == Auth::LDAP) {
//Get all the field to retrieve to be able to process rule matching
$rule_fields = $this->getFieldsToLookFor();
//Get all the datas we need from ldap to process the rules
$sz = @ldap_read($params["connection"], $params["userdn"], "objectClass=*",
$rule_fields);
$rule_input = AuthLDAP::get_entries_clean($params["connection"], $sz);
if (count($rule_input)) {
$rule_input = $rule_input[0];
//Get all the ldap fields
$fields = $this->getFieldsForQuery();
foreach ($fields as $field) {
switch (Toolbox::strtoupper($field)) {
case "LDAP_SERVER" :
$rule_parameters["LDAP_SERVER"] = $params["ldap_server"];
break;
default : // ldap criteria (added by user)
if (isset($rule_input[$field])) {
if (!is_array($rule_input[$field])) {
$rule_parameters[$field] = $rule_input[$field];
} else {
if (count($rule_input[$field])) {
foreach ($rule_input[$field] as $key => $val) {
if ($key !== 'count') {
$rule_parameters[$field][] = $val;
}
}
}
}
}
}
}
return $rule_parameters;
}
return $rule_input;
}
return $rule_parameters;
}
/**
* Get the list of fields to be retreived to process rules
**/
function getFieldsForQuery() {
$rule = new RuleRight();
$criterias = $rule->getCriterias();
$fields = [];
foreach ($criterias as $criteria) {
if (!is_array($criteria)) {
continue;
}
if (isset($criteria['virtual']) && $criteria['virtual']) {
$fields[] = $criteria['id'];
} else {
$fields[] = $criteria['field'];
}
}
return $fields;
}
}