mirror of
https://github.com/Combodo/iTop.git
synced 2026-04-22 01:58:47 +02:00
Compare commits
19 Commits
feature/68
...
2.7.10
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2fd9523c16 | ||
|
|
a4f6f6e877 | ||
|
|
94c604a6af | ||
|
|
6995a3c641 | ||
|
|
9865bf0779 | ||
|
|
d5449cca42 | ||
|
|
5d38d22c50 | ||
|
|
99d69493d1 | ||
|
|
c9bb628c30 | ||
|
|
08e8d15d78 | ||
|
|
7b59df216b | ||
|
|
cb5eab812e | ||
|
|
c9b73a7fe2 | ||
|
|
3b2da39469 | ||
|
|
fc22d91232 | ||
|
|
b10bcb976d | ||
|
|
5a43448644 | ||
|
|
77409eed99 | ||
|
|
83a70daf68 |
@@ -425,6 +425,12 @@ class UserRightsProfile extends UserRightsAddOnAPI
|
|||||||
UR_ACTION_BULK_DELETE => 'bd',
|
UR_ACTION_BULK_DELETE => 'bd',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array $aUsersProfilesList Cache of users' profiles. Hash array of user ID => [profile ID => profile friendlyname, profile ID => profile friendlyname, ...]
|
||||||
|
* @since 2.7.10 3.0.4 3.1.1 3.2.0 N°6887
|
||||||
|
*/
|
||||||
|
private $aUsersProfilesList = [];
|
||||||
|
|
||||||
// Installation: create the very first user
|
// Installation: create the very first user
|
||||||
public function CreateAdministrator($sAdminUser, $sAdminPwd, $sLanguage = 'EN US')
|
public function CreateAdministrator($sAdminUser, $sAdminPwd, $sLanguage = 'EN US')
|
||||||
{
|
{
|
||||||
@@ -654,8 +660,12 @@ class UserRightsProfile extends UserRightsAddOnAPI
|
|||||||
$sAction = self::$m_aActionCodes[$iActionCode];
|
$sAction = self::$m_aActionCodes[$iActionCode];
|
||||||
|
|
||||||
$bStatus = null;
|
$bStatus = null;
|
||||||
|
// Cache user's profiles
|
||||||
|
if(false === array_key_exists($iUser, $this->aUsersProfilesList)){
|
||||||
|
$this->aUsersProfilesList[$iUser] = UserRights::ListProfiles($oUser);
|
||||||
|
}
|
||||||
// Call the API of UserRights because it caches the list for us
|
// Call the API of UserRights because it caches the list for us
|
||||||
foreach(UserRights::ListProfiles($oUser) as $iProfile => $oProfile)
|
foreach($this->aUsersProfilesList[$iUser] as $iProfile => $oProfile)
|
||||||
{
|
{
|
||||||
$bGrant = $this->GetProfileActionGrant($iProfile, $sClass, $sAction);
|
$bGrant = $this->GetProfileActionGrant($iProfile, $sClass, $sAction);
|
||||||
if (!is_null($bGrant))
|
if (!is_null($bGrant))
|
||||||
@@ -781,11 +791,16 @@ class UserRightsProfile extends UserRightsAddOnAPI
|
|||||||
// Note: this code is VERY close to the code of IsActionAllowed()
|
// Note: this code is VERY close to the code of IsActionAllowed()
|
||||||
$iUser = $oUser->GetKey();
|
$iUser = $oUser->GetKey();
|
||||||
|
|
||||||
|
// Cache user's profiles
|
||||||
|
if(false === array_key_exists($iUser, $this->aUsersProfilesList)){
|
||||||
|
$this->aUsersProfilesList[$iUser] = UserRights::ListProfiles($oUser);
|
||||||
|
}
|
||||||
|
|
||||||
// Note: The object set is ignored because it was interesting to optimize for huge data sets
|
// Note: The object set is ignored because it was interesting to optimize for huge data sets
|
||||||
// and acceptable to consider only the root class of the object set
|
// and acceptable to consider only the root class of the object set
|
||||||
$bStatus = null;
|
$bStatus = null;
|
||||||
// Call the API of UserRights because it caches the list for us
|
// Call the API of UserRights because it caches the list for us
|
||||||
foreach(UserRights::ListProfiles($oUser) as $iProfile => $oProfile)
|
foreach($this->aUsersProfilesList[$iUser] as $iProfile => $oProfile)
|
||||||
{
|
{
|
||||||
$bGrant = $this->GetClassStimulusGrant($iProfile, $sClass, $sStimulusCode);
|
$bGrant = $this->GetClassStimulusGrant($iProfile, $sClass, $sStimulusCode);
|
||||||
if (!is_null($bGrant))
|
if (!is_null($bGrant))
|
||||||
@@ -814,8 +829,9 @@ class UserRightsProfile extends UserRightsAddOnAPI
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find out which attribute is corresponding the the dimension 'owner org'
|
* @param string $sClass
|
||||||
* returns null if no such attribute has been found (no filtering should occur)
|
* @return string|null Find out which attribute is corresponding the dimension 'owner org'
|
||||||
|
* returns null if no such attribute has been found (no filtering should occur)
|
||||||
*/
|
*/
|
||||||
public static function GetOwnerOrganizationAttCode($sClass)
|
public static function GetOwnerOrganizationAttCode($sClass)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -604,10 +604,10 @@ class UserRightsProfile extends UserRightsAddOnAPI
|
|||||||
/**
|
/**
|
||||||
* Read and cache organizations allowed to the given user
|
* Read and cache organizations allowed to the given user
|
||||||
*
|
*
|
||||||
* @param $oUser
|
* @param User $oUser
|
||||||
* @param $sClass (not used here but can be used in overloads)
|
* @param string $sClass (not used here but can be used in overloads)
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array keys of the User allowed org
|
||||||
* @throws \CoreException
|
* @throws \CoreException
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ class ajax_page extends WebPage implements iTabbedPage
|
|||||||
$this->m_sReadyScript = "";
|
$this->m_sReadyScript = "";
|
||||||
//$this->add_header("Content-type: text/html; charset=utf-8");
|
//$this->add_header("Content-type: text/html; charset=utf-8");
|
||||||
$this->no_cache();
|
$this->no_cache();
|
||||||
$this->add_xframe_options();
|
$this->add_http_headers();
|
||||||
$this->m_oTabs = new TabManager();
|
$this->m_oTabs = new TabManager();
|
||||||
$this->sContentType = 'text/html';
|
$this->sContentType = 'text/html';
|
||||||
$this->sContentDisposition = 'inline';
|
$this->sContentDisposition = 'inline';
|
||||||
@@ -51,6 +51,16 @@ class ajax_page extends WebPage implements iTabbedPage
|
|||||||
utils::InitArchiveMode();
|
utils::InitArchiveMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disabling sending the header so that resource won't be blocked by CORB. See parent method documentation.
|
||||||
|
* @return void
|
||||||
|
* @since 2.7.10 3.0.4 3.1.2 3.2.0 N°4368 method creation
|
||||||
|
*/
|
||||||
|
public function add_xcontent_type_options()
|
||||||
|
{
|
||||||
|
// Nothing to do !
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @inheritDoc
|
* @inheritDoc
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
|
|||||||
@@ -1621,6 +1621,8 @@ class RestUtils
|
|||||||
*
|
*
|
||||||
* @return DBObject The object found
|
* @return DBObject The object found
|
||||||
* @throws Exception If the input structure is not valid or it could not find exactly one object
|
* @throws Exception If the input structure is not valid or it could not find exactly one object
|
||||||
|
*
|
||||||
|
* @see DBObject::CheckChangedExtKeysValues() generic method to check that we can access the linked object isn't used in that use case because values can be literal, OQL, friendlyname
|
||||||
*/
|
*/
|
||||||
public static function FindObjectFromKey($sClass, $key, $bAllowNullValue = false)
|
public static function FindObjectFromKey($sClass, $key, $bAllowNullValue = false)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4764,6 +4764,11 @@ EOF
|
|||||||
);
|
);
|
||||||
if ($bResult && (!$bPreview))
|
if ($bResult && (!$bPreview))
|
||||||
{
|
{
|
||||||
|
// doing the check will load multiple times same objects :/
|
||||||
|
// but it shouldn't cost too much on execution time
|
||||||
|
// user can mitigate by selecting less extkeys/lnk to set and/or less objects to update 🤷♂️
|
||||||
|
$oObj->CheckChangedExtKeysValues();
|
||||||
|
|
||||||
$oObj->DBUpdate();
|
$oObj->DBUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ class CSVPage extends WebPage
|
|||||||
parent::__construct($s_title);
|
parent::__construct($s_title);
|
||||||
$this->add_header("Content-type: text/plain; charset=".self::PAGES_CHARSET);
|
$this->add_header("Content-type: text/plain; charset=".self::PAGES_CHARSET);
|
||||||
$this->no_cache();
|
$this->no_cache();
|
||||||
$this->add_xframe_options();
|
$this->add_http_headers();
|
||||||
//$this->add_header("Content-Transfer-Encoding: binary");
|
//$this->add_header("Content-Transfer-Encoding: binary");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ class iTopWebPage extends NiceWebPage implements iTabbedPage
|
|||||||
$this->SetRootUrl(utils::GetAbsoluteUrlAppRoot());
|
$this->SetRootUrl(utils::GetAbsoluteUrlAppRoot());
|
||||||
$this->add_header("Content-type: text/html; charset=".self::PAGES_CHARSET);
|
$this->add_header("Content-type: text/html; charset=".self::PAGES_CHARSET);
|
||||||
$this->no_cache();
|
$this->no_cache();
|
||||||
$this->add_xframe_options();
|
$this->add_http_headers();
|
||||||
$this->add_linked_stylesheet("../css/jquery.treeview.css");
|
$this->add_linked_stylesheet("../css/jquery.treeview.css");
|
||||||
$this->add_linked_stylesheet("../css/jquery.autocomplete.css");
|
$this->add_linked_stylesheet("../css/jquery.autocomplete.css");
|
||||||
$this->add_linked_stylesheet("../css/jquery-ui-timepicker-addon.css");
|
$this->add_linked_stylesheet("../css/jquery-ui-timepicker-addon.css");
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ class LoginWebPage extends NiceWebPage
|
|||||||
parent::__construct($sTitle);
|
parent::__construct($sTitle);
|
||||||
$this->SetStyleSheet();
|
$this->SetStyleSheet();
|
||||||
$this->no_cache();
|
$this->no_cache();
|
||||||
$this->add_xframe_options();
|
$this->add_http_headers();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function SetStyleSheet()
|
public function SetStyleSheet()
|
||||||
|
|||||||
@@ -2340,6 +2340,38 @@ class utils
|
|||||||
return in_array($sClass, $aHugeClasses);
|
return in_array($sClass, $aHugeClasses);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper around the native strlen() PHP method to test a string for null or empty value
|
||||||
|
*
|
||||||
|
* @link https://www.php.net/releases/8.1/en.php#deprecations_and_bc_breaks "Passing null to non-nullable internal function parameters is deprecated"
|
||||||
|
*
|
||||||
|
* @param string|null $sString
|
||||||
|
*
|
||||||
|
* @return bool if string null or empty
|
||||||
|
* @since 3.0.2 N°5302
|
||||||
|
* @since 2.7.10 N°6458 add method in the 2.7 branch
|
||||||
|
*/
|
||||||
|
public static function IsNullOrEmptyString(?string $sString): bool
|
||||||
|
{
|
||||||
|
return $sString === null || strlen($sString) === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper around the native strlen() PHP method to test a string not null or empty value
|
||||||
|
*
|
||||||
|
* @link https://www.php.net/releases/8.1/en.php#deprecations_and_bc_breaks "Passing null to non-nullable internal function parameters is deprecated"
|
||||||
|
*
|
||||||
|
* @param string|null $sString
|
||||||
|
*
|
||||||
|
* @return bool if string is not null and not empty
|
||||||
|
* @since 3.0.2 N°5302
|
||||||
|
* @since 2.7.10 N°6458 add method in the 2.7 branch
|
||||||
|
*/
|
||||||
|
public static function IsNotNullOrEmptyString(?string $sString): bool
|
||||||
|
{
|
||||||
|
return !static::IsNullOrEmptyString($sString);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if iTop is in a development environment (VCS vs build number)
|
* Check if iTop is in a development environment (VCS vs build number)
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -483,12 +483,24 @@ class WebPage implements Page
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string|null $sHeaderValue for example `SAMESITE`. If null will set the header using the config parameter value.
|
* @param string|null $sXFrameOptionsHeaderValue passed to {@see add_xframe_options}
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @since 2.7.10 3.0.4 3.1.2 3.2.0 N°4368 method creation, replace {@see add_xframe_options} consumers call
|
||||||
|
*/
|
||||||
|
public function add_http_headers($sXFrameOptionsHeaderValue = null)
|
||||||
|
{
|
||||||
|
$this->add_xframe_options($sXFrameOptionsHeaderValue);
|
||||||
|
$this->add_xcontent_type_options();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string|null $sHeaderValue for example `SAMESITE`. If null will set the header using the `security_header_xframe` config parameter value.
|
||||||
*
|
*
|
||||||
* @since 2.7.3 3.0.0 N°3416
|
* @since 2.7.3 3.0.0 N°3416
|
||||||
* @uses security_header_xframe config parameter
|
|
||||||
* @uses \utils::GetConfig()
|
* @uses \utils::GetConfig()
|
||||||
* @link https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
|
*
|
||||||
|
* @link https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options HTTP header MDN documentation
|
||||||
*/
|
*/
|
||||||
public function add_xframe_options($sHeaderValue = null)
|
public function add_xframe_options($sHeaderValue = null)
|
||||||
{
|
{
|
||||||
@@ -499,6 +511,38 @@ class WebPage implements Page
|
|||||||
$this->add_header('X-Frame-Options: '.$sHeaderValue);
|
$this->add_header('X-Frame-Options: '.$sHeaderValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Warning : this header will trigger the Cross-Origin Read Blocking (CORB) protection for some mime types (HTML, XML except SVG, JSON, text/plain)
|
||||||
|
* In consequence some children pages will override this method.
|
||||||
|
*
|
||||||
|
* Sending header can be disabled globally using the `security.enable_header_xcontent_type_options` optional config parameter.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
* @since 2.7.10 3.0.4 3.1.2 3.2.0 N°4368 method creation
|
||||||
|
*
|
||||||
|
* @link https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options HTTP header MDN documentation
|
||||||
|
* @link https://chromium.googlesource.com/chromium/src/+/master/services/network/cross_origin_read_blocking_explainer.md#determining-whether-a-response-is-corb_protected "Determining whether a response is CORB-protected"
|
||||||
|
*/
|
||||||
|
public function add_xcontent_type_options()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$oConfig = utils::GetConfig();
|
||||||
|
} catch (ConfigException|CoreException $e) {
|
||||||
|
$oConfig = null;
|
||||||
|
}
|
||||||
|
if (is_null($oConfig)) {
|
||||||
|
$bSendXContentTypeOptionsHttpHeader = true;
|
||||||
|
} else {
|
||||||
|
$bSendXContentTypeOptionsHttpHeader = $oConfig->Get('security.enable_header_xcontent_type_options');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($bSendXContentTypeOptionsHttpHeader === false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->add_header('X-Content-Type-Options: nosniff');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add needed headers to the page so that it will no be cached
|
* Add needed headers to the page so that it will no be cached
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -44,10 +44,20 @@ class XMLPage extends WebPage
|
|||||||
$this->m_bHeaderSent = false;
|
$this->m_bHeaderSent = false;
|
||||||
$this->add_header("Content-type: text/xml; charset=".self::PAGES_CHARSET);
|
$this->add_header("Content-type: text/xml; charset=".self::PAGES_CHARSET);
|
||||||
$this->no_cache();
|
$this->no_cache();
|
||||||
$this->add_xframe_options();
|
$this->add_http_headers();
|
||||||
$this->add_header("Content-location: export.xml");
|
$this->add_header("Content-location: export.xml");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disabling sending the header so that resource won't be blocked by CORB. See parent method documentation.
|
||||||
|
* @return void
|
||||||
|
* @since 2.7.10 3.0.4 3.1.2 3.2.0 N°4368 method creation
|
||||||
|
*/
|
||||||
|
public function add_xcontent_type_options()
|
||||||
|
{
|
||||||
|
// Nothing to do !
|
||||||
|
}
|
||||||
|
|
||||||
public function output()
|
public function output()
|
||||||
{
|
{
|
||||||
if (!$this->m_bPassThrough)
|
if (!$this->m_bPassThrough)
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ define('APPCONF', APPROOT.'conf/');
|
|||||||
* @used-by utils::GetItopVersionWikiSyntax()
|
* @used-by utils::GetItopVersionWikiSyntax()
|
||||||
* @used-by iTopModulesPhpVersionIntegrationTest
|
* @used-by iTopModulesPhpVersionIntegrationTest
|
||||||
*/
|
*/
|
||||||
define('ITOP_CORE_VERSION', '2.7.9');
|
define('ITOP_CORE_VERSION', '2.7.10');
|
||||||
|
|
||||||
|
|
||||||
require_once APPROOT.'bootstrap.inc.php';
|
require_once APPROOT.'bootstrap.inc.php';
|
||||||
|
|||||||
@@ -134,6 +134,12 @@ class CMDBSource
|
|||||||
const ENUM_DB_VENDOR_MARIADB = 'MariaDB';
|
const ENUM_DB_VENDOR_MARIADB = 'MariaDB';
|
||||||
const ENUM_DB_VENDOR_PERCONA = 'Percona';
|
const ENUM_DB_VENDOR_PERCONA = 'Percona';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 2.7.10 3.0.4 3.1.2 3.0.2 N°6889 constant creation
|
||||||
|
* @internal will be removed in a future version
|
||||||
|
*/
|
||||||
|
const MYSQL_DEFAULT_PORT = 3306;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Error: 1205 SQLSTATE: HY000 (ER_LOCK_WAIT_TIMEOUT)
|
* Error: 1205 SQLSTATE: HY000 (ER_LOCK_WAIT_TIMEOUT)
|
||||||
* Message: Lock wait timeout exceeded; try restarting transaction
|
* Message: Lock wait timeout exceeded; try restarting transaction
|
||||||
@@ -319,16 +325,19 @@ class CMDBSource
|
|||||||
/**
|
/**
|
||||||
* @param string $sDbHost initial value ("p:domain:port" syntax)
|
* @param string $sDbHost initial value ("p:domain:port" syntax)
|
||||||
* @param string $sServer server variable to update
|
* @param string $sServer server variable to update
|
||||||
* @param int $iPort port variable to update
|
* @param int|null $iPort port variable to update, will return null if nothing is specified in $sDbHost
|
||||||
|
*
|
||||||
|
* @since 2.7.10 3.0.4 3.1.2 3.2.0 N°6889 will return null in $iPort if port isn't present in $sDbHost. Use {@see MYSQL_DEFAULT_PORT} if needed
|
||||||
|
*
|
||||||
|
* @link http://php.net/manual/en/mysqli.persistconns.php documentation for the "p:" prefix (persistent connexion)
|
||||||
*/
|
*/
|
||||||
public static function InitServerAndPort($sDbHost, &$sServer, &$iPort)
|
public static function InitServerAndPort($sDbHost, &$sServer, &$iPort)
|
||||||
{
|
{
|
||||||
$aConnectInfo = explode(':', $sDbHost);
|
$aConnectInfo = explode(':', $sDbHost);
|
||||||
|
|
||||||
$bUsePersistentConnection = false;
|
$bUsePersistentConnection = false;
|
||||||
if (strcasecmp($aConnectInfo[0], 'p') == 0)
|
if (strcasecmp($aConnectInfo[0], 'p') === 0)
|
||||||
{
|
{
|
||||||
// we might have "p:" prefix to use persistent connections (see http://php.net/manual/en/mysqli.persistconns.php)
|
|
||||||
$bUsePersistentConnection = true;
|
$bUsePersistentConnection = true;
|
||||||
$sServer = $aConnectInfo[0].':'.$aConnectInfo[1];
|
$sServer = $aConnectInfo[0].':'.$aConnectInfo[1];
|
||||||
}
|
}
|
||||||
@@ -346,10 +355,6 @@ class CMDBSource
|
|||||||
{
|
{
|
||||||
$iPort = (int)($aConnectInfo[1]);
|
$iPort = (int)($aConnectInfo[1]);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
$iPort = 3306;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1320,6 +1320,14 @@ class Config
|
|||||||
'source_of_value' => '',
|
'source_of_value' => '',
|
||||||
'show_in_conf_sample' => false,
|
'show_in_conf_sample' => false,
|
||||||
],
|
],
|
||||||
|
'security.enable_header_xcontent_type_options' => [
|
||||||
|
'type' => 'bool',
|
||||||
|
'description' => 'If set to false, iTop will stop sending the X-Content-Type-Options HTTP header. This header could trigger CORB protection on certain resources (JSON, XML, HTML, text) therefore blocking them.',
|
||||||
|
'default' => true,
|
||||||
|
'value' => '',
|
||||||
|
'source_of_value' => '',
|
||||||
|
'show_in_conf_sample' => false,
|
||||||
|
],
|
||||||
'behind_reverse_proxy' => [
|
'behind_reverse_proxy' => [
|
||||||
'type' => 'bool',
|
'type' => 'bool',
|
||||||
'description' => '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)',
|
'description' => '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)',
|
||||||
|
|||||||
@@ -229,12 +229,47 @@ class CoreUnexpectedValue extends CoreException
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 2.7.10 3.0.4 3.1.1 3.2.0 N°6458 object creation
|
||||||
|
*/
|
||||||
|
class InvalidExternalKeyValueException extends CoreUnexpectedValue
|
||||||
|
{
|
||||||
|
private const ENUM_PARAMS_OBJECT = 'current_object';
|
||||||
|
private const ENUM_PARAMS_ATTCODE = 'attcode';
|
||||||
|
private const ENUM_PARAMS_ATTVALUE = 'attvalue';
|
||||||
|
private const ENUM_PARAMS_USER = 'current_user';
|
||||||
|
|
||||||
|
public function __construct($oObject, $sAttCode, $aContextData = null, $oPrevious = null)
|
||||||
|
{
|
||||||
|
$aContextData[self::ENUM_PARAMS_OBJECT] = get_class($oObject) . '::' . $oObject->GetKey();
|
||||||
|
$aContextData[self::ENUM_PARAMS_ATTCODE] = $sAttCode;
|
||||||
|
$aContextData[self::ENUM_PARAMS_ATTVALUE] = $oObject->Get($sAttCode);
|
||||||
|
|
||||||
|
$oCurrentUser = UserRights::GetUserObject();
|
||||||
|
if (false === is_null($oCurrentUser)) {
|
||||||
|
$aContextData[self::ENUM_PARAMS_USER] = get_class($oCurrentUser) . '::' . $oCurrentUser->GetKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
parent::__construct('Attribute pointing to an object that is either non existing or not readable by the current user', $aContextData, '', $oPrevious);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function GetAttCode(): string
|
||||||
|
{
|
||||||
|
return $this->getContextData()[self::ENUM_PARAMS_ATTCODE];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function GetAttValue(): string
|
||||||
|
{
|
||||||
|
return $this->getContextData()[self::ENUM_PARAMS_ATTVALUE];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class SecurityException extends CoreException
|
class SecurityException extends CoreException
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Throwned when querying on an object that exists in the database but is archived
|
* Thrown when querying on an object that exists in the database but is archived
|
||||||
*
|
*
|
||||||
* @see N.1108
|
* @see N.1108
|
||||||
* @since 2.5.1
|
* @since 2.5.1
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
//
|
//
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
// along with iTop. If not, see <http://www.gnu.org/licenses/>
|
// along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
use Combodo\iTop\Application\Helper\ExportHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bulk export: CSV export
|
* Bulk export: CSV export
|
||||||
@@ -113,6 +114,7 @@ class CSVBulkExport extends TabularBulkExport
|
|||||||
|
|
||||||
case 'csv_options':
|
case 'csv_options':
|
||||||
$oP->add('<fieldset><legend>'.Dict::S('Core:BulkExport:CSVOptions').'</legend>');
|
$oP->add('<fieldset><legend>'.Dict::S('Core:BulkExport:CSVOptions').'</legend>');
|
||||||
|
$oP->add(ExportHelper::GetAlertForExcelMaliciousInjection());
|
||||||
$oP->add('<table class="export_parameters"><tr><td style="vertical-align:top">');
|
$oP->add('<table class="export_parameters"><tr><td style="vertical-align:top">');
|
||||||
$oP->add('<h3>'.Dict::S('UI:CSVImport:SeparatorCharacter').'</h3>');
|
$oP->add('<h3>'.Dict::S('UI:CSVImport:SeparatorCharacter').'</h3>');
|
||||||
$sRawSeparator = utils::ReadParam('separator', ',', true, 'raw_data');
|
$sRawSeparator = utils::ReadParam('separator', ',', true, 'raw_data');
|
||||||
|
|||||||
@@ -2140,7 +2140,6 @@ abstract class DBObject implements iDisplay
|
|||||||
* @throws \ArchivedObjectException
|
* @throws \ArchivedObjectException
|
||||||
* @throws \CoreException
|
* @throws \CoreException
|
||||||
* @throws \OQLException
|
* @throws \OQLException
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public function DoCheckToWrite()
|
public function DoCheckToWrite()
|
||||||
{
|
{
|
||||||
@@ -2195,7 +2194,6 @@ abstract class DBObject implements iDisplay
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @api
|
* @api
|
||||||
* @api-advanced
|
* @api-advanced
|
||||||
*
|
*
|
||||||
@@ -2211,7 +2209,6 @@ abstract class DBObject implements iDisplay
|
|||||||
* @throws \ArchivedObjectException
|
* @throws \ArchivedObjectException
|
||||||
* @throws \CoreException
|
* @throws \CoreException
|
||||||
* @throws \OQLException
|
* @throws \OQLException
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
final public function CheckToWrite()
|
final public function CheckToWrite()
|
||||||
{
|
{
|
||||||
@@ -2238,6 +2235,87 @@ abstract class DBObject implements iDisplay
|
|||||||
return array($this->m_bCheckStatus, $this->m_aCheckIssues, $this->m_bSecurityIssue);
|
return array($this->m_bCheckStatus, $this->m_aCheckIssues, $this->m_bSecurityIssue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks for extkey attributes values. This will throw exception on non-existing as well as non-accessible objects (silo, scopes).
|
||||||
|
* That's why the test is done for all users including Administrators
|
||||||
|
*
|
||||||
|
* Note that due to perf issues, this isn't called directly by the ORM, but has to be called by consumers when possible.
|
||||||
|
*
|
||||||
|
* @param callable(string, string):bool|null $oIsObjectLoadableCallback Override to check if object is accessible.
|
||||||
|
* Parameters are object class and key
|
||||||
|
* Return value should be false if cannot access object, true otherwise
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @throws ArchivedObjectException
|
||||||
|
* @throws CoreException if cannot get object attdef list
|
||||||
|
* @throws CoreUnexpectedValue
|
||||||
|
* @throws InvalidExternalKeyValueException
|
||||||
|
* @throws MySQLException
|
||||||
|
* @throws SecurityException if one extkey is pointing to an invalid value
|
||||||
|
*
|
||||||
|
* @link https://github.com/Combodo/iTop/security/advisories/GHSA-245j-66p9-pwmh
|
||||||
|
* @since 2.7.10 3.0.4 3.1.1 3.2.0 N°6458
|
||||||
|
*
|
||||||
|
* @see \RestUtils::FindObjectFromKey for the same check in the REST endpoint
|
||||||
|
*/
|
||||||
|
final public function CheckChangedExtKeysValues(callable $oIsObjectLoadableCallback = null)
|
||||||
|
{
|
||||||
|
if (is_null($oIsObjectLoadableCallback)) {
|
||||||
|
$oIsObjectLoadableCallback = function ($sClass, $sId) {
|
||||||
|
$oRemoteObject = MetaModel::GetObject($sClass, $sId, false);
|
||||||
|
if (is_null($oRemoteObject)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
$aChanges = $this->ListChanges();
|
||||||
|
$aAttCodesChanged = array_keys($aChanges);
|
||||||
|
foreach ($aAttCodesChanged as $sAttDefCode) {
|
||||||
|
$oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttDefCode);
|
||||||
|
|
||||||
|
if ($oAttDef instanceof AttributeLinkedSetIndirect) {
|
||||||
|
/** @var ormLinkSet $oOrmSet */
|
||||||
|
$oOrmSet = $this->Get($sAttDefCode);
|
||||||
|
while ($oLnk = $oOrmSet->Fetch()) {
|
||||||
|
$oLnk->CheckChangedExtKeysValues($oIsObjectLoadableCallback);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @noinspection PhpConditionCheckedByNextConditionInspection */
|
||||||
|
/** @noinspection NotOptimalIfConditionsInspection */
|
||||||
|
if (($oAttDef instanceof AttributeHierarchicalKey) || ($oAttDef instanceof AttributeExternalKey)) {
|
||||||
|
$sRemoteObjectClass = $oAttDef->GetTargetClass();
|
||||||
|
$sRemoteObjectKey = $this->Get($sAttDefCode);
|
||||||
|
} else if ($oAttDef instanceof AttributeObjectKey) {
|
||||||
|
$sRemoteObjectClassAttCode = $oAttDef->Get('class_attcode');
|
||||||
|
$sRemoteObjectClass = $this->Get($sRemoteObjectClassAttCode);
|
||||||
|
$sRemoteObjectKey = $this->Get($sAttDefCode);
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (utils::IsNullOrEmptyString($sRemoteObjectClass)
|
||||||
|
|| utils::IsNullOrEmptyString($sRemoteObjectKey)
|
||||||
|
) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0 : Undefined ext. key (EG. non-mandatory and no value provided)
|
||||||
|
// < 0 : Non yet persisted object
|
||||||
|
/** @noinspection TypeUnsafeComparisonInspection Non-strict comparison as object ID can be string */
|
||||||
|
if ($sRemoteObjectKey <= 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (false === $oIsObjectLoadableCallback($sRemoteObjectClass, $sRemoteObjectKey)) {
|
||||||
|
throw new InvalidExternalKeyValueException($this, $sAttDefCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if it is allowed to delete the existing object from the database
|
* Check if it is allowed to delete the existing object from the database
|
||||||
*
|
*
|
||||||
@@ -2383,13 +2461,13 @@ abstract class DBObject implements iDisplay
|
|||||||
* @api
|
* @api
|
||||||
* @api-advanced
|
* @api-advanced
|
||||||
*
|
*
|
||||||
* @see \DBObject::ListPreviousValuesForUpdatedAttributes() to get previous values anywhere in the CRUD stack
|
* @return array attcode => currentvalue List the attributes that have been changed using {@see DBObject::Set()}.
|
||||||
* @see https://www.itophub.io/wiki/page?id=latest%3Acustomization%3Asequence_crud iTop CRUD stack documentation
|
|
||||||
* @return array attname => currentvalue List the attributes that have been changed using {@see DBObject::Set()}.
|
|
||||||
* Reset during {@see DBObject::DBUpdate()}
|
* Reset during {@see DBObject::DBUpdate()}
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
* @see \DBObject::ListPreviousValuesForUpdatedAttributes() to get previous values anywhere in the CRUD stack
|
||||||
|
* @see https://www.itophub.io/wiki/page?id=latest%3Acustomization%3Asequence_crud iTop CRUD stack documentation
|
||||||
* @uses m_aCurrValues
|
* @uses m_aCurrValues
|
||||||
*/
|
*/
|
||||||
public function ListChanges()
|
public function ListChanges()
|
||||||
{
|
{
|
||||||
if ($this->m_bIsInDB)
|
if ($this->m_bIsInDB)
|
||||||
@@ -2680,7 +2758,6 @@ abstract class DBObject implements iDisplay
|
|||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
*
|
*
|
||||||
* @internal
|
* @internal
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public function DBInsertNoReload()
|
public function DBInsertNoReload()
|
||||||
{
|
{
|
||||||
@@ -2960,8 +3037,6 @@ abstract class DBObject implements iDisplay
|
|||||||
* Persist an object to the DB, for the first time
|
* Persist an object to the DB, for the first time
|
||||||
*
|
*
|
||||||
* @api
|
* @api
|
||||||
* @see DBWrite
|
|
||||||
*
|
|
||||||
* @return int|null inserted object key
|
* @return int|null inserted object key
|
||||||
*
|
*
|
||||||
* @throws \ArchivedObjectException
|
* @throws \ArchivedObjectException
|
||||||
@@ -2971,10 +3046,12 @@ abstract class DBObject implements iDisplay
|
|||||||
* @throws \CoreWarning
|
* @throws \CoreWarning
|
||||||
* @throws \MySQLException
|
* @throws \MySQLException
|
||||||
* @throws \OQLException
|
* @throws \OQLException
|
||||||
|
*
|
||||||
|
* @see DBWrite
|
||||||
*/
|
*/
|
||||||
public function DBInsert()
|
public function DBInsert()
|
||||||
{
|
{
|
||||||
$this->DBInsertNoReload();
|
$this->DBInsertNoReload();
|
||||||
|
|
||||||
if (MetaModel::DBIsReadOnly())
|
if (MetaModel::DBIsReadOnly())
|
||||||
{
|
{
|
||||||
@@ -3073,13 +3150,13 @@ abstract class DBObject implements iDisplay
|
|||||||
* Update an object in DB
|
* Update an object in DB
|
||||||
*
|
*
|
||||||
* @api
|
* @api
|
||||||
* @see DBObject::DBWrite()
|
|
||||||
*
|
|
||||||
* @return int object key
|
* @return int object key
|
||||||
*
|
*
|
||||||
* @throws \CoreException
|
* @throws \CoreException
|
||||||
* @throws \CoreCannotSaveObjectException if CheckToWrite() returns issues
|
* @throws \CoreCannotSaveObjectException if CheckToWrite() returns issues
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
|
*
|
||||||
|
* @see DBObject::DBWrite()
|
||||||
*/
|
*/
|
||||||
public function DBUpdate()
|
public function DBUpdate()
|
||||||
{
|
{
|
||||||
@@ -3087,6 +3164,7 @@ abstract class DBObject implements iDisplay
|
|||||||
{
|
{
|
||||||
throw new CoreException("DBUpdate: could not update a newly created object, please call DBInsert instead");
|
throw new CoreException("DBUpdate: could not update a newly created object, please call DBInsert instead");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Protect against reentrance (e.g. cascading the update of ticket logs)
|
// Protect against reentrance (e.g. cascading the update of ticket logs)
|
||||||
static $aUpdateReentrance = array();
|
static $aUpdateReentrance = array();
|
||||||
$sKey = get_class($this).'::'.$this->GetKey();
|
$sKey = get_class($this).'::'.$this->GetKey();
|
||||||
@@ -3418,13 +3496,18 @@ abstract class DBObject implements iDisplay
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Make the current changes persistent - clever wrapper for Insert or Update
|
* Make the current changes persistent - clever wrapper for Insert or Update
|
||||||
*
|
*
|
||||||
* @api
|
* @api
|
||||||
*
|
*
|
||||||
* @return int
|
* @return int
|
||||||
*
|
*
|
||||||
* @throws \CoreCannotSaveObjectException
|
* @throws ArchivedObjectException
|
||||||
* @throws \CoreException
|
* @throws CoreCannotSaveObjectException
|
||||||
|
* @throws CoreException
|
||||||
|
* @throws CoreUnexpectedValue
|
||||||
|
* @throws CoreWarning
|
||||||
|
* @throws MySQLException
|
||||||
|
* @throws OQLException
|
||||||
*/
|
*/
|
||||||
public function DBWrite()
|
public function DBWrite()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -23,6 +23,8 @@
|
|||||||
* @license http://opensource.org/licenses/AGPL-3.0
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
use Combodo\iTop\Application\Helper\ExportHelper;
|
||||||
|
|
||||||
require_once(APPROOT.'application/xlsxwriter.class.php');
|
require_once(APPROOT.'application/xlsxwriter.class.php');
|
||||||
|
|
||||||
class ExcelBulkExport extends TabularBulkExport
|
class ExcelBulkExport extends TabularBulkExport
|
||||||
@@ -89,6 +91,7 @@ class ExcelBulkExport extends TabularBulkExport
|
|||||||
|
|
||||||
case 'xlsx_options':
|
case 'xlsx_options':
|
||||||
$oP->add('<fieldset><legend>'.Dict::S('Core:BulkExport:XLSXOptions').'</legend>');
|
$oP->add('<fieldset><legend>'.Dict::S('Core:BulkExport:XLSXOptions').'</legend>');
|
||||||
|
$oP->add(ExportHelper::GetAlertForExcelMaliciousInjection());
|
||||||
$oP->add('<table class="export_parameters"><tr><td style="vertical-align:top">');
|
$oP->add('<table class="export_parameters"><tr><td style="vertical-align:top">');
|
||||||
|
|
||||||
$sChecked = (utils::ReadParam('formatted_text', 0) == 1) ? ' checked ' : '';
|
$sChecked = (utils::ReadParam('formatted_text', 0) == 1) ? ' checked ' : '';
|
||||||
|
|||||||
@@ -1213,8 +1213,10 @@ abstract class MetaModel
|
|||||||
*
|
*
|
||||||
* @return AttributeDefinition[]
|
* @return AttributeDefinition[]
|
||||||
* @throws \CoreException
|
* @throws \CoreException
|
||||||
|
*
|
||||||
|
* @see GetAttributesList for attcode list
|
||||||
*/
|
*/
|
||||||
final static public function ListAttributeDefs($sClass)
|
final public static function ListAttributeDefs($sClass)
|
||||||
{
|
{
|
||||||
self::_check_subclass($sClass);
|
self::_check_subclass($sClass);
|
||||||
return self::$m_aAttribDefs[$sClass];
|
return self::$m_aAttribDefs[$sClass];
|
||||||
@@ -1223,8 +1225,10 @@ abstract class MetaModel
|
|||||||
/**
|
/**
|
||||||
* @param string $sClass
|
* @param string $sClass
|
||||||
*
|
*
|
||||||
* @return array
|
* @return string[] list of attcodes
|
||||||
* @throws \CoreException
|
* @throws \CoreException
|
||||||
|
*
|
||||||
|
* @see ListAttributeDefs to get AttributeDefinition array instead
|
||||||
*/
|
*/
|
||||||
final public static function GetAttributesList($sClass)
|
final public static function GetAttributesList($sClass)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -22,7 +22,9 @@
|
|||||||
* A class to serialize the execution of some code sections
|
* A class to serialize the execution of some code sections
|
||||||
* Emulates the API of PECL Mutex class
|
* Emulates the API of PECL Mutex class
|
||||||
* Relies on MySQL locks because the API sem_get is not always present in the
|
* Relies on MySQL locks because the API sem_get is not always present in the
|
||||||
* installed PHP.
|
* installed PHP.
|
||||||
|
*
|
||||||
|
* @link https://dev.mysql.com/doc/refman/5.7/en/locking-functions.html MySQL locking functions documentation
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2013-2018 Combodo SARL
|
* @copyright Copyright (C) 2013-2018 Combodo SARL
|
||||||
* @license http://opensource.org/licenses/AGPL-3.0
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
|||||||
@@ -817,6 +817,9 @@ class UserRights
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string connected {@see User} login field value, otherwise empty string
|
||||||
|
*/
|
||||||
public static function GetUser()
|
public static function GetUser()
|
||||||
{
|
{
|
||||||
if (is_null(self::$m_oUser))
|
if (is_null(self::$m_oUser))
|
||||||
@@ -829,7 +832,9 @@ class UserRights
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** User */
|
/**
|
||||||
|
* @return User|null
|
||||||
|
*/
|
||||||
public static function GetUserObject()
|
public static function GetUserObject()
|
||||||
{
|
{
|
||||||
if (is_null(self::$m_oUser))
|
if (is_null(self::$m_oUser))
|
||||||
@@ -1029,7 +1034,7 @@ class UserRights
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $sClass
|
* @param string $sClass
|
||||||
* @param int $iActionCode
|
* @param int $iActionCode see UR_ACTION_* constants
|
||||||
* @param DBObjectSet $oInstanceSet
|
* @param DBObjectSet $oInstanceSet
|
||||||
* @param User $oUser
|
* @param User $oUser
|
||||||
* @return int (UR_ALLOWED_YES|UR_ALLOWED_NO|UR_ALLOWED_DEPENDS)
|
* @return int (UR_ALLOWED_YES|UR_ALLOWED_NO|UR_ALLOWED_DEPENDS)
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Beware the version number MUST be enclosed with quotes otherwise v2.3.0 becomes v2 0.3 .0
|
// Beware the version number MUST be enclosed with quotes otherwise v2.3.0 becomes v2 0.3 .0
|
||||||
$version: "v2.7.9";
|
$version: "v2.7.10";
|
||||||
$approot-relative: "../../../../../" !default; // relative to env-***/branding/themes/***/main.css
|
$approot-relative: "../../../../../" !default; // relative to env-***/branding/themes/***/main.css
|
||||||
|
|
||||||
// Base colors
|
// Base colors
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'authent-cas/2.7.9',
|
'authent-cas/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'authent-external/2.7.9',
|
'authent-external/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ if (function_exists('ldap_connect'))
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'authent-ldap/2.7.9',
|
'authent-ldap/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'authent-local/2.7.9',
|
'authent-local/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
/** @noinspection PhpUnhandledExceptionInspection */
|
/** @noinspection PhpUnhandledExceptionInspection */
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'combodo-db-tools/2.7.9',
|
'combodo-db-tools/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-attachments/2.7.9',
|
'itop-attachments/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-backup/2.7.9',
|
'itop-backup/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-bridge-virtualization-storage/2.7.9',
|
'itop-bridge-virtualization-storage/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-change-mgmt-itil/2.7.9',
|
'itop-change-mgmt-itil/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-change-mgmt/2.7.9',
|
'itop-change-mgmt/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-config-mgmt/2.7.9',
|
'itop-config-mgmt/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-config/2.7.9',
|
'itop-config/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
/** @noinspection PhpUnhandledExceptionInspection */
|
/** @noinspection PhpUnhandledExceptionInspection */
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-core-update/2.7.9',
|
'itop-core-update/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-datacenter-mgmt/2.7.9',
|
'itop-datacenter-mgmt/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-endusers-devices/2.7.9',
|
'itop-endusers-devices/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
/** @noinspection PhpUnhandledExceptionInspection */
|
/** @noinspection PhpUnhandledExceptionInspection */
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-files-information/2.7.9',
|
'itop-files-information/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-full-itil/2.7.9',
|
'itop-full-itil/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ class HubConnectorPage extends NiceWebPage
|
|||||||
parent::__construct($sTitle);
|
parent::__construct($sTitle);
|
||||||
|
|
||||||
$this->no_cache();
|
$this->no_cache();
|
||||||
$this->add_xframe_options();
|
$this->add_http_headers();
|
||||||
|
|
||||||
$sImagesDir = utils::GetAbsoluteUrlAppRoot().'images';
|
$sImagesDir = utils::GetAbsoluteUrlAppRoot().'images';
|
||||||
$sModuleImagesDir = utils::GetAbsoluteUrlModulesRoot().'itop-hub-connector/images';
|
$sModuleImagesDir = utils::GetAbsoluteUrlModulesRoot().'itop-hub-connector/images';
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-hub-connector/2.7.9',
|
'itop-hub-connector/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-incident-mgmt-itil/2.7.9',
|
'itop-incident-mgmt-itil/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-knownerror-mgmt/2.7.9',
|
'itop-knownerror-mgmt/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-oauth-client/2.7.9',
|
'itop-oauth-client/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
/** @noinspection PhpUnhandledExceptionInspection */
|
/** @noinspection PhpUnhandledExceptionInspection */
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-portal-base/2.7.9', array(
|
'itop-portal-base/2.7.10', array(
|
||||||
// Identification
|
// Identification
|
||||||
'label' => 'Portal Development Library',
|
'label' => 'Portal Development Library',
|
||||||
'category' => 'Portal',
|
'category' => 'Portal',
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ foreach ($aPortalConf['properties']['themes'] as $sKey => $value)
|
|||||||
{
|
{
|
||||||
if (!is_array($value))
|
if (!is_array($value))
|
||||||
{
|
{
|
||||||
$aPortalConf['properties']['themes'][$sKey] = $_ENV['COMBODO_ABSOLUTE_URL'].utils::GetCSSFromSASS('env-'.utils::GetCurrentEnvironment().'/'.$value,
|
$aPortalConf['properties']['themes'][$sKey] = utils::GetCSSFromSASS('env-'.utils::GetCurrentEnvironment().'/'.$value,
|
||||||
$aImportPaths);
|
$aImportPaths);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -72,7 +72,7 @@ foreach ($aPortalConf['properties']['themes'] as $sKey => $value)
|
|||||||
$aValues = array();
|
$aValues = array();
|
||||||
foreach ($value as $sSubValue)
|
foreach ($value as $sSubValue)
|
||||||
{
|
{
|
||||||
$aValues[] = $_ENV['COMBODO_ABSOLUTE_URL'].utils::GetCSSFromSASS('env-'.utils::GetCurrentEnvironment().'/'.$sSubValue,
|
$aValues[] = utils::GetCSSFromSASS('env-'.utils::GetCurrentEnvironment().'/'.$sSubValue,
|
||||||
$aImportPaths);
|
$aImportPaths);
|
||||||
}
|
}
|
||||||
$aPortalConf['properties']['themes'][$sKey] = $aValues;
|
$aPortalConf['properties']['themes'][$sKey] = $aValues;
|
||||||
|
|||||||
@@ -1379,3 +1379,19 @@ table .group-actions {
|
|||||||
.wiki_broken_link {
|
.wiki_broken_link {
|
||||||
text-decoration: line-through;
|
text-decoration: line-through;
|
||||||
}
|
}
|
||||||
|
@media print {
|
||||||
|
/* Prevent URLs from being displayed */
|
||||||
|
a[href]::after, img[src]::after {
|
||||||
|
content: none !important;
|
||||||
|
/* Force modals to be displayed one after another instead of stacked */
|
||||||
|
}
|
||||||
|
.modal.in {
|
||||||
|
position: relative;
|
||||||
|
top: unset;
|
||||||
|
z-index: unset;
|
||||||
|
overflow-y: unset;
|
||||||
|
}
|
||||||
|
#drag_overlay {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1463,3 +1463,27 @@ table .group-actions .item-action-wrapper .panel-body > p:last-child{
|
|||||||
.wiki_broken_link {
|
.wiki_broken_link {
|
||||||
text-decoration: line-through;
|
text-decoration: line-through;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
/* Prevent URLs from being displayed */
|
||||||
|
a[href], img[src] {
|
||||||
|
&::after {
|
||||||
|
content: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Force modals to be displayed one after another instead of stacked */
|
||||||
|
.modal {
|
||||||
|
&.in {
|
||||||
|
position: relative;
|
||||||
|
top: unset;
|
||||||
|
z-index: unset;
|
||||||
|
overflow-y: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#drag_overlay {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -49,6 +49,7 @@ use Symfony\Component\HttpFoundation\JsonResponse;
|
|||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use UnaryExpression;
|
use UnaryExpression;
|
||||||
use URLButtonItem;
|
use URLButtonItem;
|
||||||
|
use utils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class ManageBrickController
|
* Class ManageBrickController
|
||||||
@@ -259,6 +260,7 @@ class ManageBrickController extends BrickController
|
|||||||
'oBrick' => $oBrick,
|
'oBrick' => $oBrick,
|
||||||
'sBrickId' => $sBrickId,
|
'sBrickId' => $sBrickId,
|
||||||
'sToken' => $oExporter->SaveState(),
|
'sToken' => $oExporter->SaveState(),
|
||||||
|
'sWikiUrl' => 'https://www.itophub.io/wiki/page?id='.utils::GetItopVersionWikiSyntax().'%3Auser%3Alists#excel_export',
|
||||||
);
|
);
|
||||||
|
|
||||||
return $this->render(static::EXCEL_EXPORT_TEMPLATE_PATH, $aData);
|
return $this->render(static::EXCEL_EXPORT_TEMPLATE_PATH, $aData);
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ use Combodo\iTop\Form\Field\LabelField;
|
|||||||
use Combodo\iTop\Form\Form;
|
use Combodo\iTop\Form\Form;
|
||||||
use Combodo\iTop\Form\FormManager;
|
use Combodo\iTop\Form\FormManager;
|
||||||
use Combodo\iTop\Portal\Helper\ApplicationHelper;
|
use Combodo\iTop\Portal\Helper\ApplicationHelper;
|
||||||
|
use Combodo\iTop\Portal\Helper\SecurityHelper;
|
||||||
use CoreCannotSaveObjectException;
|
use CoreCannotSaveObjectException;
|
||||||
use DBObject;
|
use DBObject;
|
||||||
use DBObjectSearch;
|
use DBObjectSearch;
|
||||||
@@ -41,6 +42,7 @@ use DOMDocument;
|
|||||||
use DOMXPath;
|
use DOMXPath;
|
||||||
use Exception;
|
use Exception;
|
||||||
use InlineImage;
|
use InlineImage;
|
||||||
|
use InvalidExternalKeyValueException;
|
||||||
use IssueLog;
|
use IssueLog;
|
||||||
use MetaModel;
|
use MetaModel;
|
||||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||||
@@ -48,6 +50,7 @@ use Symfony\Component\HttpFoundation\Response;
|
|||||||
use Symfony\Component\HttpKernel\Exception\HttpException;
|
use Symfony\Component\HttpKernel\Exception\HttpException;
|
||||||
use UserRights;
|
use UserRights;
|
||||||
use utils;
|
use utils;
|
||||||
|
use const UR_ACTION_READ;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description of ObjectFormManager
|
* Description of ObjectFormManager
|
||||||
@@ -1135,8 +1138,11 @@ class ObjectFormManager extends FormManager
|
|||||||
$bWasModified = $this->oObject->IsModified();
|
$bWasModified = $this->oObject->IsModified();
|
||||||
$bActivateTriggers = (!$bIsNew && $bWasModified);
|
$bActivateTriggers = (!$bIsNew && $bWasModified);
|
||||||
|
|
||||||
|
/** @var SecurityHelper $oSecurityHelper */
|
||||||
|
$oSecurityHelper = $this->oContainer->get('security_helper');
|
||||||
|
|
||||||
// Forcing allowed writing on the object if necessary. This is used in some particular cases.
|
// Forcing allowed writing on the object if necessary. This is used in some particular cases.
|
||||||
$bAllowWrite = $this->oContainer->get('security_helper')->IsActionAllowed($bIsNew ? UR_ACTION_CREATE : UR_ACTION_MODIFY, $sObjectClass, $this->oObject->GetKey());
|
$bAllowWrite = $oSecurityHelper->IsActionAllowed($bIsNew ? UR_ACTION_CREATE : UR_ACTION_MODIFY, $sObjectClass, $this->oObject->GetKey());
|
||||||
if ($bAllowWrite) {
|
if ($bAllowWrite) {
|
||||||
$this->oObject->AllowWrite(true);
|
$this->oObject->AllowWrite(true);
|
||||||
}
|
}
|
||||||
@@ -1145,11 +1151,14 @@ class ObjectFormManager extends FormManager
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
$this->oObject->DBWrite();
|
$this->oObject->DBWrite();
|
||||||
}
|
} catch (CoreCannotSaveObjectException $e) {
|
||||||
catch (CoreCannotSaveObjectException $e) {
|
|
||||||
throw new Exception($e->getHtmlMessage());
|
throw new Exception($e->getHtmlMessage());
|
||||||
}
|
} catch (InvalidExternalKeyValueException $e) {
|
||||||
catch (Exception $e) {
|
$sExceptionMessage = $e->getIssue();
|
||||||
|
$sExceptionMessage .= var_export($e->getContextData(), true);
|
||||||
|
|
||||||
|
throw new Exception($sExceptionMessage);
|
||||||
|
} catch (Exception $e) {
|
||||||
if ($bIsNew) {
|
if ($bIsNew) {
|
||||||
throw new Exception(Dict::S('Portal:Error:ObjectCannotBeCreated'));
|
throw new Exception(Dict::S('Portal:Error:ObjectCannotBeCreated'));
|
||||||
}
|
}
|
||||||
@@ -1359,6 +1368,12 @@ class ObjectFormManager extends FormManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/** @var SecurityHelper $oSecurityHelper */
|
||||||
|
$oSecurityHelper = $this->oContainer->get('security_helper');
|
||||||
|
// N°7023 - Note that we check for ext. key now as we want the check to be done on user inputs and NOT on ext. keys set programatically, so it must be done before the DoComputeValues
|
||||||
|
$this->oObject->CheckChangedExtKeysValues(function ($sClass, $sId) use ($oSecurityHelper): bool {
|
||||||
|
return $oSecurityHelper->IsActionAllowed(UR_ACTION_READ, $sClass, $sId);
|
||||||
|
});
|
||||||
$this->oObject->DoComputeValues();
|
$this->oObject->DoComputeValues();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="export-feedback">
|
<div id="export-feedback">
|
||||||
|
<p id="export-excel-warning" class="alert alert-warning" role="alert">{{ 'UI:Bulk:Export:MaliciousInjection:Alert:Message'|dict_format(sWikiUrl)|raw }}</p>
|
||||||
<p class="export-message" style="text-align:center;">{{ 'ExcelExport:PreparingExport'|dict_s }}</p>
|
<p class="export-message" style="text-align:center;">{{ 'ExcelExport:PreparingExport'|dict_s }}</p>
|
||||||
<div class="progress">
|
<div class="progress">
|
||||||
<div class="progress-bar" role="progressbar" style="width: 0%"
|
<div class="progress-bar" role="progressbar" style="width: 0%"
|
||||||
|
|||||||
@@ -51,9 +51,9 @@
|
|||||||
<link href="{{ app['combodo.absolute_url'] ~ 'css/c3.min.css'|add_itop_version }}" rel="stylesheet">
|
<link href="{{ app['combodo.absolute_url'] ~ 'css/c3.min.css'|add_itop_version }}" rel="stylesheet">
|
||||||
<link href="{{ app['combodo.absolute_url'] ~ 'js/ckeditor/plugins/codesnippet/lib/highlight/styles/obsidian.css'|add_itop_version }}" rel="stylesheet">
|
<link href="{{ app['combodo.absolute_url'] ~ 'js/ckeditor/plugins/codesnippet/lib/highlight/styles/obsidian.css'|add_itop_version }}" rel="stylesheet">
|
||||||
{# - Bootstrap theme #}
|
{# - Bootstrap theme #}
|
||||||
<link href="{{ app['combodo.portal.instance.conf'].properties.themes.bootstrap|add_itop_version }}" rel="stylesheet" id="css_bootstrap_theme">
|
<link href="{{ app['combodo.absolute_url'] ~ app['combodo.portal.instance.conf'].properties.themes.bootstrap|add_itop_version }}" rel="stylesheet" id="css_bootstrap_theme">
|
||||||
{# - Portal adjustments for BS theme #}
|
{# - Portal adjustments for BS theme #}
|
||||||
<link href="{{ app['combodo.portal.instance.conf'].properties.themes.portal|add_itop_version }}" rel="stylesheet" id="css_portal">
|
<link href="{{ app['combodo.absolute_url'] ~ app['combodo.portal.instance.conf'].properties.themes.portal|add_itop_version }}" rel="stylesheet" id="css_portal">
|
||||||
{# UI Extensions CSS, in an undefined order #}
|
{# UI Extensions CSS, in an undefined order #}
|
||||||
{% if app['ui_extensions_helper'].css_files is defined %}
|
{% if app['ui_extensions_helper'].css_files is defined %}
|
||||||
{% for css_file in app['ui_extensions_helper'].css_files %}
|
{% for css_file in app['ui_extensions_helper'].css_files %}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
/** @noinspection PhpUnhandledExceptionInspection */
|
/** @noinspection PhpUnhandledExceptionInspection */
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-portal/2.7.9', array(
|
'itop-portal/2.7.10', array(
|
||||||
// Identification
|
// Identification
|
||||||
'label' => 'Enhanced Customer Portal',
|
'label' => 'Enhanced Customer Portal',
|
||||||
'category' => 'Portal',
|
'category' => 'Portal',
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-problem-mgmt/2.7.9',
|
'itop-problem-mgmt/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-profiles-itil/2.7.9',
|
'itop-profiles-itil/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-request-mgmt-itil/2.7.9',
|
'itop-request-mgmt-itil/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-request-mgmt/2.7.9',
|
'itop-request-mgmt/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-service-mgmt-provider/2.7.9',
|
'itop-service-mgmt-provider/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-service-mgmt/2.7.9',
|
'itop-service-mgmt/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-sla-computation/2.7.9',
|
'itop-sla-computation/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-storage-mgmt/2.7.9',
|
'itop-storage-mgmt/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__,
|
__FILE__,
|
||||||
'itop-tickets/2.7.9',
|
'itop-tickets/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-virtualization-mgmt/2.7.9',
|
'itop-virtualization-mgmt/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
SetupWebPage::AddModule(
|
SetupWebPage::AddModule(
|
||||||
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
__FILE__, // Path to the current file, all other file names are relative to the directory containing this file
|
||||||
'itop-welcome-itil/2.7.9',
|
'itop-welcome-itil/2.7.10',
|
||||||
array(
|
array(
|
||||||
// Identification
|
// Identification
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<information>
|
<information>
|
||||||
<version>2.7.9</version>
|
<version>2.7.10</version>
|
||||||
</information>
|
</information>
|
||||||
|
|||||||
@@ -934,6 +934,7 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', array(
|
|||||||
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Default format (%1$s), e.g. %2$s~~',
|
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Default format (%1$s), e.g. %2$s~~',
|
||||||
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Custom format: %1$s~~',
|
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Custom format: %1$s~~',
|
||||||
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s~~',
|
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s~~',
|
||||||
|
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => 'Opening a file with untrusted data in Microsoft Excel may lead to formula injection. Ensure that your Excel settings are configured to handle files safely. <a href="%1$s">Learn more in our documentation.</a>~~',
|
||||||
'Core:DateTime:Placeholder_d' => 'DD~~', // Day of the month: 2 digits (with leading zero)
|
'Core:DateTime:Placeholder_d' => 'DD~~', // Day of the month: 2 digits (with leading zero)
|
||||||
'Core:DateTime:Placeholder_j' => 'D~~', // Day of the month: 1 or 2 digits (without leading zero)
|
'Core:DateTime:Placeholder_j' => 'D~~', // Day of the month: 1 or 2 digits (without leading zero)
|
||||||
'Core:DateTime:Placeholder_m' => 'MM~~', // Month on 2 digits i.e. 01-12
|
'Core:DateTime:Placeholder_m' => 'MM~~', // Month on 2 digits i.e. 01-12
|
||||||
|
|||||||
@@ -932,7 +932,8 @@ Dict::Add('DA DA', 'Danish', 'Dansk', array(
|
|||||||
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Default format (%1$s), e.g. %2$s~~',
|
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Default format (%1$s), e.g. %2$s~~',
|
||||||
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Custom format: %1$s~~',
|
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Custom format: %1$s~~',
|
||||||
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s~~',
|
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s~~',
|
||||||
'Core:DateTime:Placeholder_d' => 'DD~~', // Day of the month: 2 digits (with leading zero)
|
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => 'Opening a file with untrusted data in Microsoft Excel may lead to formula injection. Ensure that your Excel settings are configured to handle files safely. <a href="%1$s">Learn more in our documentation.</a>~~',
|
||||||
|
'Core:DateTime:Placeholder_d' => 'DD~~', // Day of the month: 2 digits (with leading zero)
|
||||||
'Core:DateTime:Placeholder_j' => 'D~~', // Day of the month: 1 or 2 digits (without leading zero)
|
'Core:DateTime:Placeholder_j' => 'D~~', // Day of the month: 1 or 2 digits (without leading zero)
|
||||||
'Core:DateTime:Placeholder_m' => 'MM~~', // Month on 2 digits i.e. 01-12
|
'Core:DateTime:Placeholder_m' => 'MM~~', // Month on 2 digits i.e. 01-12
|
||||||
'Core:DateTime:Placeholder_n' => 'M~~', // Month on 1 or 2 digits 1-12
|
'Core:DateTime:Placeholder_n' => 'M~~', // Month on 1 or 2 digits 1-12
|
||||||
|
|||||||
@@ -931,7 +931,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
|
|||||||
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Standardformat (%1$s), z.B. %2$s',
|
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Standardformat (%1$s), z.B. %2$s',
|
||||||
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Angepasstes format: %1$s',
|
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Angepasstes format: %1$s',
|
||||||
'Core:BulkExport:PDF:PageNumber' => 'Seite %1$s',
|
'Core:BulkExport:PDF:PageNumber' => 'Seite %1$s',
|
||||||
'Core:DateTime:Placeholder_d' => 'TT', // Day of the month: 2 digits (with leading zero)
|
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => 'Opening a file with untrusted data in Microsoft Excel may lead to formula injection. Ensure that your Excel settings are configured to handle files safely. <a href="%1$s">Learn more in our documentation.</a>~~',
|
||||||
|
'Core:DateTime:Placeholder_d' => 'TT', // Day of the month: 2 digits (with leading zero)
|
||||||
'Core:DateTime:Placeholder_j' => 'T', // Day of the month: 1 or 2 digits (without leading zero)
|
'Core:DateTime:Placeholder_j' => 'T', // Day of the month: 1 or 2 digits (without leading zero)
|
||||||
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
||||||
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
|
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
|
||||||
|
|||||||
@@ -932,6 +932,7 @@ Dict::Add('EN US', 'English', 'English', array(
|
|||||||
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Default format (%1$s), e.g. %2$s',
|
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Default format (%1$s), e.g. %2$s',
|
||||||
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Custom format: %1$s',
|
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Custom format: %1$s',
|
||||||
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s',
|
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s',
|
||||||
|
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => 'Opening a file with untrusted data in Microsoft Excel may lead to formula injection. Ensure that your Excel settings are configured to handle files safely. <a href="%1$s">Learn more in our documentation.</a>',
|
||||||
'Core:DateTime:Placeholder_d' => 'DD', // Day of the month: 2 digits (with leading zero)
|
'Core:DateTime:Placeholder_d' => 'DD', // Day of the month: 2 digits (with leading zero)
|
||||||
'Core:DateTime:Placeholder_j' => 'D', // Day of the month: 1 or 2 digits (without leading zero)
|
'Core:DateTime:Placeholder_j' => 'D', // Day of the month: 1 or 2 digits (without leading zero)
|
||||||
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
||||||
|
|||||||
@@ -933,7 +933,8 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellaño', array(
|
|||||||
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Formato por omisión (%1$s), ej. %2$s',
|
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Formato por omisión (%1$s), ej. %2$s',
|
||||||
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Formato personalizado: %1$s',
|
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Formato personalizado: %1$s',
|
||||||
'Core:BulkExport:PDF:PageNumber' => 'Página %1$s',
|
'Core:BulkExport:PDF:PageNumber' => 'Página %1$s',
|
||||||
'Core:DateTime:Placeholder_d' => 'DD', // Day of the month: 2 digits (with leading zero)
|
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => 'Opening a file with untrusted data in Microsoft Excel may lead to formula injection. Ensure that your Excel settings are configured to handle files safely. <a href="%1$s">Learn more in our documentation.</a>~~',
|
||||||
|
'Core:DateTime:Placeholder_d' => 'DD', // Day of the month: 2 digits (with leading zero)
|
||||||
'Core:DateTime:Placeholder_j' => 'D', // Day of the month: 1 or 2 digits (without leading zero)
|
'Core:DateTime:Placeholder_j' => 'D', // Day of the month: 1 or 2 digits (without leading zero)
|
||||||
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
||||||
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
|
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
|
||||||
|
|||||||
@@ -930,7 +930,8 @@ Dict::Add('FR FR', 'French', 'Français', array(
|
|||||||
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Format par défaut (%1$s), ex. %2$s',
|
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Format par défaut (%1$s), ex. %2$s',
|
||||||
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Format spécial: %1$s',
|
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Format spécial: %1$s',
|
||||||
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s',
|
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s',
|
||||||
'Core:DateTime:Placeholder_d' => 'JJ', // Day of the month: 2 digits (with leading zero)
|
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => 'L\'ouverture d\'un fichier contenant des données non fiables dans Microsoft Excel peut entraîner l\'injection de formules. Assurez-vous que vos paramètres Excel sont configurés pour traiter les fichiers en toute sécurité. <a href="%1$s">Pour en savoir plus, consultez notre documentation.</a>',
|
||||||
|
'Core:DateTime:Placeholder_d' => 'JJ', // Day of the month: 2 digits (with leading zero)
|
||||||
'Core:DateTime:Placeholder_j' => 'J', // Day of the month: 1 or 2 digits (without leading zero)
|
'Core:DateTime:Placeholder_j' => 'J', // Day of the month: 1 or 2 digits (without leading zero)
|
||||||
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
||||||
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
|
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
|
||||||
|
|||||||
@@ -930,7 +930,8 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
|
|||||||
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Default format (%1$s), e.g. %2$s~~',
|
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Default format (%1$s), e.g. %2$s~~',
|
||||||
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Custom format: %1$s~~',
|
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Custom format: %1$s~~',
|
||||||
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s~~',
|
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s~~',
|
||||||
'Core:DateTime:Placeholder_d' => 'DD~~', // Day of the month: 2 digits (with leading zero)
|
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => 'Opening a file with untrusted data in Microsoft Excel may lead to formula injection. Ensure that your Excel settings are configured to handle files safely. <a href="%1$s">Learn more in our documentation.</a>~~',
|
||||||
|
'Core:DateTime:Placeholder_d' => 'DD~~', // Day of the month: 2 digits (with leading zero)
|
||||||
'Core:DateTime:Placeholder_j' => 'D~~', // Day of the month: 1 or 2 digits (without leading zero)
|
'Core:DateTime:Placeholder_j' => 'D~~', // Day of the month: 1 or 2 digits (without leading zero)
|
||||||
'Core:DateTime:Placeholder_m' => 'MM~~', // Month on 2 digits i.e. 01-12
|
'Core:DateTime:Placeholder_m' => 'MM~~', // Month on 2 digits i.e. 01-12
|
||||||
'Core:DateTime:Placeholder_n' => 'M~~', // Month on 1 or 2 digits 1-12
|
'Core:DateTime:Placeholder_n' => 'M~~', // Month on 1 or 2 digits 1-12
|
||||||
|
|||||||
@@ -932,7 +932,8 @@ Dict::Add('IT IT', 'Italian', 'Italiano', array(
|
|||||||
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Default format (%1$s), e.g. %2$s~~',
|
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Default format (%1$s), e.g. %2$s~~',
|
||||||
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Custom format: %1$s~~',
|
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Custom format: %1$s~~',
|
||||||
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s~~',
|
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s~~',
|
||||||
'Core:DateTime:Placeholder_d' => 'GG', // Day of the month: 2 digits (with leading zero)
|
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => 'Opening a file with untrusted data in Microsoft Excel may lead to formula injection. Ensure that your Excel settings are configured to handle files safely. <a href="%1$s">Learn more in our documentation.</a>~~',
|
||||||
|
'Core:DateTime:Placeholder_d' => 'GG', // Day of the month: 2 digits (with leading zero)
|
||||||
'Core:DateTime:Placeholder_j' => 'G', // Day of the month: 1 or 2 digits (without leading zero)
|
'Core:DateTime:Placeholder_j' => 'G', // Day of the month: 1 or 2 digits (without leading zero)
|
||||||
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
||||||
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
|
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
|
||||||
|
|||||||
@@ -930,7 +930,8 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
|
|||||||
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Default format (%1$s), e.g. %2$s~~',
|
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Default format (%1$s), e.g. %2$s~~',
|
||||||
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Custom format: %1$s~~',
|
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Custom format: %1$s~~',
|
||||||
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s~~',
|
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s~~',
|
||||||
'Core:DateTime:Placeholder_d' => 'DD~~', // Day of the month: 2 digits (with leading zero)
|
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => 'Opening a file with untrusted data in Microsoft Excel may lead to formula injection. Ensure that your Excel settings are configured to handle files safely. <a href="%1$s">Learn more in our documentation.</a>~~',
|
||||||
|
'Core:DateTime:Placeholder_d' => 'DD~~', // Day of the month: 2 digits (with leading zero)
|
||||||
'Core:DateTime:Placeholder_j' => 'D~~', // Day of the month: 1 or 2 digits (without leading zero)
|
'Core:DateTime:Placeholder_j' => 'D~~', // Day of the month: 1 or 2 digits (without leading zero)
|
||||||
'Core:DateTime:Placeholder_m' => 'MM~~', // Month on 2 digits i.e. 01-12
|
'Core:DateTime:Placeholder_m' => 'MM~~', // Month on 2 digits i.e. 01-12
|
||||||
'Core:DateTime:Placeholder_n' => 'M~~', // Month on 1 or 2 digits 1-12
|
'Core:DateTime:Placeholder_n' => 'M~~', // Month on 1 or 2 digits 1-12
|
||||||
|
|||||||
@@ -938,7 +938,8 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
|
|||||||
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Standaardformaat (%1$s), bv. %2$s',
|
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Standaardformaat (%1$s), bv. %2$s',
|
||||||
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Aangepast formaat: %1$s',
|
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Aangepast formaat: %1$s',
|
||||||
'Core:BulkExport:PDF:PageNumber' => 'Pagina %1$s',
|
'Core:BulkExport:PDF:PageNumber' => 'Pagina %1$s',
|
||||||
'Core:DateTime:Placeholder_d' => 'DD', // Day of the month: 2 digits (with leading zero)
|
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => 'Opening a file with untrusted data in Microsoft Excel may lead to formula injection. Ensure that your Excel settings are configured to handle files safely. <a href="%1$s">Learn more in our documentation.</a>~~',
|
||||||
|
'Core:DateTime:Placeholder_d' => 'DD', // Day of the month: 2 digits (with leading zero)
|
||||||
'Core:DateTime:Placeholder_j' => 'D', // Day of the month: 1 or 2 digits (without leading zero)
|
'Core:DateTime:Placeholder_j' => 'D', // Day of the month: 1 or 2 digits (without leading zero)
|
||||||
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
||||||
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
|
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
|
||||||
|
|||||||
@@ -932,7 +932,8 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
|
|||||||
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Formato padrão (%1$s), por ex. %2$s',
|
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Formato padrão (%1$s), por ex. %2$s',
|
||||||
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Formato personalizado: %1$s',
|
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Formato personalizado: %1$s',
|
||||||
'Core:BulkExport:PDF:PageNumber' => 'Página %1$s',
|
'Core:BulkExport:PDF:PageNumber' => 'Página %1$s',
|
||||||
'Core:DateTime:Placeholder_d' => 'DD', // Day of the month: 2 digits (with leading zero)
|
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => 'Opening a file with untrusted data in Microsoft Excel may lead to formula injection. Ensure that your Excel settings are configured to handle files safely. <a href="%1$s">Learn more in our documentation.</a>~~',
|
||||||
|
'Core:DateTime:Placeholder_d' => 'DD', // Day of the month: 2 digits (with leading zero)
|
||||||
'Core:DateTime:Placeholder_j' => 'D', // Day of the month: 1 or 2 digits (without leading zero)
|
'Core:DateTime:Placeholder_j' => 'D', // Day of the month: 1 or 2 digits (without leading zero)
|
||||||
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
||||||
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
|
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
|
||||||
|
|||||||
@@ -919,7 +919,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
|
|||||||
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Формат по умолчанию (%1$s), например %2$s',
|
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Формат по умолчанию (%1$s), например %2$s',
|
||||||
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Пользовательский формат: %1$s',
|
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Пользовательский формат: %1$s',
|
||||||
'Core:BulkExport:PDF:PageNumber' => 'Страница %1$s',
|
'Core:BulkExport:PDF:PageNumber' => 'Страница %1$s',
|
||||||
'Core:DateTime:Placeholder_d' => 'DD', // Day of the month: 2 digits (with leading zero)
|
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => 'Opening a file with untrusted data in Microsoft Excel may lead to formula injection. Ensure that your Excel settings are configured to handle files safely. <a href="%1$s">Learn more in our documentation.</a>~~',
|
||||||
|
'Core:DateTime:Placeholder_d' => 'DD', // Day of the month: 2 digits (with leading zero)
|
||||||
'Core:DateTime:Placeholder_j' => 'D', // Day of the month: 1 or 2 digits (without leading zero)
|
'Core:DateTime:Placeholder_j' => 'D', // Day of the month: 1 or 2 digits (without leading zero)
|
||||||
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
||||||
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
|
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
|
||||||
|
|||||||
@@ -929,7 +929,8 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', array(
|
|||||||
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Default format (%1$s), e.g. %2$s~~',
|
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Default format (%1$s), e.g. %2$s~~',
|
||||||
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Custom format: %1$s~~',
|
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Custom format: %1$s~~',
|
||||||
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s~~',
|
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s~~',
|
||||||
'Core:DateTime:Placeholder_d' => 'DD~~', // Day of the month: 2 digits (with leading zero)
|
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => 'Opening a file with untrusted data in Microsoft Excel may lead to formula injection. Ensure that your Excel settings are configured to handle files safely. <a href="%1$s">Learn more in our documentation.</a>~~',
|
||||||
|
'Core:DateTime:Placeholder_d' => 'DD~~', // Day of the month: 2 digits (with leading zero)
|
||||||
'Core:DateTime:Placeholder_j' => 'D~~', // Day of the month: 1 or 2 digits (without leading zero)
|
'Core:DateTime:Placeholder_j' => 'D~~', // Day of the month: 1 or 2 digits (without leading zero)
|
||||||
'Core:DateTime:Placeholder_m' => 'MM~~', // Month on 2 digits i.e. 01-12
|
'Core:DateTime:Placeholder_m' => 'MM~~', // Month on 2 digits i.e. 01-12
|
||||||
'Core:DateTime:Placeholder_n' => 'M~~', // Month on 1 or 2 digits 1-12
|
'Core:DateTime:Placeholder_n' => 'M~~', // Month on 1 or 2 digits 1-12
|
||||||
|
|||||||
@@ -940,7 +940,8 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
|
|||||||
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Default format (%1$s), e.g. %2$s~~',
|
'Core:BulkExport:DateTimeFormatDefault_Example' => 'Default format (%1$s), e.g. %2$s~~',
|
||||||
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Custom format: %1$s~~',
|
'Core:BulkExport:DateTimeFormatCustom_Format' => 'Custom format: %1$s~~',
|
||||||
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s~~',
|
'Core:BulkExport:PDF:PageNumber' => 'Page %1$s~~',
|
||||||
'Core:DateTime:Placeholder_d' => 'DD~~', // Day of the month: 2 digits (with leading zero)
|
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => 'Opening a file with untrusted data in Microsoft Excel may lead to formula injection. Ensure that your Excel settings are configured to handle files safely. <a href="%1$s">Learn more in our documentation.</a>~~',
|
||||||
|
'Core:DateTime:Placeholder_d' => 'DD~~', // Day of the month: 2 digits (with leading zero)
|
||||||
'Core:DateTime:Placeholder_j' => 'D~~', // Day of the month: 1 or 2 digits (without leading zero)
|
'Core:DateTime:Placeholder_j' => 'D~~', // Day of the month: 1 or 2 digits (without leading zero)
|
||||||
'Core:DateTime:Placeholder_m' => 'MM~~', // Month on 2 digits i.e. 01-12
|
'Core:DateTime:Placeholder_m' => 'MM~~', // Month on 2 digits i.e. 01-12
|
||||||
'Core:DateTime:Placeholder_n' => 'M~~', // Month on 1 or 2 digits 1-12
|
'Core:DateTime:Placeholder_n' => 'M~~', // Month on 1 or 2 digits 1-12
|
||||||
|
|||||||
@@ -931,7 +931,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
|
|||||||
'Core:BulkExport:DateTimeFormatDefault_Example' => '默认格式 (%1$s), e.g. %2$s',
|
'Core:BulkExport:DateTimeFormatDefault_Example' => '默认格式 (%1$s), e.g. %2$s',
|
||||||
'Core:BulkExport:DateTimeFormatCustom_Format' => '自定义格式: %1$s',
|
'Core:BulkExport:DateTimeFormatCustom_Format' => '自定义格式: %1$s',
|
||||||
'Core:BulkExport:PDF:PageNumber' => '第 %1$s 页',
|
'Core:BulkExport:PDF:PageNumber' => '第 %1$s 页',
|
||||||
'Core:DateTime:Placeholder_d' => 'DD', // Day of the month: 2 digits (with leading zero)
|
'UI:Bulk:Export:MaliciousInjection:Alert:Message' => 'Opening a file with untrusted data in Microsoft Excel may lead to formula injection. Ensure that your Excel settings are configured to handle files safely. <a href="%1$s">Learn more in our documentation.</a>~~',
|
||||||
|
'Core:DateTime:Placeholder_d' => 'DD', // Day of the month: 2 digits (with leading zero)
|
||||||
'Core:DateTime:Placeholder_j' => 'D', // Day of the month: 1 or 2 digits (without leading zero)
|
'Core:DateTime:Placeholder_j' => 'D', // Day of the month: 1 or 2 digits (without leading zero)
|
||||||
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
'Core:DateTime:Placeholder_m' => 'MM', // Month on 2 digits i.e. 01-12
|
||||||
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
|
'Core:DateTime:Placeholder_n' => 'M', // Month on 1 or 2 digits 1-12
|
||||||
|
|||||||
@@ -2,6 +2,24 @@
|
|||||||
|
|
||||||
// autoload.php @generated by Composer
|
// autoload.php @generated by Composer
|
||||||
|
|
||||||
|
if (PHP_VERSION_ID < 50600) {
|
||||||
|
if (!headers_sent()) {
|
||||||
|
header('HTTP/1.1 500 Internal Server Error');
|
||||||
|
}
|
||||||
|
$err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
|
||||||
|
if (!ini_get('display_errors')) {
|
||||||
|
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
|
||||||
|
fwrite(STDERR, $err);
|
||||||
|
} elseif (!headers_sent()) {
|
||||||
|
echo $err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
trigger_error(
|
||||||
|
$err,
|
||||||
|
E_USER_ERROR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
require_once __DIR__ . '/composer/autoload_real.php';
|
require_once __DIR__ . '/composer/autoload_real.php';
|
||||||
|
|
||||||
return ComposerAutoloaderInit0018331147de7601e7552f7da8e3bb8b::getLoader();
|
return ComposerAutoloaderInit0018331147de7601e7552f7da8e3bb8b::getLoader();
|
||||||
|
|||||||
@@ -42,35 +42,37 @@ namespace Composer\Autoload;
|
|||||||
*/
|
*/
|
||||||
class ClassLoader
|
class ClassLoader
|
||||||
{
|
{
|
||||||
/** @var ?string */
|
/** @var \Closure(string):void */
|
||||||
|
private static $includeFile;
|
||||||
|
|
||||||
|
/** @var string|null */
|
||||||
private $vendorDir;
|
private $vendorDir;
|
||||||
|
|
||||||
// PSR-4
|
// PSR-4
|
||||||
/**
|
/**
|
||||||
* @var array[]
|
* @var array<string, array<string, int>>
|
||||||
* @psalm-var array<string, array<string, int>>
|
|
||||||
*/
|
*/
|
||||||
private $prefixLengthsPsr4 = array();
|
private $prefixLengthsPsr4 = array();
|
||||||
/**
|
/**
|
||||||
* @var array[]
|
* @var array<string, list<string>>
|
||||||
* @psalm-var array<string, array<int, string>>
|
|
||||||
*/
|
*/
|
||||||
private $prefixDirsPsr4 = array();
|
private $prefixDirsPsr4 = array();
|
||||||
/**
|
/**
|
||||||
* @var array[]
|
* @var list<string>
|
||||||
* @psalm-var array<string, string>
|
|
||||||
*/
|
*/
|
||||||
private $fallbackDirsPsr4 = array();
|
private $fallbackDirsPsr4 = array();
|
||||||
|
|
||||||
// PSR-0
|
// PSR-0
|
||||||
/**
|
/**
|
||||||
* @var array[]
|
* List of PSR-0 prefixes
|
||||||
* @psalm-var array<string, array<string, string[]>>
|
*
|
||||||
|
* Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
|
||||||
|
*
|
||||||
|
* @var array<string, array<string, list<string>>>
|
||||||
*/
|
*/
|
||||||
private $prefixesPsr0 = array();
|
private $prefixesPsr0 = array();
|
||||||
/**
|
/**
|
||||||
* @var array[]
|
* @var list<string>
|
||||||
* @psalm-var array<string, string>
|
|
||||||
*/
|
*/
|
||||||
private $fallbackDirsPsr0 = array();
|
private $fallbackDirsPsr0 = array();
|
||||||
|
|
||||||
@@ -78,8 +80,7 @@ class ClassLoader
|
|||||||
private $useIncludePath = false;
|
private $useIncludePath = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string[]
|
* @var array<string, string>
|
||||||
* @psalm-var array<string, string>
|
|
||||||
*/
|
*/
|
||||||
private $classMap = array();
|
private $classMap = array();
|
||||||
|
|
||||||
@@ -87,29 +88,29 @@ class ClassLoader
|
|||||||
private $classMapAuthoritative = false;
|
private $classMapAuthoritative = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var bool[]
|
* @var array<string, bool>
|
||||||
* @psalm-var array<string, bool>
|
|
||||||
*/
|
*/
|
||||||
private $missingClasses = array();
|
private $missingClasses = array();
|
||||||
|
|
||||||
/** @var ?string */
|
/** @var string|null */
|
||||||
private $apcuPrefix;
|
private $apcuPrefix;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var self[]
|
* @var array<string, self>
|
||||||
*/
|
*/
|
||||||
private static $registeredLoaders = array();
|
private static $registeredLoaders = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param ?string $vendorDir
|
* @param string|null $vendorDir
|
||||||
*/
|
*/
|
||||||
public function __construct($vendorDir = null)
|
public function __construct($vendorDir = null)
|
||||||
{
|
{
|
||||||
$this->vendorDir = $vendorDir;
|
$this->vendorDir = $vendorDir;
|
||||||
|
self::initializeIncludeClosure();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string[]
|
* @return array<string, list<string>>
|
||||||
*/
|
*/
|
||||||
public function getPrefixes()
|
public function getPrefixes()
|
||||||
{
|
{
|
||||||
@@ -121,8 +122,7 @@ class ClassLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array[]
|
* @return array<string, list<string>>
|
||||||
* @psalm-return array<string, array<int, string>>
|
|
||||||
*/
|
*/
|
||||||
public function getPrefixesPsr4()
|
public function getPrefixesPsr4()
|
||||||
{
|
{
|
||||||
@@ -130,8 +130,7 @@ class ClassLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array[]
|
* @return list<string>
|
||||||
* @psalm-return array<string, string>
|
|
||||||
*/
|
*/
|
||||||
public function getFallbackDirs()
|
public function getFallbackDirs()
|
||||||
{
|
{
|
||||||
@@ -139,8 +138,7 @@ class ClassLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array[]
|
* @return list<string>
|
||||||
* @psalm-return array<string, string>
|
|
||||||
*/
|
*/
|
||||||
public function getFallbackDirsPsr4()
|
public function getFallbackDirsPsr4()
|
||||||
{
|
{
|
||||||
@@ -148,8 +146,7 @@ class ClassLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string[] Array of classname => path
|
* @return array<string, string> Array of classname => path
|
||||||
* @psalm-var array<string, string>
|
|
||||||
*/
|
*/
|
||||||
public function getClassMap()
|
public function getClassMap()
|
||||||
{
|
{
|
||||||
@@ -157,8 +154,7 @@ class ClassLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string[] $classMap Class to filename map
|
* @param array<string, string> $classMap Class to filename map
|
||||||
* @psalm-param array<string, string> $classMap
|
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
@@ -175,24 +171,25 @@ class ClassLoader
|
|||||||
* Registers a set of PSR-0 directories for a given prefix, either
|
* Registers a set of PSR-0 directories for a given prefix, either
|
||||||
* appending or prepending to the ones previously set for this prefix.
|
* appending or prepending to the ones previously set for this prefix.
|
||||||
*
|
*
|
||||||
* @param string $prefix The prefix
|
* @param string $prefix The prefix
|
||||||
* @param string[]|string $paths The PSR-0 root directories
|
* @param list<string>|string $paths The PSR-0 root directories
|
||||||
* @param bool $prepend Whether to prepend the directories
|
* @param bool $prepend Whether to prepend the directories
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function add($prefix, $paths, $prepend = false)
|
public function add($prefix, $paths, $prepend = false)
|
||||||
{
|
{
|
||||||
|
$paths = (array) $paths;
|
||||||
if (!$prefix) {
|
if (!$prefix) {
|
||||||
if ($prepend) {
|
if ($prepend) {
|
||||||
$this->fallbackDirsPsr0 = array_merge(
|
$this->fallbackDirsPsr0 = array_merge(
|
||||||
(array) $paths,
|
$paths,
|
||||||
$this->fallbackDirsPsr0
|
$this->fallbackDirsPsr0
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$this->fallbackDirsPsr0 = array_merge(
|
$this->fallbackDirsPsr0 = array_merge(
|
||||||
$this->fallbackDirsPsr0,
|
$this->fallbackDirsPsr0,
|
||||||
(array) $paths
|
$paths
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -201,19 +198,19 @@ class ClassLoader
|
|||||||
|
|
||||||
$first = $prefix[0];
|
$first = $prefix[0];
|
||||||
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
||||||
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
|
$this->prefixesPsr0[$first][$prefix] = $paths;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ($prepend) {
|
if ($prepend) {
|
||||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||||
(array) $paths,
|
$paths,
|
||||||
$this->prefixesPsr0[$first][$prefix]
|
$this->prefixesPsr0[$first][$prefix]
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||||
$this->prefixesPsr0[$first][$prefix],
|
$this->prefixesPsr0[$first][$prefix],
|
||||||
(array) $paths
|
$paths
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -222,9 +219,9 @@ class ClassLoader
|
|||||||
* Registers a set of PSR-4 directories for a given namespace, either
|
* Registers a set of PSR-4 directories for a given namespace, either
|
||||||
* appending or prepending to the ones previously set for this namespace.
|
* appending or prepending to the ones previously set for this namespace.
|
||||||
*
|
*
|
||||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||||
* @param string[]|string $paths The PSR-4 base directories
|
* @param list<string>|string $paths The PSR-4 base directories
|
||||||
* @param bool $prepend Whether to prepend the directories
|
* @param bool $prepend Whether to prepend the directories
|
||||||
*
|
*
|
||||||
* @throws \InvalidArgumentException
|
* @throws \InvalidArgumentException
|
||||||
*
|
*
|
||||||
@@ -232,17 +229,18 @@ class ClassLoader
|
|||||||
*/
|
*/
|
||||||
public function addPsr4($prefix, $paths, $prepend = false)
|
public function addPsr4($prefix, $paths, $prepend = false)
|
||||||
{
|
{
|
||||||
|
$paths = (array) $paths;
|
||||||
if (!$prefix) {
|
if (!$prefix) {
|
||||||
// Register directories for the root namespace.
|
// Register directories for the root namespace.
|
||||||
if ($prepend) {
|
if ($prepend) {
|
||||||
$this->fallbackDirsPsr4 = array_merge(
|
$this->fallbackDirsPsr4 = array_merge(
|
||||||
(array) $paths,
|
$paths,
|
||||||
$this->fallbackDirsPsr4
|
$this->fallbackDirsPsr4
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$this->fallbackDirsPsr4 = array_merge(
|
$this->fallbackDirsPsr4 = array_merge(
|
||||||
$this->fallbackDirsPsr4,
|
$this->fallbackDirsPsr4,
|
||||||
(array) $paths
|
$paths
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
||||||
@@ -252,18 +250,18 @@ class ClassLoader
|
|||||||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||||
}
|
}
|
||||||
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
||||||
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
$this->prefixDirsPsr4[$prefix] = $paths;
|
||||||
} elseif ($prepend) {
|
} elseif ($prepend) {
|
||||||
// Prepend directories for an already registered namespace.
|
// Prepend directories for an already registered namespace.
|
||||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||||
(array) $paths,
|
$paths,
|
||||||
$this->prefixDirsPsr4[$prefix]
|
$this->prefixDirsPsr4[$prefix]
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
// Append directories for an already registered namespace.
|
// Append directories for an already registered namespace.
|
||||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||||
$this->prefixDirsPsr4[$prefix],
|
$this->prefixDirsPsr4[$prefix],
|
||||||
(array) $paths
|
$paths
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -272,8 +270,8 @@ class ClassLoader
|
|||||||
* Registers a set of PSR-0 directories for a given prefix,
|
* Registers a set of PSR-0 directories for a given prefix,
|
||||||
* replacing any others previously set for this prefix.
|
* replacing any others previously set for this prefix.
|
||||||
*
|
*
|
||||||
* @param string $prefix The prefix
|
* @param string $prefix The prefix
|
||||||
* @param string[]|string $paths The PSR-0 base directories
|
* @param list<string>|string $paths The PSR-0 base directories
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
@@ -290,8 +288,8 @@ class ClassLoader
|
|||||||
* Registers a set of PSR-4 directories for a given namespace,
|
* Registers a set of PSR-4 directories for a given namespace,
|
||||||
* replacing any others previously set for this namespace.
|
* replacing any others previously set for this namespace.
|
||||||
*
|
*
|
||||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||||
* @param string[]|string $paths The PSR-4 base directories
|
* @param list<string>|string $paths The PSR-4 base directories
|
||||||
*
|
*
|
||||||
* @throws \InvalidArgumentException
|
* @throws \InvalidArgumentException
|
||||||
*
|
*
|
||||||
@@ -425,7 +423,8 @@ class ClassLoader
|
|||||||
public function loadClass($class)
|
public function loadClass($class)
|
||||||
{
|
{
|
||||||
if ($file = $this->findFile($class)) {
|
if ($file = $this->findFile($class)) {
|
||||||
includeFile($file);
|
$includeFile = self::$includeFile;
|
||||||
|
$includeFile($file);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -476,9 +475,9 @@ class ClassLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the currently registered loaders indexed by their corresponding vendor directories.
|
* Returns the currently registered loaders keyed by their corresponding vendor directories.
|
||||||
*
|
*
|
||||||
* @return self[]
|
* @return array<string, self>
|
||||||
*/
|
*/
|
||||||
public static function getRegisteredLoaders()
|
public static function getRegisteredLoaders()
|
||||||
{
|
{
|
||||||
@@ -555,18 +554,26 @@ class ClassLoader
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scope isolated include.
|
* @return void
|
||||||
*
|
*/
|
||||||
* Prevents access to $this/self from included files.
|
private static function initializeIncludeClosure()
|
||||||
*
|
{
|
||||||
* @param string $file
|
if (self::$includeFile !== null) {
|
||||||
* @return void
|
return;
|
||||||
* @private
|
}
|
||||||
*/
|
|
||||||
function includeFile($file)
|
/**
|
||||||
{
|
* Scope isolated include.
|
||||||
include $file;
|
*
|
||||||
|
* Prevents access to $this/self from included files.
|
||||||
|
*
|
||||||
|
* @param string $file
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
self::$includeFile = \Closure::bind(static function($file) {
|
||||||
|
include $file;
|
||||||
|
}, null, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
// autoload_classmap.php @generated by Composer
|
// autoload_classmap.php @generated by Composer
|
||||||
|
|
||||||
$vendorDir = dirname(dirname(__FILE__));
|
$vendorDir = dirname(__DIR__);
|
||||||
$baseDir = dirname($vendorDir);
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
@@ -138,6 +138,7 @@ return array(
|
|||||||
'CharConcatWSExpression' => $baseDir . '/core/oql/expression.class.inc.php',
|
'CharConcatWSExpression' => $baseDir . '/core/oql/expression.class.inc.php',
|
||||||
'CheckStopWatchThresholds' => $baseDir . '/core/ormstopwatch.class.inc.php',
|
'CheckStopWatchThresholds' => $baseDir . '/core/ormstopwatch.class.inc.php',
|
||||||
'CheckableExpression' => $baseDir . '/core/oql/oqlquery.class.inc.php',
|
'CheckableExpression' => $baseDir . '/core/oql/oqlquery.class.inc.php',
|
||||||
|
'Combodo\\iTop\\Application\\Helper\\ExportHelper' => $baseDir . '/sources/application/Helper/ExportHelper.php',
|
||||||
'Combodo\\iTop\\Application\\Search\\AjaxSearchException' => $baseDir . '/sources/application/search/ajaxsearchexception.class.inc.php',
|
'Combodo\\iTop\\Application\\Search\\AjaxSearchException' => $baseDir . '/sources/application/search/ajaxsearchexception.class.inc.php',
|
||||||
'Combodo\\iTop\\Application\\Search\\CriterionConversionAbstract' => $baseDir . '/sources/application/search/criterionconversionabstract.class.inc.php',
|
'Combodo\\iTop\\Application\\Search\\CriterionConversionAbstract' => $baseDir . '/sources/application/search/criterionconversionabstract.class.inc.php',
|
||||||
'Combodo\\iTop\\Application\\Search\\CriterionConversion\\CriterionToOQL' => $baseDir . '/sources/application/search/criterionconversion/criteriontooql.class.inc.php',
|
'Combodo\\iTop\\Application\\Search\\CriterionConversion\\CriterionToOQL' => $baseDir . '/sources/application/search/criterionconversion/criteriontooql.class.inc.php',
|
||||||
@@ -450,6 +451,7 @@ return array(
|
|||||||
'IntervalOqlExpression' => $baseDir . '/core/oql/oqlquery.class.inc.php',
|
'IntervalOqlExpression' => $baseDir . '/core/oql/oqlquery.class.inc.php',
|
||||||
'Introspection' => $baseDir . '/core/introspection.class.inc.php',
|
'Introspection' => $baseDir . '/core/introspection.class.inc.php',
|
||||||
'InvalidConfigParamException' => $baseDir . '/core/coreexception.class.inc.php',
|
'InvalidConfigParamException' => $baseDir . '/core/coreexception.class.inc.php',
|
||||||
|
'InvalidExternalKeyValueException' => $baseDir . '/core/coreexception.class.inc.php',
|
||||||
'InvalidPasswordAttributeOneWayPassword' => $baseDir . '/core/coreexception.class.inc.php',
|
'InvalidPasswordAttributeOneWayPassword' => $baseDir . '/core/coreexception.class.inc.php',
|
||||||
'IssueLog' => $baseDir . '/core/log.class.inc.php',
|
'IssueLog' => $baseDir . '/core/log.class.inc.php',
|
||||||
'ItopCounter' => $baseDir . '/core/counter.class.inc.php',
|
'ItopCounter' => $baseDir . '/core/counter.class.inc.php',
|
||||||
|
|||||||
@@ -2,25 +2,25 @@
|
|||||||
|
|
||||||
// autoload_files.php @generated by Composer
|
// autoload_files.php @generated by Composer
|
||||||
|
|
||||||
$vendorDir = dirname(dirname(__FILE__));
|
$vendorDir = dirname(__DIR__);
|
||||||
$baseDir = dirname($vendorDir);
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
'320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
|
'320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
|
||||||
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
|
|
||||||
'5255c38a0faeba867671b61dfda6d864' => $vendorDir . '/paragonie/random_compat/lib/random.php',
|
'5255c38a0faeba867671b61dfda6d864' => $vendorDir . '/paragonie/random_compat/lib/random.php',
|
||||||
'023d27dca8066ef29e6739335ea73bad' => $vendorDir . '/symfony/polyfill-php70/bootstrap.php',
|
'023d27dca8066ef29e6739335ea73bad' => $vendorDir . '/symfony/polyfill-php70/bootstrap.php',
|
||||||
'32dcc8afd4335739640db7d200c1971d' => $vendorDir . '/symfony/polyfill-apcu/bootstrap.php',
|
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
|
||||||
'667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
|
|
||||||
'bd9634f2d41831496de0d3dfe4c94881' => $vendorDir . '/symfony/polyfill-php56/bootstrap.php',
|
|
||||||
'7e9bd612cc444b3eed788ebbe46263a0' => $vendorDir . '/laminas/laminas-zendframework-bridge/src/autoload.php',
|
'7e9bd612cc444b3eed788ebbe46263a0' => $vendorDir . '/laminas/laminas-zendframework-bridge/src/autoload.php',
|
||||||
'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
|
'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
|
||||||
'25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
|
'25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
|
||||||
'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php',
|
'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php',
|
||||||
'7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
|
'7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
|
||||||
|
'bd9634f2d41831496de0d3dfe4c94881' => $vendorDir . '/symfony/polyfill-php56/bootstrap.php',
|
||||||
'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
|
'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
|
||||||
'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
|
'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
|
||||||
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
|
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
|
||||||
|
'32dcc8afd4335739640db7d200c1971d' => $vendorDir . '/symfony/polyfill-apcu/bootstrap.php',
|
||||||
'def43f6c87e4f8dfd0c9e1b1bab14fe8' => $vendorDir . '/symfony/polyfill-iconv/bootstrap.php',
|
'def43f6c87e4f8dfd0c9e1b1bab14fe8' => $vendorDir . '/symfony/polyfill-iconv/bootstrap.php',
|
||||||
|
'667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
|
||||||
'2c102faa651ef8ea5874edb585946bce' => $vendorDir . '/swiftmailer/swiftmailer/lib/swift_required.php',
|
'2c102faa651ef8ea5874edb585946bce' => $vendorDir . '/swiftmailer/swiftmailer/lib/swift_required.php',
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
// autoload_namespaces.php @generated by Composer
|
// autoload_namespaces.php @generated by Composer
|
||||||
|
|
||||||
$vendorDir = dirname(dirname(__FILE__));
|
$vendorDir = dirname(__DIR__);
|
||||||
$baseDir = dirname($vendorDir);
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
// autoload_psr4.php @generated by Composer
|
// autoload_psr4.php @generated by Composer
|
||||||
|
|
||||||
$vendorDir = dirname(dirname(__FILE__));
|
$vendorDir = dirname(__DIR__);
|
||||||
$baseDir = dirname($vendorDir);
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
|
|||||||
@@ -25,46 +25,31 @@ class ComposerAutoloaderInit0018331147de7601e7552f7da8e3bb8b
|
|||||||
require __DIR__ . '/platform_check.php';
|
require __DIR__ . '/platform_check.php';
|
||||||
|
|
||||||
spl_autoload_register(array('ComposerAutoloaderInit0018331147de7601e7552f7da8e3bb8b', 'loadClassLoader'), true, true);
|
spl_autoload_register(array('ComposerAutoloaderInit0018331147de7601e7552f7da8e3bb8b', 'loadClassLoader'), true, true);
|
||||||
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
|
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
|
||||||
spl_autoload_unregister(array('ComposerAutoloaderInit0018331147de7601e7552f7da8e3bb8b', 'loadClassLoader'));
|
spl_autoload_unregister(array('ComposerAutoloaderInit0018331147de7601e7552f7da8e3bb8b', 'loadClassLoader'));
|
||||||
|
|
||||||
$includePaths = require __DIR__ . '/include_paths.php';
|
$includePaths = require __DIR__ . '/include_paths.php';
|
||||||
$includePaths[] = get_include_path();
|
$includePaths[] = get_include_path();
|
||||||
set_include_path(implode(PATH_SEPARATOR, $includePaths));
|
set_include_path(implode(PATH_SEPARATOR, $includePaths));
|
||||||
|
|
||||||
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
require __DIR__ . '/autoload_static.php';
|
||||||
if ($useStaticLoader) {
|
call_user_func(\Composer\Autoload\ComposerStaticInit0018331147de7601e7552f7da8e3bb8b::getInitializer($loader));
|
||||||
require __DIR__ . '/autoload_static.php';
|
|
||||||
|
|
||||||
call_user_func(\Composer\Autoload\ComposerStaticInit0018331147de7601e7552f7da8e3bb8b::getInitializer($loader));
|
|
||||||
} else {
|
|
||||||
$classMap = require __DIR__ . '/autoload_classmap.php';
|
|
||||||
if ($classMap) {
|
|
||||||
$loader->addClassMap($classMap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$loader->setClassMapAuthoritative(true);
|
$loader->setClassMapAuthoritative(true);
|
||||||
$loader->register(true);
|
$loader->register(true);
|
||||||
|
|
||||||
if ($useStaticLoader) {
|
$filesToLoad = \Composer\Autoload\ComposerStaticInit0018331147de7601e7552f7da8e3bb8b::$files;
|
||||||
$includeFiles = Composer\Autoload\ComposerStaticInit0018331147de7601e7552f7da8e3bb8b::$files;
|
$requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
|
||||||
} else {
|
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
||||||
$includeFiles = require __DIR__ . '/autoload_files.php';
|
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
|
||||||
}
|
|
||||||
foreach ($includeFiles as $fileIdentifier => $file) {
|
require $file;
|
||||||
composerRequire0018331147de7601e7552f7da8e3bb8b($fileIdentifier, $file);
|
}
|
||||||
|
}, null, null);
|
||||||
|
foreach ($filesToLoad as $fileIdentifier => $file) {
|
||||||
|
$requireFile($fileIdentifier, $file);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $loader;
|
return $loader;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function composerRequire0018331147de7601e7552f7da8e3bb8b($fileIdentifier, $file)
|
|
||||||
{
|
|
||||||
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
|
||||||
require $file;
|
|
||||||
|
|
||||||
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -8,21 +8,21 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b
|
|||||||
{
|
{
|
||||||
public static $files = array (
|
public static $files = array (
|
||||||
'320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
|
'320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
|
||||||
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
|
|
||||||
'5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php',
|
'5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php',
|
||||||
'023d27dca8066ef29e6739335ea73bad' => __DIR__ . '/..' . '/symfony/polyfill-php70/bootstrap.php',
|
'023d27dca8066ef29e6739335ea73bad' => __DIR__ . '/..' . '/symfony/polyfill-php70/bootstrap.php',
|
||||||
'32dcc8afd4335739640db7d200c1971d' => __DIR__ . '/..' . '/symfony/polyfill-apcu/bootstrap.php',
|
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
|
||||||
'667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
|
|
||||||
'bd9634f2d41831496de0d3dfe4c94881' => __DIR__ . '/..' . '/symfony/polyfill-php56/bootstrap.php',
|
|
||||||
'7e9bd612cc444b3eed788ebbe46263a0' => __DIR__ . '/..' . '/laminas/laminas-zendframework-bridge/src/autoload.php',
|
'7e9bd612cc444b3eed788ebbe46263a0' => __DIR__ . '/..' . '/laminas/laminas-zendframework-bridge/src/autoload.php',
|
||||||
'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
|
'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
|
||||||
'25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
|
'25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
|
||||||
'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php',
|
'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php',
|
||||||
'7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
|
'7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
|
||||||
|
'bd9634f2d41831496de0d3dfe4c94881' => __DIR__ . '/..' . '/symfony/polyfill-php56/bootstrap.php',
|
||||||
'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
|
'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
|
||||||
'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
|
'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
|
||||||
'37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
|
'37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
|
||||||
|
'32dcc8afd4335739640db7d200c1971d' => __DIR__ . '/..' . '/symfony/polyfill-apcu/bootstrap.php',
|
||||||
'def43f6c87e4f8dfd0c9e1b1bab14fe8' => __DIR__ . '/..' . '/symfony/polyfill-iconv/bootstrap.php',
|
'def43f6c87e4f8dfd0c9e1b1bab14fe8' => __DIR__ . '/..' . '/symfony/polyfill-iconv/bootstrap.php',
|
||||||
|
'667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
|
||||||
'2c102faa651ef8ea5874edb585946bce' => __DIR__ . '/..' . '/swiftmailer/swiftmailer/lib/swift_required.php',
|
'2c102faa651ef8ea5874edb585946bce' => __DIR__ . '/..' . '/swiftmailer/swiftmailer/lib/swift_required.php',
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -506,6 +506,7 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b
|
|||||||
'CharConcatWSExpression' => __DIR__ . '/../..' . '/core/oql/expression.class.inc.php',
|
'CharConcatWSExpression' => __DIR__ . '/../..' . '/core/oql/expression.class.inc.php',
|
||||||
'CheckStopWatchThresholds' => __DIR__ . '/../..' . '/core/ormstopwatch.class.inc.php',
|
'CheckStopWatchThresholds' => __DIR__ . '/../..' . '/core/ormstopwatch.class.inc.php',
|
||||||
'CheckableExpression' => __DIR__ . '/../..' . '/core/oql/oqlquery.class.inc.php',
|
'CheckableExpression' => __DIR__ . '/../..' . '/core/oql/oqlquery.class.inc.php',
|
||||||
|
'Combodo\\iTop\\Application\\Helper\\ExportHelper' => __DIR__ . '/../..' . '/sources/application/Helper/ExportHelper.php',
|
||||||
'Combodo\\iTop\\Application\\Search\\AjaxSearchException' => __DIR__ . '/../..' . '/sources/application/search/ajaxsearchexception.class.inc.php',
|
'Combodo\\iTop\\Application\\Search\\AjaxSearchException' => __DIR__ . '/../..' . '/sources/application/search/ajaxsearchexception.class.inc.php',
|
||||||
'Combodo\\iTop\\Application\\Search\\CriterionConversionAbstract' => __DIR__ . '/../..' . '/sources/application/search/criterionconversionabstract.class.inc.php',
|
'Combodo\\iTop\\Application\\Search\\CriterionConversionAbstract' => __DIR__ . '/../..' . '/sources/application/search/criterionconversionabstract.class.inc.php',
|
||||||
'Combodo\\iTop\\Application\\Search\\CriterionConversion\\CriterionToOQL' => __DIR__ . '/../..' . '/sources/application/search/criterionconversion/criteriontooql.class.inc.php',
|
'Combodo\\iTop\\Application\\Search\\CriterionConversion\\CriterionToOQL' => __DIR__ . '/../..' . '/sources/application/search/criterionconversion/criteriontooql.class.inc.php',
|
||||||
@@ -818,6 +819,7 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b
|
|||||||
'IntervalOqlExpression' => __DIR__ . '/../..' . '/core/oql/oqlquery.class.inc.php',
|
'IntervalOqlExpression' => __DIR__ . '/../..' . '/core/oql/oqlquery.class.inc.php',
|
||||||
'Introspection' => __DIR__ . '/../..' . '/core/introspection.class.inc.php',
|
'Introspection' => __DIR__ . '/../..' . '/core/introspection.class.inc.php',
|
||||||
'InvalidConfigParamException' => __DIR__ . '/../..' . '/core/coreexception.class.inc.php',
|
'InvalidConfigParamException' => __DIR__ . '/../..' . '/core/coreexception.class.inc.php',
|
||||||
|
'InvalidExternalKeyValueException' => __DIR__ . '/../..' . '/core/coreexception.class.inc.php',
|
||||||
'InvalidPasswordAttributeOneWayPassword' => __DIR__ . '/../..' . '/core/coreexception.class.inc.php',
|
'InvalidPasswordAttributeOneWayPassword' => __DIR__ . '/../..' . '/core/coreexception.class.inc.php',
|
||||||
'IssueLog' => __DIR__ . '/../..' . '/core/log.class.inc.php',
|
'IssueLog' => __DIR__ . '/../..' . '/core/log.class.inc.php',
|
||||||
'ItopCounter' => __DIR__ . '/../..' . '/core/counter.class.inc.php',
|
'ItopCounter' => __DIR__ . '/../..' . '/core/counter.class.inc.php',
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
// include_paths.php @generated by Composer
|
// include_paths.php @generated by Composer
|
||||||
|
|
||||||
$vendorDir = dirname(dirname(__FILE__));
|
$vendorDir = dirname(__DIR__);
|
||||||
$baseDir = dirname($vendorDir);
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
|
|||||||
@@ -1002,6 +1002,7 @@ HTML
|
|||||||
{
|
{
|
||||||
throw new CoreCannotSaveObjectException(array('id' => $oObj->GetKey(), 'class' => $sClass, 'issues' => $aErrors));
|
throw new CoreCannotSaveObjectException(array('id' => $oObj->GetKey(), 'class' => $sClass, 'issues' => $aErrors));
|
||||||
}
|
}
|
||||||
|
$oObj->CheckChangedExtKeysValues();
|
||||||
// Transactions are now handled in DBUpdate
|
// Transactions are now handled in DBUpdate
|
||||||
$oObj->DBUpdate();
|
$oObj->DBUpdate();
|
||||||
$sMessage = Dict::Format('UI:Class_Object_Updated', MetaModel::GetName(get_class($oObj)), $oObj->GetName());
|
$sMessage = Dict::Format('UI:Class_Object_Updated', MetaModel::GetName(get_class($oObj)), $oObj->GetName());
|
||||||
@@ -1233,6 +1234,7 @@ HTML
|
|||||||
throw new CoreCannotSaveObjectException(array('id' => $oObj->GetKey(), 'class' => $sClass, 'issues' => $aErrors));
|
throw new CoreCannotSaveObjectException(array('id' => $oObj->GetKey(), 'class' => $sClass, 'issues' => $aErrors));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$oObj->CheckChangedExtKeysValues();
|
||||||
$oObj->DBInsertNoReload();// No need to reload
|
$oObj->DBInsertNoReload();// No need to reload
|
||||||
|
|
||||||
IssueLog::Trace('Object created', $sClass, array(
|
IssueLog::Trace('Object created', $sClass, array(
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ try
|
|||||||
|
|
||||||
// X-Frame http header : set in page constructor, but we need to allow frame integration for this specific page
|
// X-Frame http header : set in page constructor, but we need to allow frame integration for this specific page
|
||||||
// so we're resetting its value ! (see N°3416)
|
// so we're resetting its value ! (see N°3416)
|
||||||
$oPage->add_xframe_options('');
|
$oPage->add_http_headers('');
|
||||||
|
|
||||||
$oPage->add_header("Last-Modified: Wed, 15 Jun 2015 13:21:15 GMT"); // An arbitrary date in the past is ok
|
$oPage->add_header("Last-Modified: Wed, 15 Jun 2015 13:21:15 GMT"); // An arbitrary date in the past is ok
|
||||||
}
|
}
|
||||||
@@ -88,7 +88,7 @@ try
|
|||||||
|
|
||||||
// X-Frame http header : set in page constructor, but we need to allow frame integration for this specific page
|
// X-Frame http header : set in page constructor, but we need to allow frame integration for this specific page
|
||||||
// so we're resetting its value ! (see N°3416)
|
// so we're resetting its value ! (see N°3416)
|
||||||
$oPage->add_xframe_options('');
|
$oPage->add_http_headers('');
|
||||||
|
|
||||||
$oPage->add_header("Last-Modified: Wed, 15 Jun 2016 13:21:15 GMT"); // An arbitrary date in the past is ok
|
$oPage->add_header("Last-Modified: Wed, 15 Jun 2016 13:21:15 GMT"); // An arbitrary date in the past is ok
|
||||||
}
|
}
|
||||||
@@ -103,7 +103,7 @@ try
|
|||||||
|
|
||||||
// X-Frame http header : set in page constructor, but we need to allow frame integration for this specific page
|
// X-Frame http header : set in page constructor, but we need to allow frame integration for this specific page
|
||||||
// so we're resetting its value ! (see N°3416)
|
// so we're resetting its value ! (see N°3416)
|
||||||
$oPage->add_xframe_options('');
|
$oPage->add_http_headers('');
|
||||||
|
|
||||||
$oPage->add(file_get_contents(Utils::GetCachePath().$sSignature.'.js'));
|
$oPage->add(file_get_contents(Utils::GetCachePath().$sSignature.'.js'));
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1036,7 +1036,7 @@ try
|
|||||||
|
|
||||||
// X-Frame http header : set in page constructor, but we need to allow frame integration for this specific page
|
// X-Frame http header : set in page constructor, but we need to allow frame integration for this specific page
|
||||||
// so we're resetting its value ! (see N°3416)
|
// so we're resetting its value ! (see N°3416)
|
||||||
$oPage->add_xframe_options('');
|
$oPage->add_http_headers('');
|
||||||
|
|
||||||
// N°4129 - Prevent XSS attacks & other script executions
|
// N°4129 - Prevent XSS attacks & other script executions
|
||||||
if (utils::GetConfig()->Get('security.disable_inline_documents_sandbox') === false) {
|
if (utils::GetConfig()->Get('security.disable_inline_documents_sandbox') === false) {
|
||||||
|
|||||||
@@ -48,8 +48,9 @@ session_write_close();
|
|||||||
|
|
||||||
$sTargetPage = APPROOT.'env-'.$sEnvironment.'/'.$sModule.'/'.$sPage;
|
$sTargetPage = APPROOT.'env-'.$sEnvironment.'/'.$sModule.'/'.$sPage;
|
||||||
|
|
||||||
if (!file_exists($sTargetPage))
|
if (!file_exists($sTargetPage)
|
||||||
{
|
|| (strtolower(pathinfo($sTargetPage, PATHINFO_EXTENSION)) !== "php")
|
||||||
|
) {
|
||||||
// Do not recall the parameters (security takes precedence)
|
// Do not recall the parameters (security takes precedence)
|
||||||
echo "Wrong module, page name or environment...";
|
echo "Wrong module, page name or environment...";
|
||||||
exit;
|
exit;
|
||||||
|
|||||||
@@ -305,9 +305,8 @@ class DBBackup
|
|||||||
// Store the results in a temporary file
|
// Store the results in a temporary file
|
||||||
$sTmpFileName = self::EscapeShellArg($sBackupFileName);
|
$sTmpFileName = self::EscapeShellArg($sBackupFileName);
|
||||||
|
|
||||||
$sPortOption = self::GetMysqliCliSingleOption('port', $this->iDBPort);
|
$sPortAndTransportOptions = self::GetMysqlCliPortAndTransportOptions($this->sDBHost, $this->iDBPort);
|
||||||
$sTlsOptions = self::GetMysqlCliTlsOptions($this->oConfig);
|
$sTlsOptions = self::GetMysqlCliTlsOptions($this->oConfig);
|
||||||
$sProtocolOption = self::GetMysqlCliTransportOption($this->sDBHost);
|
|
||||||
|
|
||||||
$sMysqlVersion = CMDBSource::GetDBVersion();
|
$sMysqlVersion = CMDBSource::GetDBVersion();
|
||||||
$bIsMysqlSupportUtf8mb4 = (version_compare($sMysqlVersion, self::MYSQL_VERSION_WITH_UTF8MB4_IN_PROGRAMS) === -1);
|
$bIsMysqlSupportUtf8mb4 = (version_compare($sMysqlVersion, self::MYSQL_VERSION_WITH_UTF8MB4_IN_PROGRAMS) === -1);
|
||||||
@@ -326,10 +325,10 @@ EOF;
|
|||||||
chmod($sMySQLDumpCnfFile, 0600);
|
chmod($sMySQLDumpCnfFile, 0600);
|
||||||
file_put_contents($sMySQLDumpCnfFile, $sMySQLDumpCnf, LOCK_EX);
|
file_put_contents($sMySQLDumpCnfFile, $sMySQLDumpCnf, LOCK_EX);
|
||||||
|
|
||||||
// Note: opt implicitely sets lock-tables... which cancels the benefit of single-transaction!
|
// Note: opt implicitly sets lock-tables... which cancels the benefit of single-transaction!
|
||||||
// skip-lock-tables compensates and allows for writes during a backup
|
// skip-lock-tables compensates and allows for writes during a backup
|
||||||
$sCommand = "$sMySQLDump --defaults-extra-file=\"$sMySQLDumpCnfFile\" --opt --skip-lock-tables --default-character-set=".$sMysqldumpCharset." --add-drop-database --single-transaction --host=$sHost $sPortOption $sProtocolOption --user=$sUser $sTlsOptions --result-file=$sTmpFileName $sDBName $sTables 2>&1";
|
$sCommand = "$sMySQLDump --defaults-extra-file=\"$sMySQLDumpCnfFile\" --opt --skip-lock-tables --default-character-set=" . $sMysqldumpCharset . " --add-drop-database --single-transaction --host=$sHost $sPortAndTransportOptions --user=$sUser $sTlsOptions --result-file=$sTmpFileName $sDBName $sTables 2>&1";
|
||||||
$sCommandDisplay = "$sMySQLDump --defaults-extra-file=\"$sMySQLDumpCnfFile\" --opt --skip-lock-tables --default-character-set=".$sMysqldumpCharset." --add-drop-database --single-transaction --host=$sHost $sPortOption $sProtocolOption --user=xxxxx $sTlsOptions --result-file=$sTmpFileName $sDBName $sTables";
|
$sCommandDisplay = "$sMySQLDump --defaults-extra-file=\"$sMySQLDumpCnfFile\" --opt --skip-lock-tables --default-character-set=" . $sMysqldumpCharset . " --add-drop-database --single-transaction --host=$sHost $sPortAndTransportOptions --user=xxxxx $sTlsOptions --result-file=$sTmpFileName $sDBName $sTables";
|
||||||
|
|
||||||
// Now run the command for real
|
// Now run the command for real
|
||||||
$this->LogInfo("backup: generate data file with command: $sCommandDisplay");
|
$this->LogInfo("backup: generate data file with command: $sCommandDisplay");
|
||||||
@@ -523,25 +522,37 @@ EOF;
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define if we should force a transport option
|
* @return string CLI options for port and protocol
|
||||||
*
|
|
||||||
* @param string $sHost
|
|
||||||
*
|
*
|
||||||
* @return string .
|
* @since 2.7.9 3.0.4 3.1.1 N°6123 method creation
|
||||||
|
* @since 2.7.10 3.0.4 3.1.2 3.2.0 N°6889 rename method to return both port and transport options. Keep default socket connexion if we are on localhost with no port
|
||||||
* @since 2.7.9 3.0.4 3.1.1 N°6123
|
*
|
||||||
|
* @link https://bugs.mysql.com/bug.php?id=55796 MySQL CLI tools will ignore `--port` option on localhost
|
||||||
|
* @link https://jira.mariadb.org/browse/MDEV-14974 Since 10.6.1 the MariaDB CLI tools will use the `--port` option on host=localhost
|
||||||
*/
|
*/
|
||||||
public static function GetMysqlCliTransportOption(string $sHost)
|
private static function GetMysqlCliPortAndTransportOptions(string $sHost, ?int $iPort): string
|
||||||
{
|
{
|
||||||
$sTransportOptions = '';
|
if (strtolower($sHost) === 'localhost') {
|
||||||
|
/**
|
||||||
/** N°6123 As we're using a --port option, if we use localhost as host,
|
* Since MariaDB 10.6.1 if we have host=localhost, and only the --port option we will get a warning
|
||||||
* MariaDB > 10.6 will implicitly change its protocol from socket to tcp and throw a warning **/
|
* To avoid this warning if we want to set --port option we must set --protocol=tcp
|
||||||
if($sHost === 'localhost'){
|
**/
|
||||||
$sTransportOptions = '--protocol=tcp';
|
if (is_null($iPort)) {
|
||||||
|
// no port specified => no option to return, this will mean using socket protocol (unix socket)
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$sPortOption = self::GetMysqliCliSingleOption('port', $iPort);
|
||||||
|
$sTransportOptions = ' --protocol=tcp';
|
||||||
|
return $sPortOption . $sTransportOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $sTransportOptions;
|
if (is_null($iPort)) {
|
||||||
|
$iPort = CMDBSource::MYSQL_DEFAULT_PORT;
|
||||||
|
}
|
||||||
|
$sPortOption = self::GetMysqliCliSingleOption('port', $iPort);
|
||||||
|
|
||||||
|
return $sPortOption;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ $oP = new SetupPage('iTop email test utility');
|
|||||||
|
|
||||||
// Although this page doesn't expose sensitive info, with it we can send multiple emails
|
// Although this page doesn't expose sensitive info, with it we can send multiple emails
|
||||||
// So we're adding this http header to reduce CSRF exposure...
|
// So we're adding this http header to reduce CSRF exposure...
|
||||||
$oP->add_xframe_options('DENY');
|
$oP->add_http_headers('DENY');
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
23
sources/application/Helper/ExportHelper.php
Normal file
23
sources/application/Helper/ExportHelper.php
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Combodo\iTop\Application\Helper;
|
||||||
|
use Dict;
|
||||||
|
use utils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class
|
||||||
|
* ExportHelper
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
|
* @author Stephen Abello <stephen.abello@combodo.com>
|
||||||
|
* @since 2.7.9 3.0.4 3.1.1 3.2.0
|
||||||
|
* @package Combodo\iTop\Application\Helper
|
||||||
|
*/
|
||||||
|
class ExportHelper
|
||||||
|
{
|
||||||
|
public static function GetAlertForExcelMaliciousInjection()
|
||||||
|
{
|
||||||
|
$sWikiUrl = 'https://www.itophub.io/wiki/page?id='.utils::GetItopVersionWikiSyntax().'%3Auser%3Alists#excel_export';
|
||||||
|
return '<div class="message_warning">' . Dict::Format('UI:Bulk:Export:MaliciousInjection:Alert:Message', $sWikiUrl) . '</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -576,7 +576,7 @@ abstract class Controller
|
|||||||
{
|
{
|
||||||
case 'html':
|
case 'html':
|
||||||
$this->m_oPage = new iTopWebPage($this->GetOperationTitle());
|
$this->m_oPage = new iTopWebPage($this->GetOperationTitle());
|
||||||
$this->m_oPage->add_xframe_options();
|
$this->m_oPage->add_http_headers();
|
||||||
|
|
||||||
if ($this->m_bIsBreadCrumbEnabled) {
|
if ($this->m_bIsBreadCrumbEnabled) {
|
||||||
if (count($this->m_aBreadCrumbEntry) > 0) {
|
if (count($this->m_aBreadCrumbEntry) > 0) {
|
||||||
|
|||||||
@@ -4,4 +4,14 @@
|
|||||||
- Covers an iTop PHP class or method?
|
- Covers an iTop PHP class or method?
|
||||||
- Most likely in "unitary-tests".
|
- Most likely in "unitary-tests".
|
||||||
- Covers the consistency of some data through the app?
|
- Covers the consistency of some data through the app?
|
||||||
- Most likely in "integration-tests".
|
- Most likely in "integration-tests".
|
||||||
|
|
||||||
|
## Tips
|
||||||
|
|
||||||
|
### Measure the time spent in a test
|
||||||
|
|
||||||
|
Simply cut'n paste the following line at several places within the test function:
|
||||||
|
|
||||||
|
```php
|
||||||
|
if (isset($fStarted)) {echo 'L'.__LINE__.': '.round(microtime(true) - $fStarted, 3)."\n";} $fStarted = microtime(true);
|
||||||
|
```
|
||||||
|
|||||||
@@ -782,7 +782,7 @@ try
|
|||||||
|
|
||||||
case 'create_structure':
|
case 'create_structure':
|
||||||
$oP->no_cache();
|
$oP->no_cache();
|
||||||
$oP->add_xframe_options('DENY');
|
$oP->add_http_headers('DENY');
|
||||||
$iPlannedContacts = Utils::ReadParam('plannedcontacts');
|
$iPlannedContacts = Utils::ReadParam('plannedcontacts');
|
||||||
$iPlannedContracts = Utils::ReadParam('plannedcontracts');
|
$iPlannedContracts = Utils::ReadParam('plannedcontracts');
|
||||||
|
|
||||||
|
|||||||
49
tests/php-unit-tests/module_integration.xml.dist
Normal file
49
tests/php-unit-tests/module_integration.xml.dist
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<phpunit
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/8.5/phpunit.xsd"
|
||||||
|
bootstrap="vendor/autoload.php"
|
||||||
|
backupGlobals="true"
|
||||||
|
colors="true"
|
||||||
|
columns="120"
|
||||||
|
convertErrorsToExceptions="true"
|
||||||
|
convertNoticesToExceptions="true"
|
||||||
|
convertWarningsToExceptions="true"
|
||||||
|
processIsolation="false"
|
||||||
|
stopOnError="false"
|
||||||
|
stopOnFailure="false"
|
||||||
|
stopOnIncomplete="false"
|
||||||
|
stopOnRisky="false"
|
||||||
|
stopOnSkipped="false"
|
||||||
|
verbose="true"
|
||||||
|
printerClass="Sempro\PHPUnitPrettyPrinter\PrettyPrinter"
|
||||||
|
>
|
||||||
|
|
||||||
|
<extensions>
|
||||||
|
<extension class="Combodo\iTop\Test\UnitTest\Hook\TestsRunStartHook" />
|
||||||
|
</extensions>
|
||||||
|
|
||||||
|
<php>
|
||||||
|
<ini name="error_reporting" value="E_ALL"/>
|
||||||
|
<ini name="display_errors" value="On"/>
|
||||||
|
<ini name="log_errors" value="On"/>
|
||||||
|
<ini name="html_errors" value="Off"/>
|
||||||
|
<env name="PHPUNIT_PRETTY_PRINT_PROGRESS" value="true"/>
|
||||||
|
</php>
|
||||||
|
<!-- N°6949 - file dedicated to validate modules/extensions -->
|
||||||
|
<testsuites>
|
||||||
|
<testsuite name="ModuleIntegration">
|
||||||
|
<file>integration-tests/DictionariesConsistencyAfterSetupTest.php</file>
|
||||||
|
<file>integration-tests/DictionariesConsistencyTest.php</file>
|
||||||
|
</testsuite>
|
||||||
|
</testsuites>
|
||||||
|
|
||||||
|
<!-- Code coverage white list -->
|
||||||
|
<filter>
|
||||||
|
<whitelist>
|
||||||
|
<file>../../core/apc-emulation.php</file>
|
||||||
|
<file>../../core/ormlinkset.class.inc.php</file>
|
||||||
|
<file>../../datamodels/2.x/itop-tickets/main.itop-tickets.php</file>
|
||||||
|
</whitelist>
|
||||||
|
</filter>
|
||||||
|
</phpunit>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user