327 lines
15 KiB
PHP
327 lines
15 KiB
PHP
<?php
|
|
/**
|
|
* ---------------------------------------------------------------------
|
|
* GLPI - Gestionnaire Libre de Parc Informatique
|
|
* Copyright (C) 2015-2020 Teclib' and contributors.
|
|
*
|
|
* http://glpi-project.org
|
|
*
|
|
* based on GLPI - Gestionnaire Libre de Parc Informatique
|
|
* Copyright (C) 2003-2014 by the INDEPNET Development Team.
|
|
*
|
|
* ---------------------------------------------------------------------
|
|
*
|
|
* LICENSE
|
|
*
|
|
* This file is part of GLPI.
|
|
*
|
|
* GLPI is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* GLPI is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with GLPI. If not, see <http://www.gnu.org/licenses/>.
|
|
* ---------------------------------------------------------------------
|
|
*/
|
|
|
|
if (!defined('GLPI_ROOT')) {
|
|
die("Sorry. You can't access this file directly");
|
|
}
|
|
|
|
/// Rule class for Rights management
|
|
class RuleMailCollector extends Rule {
|
|
|
|
// From Rule
|
|
static $rightname = 'rule_mailcollector';
|
|
public $orderby = "name";
|
|
public $can_sort = true;
|
|
|
|
|
|
/**
|
|
* @see Rule::maxActionsCount()
|
|
**/
|
|
function maxActionsCount() {
|
|
return 1;
|
|
}
|
|
|
|
|
|
/**
|
|
* @see Rule::getTitle()
|
|
**/
|
|
function getTitle() {
|
|
return __('Rules for assigning a ticket created through a mails receiver');
|
|
}
|
|
|
|
|
|
/**
|
|
* @see Rule::getCriterias()
|
|
**/
|
|
function getCriterias() {
|
|
|
|
static $criterias = [];
|
|
|
|
if (count($criterias)) {
|
|
return $criterias;
|
|
}
|
|
|
|
$criterias['mailcollector']['field'] = 'name';
|
|
$criterias['mailcollector']['name'] = __('Mails receiver');
|
|
$criterias['mailcollector']['table'] = 'glpi_mailcollectors';
|
|
$criterias['mailcollector']['type'] = 'dropdown';
|
|
|
|
$criterias['_users_id_requester']['field'] = 'name';
|
|
$criterias['_users_id_requester']['name'] = _n('Requester', 'Requesters', 1);
|
|
$criterias['_users_id_requester']['table'] = 'glpi_users';
|
|
$criterias['_users_id_requester']['type'] = 'dropdown';
|
|
|
|
$criterias['subject']['name'] = __('Subject email header');
|
|
$criterias['subject']['field'] = 'subject';
|
|
$criterias['subject']['table'] = '';
|
|
$criterias['subject']['type'] = 'text';
|
|
|
|
$criterias['content']['name'] = __('Email body');
|
|
$criterias['content']['table'] = '';
|
|
$criterias['content']['type'] = 'text';
|
|
|
|
$criterias['from']['name'] = __('From email header');
|
|
$criterias['from']['table'] = '';
|
|
$criterias['from']['type'] = 'text';
|
|
|
|
$criterias['to']['name'] = __('To email header');
|
|
$criterias['to']['table'] = '';
|
|
$criterias['to']['type'] = 'text';
|
|
|
|
$criterias['in_reply_to']['name'] = __('In-Reply-To email header');
|
|
$criterias['in_reply_to']['table'] = '';
|
|
$criterias['in_reply_to']['type'] = 'text';
|
|
|
|
$criterias['x-priority']['name'] = __('X-Priority email header');
|
|
$criterias['x-priority']['table'] = '';
|
|
$criterias['x-priority']['type'] = 'text';
|
|
|
|
$criterias['x-auto-response-suppress']['name'] = __('X-Auto-Response-Suppress email header');
|
|
$criterias['x-auto-response-suppress']['table'] = '';
|
|
$criterias['x-auto-response-suppress']['type'] = 'text';
|
|
|
|
$criterias['auto-submitted']['name'] = __('Auto-Submitted email header');
|
|
$criterias['auto-submitted']['table'] = '';
|
|
$criterias['auto-submitted']['type'] = 'text';
|
|
|
|
/// Renater spam matching : X-UCE-Status = Yes
|
|
$criterias['x-uce-status']['name'] = __('X-UCE-Status email header');
|
|
$criterias['x-uce-status']['table'] = '';
|
|
$criterias['x-uce-status']['type'] = 'text';
|
|
|
|
$criterias['received']['name'] = __('Received email header');
|
|
$criterias['received']['table'] = '';
|
|
$criterias['received']['type'] = 'text';
|
|
|
|
$criterias['GROUPS']['table'] = 'glpi_groups';
|
|
$criterias['GROUPS']['field'] = 'completename';
|
|
$criterias['GROUPS']['name'] = sprintf(__('%1$s: %2$s'), User::getTypeName(1),
|
|
Group::getTypeName(1));
|
|
$criterias['GROUPS']['linkfield'] = '';
|
|
$criterias['GROUPS']['type'] = 'dropdown';
|
|
$criterias['GROUPS']['virtual'] = true;
|
|
$criterias['GROUPS']['id'] = 'groups';
|
|
|
|
$criterias['KNOWN_DOMAIN']['field'] = 'name';
|
|
$criterias['KNOWN_DOMAIN']['name'] = __('Known mail domain');
|
|
$criterias['KNOWN_DOMAIN']['table'] = 'glpi_entities';
|
|
$criterias['KNOWN_DOMAIN']['type'] = 'yesno';
|
|
$criterias['KNOWN_DOMAIN']['virtual'] = true;
|
|
$criterias['KNOWN_DOMAIN']['id'] = 'entitydatas';
|
|
$criterias['KNOWN_DOMAIN']['allow_condition'] = [Rule::PATTERN_IS];
|
|
|
|
$criterias['PROFILES']['field'] = 'name';
|
|
$criterias['PROFILES']['name'] = __('User featuring the profile');
|
|
$criterias['PROFILES']['table'] = 'glpi_profiles';
|
|
$criterias['PROFILES']['type'] = 'dropdown';
|
|
$criterias['PROFILES']['virtual'] = true;
|
|
$criterias['PROFILES']['id'] = 'profiles';
|
|
$criterias['PROFILES']['allow_condition'] = [Rule::PATTERN_IS];
|
|
|
|
if (Session::isMultiEntitiesMode()) {
|
|
$criterias['UNIQUE_PROFILE']['field'] = 'name';
|
|
$criterias['UNIQUE_PROFILE']['name'] = __('User featuring a single profile');
|
|
$criterias['UNIQUE_PROFILE']['table'] = 'glpi_profiles';
|
|
$criterias['UNIQUE_PROFILE']['type'] = 'dropdown';
|
|
$criterias['UNIQUE_PROFILE']['virtual'] = true;
|
|
$criterias['UNIQUE_PROFILE']['id'] = 'profiles';
|
|
$criterias['UNIQUE_PROFILE']['allow_condition'] = [Rule::PATTERN_IS];
|
|
}
|
|
|
|
$criterias['ONE_PROFILE']['field'] = 'name';
|
|
$criterias['ONE_PROFILE']['name'] = __('User with a single profile');
|
|
$criterias['ONE_PROFILE']['table'] = '';
|
|
$criterias['ONE_PROFILE']['type'] = 'yesonly';
|
|
$criterias['ONE_PROFILE']['virtual'] = true;
|
|
$criterias['ONE_PROFILE']['id'] = 'profiles';
|
|
$criterias['ONE_PROFILE']['allow_condition'] = [Rule::PATTERN_IS];
|
|
|
|
return $criterias;
|
|
}
|
|
|
|
|
|
/**
|
|
* @see Rule::getActions()
|
|
**/
|
|
function getActions() {
|
|
|
|
$actions = [];
|
|
|
|
$actions['entities_id']['name'] = Entity::getTypeName(1);
|
|
$actions['entities_id']['type'] = 'dropdown';
|
|
$actions['entities_id']['table'] = 'glpi_entities';
|
|
|
|
$actions['_affect_entity_by_domain']['name'] = __('Entity from domain');
|
|
$actions['_affect_entity_by_domain']['type'] = 'text';
|
|
$actions['_affect_entity_by_domain']['force_actions'] = ['regex_result'];
|
|
|
|
$actions['_affect_entity_by_tag']['name'] = __('Entity from TAG');
|
|
$actions['_affect_entity_by_tag']['type'] = 'text';
|
|
$actions['_affect_entity_by_tag']['force_actions'] = ['regex_result'];
|
|
|
|
$actions['_affect_entity_by_user_entity']['name'] = __("Entity based on user's profile");
|
|
$actions['_affect_entity_by_user_entity']['type'] = 'yesonly';
|
|
$actions['_affect_entity_by_user_entity']['table'] = '';
|
|
|
|
$actions['_refuse_email_no_response']['name'] = sprintf(__('%1$s (%2$s)'), __('Reject email'),
|
|
__('without email response'));
|
|
$actions['_refuse_email_no_response']['type'] = 'yesonly';
|
|
$actions['_refuse_email_no_response']['table'] = '';
|
|
|
|
$actions['_refuse_email_with_response']['name'] = sprintf(__('%1$s (%2$s)'), __('Reject email'),
|
|
__('with email response'));
|
|
$actions['_refuse_email_with_response']['type'] = 'yesonly';
|
|
$actions['_refuse_email_with_response']['table'] = '';
|
|
|
|
return $actions;
|
|
}
|
|
|
|
|
|
function executeActions($output, $params, array $input = []) {
|
|
|
|
if (count($this->actions)) {
|
|
|
|
foreach ($this->actions as $action) {
|
|
|
|
switch ($action->fields["action_type"]) {
|
|
case "assign" :
|
|
switch ($action->fields["field"]) {
|
|
default :
|
|
$output[$action->fields["field"]] = $action->fields["value"];
|
|
break;
|
|
|
|
case "_affect_entity_by_user_entity":
|
|
//3 cases :
|
|
//1 - rule contains a criteria like : Profil is XXXX
|
|
// -> in this case, profiles_id is stored in
|
|
// $this->criterias_results['PROFILES'] (one value possible)
|
|
//2- rule contains criteria "User has only one profile"
|
|
// -> in this case, profiles_id is stored in
|
|
// $this->criterias_results['PROFILES'] (one value possible) (same as 1)
|
|
//3 -> rule contains only one profile
|
|
$profile = 0;
|
|
|
|
//Case 2:
|
|
if (isset($this->criterias_results['ONE_PROFILE'])) {
|
|
$profile = $this->criterias_results['ONE_PROFILE'];
|
|
|
|
} else if (isset($this->criterias_results['UNIQUE_PROFILE'])) {
|
|
//Case 3
|
|
$profile = $this->criterias_results['UNIQUE_PROFILE'];
|
|
|
|
} else if (isset($this->criterias_results['PROFILES'])) {
|
|
//Case 1
|
|
$profile = $this->criterias_results['PROFILES'];
|
|
}
|
|
|
|
if ($profile) {
|
|
$entities = [];
|
|
if (isset($params['_users_id_requester'])) { // Not set when testing
|
|
$entities
|
|
= Profile_User::getEntitiesForProfileByUser($params['_users_id_requester'],
|
|
$profile);
|
|
}
|
|
|
|
//Case 2 : check if there's only one profile for this user
|
|
if ((isset($this->criterias_results['ONE_PROFILE'])
|
|
&& (count($entities) == 1))
|
|
|| !isset($this->criterias_results['ONE_PROFILE'])) {
|
|
|
|
if (count($entities) == 1) {
|
|
//User has right on only one entity
|
|
$output['entities_id'] = array_pop($entities);
|
|
} else if (isset($this->criterias_results['UNIQUE_PROFILE'])) {
|
|
$output['entities_id'] = array_pop($entities);
|
|
} else {
|
|
|
|
//Rights on more than one entity : get the user's prefered entity
|
|
if (isset($params['_users_id_requester'])) { // Not set when testing
|
|
$user = new User();
|
|
$user->getFromDB($params['_users_id_requester']);
|
|
|
|
$tmpid = $user->getField('entities_id');
|
|
|
|
// Retrieve all the entities (pref could be set on a child)
|
|
$entities
|
|
= Profile_User::getEntitiesForProfileByUser($params['_users_id_requester'],
|
|
$profile, true);
|
|
|
|
// If an entity is defined in user's preferences,
|
|
// and this entity allowed for this profile, use this one
|
|
// else do not set the rule as matched
|
|
if (in_array($tmpid, $entities)) {
|
|
$output['entities_id'] = $user->fields['entities_id'];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case "regex_result" :
|
|
foreach ($this->regex_results as $regex_result) {
|
|
$entity_found = -1;
|
|
$res = RuleAction::getRegexResultById($action->fields["value"],
|
|
$regex_result);
|
|
if ($res != null) {
|
|
switch ($action->fields["field"]) {
|
|
case "_affect_entity_by_domain" :
|
|
$entity_found = Entity::getEntityIDByDomain(addslashes($res));
|
|
break;
|
|
|
|
case "_affect_entity_by_tag" :
|
|
$entity_found = Entity::getEntityIDByTag(addslashes($res));
|
|
break;
|
|
}
|
|
|
|
//If an entity was found
|
|
if ($entity_found > -1) {
|
|
$output['entities_id'] = $entity_found;
|
|
break;
|
|
}
|
|
}
|
|
} // switch (field)
|
|
break;
|
|
default:
|
|
//Allow plugins actions
|
|
$executeaction = clone $this;
|
|
$output = $executeaction->executePluginsActions($action, $output, $params, $input);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return $output;
|
|
}
|
|
|
|
}
|