. * --------------------------------------------------------------------- */ 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"; } }