This commit is contained in:
odain
2026-06-08 10:47:44 +02:00
parent 38b5414ab9
commit 38533ffcd2
6 changed files with 568 additions and 51 deletions

View File

@@ -94,7 +94,7 @@ define('DEFAULT_HASH_ALGO', PASSWORD_DEFAULT);
* @see utils::GetConfig() to load config from the current env, if metamodel is not loaded
* @package iTopORM
*/
class Config
#[AllowDynamicProperties] class Config
{
//protected $m_bIsLoaded = false;
protected $m_sFile = '';
@@ -2021,6 +2021,7 @@ class Config
protected $m_sAppSecret;
private bool $bPreserveComments;
private bool $bLegacyEvaluation;
/**
* Config constructor.
@@ -2028,13 +2029,15 @@ class Config
* @param string|null $sConfigFile
* @param bool $bLoadConfig
* @param bool $bPreserveComments
* @param bool $bLegacyEvaluation
*
* @throws \ConfigException
* @throws \CoreException
*/
public function __construct($sConfigFile = null, $bLoadConfig = true, bool $bPreserveComments = false)
public function __construct($sConfigFile = null, $bLoadConfig = true, bool $bPreserveComments = false, bool $bLegacyEvaluation = false)
{
$this->bPreserveComments = $bPreserveComments;
$this->bLegacyEvaluation = $bLegacyEvaluation;
$this->oConfigPlaceholdersResolver = new ConfigPlaceholdersResolver();
$this->m_sFile = $sConfigFile;
@@ -2143,21 +2146,23 @@ class Config
$sNoise = trim(ob_get_contents());
ob_end_clean();
/*if ($this->bPreserveComments) {
if ($this->bPreserveComments || ! $this->bLegacyEvaluation) {
try {
$oParser = (new ParserFactory())->createForNewestSupportedVersion();
foreach ($oParser->parse($sConfigCode) as $oNode) {
if ($oNode instanceof \PhpParser\Node\Stmt\Expression) {
/** @var \PhpParser\Node\Stmt\Expression $oNode */
/*$oExpr = $oNode->expr;
$oExpr = $oNode->expr;
if ($oExpr instanceof Assign) {
/** @var Assign $oExpr */
/*$oVar = $oExpr->var;
$oVar = $oExpr->var;
if ($oVar instanceof Variable && $oVar->name === "MyModuleSettings") {
if ($oExpr->expr instanceof Array_) {
$oPhpExpressionEvaluator = new PhpExpressionEvaluator();
$aArrayWithComments = $oPhpExpressionEvaluator->GetArrayWithComments($oExpr->expr);
$MyModuleSettings = array_replace_recursive($aArrayWithComments, $MyModuleSettings);
if (! $this->bLegacyEvaluation) {
$aArrayWithComments = $oPhpExpressionEvaluator->GetArray($oExpr->expr, $this->bPreserveComments);
$MyModuleSettings = array_replace_recursive($aArrayWithComments, $MyModuleSettings);
}
}
}
}
@@ -2166,7 +2171,7 @@ class Config
} catch (Error $e) {
var_dump($e);
}
}*/
}
} catch (Error $e) {
// PHP 7
throw new ConfigException(
@@ -2757,7 +2762,7 @@ class Config
foreach ($this->m_aModuleSettings as $sModule => $aProperties) {
fwrite($hFile, "\t'$sModule' => array (\n");
foreach ($aProperties as $sProperty => $value) {
/*if (is_string($value) && false !== strpos($value, 'PhpParserComment')) {
if (is_string($value) && false !== strpos($value, 'PhpParserComment')) {
$value = preg_replace(
["/.*StartPhpParserComment/", "/EndPhpParserComment/"],
['', ''],
@@ -2765,7 +2770,7 @@ class Config
);
fwrite($hFile, "\t\t$value\n");
continue;
}*/
}
$sNiceExport = self::PrettyVarExport($this->oItopConfigParser->GetVarValue('MyModuleSettings', $sProperty), $value, "\t\t");
fwrite($hFile, "\t\t'$sProperty' => $sNiceExport,\n");
}
@@ -2952,13 +2957,13 @@ class Config
}
$sExport = var_export($value, true);
/*if (strpos($sExport, 'PhpParserComment')) {
if (strpos($sExport, 'PhpParserComment')) {
$sExport = preg_replace(
["/.*StartPhpParserComment/", "/EndPhpParserComment',/"],
['', ''],
$sExport
);
}*/
}
$sNiceExport = str_replace(["\r\n", "\n", "\r"], "\n".$sIndentation, trim($sExport));
if (!$bForceIndentation) {
/** @var array $aImported */

View File

@@ -58,7 +58,7 @@ PHP;
}
}
public function GetArrayWithComments(Array_ $oArray): array
public function GetArray(Array_ $oArray, bool $bPreserveComments = true): array
{
$aRes = [];
$i = 0;
@@ -70,14 +70,19 @@ PHP;
} else {
$sKey = $this->EvaluateExpression($oItem->key);
}
foreach ($oItem->getComments() as $oComment) {
/** @var \PhpParser\Comment $oComment */
$aRes[] = 'StartPhpParserComment'.$oComment->getText().'EndPhpParserComment';
if ($bPreserveComments) {
foreach ($oItem->getComments() as $oComment) {
/** @var \PhpParser\Comment $oComment */
$aRes[] = 'StartPhpParserComment'.$oComment->getText().'EndPhpParserComment';
}
}
if ($oItem->value instanceof Array_) {
$aRes[$sKey] = $this->GetArrayWithComments($oItem->value);
$aRes[$sKey] = $this->GetArray($oItem->value, $bPreserveComments);
} elseif ($oItem->value instanceof Comment) {
$aRes[$sKey] = $oItem->value;
if ($bPreserveComments) {
$aRes[$sKey] = $oItem->value;
}
} else {
$aRes[$sKey] = $this->EvaluateExpression($oItem->value);
}

View File

@@ -24,6 +24,7 @@ namespace Combodo\iTop\Test\UnitTest\Module\iTopConfig;
use Combodo\iTop\Test\UnitTest\ItopTestCase;
use Config;
use http\Encoding\Stream\Inflate;
class ConfigTest extends ItopTestCase
{
@@ -91,32 +92,44 @@ class ConfigTest extends ItopTestCase
];
}
public function testPreserveModuleSettingsOnWriteToFile()
{
$sTmpFile = tempnam(sys_get_temp_dir(), "target");
$sConfigFile = __DIR__.'/ConfigTest/config-itop-modulesetting.php';
$oConfig = new Config($sConfigFile);
$oConfig->WriteToFile($sTmpFile);
$this->assertFileExists($sTmpFile);
$this->assertEquals($this->GetModuleSettingSection($sConfigFile), $this->GetModuleSettingSection($sTmpFile));
}
private function GetModuleSettingSection(string $sFilePath): string
{
preg_match('/\$MyModuleSettings[\w\W]*\/\*\*/m', file_get_contents($sFilePath), $aMatches);
return preg_replace(['/[ ]+/', '/[ ]+/'], [' ', ' '], $aMatches[0]);
}
public function testConfEvaluationIsTheSameWithPreviousAndCurrentAlgo()
public static function ConfEvaluationIsTheSameWithPreviousAndCurrentAlgoProvider() {
return [
'comments in module settings' => ['config-with-comments.php'],
'nominal case' => ['config-without-comments.php'],
];
}
/**
* @dataProvider ConfEvaluationIsTheSameWithPreviousAndCurrentAlgoProvider
*/
public function ConfEvaluationIsTheSameWithPreviousAndCurrentAlgo($sFile, $sExpectedContentFile)
{
$sTmpFile = $this->GetTemporaryFilePath();
$sConfigFile = __DIR__.'/ConfigTest/config-without-comments.php';
$oConfig = new Config($sConfigFile, true, true);
$sConfigFile = __DIR__."/ConfigTest/$sFile";
$oConfig = new Config($sConfigFile, true, false, false);
$oConfig->WriteToFile($sTmpFile);
$this->assertEquals(file_get_contents($sConfigFile), file_get_contents($sTmpFile));
$sExpected = file_get_contents(__DIR__."/ConfigTest/$sExpectedContentFile");
$sExpected = preg_replace('|\?\>\n|', '?>', $sExpected);
$this->assertEquals($sExpected, file_get_contents($sTmpFile));
}
public function testConfEvaluationIsTheSameWithPreviousAndCurrentAlgo()
{
$sFile = 'config-without-comments.php';
$this->ConfEvaluationIsTheSameWithPreviousAndCurrentAlgo($sFile, $sFile);
}
public function testConfEvaluationIsTheSameWithPreviousAndCurrentAlgoEvenWithCommentsInMopduleSettings()
{
$this->ConfEvaluationIsTheSameWithPreviousAndCurrentAlgo('config-without-comments.php', 'config-with-comments-afterevaluatonwithoutcomments.php');
}
public function testConfSavePreserveCommentsInModuleSettings()
@@ -126,6 +139,10 @@ class ConfigTest extends ItopTestCase
$oConfig = new Config($sConfigFile, true, true);
$oConfig->WriteToFile($sTmpFile);
$this->assertEquals(file_get_contents($sConfigFile), file_get_contents($sTmpFile));
$sExpected = file_get_contents($sConfigFile);
$sExpected = preg_replace('|\?\>\n|', '?>', $sExpected);
$sExpected = preg_replace('|.*COMMENT NOT PRESERVED HERE.*|', '', $sExpected);
$this->assertEquals($sExpected, file_get_contents($sTmpFile));
}
}

