.
* ---------------------------------------------------------------------
*/
if (!defined('GLPI_ROOT')) {
die("Sorry. You can't access this file directly");
}
/// Class Domain
class Domain extends CommonDropdown {
static $rightname = 'domain';
static protected $forward_entity_to = ['DomainRecord'];
public $can_be_translated = false;
public $dohistory = true;
protected $usenotepadrights = true;
protected $usenotepad = true;
static $tags = '[DOMAIN_NAME]';
static function getTypeName($nb = 0) {
return _n('Domain', 'Domains', $nb);
}
function cleanDBonPurge() {
global $DB;
$ditem = new Domain_Item();
$ditem->deleteByCriteria(['domains_id' => $this->fields['id']]);
$record = new DomainRecord();
$iterator = $DB->request([
'SELECT' => 'id',
'FROM' => $record->getTable(),
'WHERE' => [
'domains_id' => $this->fields['id']
]
]);
while ($row = $iterator->next()) {
$row['_linked_purge'] = 1;//flag call when we remove a record from a domain
$record->delete($row, true);
}
}
function rawSearchOptions() {
$tab = [];
$tab[] = [
'id' => 'common',
'name' => self::getTypeName(2)
];
$tab[] = [
'id' => '1',
'table' => $this->getTable(),
'field' => 'name',
'name' => __('Name'),
'datatype' => 'itemlink',
'itemlink_type' => $this->getType(),
];
$tab[] = [
'id' => '2',
'table' => 'glpi_domaintypes',
'field' => 'name',
'name' => _n('Type', 'Types', 1),
'datatype' => 'dropdown'
];
$tab[] = [
'id' => '3',
'table' => 'glpi_users',
'field' => 'name',
'linkfield' => 'users_id_tech',
'name' => __('Technician in charge'),
'datatype' => 'dropdown'
];
$tab[] = [
'id' => '5',
'table' => $this->getTable(),
'field' => 'date_creation',
'name' => __('Creation date'),
'datatype' => 'date'
];
$tab[] = [
'id' => '6',
'table' => $this->getTable(),
'field' => 'date_expiration',
'name' => __('Expiration date'),
'datatype' => 'date'
];
$tab[] = [
'id' => '7',
'table' => $this->getTable(),
'field' => 'comment',
'name' => __('Comments'),
'datatype' => 'text'
];
$tab[] = [
'id' => '8',
'table' => 'glpi_domains_items',
'field' => 'items_id',
'nosearch' => true,
'massiveaction' => false,
'name' => _n('Associated item', 'Associated items', Session::getPluralNumber()),
'forcegroupby' => true,
'joinparams' => [
'jointype' => 'child'
]
];
$tab[] = [
'id' => '9',
'table' => $this->getTable(),
'field' => 'others',
'name' => __('Others')
];
$tab[] = [
'id' => '10',
'table' => 'glpi_groups',
'field' => 'name',
'linkfield' => 'groups_id_tech',
'name' => __('Group in charge'),
'condition' => ['is_assign' => 1],
'datatype' => 'dropdown'
];
$tab[] = [
'id' => '12',
'table' => $this->getTable(),
'field' => 'date_mod',
'massiveaction' => false,
'name' => __('Last update'),
'datatype' => 'datetime'
];
$tab[] = [
'id' => '18',
'table' => $this->getTable(),
'field' => 'is_recursive',
'name' => __('Child entities'),
'datatype' => 'bool'
];
$tab[] = [
'id' => '30',
'table' => $this->getTable(),
'field' => 'id',
'name' => __('ID'),
'datatype' => 'number'
];
$tab[] = [
'id' => '80',
'table' => 'glpi_entities',
'field' => 'completename',
'name' => Entity::getTypeName(1),
'datatype' => 'dropdown'
];
$tab[] = [
'id' => '81',
'table' => 'glpi_entities',
'field' => 'entities_id',
'name' => __('Entity-ID')
];
return $tab;
}
public static function rawSearchOptionsToAdd($itemtype = null) {
$tab = [];
if (in_array($itemtype, Domain::getTypes(true))) {
if (Session::haveRight("domain", READ)) {
$tab[] = [
'id' => 'domain',
'name' => self::getTypeName(Session::getPluralNumber())
];
$tab[] = [
'id' => '205',
'table' => Domain::getTable(),
'field' => 'name',
'name' => __('Name'),
'forcegroupby' => true,
'datatype' => 'itemlink',
'itemlink_type' => 'Domain',
'massiveaction' => false,
'joinparams' => [
'beforejoin' => [
'table' => Domain_Item::getTable(),
'joinparams' => ['jointype' => 'itemtype_item']
]
]
];
$tab[] = [
'id' => '206',
'table' => DomainType::getTable(),
'field' => 'name',
'name' => DomainType::getTypeName(1),
'forcegroupby' => true,
'datatype' => 'dropdown',
'massiveaction' => false,
'joinparams' => [
'beforejoin' => [
'table' => Domain::getTable(),
'joinparams' => [
'beforejoin' => [
'table' => Domain_Item::getTable(),
'joinparams' => ['jointype' => 'itemtype_item']
]
]
]
]
];
}
}
return $tab;
}
function defineTabs($options = []) {
$ong = [];
$this->addDefaultFormTab($ong);
$this->addImpactTab($ong, $options);
$this->addStandardTab('DomainRecord', $ong, $options);
$this->addStandardTab('Domain_Item', $ong, $options);
$this->addStandardTab('Infocom', $ong, $options);
$this->addStandardTab('Ticket', $ong, $options);
$this->addStandardTab('Item_Problem', $ong, $options);
$this->addStandardTab('Change_Item', $ong, $options);
$this->addStandardTab('Contract_Item', $ong, $options);
$this->addStandardTab('Document_Item', $ong, $options);
$this->addStandardTab('Certificate_Item', $ong, $options);
$this->addStandardTab('Link', $ong, $options);
$this->addStandardTab('Notepad', $ong, $options);
$this->addStandardTab('Log', $ong, $options);
return $ong;
}
private function prepareInput($input) {
if (isset($input['date_creation']) && empty($input['date_creation'])) {
$input['date_creation'] = 'NULL';
}
if (isset($input['date_expiration']) && empty($input['date_expiration'])) {
$input['date_expiration'] = 'NULL';
}
return $input;
}
function prepareInputForAdd($input) {
return $this->prepareInput($input);
}
function prepareInputForUpdate($input) {
return $this->prepareInput($input);
}
function showForm($ID, $options = []) {
$this->initForm($ID, $options);
$this->showFormHeader($options);
echo "
";
echo "| " . __('Name') . " | ";
echo "";
Html::autocompletionTextField($this, "name");
echo " | ";
echo "" . __('Others') . " | ";
echo "";
Html::autocompletionTextField($this, "others");
echo " | ";
echo "
";
echo "";
echo "| " . __('Creation date') . " | ";
echo "";
Html::showDateField("date_creation", ['value' => $this->fields["date_creation"]]);
echo " | ";
echo "" . _n('Type', 'Types', 1) . " | ";
Dropdown::show('DomainType', ['name' => "domaintypes_id",
'value' => $this->fields["domaintypes_id"],
'entity' => $this->fields["entities_id"]]);
echo " | ";
echo "
";
echo "";
echo "| " . __('Expiration date');
echo " ";
Html::showToolTip(nl2br(__('Empty for infinite')));
echo " | ";
echo "";
Html::showDateField("date_expiration", ['value' => $this->fields["date_expiration"]]);
echo " | ";
echo "" . __('Technician in charge') . " | ";
User::dropdown(['name' => "users_id_tech",
'value' => $this->fields["users_id_tech"],
'entity' => $this->fields["entities_id"],
'right' => 'interface']);
echo " | ";
echo "
";
echo "";
echo "| " . __('Group in charge') . " | ";
echo "";
Dropdown::show('Group', ['name' => "groups_id_tech",
'value' => $this->fields["groups_id_tech"],
'entity' => $this->fields["entities_id"],
'condition' => ['is_assign' => 1]]);
echo " | ";
echo "
";
echo "";
echo "| ";
echo __('Comments') . " | ";
echo "";
echo "";
echo " | ";
echo "
";
$this->showFormButtons($options);
return true;
}
/**
* Make a select box for link domains
*
* Parameters which could be used in options array :
* - name : string / name of the select (default is documents_id)
* - entity : integer or array / restrict to a defined entity or array of entities
* (default -1 : no restriction)
* - used : array / Already used items ID: not to display in dropdown (default empty)
*
* @param $options array of possible options
*
* @return void
* */
static function dropdownDomains($options = []) {
global $DB;
$p = [
'name' => 'domains_id',
'entity' => '',
'used' => [],
'display' => true,
];
if (is_array($options) && count($options)) {
foreach ($options as $key => $val) {
$p[$key] = $val;
}
}
$rand = mt_rand();
$where = [
'glpi_domains.is_deleted' => 0
] + getEntitiesRestrictCriteria(self::getTable(), '', $p['entity'], true);
if (count($p['used'])) {
$where['NOT'] = ['id' => $p['used']];
}
$iterator = $DB->request([
'FROM' => self::getTable(),
'WHERE' => $where
]);
$values = [0 => Dropdown::EMPTY_VALUE];
while ($data = $iterator->next()) {
$values[$data['id']] = $data['name'];
}
$out = Dropdown::showFromArray(
'domains_id',
$values, [
'width' => '30%',
'rand' => $rand,
'display' => false
]
);
if ($p['display']) {
echo $out;
return $rand;
}
return $out;
}
function getSpecificMassiveActions($checkitem = null) {
$isadmin = static::canUpdate();
$actions = parent::getSpecificMassiveActions($checkitem);
if ($_SESSION['glpiactiveprofile']['interface'] == 'central') {
if ($isadmin) {
$actions['Domain' . MassiveAction::CLASS_ACTION_SEPARATOR . 'install'] = _x('button', 'Associate');
$actions['Domain' . MassiveAction::CLASS_ACTION_SEPARATOR . 'uninstall'] = _x('button', 'Dissociate');
$actions['Domain' . MassiveAction::CLASS_ACTION_SEPARATOR . 'duplicate'] = _x('button', 'Duplicate');
}
}
return $actions;
}
static function showMassiveActionsSubForm(MassiveAction $ma) {
switch ($ma->getAction()) {
case 'add_item':
self::dropdownDomains([]);
echo " " .
Html::submit(_x('button', 'Post'), ['name' => 'massiveaction']);
return true;
case "install" :
Dropdown::showSelectItemFromItemtypes([
'items_id_name' => 'item_item',
'itemtype_name' => 'typeitem',
'itemtypes' => self::getTypes(true),
'checkright' => true,
]);
echo Html::submit(_x('button', 'Post'), ['name' => 'massiveaction']);
return true;
break;
case "uninstall" :
Dropdown::showSelectItemFromItemtypes([
'items_id_name' => 'item_item',
'itemtype_name' => 'typeitem',
'itemtypes' => self::getTypes(true),
'checkright' => true,
]);
echo Html::submit(_x('button', 'Post'), ['name' => 'massiveaction']);
return true;
break;
case "duplicate" :
Dropdown::show('Entity');
break;
}
return parent::showMassiveActionsSubForm($ma);
}
static function processMassiveActionsForOneItemtype(MassiveAction $ma, CommonDBTM $item, array $ids) {
$domain_item = new Domain_Item();
switch ($ma->getAction()) {
case "add_item":
$input = $ma->getInput();
foreach ($ids as $id) {
$input = ['domains_id' => $input['domains_id'],
'items_id' => $id,
'itemtype' => $item->getType()];
if ($domain_item->can(-1, UPDATE, $input)) {
if ($domain_item->add($input)) {
$ma->itemDone($item->getType(), $id, MassiveAction::ACTION_OK);
} else {
$ma->itemDone($item->getType(), $ids, MassiveAction::ACTION_KO);
}
} else {
$ma->itemDone($item->getType(), $ids, MassiveAction::ACTION_KO);
}
}
return;
case 'install' :
$input = $ma->getInput();
foreach ($ids as $key) {
if ($item->can($key, UPDATE)) {
$values = ['domains_id' => $key,
'items_id' => $input["item_item"],
'itemtype' => $input['typeitem']];
if ($domain_item->add($values)) {
$ma->itemDone($item->getType(), $key, MassiveAction::ACTION_OK);
} else {
$ma->itemDone($item->getType(), $key, MassiveAction::ACTION_KO);
}
} else {
$ma->itemDone($item->getType(), $key, MassiveAction::ACTION_NORIGHT);
$ma->addMessage($item->getErrorMessage(ERROR_RIGHT));
}
}
return;
case 'uninstall':
$input = $ma->getInput();
foreach ($ids as $key) {
if ($domain_item->deleteItemByDomainsAndItem($key, $input['item_item'], $input['typeitem'])) {
$ma->itemDone($item->getType(), $key, MassiveAction::ACTION_OK);
} else {
$ma->itemDone($item->getType(), $key, MassiveAction::ACTION_KO);
}
}
return;
case "duplicate" :
if ($item->getType() == 'Domain') {
$input = $ma->getInput();
foreach (array_keys($ids) as $key) {
$item->getFromDB($key);
unset($item->fields["id"]);
$item->fields["name"] = addslashes($item->fields["name"]);
$item->fields["comment"] = addslashes($item->fields["comment"]);
$item->fields["entities_id"] = $input['entities_id'];
if ($item->add($item->fields)) {
$ma->itemDone($item->getType(), $key, MassiveAction::ACTION_OK);
} else {
$ma->itemDone($item->getType(), $key, MassiveAction::ACTION_KO);
}
}
}
break;
}
parent::processMassiveActionsForOneItemtype($ma, $item, $ids);
}
static function cronInfo($name) {
switch ($name) {
case 'DomainsAlert':
return [
'description' => __('Expired or expiring domains')];
break;
}
return [];
}
/**
* Criteria for expired domains
*
* @param integer $entities_id Entity ID
*
* @return array
*/
static function expiredDomainsCriteria($entities_id) :array {
global $DB;
$delay = Entity::getUsedConfig('send_domains_alert_expired_delay', $entities_id);
return [
'FROM' => self::getTable(),
'WHERE' => [
'NOT' => ['date_expiration' => null],
'is_deleted' => 0,
new QueryExpression("DATEDIFF(CURDATE(), " . $DB->quoteName('date_expiration') . ") > $delay"),
new QueryExpression("DATEDIFF(CURDATE(), " . $DB->quoteName('date_expiration') . ") > 0")
]
];
}
/**
* Criteria for domains closed expiries
*
* @param integer $entities_id Entity ID
*
* @return array
*/
static function closeExpiriesDomainsCriteria ($entities_id) :array {
global $DB;
$delay = Entity::getUsedConfig('send_domains_alert_close_expiries_delay', $entities_id);
return [
'FROM' => self::getTable(),
'WHERE' => [
'NOT' => ['date_expiration' => null],
'is_deleted' => 0,
new QueryExpression("DATEDIFF(CURDATE(), " . $DB->quoteName('date_expiration') . ") > -$delay"),
new QueryExpression("DATEDIFF(CURDATE(), " . $DB->quoteName('date_expiration') . ") < 0")
]
];
}
/**
* Cron action on domains : ExpiredDomains or DomainsWhichExpire
*
* @param CronTask $task for log, if NULL display
*
*
* @return int
*/
static function cronDomainsAlert($task = null) {
global $DB, $CFG_GLPI;
if (!$CFG_GLPI["notifications_mailing"]) {
return 0;
}
$message = [];
$cron_status = 0;
foreach (Entity::getEntitiesToNotify('use_domains_alert') as $entity => $value) {
$query_expired = self::expiredDomainsCriteria($entity);
$query_whichexpire = self::closeExpiriesDomainsCriteria($entity);
$querys = [
Alert::NOTICE => $query_whichexpire,
Alert::END => $query_expired
];
$domain_infos = [];
$domain_messages = [];
foreach ($querys as $type => $query) {
$domain_infos[$type] = [];
$iterator = $DB->request($query);
while ($data = $iterator->next()) {
$message = $data["name"] . ": " .
Html::convDate($data["date_expiration"]) . "
\n";
$domain_infos[$type][$entity][] = $data;
if (!isset($domain_messages[$type][$entity])) {
$domain_messages[$type][$entity] = __('Domains expired since more') . "
";
}
$domain_messages[$type][$entity] .= $message;
}
}
foreach (array_keys($querys) as $type) {
foreach ($domain_infos[$type] as $entity => $domains) {
if (NotificationEvent::raiseEvent(($type == Alert::NOTICE ? "DomainsWhichExpire" : "ExpiredDomains"),
new Domain(),
['entities_id' => $entity,
'domains' => $domains])) {
$message = $domain_messages[$type][$entity];
$cron_status = 1;
if ($task) {
$task->log(Dropdown::getDropdownName("glpi_entities", $entity) . ": $message\n");
$task->addVolume(1);
} else {
Toolbox::addMessageAfterRedirect(Dropdown::getDropdownName("glpi_entities", $entity) . ": $message");
}
} else {
$message = sprintf(
'Domains alerts not send for entity %1$s',
Dropdown::getDropdownName("glpi_entities", $entity)
);
if ($task) {
$task->log($message . "\n");
} else {
Toolbox::addMessageAfterRedirect($message, false, ERROR);
}
}
}
}
}
return $cron_status;
}
/**
* Type than could be linked to a Rack
*
* @param $all boolean, all type, or only allowed ones
*
* @return array of types
* */
static function getTypes($all = false) {
global $CFG_GLPI;
$types = $CFG_GLPI['domain_types'];
if ($all) {
return $types;
}
// Only allowed types
foreach ($types as $key => $type) {
if (!class_exists($type)) {
continue;
}
$item = new $type();
if (!$item->canView()) {
unset($types[$key]);
}
}
return $types;
}
static function generateLinkContents($link, CommonDBTM $item) {
if (strstr($link, "[DOMAIN]")) {
$link = str_replace("[DOMAIN]", $item->getName(), $link);
return [$link];
}
return parent::generateLinkContents($link, $item);
}
public static function getUsed(array $used, $domaintype) {
global $DB;
$iterator = $DB->request([
'SELECT' => 'id',
'FROM' => self::getTable(),
'WHERE' => [
'id' => $used,
'domaintypes_id' => $domaintype
]
]);
$used = [];
while ($data = $iterator->next()) {
$used[$data['id']] = $data['id'];
}
return $used;
}
static function getAdditionalMenuLinks() {
$links = [];
if (static::canView()) {
$rooms = "" . DomainRecord::getTypeName(Session::getPluralNumber()). "";
$links[$rooms] = DomainRecord::getSearchURL(false);
}
if (count($links)) {
return $links;
}
return false;
}
static function getAdditionalMenuOptions() {
if (static::canView()) {
return [
'domainrecord' => [
'title' => DomainRecord::getTypeName(Session::getPluralNumber()),
'page' => DomainRecord::getSearchURL(false),
'links' => [
'add' => '/front/domainrecord.form.php',
'search' => '/front/domainrecord.php',
]
]
];
}
}
public function getCanonicalName() {
return rtrim($this->fields['name'], '.') . '.';
}
static function getIcon() {
return "fas fa-globe-americas";
}
}