grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026. -------------------------------------------------------------------------- */ /** @file * @brief */ if (!defined('GLPI_ROOT')) { die("Sorry. You can't access this file directly"); } /** * Config class **/ class Config extends CommonDBTM { // From CommonGLPI protected $displaylist = false; // From CommonDBTM public $auto_message_on_action = false; public $showdebug = true; static $rightname = 'config'; static function getTypeName($nb=0) { return __('Setup'); } /** * @see CommonGLPI::getMenuContent() * * @since version 0.85 **/ static function getMenuContent() { global $CFG_GLPI; $menu = array(); if (static::canView()) { $menu['title'] = _x('setup', 'General'); $menu['page'] = '/front/config.form.php'; $menu['options']['apiclient']['title'] = APIClient::getTypeName(Session::getPluralNumber()); $menu['options']['apiclient']['page'] = '/front/config.form.php?forcetab=Config$8'; $menu['options']['apiclient']['links']['search'] = '/front/config.form.php?forcetab=Config$8'; $menu['options']['apiclient']['links']['add'] = '/front/apiclient.form.php'; } if (count($menu)) { return $menu; } return false; } static function canCreate() { return false; } function defineTabs($options=array()) { $ong = array(); $this->addStandardTab(__CLASS__, $ong, $options); return $ong; } /** * Prepare input datas for updating the item * * @see CommonDBTM::prepareInputForUpdate() * * @param $input array of datas used to update the item * * @return the modified $input array **/ function prepareInputForUpdate($input) { global $CFG_GLPI; // Update only an item if (isset($input['context'])) { return $input; } // Process configuration for plugins if (!empty($input['config_context'])) { $config_context = $input['config_context']; unset($input['id']); unset($input['_glpi_csrf_token']); unset($input['update']); unset($input['config_context']); if ((!empty($input['config_class'])) && (class_exists($input['config_class'])) && (method_exists ($input['config_class'], 'configUpdate'))) { $config_method = $input['config_class'].'::configUpdate'; unset($input['config_class']); $input = call_user_func($config_method, $input); } $this->setConfigurationValues($config_context, $input); return false; } if (isset($input['allow_search_view']) && !$input['allow_search_view']) { // Global search need "view" $input['allow_search_global'] = 0; } if (isset($input["smtp_passwd"])) { if (empty($input["smtp_passwd"])) { unset($input["smtp_passwd"]); } else { $input["smtp_passwd"] = Toolbox::encrypt(stripslashes($input["smtp_passwd"]), GLPIKEY); } } if (isset($input["_blank_smtp_passwd"]) && $input["_blank_smtp_passwd"]) { $input['smtp_passwd'] = ''; } if (isset($input["proxy_passwd"])) { if (empty($input["proxy_passwd"])) { unset($input["proxy_passwd"]); } else { $input["proxy_passwd"] = Toolbox::encrypt(stripslashes($input["proxy_passwd"]), GLPIKEY); } } if (isset($input["_blank_proxy_passwd"]) && $input["_blank_proxy_passwd"]) { $input['proxy_passwd'] = ''; } // Manage DB Slave process if (isset($input['_dbslave_status'])) { $already_active = DBConnection::isDBSlaveActive(); if ($input['_dbslave_status']) { DBConnection::changeCronTaskStatus(true); if (!$already_active) { // Activate Slave from the "system" tab DBConnection::createDBSlaveConfig(); } else if (isset($input["_dbreplicate_dbhost"])) { // Change parameter from the "replicate" tab DBConnection::saveDBSlaveConf($input["_dbreplicate_dbhost"], $input["_dbreplicate_dbuser"], $input["_dbreplicate_dbpassword"], $input["_dbreplicate_dbdefault"]); } } if (!$input['_dbslave_status'] && $already_active) { DBConnection::deleteDBSlaveConfig(); DBConnection::changeCronTaskStatus(false); } } // Matrix for Impact / Urgence / Priority if (isset($input['_matrix'])) { $tab = array(); for ($urgency=1 ; $urgency<=5 ; $urgency++) { for ($impact=1 ; $impact<=5 ; $impact++) { $priority = $input["_matrix_${urgency}_${impact}"]; $tab[$urgency][$impact] = $priority; } } $input['priority_matrix'] = exportArrayToDB($tab); $input['urgency_mask'] = 0; $input['impact_mask'] = 0; for ($i=1 ; $i<=5 ; $i++) { if ($input["_urgency_${i}"]) { $input['urgency_mask'] += (1<<$i); } if ($input["_impact_${i}"]) { $input['impact_mask'] += (1<<$i); } } } // lock mechanism update if (isset( $input['lock_use_lock_item'])) { $input['lock_item_list'] = exportArrayToDB((isset($input['lock_item_list']) ? $input['lock_item_list'] : array())); } // Beware : with new management system, we must update each value unset($input['id']); unset($input['_glpi_csrf_token']); unset($input['update']); // Add skipMaintenance if maintenance mode update if (isset($input['maintenance_mode']) && $input['maintenance_mode']) { $_SESSION['glpiskipMaintenance'] = 1; $url = $CFG_GLPI['root_doc']."/index.php?skipMaintenance=1"; Session::addMessageAfterRedirect(sprintf(__('Maintenance mode activated. Backdoor using: %s'), "$url"), false, WARNING); } $this->setConfigurationValues('core', $input); return false; } static public function unsetUndisclosedFields(&$fields) { if (isset($fields['context']) && isset($fields['name'])) { if ($fields['context'] == 'core' && in_array($fields['name'], array('proxy_passwd', 'smtp_passwd'))) { unset($fields['value']); } } } /** * Print the config form for display * * @return Nothing (display) **/ function showFormDisplay() { global $CFG_GLPI; if (!self::canView()) { return false; } $canedit = Session::haveRight(self::$rightname, UPDATE); if ($canedit) { echo "
| " . __('Assistance') . " | |||
|---|---|---|---|
| " . __('Step for the hours (minutes)') . " | "; echo ""; Dropdown::showNumber('time_step', array('value' => $CFG_GLPI["time_step"], 'min' => 30, 'max' => 60, 'step' => 30, 'toadd' => array(1 => 1, 5 => 5, 10 => 10, 15 => 15, 20 => 20))); echo " | "; echo "" .__('Limit of the schedules for planning') . " | "; echo ""; Dropdown::showHours('planning_begin', array('value' => $CFG_GLPI["planning_begin"])); echo " -> "; Dropdown::showHours('planning_end', array('value' => $CFG_GLPI["planning_end"])); echo " |
| ".__('Default file size limit imported by the mails receiver')." | "; MailCollector::showMaxFilesize('default_mailcollector_filesize_max', $CFG_GLPI["default_mailcollector_filesize_max"]); echo " | "; echo "" . __('Use rich text for helpdesk') . " | ";
$id = 'alert'.mt_rand();
$param['on_change'] = '$("#'.$id.'").html("");
if ($(this).val() == 0) {
$("#'.$id.'").html(" '.__('You will lose the formatting of your data').'"); }'; Dropdown::showYesNo("use_rich_text", $CFG_GLPI["use_rich_text"], -1, $param); echo ""; echo " |
| " . __('Default heading when adding a document to a ticket') . " | "; DocumentCategory::dropdown(array('value' => $CFG_GLPI["documentcategories_id_forticket"], 'name' => "documentcategories_id_forticket")); echo " | "; echo "" . __('By default, a software may be linked to a ticket') . " | "; Dropdown::showYesNo("default_software_helpdesk_visible", $CFG_GLPI["default_software_helpdesk_visible"]); echo " |
| " . __('Keep tickets when purging hardware in the inventory') . " | "; Dropdown::showYesNo("keep_tickets_on_delete", $CFG_GLPI["keep_tickets_on_delete"]); echo " | ".__('Show personnal information in new ticket form (simplified interface)'); echo " | "; Dropdown::showYesNo('use_check_pref', $CFG_GLPI['use_check_pref']); echo " |
| " .__('Allow anonymous ticket creation (helpdesk.receiver)') . " | "; Dropdown::showYesNo("use_anonymous_helpdesk", $CFG_GLPI["use_anonymous_helpdesk"]); echo " | " . __('Allow anonymous followups (receiver)') . " | "; Dropdown::showYesNo("use_anonymous_followups", $CFG_GLPI["use_anonymous_followups"]); echo " |
| " . __('Matrix of calculus for priority'); echo " | ||||||
|---|---|---|---|---|---|---|
| ".__('Impact')." | "; for ($impact=5 ; $impact>=1 ; $impact--) { echo "".Ticket::getImpactName($impact).' '; if ($impact==3) { $isimpact[3] = 1; echo ""; } else { $isimpact[$impact] = (($CFG_GLPI['impact_mask']&(1<<$impact)) >0); Dropdown::showYesNo("_impact_${impact}", $isimpact[$impact]); } echo " | ";
}
echo "|||||
| ".__('Urgency')." | "; for ($impact=5 ; $impact>=1 ; $impact--) { echo ""; } echo " | |||||
| ".Ticket::getUrgencyName($urgency)." | "; echo ""; if ($urgency==3) { $isurgency[3] = 1; echo ""; } else { $isurgency[$urgency] = (($CFG_GLPI['urgency_mask']&(1<<$urgency)) >0); Dropdown::showYesNo("_urgency_${urgency}", $isurgency[$urgency]); } echo " | "; for ($impact=5 ; $impact>=1 ; $impact--) { $pri = round(($urgency+$impact)/2); if (isset($CFG_GLPI['priority_matrix'][$urgency][$impact])) { $pri = $CFG_GLPI['priority_matrix'][$urgency][$impact]; } if ($isurgency[$urgency] && $isimpact[$impact]) { $bgcolor=$_SESSION["glpipriority_$pri"]; echo ""; Ticket::dropdownPriority(array('value' => $pri, 'name' => "_matrix_${urgency}_${impact}")); echo " | "; } else { echo ""; } } echo " | |||
| "; echo ""; echo " | ||||||
| " . __('Personalization') . " | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| " . ($userpref?__('Language'):__('Default language')) . " | "; echo ""; if (Config::canUpdate() || !GLPI_DEMO_MODE) { Dropdown::showLanguages("language", array('value' => $data["language"])); } else { echo " "; } echo " | " . __('Date format') ." | "; echo ""; $date_formats = array(0 => __('YYYY-MM-DD'), 1 => __('DD-MM-YYYY'), 2 => __('MM-DD-YYYY')); Dropdown::showFromArray('date_format', $date_formats, array('value' => $data["date_format"])); echo " | ||||||
| ".__('Display order of surnames firstnames')." | "; $values = array(User::REALNAME_BEFORE => __('Surname, First name'), User::FIRSTNAME_BEFORE => __('First name, Surname')); Dropdown::showFromArray('names_format', $values, array('value' => $data["names_format"])); echo " | "; echo "" .__('Number format') . " | "; $values = array(0 => '1 234.56', 1 => '1,234.56', 2 => '1 234,56', 3 => '1234.56', 4 => '1234,56'); echo ""; Dropdown::showFromArray('number_format', $values, array('value' => $data["number_format"])); echo " | ||||||
| " . __('Results to display by page')." | "; // Limit using global config $value = (($data['list_limit'] < $CFG_GLPI['list_limit_max']) ? $data['list_limit'] : $CFG_GLPI['list_limit_max']); Dropdown::showNumber('list_limit', array('value' => $value, 'min' => 5, 'max' => $CFG_GLPI['list_limit_max'], 'step' => 5)); echo " | "; echo "".__('Go to created item after creation')." | "; echo ""; Dropdown::showYesNo("backcreated", $data["backcreated"]); echo " | "; echo "||||||
| " . __('Display the complete name in tree dropdowns') . " | "; Dropdown::showYesNo('use_flat_dropdowntree', $data["use_flat_dropdowntree"]); echo " | "; } else { echo ""; } if (!$userpref || ($CFG_GLPI['show_count_on_tabs'] != -1)) { echo " | ".__('Display counts in tabs')." | "; $values = array(0 => __('No'), 1 => __('Yes')); if (!$userpref) { $values[-1] = __('Never'); } Dropdown::showFromArray('show_count_on_tabs', $values, array('value' => $data["show_count_on_tabs"])); echo " | "; } else { echo ""; } echo " | ||||
| " . __('Show GLPI ID') . " | "; Dropdown::showYesNo("is_ids_visible", $data["is_ids_visible"]); echo " | "; } else { echo ""; } echo " | " . __('Keep devices when purging an item') . " | "; Dropdown::showYesNo('keep_devices_when_purging_item', $data['keep_devices_when_purging_item']); echo " | "; echo "|||||
| " . __('Notifications for my changes') . " | "; Dropdown::showYesNo("notification_to_myself", $data["notification_to_myself"]); echo " | "; if ($oncentral) { echo "".__('Results to display on home page')." | "; Dropdown::showNumber('display_count_on_home', array('value' => $data['display_count_on_home'], 'min' => 0, 'max' => 30)); echo " | "; } else { echo ""; } echo " | |||||
| " . __('PDF export font') . " | "; Dropdown::showFromArray("pdffont", GLPIPDF::getFontList(), array('value' => $data["pdffont"], 'width' => 200)); echo " | "; echo "".__('CSV delimiter')." | "; $values = array(';' => ';', ',' => ','); Dropdown::showFromArray('csv_delimiter', $values, array('value' => $data["csv_delimiter"])); echo " | "; echo "||||||
| " . __("Color palette") . " | "; $themes_files = scandir(GLPI_ROOT."/css/palettes/"); echo ""; echo " | "; echo "" . __('Layout')." | "; $layout_options = array('lefttab' => __("Tabs on left"), 'classic' => __("Classic view"), 'vsplit' => __("Vertical split")); echo ""; echo " | "; echo "||||||
| ".__('Enable high contrast')." | "; echo ""; Dropdown::showYesNo('highcontrast_css', $data['highcontrast_css']); echo " | "; echo ""; echo " | |||||||
| ".__('Assistance')." | |||||||||
| ".__('Private followups by default')." | "; Dropdown::showYesNo("followup_private", $data["followup_private"]); echo " | ". __('Show new tickets on the home page') . " | "; if (Session::haveRightsOr("ticket", array(Ticket::READMY, Ticket::READALL, Ticket::READASSIGN))) { Dropdown::showYesNo("show_jobs_at_login", $data["show_jobs_at_login"]); } else { echo Dropdown::getYesNo(0); } echo " | ||||||
| " . __('Private tasks by default') . " | "; Dropdown::showYesNo("task_private", $data["task_private"]); echo " | " . __('Request sources by default') . " | "; RequestType::dropdown(array('value' => $data["default_requesttypes_id"], 'name' => "default_requesttypes_id", 'condition' => 'is_active = 1 AND is_ticketheader = 1')); echo " | ||||||
| " . __('Tasks state by default') . " | "; Planning::dropdownState("task_state", $data["task_state"]); echo " | " . __('Automatically refresh the list of tickets (minutes)') . " | "; Dropdown::showNumber('refresh_ticket_list', array('value' => $data["refresh_ticket_list"], 'min' => 1, 'max' => 30, 'step' => 1, 'toadd' => array(0 => __('Never')))); echo " | ||||||
| ".__('Pre-select me as a technician when creating a ticket'). " | "; if (!$userpref || Session::haveRight('ticket', Ticket::OWN)) { Dropdown::showYesNo("set_default_tech", $data["set_default_tech"]); } else { echo Dropdown::getYesNo(0); } echo " | " . __('Pre-select me as a requester when creating a ticket') . " | "; if (!$userpref || Session::haveRight('ticket', CREATE)) { Dropdown::showYesNo("set_default_requester", $data["set_default_requester"]); } else { echo Dropdown::getYesNo(0); } echo " | ||||||
| " . __('Priority colors') . " | "; echo "";
echo "
| ||||||||
| ".__('Enable ticket timeline')." | "; echo ""; Dropdown::showYesNo('ticket_timeline', $data['ticket_timeline']); echo " | "; echo "" . __('Keep tabs replaced by the ticket timeline')." | "; Dropdown::showYesNo('ticket_timeline_keep_replaced_tabs', $data['ticket_timeline_keep_replaced_tabs']); echo " | ||||||
| ". __('Remote access key') ." | |||||||||
| ";
if (!empty($data["personal_token"])) {
//TRANS: %s is the generation date
echo " ".sprintf(__('generated on %s'), Html::convDateTime($data["personal_token_date"])); } echo " | "; echo $data["personal_token"]; echo " | "; echo " ".__('Regenerate'); echo " | |||||||
| ".__('Due date progression')." | |||||||||
| ".__('OK state color')." | "; echo ""; Html::showColorField('duedateok_color', array('value' => $data["duedateok_color"])); echo " | ||||||||
| ".__('Warning state color')." | "; echo ""; Html::showColorField('duedatewarning_color', array('value' => $data["duedatewarning_color"])); echo " | "; echo "".__('Warning state threshold')." | "; echo ""; Dropdown::showNumber("duedatewarning_less", array('value' => $data['duedatewarning_less'])); $elements = array('%' => '%', 'hours' => _n('Hour', 'Hours', Session::getPluralNumber()), 'days' => _n('Day', 'Days', Session::getPluralNumber())); echo " "; Dropdown::showFromArray("duedatewarning_unit", $elements, array('value' => $data['duedatewarning_unit'])); echo " | ||||||
| ".__('Critical state color')." | "; echo ""; Html::showColorField('duedatecritical_color', array('value' => $data["duedatecritical_color"])); echo " | "; echo "".__('Critical state threshold')." | "; echo ""; Dropdown::showNumber("duedatecritical_less", array('value' => $data['duedatecritical_less'])); echo " "; $elements = array('%' => '%', 'hours' => _n('Hour', 'Hours', Session::getPluralNumber()), 'days' => _n('Day', 'Days', Session::getPluralNumber())); Dropdown::showFromArray("duedatecritical_unit", $elements, array('value' => $data['duedatecritical_unit'])); echo " | ||||||
| ".__('Item locks')." | |||||||||
| " . __('Auto-lock Mode') . " | "; Dropdown::showYesNo("lock_autolock_mode", $data["lock_autolock_mode"]); echo " | ". __('Direct Notification (requester for unlock will be the notification sender)'). " | "; Dropdown::showYesNo("lock_directunlock_notification", $data["lock_directunlock_notification"]); echo " | ||||||
| "; echo ""; echo " | |||||||||
| " . __('PHP opcode cache') . " | |||
|---|---|---|---|
| " . sprintf(__('The "%s" extension is installed'), $ext) . " | " . phpversion($ext) . " | ||
".print_r($info, true)." | |||
| " . __('Memory') . " | " . sprintf(__('%1$s / %2$s'), $used, $max) . " | "; Html::displayProgressBar('100', $rate, array('simple' => true, 'forcepadding' => false)); echo " | |
| " . __('Hits rate') . " | " . sprintf(__('%1$s / %2$s'), $hits, $max) . " | "; Html::displayProgressBar('100', $rate, array('simple' => true, 'forcepadding' => false)); echo " | |
| " . __('Out of memory restart') . " | $max | "; echo " | |
| "; echo ""; _e('Reset'); echo " | |||
| " . sprintf(__('Installing and enabling the "%s" extension may improve GLPI performance'), $ext) . " | |||
| " . __('User data cache') . " | |||
| " . sprintf(__('The "%s" extension is installed'), $ext) . " | " . phpversion('apc') . " | ||
Info:".print_r($info, true)."Stat:".print_r($stat, true)." | |||
| " . __('Memory') . " | " . sprintf(__('%1$s / %2$s'), $used, $max) . " | "; Html::displayProgressBar('100', $rate, array('simple' => true, 'forcepadding' => false)); echo " | |
| " . __('Hits rate') . " | " . sprintf(__('%1$s / %2$s'), $hits, $max) . " | "; Html::displayProgressBar('100', $rate, array('simple' => true, 'forcepadding' => false)); echo " | |
| "; echo ""; _e('Reset'); echo " | |||
| " . sprintf(__('Installing the "%s" extension may improve GLPI performance'), $ext) . " | |||
| " . __('General setup') . " | |||
|---|---|---|---|
| " . __('Log Level') . " | "; $values[1] = __('1- Critical (login error only)'); $values[2] = __('2- Severe (not used)'); $values[3] = __('3- Important (successful logins)'); $values[4] = __('4- Notices (add, delete, tracking)'); $values[5] = __('5- Complete (all)'); Dropdown::showFromArray('event_loglevel', $values, array('value' => $CFG_GLPI["event_loglevel"])); echo " | ".__('Maximal number of automatic actions (run by CLI)')." | "; Dropdown::showNumber('cron_limit', array('value' => $CFG_GLPI["cron_limit"], 'min' => 1, 'max' => 30)); echo " |
| " . __('Logs in files (SQL, email, automatic action...)') . " | "; Dropdown::showYesNo("use_log_in_files", $CFG_GLPI["use_log_in_files"]); echo " | " . _n('SQL replica', 'SQL replicas', 1) . " | "; $active = DBConnection::isDBSlaveActive(); Dropdown::showYesNo("_dbslave_status", $active); echo " |
| ".__('Password security policy'); echo " | |||
| " . __('Password security policy validation') . " | "; echo ""; Dropdown::showYesNo("use_password_security", $CFG_GLPI["use_password_security"]); echo " | "; echo "" . __('Password minimum length') . " | "; echo ""; Dropdown::showNumber('password_min_length', array('value' => $CFG_GLPI["password_min_length"], 'min' => 4, 'max' => 30)); echo " | "; echo "
| " . __('Password need digit') . " | "; echo ""; Dropdown::showYesNo("password_need_number", $CFG_GLPI["password_need_number"]); echo " | "; echo "" . __('Password need lowercase character') . " | "; echo ""; Dropdown::showYesNo("password_need_letter", $CFG_GLPI["password_need_letter"]); echo " | "; echo "
| " . __('Password need uppercase character') . " | "; echo ""; Dropdown::showYesNo("password_need_caps", $CFG_GLPI["password_need_caps"]); echo " | "; echo "" . __('Password need symbol') . " | "; echo ""; Dropdown::showYesNo("password_need_symbol", $CFG_GLPI["password_need_symbol"]); echo " | "; echo "
| ".__('Maintenance mode'); echo " | |||
| " . __('Maintenance mode') . " | "; echo ""; Dropdown::showYesNo("maintenance_mode", $CFG_GLPI["maintenance_mode"]); echo " | "; //TRANS: Proxy port echo "" . __('Maintenance text') . " | "; echo ""; echo ""; echo " |
| ".__('Proxy configuration for upgrade check'); echo " | |||
| " . __('Server') . " | "; echo ""; //TRANS: Proxy port echo " | " . __('Port') . " | "; echo ""; echo " |
| " . __('Login') . " | "; echo ""; echo " | " . __('Password') . " | "; echo "";
echo " ".__('Clear'); echo " |
| "; echo ""; echo " | |||
| ". __('Information about system installation and configuration')." |
|---|
[code]\n \n";
echo "GLPI $ver (" . $CFG_GLPI['root_doc']." => " . GLPI_ROOT . ")\n";
echo "\n |
| Server |
\n \n";
echo wordwrap("Operating system: ".php_uname()."\n", $width, "\n\t");
$exts = get_loaded_extensions();
sort($exts);
echo wordwrap("PHP ".phpversion().' '.php_sapi_name()." (".implode(', ',$exts).")\n",
$width, "\n\t");
$msg = "Setup: ";
foreach (array('max_execution_time', 'memory_limit', 'post_max_size', 'safe_mode',
'session.save_handler', 'upload_max_filesize') as $key) {
$msg .= $key.'="'.ini_get($key).'" ';
}
echo wordwrap($msg."\n", $width, "\n\t");
$msg = 'Software: ';
if (isset($_SERVER["SERVER_SOFTWARE"])) {
$msg .= $_SERVER["SERVER_SOFTWARE"];
}
if (isset($_SERVER["SERVER_SIGNATURE"])) {
$msg .= ' ('.Html::clean($_SERVER["SERVER_SIGNATURE"]).')';
}
echo wordwrap($msg."\n", $width, "\n\t");
if (isset($_SERVER["HTTP_USER_AGENT"])) {
echo "\t" . $_SERVER["HTTP_USER_AGENT"] . "\n";
}
foreach ($DB->getInfo() as $key => $val) {
echo "$key: $val\n\t";
}
echo "\n";
self::checkWriteAccessToDirs(true);
toolbox::checkSELinux(true);
echo "\n |
| [/code]\n |
| ". __('To copy/paste in your support request')." |
\n \n";
include_once(GLPI_HTMLAWED);
$pm = new PHPMailer();
$sp = new SimplePie();
$deps = [[ 'name' => 'htmLawed',
'version' => hl_version() ,
'check' => 'hl_version' ],
[ 'name' => 'phpCas',
'version' => phpCAS::getVersion() ,
'check' => 'phpCAS' ],
[ 'name' => 'PHPMailer',
'version' => $pm->Version ,
'check' => 'PHPMailer' ],
[ 'name' => 'Zend Framework',
'check' => 'Zend\\Loader\\StandardAutoloader' ],
[ 'name' => 'zetacomponents/graph',
'check' => 'ezcGraph' ],
[ 'name' => 'SimplePie',
'version' => SIMPLEPIE_VERSION,
'check' => $sp ],
[ 'name' => 'TCPDF',
'version' => TCPDF_STATIC::getTCPDFVersion(),
'check' => 'TCPDF' ],
[ 'name' => 'ircmaxell/password-compat',
'check' => 'password_hash' ],
[ 'name' => 'ramsey/array_column',
'check' => 'array_column' ],
[ 'name' => 'michelf/php-markdown',
'check' => 'Michelf\\Markdown' ],
[ 'name' => 'true/punycode',
'check' => 'TrueBV\\Punycode' ],
[ 'name' => 'iacaml/autolink',
'check' => 'autolink' ],
[ 'name' => 'sabre/vobject',
'check' => 'Sabre\\VObject\\Component' ],
];
foreach ($deps as $dep) {
$path = self::getLibraryDir($dep['check']);
if ($path) {
echo "{$dep['name']} ";
if (isset($dep['version'])) {
echo "version {$dep['version']} ";
}
echo "in ($path)\n";
}
}
echo "\n". $errors[$tmperror]."
". sprintf(__('Check permissions to the directory: %s'), $dir). "'".__('The file could not be created.')."
". sprintf(__('Check permissions to the directory: %s'), GLPI_LOG_DIR)."".__('Web access to the files directory, should not be allowed')."
".
__('Check the .htaccess file and the web server configuration.')."