View File

@@ -0,0 +1,272 @@
<?php
/**
*
* Configuration file, generated by the iTop configuration wizard
*
* The file is used in MetaModel::LoadConfig() which does all the necessary initialization job
*
*/
$MySettings = array(
// access_message: Message displayed to the users when there is any access restriction
// default: 'iTop is temporarily frozen, please wait... (the admin team)'
'access_message' => 'iTop is temporarily frozen, please wait... (the admin team)',
// access_mode: Access mode: ACCESS_READONLY = 0, ACCESS_ADMIN_WRITE = 2, ACCESS_FULL = 3
// default: 3
'access_mode' => 3,
// activity_panel.entry_form_opened_by_default: Whether or not the new entry form will be automatically opened when viewing an object.
// default: false
'activity_panel.entry_form_opened_by_default' => false,
// activity_panel.show_author_name_below_entries: Whether or not to show the author friendlyname next to the date on the last entry.
// default: false
'activity_panel.show_author_name_below_entries' => false,
// allowed_login_types: List of login types allowed (separated by | ): form, external, basic, token
// default: 'form|external|basic|token'
'allowed_login_types' => 'form|external|basic|token',
// apc_cache.enabled: If set, the APC cache is allowed (the PHP extension must also be active)
// default: true
'apc_cache.enabled' => true,
// apc_cache.query_ttl: Time to live set in APC for the prepared queries (seconds - 0 means no timeout)
// default: 3600
'apc_cache.query_ttl' => 3600,
// app_root_url: Root URL used for navigating within the application, or from an email to the application (you can put $SERVER_NAME$ as a placeholder for the server's name)
// default: ''
'app_root_url' => '',
// behind_reverse_proxy: If true, then proxies custom header (X-Forwarded-*) are taken into account. Use only if the webserver is not publicly accessible (reachable only by the reverse proxy)
// default: false
'behind_reverse_proxy' => false,
// cron_max_execution_time: Duration (seconds) of the cron.php script : if exceeded the script will exit even if there are remaining tasks to process. Must be shorter than php max_execution_time setting (note than when using CLI, this is set to 0 by default which means unlimited). If cron.php is ran via web, it must be shorter than the web server response timeout.
// default: 600
'cron_max_execution_time' => 600,
// csv_file_default_charset: Character set used by default for downloading and uploading data as a CSV file. Warning: it is case sensitive (uppercase is preferable).
// default: 'ISO-8859-1'
'csv_file_default_charset' => 'ISO-8859-1',
'csv_import_charsets' => array (
),
// csv_import_history_display: Display the history tab in the import wizard
// default: false
'csv_import_history_display' => false,
// date_and_time_format: Format for date and time display (per language)
// default: array (
// 'default' =>
// array (
// 'date' => 'Y-m-d',
// 'time' => 'H:i:s',
// 'date_time' => '$date $time',
// ),
// )
'date_and_time_format' => ['default' => ['date' => 'Y-m-d', 'time' => 'H:i:s', 'date_time' => '$date $time']],
'db_host' => null,
'db_name' => null,
'db_pwd' => null,
'db_subname' => null,
'db_user' => null,
// deadline_format: The format used for displaying "deadline" attributes: any string with the following placeholders: $date$, $difference$
// default: '$difference$'
'deadline_format' => '$difference$',
'default_language' => 'EN US',
// email_asynchronous: If set, the emails are sent off line, which requires cron.php to be activated. Exception: some features like the email test utility will force the serialized mode
// default: false
'email_asynchronous' => false,
// email_default_sender_address: Default address provided in the email from header field.
// default: ''
'email_default_sender_address' => '',
// email_default_sender_label: Default label provided in the email from header field.
// default: ''
'email_default_sender_label' => '',
// email_transport: Mean to send emails: PHPMail (uses the function mail()), SMTP (implements the client protocol) or SMTP_OAuth (connect to the server using OAuth 2.0)
// default: 'PHPMail'
'email_transport' => 'PHPMail',
// email_validation_pattern: Regular expression to validate/detect the format of an eMail address
// default: '[a-zA-Z0-9._&\'-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z0-9-]{2,}'
'email_validation_pattern' => '[a-zA-Z0-9._&\'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]{2,}',
'encryption_key' => 'af1615adfaa712f0efa19e4d8c14ecb4a1d6d0cdecb3f9e611d3b6f2109c5469',
'encryption_library' => 'Sodium',
'fast_reload_interval' => '60',
// graphviz_path: Path to the Graphviz "dot" executable for graphing objects lifecycle
// default: '/usr/bin/dot'
'graphviz_path' => '/usr/bin/dot',
// high_cardinality_classes: List of classes with high cardinality (Force manual submit of search)
// default: array (
// )
'high_cardinality_classes' => [],
// inline_image_max_display_width: The maximum width (in pixels) when displaying images inside an HTML formatted attribute. Images will be displayed using this this maximum width.
// default: '250'
'inline_image_max_display_width' => '250',
// inline_image_max_storage_width: The maximum width (in pixels) when uploading images to be used inside an HTML formatted attribute. Images larger than the given size will be downsampled before storing them in the database.
// default: '1600'
'inline_image_max_storage_width' => '1600',
// lifecycle.transitions_sort_type: How transitions will be sorted in the GUI. Possible values are "xml", "alphabetical", "fixed" or "relative"
// default: 'relative'
'lifecycle.transitions_sort_type' => 'relative',
// link_set_attribute_qualifier: Link set from string: attribute qualifier (encloses both the attcode and the value)
// default: '\''
'link_set_attribute_qualifier' => '\'',
// link_set_attribute_separator: Link set from string: attribute separator
// default: ';'
'link_set_attribute_separator' => ';',
// link_set_item_separator: Link set from string: line separator
// default: '|'
'link_set_item_separator' => '|',
// link_set_max_edit_ext_key: Maximum number of items in the link that allow editing the remote external key. Above that limit, remote external key cannot be edited. Mind that setting this limit too high can have a negative impact on performances.
// default: 50
'link_set_max_edit_ext_key' => 50,
// link_set_value_separator: Link set from string: value separator (between the attcode and the value itself
// default: ':'
'link_set_value_separator' => ':',
'log_global' => true,
'log_issue' => true,
'log_notification' => true,
'log_web_service' => true,
'max_display_limit' => '30',
// max_linkset_output: Maximum number of items shown when getting a list of related items in an email, using the form $this->some_list$. 0 means no limit.
// default: 100
'max_linkset_output' => 100,
// mentions.allowed_classes: Classes which can be mentioned through the autocomplete in the caselogs. Key of the array must be a single character that will trigger the autocomplete, value must be a DM class (eg. "@" => "Person", "?" => "FAQ")
// default: array (
// '@' => 'Person',
// )
'mentions.allowed_classes' => ['@' => 'Person'],
'min_display_limit' => '20',
// online_help: Hyperlink to the online-help web page
// default: 'http://www.combodo.com/itop-help'
'online_help' => 'http://www.combodo.com/itop-help',
// optimize_requests_for_join_count: Optimize request joins to minimize the count (default is true, try to set it to false in case of performance issues)
// default: true
'optimize_requests_for_join_count' => true,
'password_hash_algo' => '2y',
// php_path: Path to the php executable in CLI mode
// default: 'php'
'php_path' => 'php',
// search_manual_submit: Force manual submit of search all requests
// default: false
'search_manual_submit' => false,
'secure_connection_required' => false,
// session_name: The name of the cookie used to store the PHP session id
// default: 'iTop'
'session_name' => 'iTop',
// shortcut_actions: Actions that are available as direct buttons next to the "Actions" menu
// default: 'UI:Menu:Modify,UI:Menu:New,UI:Menu:impacts_down,UI:Menu:impacts_up'
'shortcut_actions' => 'UI:Menu:Modify,UI:Menu:New,UI:Menu:impacts_down,UI:Menu:impacts_up',
// source_dir: Source directory for the datamodel files. (which gets compiled to env-production).
// default: ''
'source_dir' => '',
'standard_reload_interval' => '300',
// synchro_obsolete_replica_locks_object: Obsolete synchro replicas prevent object modification by any mean (eg. anonymization)
// default: true
'synchro_obsolete_replica_locks_object' => true,
// synchro_trace: Synchronization details: none, display, save (includes 'display')
// default: 'none'
'synchro_trace' => 'none',
// tag_set_item_separator: Tag set from string: tag label separator
// default: '|'
'tag_set_item_separator' => '|',
// timezone: Timezone (reference: http://php.net/manual/en/timezones.php). If empty, it will be left unchanged and MUST be explicitly configured in PHP
// default: 'Europe/Paris'
'timezone' => 'Europe/Paris',
// url_validation_pattern: Regular expression to validate/detect the format of an URL (URL attributes and Wiki formatting for Text attributes)
// default: '(https?|ftp)\\://([a-zA-Z0-9+!*(),;?&=\\$_.-]+(\\:[a-zA-Z0-9+!*(),;?&=\\$_.-]+)?@)?([a-zA-Z0-9-.]{3,})(\\:[0-9]{2,5})?(/([a-zA-Z0-9:%@+\\$_-]\\.?)+)*/?(\\?[a-zA-Z+&\\$_.-][a-zA-Z0-9;:[\\]@&%=+/\\$_.,-]*)?(#[a-zA-Z0-9_.-][a-zA-Z0-9+\\$_.-]*)?'
'url_validation_pattern' => '(https?|ftp)\://([a-zA-Z0-9+!*(),;?&=\$_.-]+(\:[a-zA-Z0-9+!*(),;?&=\$_.-]+)?@)?([a-zA-Z0-9-.]{3,})(\:[0-9]{2,5})?(/([a-zA-Z0-9:%@+\$_-]\.?)+)*/?(\?[a-zA-Z+&\$_.-][a-zA-Z0-9;:[\]@&%=+/\$_.,-]*)?(#[a-zA-Z0-9_.-][a-zA-Z0-9+\$_.-]*)?',
);
/**
*
* Modules specific settings
*
*/
$MyModuleSettings = array(
'combodo-hybridauth' => array (
//debug to add traces...
'debug' => false,
'providers' => array (
'Keycloak' =>
/* COMMENT NOT PRESERVED HERE*/
array (
'keys' =>
array (
/**
* sha
*
* dok
*/
'id' => 'my-clientid',
'secret' => 'my-secret',
),
'enabled' => false,
),
//url to access IdP
'url' => 'keycloak_url',
),
),
);
/**
*
* Data model modules to be loaded. Names are specified as relative paths
*
*/
$MyModules = array(
);
?>

View File

@@ -2,13 +2,234 @@
/**
*
* Configuration file, generated for the unit tests
*
* Configuration file, generated by the iTop configuration wizard
*
* The file is used in MetaModel::LoadConfig() which does all the necessary initialization job
*
*/
$MySettings = [
];
$MySettings = array(
// access_message: Message displayed to the users when there is any access restriction
// default: 'iTop is temporarily frozen, please wait... (the admin team)'
'access_message' => 'iTop is temporarily frozen, please wait... (the admin team)',
// access_mode: Access mode: ACCESS_READONLY = 0, ACCESS_ADMIN_WRITE = 2, ACCESS_FULL = 3
// default: 3
'access_mode' => 3,
// activity_panel.entry_form_opened_by_default: Whether or not the new entry form will be automatically opened when viewing an object.
// default: false
'activity_panel.entry_form_opened_by_default' => false,
// activity_panel.show_author_name_below_entries: Whether or not to show the author friendlyname next to the date on the last entry.
// default: false
'activity_panel.show_author_name_below_entries' => false,
// allowed_login_types: List of login types allowed (separated by | ): form, external, basic, token
// default: 'form|external|basic|token'
'allowed_login_types' => 'form|external|basic|token',
// apc_cache.enabled: If set, the APC cache is allowed (the PHP extension must also be active)
// default: true
'apc_cache.enabled' => true,
// apc_cache.query_ttl: Time to live set in APC for the prepared queries (seconds - 0 means no timeout)
// default: 3600
'apc_cache.query_ttl' => 3600,
// app_root_url: Root URL used for navigating within the application, or from an email to the application (you can put $SERVER_NAME$ as a placeholder for the server's name)
// default: ''
'app_root_url' => '',
// behind_reverse_proxy: If true, then proxies custom header (X-Forwarded-*) are taken into account. Use only if the webserver is not publicly accessible (reachable only by the reverse proxy)
// default: false
'behind_reverse_proxy' => false,
// cron_max_execution_time: Duration (seconds) of the cron.php script : if exceeded the script will exit even if there are remaining tasks to process. Must be shorter than php max_execution_time setting (note than when using CLI, this is set to 0 by default which means unlimited). If cron.php is ran via web, it must be shorter than the web server response timeout.
// default: 600
'cron_max_execution_time' => 600,
// csv_file_default_charset: Character set used by default for downloading and uploading data as a CSV file. Warning: it is case sensitive (uppercase is preferable).
// default: 'ISO-8859-1'
'csv_file_default_charset' => 'ISO-8859-1',
'csv_import_charsets' => array (
),
// csv_import_history_display: Display the history tab in the import wizard
// default: false
'csv_import_history_display' => false,
// date_and_time_format: Format for date and time display (per language)
// default: array (
// 'default' =>
// array (
// 'date' => 'Y-m-d',
// 'time' => 'H:i:s',
// 'date_time' => '$date $time',
// ),
// )
'date_and_time_format' => ['default' => ['date' => 'Y-m-d', 'time' => 'H:i:s', 'date_time' => '$date $time']],
'db_host' => null,
'db_name' => null,
'db_pwd' => null,
'db_subname' => null,
'db_user' => null,
// deadline_format: The format used for displaying "deadline" attributes: any string with the following placeholders: $date$, $difference$
// default: '$difference$'
'deadline_format' => '$difference$',
'default_language' => 'EN US',
// email_asynchronous: If set, the emails are sent off line, which requires cron.php to be activated. Exception: some features like the email test utility will force the serialized mode
// default: false
'email_asynchronous' => false,
// email_default_sender_address: Default address provided in the email from header field.
// default: ''
'email_default_sender_address' => '',
// email_default_sender_label: Default label provided in the email from header field.
// default: ''
'email_default_sender_label' => '',
// email_transport: Mean to send emails: PHPMail (uses the function mail()), SMTP (implements the client protocol) or SMTP_OAuth (connect to the server using OAuth 2.0)
// default: 'PHPMail'
'email_transport' => 'PHPMail',
// email_validation_pattern: Regular expression to validate/detect the format of an eMail address
// default: '[a-zA-Z0-9._&\'-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z0-9-]{2,}'
'email_validation_pattern' => '[a-zA-Z0-9._&\'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]{2,}',
'encryption_key' => 'af1615adfaa712f0efa19e4d8c14ecb4a1d6d0cdecb3f9e611d3b6f2109c5469',
'encryption_library' => 'Sodium',
'fast_reload_interval' => '60',
// graphviz_path: Path to the Graphviz "dot" executable for graphing objects lifecycle
// default: '/usr/bin/dot'
'graphviz_path' => '/usr/bin/dot',
// high_cardinality_classes: List of classes with high cardinality (Force manual submit of search)
// default: array (
// )
'high_cardinality_classes' => [],
// inline_image_max_display_width: The maximum width (in pixels) when displaying images inside an HTML formatted attribute. Images will be displayed using this this maximum width.
// default: '250'
'inline_image_max_display_width' => '250',
// inline_image_max_storage_width: The maximum width (in pixels) when uploading images to be used inside an HTML formatted attribute. Images larger than the given size will be downsampled before storing them in the database.
// default: '1600'
'inline_image_max_storage_width' => '1600',
// lifecycle.transitions_sort_type: How transitions will be sorted in the GUI. Possible values are "xml", "alphabetical", "fixed" or "relative"
// default: 'relative'
'lifecycle.transitions_sort_type' => 'relative',
// link_set_attribute_qualifier: Link set from string: attribute qualifier (encloses both the attcode and the value)
// default: '\''
'link_set_attribute_qualifier' => '\'',
// link_set_attribute_separator: Link set from string: attribute separator
// default: ';'
'link_set_attribute_separator' => ';',
// link_set_item_separator: Link set from string: line separator
// default: '|'
'link_set_item_separator' => '|',
// link_set_max_edit_ext_key: Maximum number of items in the link that allow editing the remote external key. Above that limit, remote external key cannot be edited. Mind that setting this limit too high can have a negative impact on performances.
// default: 50
'link_set_max_edit_ext_key' => 50,
// link_set_value_separator: Link set from string: value separator (between the attcode and the value itself
// default: ':'
'link_set_value_separator' => ':',
'log_global' => true,
'log_issue' => true,
'log_notification' => true,
'log_web_service' => true,
'max_display_limit' => '30',
// max_linkset_output: Maximum number of items shown when getting a list of related items in an email, using the form $this->some_list$. 0 means no limit.
// default: 100
'max_linkset_output' => 100,
// mentions.allowed_classes: Classes which can be mentioned through the autocomplete in the caselogs. Key of the array must be a single character that will trigger the autocomplete, value must be a DM class (eg. "@" => "Person", "?" => "FAQ")
// default: array (
// '@' => 'Person',
// )
'mentions.allowed_classes' => ['@' => 'Person'],
'min_display_limit' => '20',
// online_help: Hyperlink to the online-help web page
// default: 'http://www.combodo.com/itop-help'
'online_help' => 'http://www.combodo.com/itop-help',
// optimize_requests_for_join_count: Optimize request joins to minimize the count (default is true, try to set it to false in case of performance issues)
// default: true
'optimize_requests_for_join_count' => true,
'password_hash_algo' => '2y',
// php_path: Path to the php executable in CLI mode
// default: 'php'
'php_path' => 'php',
// search_manual_submit: Force manual submit of search all requests
// default: false
'search_manual_submit' => false,
'secure_connection_required' => false,
// session_name: The name of the cookie used to store the PHP session id
// default: 'iTop'
'session_name' => 'iTop',
// shortcut_actions: Actions that are available as direct buttons next to the "Actions" menu
// default: 'UI:Menu:Modify,UI:Menu:New,UI:Menu:impacts_down,UI:Menu:impacts_up'
'shortcut_actions' => 'UI:Menu:Modify,UI:Menu:New,UI:Menu:impacts_down,UI:Menu:impacts_up',
// source_dir: Source directory for the datamodel files. (which gets compiled to env-production).
// default: ''
'source_dir' => '',
'standard_reload_interval' => '300',
// synchro_obsolete_replica_locks_object: Obsolete synchro replicas prevent object modification by any mean (eg. anonymization)
// default: true
'synchro_obsolete_replica_locks_object' => true,
// synchro_trace: Synchronization details: none, display, save (includes 'display')
// default: 'none'
'synchro_trace' => 'none',
// tag_set_item_separator: Tag set from string: tag label separator
// default: '|'
'tag_set_item_separator' => '|',
// timezone: Timezone (reference: http://php.net/manual/en/timezones.php). If empty, it will be left unchanged and MUST be explicitly configured in PHP
// default: 'Europe/Paris'
'timezone' => 'Europe/Paris',
// url_validation_pattern: Regular expression to validate/detect the format of an URL (URL attributes and Wiki formatting for Text attributes)
// default: '(https?|ftp)\\://([a-zA-Z0-9+!*(),;?&=\\$_.-]+(\\:[a-zA-Z0-9+!*(),;?&=\\$_.-]+)?@)?([a-zA-Z0-9-.]{3,})(\\:[0-9]{2,5})?(/([a-zA-Z0-9:%@+\\$_-]\\.?)+)*/?(\\?[a-zA-Z+&\\$_.-][a-zA-Z0-9;:[\\]@&%=+/\\$_.,-]*)?(#[a-zA-Z0-9_.-][a-zA-Z0-9+\\$_.-]*)?'
'url_validation_pattern' => '(https?|ftp)\://([a-zA-Z0-9+!*(),;?&=\$_.-]+(\:[a-zA-Z0-9+!*(),;?&=\$_.-]+)?@)?([a-zA-Z0-9-.]{3,})(\:[0-9]{2,5})?(/([a-zA-Z0-9:%@+\$_-]\.?)+)*/?(\?[a-zA-Z+&\$_.-][a-zA-Z0-9;:[\]@&%=+/\$_.,-]*)?(#[a-zA-Z0-9_.-][a-zA-Z0-9+\$_.-]*)?',
);
/**
*
@@ -21,11 +242,7 @@ $MyModuleSettings = array(
'debug' => false,
'providers' => array (
'Keycloak' =>
/*
ga
bu
zo meu
*/
/* COMMENT NOT PRESERVED HERE*/
array (
'keys' =>
array (
@@ -50,5 +267,6 @@ $MyModuleSettings = array(
* Data model modules to be loaded. Names are specified as relative paths
*
*/
$MyModules = [
];
$MyModules = array(
);
?>

View File

@@ -66,7 +66,7 @@ $MySettings = array(
// date_and_time_format: Format for date and time display (per language)
// default: array (
// 'default' =>
// 'default' =>
// array (
// 'date' => 'Y-m-d',
// 'time' => 'H:i:s',
@@ -256,8 +256,8 @@ $MyModuleSettings = array(
'base_dn' => 'dc=yourcompany,dc=com',
'user_query' => '(&(uid=%1$s)(inetuserstatus=ACTIVE))',
'options' => array (
17 => 3,
8 => 0,
17 => 3,
8 => 0,
),
'start_tls' => false,
'debug' => false,
@@ -266,7 +266,7 @@ $MyModuleSettings = array(
),
'itop-attachments' => array (
'allowed_classes' => array (
0 => 'Ticket',
0 => 'Ticket',
),
'position' => 'relations',
'preview_max_width' => 290,
@@ -289,4 +289,4 @@ $MyModuleSettings = array(
*/
$MyModules = array(
);
?>
?>