From b740cb2afd370072c8ade3788b8f82292fab3771 Mon Sep 17 00:00:00 2001 From: acognet Date: Wed, 12 May 2021 08:15:29 +0200 Subject: [PATCH 01/31] =?UTF-8?q?N=C2=B02540=20-=20prevent=20the=20mysql?= =?UTF-8?q?=20password=20to=20appear=20on=20misconfigured=20servers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/cmdbsource.class.inc.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/cmdbsource.class.inc.php b/core/cmdbsource.class.inc.php index 285b42ed8..f52c6a69b 100644 --- a/core/cmdbsource.class.inc.php +++ b/core/cmdbsource.class.inc.php @@ -39,6 +39,7 @@ class MySQLException extends CoreException */ public function __construct($sIssue, $aContext, $oException = null, $oMysqli = null) { + if ($oException != null) { $aContext['mysql_errno'] = $oException->getCode(); @@ -58,6 +59,11 @@ class MySQLException extends CoreException $aContext['mysql_error'] = CMDBSource::GetError(); } parent::__construct($sIssue, $aContext); + //if is connection error, don't log the default message with password in + if (mysqli_connect_errno()) { + error_log($this->message); + error_reporting(0); + } } } @@ -262,7 +268,7 @@ class CMDBSource } catch(mysqli_sql_exception $e) { - throw new MySQLException('Could not connect to the DB server', array('host' => $sServer, 'user' => $sUser), $e); + throw new MySQLException('Could not connect to the DB server', array('host' => $sServer, 'user' => $sUser),$e); } if ($bTlsEnabled From d74e3e6b429432607d3e453fd558d82da31b10a5 Mon Sep 17 00:00:00 2001 From: Pierre Goiffon Date: Tue, 18 May 2021 17:16:04 +0200 Subject: [PATCH 02/31] :bulb: ItopTestCase : some PHPDoc --- test/ItopTestCase.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/ItopTestCase.php b/test/ItopTestCase.php index 16b9a2f1f..fbfac87d0 100644 --- a/test/ItopTestCase.php +++ b/test/ItopTestCase.php @@ -97,6 +97,9 @@ class ItopTestCase extends TestCase return $sId; } + /** + * @since 2.7.4 3.0.0 + */ public function InvokeNonPublicStaticMethod($sObjectClass, $sMethodName, $aArgs) { return $this->InvokeNonPublicMethod($sObjectClass, $sMethodName, null, $aArgs); @@ -111,6 +114,8 @@ class ItopTestCase extends TestCase * @return mixed method result * * @throws \ReflectionException + * + * @since 2.7.4 3.0.0 */ public function InvokeNonPublicMethod($sObjectClass, $sMethodName, $oObject, $aArgs) { From db6e813cba79df3213cd25e9ee4b19b75ef1ca9c Mon Sep 17 00:00:00 2001 From: acognet Date: Tue, 18 May 2021 17:34:57 +0200 Subject: [PATCH 03/31] =?UTF-8?q?N=C2=B03945=20-=20Password=20database=20i?= =?UTF-8?q?s=20visible=20in=20the=20setup=20process?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setup/wizardsteps.class.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/wizardsteps.class.inc.php b/setup/wizardsteps.class.inc.php index cfc349dd3..3efdddd69 100644 --- a/setup/wizardsteps.class.inc.php +++ b/setup/wizardsteps.class.inc.php @@ -2168,7 +2168,7 @@ EOF $oPage->add('
Database Parameters
    '); $oPage->add('
  • Server Name: '.$aInstallParams['database']['server'].'
  • '); $oPage->add('
  • DB User Name: '.$aInstallParams['database']['user'].'
  • '); - $oPage->add('
  • DB user password: '.$aInstallParams['database']['pwd'].'
  • '); + $oPage->add('
  • DB user password: ***
  • '); if (($sMode == 'install') && ($this->oWizard->GetParameter('create_db') == 'yes')) { $oPage->add('
  • Database Name: '.$aInstallParams['database']['name'].' (will be created)
  • '); From f0c73451a2a4cce541f111658eb03e5f61563b55 Mon Sep 17 00:00:00 2001 From: Pierre Goiffon Date: Thu, 20 May 2021 15:27:37 +0200 Subject: [PATCH 04/31] =?UTF-8?q?:globe=5Fwith=5Fmeridians:=20N=C2=B04017?= =?UTF-8?q?=20Report=20pt=5Fbr=20translations=20for=20TTO/TTR=20made=20in?= =?UTF-8?q?=20combodo-dispatch-userrequest=20Those=20dict=20keys=20were=20?= =?UTF-8?q?wrongly=20duplicated=20in=20this=20module,=20but=20they=20are?= =?UTF-8?q?=20core=20iTop=20!=20Original=20commit=20https://github.com/Com?= =?UTF-8?q?bodo/combodo-dispatch-userrequest/commit/97258976236157ef904f9b?= =?UTF-8?q?61562d31df0205a0ce=20Thanks=20to=20@rokam=20!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pt_br.dict.itop-request-mgmt-itil.php | 4 ++-- .../2.x/itop-request-mgmt/pt_br.dict.itop-request-mgmt.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/datamodels/2.x/itop-request-mgmt-itil/pt_br.dict.itop-request-mgmt-itil.php b/datamodels/2.x/itop-request-mgmt-itil/pt_br.dict.itop-request-mgmt-itil.php index 36fb44206..f22f6f801 100644 --- a/datamodels/2.x/itop-request-mgmt-itil/pt_br.dict.itop-request-mgmt-itil.php +++ b/datamodels/2.x/itop-request-mgmt-itil/pt_br.dict.itop-request-mgmt-itil.php @@ -164,9 +164,9 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array( 'Class:UserRequest/Attribute:cumulatedpending' => 'Pendências acumuladas', 'Class:UserRequest/Attribute:cumulatedpending+' => '', 'Class:UserRequest/Attribute:tto' => 'TTO', - 'Class:UserRequest/Attribute:tto+' => '', + 'Class:UserRequest/Attribute:tto+' => 'Tempo de atribuição', 'Class:UserRequest/Attribute:ttr' => 'TTR', - 'Class:UserRequest/Attribute:ttr+' => '', + 'Class:UserRequest/Attribute:ttr+' => 'Tempo de resolução', 'Class:UserRequest/Attribute:tto_escalation_deadline' => 'Prazo determinado TTO', 'Class:UserRequest/Attribute:tto_escalation_deadline+' => '', 'Class:UserRequest/Attribute:sla_tto_passed' => 'SLA TTO passou', diff --git a/datamodels/2.x/itop-request-mgmt/pt_br.dict.itop-request-mgmt.php b/datamodels/2.x/itop-request-mgmt/pt_br.dict.itop-request-mgmt.php index a968a04af..6e18bb089 100644 --- a/datamodels/2.x/itop-request-mgmt/pt_br.dict.itop-request-mgmt.php +++ b/datamodels/2.x/itop-request-mgmt/pt_br.dict.itop-request-mgmt.php @@ -170,9 +170,9 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array( 'Class:UserRequest/Attribute:cumulatedpending' => 'Pendências acumuladas', 'Class:UserRequest/Attribute:cumulatedpending+' => '', 'Class:UserRequest/Attribute:tto' => 'TTO', - 'Class:UserRequest/Attribute:tto+' => '', + 'Class:UserRequest/Attribute:tto+' => 'Tempo de atribuição', 'Class:UserRequest/Attribute:ttr' => 'TTR', - 'Class:UserRequest/Attribute:ttr+' => '', + 'Class:UserRequest/Attribute:ttr+' => 'Tempo de resolução', 'Class:UserRequest/Attribute:tto_escalation_deadline' => 'Prazo determinado TTO', 'Class:UserRequest/Attribute:tto_escalation_deadline+' => '', 'Class:UserRequest/Attribute:sla_tto_passed' => 'SLA TTO passou', From a4b6f4e37c1494b8248d77098bf84dc92939b9c0 Mon Sep 17 00:00:00 2001 From: Pierre Goiffon Date: Thu, 20 May 2021 15:44:24 +0200 Subject: [PATCH 05/31] :busts_in_silhouette: Add @rokam to contributors list Thanks to him for his PT-BR translations ! --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0251a90a8..4cc958c40 100644 --- a/README.md +++ b/README.md @@ -123,8 +123,9 @@ We would like to give a special thank you to the people from the community who c - Lassiter, Dennis - Lazcano, Federico - Lucas, Jonathan - - Malik, Remie - - Rosenke, Stephan +- Malik, Remie +- Mindêllo de Andrade, Lucas (a.k.a @rokam) +- Rosenke, Stephan - Seki, Shoji - Shilov, Vladimir - Tulio, Marco From 923a025f1c273f66e91b40a8b23f211e8d7a0ff2 Mon Sep 17 00:00:00 2001 From: Pierre Goiffon Date: Thu, 20 May 2021 15:51:21 +0200 Subject: [PATCH 06/31] =?UTF-8?q?:globe=5Fwith=5Fmeridians:=20N=C2=B04017?= =?UTF-8?q?=20Report=20pt=5Fbr=20translations=20for=20TTO/TTR=20made=20in?= =?UTF-8?q?=20combodo-dispatch-incident=20Those=20dict=20keys=20were=20wro?= =?UTF-8?q?ngly=20duplicated=20in=20this=20module,=20but=20they=20are=20co?= =?UTF-8?q?re=20iTop=20!=20Original=20commit=20https://github.com/Combodo/?= =?UTF-8?q?combodo-dispatch-incident/commit/75f00d993ccf7ded873b28e736131c?= =?UTF-8?q?561b4c84f9=20Thanks=20to=20@rokam=20!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pt_br.dict.itop-incident-mgmt-itil.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datamodels/2.x/itop-incident-mgmt-itil/pt_br.dict.itop-incident-mgmt-itil.php b/datamodels/2.x/itop-incident-mgmt-itil/pt_br.dict.itop-incident-mgmt-itil.php index 3be110b85..cfca8b63c 100644 --- a/datamodels/2.x/itop-incident-mgmt-itil/pt_br.dict.itop-incident-mgmt-itil.php +++ b/datamodels/2.x/itop-incident-mgmt-itil/pt_br.dict.itop-incident-mgmt-itil.php @@ -144,9 +144,9 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array( 'Class:Incident/Attribute:cumulatedpending' => 'Pendências acumuladas', 'Class:Incident/Attribute:cumulatedpending+' => '', 'Class:Incident/Attribute:tto' => 'TTO', - 'Class:Incident/Attribute:tto+' => '', + 'Class:Incident/Attribute:tto+' => 'Tempo de atribuição', 'Class:Incident/Attribute:ttr' => 'TTR', - 'Class:Incident/Attribute:ttr+' => '', + 'Class:Incident/Attribute:ttr+' => 'Tempo de resolução', 'Class:Incident/Attribute:tto_escalation_deadline' => 'Prazo determinado TTO', 'Class:Incident/Attribute:tto_escalation_deadline+' => '', 'Class:Incident/Attribute:sla_tto_passed' => 'SLA TTO passou', From 81822efa0f3c2af15a9e76e93952934feaddf6fd Mon Sep 17 00:00:00 2001 From: Pierre Goiffon Date: Tue, 25 May 2021 10:52:12 +0200 Subject: [PATCH 07/31] :bulb: PHPDoc for \DBObject::ApplyStimulus --- core/dbobject.class.php | 47 +++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/core/dbobject.class.php b/core/dbobject.class.php index a693d26f8..1009d653a 100644 --- a/core/dbobject.class.php +++ b/core/dbobject.class.php @@ -3709,16 +3709,22 @@ abstract class DBObject implements iDisplay /** * Apply a stimulus (workflow) - * - * @api - * - * @param string $sStimulusCode - * @param bool $bDoNotWrite - * + * + * @api + * + * @param string $sStimulusCode + * @param bool $bDoNotWrite if true we won't save the object ! + * * @return bool - * + * * @throws CoreException * @throws CoreUnexpectedValue + * + * @uses \AttributeStopWatch::Start + * @uses \AttributeStopWatch::Stop + * @uses \DBObject::DBWrite + * @uses \TriggerOnStateLeave::DoActivate + * @uses \TriggerOnStateEnter::DoActivate */ public function ApplyStimulus($sStimulusCode, $bDoNotWrite = false) { @@ -3842,8 +3848,7 @@ abstract class DBObject implements iDisplay } } - if (!$bDoNotWrite) - { + if (!$bDoNotWrite) { $this->DBWrite(); } @@ -3851,30 +3856,26 @@ abstract class DBObject implements iDisplay $aParams = array( 'class_list' => MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL), 'previous_state' => $sPreviousState, - 'new_state' => $sNewState); + 'new_state' => $sNewState, + ); $oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnStateLeave AS t WHERE t.target_class IN (:class_list) AND t.state=:previous_state"), array(), $aParams); - while ($oTrigger = $oSet->Fetch()) - { - /** @var \Trigger $oTrigger */ - try - { + while ($oTrigger = $oSet->Fetch()) { + /** @var \TriggerOnStateLeave $oTrigger */ + try { $oTrigger->DoActivate($this->ToArgs('this')); } - catch(Exception $e) - { + catch (Exception $e) { utils::EnrichRaisedException($oTrigger, $e); } } $oSet = new DBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnStateEnter AS t WHERE t.target_class IN (:class_list) AND t.state=:new_state"), array(), $aParams); - while ($oTrigger = $oSet->Fetch()) - { - /** @var \Trigger $oTrigger */ - try{ + while ($oTrigger = $oSet->Fetch()) { + /** @var \TriggerOnStateEnter $oTrigger */ + try { $oTrigger->DoActivate($this->ToArgs('this')); } - catch(Exception $e) - { + catch (Exception $e) { utils::EnrichRaisedException($oTrigger, $e); } } From c2f5cafaf324110a66f33699b189ae03a906cb6f Mon Sep 17 00:00:00 2001 From: BGdu38 <84503128+BGdu38@users.noreply.github.com> Date: Tue, 25 May 2021 12:03:19 +0200 Subject: [PATCH 08/31] Avoid setting memory_limit to lower value than the one already configured (#215) Some scripts are setting the memory_limit PHP option : setup, csvimport and XLSX export. This was done to avoid crashing when dealing with such large amount of data. But sometimes we were setting the value without any prior check, so we could actually lower the memory_limit value :/ Now this memory_limit change is done using \utils::SetMinMemoryLimit, which will call ini_set if and only if the current value is lower than the one to be set. Setup calls (setup/ajax.dataloader.php and webservices/backoffice.dataloader.php) were left as is as they weren't subject to this bug, and also they are more complex (logging done on each case). --- application/utils.inc.php | 100 +++++++++++++++++++++++---------- pages/ajax.render.php | 7 ++- pages/csvimport.php | 16 +++--- test/application/UtilsTest.php | 22 ++++++++ 4 files changed, 104 insertions(+), 41 deletions(-) diff --git a/application/utils.inc.php b/application/utils.inc.php index 47a532503..6b69cbf16 100644 --- a/application/utils.inc.php +++ b/application/utils.inc.php @@ -563,48 +563,86 @@ class utils public static function ReadFromFile($sFileName) { - if (!file_exists($sFileName)) return false; + if (!file_exists($sFileName)) { + return false; + } + return file_get_contents($sFileName); } /** * Helper function to convert a value expressed in a 'user friendly format' * as in php.ini, e.g. 256k, 2M, 1G etc. Into a number of bytes + * * @param mixed $value The value as read from php.ini + * * @return number */ - public static function ConvertToBytes( $value ) + public static function ConvertToBytes($value) { $iReturn = $value; - if ( !is_numeric( $value ) ) - { - $iLength = strlen( $value ); - $iReturn = substr( $value, 0, $iLength - 1 ); - $sUnit = strtoupper( substr( $value, $iLength - 1 ) ); - switch ( $sUnit ) - { - case 'G': - $iReturn *= 1024; - case 'M': - $iReturn *= 1024; - case 'K': - $iReturn *= 1024; - } - } - return $iReturn; - } - - /** - * Checks if the memory limit is at least what is required - * - * @param int $memoryLimit set limit in bytes - * @param int $requiredLimit required limit in bytes - * @return bool - */ - public static function IsMemoryLimitOk($memoryLimit, $requiredLimit) - { - return ($memoryLimit >= $requiredLimit) || ($memoryLimit == -1); - } + if (!is_numeric($value)) { + $iLength = strlen($value); + $iReturn = substr($value, 0, $iLength - 1); + $sUnit = strtoupper(substr($value, $iLength - 1)); + switch ($sUnit) { + case 'G': + $iReturn *= 1024; + case 'M': + $iReturn *= 1024; + case 'K': + $iReturn *= 1024; + } + } + + return $iReturn; + } + + /** + * Checks if the memory limit is at least what is required + * + * @param int $iMemoryLimit set limit in bytes + * @param int $iRequiredLimit required limit in bytes + * + * @return bool + */ + public static function IsMemoryLimitOk($iMemoryLimit, $iRequiredLimit) + { + return ($iMemoryLimit >= $iRequiredLimit) || ($iMemoryLimit === -1); + } + + /** + * Set memory_limit to required value + * + * @param string $sRequiredLimit required limit, for example '512M' + * + * @return bool|null null if nothing was done, true if modifying memory_limit was successful, false otherwise + * + * @uses utils::ConvertToBytes() + * @uses \ini_get('memory_limit') + * @uses \ini_set() + * @uses utils::ConvertToBytes() + * + * @since 2.7.5 N°3806 + */ + public static function SetMinMemoryLimit($sRequiredLimit) + { + $iRequiredLimit = static::ConvertToBytes($sRequiredLimit); + $sMemoryLimit = trim(ini_get('memory_limit')); + if (empty($sMemoryLimit)) { + // On some PHP installations, memory_limit does not exist as a PHP setting! + // (encountered on a 5.2.0 under Windows) + // In that case, ini_set will not work + return false; + } + $iMemoryLimit = static::ConvertToBytes($sMemoryLimit); + + if (static::IsMemoryLimitOk($iMemoryLimit, $iRequiredLimit)) { + return null; + } + + return ini_set('memory_limit', $iRequiredLimit); + } /** * Format a value into a more friendly format (KB, MB, GB, TB) instead a juste a Bytes amount. diff --git a/pages/ajax.render.php b/pages/ajax.render.php index 688b670d1..fcba420a1 100644 --- a/pages/ajax.render.php +++ b/pages/ajax.render.php @@ -2060,7 +2060,9 @@ EOF case 'xlsx_run': $sMemoryLimit = MetaModel::GetConfig()->Get('xlsx_exporter_memory_limit'); - ini_set('memory_limit', $sMemoryLimit); + if (utils::SetMinMemoryLimit($sMemoryLimit) === false) { + IssueLog::Warning("XSLX export : cannot set memory_limit to {$sMemoryLimit}"); + } ini_set('max_execution_time', max(300, ini_get('max_execution_time'))); // At least 5 minutes $sToken = utils::ReadParam('token', '', false, 'raw_data'); @@ -2068,8 +2070,7 @@ EOF $oExcelExporter = new ExcelExporter($sToken); $aStatus = $oExcelExporter->Run(); $aResults = array('status' => $aStatus['code'], 'percentage' => $aStatus['percentage'], 'message' => $aStatus['message']); - if ($aStatus['code'] == 'done') - { + if ($aStatus['code'] == 'done') { $aResults['statistics'] = $oExcelExporter->GetStatistics('html'); } $oPage->add(json_encode($aResults)); diff --git a/pages/csvimport.php b/pages/csvimport.php index 0b6024479..9f4b566a2 100644 --- a/pages/csvimport.php +++ b/pages/csvimport.php @@ -17,21 +17,24 @@ * You should have received a copy of the GNU Affero General Public License */ -try -{ - ini_set('memory_limit', '256M'); +try { require_once('../approot.inc.php'); require_once(APPROOT.'/application/application.inc.php'); require_once(APPROOT.'/application/itopwebpage.class.inc.php'); require_once(APPROOT.'/application/ajaxwebpage.class.inc.php'); - + require_once(APPROOT.'/application/startup.inc.php'); - + require_once(APPROOT.'/application/loginwebpage.class.inc.php'); + + if (utils::SetMinMemoryLimit('256M') === false) { + IssueLog::Warning('csvimport : cannot set minimum memory_limit !'); + } + LoginWebPage::DoLogin(); // Check user rights and prompt if needed $iStep = utils::ReadParam('step', 1); - + $oPage = new iTopWebPage(Dict::S('UI:Title:BulkImport')); $oPage->SetBreadCrumbEntry('ui-tool-bulkimport', Dict::S('Menu:CSVImportMenu'), Dict::S('UI:Title:BulkImport+'), '', utils::GetAbsoluteUrlAppRoot().'images/wrench.png'); @@ -1542,4 +1545,3 @@ catch(Exception $e) IssueLog::Error($e->getMessage()); } } -?> diff --git a/test/application/UtilsTest.php b/test/application/UtilsTest.php index 47c9d4d97..d3a308e7b 100644 --- a/test/application/UtilsTest.php +++ b/test/application/UtilsTest.php @@ -426,4 +426,26 @@ class UtilsTest extends \Combodo\iTop\Test\UnitTest\ItopTestCase ], ]; } + + /** + * @param string $sExpressionToConvert + * @param int $iExpectedConvertedValue + * + * @dataProvider ConvertToBytesProvider + */ + public function testConvertToBytes($sExpressionToConvert, $iExpectedConvertedValue) + { + $iCurrentConvertedValue = utils::ConvertToBytes($sExpressionToConvert); + self::assertEquals($iExpectedConvertedValue, $iCurrentConvertedValue, 'Converted value wasn\'t the one expected !'); + } + + public function ConvertToBytesProvider() + { + return [ + '123' => ['123', 123], + '56k' => ['56k', 56 * 1024], + '512M' => ['512M', 512 * 1024 * 1024], + '2G' => ['2G', 2 * 1024 * 1024 * 1024], + ]; + } } From 7f15eed9a8fc0712a0c064d74afd26bdbdcf7bf2 Mon Sep 17 00:00:00 2001 From: Pierre Goiffon Date: Tue, 25 May 2021 15:48:33 +0200 Subject: [PATCH 09/31] :wrench: Update .editorconfig * Preserve XML line breaks * Add markdown * Add editorconfig --- .editorconfig => test/.editorconfig | 32 +++++++++++++++++------------ 1 file changed, 19 insertions(+), 13 deletions(-) rename .editorconfig => test/.editorconfig (97%) diff --git a/.editorconfig b/test/.editorconfig similarity index 97% rename from .editorconfig rename to test/.editorconfig index 46ae2703a..3c942ac0e 100644 --- a/.editorconfig +++ b/test/.editorconfig @@ -69,16 +69,7 @@ ij_twig_spaces_inside_comments_delimiters = true ij_twig_spaces_inside_delimiters = true ij_twig_spaces_inside_variable_delimiters = true -[.editorconfig] -ij_visual_guides = none -ij_editorconfig_align_group_field_declarations = false -ij_editorconfig_space_after_colon = false -ij_editorconfig_space_after_comma = true -ij_editorconfig_space_before_colon = false -ij_editorconfig_space_before_comma = false -ij_editorconfig_spaces_around_assignment_operators = true - -[{*.ant, *.fxml, *.jhm, *.jnlp, *.jrxml, *.rng, *.tld, *.wsdl, *.xml, *.xsd, *.xsl, *.xslt, *.xul, phpunit.xml.dist}] +[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.rng,*.tld,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul,phpunit.xml.dist}] indent_size = 2 tab_width = 2 ij_smart_tabs = true @@ -90,7 +81,7 @@ ij_xml_attribute_wrap = normal ij_xml_block_comment_at_first_column = true ij_xml_keep_blank_lines = 2 ij_xml_keep_indents_on_empty_lines = false -ij_xml_keep_line_breaks = false +ij_xml_keep_line_breaks = true ij_xml_keep_line_breaks_in_text = true ij_xml_keep_whitespaces = false ij_xml_keep_whitespaces_around_cdata = preserve @@ -110,6 +101,7 @@ ij_shell_keep_column_alignment_padding = false ij_shell_minify_program = false ij_shell_redirect_followed_by_space = false ij_shell_switch_cases_indented = false +ij_shell_use_unix_line_separator = true [{*.cjs,*.js}] indent_style = tab @@ -514,7 +506,7 @@ ij_json_wrap_long_lines = false indent_style = tab ij_smart_tabs = true ij_visual_guides = none -ij_html_add_new_line_before_tags = body, div, p, form, h1, h2, h3 +ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3 ij_html_align_attributes = true ij_html_align_text = false ij_html_attribute_wrap = normal @@ -541,7 +533,21 @@ ij_html_space_inside_empty_tag = false ij_html_text_wrap = normal ij_html_uniform_ident = false -[{*.yaml, *.yml}] +[{*.markdown,*.md}] +ij_visual_guides = none +ij_markdown_force_one_space_after_blockquote_symbol = true +ij_markdown_force_one_space_after_header_symbol = true +ij_markdown_force_one_space_after_list_bullet = true +ij_markdown_force_one_space_between_words = true +ij_markdown_keep_indents_on_empty_lines = false +ij_markdown_max_lines_around_block_elements = 1 +ij_markdown_max_lines_around_header = 1 +ij_markdown_max_lines_between_paragraphs = 1 +ij_markdown_min_lines_around_block_elements = 1 +ij_markdown_min_lines_around_header = 1 +ij_markdown_min_lines_between_paragraphs = 1 + +[{*.yaml,*.yml}] indent_size = 2 ij_visual_guides = none ij_yaml_align_values_properties = do_not_align From 44952d1ea05d4b72c884cc8a82afe04986435ea6 Mon Sep 17 00:00:00 2001 From: Pierre Goiffon Date: Tue, 25 May 2021 17:04:32 +0200 Subject: [PATCH 10/31] :white_check_mark: Fix \UtilsTest::testIsMemoryLimit --- application/utils.inc.php | 9 +++++++-- test/application/UtilsTest.php | 9 ++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/application/utils.inc.php b/application/utils.inc.php index 6b69cbf16..13f45e0f7 100644 --- a/application/utils.inc.php +++ b/application/utils.inc.php @@ -601,14 +601,19 @@ class utils /** * Checks if the memory limit is at least what is required * - * @param int $iMemoryLimit set limit in bytes + * @param int $iMemoryLimit set limit in bytes, use {@link utils::ConvertToBytes()} to convert current php.ini value * @param int $iRequiredLimit required limit in bytes * * @return bool */ public static function IsMemoryLimitOk($iMemoryLimit, $iRequiredLimit) { - return ($iMemoryLimit >= $iRequiredLimit) || ($iMemoryLimit === -1); + if ($iMemoryLimit === -1) { + // -1 means : no limit (see https://www.php.net/manual/fr/ini.core.php#ini.memory-limit) + return true; + } + + return ($iMemoryLimit >= $iRequiredLimit); } /** diff --git a/test/application/UtilsTest.php b/test/application/UtilsTest.php index d3a308e7b..1f51b2765 100644 --- a/test/application/UtilsTest.php +++ b/test/application/UtilsTest.php @@ -54,11 +54,10 @@ class UtilsTest extends \Combodo\iTop\Test\UnitTest\ItopTestCase public function memoryLimitDataProvider() { return [ - [true, '-1', 1024], - [true, -1, 1024], - [true, 1024, 1024], - [true, 2048, 1024], - [false, 1024, 2048], + 'current -1, required 1024' => [true, -1, 1024], + 'current 1024, required 1024' => [true, 1024, 1024], + 'current 2048, required 1024' => [true, 2048, 1024], + 'current 1024, required 2048' => [false, 1024, 2048], ]; } From cf12578289015b63dbdfd9183a1603ac641ac372 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 26 May 2021 12:14:14 +0200 Subject: [PATCH 11/31] =?UTF-8?q?N=C2=B03452=20-=20DB=20tools=20:=20better?= =?UTF-8?q?=20formatting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/dbsearch.class.php | 21 ++-- .../db_analyzer.class.inc.php | 107 ++++++++++-------- datamodels/2.x/combodo-db-tools/dbtools.php | 62 +++++----- .../en.dict.combodo-db-tools.php | 2 + .../fr.dict.combodo-db-tools.php | 4 +- .../src/Service/DBAnalyzerUtils.php | 52 ++++----- 6 files changed, 134 insertions(+), 114 deletions(-) diff --git a/core/dbsearch.class.php b/core/dbsearch.class.php index f9de30d76..406161dd0 100644 --- a/core/dbsearch.class.php +++ b/core/dbsearch.class.php @@ -1004,10 +1004,8 @@ abstract class DBSearch } /** - * Generate a SQL query from the current search - * - * @internal - * + * Generate a SQL query from the current search + * * @param array $aOrderBy Array of '[.]attcode' => bAscending * @param array $aArgs * @param null $aAttToLoad @@ -1015,12 +1013,16 @@ abstract class DBSearch * @param int $iLimitCount * @param int $iLimitStart * @param bool $bGetCount + * @param bool $bBeautifulSQL + * * @return string - * @throws CoreException - * @throws Exception - * @throws MissingQueryArgument + * @throws \ConfigException + * @throws \CoreException + * @throws \MissingQueryArgument + * @internal + * */ - public function MakeSelectQuery($aOrderBy = array(), $aArgs = array(), $aAttToLoad = null, $aExtendedDataSpec = null, $iLimitCount = 0, $iLimitStart = 0, $bGetCount = false) + public function MakeSelectQuery($aOrderBy = array(), $aArgs = array(), $aAttToLoad = null, $aExtendedDataSpec = null, $iLimitCount = 0, $iLimitStart = 0, $bGetCount = false, $bBeautifulSQL = true) { // Check the order by specification, and prefix with the class alias // and make sure that the ordering columns are going to be selected @@ -1085,8 +1087,7 @@ abstract class DBSearch } try { - // $bBeautifulSQL = self::$m_bTraceQueries || self::$m_bDebugQuery || self::$m_bIndentQueries; - $sRes = $oSQLQuery->RenderSelect($aOrderSpec, $aScalarArgs, $iLimitCount, $iLimitStart, $bGetCount, true); + $sRes = $oSQLQuery->RenderSelect($aOrderSpec, $aScalarArgs, $iLimitCount, $iLimitStart, $bGetCount, $bBeautifulSQL); if ($sClassAlias == '_itop_') { IssueLog::Info('SQL Query (_itop_): '.$sRes); diff --git a/datamodels/2.x/combodo-db-tools/db_analyzer.class.inc.php b/datamodels/2.x/combodo-db-tools/db_analyzer.class.inc.php index d59ee7e7d..cebe559c8 100644 --- a/datamodels/2.x/combodo-db-tools/db_analyzer.class.inc.php +++ b/datamodels/2.x/combodo-db-tools/db_analyzer.class.inc.php @@ -222,13 +222,11 @@ class DatabaseAnalyzer { $oFixSearch->AddCondition($sAttCode, $sValue, '='); } - $aFixit[] = $oFixSearch->MakeSelectQuery().';'; + $aFixit[] = $oFixSearch->MakeSelectQuery([], [], null, null, 0, 0, false, false).';'; $aFixit[] = ""; } $aErrorsAndFixes[$sClass][$sErrorDesc]['fixit'] = $aFixit; } - - return; } private function GetUniquenessRuleMessage($sUniquenessRuleId) @@ -326,13 +324,8 @@ class DatabaseAnalyzer { $sField = MetaModel::DBGetClassField($sClass); $sRootField = MetaModel::DBGetClassField($sRootClass); - $sSelWrongRecs = <<ExecQuery($sSelWrongRecs, $sFixItRequest, Dict::Format('DBAnalyzer-Integrity-FinalClass', $sField, $sTable, $sRootTable), $sClass, $aErrorsAndFixes); } @@ -360,65 +353,79 @@ SQL; // Note: a class/table may have an external key on itself $sSelect = "SELECT DISTINCT `$sTable`.`$sKeyField` AS id, `$sTable`.`$sExtKeyField` AS value"; - $sFilter = "FROM `$sTable` LEFT JOIN `$sRemoteTable` AS `{$sRemoteTable}_1` ON `$sTable`.`$sExtKeyField` = `{$sRemoteTable}_1`.`$sRemoteKey`"; + $sFrom = "FROM `$sTable`"; + $sJoin = "LEFT JOIN `$sRemoteTable` AS `{$sRemoteTable}_1` ON `$sTable`.`$sExtKeyField` = `{$sRemoteTable}_1`.`$sRemoteKey`"; - $sFilter = $sFilter." WHERE `{$sRemoteTable}_1`.`$sRemoteKey` IS NULL"; + $sFilter = "WHERE `{$sRemoteTable}_1`.`$sRemoteKey` IS NULL"; // Exclude the records pointing to 0/null from the errors (separate test below) $sFilter .= " AND `$sTable`.`$sExtKeyField` IS NOT NULL"; $sFilter .= " AND `$sTable`.`$sExtKeyField` != 0"; - $sSelWrongRecs = "$sSelect $sFilter"; + $sSelWrongRecs = "$sSelect $sFrom $sJoin $sFilter"; $sErrorDesc = Dict::Format('DBAnalyzer-Integrity-InvalidExtKey', $sAttCode, $sTable, $sExtKeyField); $this->ExecQuery($sSelWrongRecs, '', $sErrorDesc, $sClass, $aErrorsAndFixes); + $aFixIt = []; // Fix it request needs the values of the enum to generate the requests if (isset($aErrorsAndFixes[$sClass][$sErrorDesc]['values'])) { - $aFixIt = array(); - $aFixIt[] = "-- Remove inconsistant entries:"; - $sIds = implode(', ', array_keys($aErrorsAndFixes[$sClass][$sErrorDesc]['values'])); - $aFixIt[] = "DELETE `$sTable` FROM `$sTable` WHERE `$sTable`.`$sExtKeyField` IN ($sIds)"; - $aFixIt[] = ""; - $aFixIt[] = "-- Or fix inconsistant values: Replace XXX with the appropriate value"; - foreach (array_keys($aErrorsAndFixes[$sClass][$sErrorDesc]['values']) as $sKey) - { - $aFixIt[] = "UPDATE `$sTable` SET `$sTable`.`$sExtKeyField` = XXX WHERE `$sTable`.`$sExtKeyField` = '$sKey'"; - } - $aErrorsAndFixes[$sClass][$sErrorDesc]['fixit'] = $aFixIt; - } - - if (!$oAttDef->IsNullAllowed()) - { - $sSelect = "SELECT DISTINCT `$sTable`.`$sKeyField` AS id"; - $sDelete = "DELETE `$sTable`"; - $sFilter = "FROM `$sTable` WHERE `$sTable`.`$sExtKeyField` IS NULL OR `$sTable`.`$sExtKeyField` = 0"; - $sSelWrongRecs = "$sSelect $sFilter"; - $sFixItRequest = "$sDelete $sFilter"; - $sErrorDesc = Dict::Format('DBAnalyzer-Integrity-MissingExtKey', $sAttCode, $sTable, $sExtKeyField); - $this->ExecQuery($sSelWrongRecs, $sFixItRequest, $sErrorDesc, $sClass, $aErrorsAndFixes); - if (isset($aErrorsAndFixes[$sClass][$sErrorDesc]['count']) && ($aErrorsAndFixes[$sClass][$sErrorDesc]['count'] > 0)) - { - $aFixIt = $aErrorsAndFixes[$sClass][$sErrorDesc]['fixit']; - $aFixIt[] = "-- Alternate fix"; - $aFixIt[] = "-- Replace XXX with the appropriate value"; - $aFixIt[] = "UPDATE `$sTable` SET `$sTable`.`$sExtKeyField` = XXX WHERE `$sTable`.`$sExtKeyField` IS NULL OR `$sTable`.`$sExtKeyField` = 0"; - $aAdditionalFixIt = $this->GetSpecificExternalKeysFixItForNull($sTable, $sExtKeyField); + if ($oAttDef->IsNullAllowed()) { + $aFixIt[] = "-- Fix inconsistant values: remove the external key"; + foreach (array_keys($aErrorsAndFixes[$sClass][$sErrorDesc]['values']) as $sKey) { + $aFixIt[] = "UPDATE `$sTable` SET `$sTable`.`$sExtKeyField` = 0 WHERE `$sTable`.`$sExtKeyField` = '$sKey'"; + } + } else { + $aAdditionalFixIt = $this->GetSpecificExternalKeysFixItForNull($sTable, $sExtKeyField, $sFilter, $sJoin); foreach ($aAdditionalFixIt as $sFixIt) { $aFixIt[] = $sFixIt; } + + $aFixIt[] = "-- Alternate fix: remove inconsistant entries:"; + $sIds = implode(', ', array_keys($aErrorsAndFixes[$sClass][$sErrorDesc]['values'])); + $aFixIt[] = "DELETE `$sTable` FROM `$sTable` WHERE `$sTable`.`$sExtKeyField` IN ($sIds)"; + + $aFixIt[] = "-- Alternate fix: update inconsistant values: Replace XXX with the appropriate value"; + foreach (array_keys($aErrorsAndFixes[$sClass][$sErrorDesc]['values']) as $sKey) { + $aFixIt[] = "UPDATE `$sTable` SET `$sTable`.`$sExtKeyField` = XXX WHERE `$sTable`.`$sExtKeyField` = '$sKey'"; + } + } + $aErrorsAndFixes[$sClass][$sErrorDesc]['fixit'] = $aFixIt; + } + + if (!$oAttDef->IsNullAllowed()) { + $sSelect = "SELECT DISTINCT `$sTable`.`$sKeyField` AS id"; + $sDelete = "DELETE `$sTable`"; + $sFrom = "FROM `$sTable`"; + $sFilter = "WHERE `$sTable`.`$sExtKeyField` IS NULL OR `$sTable`.`$sExtKeyField` = 0"; + $sSelWrongRecs = "$sSelect $sFrom $sFilter"; + $sFixItRequest = "$sDelete $sFrom $sFilter"; + $sErrorDesc = Dict::Format('DBAnalyzer-Integrity-MissingExtKey', $sAttCode, $sTable, $sExtKeyField); + $this->ExecQuery($sSelWrongRecs, '', $sErrorDesc, $sClass, $aErrorsAndFixes); + $aFixIt = []; + if (isset($aErrorsAndFixes[$sClass][$sErrorDesc]['count']) && ($aErrorsAndFixes[$sClass][$sErrorDesc]['count'] > 0)) + { + $aAdditionalFixIt = $this->GetSpecificExternalKeysFixItForNull($sTable, $sExtKeyField, $sFilter); + foreach ($aAdditionalFixIt as $sFixIt) + { + $aFixIt[] = $sFixIt; + } + $aFixIt[] = "-- Alternate fix: remove inconsistant entries:"; + $aFixIt[] = $sFixItRequest; + $aFixIt[] = "-- Alternate fix: replace XXX with the appropriate value"; + $aFixIt[] = "UPDATE `$sTable` SET `$sTable`.`$sExtKeyField` = XXX WHERE `$sTable`.`$sExtKeyField` IS NULL OR `$sTable`.`$sExtKeyField` = 0"; $aErrorsAndFixes[$sClass][$sErrorDesc]['fixit'] = $aFixIt; } } } - private function GetSpecificExternalKeysFixItForNull($sTable, $sExtKeyField) + private function GetSpecificExternalKeysFixItForNull($sTable, $sExtKeyField, $sFilter, $sJoin = '') { $aFixIt = array(); if ($sTable == 'ticket' && $sExtKeyField == 'org_id') { $aFixIt[] = "-- Alternate fix: set the ticket org to the caller org"; - $aFixIt[] = "UPDATE ticket AS t JOIN contact AS c ON t.caller_id=c.id SET t.org_id=c.org_id WHERE t.org_id IS NULL OR t.org_id = 0"; + $aFixIt[] = "UPDATE ticket JOIN contact AS c ON ticket.caller_id=c.id $sJoin SET ticket.org_id=c.org_id $sFilter"; } return $aFixIt; } @@ -441,7 +448,8 @@ SQL; $aAllowedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode); if (!is_null($aAllowedValues) && count($aAllowedValues) > 0) { - $sExpectedValues = implode(",", CMDBSource::Quote(array_keys($aAllowedValues), true)); + $aAllowedValues = array_keys($aAllowedValues); + $sExpectedValues = implode(",", CMDBSource::Quote($aAllowedValues, true)); $aCols = $oAttDef->GetSQLExpressions(); // Workaround a PHP bug: sometimes issuing a Notice if invoking current(somefunc()) $sMyAttributeField = current($aCols); // get the first column for the moment @@ -458,15 +466,18 @@ SQL; if (isset($aErrorsAndFixes[$sClass][$sErrorDesc]['fixit'])) { $aFixIt = $aErrorsAndFixes[$sClass][$sErrorDesc]['fixit']; - $aFixIt[] = "-- Alternative: Replace 'XXX' with the appropriate value"; + $aFixIt[] = "-- Alternative: Replace enums with the appropriate value"; } else { - $aFixIt = array("-- Replace 'XXX' with the appropriate value"); + $aFixIt = ["-- Replace enums with the appropriate value"]; } foreach (array_keys($aErrorsAndFixes[$sClass][$sErrorDesc]['values']) as $sKey) { - $aFixIt[] = "UPDATE `$sTable` SET `$sTable`.`$sMyAttributeField` = 'XXX' WHERE `$sTable`.`$sMyAttributeField` = '$sKey'"; + foreach ($aAllowedValues as $sAllowedValue) { + $aFixIt[] = "-- Replace $sKey by $sAllowedValue"; + $aFixIt[] = "UPDATE `$sTable` SET `$sTable`.`$sMyAttributeField` = '$sAllowedValue' WHERE `$sTable`.`$sMyAttributeField` = '$sKey'"; + } } $aErrorsAndFixes[$sClass][$sErrorDesc]['fixit'] = $aFixIt; } diff --git a/datamodels/2.x/combodo-db-tools/dbtools.php b/datamodels/2.x/combodo-db-tools/dbtools.php index 40822becb..b0289d4c9 100644 --- a/datamodels/2.x/combodo-db-tools/dbtools.php +++ b/datamodels/2.x/combodo-db-tools/dbtools.php @@ -31,15 +31,16 @@ const MAX_RESULTS = 10; * @param ApplicationContext $oAppContext * * @return \iTopWebPage - * @throws CoreException - * @throws DictExceptionMissingString - * @throws MySQLException + * @throws \CoreException + * @throws \DictExceptionMissingString + * @throws \MySQLException */ function DisplayDBInconsistencies(iTopWebPage &$oP, ApplicationContext &$oAppContext) { $iShowId = intval(utils::ReadParam('show_id', '0')); $sErrorLabelSelection = utils::ReadParam('error_selection', ''); $sClassSelection = utils::ReadParam('class_selection', ''); + $bVerbose = utils::ReadParam('verbose', 0); if (!empty($sClassSelection)) { $aClassSelection = explode(",", $sClassSelection); @@ -109,11 +110,16 @@ function DisplayDBInconsistencies(iTopWebPage &$oP, ApplicationContext &$oAppCon if ($iShowId == 3) { - DisplayInconsistenciesReport($aResults); + DisplayInconsistenciesReport($aResults, $bVerbose); } $oP->p(Dict::S('DBTools:ErrorsFound')); + if ($iShowId > 0) { + $oP->p(Dict::S('DBTools:Disclaimer')); + $oP->p(Dict::S('DBTools:Indication')); + } + $oP->add(''); $bTable = true; foreach($aResults as $sClass => $aErrorList) @@ -148,7 +154,7 @@ function DisplayDBInconsistencies(iTopWebPage &$oP, ApplicationContext &$oAppCon $oP->p(Dict::S('DBTools:SQLquery')); $sQuery = $aError['query']; $oP->add('
    '); - $oP->add(''.$sQuery.''); + $oP->add('
    '.$sQuery.'
    '); $oP->add('
    '); if (isset($aError['fixit'])) @@ -163,27 +169,26 @@ function DisplayDBInconsistencies(iTopWebPage &$oP, ApplicationContext &$oAppCon $oP->add('
    '); } - $oP->p(Dict::S('DBTools:SQLresult')); - $sQueryResult = ''; - $iCount = count($aError['res']); - $iMaxCount = MAX_RESULTS; - foreach($aError['res'] as $aRes) - { - $iMaxCount--; - if ($iMaxCount < 0) - { - $sQueryResult .= 'Displayed '.MAX_RESULTS."/$iCount results.
    "; - break; + if ($bVerbose) { + $oP->p(Dict::S('DBTools:SQLresult')); + $sQueryResult = ''; + $iCount = count($aError['res']); + $iMaxCount = MAX_RESULTS; + foreach ($aError['res'] as $aRes) { + $iMaxCount--; + if ($iMaxCount < 0) { + $sQueryResult .= 'Displayed '.MAX_RESULTS."/$iCount results.
    "; + break; + } + foreach ($aRes as $sKey => $sValue) { + $sQueryResult .= "'$sKey'='$sValue' "; + } + $sQueryResult .= '
    '; } - foreach($aRes as $sKey => $sValue) - { - $sQueryResult .= "'$sKey'='$sValue' "; - } - $sQueryResult .= '
    '; + $oP->add('
    '); + $oP->add('
    '.$sQueryResult.'
    '); + $oP->add('
    '); } - $oP->add('
    '); - $oP->add(''.$sQueryResult.''); - $oP->add('
    '); } } } @@ -194,14 +199,15 @@ function DisplayDBInconsistencies(iTopWebPage &$oP, ApplicationContext &$oAppCon /** * @param $aResults + * @param bool $bVerbose * * @return mixed - * @throws CoreException - * @throws DictExceptionMissingString + * @throws \CoreException + * @throws \DictExceptionMissingString */ -function DisplayInconsistenciesReport($aResults) +function DisplayInconsistenciesReport($aResults, $bVerbose = false) { - $sReportFile = DBAnalyzerUtils::GenerateReport($aResults); + $sReportFile = DBAnalyzerUtils::GenerateReport($aResults, $bVerbose); $sZipReport = "{$sReportFile}.zip"; $oArchive = new ZipArchive(); diff --git a/datamodels/2.x/combodo-db-tools/en.dict.combodo-db-tools.php b/datamodels/2.x/combodo-db-tools/en.dict.combodo-db-tools.php index 4ea35ab19..656cd3776 100644 --- a/datamodels/2.x/combodo-db-tools/en.dict.combodo-db-tools.php +++ b/datamodels/2.x/combodo-db-tools/en.dict.combodo-db-tools.php @@ -28,6 +28,8 @@ Dict::Add('EN US', 'English', 'English', array( 'DBTools:Class' => 'Class', 'DBTools:Title' => 'Database Maintenance Tools', 'DBTools:ErrorsFound' => 'Errors Found', + 'DBTools:Indication' => 'Important: after fixing errors in the database you\'ll have to run the analysis again as new inconsistencies will be generated', + 'DBTools:Disclaimer' => 'DISCLAIMER: BACKUP YOUR DATABASE BEFORE RUNNING THE FIXES', 'DBTools:Error' => 'Error', 'DBTools:Count' => 'Count', 'DBTools:SQLquery' => 'SQL query', diff --git a/datamodels/2.x/combodo-db-tools/fr.dict.combodo-db-tools.php b/datamodels/2.x/combodo-db-tools/fr.dict.combodo-db-tools.php index bc683642c..04d21c7b3 100644 --- a/datamodels/2.x/combodo-db-tools/fr.dict.combodo-db-tools.php +++ b/datamodels/2.x/combodo-db-tools/fr.dict.combodo-db-tools.php @@ -23,6 +23,8 @@ Dict::Add('FR FR', 'French', 'Français', array( 'DBTools:Class' => 'Classe', 'DBTools:Title' => 'Outils maintenance base de données', 'DBTools:ErrorsFound' => 'Erreurs trouvées', + 'DBTools:Indication' => 'Important : après correction il est nécessaire de relancer l\'analyse car d\'autres inconsistances peuvent être générées par les modifications', + 'DBTools:Disclaimer' => 'ATTENTION : EFFECTUEZ UNE SAUVEGARDE DE LA BASE AVANT D\'APPLIQUER LES CORRECTIONS', 'DBTools:Error' => 'Erreur', 'DBTools:Count' => 'Nombre', 'DBTools:SQLquery' => 'Requête SQL', @@ -41,7 +43,7 @@ Dict::Add('FR FR', 'French', 'Français', array( 'DBTools:Inconsistencies' => 'Incohérences de base de données', - 'DBAnalyzer-Integrity-OrphanRecord' => 'Enregistrement orphelin dans `%1$s`, il devrait avoir son équivalent dans la tableit `%2$s`', + 'DBAnalyzer-Integrity-OrphanRecord' => 'Enregistrement orphelin dans `%1$s`, il devrait avoir son équivalent dans la table `%2$s`', 'DBAnalyzer-Integrity-InvalidExtKey' => 'Clef externe invalide %1$s (colonne: `%2$s.%3$s`)', 'DBAnalyzer-Integrity-MissingExtKey' => 'Clef externe manquante %1$s (colonne: `%2$s.%3$s`)', 'DBAnalyzer-Integrity-InvalidValue' => 'Valeur invalide pour %1$s (colonne: `%2$s.%3$s`)', diff --git a/datamodels/2.x/combodo-db-tools/src/Service/DBAnalyzerUtils.php b/datamodels/2.x/combodo-db-tools/src/Service/DBAnalyzerUtils.php index 725b45d55..efedf2673 100644 --- a/datamodels/2.x/combodo-db-tools/src/Service/DBAnalyzerUtils.php +++ b/datamodels/2.x/combodo-db-tools/src/Service/DBAnalyzerUtils.php @@ -8,6 +8,7 @@ namespace Combodo\iTop\DBTools\Service; use CoreException; +use Dict; use DictExceptionMissingString; use MetaModel; @@ -20,29 +21,31 @@ class DBAnalyzerUtils * @throws CoreException * @throws DictExceptionMissingString */ - public static function GenerateReport($aResults) + public static function GenerateReport($aResults, $bVerbose = false) { $sDBToolsFolder = str_replace("\\", '/', APPROOT.'log/'); $sReportFile = 'dbtools-report'; $fReport = fopen($sDBToolsFolder.$sReportFile.'.log', 'w'); - fwrite($fReport, 'Database Maintenance tools: '.date('Y-m-d H:i:s')."\r\n"); + fwrite($fReport, '-- Database Maintenance tools: '.date('Y-m-d H:i:s')."\r\n"); + fwrite($fReport, "-- ".Dict::S('DBTools:Disclaimer')."\r\n"); + fwrite($fReport, "-- ".Dict::S('DBTools:Indication')."\r\n"); foreach ($aResults as $sClass => $aErrorList) { fwrite($fReport, ''); foreach ($aErrorList as $sErrorLabel => $aError) { - fwrite($fReport, "\r\n----------\r\n"); - fwrite($fReport, 'Class: '.MetaModel::GetName($sClass).' ('.$sClass.")\r\n"); + fwrite($fReport, "\r\n-- \r\n"); + fwrite($fReport, '-- Class: '.MetaModel::GetName($sClass).' ('.$sClass.")\r\n"); $iCount = $aError['count']; - fwrite($fReport, 'Count: '.$iCount."\r\n"); - fwrite($fReport, 'Error: '.$sErrorLabel."\r\n"); + fwrite($fReport, '-- Count: '.$iCount."\r\n"); + fwrite($fReport, '-- Error: '.$sErrorLabel."\r\n"); $sQuery = $aError['query']; - fwrite($fReport, 'Query: '.$sQuery."\r\n"); + fwrite($fReport, '-- Query: '.$sQuery."\r\n"); if (isset($aError['fixit'])) { - fwrite($fReport, "\r\nFix it (indication):\r\n\r\n"); + fwrite($fReport, "\r\n-- Fix it (indication):\r\n\r\n"); $aFixitQueries = $aError['fixit']; foreach ($aFixitQueries as $sFixitQuery) { @@ -51,31 +54,26 @@ class DBAnalyzerUtils fwrite($fReport, "\r\n"); } - $sQueryResult = ''; - $aIdList = array(); - foreach ($aError['res'] as $aRes) - { - foreach ($aRes as $sKey => $sValue) - { - $sQueryResult .= "'$sKey'='$sValue' "; - if ($sKey == 'id') - { - $aIdList[] = $sValue; + if ($bVerbose) { + $sQueryResult = ''; + $aIdList = []; + foreach ($aError['res'] as $aRes) { + $sQueryResult .= " - "; + foreach ($aRes as $sKey => $sValue) { + $sQueryResult .= "'$sKey'='$sValue' "; + if ($sKey == 'id') { + $aIdList[] = $sValue; + } } } - $sQueryResult .= "\r\n"; - + fwrite($fReport, "-- Result: ".$sQueryResult); + $sIdList = '('.implode(',', $aIdList).')'; + fwrite($fReport, "\r\n-- Ids: ".$sIdList."\r\n"); } - fwrite($fReport, "Result: \r\n".$sQueryResult); - $sIdList = '('.implode(',', $aIdList).')'; - fwrite($fReport, 'Ids: '.$sIdList."\r\n"); } } fclose($fReport); - - $sReportFile = $sDBToolsFolder.$sReportFile; - - return $sReportFile; + return $sDBToolsFolder.$sReportFile; } } From fc39d8aca9699764b6fa30c5af7394197c6357ed Mon Sep 17 00:00:00 2001 From: Pierre Goiffon Date: Wed, 26 May 2021 14:24:22 +0200 Subject: [PATCH 12/31] :bulb: PHPDoc type hinting --- core/dbobject.class.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/core/dbobject.class.php b/core/dbobject.class.php index 1009d653a..46efb0a4d 100644 --- a/core/dbobject.class.php +++ b/core/dbobject.class.php @@ -3123,13 +3123,11 @@ abstract class DBObject implements iDisplay array(), $aParams); while ($oTrigger = $oSet->Fetch()) { - /** @var \Trigger $oTrigger */ - try - { + /** @var \TriggerOnObjectUpdate $oTrigger */ + try { $oTrigger->DoActivate($this->ToArgs('this')); } - catch(Exception $e) - { + catch (Exception $e) { utils::EnrichRaisedException($oTrigger, $e); } } From caa2a05bf43fc9d73033a2af8f16e76954fe1772 Mon Sep 17 00:00:00 2001 From: Pierre Goiffon Date: Wed, 26 May 2021 15:19:40 +0200 Subject: [PATCH 13/31] :wrench: restore .editorconfig Was moved to /test by mistake And also editorconfig syntax was removed :( Those mistakes were done in 7f15eed9 Thanks Molkobain, good catch ! --- test/.editorconfig => .editorconfig | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) rename test/.editorconfig => .editorconfig (98%) diff --git a/test/.editorconfig b/.editorconfig similarity index 98% rename from test/.editorconfig rename to .editorconfig index 3c942ac0e..bdd599d30 100644 --- a/test/.editorconfig +++ b/.editorconfig @@ -69,7 +69,16 @@ ij_twig_spaces_inside_comments_delimiters = true ij_twig_spaces_inside_delimiters = true ij_twig_spaces_inside_variable_delimiters = true -[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.rng,*.tld,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul,phpunit.xml.dist}] +[.editorconfig] +ij_visual_guides = none +ij_editorconfig_align_group_field_declarations = false +ij_editorconfig_space_after_colon = false +ij_editorconfig_space_after_comma = true +ij_editorconfig_space_before_colon = false +ij_editorconfig_space_before_comma = false +ij_editorconfig_spaces_around_assignment_operators = true + +[{*.ant, *.fxml, *.jhm, *.jnlp, *.jrxml, *.rng, *.tld, *.wsdl, *.xml, *.xsd, *.xsl, *.xslt, *.xul, phpunit.xml.dist}] indent_size = 2 tab_width = 2 ij_smart_tabs = true From 43daa2ef088bf928a2386fa19324628c3f19b807 Mon Sep 17 00:00:00 2001 From: Eric Date: Thu, 27 May 2021 09:29:50 +0200 Subject: [PATCH 14/31] =?UTF-8?q?=20N=C2=B03952=20-=20code=20hardening?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setup/ajax.dataloader.php | 10 +--- setup/index.php | 19 +++++--- setup/setuputils.class.inc.php | 69 ++++++++++++++++++++++++++++ setup/wizardcontroller.class.inc.php | 8 ++-- setup/wizardsteps.class.inc.php | 12 +---- 5 files changed, 91 insertions(+), 27 deletions(-) diff --git a/setup/ajax.dataloader.php b/setup/ajax.dataloader.php index 127873410..fdc189114 100644 --- a/setup/ajax.dataloader.php +++ b/setup/ajax.dataloader.php @@ -147,12 +147,7 @@ header("Expires: Fri, 17 Jul 1970 05:00:00 GMT"); // Date in the past $sOperation = Utils::ReadParam('operation', ''); try { - $sAuthent = utils::ReadParam('authent', '', false, 'raw_data'); - if (!file_exists(APPROOT.'data/setup/authent') || $sAuthent !== file_get_contents(APPROOT.'data/setup/authent')) - { - throw new SecurityException('Setup operations are not allowed outside of the setup'); - SetupPage::log_error("Setup operations are not allowed outside of the setup"); - } + SetupUtils::CheckSetupToken(); switch($sOperation) { @@ -199,7 +194,6 @@ catch(Exception $e) { header("HTTP/1.0 500 Internal server error."); echo "

    An error happened while processing the installation:

    \n"; - echo '

    '.$e."

    \n"; SetupPage::log_error("An error happened while processing the installation: ".$e); } @@ -207,7 +201,7 @@ if (function_exists('memory_get_peak_usage')) { if ($sOperation == 'file') { - SetupPage::log_info("loading file '$sFileName', peak memory usage. ".memory_get_peak_usage()); + SetupPage::log_info("loading file peak memory usage. ".memory_get_peak_usage()); } else { diff --git a/setup/index.php b/setup/index.php index cc2cae1a5..ea08bb785 100644 --- a/setup/index.php +++ b/setup/index.php @@ -30,6 +30,7 @@ require_once(APPROOT.'/setup/setuppage.class.inc.php'); require_once(APPROOT.'/setup/wizardcontroller.class.inc.php'); require_once(APPROOT.'/setup/wizardsteps.class.inc.php'); +session_start(); clearstatcache(); // Make sure we know what we are doing ! // Set a long (at least 4 minutes) execution time for the setup to avoid timeouts during this phase ini_set('max_execution_time', max(240, ini_get('max_execution_time'))); @@ -41,16 +42,14 @@ date_default_timezone_set('Europe/Paris'); // Just to avoid a warning if the tim ///////////////////////////////////////////////////////////////////// // Fake functions to protect the first run of the installer // in case the PHP JSON module is not installed... -if (!function_exists('json_encode')) -{ +if (!function_exists('json_encode')) { function json_encode($value, $options = null) { return '[]'; } } -if (!function_exists('json_decode')) -{ - function json_decode($json, $assoc=null) +if (!function_exists('json_decode')) { + function json_decode($json, $assoc = null) { return array(); } @@ -58,4 +57,12 @@ if (!function_exists('json_decode')) ///////////////////////////////////////////////////////////////////// $oWizard = new WizardController('WizStepWelcome'); -$oWizard->Run(); +//N°3952 +if (SetupUtils::IsSessionSetupTokenValid()) { + // Normal operation + $oWizard->Run(); +} else { + // Force initializing the setup + $oWizard->Start(); + SetupUtils::CreateSetupToken(); +} diff --git a/setup/setuputils.class.inc.php b/setup/setuputils.class.inc.php index 7b918abbb..9ba7c82ea 100644 --- a/setup/setuputils.class.inc.php +++ b/setup/setuputils.class.inc.php @@ -1826,6 +1826,75 @@ EOF { return APPROOT.'log/setup-queries-'.strftime('%Y-%m-%d_%H_%M').'.sql'; } + + /** + * Create and store Setup authentication token + * + * @return string token + */ + public final static function CreateSetupToken() + { + if (!is_dir(APPROOT.'data')) + { + mkdir(APPROOT.'data'); + } + if (!is_dir(APPROOT.'data/setup')) + { + mkdir(APPROOT.'data/setup'); + } + $sUID = hash('sha256', rand()); + file_put_contents(APPROOT.'data/setup/authent', $sUID); + $_SESSION['setup_token'] = $sUID; + return $sUID; + } + + /** + * Verify Setup authentication token (from the request parameter 'authent') + * + * @param bool $bRemoveToken + * + * @throws \SecurityException + */ + public final static function CheckSetupToken($bRemoveToken = false) + { + $sAuthent = utils::ReadParam('authent', '', false, 'raw_data'); + $sTokenFile = APPROOT.'data/setup/authent'; + if (!file_exists($sTokenFile) || $sAuthent !== file_get_contents($sTokenFile)) + { + throw new SecurityException('Setup operations are not allowed outside of the setup'); + } + if ($bRemoveToken) + { + @unlink($sTokenFile); + } + } + + /** + * Check setup transaction and create a new one if necessary + * + * @return bool + */ + public static function IsSessionSetupTokenValid() + { + if (isset($_SESSION['setup_token'])) { + $sAuth = $_SESSION['setup_token']; + $sTokenFile = APPROOT.'data/setup/authent'; + if (file_exists($sTokenFile) && $sAuth === file_get_contents($sTokenFile)) { + return true; + } + } + + return false; + } + + public static function EraseSetupToken() + { + $sTokenFile = APPROOT.'data/setup/authent'; + if (is_file($sTokenFile)) { + unlink($sTokenFile); + } + unset($_SESSION['setup_token']); + } } /** diff --git a/setup/wizardcontroller.class.inc.php b/setup/wizardcontroller.class.inc.php index ac991e4ce..377092be6 100644 --- a/setup/wizardcontroller.class.inc.php +++ b/setup/wizardcontroller.class.inc.php @@ -105,7 +105,7 @@ class WizardController /** * Starts the wizard by displaying it in its initial state */ - protected function Start() + public function Start() { $sCurrentStepClass = $this->sInitialStepClass; $oStep = new $sCurrentStepClass($this, $this->sInitialState); @@ -121,7 +121,7 @@ class WizardController $sCurrentState = utils::ReadParam('_state', $this->sInitialState); /** @var \WizardStep $oStep */ $oStep = new $sCurrentStepClass($this, $sCurrentState); - if ($oStep->ValidateParams($sCurrentState)) + if ($oStep->ValidateParams()) { $this->PushStep(array('class' => $sCurrentStepClass, 'state' => $sCurrentState)); $aPossibleSteps = $oStep->GetPossibleSteps(); @@ -173,6 +173,7 @@ class WizardController // The configuration file already exists if (!is_writable($sConfigFile)) { + SetupUtils::EraseSetupToken(); $sRelativePath = utils::GetConfigFilePathRelative(); $oP = new SetupPage('Installation Cannot Continue'); $oP->add("

    Fatal error

    \n"); @@ -180,7 +181,8 @@ class WizardController $oP->p("The wizard cannot modify the configuration file for you. If you want to upgrade ".ITOP_APPLICATION.", make sure that the file '".$sRelativePath."' can be modified by the web server."); $oP->p(''); $oP->output(); - return; + // Prevent token creation + exit; } } } diff --git a/setup/wizardsteps.class.inc.php b/setup/wizardsteps.class.inc.php index 3efdddd69..2936be7f0 100644 --- a/setup/wizardsteps.class.inc.php +++ b/setup/wizardsteps.class.inc.php @@ -57,16 +57,7 @@ class WizStepWelcome extends WizardStep public function ProcessParams($bMoveForward = true) { - if (!is_dir(APPROOT.'data')) - { - mkdir(APPROOT.'data'); - } - if (!is_dir(APPROOT.'data/setup')) - { - mkdir(APPROOT.'data/setup'); - } - $sUID = hash('sha256', rand()); - file_put_contents(APPROOT.'data/setup/authent', $sUID); + $sUID = SetupUtils::CreateSetupToken(); $this->oWizard->SetParameter('authent', $sUID); return array('class' => 'WizStepInstallOrUpgrade', 'state' => ''); } @@ -2643,6 +2634,7 @@ class WizStepDone extends WizardStep $oPage->add(''); $sForm = addslashes($sForm); $oPage->add_ready_script("$('#wiz_form').after('$sForm');"); + SetupUtils::EraseSetupToken(); } public function CanMoveForward() From e441e5e78aabe682ed32f9372be8267979efbd16 Mon Sep 17 00:00:00 2001 From: Eric Date: Thu, 27 May 2021 11:49:32 +0200 Subject: [PATCH 15/31] documentation --- setup/setuputils.class.inc.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/setup/setuputils.class.inc.php b/setup/setuputils.class.inc.php index 9ba7c82ea..280b5eb1b 100644 --- a/setup/setuputils.class.inc.php +++ b/setup/setuputils.class.inc.php @@ -1831,6 +1831,7 @@ EOF * Create and store Setup authentication token * * @return string token + * @since 2.6.5 2.7.5 3.0.0 N°3952 */ public final static function CreateSetupToken() { @@ -1854,6 +1855,7 @@ EOF * @param bool $bRemoveToken * * @throws \SecurityException + * @since 2.6.5 2.7.5 3.0.0 N°3952 */ public final static function CheckSetupToken($bRemoveToken = false) { @@ -1873,6 +1875,7 @@ EOF * Check setup transaction and create a new one if necessary * * @return bool + * @since 2.6.5 2.7.5 3.0.0 N°3952 */ public static function IsSessionSetupTokenValid() { @@ -1887,6 +1890,9 @@ EOF return false; } + /** + * @since 2.6.5 2.7.5 3.0.0 N°3952 + */ public static function EraseSetupToken() { $sTokenFile = APPROOT.'data/setup/authent'; From e7b5953feb5d254479deb1e43380b1a345bcc25a Mon Sep 17 00:00:00 2001 From: Eric Date: Thu, 27 May 2021 11:52:38 +0200 Subject: [PATCH 16/31] documentation --- setup/setuputils.class.inc.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/setup/setuputils.class.inc.php b/setup/setuputils.class.inc.php index 488b5ffa0..d96bf51f5 100644 --- a/setup/setuputils.class.inc.php +++ b/setup/setuputils.class.inc.php @@ -2006,6 +2006,7 @@ JS * Create and store Setup authentication token * * @return string token + * @since 2.6.5 2.7.0 N°3952 */ public final static function CreateSetupToken() { @@ -2029,6 +2030,7 @@ JS * @param bool $bRemoveToken * * @throws \SecurityException + * @since 2.6.5 2.7.0 N°3952 */ public final static function CheckSetupToken($bRemoveToken = false) { @@ -2048,6 +2050,7 @@ JS * Check setup transaction and create a new one if necessary * * @return bool + * @since 2.6.5 2.7.5 3.0.0 N°3952 */ public static function IsSessionSetupTokenValid() { @@ -2062,6 +2065,9 @@ JS return false; } + /** + * @since 2.6.5 2.7.5 3.0.0 N°3952 + */ public static function EraseSetupToken() { $sTokenFile = APPROOT.'data/setup/authent'; From 4f5c987d8b1bd12814dc606ea69b6cfb88490704 Mon Sep 17 00:00:00 2001 From: Eric Date: Thu, 27 May 2021 15:57:04 +0200 Subject: [PATCH 17/31] =?UTF-8?q?N=C2=B04002=20-=20code=20hardening?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/run_query.php | 1 - 1 file changed, 1 deletion(-) diff --git a/pages/run_query.php b/pages/run_query.php index 2d9288c34..c6bc61648 100644 --- a/pages/run_query.php +++ b/pages/run_query.php @@ -113,7 +113,6 @@ try { // Translate $sExpression into a oql expression $sClearText = base64_decode($sExpression); - echo "FYI: '$sClearText'
    \n"; $oFilter = DBObjectSearch::unserialize($sExpression); $sExpression = $oFilter->ToOQL(); } From 86f649affc12b5078efc86d9439d67d98f4cb2f6 Mon Sep 17 00:00:00 2001 From: Eric Date: Thu, 27 May 2021 16:13:27 +0200 Subject: [PATCH 18/31] =?UTF-8?q?N=C2=B04002=20-=20code=20hardening?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/run_query.php | 1 - 1 file changed, 1 deletion(-) diff --git a/pages/run_query.php b/pages/run_query.php index c6bc61648..b3bfa2161 100644 --- a/pages/run_query.php +++ b/pages/run_query.php @@ -112,7 +112,6 @@ try if ($sEncoding == 'crypted') { // Translate $sExpression into a oql expression - $sClearText = base64_decode($sExpression); $oFilter = DBObjectSearch::unserialize($sExpression); $sExpression = $oFilter->ToOQL(); } From 684c88e0b80700e3a64a26508046a5f03cf2d798 Mon Sep 17 00:00:00 2001 From: acognet Date: Mon, 31 May 2021 23:43:58 +0200 Subject: [PATCH 19/31] =?UTF-8?q?N=C2=B04038=20-=20Pop=20up=20erreur=20por?= =?UTF-8?q?tail=20utilisateur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2.x/itop-portal-base/portal/templates/layout.html.twig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig b/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig index e8395a953..afa38aa76 100644 --- a/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig +++ b/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig @@ -480,6 +480,10 @@ { ShowErrorDialog('{{ 'UI:ObjectDoesNotExist'|dict_s|escape('js') }}', '{{ 'Error:HTTP:404'|dict_s|escape('js') }}'); } + else if(oXHR.status === 0 && oXHR.readyState === 0) + { + //DO NOTHING the ajax call has been aborted + } else if(oXHR.responseText !== undefined && IsJSONString(oXHR.responseText) === true) { var oData = JSON.parse(oXHR.responseText); From 7168860a0b47d506ed7592b96922985463a7dc0c Mon Sep 17 00:00:00 2001 From: Purple Grape Date: Wed, 2 Jun 2021 14:06:16 +0800 Subject: [PATCH 20/31] :globe_with_meridians: Improved chinese for 2.7 (#218) --- .../zh_cn.dict.combodo-db-tools.php | 14 ++++---- .../zh_cn.dict.itop-attachments.php | 12 +++---- .../zh_cn.dict.itop-change-mgmt.php | 4 +-- .../zh_cn.dict.itop-config-mgmt.php | 8 ++--- .../zh_cn.dict.itop-core-update.php | 34 +++++++++--------- .../zh_cn.dict.itop-request-mgmt-itil.php | 6 ++-- dictionaries/zh_cn.dictionary.itop.core.php | 26 +++++++------- dictionaries/zh_cn.dictionary.itop.ui.php | 36 +++++++++---------- 8 files changed, 70 insertions(+), 70 deletions(-) diff --git a/datamodels/2.x/combodo-db-tools/zh_cn.dict.combodo-db-tools.php b/datamodels/2.x/combodo-db-tools/zh_cn.dict.combodo-db-tools.php index 0fab18520..ab8192bca 100644 --- a/datamodels/2.x/combodo-db-tools/zh_cn.dict.combodo-db-tools.php +++ b/datamodels/2.x/combodo-db-tools/zh_cn.dict.combodo-db-tools.php @@ -64,26 +64,26 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Lost attachments Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'DBTools:LostAttachments' => 'Lost attachments~~', - 'DBTools:LostAttachments:Disclaimer' => 'Here you can search your database for lost or misplaced attachments. This is NOT a data recovery tool, is does not retrieve deleted data.~~', + 'DBTools:LostAttachments' => '附件丢失', + 'DBTools:LostAttachments:Disclaimer' => '您可以在数据库里搜索附件是否有丢失或误挪动. 这不是数据恢复工具, 无法恢复已删除的数据.', 'DBTools:LostAttachments:Button:Analyze' => '分析', 'DBTools:LostAttachments:Button:Restore' => '还原', 'DBTools:LostAttachments:Button:Restore:Confirm' => '该操作无法回退, 请确认是否继续还原.', 'DBTools:LostAttachments:Button:Busy' => '请稍后...', - 'DBTools:LostAttachments:Step:Analyze' => 'First, search for lost/misplaced attachments by analyzing the database.~~', + 'DBTools:LostAttachments:Step:Analyze' => '首先, 通过分析数据库来搜索丢失或误挪动的附件.', 'DBTools:LostAttachments:Step:AnalyzeResults' => '分析结果:', - 'DBTools:LostAttachments:Step:AnalyzeResults:None' => 'Great! Every thing seems to be at the right place.~~', - 'DBTools:LostAttachments:Step:AnalyzeResults:Some' => 'Some attachments (%1$d) seem to be misplaced. Take a look at the following list and check the ones you would like to move.~~', + 'DBTools:LostAttachments:Step:AnalyzeResults:None' => '非常好! 所有附件都是正常的.', + 'DBTools:LostAttachments:Step:AnalyzeResults:Some' => '某些附件 (%1$d) 看起来放错了位置. 请检查下面的列表并选择要挪动的文件.', 'DBTools:LostAttachments:Step:AnalyzeResults:Item:Filename' => '文件名', 'DBTools:LostAttachments:Step:AnalyzeResults:Item:CurrentLocation' => '当前位置', 'DBTools:LostAttachments:Step:AnalyzeResults:Item:TargetLocation' => '移动到...', 'DBTools:LostAttachments:Step:RestoreResults' => '还原结果:', - 'DBTools:LostAttachments:Step:RestoreResults:Results' => '%1$d/%2$d attachments were restored.~~', + 'DBTools:LostAttachments:Step:RestoreResults:Results' => '%1$d/%2$d 的附件已还原.', 'DBTools:LostAttachments:StoredAsInlineImage' => 'Stored as inline image~~', - 'DBTools:LostAttachments:History' => 'Attachment "%1$s" restored with DB tools~~' + 'DBTools:LostAttachments:History' => 'Attachment "附件 %1$s" 已被数据库工具恢复' )); diff --git a/datamodels/2.x/itop-attachments/zh_cn.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/zh_cn.dict.itop-attachments.php index ae6db1849..956ada390 100644 --- a/datamodels/2.x/itop-attachments/zh_cn.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/zh_cn.dict.itop-attachments.php @@ -30,10 +30,10 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Attachment:Max_Ko' => '(最大文件尺寸: %1$s KB)', 'Attachments:NoAttachment' => '没有附件. ', 'Attachments:PreviewNotAvailable' => '该附件类型不支持预览.', - 'Attachments:Error:FileTooLarge' => '上传的文件过大. %1$s~~', - 'Attachments:Error:UploadedFileEmpty' => 'The received file is empty and cannot be attached. -Either you have pushed an empty file, -or ask your iTop administrator if the iTop server disk is full.~~', + 'Attachments:Error:FileTooLarge' => '上传的文件过大. %1$s', + 'Attachments:Error:UploadedFileEmpty' => '收到的文件为空,无法添加. +可能是因为您上传了一个空文件,, +或者咨询iTop 管理员确认iTop 服务器磁盘空间是否已满.', 'Attachments:Render:Icons' => '显示为图标', 'Attachments:Render:Table' => '显示为列表', )); @@ -47,11 +47,11 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Attachment+' => '', 'Class:Attachment/Attribute:expire' => '过期', 'Class:Attachment/Attribute:expire+' => '~~', - 'Class:Attachment/Attribute:temp_id' => '临时 id', + 'Class:Attachment/Attribute:temp_id' => '临时id', 'Class:Attachment/Attribute:temp_id+' => '~~', 'Class:Attachment/Attribute:item_class' => 'Item class~~', 'Class:Attachment/Attribute:item_class+' => '~~', - 'Class:Attachment/Attribute:item_id' => 'Item~~', + 'Class:Attachment/Attribute:item_id' => '项目', 'Class:Attachment/Attribute:item_id+' => '~~', 'Class:Attachment/Attribute:item_org_id' => 'Item organization~~', 'Class:Attachment/Attribute:item_org_id+' => '', diff --git a/datamodels/2.x/itop-change-mgmt/zh_cn.dict.itop-change-mgmt.php b/datamodels/2.x/itop-change-mgmt/zh_cn.dict.itop-change-mgmt.php index 88fc9fe1d..a7f8aaabf 100644 --- a/datamodels/2.x/itop-change-mgmt/zh_cn.dict.itop-change-mgmt.php +++ b/datamodels/2.x/itop-change-mgmt/zh_cn.dict.itop-change-mgmt.php @@ -86,8 +86,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Change/Attribute:category/Value:hardware+' => '硬件', 'Class:Change/Attribute:category/Value:network' => '网络', 'Class:Change/Attribute:category/Value:network+' => '网络', - 'Class:Change/Attribute:category/Value:other' => '其他', - 'Class:Change/Attribute:category/Value:other+' => '其他', + 'Class:Change/Attribute:category/Value:other' => '其它', + 'Class:Change/Attribute:category/Value:other+' => '其它', 'Class:Change/Attribute:category/Value:software' => '软件', 'Class:Change/Attribute:category/Value:software+' => '软件', 'Class:Change/Attribute:category/Value:system' => '系统', diff --git a/datamodels/2.x/itop-config-mgmt/zh_cn.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/zh_cn.dict.itop-config-mgmt.php index c52a28d36..afc78b7be 100755 --- a/datamodels/2.x/itop-config-mgmt/zh_cn.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/zh_cn.dict.itop-config-mgmt.php @@ -365,8 +365,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:PhysicalDevice/Attribute:status/Value:obsolete+' => '废弃', 'Class:PhysicalDevice/Attribute:status/Value:production' => '生产', 'Class:PhysicalDevice/Attribute:status/Value:production+' => '生产', - 'Class:PhysicalDevice/Attribute:status/Value:stock' => '闲置', - 'Class:PhysicalDevice/Attribute:status/Value:stock+' => '闲置', + 'Class:PhysicalDevice/Attribute:status/Value:stock' => '库存', + 'Class:PhysicalDevice/Attribute:status/Value:stock+' => '库存', 'Class:PhysicalDevice/Attribute:brand_id' => '品牌', 'Class:PhysicalDevice/Attribute:brand_id+' => '', 'Class:PhysicalDevice/Attribute:brand_name' => '品牌名称', @@ -868,8 +868,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:VirtualDevice/Attribute:status/Value:obsolete+' => '废弃', 'Class:VirtualDevice/Attribute:status/Value:production' => '生产', 'Class:VirtualDevice/Attribute:status/Value:production+' => '生产', - 'Class:VirtualDevice/Attribute:status/Value:stock' => '闲置', - 'Class:VirtualDevice/Attribute:status/Value:stock+' => '闲置', + 'Class:VirtualDevice/Attribute:status/Value:stock' => '库存', + 'Class:VirtualDevice/Attribute:status/Value:stock+' => '库存', 'Class:VirtualDevice/Attribute:logicalvolumes_list' => '逻辑卷', 'Class:VirtualDevice/Attribute:logicalvolumes_list+' => '该设备使用的所有逻辑卷', )); diff --git a/datamodels/2.x/itop-core-update/zh_cn.dict.itop-core-update.php b/datamodels/2.x/itop-core-update/zh_cn.dict.itop-core-update.php index b89043804..3556bf514 100644 --- a/datamodels/2.x/itop-core-update/zh_cn.dict.itop-core-update.php +++ b/datamodels/2.x/itop-core-update/zh_cn.dict.itop-core-update.php @@ -24,33 +24,33 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'iTopUpdate:UI:PageTitle' => '应用升级', 'itop-core-update:UI:SelectUpdateFile' => '应用升级', 'itop-core-update:UI:ConfirmUpdate' => ' 升级', - 'itop-core-update:UI:UpdateCoreFiles' => 'Application Upgrade~~', - 'iTopUpdate:UI:MaintenanceModeActive' => 'The application is currently under maintenance, no user can access the application. You have to run a setup or restore the application archive to return in normal mode.~~', - 'itop-core-update:UI:UpdateDone' => 'Application Upgrade~~', + 'itop-core-update:UI:UpdateCoreFiles' => '应用升级', + 'iTopUpdate:UI:MaintenanceModeActive' => '应用正处于维护状态, 用户无法登录系统. 您必须运行安装向导或从备份中还原才能恢复到正常状态.', + 'itop-core-update:UI:UpdateDone' => '应用升级', - 'itop-core-update/Operation:SelectUpdateFile/Title' => 'Application Upgrade~~', - 'itop-core-update/Operation:ConfirmUpdate/Title' => 'Confirm Application Upgrade~~', - 'itop-core-update/Operation:UpdateCoreFiles/Title' => 'Application Upgrading~~', - 'itop-core-update/Operation:UpdateDone/Title' => 'Application Upgrade Done~~', + 'itop-core-update/Operation:SelectUpdateFile/Title' => '应用升级', + 'itop-core-update/Operation:ConfirmUpdate/Title' => '确认升级', + 'itop-core-update/Operation:UpdateCoreFiles/Title' => '应用升级进行中', + 'itop-core-update/Operation:UpdateDone/Title' => '升级完毕', 'iTopUpdate:UI:SelectUpdateFile' => '请选择要上传的升级文件', 'iTopUpdate:UI:CheckUpdate' => '校验升级文件', 'iTopUpdate:UI:ConfirmInstallFile' => '即将安装 %1$s', 'iTopUpdate:UI:DoUpdate' => '升级', 'iTopUpdate:UI:CurrentVersion' => '当前已安装的版本', - 'iTopUpdate:UI:NewVersion' => 'Newly installed version~~', + 'iTopUpdate:UI:NewVersion' => '新安装的版本', 'iTopUpdate:UI:Back' => '返回', 'iTopUpdate:UI:Cancel' => '取消', 'iTopUpdate:UI:Continue' => '继续', - 'iTopUpdate:UI:RunSetup' => 'Run Setup~~', + 'iTopUpdate:UI:RunSetup' => '运行安装向导', 'iTopUpdate:UI:WithDBBackup' => '数据库备份', 'iTopUpdate:UI:WithFilesBackup' => '应用文件备份', - 'iTopUpdate:UI:WithoutBackup' => 'No backup is planned~~', + 'iTopUpdate:UI:WithoutBackup' => '暂时没有备份计划', 'iTopUpdate:UI:Backup' => '升级之前执行备份', 'iTopUpdate:UI:DoFilesArchive' => '打包应用文件', - 'iTopUpdate:UI:UploadArchive' => 'Select a package to upload~~', - 'iTopUpdate:UI:ServerFile' => 'Path of a package already on the server~~', - 'iTopUpdate:UI:WarningReadOnlyDuringUpdate' => 'During the upgrade, the application will be read-only.~~', + 'iTopUpdate:UI:UploadArchive' => '请选择要上传的包', + 'iTopUpdate:UI:ServerFile' => '软件包已在服务器上', + 'iTopUpdate:UI:WarningReadOnlyDuringUpdate' => '在升级期间, 应用会变成只读状态.', 'iTopUpdate:UI:Status' => '状态', 'iTopUpdate:UI:Action' => '升级', @@ -74,7 +74,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'iTopUpdate:UI:CanCoreUpdate:Failed' => '文件系统检查失败', 'iTopUpdate:UI:CanCoreUpdate:Yes' => '应用无法升级', 'iTopUpdate:UI:CanCoreUpdate:No' => '应用无法升级: %1$s', - 'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Warning: application update can fail: %1$s~~', + 'iTopUpdate:UI:CanCoreUpdate:Warning' => '警告: 应用升级可能会失败: %1$s', // Setup Messages 'iTopUpdate:UI:SetupMessage:Ready' => '准备开始', @@ -82,9 +82,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'iTopUpdate:UI:SetupMessage:Backup' => '数据库备份', 'iTopUpdate:UI:SetupMessage:FilesArchive' => '打包应用文件', 'iTopUpdate:UI:SetupMessage:CopyFiles' => '复制新文件', - 'iTopUpdate:UI:SetupMessage:CheckCompile' => 'Check application upgrade~~', + 'iTopUpdate:UI:SetupMessage:CheckCompile' => '检查更新', 'iTopUpdate:UI:SetupMessage:Compile' => '升级应用程序和数据库', - 'iTopUpdate:UI:SetupMessage:UpdateDatabase' => 'Upgrade database~~', + 'iTopUpdate:UI:SetupMessage:UpdateDatabase' => '升级数据库', 'iTopUpdate:UI:SetupMessage:ExitMaintenance' => '正在退出维护模式', 'iTopUpdate:UI:SetupMessage:UpdateDone' => '升级完成', @@ -109,7 +109,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Menu:iTopUpdate+' => '应用升级', // Missing itop entries - 'Class:ModuleInstallation/Attribute:installed' => '安装在', + 'Class:ModuleInstallation/Attribute:installed' => '安装时间', 'Class:ModuleInstallation/Attribute:name' => '名称', 'Class:ModuleInstallation/Attribute:version' => '版本', 'Class:ModuleInstallation/Attribute:comment' => '备注', diff --git a/datamodels/2.x/itop-request-mgmt-itil/zh_cn.dict.itop-request-mgmt-itil.php b/datamodels/2.x/itop-request-mgmt-itil/zh_cn.dict.itop-request-mgmt-itil.php index f3db0766b..4ad9d65b2 100644 --- a/datamodels/2.x/itop-request-mgmt-itil/zh_cn.dict.itop-request-mgmt-itil.php +++ b/datamodels/2.x/itop-request-mgmt-itil/zh_cn.dict.itop-request-mgmt-itil.php @@ -188,8 +188,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:UserRequest/Attribute:resolution_code/Value:bug fixed+' => 'bug修复', 'Class:UserRequest/Attribute:resolution_code/Value:hardware repair' => '硬件维修', 'Class:UserRequest/Attribute:resolution_code/Value:hardware repair+' => '硬件维修', - 'Class:UserRequest/Attribute:resolution_code/Value:other' => '其他', - 'Class:UserRequest/Attribute:resolution_code/Value:other+' => '其他', + 'Class:UserRequest/Attribute:resolution_code/Value:other' => '其它', + 'Class:UserRequest/Attribute:resolution_code/Value:other+' => '其它', 'Class:UserRequest/Attribute:resolution_code/Value:software patch' => '软件补丁', 'Class:UserRequest/Attribute:resolution_code/Value:software patch+' => '软件补丁', 'Class:UserRequest/Attribute:resolution_code/Value:system update' => '系统更新', @@ -214,7 +214,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:UserRequest/Attribute:parent_change_id+' => '', 'Class:UserRequest/Attribute:parent_change_ref' => '变更编号', 'Class:UserRequest/Attribute:parent_change_ref+' => '', - 'Class:UserRequest/Attribute:parent_incident_ref' => 'Parent incident ref~~', + 'Class:UserRequest/Attribute:parent_incident_ref' => '父级事件编号', 'Class:UserRequest/Attribute:parent_incident_ref+' => '~~', 'Class:UserRequest/Attribute:related_request_list' => '子需求', 'Class:UserRequest/Attribute:related_request_list+' => '该父级需求相关的所有子需求', diff --git a/dictionaries/zh_cn.dictionary.itop.core.php b/dictionaries/zh_cn.dictionary.itop.core.php index 7807f117d..4be152588 100644 --- a/dictionaries/zh_cn.dictionary.itop.core.php +++ b/dictionaries/zh_cn.dictionary.itop.core.php @@ -203,9 +203,9 @@ Operators:
    'Core:AttributeTag' => '标签', 'Core:AttributeTag+' => '标签', - 'Core:Context=REST/JSON' => 'REST~~', + 'Core:Context=REST/JSON' => 'REST', 'Core:Context=Synchro' => 'Synchro~~', - 'Core:Context=Setup' => 'Setup~~', + 'Core:Context=Setup' => '安装向导', 'Core:Context=GUI:Console' => 'Console~~', 'Core:Context=CRON' => 'cron~~', 'Core:Context=GUI:Portal' => 'Portal~~', @@ -536,12 +536,12 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:Trigger' => '触发器', 'Class:Trigger+' => 'Custom event handler', 'Class:Trigger/Attribute:description' => '描述', - 'Class:Trigger/Attribute:description+' => '一行描述', + 'Class:Trigger/Attribute:description+' => '简短描述', 'Class:Trigger/Attribute:action_list' => '触发的行为', 'Class:Trigger/Attribute:action_list+' => 'Actions performed when the trigger is activated', 'Class:Trigger/Attribute:finalclass' => '触发器子类别', 'Class:Trigger/Attribute:finalclass+' => 'Name of the final class', - 'Class:Trigger/Attribute:context' => 'Context~~', + 'Class:Trigger/Attribute:context' => '上下文', 'Class:Trigger/Attribute:context+' => 'Context to allow the trigger to start~~', )); @@ -632,11 +632,11 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( // Dict::Add('ZH CN', 'Chinese', '简体中文', array( - 'Class:TriggerOnThresholdReached' => '触发器 (基于阀值)', - 'Class:TriggerOnThresholdReached+' => '当达到某个阀值时触发', + 'Class:TriggerOnThresholdReached' => '触发器 (基于阈值)', + 'Class:TriggerOnThresholdReached+' => '当达到某个阈值时触发', 'Class:TriggerOnThresholdReached/Attribute:stop_watch_code' => '秒表', 'Class:TriggerOnThresholdReached/Attribute:stop_watch_code+' => '', - 'Class:TriggerOnThresholdReached/Attribute:threshold_index' => '阀值', + 'Class:TriggerOnThresholdReached/Attribute:threshold_index' => '阈值', 'Class:TriggerOnThresholdReached/Attribute:threshold_index+' => '', )); @@ -743,8 +743,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'A delete retention period must be specified, since objects are to be deleted after being marked as obsolete', 'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Obsolete objects are to be updated, but no update is specified.', 'Class:SynchroDataSource/Error:DataTableAlreadyExists' => 'The table %1$s already exists in the database. Please use another name for the synchro data table.', - 'Core:SynchroReplica:PublicData' => 'Public Data', - 'Core:SynchroReplica:PrivateDetails' => 'Private Details', + 'Core:SynchroReplica:PublicData' => '公共数据', + 'Core:SynchroReplica:PrivateDetails' => '专属详情', 'Core:SynchroReplica:BackToDataSource' => '返回同步数据源: %1$s', 'Core:SynchroReplica:ListOfReplicas' => 'List of Replica', 'Core:SynchroAttExtKey:ReconciliationById' => 'id (Primary Key)', @@ -918,11 +918,11 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Core:BulkExport:OptionLinkSets' => '包含外链的对象', 'Core:BulkExport:OptionFormattedText' => '保持文本格式', 'Core:BulkExport:ScopeDefinition' => '定义要导出的对象', - 'Core:BulkExportLabelOQLExpression' => 'OQL Query:', + 'Core:BulkExportLabelOQLExpression' => 'OQL 查询:', 'Core:BulkExportLabelPhrasebookEntry' => 'Query Phrasebook Entry:', - 'Core:BulkExportMessageEmptyOQL' => 'Please enter a valid OQL query.', + 'Core:BulkExportMessageEmptyOQL' => '请输入有效的OQL 查询.', 'Core:BulkExportMessageEmptyPhrasebookEntry' => 'Please select a valid phrasebook entry.', - 'Core:BulkExportQueryPlaceholder' => 'Type an OQL query here...', + 'Core:BulkExportQueryPlaceholder' => '请在这里输入OQL 查询...', 'Core:BulkExportCanRunNonInteractive' => '点击这里运行非交互式导出.', 'Core:BulkExportLegacyExport' => '点击这里进入旧版导出.', 'Core:BulkExport:XLSXOptions' => 'Excel 选项', @@ -959,7 +959,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Class:TagSetFieldData+' => '~~', 'Class:TagSetFieldData/Attribute:code' => '代码', - 'Class:TagSetFieldData/Attribute:code+' => 'Internal code. Must contain at least 3 alphanumeric characters~~', + 'Class:TagSetFieldData/Attribute:code+' => '内部代码. 必须至少包含3个数字或字母', 'Class:TagSetFieldData/Attribute:label' => '标签', 'Class:TagSetFieldData/Attribute:label+' => '显示的标签', 'Class:TagSetFieldData/Attribute:description' => '描述', diff --git a/dictionaries/zh_cn.dictionary.itop.ui.php b/dictionaries/zh_cn.dictionary.itop.ui.php index 5f8ec4ae1..677afda00 100644 --- a/dictionaries/zh_cn.dictionary.itop.ui.php +++ b/dictionaries/zh_cn.dictionary.itop.ui.php @@ -418,15 +418,15 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'UI:Button:Insert' => '插入', 'UI:Button:More' => '更多', 'UI:Button:Less' => '更少', - 'UI:Button:Wait' => 'Please wait while updating fields~~', - 'UI:Treeview:CollapseAll' => 'Collapse All~~', - 'UI:Treeview:ExpandAll' => 'Expand All~~', + 'UI:Button:Wait' => '请稍候,正在更新字段', + 'UI:Treeview:CollapseAll' => '全部折叠', + 'UI:Treeview:ExpandAll' => '全部展开', 'UI:SearchToggle' => '搜索', 'UI:ClickToCreateNew' => '新建 %1$s', 'UI:SearchFor_Class' => '搜索 %1$s ', 'UI:NoObjectToDisplay' => '没有可显示的对象.', - 'UI:Error:SaveFailed' => 'The object cannot be saved :~~', + 'UI:Error:SaveFailed' => '对象无法被保存 :', 'UI:Error:MandatoryTemplateParameter_object_id' => '当link_attr 被指定时,参数 object_id 是必须的. 检查显示模板的定义.', 'UI:Error:MandatoryTemplateParameter_target_attr' => '当link_attr 被指定时, 参数 target_attr 是必须的. 检查显示模板的定义.', 'UI:Error:MandatoryTemplateParameter_group_by' => '参数 group_by 是必须的. 检查显示模板的定义.', @@ -459,8 +459,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'UI:Error:Invalid_Stimulus_On_Object_In_State' => '错误: 在对象 %2$s 的 "%3$s" 状态上的无效刺激 "%1$s" .', 'UI:Error:InvalidDashboardFile' => 'Error: invalid dashboard file~~', 'UI:Error:InvalidDashboard' => 'Error: invalid dashboard~~', - 'UI:Error:MaintenanceMode' => 'Application is currently in maintenance~~', - 'UI:Error:MaintenanceTitle' => 'Maintenance~~', + 'UI:Error:MaintenanceMode' => '应用正在维护中', + 'UI:Error:MaintenanceTitle' => '维护', 'UI:GroupBy:Count' => '个数', 'UI:GroupBy:Count+' => '元素数量', @@ -527,7 +527,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'UI:Login:ForgotPwdForm+' => 'iTop 将会给您发送一封密码重置邮件.', 'UI:Login:ResetPassword' => '立即发送!', 'UI:Login:ResetPwdFailed' => '邮件发送失败: %1$s', - 'UI:Login:SeparatorOr' => 'Or~~', + 'UI:Login:SeparatorOr' => '或者', 'UI:ResetPwd-Error-WrongLogin' => '\'%1$s\' 用户名无效', 'UI:ResetPwd-Error-NotPossible' => '外部账户不允许重置密码.', @@ -786,7 +786,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => '批量删除 %1$d 个 %2$s 类的对象', 'UI:Delete:NotAllowedToDelete' => '您无权删除该对象', 'UI:Delete:NotAllowedToUpdate_Fields' => '您无权更新以下栏目: %1$s', - 'UI:Error:ActionNotAllowed' => 'You are not allowed to do this action~~', + 'UI:Error:ActionNotAllowed' => '您无权进行操作', 'UI:Error:NotEnoughRightsToDelete' => '无法删除该对象, 因为当前用户没有足够的权限', 'UI:Error:CannotDeleteBecause' => '无法删除该对象,因为: %1$s', 'UI:Error:CannotDeleteBecauseOfDepencies' => '无法删除该对象, 因为必须事先完成一些手动操作', @@ -901,7 +901,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'Menu:AdminTools' => '管理工具', // Duplicated into itop-welcome-itil (will be removed from here...) 'Menu:AdminTools+' => '管理工具', // Duplicated into itop-welcome-itil (will be removed from here...) 'Menu:AdminTools?' => '具有管理员角色的用户才能获得的工具', // Duplicated into itop-welcome-itil (will be removed from here...) - 'Menu:SystemTools' => 'System~~', + 'Menu:SystemTools' => '系统', 'UI:ChangeManagementMenu' => '变更管理', 'UI:ChangeManagementMenu+' => '变更管理', @@ -1039,9 +1039,9 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'UI:RelationGroups' => '组', 'UI:OperationCancelled' => '操作已取消', 'UI:ElementsDisplayed' => '过滤', - 'UI:RelationGroupNumber_N' => 'Group #%1$d', + 'UI:RelationGroupNumber_N' => '分组 #%1$d', 'UI:Relation:ExportAsPDF' => '导出PDF...', - 'UI:RelationOption:GroupingThreshold' => '分组阀值', + 'UI:RelationOption:GroupingThreshold' => '分组阈值', 'UI:Relation:AdditionalContextInfo' => '其他信息', 'UI:Relation:NoneSelected' => '无', 'UI:Relation:Zoom' => '放大', @@ -1065,7 +1065,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'UI:PageOrientation_Landscape' => '横向', 'UI:RelationTooltip:Redundancy' => '冗余', 'UI:RelationTooltip:ImpactedItems_N_of_M' => '# 受影响的项目: %1$d / %2$d', - 'UI:RelationTooltip:CriticalThreshold_N_of_M' => '阀值: %1$d / %2$d', + 'UI:RelationTooltip:CriticalThreshold_N_of_M' => '阈值: %1$d / %2$d', 'Portal:Title' => 'iTop 用户门户', 'Portal:NoRequestMgmt' => '亲爱的 %1$s, 您被重定向到这个页面,因为您的账户已被设置成角色 \'Portal user\'. 并且, iTop 没有安装 \'需求管理\' 功能. 请联系管理员.', 'Portal:Refresh' => '刷新', @@ -1111,7 +1111,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'UI:ModifiedObject' => '对象已修改', 'UI:BulkModifyStatus' => '操作', 'UI:BulkModifyStatus+' => '操作状态', - 'UI:BulkModifyErrors' => 'Errors (if any)', + 'UI:BulkModifyErrors' => '报错 (如果有)', 'UI:BulkModifyErrors+' => '阻止修改时报错', 'UI:BulkModifyStatusOk' => 'Ok', 'UI:BulkModifyStatusError' => '错误', @@ -1161,8 +1161,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'UI:PrintResolution:FullSize' => '全尺寸', 'UI:PrintResolution:A4Portrait' => 'A4 纵向', 'UI:PrintResolution:A4Landscape' => 'A4 横向', - 'UI:PrintResolution:LetterPortrait' => 'Letter Portrait~~', - 'UI:PrintResolution:LetterLandscape' => 'Letter Landscape~~', + 'UI:PrintResolution:LetterPortrait' => '纵向排版', + 'UI:PrintResolution:LetterLandscape' => '横向排版', 'UI:Toggle:StandardDashboard' => '标准', 'UI:Toggle:CustomDashboard' => '自定义', @@ -1444,7 +1444,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'UI:Button:RemoveImage' => '移除图片', 'UI:UploadNotSupportedInThisMode' => '本模式下不支持修改文件或图片.', - 'UI:Button:RemoveDocument' => 'Remove the document~~', + 'UI:Button:RemoveDocument' => '移除文档', // Search form 'UI:Search:Toggle' => '折叠 / 展开', @@ -1490,7 +1490,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'UI:Search:Criteria:Title:Enum:In:Many' => '%1$s: %2$s 和 %3$s others', 'UI:Search:Criteria:Title:Enum:In:All' => '%1$s: 任何', // - TagSet widget - 'UI:Search:Criteria:Title:TagSet:Matches' => '%1$s: %2$s~~', + 'UI:Search:Criteria:Title:TagSet:Matches' => '%1$s: %2$s', // - External key widget 'UI:Search:Criteria:Title:ExternalKey:Empty' => '%1$s 已定义', 'UI:Search:Criteria:Title:ExternalKey:NotEmpty' => '%1$s 未被定义', @@ -1525,7 +1525,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array( 'UI:Search:Criteria:Operator:Numeric:LessThanOrEquals' => '小于 / 等于', // > '<=', 'UI:Search:Criteria:Operator:Numeric:Different' => '不同', // => '≠', // - Tag Set Widget - 'UI:Search:Criteria:Operator:TagSet:Matches' => 'Matches~~', + 'UI:Search:Criteria:Operator:TagSet:Matches' => '匹配', // - Other translations 'UI:Search:Value:Filter:Placeholder' => '过滤器...', From 71fcc6f026e153d0a10fc6b9d307f75314daad46 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 2 Jun 2021 14:45:03 +0200 Subject: [PATCH 21/31] =?UTF-8?q?N=C2=B04031=20-=20OQL=20Error=20when=20At?= =?UTF-8?q?tributeObjectKey=20is=20used=20in=20JOIN=20condition?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/oqlclasstreeoptimizer.class.inc.php | 2 +- test/core/DBSearchTest.php | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/core/oqlclasstreeoptimizer.class.inc.php b/core/oqlclasstreeoptimizer.class.inc.php index 1e12384e9..4bc070218 100644 --- a/core/oqlclasstreeoptimizer.class.inc.php +++ b/core/oqlclasstreeoptimizer.class.inc.php @@ -55,7 +55,7 @@ class OQLClassTreeOptimizer $sJoinedClass = $oJoin->GetOOQLClassNode()->GetNodeClass(); $sExtKeyAttCode = $oJoin->GetLeftField(); $oExtKeyAttDef = MetaModel::GetAttributeDef($oCurrentClassNode->GetNodeClass(), $sExtKeyAttCode); - if ($sJoinedClass == $oExtKeyAttDef->GetTargetClass()) { + if (($oExtKeyAttDef instanceof AttributeExternalKey) && ($sJoinedClass == $oExtKeyAttDef->GetTargetClass())) { // The join is not used, remove from tree $oCurrentClassNode->RemoveJoin($sLeftKey, $index); } diff --git a/test/core/DBSearchTest.php b/test/core/DBSearchTest.php index abc8a7795..91bfd370f 100644 --- a/test/core/DBSearchTest.php +++ b/test/core/DBSearchTest.php @@ -720,4 +720,19 @@ class DBSearchTest extends ItopDataTestCase /** @var \DBObjectSearch $oNestedSearchInExpression */ self::assertEquals($bAllowAllData, $oNestedSearchInExpression->IsAllDataAllowed(), 'Nested DBSearch AllowData value'); } + + /** + * BUG N°4031 check AttributeObjectKey used in JOIN condition + * @throws \ConfigException + * @throws \CoreException + * @throws \MissingQueryArgument + * @throws \OQLException + */ + public function testAttributeObjectKey() + { + $sQuery = "SELECT II FROM InlineImage AS II JOIN UserRequest AS UR ON II.item_id = UR.id WHERE II.item_class = 'UserRequest'"; + $oSearch = \DBObjectSearch::FromOQL($sQuery); + $oSearch->MakeSelectQuery(); + self::assertTrue(true); + } } From 02d32a556d040627212cffd77d028b697a223201 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 2 Jun 2021 15:15:00 +0200 Subject: [PATCH 22/31] =?UTF-8?q?N=C2=B04052=20-=20OQL=20parser=20limit=20?= =?UTF-8?q?for=20huge=20request?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/oql/oql-parser.php | 92 ++++++++++++++++++------------------- core/oql/oql-parser.y | 2 + core/oql/version.txt | 2 +- test/core/OQLParserTest.php | 26 +++++++++++ 4 files changed, 75 insertions(+), 47 deletions(-) diff --git a/core/oql/oql-parser.php b/core/oql/oql-parser.php index c67ffff7a..e8f973cdf 100644 --- a/core/oql/oql-parser.php +++ b/core/oql/oql-parser.php @@ -597,7 +597,7 @@ static public $yy_action = array( ** defined, then do no error processing. */ const YYNOCODE = 119; - const YYSTACKDEPTH = 100; + const YYSTACKDEPTH = 1000; const YYNSTATE = 175; const YYNRULE = 125; const YYERRORSYMBOL = 76; @@ -1474,52 +1474,52 @@ static public $yy_action = array( ** function yy_r0($yymsp){ ... } // User supplied code ** #line */ -#line 29 "..\oql-parser.y" +#line 31 "..\oql-parser.y" function yy_r0(){ $this->my_result = $this->yystack[$this->yyidx + 0]->minor; } #line 1483 "..\oql-parser.php" -#line 33 "..\oql-parser.y" +#line 35 "..\oql-parser.y" function yy_r3(){ $this->_retvalue = new OqlUnionQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor); } #line 1488 "..\oql-parser.php" -#line 40 "..\oql-parser.y" +#line 42 "..\oql-parser.y" function yy_r5(){ $this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, array($this->yystack[$this->yyidx + -2]->minor)); } #line 1493 "..\oql-parser.php" -#line 43 "..\oql-parser.y" +#line 45 "..\oql-parser.y" function yy_r6(){ $this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, array($this->yystack[$this->yyidx + -2]->minor)); } #line 1498 "..\oql-parser.php" -#line 47 "..\oql-parser.y" +#line 49 "..\oql-parser.y" function yy_r7(){ $this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -4]->minor); } #line 1503 "..\oql-parser.php" -#line 50 "..\oql-parser.y" +#line 52 "..\oql-parser.y" function yy_r8(){ $this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -6]->minor); } #line 1508 "..\oql-parser.php" -#line 55 "..\oql-parser.y" +#line 57 "..\oql-parser.y" function yy_r9(){ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor); } #line 1513 "..\oql-parser.php" -#line 58 "..\oql-parser.y" +#line 60 "..\oql-parser.y" function yy_r10(){ array_push($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor; } #line 1519 "..\oql-parser.php" -#line 63 "..\oql-parser.y" +#line 65 "..\oql-parser.y" function yy_r11(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } #line 1522 "..\oql-parser.php" -#line 64 "..\oql-parser.y" +#line 66 "..\oql-parser.y" function yy_r12(){ $this->_retvalue = null; } #line 1525 "..\oql-parser.php" -#line 66 "..\oql-parser.y" +#line 68 "..\oql-parser.y" function yy_r13(){ // insert the join statement on top of the existing list array_unshift($this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor); @@ -1527,63 +1527,63 @@ static public $yy_action = array( $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } #line 1533 "..\oql-parser.php" -#line 72 "..\oql-parser.y" +#line 74 "..\oql-parser.y" function yy_r14(){ $this->_retvalue = Array($this->yystack[$this->yyidx + 0]->minor); } #line 1538 "..\oql-parser.php" -#line 78 "..\oql-parser.y" +#line 80 "..\oql-parser.y" function yy_r16(){ // create an array with one single item $this->_retvalue = new OqlJoinSpec($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor); } #line 1544 "..\oql-parser.php" -#line 83 "..\oql-parser.y" +#line 85 "..\oql-parser.y" function yy_r17(){ // create an array with one single item $this->_retvalue = new OqlJoinSpec($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor); } #line 1550 "..\oql-parser.php" -#line 88 "..\oql-parser.y" +#line 90 "..\oql-parser.y" function yy_r18(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, '=', $this->yystack[$this->yyidx + 0]->minor); } #line 1553 "..\oql-parser.php" -#line 89 "..\oql-parser.y" +#line 91 "..\oql-parser.y" function yy_r19(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'BELOW', $this->yystack[$this->yyidx + 0]->minor); } #line 1556 "..\oql-parser.php" -#line 90 "..\oql-parser.y" +#line 92 "..\oql-parser.y" function yy_r20(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'BELOW_STRICT', $this->yystack[$this->yyidx + 0]->minor); } #line 1559 "..\oql-parser.php" -#line 91 "..\oql-parser.y" +#line 93 "..\oql-parser.y" function yy_r21(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_BELOW', $this->yystack[$this->yyidx + 0]->minor); } #line 1562 "..\oql-parser.php" -#line 92 "..\oql-parser.y" +#line 94 "..\oql-parser.y" function yy_r22(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_BELOW_STRICT', $this->yystack[$this->yyidx + 0]->minor); } #line 1565 "..\oql-parser.php" -#line 93 "..\oql-parser.y" +#line 95 "..\oql-parser.y" function yy_r23(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'ABOVE', $this->yystack[$this->yyidx + 0]->minor); } #line 1568 "..\oql-parser.php" -#line 94 "..\oql-parser.y" +#line 96 "..\oql-parser.y" function yy_r24(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'ABOVE_STRICT', $this->yystack[$this->yyidx + 0]->minor); } #line 1571 "..\oql-parser.php" -#line 95 "..\oql-parser.y" +#line 97 "..\oql-parser.y" function yy_r25(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_ABOVE', $this->yystack[$this->yyidx + 0]->minor); } #line 1574 "..\oql-parser.php" -#line 96 "..\oql-parser.y" +#line 98 "..\oql-parser.y" function yy_r26(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_ABOVE_STRICT', $this->yystack[$this->yyidx + 0]->minor); } #line 1577 "..\oql-parser.php" -#line 98 "..\oql-parser.y" +#line 100 "..\oql-parser.y" function yy_r27(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } #line 1580 "..\oql-parser.php" -#line 103 "..\oql-parser.y" +#line 105 "..\oql-parser.y" function yy_r31(){ $this->_retvalue = new FunctionOqlExpression($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + -1]->minor); } #line 1583 "..\oql-parser.php" -#line 104 "..\oql-parser.y" +#line 106 "..\oql-parser.y" function yy_r32(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; } #line 1586 "..\oql-parser.php" -#line 105 "..\oql-parser.y" +#line 107 "..\oql-parser.y" function yy_r33(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); } #line 1589 "..\oql-parser.php" -#line 111 "..\oql-parser.y" +#line 113 "..\oql-parser.y" function yy_r37(){ if ($this->yystack[$this->yyidx + -1]->minor == 'MATCHES') { @@ -1595,43 +1595,43 @@ static public $yy_action = array( } } #line 1601 "..\oql-parser.php" -#line 128 "..\oql-parser.y" +#line 130 "..\oql-parser.y" function yy_r42(){ $this->_retvalue = new ListOqlExpression($this->yystack[$this->yyidx + -1]->minor); } #line 1606 "..\oql-parser.php" -#line 131 "..\oql-parser.y" +#line 133 "..\oql-parser.y" function yy_r43(){ $this->_retvalue = new NestedQueryOqlExpression($this->yystack[$this->yyidx + -1]->minor); } #line 1611 "..\oql-parser.php" -#line 146 "..\oql-parser.y" +#line 148 "..\oql-parser.y" function yy_r47(){ $this->_retvalue = array(); } #line 1616 "..\oql-parser.php" -#line 157 "..\oql-parser.y" +#line 159 "..\oql-parser.y" function yy_r51(){ $this->_retvalue = new IntervalOqlExpression($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); } #line 1619 "..\oql-parser.php" -#line 170 "..\oql-parser.y" +#line 172 "..\oql-parser.y" function yy_r61(){ $this->_retvalue = new ScalarOqlExpression($this->yystack[$this->yyidx + 0]->minor); } #line 1622 "..\oql-parser.php" -#line 172 "..\oql-parser.y" +#line 174 "..\oql-parser.y" function yy_r63(){ $this->_retvalue = new ScalarOqlExpression(null); } #line 1625 "..\oql-parser.php" -#line 174 "..\oql-parser.y" +#line 176 "..\oql-parser.y" function yy_r64(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor); } #line 1628 "..\oql-parser.php" -#line 175 "..\oql-parser.y" +#line 177 "..\oql-parser.y" function yy_r65(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -2]->minor); } #line 1631 "..\oql-parser.php" -#line 176 "..\oql-parser.y" +#line 178 "..\oql-parser.y" function yy_r66(){ $this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; } #line 1634 "..\oql-parser.php" -#line 179 "..\oql-parser.y" +#line 181 "..\oql-parser.y" function yy_r67(){ $this->_retvalue = new VariableOqlExpression(substr($this->yystack[$this->yyidx + 0]->minor, 1)); } #line 1637 "..\oql-parser.php" -#line 181 "..\oql-parser.y" +#line 183 "..\oql-parser.y" function yy_r68(){ if ($this->yystack[$this->yyidx + 0]->minor[0] == '`') { @@ -1644,19 +1644,19 @@ static public $yy_action = array( $this->_retvalue = new OqlName($name, $this->m_iColPrev); } #line 1650 "..\oql-parser.php" -#line 192 "..\oql-parser.y" +#line 194 "..\oql-parser.y" function yy_r69(){$this->_retvalue=(int)$this->yystack[$this->yyidx + 0]->minor; } #line 1653 "..\oql-parser.php" -#line 193 "..\oql-parser.y" +#line 195 "..\oql-parser.y" function yy_r70(){$this->_retvalue=(int)-$this->yystack[$this->yyidx + 0]->minor; } #line 1656 "..\oql-parser.php" -#line 194 "..\oql-parser.y" +#line 196 "..\oql-parser.y" function yy_r71(){$this->_retvalue=new OqlHexValue($this->yystack[$this->yyidx + 0]->minor); } #line 1659 "..\oql-parser.php" -#line 195 "..\oql-parser.y" +#line 197 "..\oql-parser.y" function yy_r72(){$this->_retvalue=stripslashes(substr($this->yystack[$this->yyidx + 0]->minor, 1, strlen($this->yystack[$this->yyidx + 0]->minor) - 2)); } #line 1662 "..\oql-parser.php" -#line 198 "..\oql-parser.y" +#line 200 "..\oql-parser.y" function yy_r73(){$this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; } #line 1665 "..\oql-parser.php" @@ -1940,7 +1940,7 @@ throw new OQLParserException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCo } while ($yymajor != self::YYNOCODE && $this->yyidx >= 0); } } -#line 263 "..\oql-parser.y" +#line 265 "..\oql-parser.y" class OQLParserException extends OQLException diff --git a/core/oql/oql-parser.y b/core/oql/oql-parser.y index 4e95868fd..1759739c4 100644 --- a/core/oql/oql-parser.y +++ b/core/oql/oql-parser.y @@ -25,6 +25,8 @@ later : solve the 2 remaining shift-reduce conflicts (JOIN) %syntax_error { throw new OQLParserException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol, $this->tokenName($yymajor), $TOKEN); } +/* Bug N°4052 Parser stack size too small for huge OQL requests */ +%stack_size 1000 result ::= union(X). { $this->my_result = X; } result ::= query(X). { $this->my_result = X; } diff --git a/core/oql/version.txt b/core/oql/version.txt index 26a3e601d..8206d9531 100644 --- a/core/oql/version.txt +++ b/core/oql/version.txt @@ -1 +1 @@ -2020-09-29 \ No newline at end of file +2021-06-02 \ No newline at end of file diff --git a/test/core/OQLParserTest.php b/test/core/OQLParserTest.php index a6807e8b0..c96f94b0c 100644 --- a/test/core/OQLParserTest.php +++ b/test/core/OQLParserTest.php @@ -12,6 +12,9 @@ namespace Combodo\iTop\Test\UnitTest\Core; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; use DBObjectSearch; +use OQLException; +use OqlInterpreter; +use OQLParserException; /** * @runTestsInSeparateProcesses @@ -57,4 +60,27 @@ class OQLParserTest extends ItopDataTestCase ); } + /** + * Bug N°4052 OQL parser limit for huge request + * @throws \OQLException + */ + public function testOQLParserStackSize() + { + // OQL Parser stack size is 1000 + $sQuery = "SELECT Organization WHERE 1"; + $sQuery .= str_repeat(" UNION SELECT Organization WHERE 1", 497); + //$sExpression = "SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `lnk1` ON `lnk1`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk1`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s1` ON `GARE`.service_id = `s1`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s1`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root3`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s2` ON `GARE`.service_id = `s2`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s2`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk5`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s3` ON `GARE`.service_id = `s3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s3`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root5`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s4` ON `GARE`.service_id = `s4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s4`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk9`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `lnk1` ON `lnk1`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk1`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `lnk1` ON `lnk1`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk1`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk1`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `lnk1` ON `lnk1`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s1` ON `GARE`.service_id = `s1`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s1`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk1`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root3`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `lnk1` ON `lnk1`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s2` ON `GARE`.service_id = `s2`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s2`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk1`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk5`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `lnk1` ON `lnk1`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s3` ON `GARE`.service_id = `s3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s3`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk1`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root5`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `lnk1` ON `lnk1`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s4` ON `GARE`.service_id = `s4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s4`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk1`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk9`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s1` ON `GARE`.service_id = `s1`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s1`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root3`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `lnk1` ON `lnk1`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s1` ON `GARE`.service_id = `s1`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s1`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root3`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk1`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s1` ON `GARE`.service_id = `s1`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s1`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root3`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root3`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s1` ON `GARE`.service_id = `s1`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s1`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root3`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t3`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root3`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk5`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s1` ON `GARE`.service_id = `s1`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s1`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s1`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root3`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root5`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s1` ON `GARE`.service_id = `s1`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s1`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s1`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root3`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk9`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s2` ON `GARE`.service_id = `s2`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s2`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk5`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `lnk1` ON `lnk1`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s2` ON `GARE`.service_id = `s2`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s2`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk5`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk1`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s2` ON `GARE`.service_id = `s2`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s2`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk5`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root4`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s2` ON `GARE`.service_id = `s2`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s2`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk5`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk5`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s2` ON `GARE`.service_id = `s2`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s2`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s2`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk5`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root5`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s2` ON `GARE`.service_id = `s2`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s2`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s2`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk5`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk9`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s3` ON `GARE`.service_id = `s3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s3`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root5`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `lnk1` ON `lnk1`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s3` ON `GARE`.service_id = `s3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s3`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root5`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk1`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s3` ON `GARE`.service_id = `s3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s3`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s3`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root5`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root3`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s3` ON `GARE`.service_id = `s3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s3`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s3`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root5`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk5`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s3` ON `GARE`.service_id = `s3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s3`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root5`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root5`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s3` ON `GARE`.service_id = `s3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s3`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root5`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t5`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root5`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk9`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s4` ON `GARE`.service_id = `s4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s4`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk9`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `lnk1` ON `lnk1`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s4` ON `GARE`.service_id = `s4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s4`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk9`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk1`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s4` ON `GARE`.service_id = `s4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s4`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s4`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk9`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root3`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s4` ON `GARE`.service_id = `s4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s4`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s4`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk9`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk5`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s4` ON `GARE`.service_id = `s4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s4`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk9`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root6`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s4` ON `GARE`.service_id = `s4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s4`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id WHERE (((((`Root`.`id` = :current_contact->org_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk9`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk9`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`l2`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s1` ON `GARE`.service_id = `s1`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s1`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root3`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s2` ON `GARE`.service_id = `s2`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s2`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk5`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s3` ON `GARE`.service_id = `s3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s3`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root5`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s4` ON `GARE`.service_id = `s4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s4`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk9`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`l2`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`l2`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`l2`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s1` ON `GARE`.service_id = `s1`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s1`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`l2`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root3`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s2` ON `GARE`.service_id = `s2`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s2`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`l2`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk5`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s3` ON `GARE`.service_id = `s3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s3`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`l2`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root5`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s4` ON `GARE`.service_id = `s4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s4`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`l2`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk9`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s1` ON `GARE`.service_id = `s1`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s1`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root3`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s1` ON `GARE`.service_id = `s1`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s1`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root3`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`l2`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s1` ON `GARE`.service_id = `s1`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s1`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root3`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root3`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s1` ON `GARE`.service_id = `s1`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s1`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root3`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t3`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root3`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk5`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s1` ON `GARE`.service_id = `s1`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s1`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s1`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root3`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root5`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s1` ON `GARE`.service_id = `s1`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s1`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s1`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root3`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk9`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s2` ON `GARE`.service_id = `s2`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s2`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk5`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s2` ON `GARE`.service_id = `s2`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s2`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk5`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`l2`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s2` ON `GARE`.service_id = `s2`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s2`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk5`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root4`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s2` ON `GARE`.service_id = `s2`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s2`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk5`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk5`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s2` ON `GARE`.service_id = `s2`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s2`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s2`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk5`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root5`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s2` ON `GARE`.service_id = `s2`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s2`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s2`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk5`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk9`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s3` ON `GARE`.service_id = `s3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s3`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root5`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s3` ON `GARE`.service_id = `s3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s3`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root5`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`l2`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s3` ON `GARE`.service_id = `s3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s3`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s3`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root5`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root3`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s3` ON `GARE`.service_id = `s3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s3`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s3`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root5`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk5`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s3` ON `GARE`.service_id = `s3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s3`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root5`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root5`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s3` ON `GARE`.service_id = `s3`.id JOIN lnkOrganizationToService AS `lnk6` ON `lnk6`.service_id = `s3`.id JOIN Team AS `t5` ON `lnk6`.team_id = `t5`.id JOIN Organization AS `Node5` ON `t5`.org_id = `Node5`.id JOIN Organization AS `Root5` ON `Node5`.parent_id BELOW `Root5`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root5`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t5`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`Root5`.`id` = :current_contact->org_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk9`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s4` ON `GARE`.service_id = `s4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s4`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk9`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s4` ON `GARE`.service_id = `s4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s4`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk9`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`l2`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s4` ON `GARE`.service_id = `s4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s4`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id JOIN lnkServiceToTeam AS `lnk2` ON `lnk2`.service_id = `s4`.id JOIN Team AS `t3` ON `lnk2`.team_id = `t3`.id JOIN Organization AS `Node3` ON `t3`.org_id = `Node3`.id JOIN Organization AS `Root3` ON `Node3`.parent_id BELOW `Root3`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk9`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root3`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s4` ON `GARE`.service_id = `s4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s4`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id JOIN lnkServiceToTeam AS `lnk3` ON `lnk3`.service_id = `s4`.id JOIN Team AS `t4` ON `lnk3`.team_id = `t4`.id JOIN Organization AS `Node4` ON `t4`.org_id = `Node4`.id JOIN Organization AS `Root4` ON `Node4`.parent_id BELOW `Root4`.id JOIN lnkOrganizationToPerson AS `lnk5` ON `lnk5`.organization_id = `Root4`.id JOIN lnkPersonToTeam AS `lnk4` ON `lnk4`.team_id = `t4`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk9`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk5`.`person_id` = :current_contact_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s4` ON `GARE`.service_id = `s4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s4`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk9`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`Root6`.`id` = :current_contact->org_id)) UNION SELECT `GARE` FROM UserRequest AS `GARE` JOIN Team AS `t` ON `GARE`.team_id = `t`.id JOIN Organization AS `Node` ON `t`.org_id = `Node`.id JOIN Organization AS `Root` ON `Node`.parent_id BELOW `Root`.id JOIN lnkOrganizationToPerson AS `l2` ON `l2`.organization_id = `Root`.id JOIN lnkPersonToTeam AS `l` ON `l`.team_id = `t`.id JOIN Service AS `s4` ON `GARE`.service_id = `s4`.id JOIN lnkOrganizationToService AS `lnk7` ON `lnk7`.service_id = `s4`.id JOIN Team AS `t6` ON `lnk7`.team_id = `t6`.id JOIN Organization AS `Node6` ON `t6`.org_id = `Node6`.id JOIN Organization AS `Root6` ON `Node6`.parent_id BELOW `Root6`.id JOIN lnkOrganizationToPerson AS `lnk9` ON `lnk9`.organization_id = `Root6`.id JOIN lnkPersonToTeam AS `lnk8` ON `lnk8`.team_id = `t6`.id WHERE (((((`l2`.`person_id` = :current_contact_id) AND ((`GARE`.`agent_id` != '') AND (`GARE`.`operational_status` NOT IN ('closed', 'resolved')))) AND (`lnk9`.`person_id` = :current_contact_id)) AND (`GARE`.`finalclass` = 'UserRequest')) AND (`lnk9`.`person_id` = :current_contact_id))"; + try { + $oOql = new OqlInterpreter($sQuery); + $oOql->ParseQuery(); + } + catch (OQLParserException $e) { + self::fail("OQL Parser stack overflow"); + } + catch (OQLException $e) { + self::fail("OQL Parser stack overflow"); + } + self::assertTrue(true); + } + } From 2625d2da803d4dc1a5d90dcc41dae3537c603d24 Mon Sep 17 00:00:00 2001 From: Pierre Goiffon Date: Thu, 3 Jun 2021 15:29:13 +0200 Subject: [PATCH 23/31] :bulb: PHPDoc --- application/utils.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/utils.inc.php b/application/utils.inc.php index 13f45e0f7..806cce74c 100644 --- a/application/utils.inc.php +++ b/application/utils.inc.php @@ -776,7 +776,7 @@ class utils * @throws \ConfigException * @throws \CoreException * - * @since 2.7.0 N°2478 always call {@link MetaModel::GetConfig} first, cache is only set when loading from disk + * @since 2.7.0 N°2478 this method will now always call {@link MetaModel::GetConfig} first, and cache in this class is only set when loading from disk */ public static function GetConfig() { From 3965806fa0a86a6972698ad1e1085f0538bed002 Mon Sep 17 00:00:00 2001 From: Eric Date: Thu, 3 Jun 2021 16:49:21 +0200 Subject: [PATCH 24/31] =?UTF-8?q?N=C2=B04052=20-=20OQL=20parser=20limit=20?= =?UTF-8?q?for=20huge=20request=20-=20add=20better=20feedback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/oql/oql-parser.php | 248 +++++++++++++++++++++++----------------- core/oql/oql-parser.y | 38 +++++- core/oql/version.txt | 2 +- 3 files changed, 179 insertions(+), 109 deletions(-) diff --git a/core/oql/oql-parser.php b/core/oql/oql-parser.php index e8f973cdf..83fe29aa6 100644 --- a/core/oql/oql-parser.php +++ b/core/oql/oql-parser.php @@ -1175,6 +1175,10 @@ static public $yy_action = array( } /* Here code is inserted which will execute if the parser ** stack ever overflows */ +#line 30 "..\oql-parser.y" + +throw new OQLParserStackOverFlowException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol); +#line 1186 "..\oql-parser.php" return; } $yytos = new OQLParser_yyStackEntry; @@ -1474,116 +1478,116 @@ static public $yy_action = array( ** function yy_r0($yymsp){ ... } // User supplied code ** #line */ -#line 31 "..\oql-parser.y" +#line 37 "..\oql-parser.y" function yy_r0(){ $this->my_result = $this->yystack[$this->yyidx + 0]->minor; } -#line 1483 "..\oql-parser.php" -#line 35 "..\oql-parser.y" +#line 1488 "..\oql-parser.php" +#line 41 "..\oql-parser.y" function yy_r3(){ $this->_retvalue = new OqlUnionQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor); } -#line 1488 "..\oql-parser.php" -#line 42 "..\oql-parser.y" +#line 1493 "..\oql-parser.php" +#line 48 "..\oql-parser.y" function yy_r5(){ $this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, array($this->yystack[$this->yyidx + -2]->minor)); } -#line 1493 "..\oql-parser.php" -#line 45 "..\oql-parser.y" +#line 1498 "..\oql-parser.php" +#line 51 "..\oql-parser.y" function yy_r6(){ $this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, array($this->yystack[$this->yyidx + -2]->minor)); } -#line 1498 "..\oql-parser.php" -#line 49 "..\oql-parser.y" +#line 1503 "..\oql-parser.php" +#line 55 "..\oql-parser.y" function yy_r7(){ $this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -4]->minor); } -#line 1503 "..\oql-parser.php" -#line 52 "..\oql-parser.y" +#line 1508 "..\oql-parser.php" +#line 58 "..\oql-parser.y" function yy_r8(){ $this->_retvalue = new OqlObjectQuery($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -6]->minor); } -#line 1508 "..\oql-parser.php" -#line 57 "..\oql-parser.y" +#line 1513 "..\oql-parser.php" +#line 63 "..\oql-parser.y" function yy_r9(){ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor); } -#line 1513 "..\oql-parser.php" -#line 60 "..\oql-parser.y" +#line 1518 "..\oql-parser.php" +#line 66 "..\oql-parser.y" function yy_r10(){ array_push($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor; } -#line 1519 "..\oql-parser.php" -#line 65 "..\oql-parser.y" +#line 1524 "..\oql-parser.php" +#line 71 "..\oql-parser.y" function yy_r11(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } -#line 1522 "..\oql-parser.php" -#line 66 "..\oql-parser.y" +#line 1527 "..\oql-parser.php" +#line 72 "..\oql-parser.y" function yy_r12(){ $this->_retvalue = null; } -#line 1525 "..\oql-parser.php" -#line 68 "..\oql-parser.y" +#line 1530 "..\oql-parser.php" +#line 74 "..\oql-parser.y" function yy_r13(){ // insert the join statement on top of the existing list array_unshift($this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor); // and return the updated array $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } -#line 1533 "..\oql-parser.php" -#line 74 "..\oql-parser.y" +#line 1538 "..\oql-parser.php" +#line 80 "..\oql-parser.y" function yy_r14(){ $this->_retvalue = Array($this->yystack[$this->yyidx + 0]->minor); } -#line 1538 "..\oql-parser.php" -#line 80 "..\oql-parser.y" +#line 1543 "..\oql-parser.php" +#line 86 "..\oql-parser.y" function yy_r16(){ // create an array with one single item $this->_retvalue = new OqlJoinSpec($this->yystack[$this->yyidx + -4]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor); } -#line 1544 "..\oql-parser.php" -#line 85 "..\oql-parser.y" +#line 1549 "..\oql-parser.php" +#line 91 "..\oql-parser.y" function yy_r17(){ // create an array with one single item $this->_retvalue = new OqlJoinSpec($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor); } -#line 1550 "..\oql-parser.php" -#line 90 "..\oql-parser.y" - function yy_r18(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, '=', $this->yystack[$this->yyidx + 0]->minor); } -#line 1553 "..\oql-parser.php" -#line 91 "..\oql-parser.y" - function yy_r19(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'BELOW', $this->yystack[$this->yyidx + 0]->minor); } -#line 1556 "..\oql-parser.php" -#line 92 "..\oql-parser.y" - function yy_r20(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'BELOW_STRICT', $this->yystack[$this->yyidx + 0]->minor); } -#line 1559 "..\oql-parser.php" -#line 93 "..\oql-parser.y" - function yy_r21(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_BELOW', $this->yystack[$this->yyidx + 0]->minor); } -#line 1562 "..\oql-parser.php" -#line 94 "..\oql-parser.y" - function yy_r22(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_BELOW_STRICT', $this->yystack[$this->yyidx + 0]->minor); } -#line 1565 "..\oql-parser.php" -#line 95 "..\oql-parser.y" - function yy_r23(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'ABOVE', $this->yystack[$this->yyidx + 0]->minor); } -#line 1568 "..\oql-parser.php" +#line 1555 "..\oql-parser.php" #line 96 "..\oql-parser.y" - function yy_r24(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'ABOVE_STRICT', $this->yystack[$this->yyidx + 0]->minor); } -#line 1571 "..\oql-parser.php" + function yy_r18(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, '=', $this->yystack[$this->yyidx + 0]->minor); } +#line 1558 "..\oql-parser.php" #line 97 "..\oql-parser.y" - function yy_r25(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_ABOVE', $this->yystack[$this->yyidx + 0]->minor); } -#line 1574 "..\oql-parser.php" + function yy_r19(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'BELOW', $this->yystack[$this->yyidx + 0]->minor); } +#line 1561 "..\oql-parser.php" #line 98 "..\oql-parser.y" - function yy_r26(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_ABOVE_STRICT', $this->yystack[$this->yyidx + 0]->minor); } -#line 1577 "..\oql-parser.php" + function yy_r20(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'BELOW_STRICT', $this->yystack[$this->yyidx + 0]->minor); } +#line 1564 "..\oql-parser.php" +#line 99 "..\oql-parser.y" + function yy_r21(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_BELOW', $this->yystack[$this->yyidx + 0]->minor); } +#line 1567 "..\oql-parser.php" #line 100 "..\oql-parser.y" - function yy_r27(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } -#line 1580 "..\oql-parser.php" -#line 105 "..\oql-parser.y" - function yy_r31(){ $this->_retvalue = new FunctionOqlExpression($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + -1]->minor); } -#line 1583 "..\oql-parser.php" + function yy_r22(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_BELOW_STRICT', $this->yystack[$this->yyidx + 0]->minor); } +#line 1570 "..\oql-parser.php" +#line 101 "..\oql-parser.y" + function yy_r23(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'ABOVE', $this->yystack[$this->yyidx + 0]->minor); } +#line 1573 "..\oql-parser.php" +#line 102 "..\oql-parser.y" + function yy_r24(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'ABOVE_STRICT', $this->yystack[$this->yyidx + 0]->minor); } +#line 1576 "..\oql-parser.php" +#line 103 "..\oql-parser.y" + function yy_r25(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_ABOVE', $this->yystack[$this->yyidx + 0]->minor); } +#line 1579 "..\oql-parser.php" +#line 104 "..\oql-parser.y" + function yy_r26(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, 'NOT_ABOVE_STRICT', $this->yystack[$this->yyidx + 0]->minor); } +#line 1582 "..\oql-parser.php" #line 106 "..\oql-parser.y" + function yy_r27(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor; } +#line 1585 "..\oql-parser.php" +#line 111 "..\oql-parser.y" + function yy_r31(){ $this->_retvalue = new FunctionOqlExpression($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + -1]->minor); } +#line 1588 "..\oql-parser.php" +#line 112 "..\oql-parser.y" function yy_r32(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; } -#line 1586 "..\oql-parser.php" -#line 107 "..\oql-parser.y" - function yy_r33(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); } -#line 1589 "..\oql-parser.php" +#line 1591 "..\oql-parser.php" #line 113 "..\oql-parser.y" + function yy_r33(){ $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); } +#line 1594 "..\oql-parser.php" +#line 119 "..\oql-parser.y" function yy_r37(){ if ($this->yystack[$this->yyidx + -1]->minor == 'MATCHES') { @@ -1594,44 +1598,44 @@ static public $yy_action = array( $this->_retvalue = new BinaryOqlExpression($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); } } -#line 1601 "..\oql-parser.php" -#line 130 "..\oql-parser.y" +#line 1606 "..\oql-parser.php" +#line 136 "..\oql-parser.y" function yy_r42(){ $this->_retvalue = new ListOqlExpression($this->yystack[$this->yyidx + -1]->minor); } -#line 1606 "..\oql-parser.php" -#line 133 "..\oql-parser.y" +#line 1611 "..\oql-parser.php" +#line 139 "..\oql-parser.y" function yy_r43(){ $this->_retvalue = new NestedQueryOqlExpression($this->yystack[$this->yyidx + -1]->minor); } -#line 1611 "..\oql-parser.php" -#line 148 "..\oql-parser.y" +#line 1616 "..\oql-parser.php" +#line 154 "..\oql-parser.y" function yy_r47(){ $this->_retvalue = array(); } -#line 1616 "..\oql-parser.php" -#line 159 "..\oql-parser.y" +#line 1621 "..\oql-parser.php" +#line 165 "..\oql-parser.y" function yy_r51(){ $this->_retvalue = new IntervalOqlExpression($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor); } -#line 1619 "..\oql-parser.php" -#line 172 "..\oql-parser.y" - function yy_r61(){ $this->_retvalue = new ScalarOqlExpression($this->yystack[$this->yyidx + 0]->minor); } -#line 1622 "..\oql-parser.php" -#line 174 "..\oql-parser.y" - function yy_r63(){ $this->_retvalue = new ScalarOqlExpression(null); } -#line 1625 "..\oql-parser.php" -#line 176 "..\oql-parser.y" - function yy_r64(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor); } -#line 1628 "..\oql-parser.php" -#line 177 "..\oql-parser.y" - function yy_r65(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -2]->minor); } -#line 1631 "..\oql-parser.php" +#line 1624 "..\oql-parser.php" #line 178 "..\oql-parser.y" - function yy_r66(){ $this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; } -#line 1634 "..\oql-parser.php" -#line 181 "..\oql-parser.y" - function yy_r67(){ $this->_retvalue = new VariableOqlExpression(substr($this->yystack[$this->yyidx + 0]->minor, 1)); } -#line 1637 "..\oql-parser.php" + function yy_r61(){ $this->_retvalue = new ScalarOqlExpression($this->yystack[$this->yyidx + 0]->minor); } +#line 1627 "..\oql-parser.php" +#line 180 "..\oql-parser.y" + function yy_r63(){ $this->_retvalue = new ScalarOqlExpression(null); } +#line 1630 "..\oql-parser.php" +#line 182 "..\oql-parser.y" + function yy_r64(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor); } +#line 1633 "..\oql-parser.php" #line 183 "..\oql-parser.y" + function yy_r65(){ $this->_retvalue = new FieldOqlExpression($this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -2]->minor); } +#line 1636 "..\oql-parser.php" +#line 184 "..\oql-parser.y" + function yy_r66(){ $this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; } +#line 1639 "..\oql-parser.php" +#line 187 "..\oql-parser.y" + function yy_r67(){ $this->_retvalue = new VariableOqlExpression(substr($this->yystack[$this->yyidx + 0]->minor, 1)); } +#line 1642 "..\oql-parser.php" +#line 189 "..\oql-parser.y" function yy_r68(){ if ($this->yystack[$this->yyidx + 0]->minor[0] == '`') { @@ -1643,22 +1647,22 @@ static public $yy_action = array( } $this->_retvalue = new OqlName($name, $this->m_iColPrev); } -#line 1650 "..\oql-parser.php" -#line 194 "..\oql-parser.y" - function yy_r69(){$this->_retvalue=(int)$this->yystack[$this->yyidx + 0]->minor; } -#line 1653 "..\oql-parser.php" -#line 195 "..\oql-parser.y" - function yy_r70(){$this->_retvalue=(int)-$this->yystack[$this->yyidx + 0]->minor; } -#line 1656 "..\oql-parser.php" -#line 196 "..\oql-parser.y" - function yy_r71(){$this->_retvalue=new OqlHexValue($this->yystack[$this->yyidx + 0]->minor); } -#line 1659 "..\oql-parser.php" -#line 197 "..\oql-parser.y" - function yy_r72(){$this->_retvalue=stripslashes(substr($this->yystack[$this->yyidx + 0]->minor, 1, strlen($this->yystack[$this->yyidx + 0]->minor) - 2)); } -#line 1662 "..\oql-parser.php" +#line 1655 "..\oql-parser.php" #line 200 "..\oql-parser.y" + function yy_r69(){$this->_retvalue=(int)$this->yystack[$this->yyidx + 0]->minor; } +#line 1658 "..\oql-parser.php" +#line 201 "..\oql-parser.y" + function yy_r70(){$this->_retvalue=(int)-$this->yystack[$this->yyidx + 0]->minor; } +#line 1661 "..\oql-parser.php" +#line 202 "..\oql-parser.y" + function yy_r71(){$this->_retvalue=new OqlHexValue($this->yystack[$this->yyidx + 0]->minor); } +#line 1664 "..\oql-parser.php" +#line 203 "..\oql-parser.y" + function yy_r72(){$this->_retvalue=stripslashes(substr($this->yystack[$this->yyidx + 0]->minor, 1, strlen($this->yystack[$this->yyidx + 0]->minor) - 2)); } +#line 1667 "..\oql-parser.php" +#line 206 "..\oql-parser.y" function yy_r73(){$this->_retvalue=$this->yystack[$this->yyidx + 0]->minor; } -#line 1665 "..\oql-parser.php" +#line 1670 "..\oql-parser.php" /** * placeholder for the left hand side in a reduce operation. @@ -1759,6 +1763,10 @@ static public $yy_action = array( } /* Here code is inserted which will be executed whenever the ** parser fails */ +#line 33 "..\oql-parser.y" + +throw new OQLParserParseFailureException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol); +#line 1775 "..\oql-parser.php" } /** @@ -1772,8 +1780,8 @@ static public $yy_action = array( { #line 25 "..\oql-parser.y" -throw new OQLParserException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol, $this->tokenName($yymajor), $TOKEN); -#line 1781 "..\oql-parser.php" +throw new OQLParserSyntaxErrorException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol, $this->tokenName($yymajor), $TOKEN); +#line 1791 "..\oql-parser.php" } /** @@ -1940,19 +1948,47 @@ throw new OQLParserException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCo } while ($yymajor != self::YYNOCODE && $this->yyidx >= 0); } } -#line 265 "..\oql-parser.y" +#line 271 "..\oql-parser.y" class OQLParserException extends OQLException +{ + public function __construct($sIssue, $sInput, $iLine, $iCol, $sTokenValue) + { + parent::__construct($sIssue, $sInput, $iLine, $iCol, $sTokenValue); + } +} + +class OQLParserSyntaxErrorException extends OQLParserException { public function __construct($sInput, $iLine, $iCol, $sTokenName, $sTokenValue) { $sIssue = "Unexpected token $sTokenName"; - + parent::__construct($sIssue, $sInput, $iLine, $iCol, $sTokenValue); } } +class OQLParserStackOverFlowException extends OQLParserException +{ + public function __construct($sInput, $iLine, $iCol) + { + $sIssue = "Stack overflow"; + + parent::__construct($sIssue, $sInput, $iLine, $iCol, ''); + } +} + +class OQLParserParseFailureException extends OQLParserException +{ + public function __construct($sInput, $iLine, $iCol) + { + $sIssue = "Unexpected token $sTokenName"; + + parent::__construct($sIssue, $sInput, $iLine, $iCol, ''); + } +} + class OQLParser extends OQLParserRaw { // dirty, but working for us (no other mean to get the final result :-( @@ -2005,4 +2041,4 @@ class OQLParser extends OQLParserRaw } } -#line 2014 "..\oql-parser.php" +#line 2052 "..\oql-parser.php" diff --git a/core/oql/oql-parser.y b/core/oql/oql-parser.y index 1759739c4..33cd9b1aa 100644 --- a/core/oql/oql-parser.y +++ b/core/oql/oql-parser.y @@ -23,10 +23,16 @@ later : solve the 2 remaining shift-reduce conflicts (JOIN) %name OQLParser_ %declare_class {class OQLParserRaw} %syntax_error { -throw new OQLParserException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol, $this->tokenName($yymajor), $TOKEN); +throw new OQLParserSyntaxErrorException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol, $this->tokenName($yymajor), $TOKEN); } /* Bug N°4052 Parser stack size too small for huge OQL requests */ %stack_size 1000 +%stack_overflow { +throw new OQLParserStackOverFlowException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol); +} +%parse_failure { +throw new OQLParserParseFailureException($this->m_sSourceQuery, $this->m_iLine, $this->m_iCol); +} result ::= union(X). { $this->my_result = X; } result ::= query(X). { $this->my_result = X; } @@ -265,15 +271,43 @@ func_name(A) ::= F_INET_NTOA(X). { A=X; } %code { class OQLParserException extends OQLException +{ + public function __construct($sIssue, $sInput, $iLine, $iCol, $sTokenValue) + { + parent::__construct($sIssue, $sInput, $iLine, $iCol, $sTokenValue); + } +} + +class OQLParserSyntaxErrorException extends OQLParserException { public function __construct($sInput, $iLine, $iCol, $sTokenName, $sTokenValue) { $sIssue = "Unexpected token $sTokenName"; - + parent::__construct($sIssue, $sInput, $iLine, $iCol, $sTokenValue); } } +class OQLParserStackOverFlowException extends OQLParserException +{ + public function __construct($sInput, $iLine, $iCol) + { + $sIssue = "Stack overflow"; + + parent::__construct($sIssue, $sInput, $iLine, $iCol, ''); + } +} + +class OQLParserParseFailureException extends OQLParserException +{ + public function __construct($sInput, $iLine, $iCol) + { + $sIssue = "Unexpected token $sTokenName"; + + parent::__construct($sIssue, $sInput, $iLine, $iCol, ''); + } +} + class OQLParser extends OQLParserRaw { // dirty, but working for us (no other mean to get the final result :-( diff --git a/core/oql/version.txt b/core/oql/version.txt index 8206d9531..78c1e5e2b 100644 --- a/core/oql/version.txt +++ b/core/oql/version.txt @@ -1 +1 @@ -2021-06-02 \ No newline at end of file +2021-06-03 \ No newline at end of file From d11eceac62005c3b03011e71bac21fe52fe61306 Mon Sep 17 00:00:00 2001 From: Eric Date: Thu, 3 Jun 2021 17:07:17 +0200 Subject: [PATCH 25/31] =?UTF-8?q?:white=5Fcheck=5Fmark:=20N=C2=B04052=20-?= =?UTF-8?q?=20OQL=20parser=20limit=20for=20huge=20request=20-=20fix=20CI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/core/DBSearchTest.php | 4 ++-- test/core/OQLTest.php | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/test/core/DBSearchTest.php b/test/core/DBSearchTest.php index 91bfd370f..f6e10ddbd 100644 --- a/test/core/DBSearchTest.php +++ b/test/core/DBSearchTest.php @@ -617,7 +617,7 @@ class DBSearchTest extends ItopDataTestCase $sExceptionClass = get_class($e); } - static::assertEquals('OQLParserException', $sExceptionClass); + static::assertEquals('OQLParserSyntaxErrorException', $sExceptionClass); } public function testSanity_GroupFunction_In_GroupByPart() @@ -633,7 +633,7 @@ class DBSearchTest extends ItopDataTestCase $sExceptionClass = get_class($e); } - static::assertEquals('OQLParserException', $sExceptionClass); + static::assertEquals('OQLParserSyntaxErrorException', $sExceptionClass); } public function testSanity_UnknownGroupFunction_In_SelectPart() diff --git a/test/core/OQLTest.php b/test/core/OQLTest.php index 6eef2a0e6..c6f71058b 100644 --- a/test/core/OQLTest.php +++ b/test/core/OQLTest.php @@ -203,16 +203,16 @@ class OQLTest extends ItopDataTestCase public function BadQueryProvider() { return array( - array('SELECT toto WHERE toto.a = (3++1)', 'OQLParserException'), - array('SELECT toto WHHHERE toto.a = "1"', 'OQLParserException'), - array('SELECT toto WHERE toto.a == "1"', 'OQLParserException'), + array('SELECT toto WHERE toto.a = (3++1)', 'OQLParserSyntaxErrorException'), + array('SELECT toto WHHHERE toto.a = "1"', 'OQLParserSyntaxErrorException'), + array('SELECT toto WHERE toto.a == "1"', 'OQLParserSyntaxErrorException'), array('SELECT toto WHERE toto.a % 1', 'Exception'), - array('SELECT toto WHERE toto.a like \'arg\'', 'OQLParserException'), - array('SELECT toto WHERE toto.a NOT LIKE "That\'s "it""', 'OQLParserException'), - array('SELECT toto WHERE toto.a NOT LIKE \'That\'s it\'', 'OQLParserException'), + array('SELECT toto WHERE toto.a like \'arg\'', 'OQLParserSyntaxErrorException'), + array('SELECT toto WHERE toto.a NOT LIKE "That\'s "it""', 'OQLParserSyntaxErrorException'), + array('SELECT toto WHERE toto.a NOT LIKE \'That\'s it\'', 'OQLParserSyntaxErrorException'), array('SELECT toto WHERE toto.a NOT LIKE "blah \\ truc"', 'Exception'), array('SELECT toto WHERE toto.a NOT LIKE \'blah \\ truc\'', 'Exception'), - array('SELECT A JOIN B ON A.myB = B.id JOIN C ON C.parent_id = B.id WHERE A.col1 BELOW 2 AND B.id = 3', 'OQLParserException'), + array('SELECT A JOIN B ON A.myB = B.id JOIN C ON C.parent_id = B.id WHERE A.col1 BELOW 2 AND B.id = 3', 'OQLParserSyntaxErrorException'), ); } From 373641e01ddb898c97ab292c5160435b00d7e7fb Mon Sep 17 00:00:00 2001 From: Pierre Goiffon Date: Thu, 3 Jun 2021 15:59:45 +0200 Subject: [PATCH 26/31] :art: Code formatting --- application/applicationextension.inc.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/application/applicationextension.inc.php b/application/applicationextension.inc.php index 7b1baa97d..cdea42927 100644 --- a/application/applicationextension.inc.php +++ b/application/applicationextension.inc.php @@ -72,15 +72,14 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension /** * @inheritDoc */ - public abstract function ListSupportedLoginModes(); + abstract public function ListSupportedLoginModes(); /** * @inheritDoc */ public function LoginAction($sLoginState, &$iErrorCode) { - switch ($sLoginState) - { + switch ($sLoginState) { case LoginWebPage::LOGIN_STATE_START: return $this->OnStart($iErrorCode); From 2d2a6857de55d005dbc4836e558e611ce7f52bb8 Mon Sep 17 00:00:00 2001 From: acognet Date: Fri, 4 Jun 2021 09:10:28 +0200 Subject: [PATCH 27/31] =?UTF-8?q?N=C2=B03797=20-=20[MariaDB]=20crash=20whi?= =?UTF-8?q?le=20converting=20utf8mb4=20+=20add=20index?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/metamodel.class.php | 42 ++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/core/metamodel.class.php b/core/metamodel.class.php index 2dbeed108..1e93c7151 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -5366,7 +5366,7 @@ abstract class MetaModel $aSugFix[$sClass]['id'][] = "ALTER TABLE `$sTable` ADD $sKeyFieldDefinition"; if (!$bTableToCreate) { - $aAlterTableItems[$sTable][$sKeyField] = "ADD $sKeyFieldDefinition"; + $aAlterTableItems[$sTable]['field'][$sKeyField] = "ADD $sKeyFieldDefinition"; } } else @@ -5379,7 +5379,7 @@ abstract class MetaModel $aSugFix[$sClass]['id'][] = "ALTER TABLE `$sTable`, DROP PRIMARY KEY, ADD PRIMARY key(`$sKeyField`)"; if (!$bTableToCreate) { - $aAlterTableItems[$sTable][$sKeyField] = "CHANGE `$sKeyField` $sKeyFieldDefinition"; + $aAlterTableItems[$sTable]['field'][$sKeyField] = "CHANGE `$sKeyField` $sKeyFieldDefinition"; } } if (self::IsAutoIncrementKey($sClass) && !CMDBSource::IsAutoIncrement($sTable, $sKeyField)) @@ -5388,7 +5388,7 @@ abstract class MetaModel $aSugFix[$sClass]['id'][] = "ALTER TABLE `$sTable` CHANGE `$sKeyField` $sKeyFieldDefinition"; if (!$bTableToCreate) { - $aAlterTableItems[$sTable][$sKeyField] = "CHANGE `$sKeyField` $sKeyFieldDefinition"; + $aAlterTableItems[$sTable]['field'][$sKeyField] = "CHANGE `$sKeyField` $sKeyFieldDefinition"; } } } @@ -5451,7 +5451,7 @@ abstract class MetaModel } else { - $aAlterTableItems[$sTable][$sField] = "ADD $sFieldDefinition"; + $aAlterTableItems[$sTable]['field'][$sField] = "ADD $sFieldDefinition"; $aAdditionalRequests = self::GetAdditionalRequestAfterAlter($sClass, $sTable, $sField); if (!empty($aAdditionalRequests)) { @@ -5495,7 +5495,7 @@ abstract class MetaModel } else { - $aAlterTableItems[$sTable][] = "ADD $sIndexType `$sIndexName` ($sColumns)"; + $aAlterTableItems[$sTable]['index'][] = "ADD $sIndexType `$sIndexName` ($sColumns)"; } } @@ -5536,7 +5536,7 @@ abstract class MetaModel if (CMDBSource::HasIndex($sTable, $sField)) { $aSugFix[$sClass][$sAttCode][] = "ALTER TABLE `$sTable` DROP INDEX `$sIndexName`"; - $aAlterTableItems[$sTable][] = "DROP INDEX `$sIndexName`"; + $aAlterTableItems[$sTable]['index'][] = "DROP INDEX `$sIndexName`"; } $sSugFixAfterChange = "ALTER TABLE `$sTable` ADD $sIndexType `$sIndexName` ($sColumns)"; $sAlterTableItemsAfterChange = "ADD $sIndexType `$sIndexName` ($sColumns)"; @@ -5550,7 +5550,7 @@ abstract class MetaModel { $aErrors[$sClass][$sAttCode][] = "field '$sField' in table '$sTable' has a wrong type: found $sActualFieldSpec while expecting $sDBFieldSpec"; $aSugFix[$sClass][$sAttCode][] = "ALTER TABLE `$sTable` CHANGE `$sField` $sFieldDefinition"; - $aAlterTableItems[$sTable][$sField] = "CHANGE `$sField` $sFieldDefinition"; + $aAlterTableItems[$sTable]['field'][$sField] = "CHANGE `$sField` $sFieldDefinition"; } // Create indexes (external keys only... so far) @@ -5565,7 +5565,7 @@ abstract class MetaModel } else { - $aAlterTableItems[$sTable][] = $sAlterTableItemsAfterChange; + $aAlterTableItems[$sTable]['index'][] = $sAlterTableItemsAfterChange; } } } @@ -5625,9 +5625,12 @@ abstract class MetaModel { $aAlterTableItems[$sTable] = array(); } - array_unshift($aAlterTableItems[$sTable], "DROP INDEX `$sIndexId`"); + if (isset($aAlterTableItems[$sTable]['index'])) + { + array_unshift($aAlterTableItems[$sTable]['index'], "DROP INDEX `$sIndexId`"); + } } - $aAlterTableItems[$sTable][] = "ADD INDEX `$sIndexId` ($sColumns)"; + $aAlterTableItems[$sTable]['index'][] = "ADD INDEX `$sIndexId` ($sColumns)"; } } } @@ -5645,7 +5648,7 @@ abstract class MetaModel // without specifying the value of this unknown column $sFieldDefinition = "`$sField` ".CMDBSource::GetFieldType($sTable, $sField).' NULL'; $aSugFix[$sClass][$sAttCode][] = "ALTER TABLE `$sTable` CHANGE `$sField` $sFieldDefinition"; - $aAlterTableItems[$sTable][$sField] = "CHANGE `$sField` $sFieldDefinition"; + $aAlterTableItems[$sTable]['field'][$sField] = "CHANGE `$sField` $sFieldDefinition"; } $aSugFix[$sClass][$sAttCode][] = "-- Recommended action: ALTER TABLE `$sTable` DROP `$sField`"; } @@ -5664,7 +5667,10 @@ abstract class MetaModel { $aAlterTableItems[$sTable] = array(); } - array_unshift($aAlterTableItems[$sTable], "DROP INDEX `$sIndexId`"); + if (isset($aAlterTableItems[$sTable]['index'])) + { + array_unshift($aAlterTableItems[$sTable]['index'], "DROP INDEX `$sIndexId`"); + } } } @@ -5696,8 +5702,16 @@ abstract class MetaModel } foreach ($aAlterTableItems as $sTable => $aChangeList) { - $sChangeList = implode(', ', $aChangeList); - $aCondensedQueries[] = "ALTER TABLE `$sTable` $sChangeList"; + if (isset($aAlterTableItems[$sTable]['field'])) + { + $sChangeList = implode(', ', $aChangeList['field']); + $aCondensedQueries[] = "ALTER TABLE `$sTable` $sChangeList"; + } + if (isset($aAlterTableItems[$sTable]['index'])) + { + $sChangeList = implode(', ', $aChangeList['index']); + $aCondensedQueries[] = "ALTER TABLE `$sTable` $sChangeList"; + } // Add request right after the ALTER TABLE if (isset($aPostTableAlteration[$sTable])) { From a076792e77b1627371a7c7872fc267736217d060 Mon Sep 17 00:00:00 2001 From: Pierre Goiffon Date: Tue, 8 Jun 2021 18:16:12 +0200 Subject: [PATCH 28/31] =?UTF-8?q?:arrow=5Fup:=20N=C2=B03973=20Update=20upd?= =?UTF-8?q?ate=20pear/archive=5Ftar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 2 +- composer.lock | 29 +- lib/composer/ClassLoader.php | 40 +- lib/composer/InstalledVersions.php | 705 +++ lib/composer/autoload_classmap.php | 16 +- lib/composer/autoload_real.php | 9 +- lib/composer/autoload_static.php | 16 +- lib/composer/include_paths.php | 2 +- lib/composer/installed.json | 5326 +++++++++-------- lib/composer/installed.php | 444 ++ lib/composer/platform_check.php | 26 + lib/pear/archive_tar/.github/FUNDING.yml | 2 + lib/pear/archive_tar/.github/dependabot.yml | 11 + .../archive_tar/.github/workflows/build.yml | 40 + lib/pear/archive_tar/Archive/Tar.php | 50 +- lib/pear/archive_tar/README.md | 2 +- lib/pear/archive_tar/package.xml | 55 +- 17 files changed, 4094 insertions(+), 2681 deletions(-) create mode 100644 lib/composer/InstalledVersions.php create mode 100644 lib/composer/installed.php create mode 100644 lib/composer/platform_check.php create mode 100644 lib/pear/archive_tar/.github/FUNDING.yml create mode 100644 lib/pear/archive_tar/.github/dependabot.yml create mode 100644 lib/pear/archive_tar/.github/workflows/build.yml diff --git a/composer.json b/composer.json index 6a4bf3852..bf99956d3 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "ext-soap": "*", "combodo/tcpdf": "6.3.5", "nikic/php-parser": "^3.1", - "pear/archive_tar": "1.4.10", + "pear/archive_tar": "1.4.13", "pelago/emogrifier": "2.1.0", "scssphp/scssphp": "1.0.6", "swiftmailer/swiftmailer": "5.4.12", diff --git a/composer.lock b/composer.lock index 2aef21e81..8fa3540a7 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "27af144ea2acf2c138f587052a4ceddc", + "content-hash": "8c7f3127435b1afb67965369c50d0898", "packages": [ { "name": "combodo/tcpdf", @@ -168,16 +168,16 @@ }, { "name": "pear/archive_tar", - "version": "1.4.10", + "version": "1.4.13", "source": { "type": "git", "url": "https://github.com/pear/Archive_Tar.git", - "reference": "bbb4f10f71a1da2715ec6d9a683f4f23c507a49b" + "reference": "2b87b41178cc6d4ad3cba678a46a1cae49786011" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/bbb4f10f71a1da2715ec6d9a683f4f23c507a49b", - "reference": "bbb4f10f71a1da2715ec6d9a683f4f23c507a49b", + "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/2b87b41178cc6d4ad3cba678a46a1cae49786011", + "reference": "2b87b41178cc6d4ad3cba678a46a1cae49786011", "shasum": "" }, "require": { @@ -230,7 +230,21 @@ "archive", "tar" ], - "time": "2020-09-15T14:13:23+00:00" + "support": { + "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Archive_Tar", + "source": "https://github.com/pear/Archive_Tar" + }, + "funding": [ + { + "url": "https://github.com/mrook", + "type": "github" + }, + { + "url": "https://www.patreon.com/michielrook", + "type": "patreon" + } + ], + "time": "2021-02-16T10:50:50+00:00" }, { "name": "pear/console_getopt", @@ -2590,5 +2604,6 @@ "platform-dev": [], "platform-overrides": { "php": "5.6.0" - } + }, + "plugin-api-version": "2.0.0" } diff --git a/lib/composer/ClassLoader.php b/lib/composer/ClassLoader.php index fce8549f0..247294d66 100644 --- a/lib/composer/ClassLoader.php +++ b/lib/composer/ClassLoader.php @@ -37,11 +37,13 @@ namespace Composer\Autoload; * * @author Fabien Potencier * @author Jordi Boggiano - * @see http://www.php-fig.org/psr/psr-0/ - * @see http://www.php-fig.org/psr/psr-4/ + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { + private $vendorDir; + // PSR-4 private $prefixLengthsPsr4 = array(); private $prefixDirsPsr4 = array(); @@ -57,10 +59,17 @@ class ClassLoader private $missingClasses = array(); private $apcuPrefix; + private static $registeredLoaders = array(); + + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + } + public function getPrefixes() { if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', $this->prefixesPsr0); + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); } return array(); @@ -300,6 +309,17 @@ class ClassLoader public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } } /** @@ -308,6 +328,10 @@ class ClassLoader public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } } /** @@ -367,6 +391,16 @@ class ClassLoader return $file; } + /** + * Returns the currently registered loaders indexed by their corresponding vendor directories. + * + * @return self[] + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + private function findFileWithExtension($class, $ext) { // PSR-4 lookup diff --git a/lib/composer/InstalledVersions.php b/lib/composer/InstalledVersions.php new file mode 100644 index 000000000..f97ade932 --- /dev/null +++ b/lib/composer/InstalledVersions.php @@ -0,0 +1,705 @@ + + array ( + 'pretty_version' => 'dev-develop', + 'version' => 'dev-develop', + 'aliases' => + array ( + ), + 'reference' => '2d2a6857de55d005dbc4836e558e611ce7f52bb8', + 'name' => '__root__', + ), + 'versions' => + array ( + '__root__' => + array ( + 'pretty_version' => 'dev-develop', + 'version' => 'dev-develop', + 'aliases' => + array ( + ), + 'reference' => '2d2a6857de55d005dbc4836e558e611ce7f52bb8', + ), + 'combodo/tcpdf' => + array ( + 'pretty_version' => '6.3.5', + 'version' => '6.3.5.0', + 'aliases' => + array ( + ), + 'reference' => 'aedd4b7b8cf7fcc24e617c405c9d3304150f4b94', + ), + 'nikic/php-parser' => + array ( + 'pretty_version' => 'v3.1.5', + 'version' => '3.1.5.0', + 'aliases' => + array ( + ), + 'reference' => 'bb87e28e7d7b8d9a7fda231d37457c9210faf6ce', + ), + 'paragonie/random_compat' => + array ( + 'pretty_version' => 'v2.0.18', + 'version' => '2.0.18.0', + 'aliases' => + array ( + ), + 'reference' => '0a58ef6e3146256cc3dc7cc393927bcc7d1b72db', + ), + 'pear/archive_tar' => + array ( + 'pretty_version' => '1.4.13', + 'version' => '1.4.13.0', + 'aliases' => + array ( + ), + 'reference' => '2b87b41178cc6d4ad3cba678a46a1cae49786011', + ), + 'pear/console_getopt' => + array ( + 'pretty_version' => 'v1.4.3', + 'version' => '1.4.3.0', + 'aliases' => + array ( + ), + 'reference' => 'a41f8d3e668987609178c7c4a9fe48fecac53fa0', + ), + 'pear/pear-core-minimal' => + array ( + 'pretty_version' => 'v1.10.10', + 'version' => '1.10.10.0', + 'aliases' => + array ( + ), + 'reference' => '625a3c429d9b2c1546438679074cac1b089116a7', + ), + 'pear/pear_exception' => + array ( + 'pretty_version' => 'v1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => 'dbb42a5a0e45f3adcf99babfb2a1ba77b8ac36a7', + ), + 'pelago/emogrifier' => + array ( + 'pretty_version' => 'v2.1.0', + 'version' => '2.1.0.0', + 'aliases' => + array ( + ), + 'reference' => '40c3d4f475d44ffc7265a760d1dd0e81f579f96f', + ), + 'psr/cache' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8', + ), + 'psr/cache-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + ), + ), + 'psr/container' => + array ( + 'pretty_version' => '1.0.0', + 'version' => '1.0.0.0', + 'aliases' => + array ( + ), + 'reference' => 'b7ce3b176482dbbc1245ebf52b181af44c2cf55f', + ), + 'psr/container-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + ), + ), + 'psr/log' => + array ( + 'pretty_version' => '1.1.2', + 'version' => '1.1.2.0', + 'aliases' => + array ( + ), + 'reference' => '446d54b4cb6bf489fc9d75f55843658e6f25d801', + ), + 'psr/log-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + ), + ), + 'psr/simple-cache' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b', + ), + 'psr/simple-cache-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + ), + ), + 'rsky/pear-core-min' => + array ( + 'replaced' => + array ( + 0 => 'v1.10.10', + ), + ), + 'scssphp/scssphp' => + array ( + 'pretty_version' => '1.0.6', + 'version' => '1.0.6.0', + 'aliases' => + array ( + ), + 'reference' => '5b3c9d704950d8f9637f5110c36c281ec47dc13c', + ), + 'swiftmailer/swiftmailer' => + array ( + 'pretty_version' => 'v5.4.12', + 'version' => '5.4.12.0', + 'aliases' => + array ( + ), + 'reference' => '181b89f18a90f8925ef805f950d47a7190e9b950', + ), + 'symfony/cache' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '3d9f46a6960fd5cd7f030f86adc5b4b63bcfa4e3', + ), + 'symfony/class-loader' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'e212b06996819a2bce026a63da03b7182d05a690', + ), + 'symfony/config' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'a599a867d0e4a07c342b5f1e656b3915a540ddbe', + ), + 'symfony/console' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '1ee23b3b659b06c622f2bd2492a229e416eb4586', + ), + 'symfony/css-selector' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'f819f71ae3ba6f396b4c015bd5895de7d2f1f85f', + ), + 'symfony/debug' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'f72e33fdb1170b326e72c3157f0cd456351dd086', + ), + 'symfony/dependency-injection' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '0d201916bfb3af939fec3c0c8815ea16c60ac1a2', + ), + 'symfony/dotenv' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'c7e8e471fea74e868ae797970b383dea89ae548a', + ), + 'symfony/event-dispatcher' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'f9031c22ec127d4a2450760f81a8677fe8a10177', + ), + 'symfony/filesystem' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '00cdad0936d06fab136944bc2342b762b1c3a4a2', + ), + 'symfony/finder' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '290ae21279b37bfd287cdcce640d51204e84afdf', + ), + 'symfony/framework-bundle' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '0d61117c7a770da0bd8bbe7ccfa34d8063f272ea', + ), + 'symfony/http-foundation' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'd2d0cfe8e319d9df44c4cca570710fcf221d4593', + ), + 'symfony/http-kernel' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'c42c8339acb28cfff0fb1786948db4d23d609ff7', + ), + 'symfony/polyfill-apcu' => + array ( + 'pretty_version' => 'v1.13.1', + 'version' => '1.13.1.0', + 'aliases' => + array ( + ), + 'reference' => 'a8e961c841b9ec52927a87914f8820a1ad8f8116', + ), + 'symfony/polyfill-ctype' => + array ( + 'pretty_version' => 'v1.13.1', + 'version' => '1.13.1.0', + 'aliases' => + array ( + ), + 'reference' => 'f8f0b461be3385e56d6de3dbb5a0df24c0c275e3', + ), + 'symfony/polyfill-mbstring' => + array ( + 'pretty_version' => 'v1.13.1', + 'version' => '1.13.1.0', + 'aliases' => + array ( + ), + 'reference' => '7b4aab9743c30be783b73de055d24a39cf4b954f', + ), + 'symfony/polyfill-php56' => + array ( + 'pretty_version' => 'v1.13.1', + 'version' => '1.13.1.0', + 'aliases' => + array ( + ), + 'reference' => '53dd1cdf3cb986893ccf2b96665b25b3abb384f4', + ), + 'symfony/polyfill-php70' => + array ( + 'pretty_version' => 'v1.13.1', + 'version' => '1.13.1.0', + 'aliases' => + array ( + ), + 'reference' => 'af23c7bb26a73b850840823662dda371484926c4', + ), + 'symfony/polyfill-util' => + array ( + 'pretty_version' => 'v1.13.1', + 'version' => '1.13.1.0', + 'aliases' => + array ( + ), + 'reference' => '964a67f293b66b95883a5ed918a65354fcd2258f', + ), + 'symfony/routing' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'b689ccd48e234ea404806d94b07eeb45f9f6f06a', + ), + 'symfony/stopwatch' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'efe0af281ad336bc3b10375c88b117499f1d8494', + ), + 'symfony/twig-bridge' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '49b824ddc7f2d250a1f172349cd9a111d63287c0', + ), + 'symfony/twig-bundle' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'd39ed8f5df62aeeeb27a6f3bf7f58a6c02a58ea9', + ), + 'symfony/var-dumper' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '569e261461600810845a8305ca3f64abd3e712c0', + ), + 'symfony/web-profiler-bundle' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '3ae27cf1b2776cd68aa15fdb57089970f78bcf11', + ), + 'symfony/yaml' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'dab657db15207879217fc81df4f875947bf68804', + ), + 'tecnickcom/tcpdf' => + array ( + 'replaced' => + array ( + 0 => '6.3.5', + ), + ), + 'twig/twig' => + array ( + 'pretty_version' => 'v1.42.4', + 'version' => '1.42.4.0', + 'aliases' => + array ( + ), + 'reference' => 'e587180584c3d2d6cb864a0454e777bb6dcb6152', + ), + ), +); +private static $canGetVendors; +private static $installedByVendor = array(); + + + + + + + +public static function getInstalledPackages() +{ +$packages = array(); +foreach (self::getInstalled() as $installed) { +$packages[] = array_keys($installed['versions']); +} + +if (1 === \count($packages)) { +return $packages[0]; +} + +return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); +} + + + + + + + + + +public static function isInstalled($packageName) +{ +foreach (self::getInstalled() as $installed) { +if (isset($installed['versions'][$packageName])) { +return true; +} +} + +return false; +} + + + + + + + + + + + + + + +public static function satisfies(VersionParser $parser, $packageName, $constraint) +{ +$constraint = $parser->parseConstraints($constraint); +$provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + +return $provided->matches($constraint); +} + + + + + + + + + + +public static function getVersionRanges($packageName) +{ +foreach (self::getInstalled() as $installed) { +if (!isset($installed['versions'][$packageName])) { +continue; +} + +$ranges = array(); +if (isset($installed['versions'][$packageName]['pretty_version'])) { +$ranges[] = $installed['versions'][$packageName]['pretty_version']; +} +if (array_key_exists('aliases', $installed['versions'][$packageName])) { +$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); +} +if (array_key_exists('replaced', $installed['versions'][$packageName])) { +$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); +} +if (array_key_exists('provided', $installed['versions'][$packageName])) { +$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); +} + +return implode(' || ', $ranges); +} + +throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); +} + + + + + +public static function getVersion($packageName) +{ +foreach (self::getInstalled() as $installed) { +if (!isset($installed['versions'][$packageName])) { +continue; +} + +if (!isset($installed['versions'][$packageName]['version'])) { +return null; +} + +return $installed['versions'][$packageName]['version']; +} + +throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); +} + + + + + +public static function getPrettyVersion($packageName) +{ +foreach (self::getInstalled() as $installed) { +if (!isset($installed['versions'][$packageName])) { +continue; +} + +if (!isset($installed['versions'][$packageName]['pretty_version'])) { +return null; +} + +return $installed['versions'][$packageName]['pretty_version']; +} + +throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); +} + + + + + +public static function getReference($packageName) +{ +foreach (self::getInstalled() as $installed) { +if (!isset($installed['versions'][$packageName])) { +continue; +} + +if (!isset($installed['versions'][$packageName]['reference'])) { +return null; +} + +return $installed['versions'][$packageName]['reference']; +} + +throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); +} + + + + + +public static function getRootPackage() +{ +$installed = self::getInstalled(); + +return $installed[0]['root']; +} + + + + + + + +public static function getRawData() +{ +return self::$installed; +} + + + + + + + + + + + + + + + + + + + +public static function reload($data) +{ +self::$installed = $data; +self::$installedByVendor = array(); +} + + + + + +private static function getInstalled() +{ +if (null === self::$canGetVendors) { +self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); +} + +$installed = array(); + +if (self::$canGetVendors) { +foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { +if (isset(self::$installedByVendor[$vendorDir])) { +$installed[] = self::$installedByVendor[$vendorDir]; +} elseif (is_file($vendorDir.'/composer/installed.php')) { +$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; +} +} +} + +$installed[] = self::$installed; + +return $installed; +} +} diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index ec8c6b1ef..d3c442c0d 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -152,6 +152,7 @@ return array( 'Combodo\\iTop\\DesignDocument' => $baseDir . '/core/designdocument.class.inc.php', 'Combodo\\iTop\\DesignElement' => $baseDir . '/core/designdocument.class.inc.php', 'Combodo\\iTop\\TwigExtension' => $baseDir . '/application/twigextension.class.inc.php', + 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'Config' => $baseDir . '/core/config.class.inc.php', 'ConfigException' => $baseDir . '/core/config.class.inc.php', 'ConfigPlaceholdersResolver' => $baseDir . '/core/config.class.inc.php', @@ -248,6 +249,7 @@ return array( 'ExecutionKPI' => $baseDir . '/core/kpi.class.inc.php', 'Expression' => $baseDir . '/core/oql/expression.class.inc.php', 'ExpressionCache' => $baseDir . '/core/expressioncache.class.inc.php', + 'ExpressionHelper' => $baseDir . '/core/oql/expression.class.inc.php', 'FalseExpression' => $baseDir . '/core/oql/expression.class.inc.php', 'FieldExpression' => $baseDir . '/core/oql/expression.class.inc.php', 'FieldExpressionResolved' => $baseDir . '/core/oql/expression.class.inc.php', @@ -328,7 +330,10 @@ return array( 'OQLMenuNode' => $baseDir . '/application/menunode.class.inc.php', 'OQLParser' => $baseDir . '/core/oql/oql-parser.php', 'OQLParserException' => $baseDir . '/core/oql/oql-parser.php', + 'OQLParserParseFailureException' => $baseDir . '/core/oql/oql-parser.php', 'OQLParserRaw' => $baseDir . '/core/oql/oql-parser.php', + 'OQLParserStackOverFlowException' => $baseDir . '/core/oql/oql-parser.php', + 'OQLParserSyntaxErrorException' => $baseDir . '/core/oql/oql-parser.php', 'OQLParser_yyStackEntry' => $baseDir . '/core/oql/oql-parser.php', 'OQLParser_yyToken' => $baseDir . '/core/oql/oql-parser.php', 'OS_Guess' => $vendorDir . '/pear/pear-core-minimal/src/OS/Guess.php', @@ -349,7 +354,6 @@ return array( 'PDFBulkExport' => $baseDir . '/core/pdfbulkexport.class.inc.php', 'PDFPage' => $baseDir . '/application/pdfpage.class.inc.php', 'PEAR' => $vendorDir . '/pear/pear-core-minimal/src/PEAR.php', - 'PEAR_Error' => $vendorDir . '/pear/pear-core-minimal/src/PEAR.php', 'PEAR_ErrorStack' => $vendorDir . '/pear/pear-core-minimal/src/PEAR/ErrorStack.php', 'PEAR_Exception' => $vendorDir . '/pear/pear_exception/PEAR/Exception.php', 'PHP_LexerGenerator' => $baseDir . '/core/oql/build/PHP/LexerGenerator.php', @@ -898,7 +902,6 @@ return array( 'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/TagAwareAdapter.php', 'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface' => $vendorDir . '/symfony/cache/Adapter/TagAwareAdapterInterface.php', 'Symfony\\Component\\Cache\\Adapter\\TraceableAdapter' => $vendorDir . '/symfony/cache/Adapter/TraceableAdapter.php', - 'Symfony\\Component\\Cache\\Adapter\\TraceableAdapterEvent' => $vendorDir . '/symfony/cache/Adapter/TraceableAdapter.php', 'Symfony\\Component\\Cache\\Adapter\\TraceableTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/TraceableTagAwareAdapter.php', 'Symfony\\Component\\Cache\\CacheItem' => $vendorDir . '/symfony/cache/CacheItem.php', 'Symfony\\Component\\Cache\\DataCollector\\CacheDataCollector' => $vendorDir . '/symfony/cache/DataCollector/CacheDataCollector.php', @@ -921,7 +924,6 @@ return array( 'Symfony\\Component\\Cache\\Simple\\Psr6Cache' => $vendorDir . '/symfony/cache/Simple/Psr6Cache.php', 'Symfony\\Component\\Cache\\Simple\\RedisCache' => $vendorDir . '/symfony/cache/Simple/RedisCache.php', 'Symfony\\Component\\Cache\\Simple\\TraceableCache' => $vendorDir . '/symfony/cache/Simple/TraceableCache.php', - 'Symfony\\Component\\Cache\\Simple\\TraceableCacheEvent' => $vendorDir . '/symfony/cache/Simple/TraceableCache.php', 'Symfony\\Component\\Cache\\Traits\\AbstractTrait' => $vendorDir . '/symfony/cache/Traits/AbstractTrait.php', 'Symfony\\Component\\Cache\\Traits\\ApcuTrait' => $vendorDir . '/symfony/cache/Traits/ApcuTrait.php', 'Symfony\\Component\\Cache\\Traits\\ArrayTrait' => $vendorDir . '/symfony/cache/Traits/ArrayTrait.php', @@ -1010,8 +1012,6 @@ return array( 'Symfony\\Component\\Config\\Resource\\FileResource' => $vendorDir . '/symfony/config/Resource/FileResource.php', 'Symfony\\Component\\Config\\Resource\\GlobResource' => $vendorDir . '/symfony/config/Resource/GlobResource.php', 'Symfony\\Component\\Config\\Resource\\ReflectionClassResource' => $vendorDir . '/symfony/config/Resource/ReflectionClassResource.php', - 'Symfony\\Component\\Config\\Resource\\ReflectionMethodHhvmWrapper' => $vendorDir . '/symfony/config/Resource/ReflectionClassResource.php', - 'Symfony\\Component\\Config\\Resource\\ReflectionParameterHhvmWrapper' => $vendorDir . '/symfony/config/Resource/ReflectionClassResource.php', 'Symfony\\Component\\Config\\Resource\\ResourceInterface' => $vendorDir . '/symfony/config/Resource/ResourceInterface.php', 'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceChecker' => $vendorDir . '/symfony/config/Resource/SelfCheckingResourceChecker.php', 'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceInterface' => $vendorDir . '/symfony/config/Resource/SelfCheckingResourceInterface.php', @@ -1188,8 +1188,6 @@ return array( 'Symfony\\Component\\DependencyInjection\\Compiler\\FactoryReturnTypePass' => $vendorDir . '/symfony/dependency-injection/Compiler/FactoryReturnTypePass.php', 'Symfony\\Component\\DependencyInjection\\Compiler\\InlineServiceDefinitionsPass' => $vendorDir . '/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php', 'Symfony\\Component\\DependencyInjection\\Compiler\\LoggingFormatter' => $vendorDir . '/symfony/dependency-injection/Compiler/LoggingFormatter.php', - 'Symfony\\Component\\DependencyInjection\\Compiler\\MergeExtensionConfigurationContainerBuilder' => $vendorDir . '/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php', - 'Symfony\\Component\\DependencyInjection\\Compiler\\MergeExtensionConfigurationParameterBag' => $vendorDir . '/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php', 'Symfony\\Component\\DependencyInjection\\Compiler\\MergeExtensionConfigurationPass' => $vendorDir . '/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php', 'Symfony\\Component\\DependencyInjection\\Compiler\\PassConfig' => $vendorDir . '/symfony/dependency-injection/Compiler/PassConfig.php', 'Symfony\\Component\\DependencyInjection\\Compiler\\PriorityTaggedServiceTrait' => $vendorDir . '/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php', @@ -1299,7 +1297,6 @@ return array( 'Symfony\\Component\\DependencyInjection\\Loader\\GlobFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/GlobFileLoader.php', 'Symfony\\Component\\DependencyInjection\\Loader\\IniFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/IniFileLoader.php', 'Symfony\\Component\\DependencyInjection\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/PhpFileLoader.php', - 'Symfony\\Component\\DependencyInjection\\Loader\\ProtectedPhpFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/PhpFileLoader.php', 'Symfony\\Component\\DependencyInjection\\Loader\\XmlFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/XmlFileLoader.php', 'Symfony\\Component\\DependencyInjection\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/dependency-injection/Loader/YamlFileLoader.php', 'Symfony\\Component\\DependencyInjection\\Parameter' => $vendorDir . '/symfony/dependency-injection/Parameter.php', @@ -1323,7 +1320,6 @@ return array( 'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php', 'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php', 'Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => $vendorDir . '/symfony/event-dispatcher/Debug/WrappedListener.php', - 'Symfony\\Component\\EventDispatcher\\DependencyInjection\\ExtractingEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php', 'Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => $vendorDir . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php', 'Symfony\\Component\\EventDispatcher\\Event' => $vendorDir . '/symfony/event-dispatcher/Event.php', 'Symfony\\Component\\EventDispatcher\\EventDispatcher' => $vendorDir . '/symfony/event-dispatcher/EventDispatcher.php', @@ -1591,7 +1587,6 @@ return array( 'Symfony\\Component\\Routing\\Loader\\GlobFileLoader' => $vendorDir . '/symfony/routing/Loader/GlobFileLoader.php', 'Symfony\\Component\\Routing\\Loader\\ObjectRouteLoader' => $vendorDir . '/symfony/routing/Loader/ObjectRouteLoader.php', 'Symfony\\Component\\Routing\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/routing/Loader/PhpFileLoader.php', - 'Symfony\\Component\\Routing\\Loader\\ProtectedPhpFileLoader' => $vendorDir . '/symfony/routing/Loader/PhpFileLoader.php', 'Symfony\\Component\\Routing\\Loader\\XmlFileLoader' => $vendorDir . '/symfony/routing/Loader/XmlFileLoader.php', 'Symfony\\Component\\Routing\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/routing/Loader/YamlFileLoader.php', 'Symfony\\Component\\Routing\\Matcher\\Dumper\\DumperCollection' => $vendorDir . '/symfony/routing/Matcher/Dumper/DumperCollection.php', @@ -2124,6 +2119,7 @@ return array( 'cmdbDataGenerator' => $baseDir . '/core/data.generator.class.inc.php', 'iApplicationObjectExtension' => $baseDir . '/application/applicationextension.inc.php', 'iApplicationUIExtension' => $baseDir . '/application/applicationextension.inc.php', + 'iAttributeNoGroupBy' => $baseDir . '/core/attributedef.class.inc.php', 'iBackgroundProcess' => $baseDir . '/core/backgroundprocess.inc.php', 'iDBObjectSetIterator' => $baseDir . '/core/dbobjectiterator.php', 'iDBObjectURLMaker' => $baseDir . '/application/applicationcontext.class.inc.php', diff --git a/lib/composer/autoload_real.php b/lib/composer/autoload_real.php index e8c595bf1..661cd2543 100644 --- a/lib/composer/autoload_real.php +++ b/lib/composer/autoload_real.php @@ -13,14 +13,19 @@ class ComposerAutoloaderInit0018331147de7601e7552f7da8e3bb8b } } + /** + * @return \Composer\Autoload\ClassLoader + */ public static function getLoader() { if (null !== self::$loader) { return self::$loader; } + require __DIR__ . '/platform_check.php'; + spl_autoload_register(array('ComposerAutoloaderInit0018331147de7601e7552f7da8e3bb8b', 'loadClassLoader'), true, true); - self::$loader = $loader = new \Composer\Autoload\ClassLoader(); + self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__))); spl_autoload_unregister(array('ComposerAutoloaderInit0018331147de7601e7552f7da8e3bb8b', 'loadClassLoader')); $includePaths = require __DIR__ . '/include_paths.php'; @@ -29,7 +34,7 @@ class ComposerAutoloaderInit0018331147de7601e7552f7da8e3bb8b $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { - require_once __DIR__ . '/autoload_static.php'; + require __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInit0018331147de7601e7552f7da8e3bb8b::getInitializer($loader)); } else { diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index 456be1c42..502ed9369 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -382,6 +382,7 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'Combodo\\iTop\\DesignDocument' => __DIR__ . '/../..' . '/core/designdocument.class.inc.php', 'Combodo\\iTop\\DesignElement' => __DIR__ . '/../..' . '/core/designdocument.class.inc.php', 'Combodo\\iTop\\TwigExtension' => __DIR__ . '/../..' . '/application/twigextension.class.inc.php', + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'Config' => __DIR__ . '/../..' . '/core/config.class.inc.php', 'ConfigException' => __DIR__ . '/../..' . '/core/config.class.inc.php', 'ConfigPlaceholdersResolver' => __DIR__ . '/../..' . '/core/config.class.inc.php', @@ -478,6 +479,7 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'ExecutionKPI' => __DIR__ . '/../..' . '/core/kpi.class.inc.php', 'Expression' => __DIR__ . '/../..' . '/core/oql/expression.class.inc.php', 'ExpressionCache' => __DIR__ . '/../..' . '/core/expressioncache.class.inc.php', + 'ExpressionHelper' => __DIR__ . '/../..' . '/core/oql/expression.class.inc.php', 'FalseExpression' => __DIR__ . '/../..' . '/core/oql/expression.class.inc.php', 'FieldExpression' => __DIR__ . '/../..' . '/core/oql/expression.class.inc.php', 'FieldExpressionResolved' => __DIR__ . '/../..' . '/core/oql/expression.class.inc.php', @@ -558,7 +560,10 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'OQLMenuNode' => __DIR__ . '/../..' . '/application/menunode.class.inc.php', 'OQLParser' => __DIR__ . '/../..' . '/core/oql/oql-parser.php', 'OQLParserException' => __DIR__ . '/../..' . '/core/oql/oql-parser.php', + 'OQLParserParseFailureException' => __DIR__ . '/../..' . '/core/oql/oql-parser.php', 'OQLParserRaw' => __DIR__ . '/../..' . '/core/oql/oql-parser.php', + 'OQLParserStackOverFlowException' => __DIR__ . '/../..' . '/core/oql/oql-parser.php', + 'OQLParserSyntaxErrorException' => __DIR__ . '/../..' . '/core/oql/oql-parser.php', 'OQLParser_yyStackEntry' => __DIR__ . '/../..' . '/core/oql/oql-parser.php', 'OQLParser_yyToken' => __DIR__ . '/../..' . '/core/oql/oql-parser.php', 'OS_Guess' => __DIR__ . '/..' . '/pear/pear-core-minimal/src/OS/Guess.php', @@ -579,7 +584,6 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'PDFBulkExport' => __DIR__ . '/../..' . '/core/pdfbulkexport.class.inc.php', 'PDFPage' => __DIR__ . '/../..' . '/application/pdfpage.class.inc.php', 'PEAR' => __DIR__ . '/..' . '/pear/pear-core-minimal/src/PEAR.php', - 'PEAR_Error' => __DIR__ . '/..' . '/pear/pear-core-minimal/src/PEAR.php', 'PEAR_ErrorStack' => __DIR__ . '/..' . '/pear/pear-core-minimal/src/PEAR/ErrorStack.php', 'PEAR_Exception' => __DIR__ . '/..' . '/pear/pear_exception/PEAR/Exception.php', 'PHP_LexerGenerator' => __DIR__ . '/../..' . '/core/oql/build/PHP/LexerGenerator.php', @@ -1128,7 +1132,6 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TagAwareAdapter.php', 'Symfony\\Component\\Cache\\Adapter\\TagAwareAdapterInterface' => __DIR__ . '/..' . '/symfony/cache/Adapter/TagAwareAdapterInterface.php', 'Symfony\\Component\\Cache\\Adapter\\TraceableAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TraceableAdapter.php', - 'Symfony\\Component\\Cache\\Adapter\\TraceableAdapterEvent' => __DIR__ . '/..' . '/symfony/cache/Adapter/TraceableAdapter.php', 'Symfony\\Component\\Cache\\Adapter\\TraceableTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/TraceableTagAwareAdapter.php', 'Symfony\\Component\\Cache\\CacheItem' => __DIR__ . '/..' . '/symfony/cache/CacheItem.php', 'Symfony\\Component\\Cache\\DataCollector\\CacheDataCollector' => __DIR__ . '/..' . '/symfony/cache/DataCollector/CacheDataCollector.php', @@ -1151,7 +1154,6 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'Symfony\\Component\\Cache\\Simple\\Psr6Cache' => __DIR__ . '/..' . '/symfony/cache/Simple/Psr6Cache.php', 'Symfony\\Component\\Cache\\Simple\\RedisCache' => __DIR__ . '/..' . '/symfony/cache/Simple/RedisCache.php', 'Symfony\\Component\\Cache\\Simple\\TraceableCache' => __DIR__ . '/..' . '/symfony/cache/Simple/TraceableCache.php', - 'Symfony\\Component\\Cache\\Simple\\TraceableCacheEvent' => __DIR__ . '/..' . '/symfony/cache/Simple/TraceableCache.php', 'Symfony\\Component\\Cache\\Traits\\AbstractTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/AbstractTrait.php', 'Symfony\\Component\\Cache\\Traits\\ApcuTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ApcuTrait.php', 'Symfony\\Component\\Cache\\Traits\\ArrayTrait' => __DIR__ . '/..' . '/symfony/cache/Traits/ArrayTrait.php', @@ -1240,8 +1242,6 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'Symfony\\Component\\Config\\Resource\\FileResource' => __DIR__ . '/..' . '/symfony/config/Resource/FileResource.php', 'Symfony\\Component\\Config\\Resource\\GlobResource' => __DIR__ . '/..' . '/symfony/config/Resource/GlobResource.php', 'Symfony\\Component\\Config\\Resource\\ReflectionClassResource' => __DIR__ . '/..' . '/symfony/config/Resource/ReflectionClassResource.php', - 'Symfony\\Component\\Config\\Resource\\ReflectionMethodHhvmWrapper' => __DIR__ . '/..' . '/symfony/config/Resource/ReflectionClassResource.php', - 'Symfony\\Component\\Config\\Resource\\ReflectionParameterHhvmWrapper' => __DIR__ . '/..' . '/symfony/config/Resource/ReflectionClassResource.php', 'Symfony\\Component\\Config\\Resource\\ResourceInterface' => __DIR__ . '/..' . '/symfony/config/Resource/ResourceInterface.php', 'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceChecker' => __DIR__ . '/..' . '/symfony/config/Resource/SelfCheckingResourceChecker.php', 'Symfony\\Component\\Config\\Resource\\SelfCheckingResourceInterface' => __DIR__ . '/..' . '/symfony/config/Resource/SelfCheckingResourceInterface.php', @@ -1418,8 +1418,6 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'Symfony\\Component\\DependencyInjection\\Compiler\\FactoryReturnTypePass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/FactoryReturnTypePass.php', 'Symfony\\Component\\DependencyInjection\\Compiler\\InlineServiceDefinitionsPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php', 'Symfony\\Component\\DependencyInjection\\Compiler\\LoggingFormatter' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/LoggingFormatter.php', - 'Symfony\\Component\\DependencyInjection\\Compiler\\MergeExtensionConfigurationContainerBuilder' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php', - 'Symfony\\Component\\DependencyInjection\\Compiler\\MergeExtensionConfigurationParameterBag' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php', 'Symfony\\Component\\DependencyInjection\\Compiler\\MergeExtensionConfigurationPass' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php', 'Symfony\\Component\\DependencyInjection\\Compiler\\PassConfig' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/PassConfig.php', 'Symfony\\Component\\DependencyInjection\\Compiler\\PriorityTaggedServiceTrait' => __DIR__ . '/..' . '/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php', @@ -1529,7 +1527,6 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'Symfony\\Component\\DependencyInjection\\Loader\\GlobFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/GlobFileLoader.php', 'Symfony\\Component\\DependencyInjection\\Loader\\IniFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/IniFileLoader.php', 'Symfony\\Component\\DependencyInjection\\Loader\\PhpFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/PhpFileLoader.php', - 'Symfony\\Component\\DependencyInjection\\Loader\\ProtectedPhpFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/PhpFileLoader.php', 'Symfony\\Component\\DependencyInjection\\Loader\\XmlFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/XmlFileLoader.php', 'Symfony\\Component\\DependencyInjection\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/dependency-injection/Loader/YamlFileLoader.php', 'Symfony\\Component\\DependencyInjection\\Parameter' => __DIR__ . '/..' . '/symfony/dependency-injection/Parameter.php', @@ -1553,7 +1550,6 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php', 'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcherInterface' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/TraceableEventDispatcherInterface.php', 'Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => __DIR__ . '/..' . '/symfony/event-dispatcher/Debug/WrappedListener.php', - 'Symfony\\Component\\EventDispatcher\\DependencyInjection\\ExtractingEventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php', 'Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => __DIR__ . '/..' . '/symfony/event-dispatcher/DependencyInjection/RegisterListenersPass.php', 'Symfony\\Component\\EventDispatcher\\Event' => __DIR__ . '/..' . '/symfony/event-dispatcher/Event.php', 'Symfony\\Component\\EventDispatcher\\EventDispatcher' => __DIR__ . '/..' . '/symfony/event-dispatcher/EventDispatcher.php', @@ -1821,7 +1817,6 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'Symfony\\Component\\Routing\\Loader\\GlobFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/GlobFileLoader.php', 'Symfony\\Component\\Routing\\Loader\\ObjectRouteLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/ObjectRouteLoader.php', 'Symfony\\Component\\Routing\\Loader\\PhpFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/PhpFileLoader.php', - 'Symfony\\Component\\Routing\\Loader\\ProtectedPhpFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/PhpFileLoader.php', 'Symfony\\Component\\Routing\\Loader\\XmlFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/XmlFileLoader.php', 'Symfony\\Component\\Routing\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/routing/Loader/YamlFileLoader.php', 'Symfony\\Component\\Routing\\Matcher\\Dumper\\DumperCollection' => __DIR__ . '/..' . '/symfony/routing/Matcher/Dumper/DumperCollection.php', @@ -2354,6 +2349,7 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'cmdbDataGenerator' => __DIR__ . '/../..' . '/core/data.generator.class.inc.php', 'iApplicationObjectExtension' => __DIR__ . '/../..' . '/application/applicationextension.inc.php', 'iApplicationUIExtension' => __DIR__ . '/../..' . '/application/applicationextension.inc.php', + 'iAttributeNoGroupBy' => __DIR__ . '/../..' . '/core/attributedef.class.inc.php', 'iBackgroundProcess' => __DIR__ . '/../..' . '/core/backgroundprocess.inc.php', 'iDBObjectSetIterator' => __DIR__ . '/../..' . '/core/dbobjectiterator.php', 'iDBObjectURLMaker' => __DIR__ . '/../..' . '/application/applicationcontext.class.inc.php', diff --git a/lib/composer/include_paths.php b/lib/composer/include_paths.php index d4fb96718..507c1ade7 100644 --- a/lib/composer/include_paths.php +++ b/lib/composer/include_paths.php @@ -6,8 +6,8 @@ $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( - $vendorDir . '/pear/archive_tar', $vendorDir . '/pear/console_getopt', $vendorDir . '/pear/pear-core-minimal/src', $vendorDir . '/pear/pear_exception', + $vendorDir . '/pear/archive_tar', ); diff --git a/lib/composer/installed.json b/lib/composer/installed.json index 508b402a5..ab7210483 100644 --- a/lib/composer/installed.json +++ b/lib/composer/installed.json @@ -1,2649 +1,2713 @@ -[ - { - "name": "combodo/tcpdf", - "version": "6.3.5", - "version_normalized": "6.3.5.0", - "source": { - "type": "git", - "url": "https://github.com/combodo-itop-libs/TCPDF.git", - "reference": "aedd4b7b8cf7fcc24e617c405c9d3304150f4b94" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/combodo-itop-libs/TCPDF/zipball/aedd4b7b8cf7fcc24e617c405c9d3304150f4b94", - "reference": "aedd4b7b8cf7fcc24e617c405c9d3304150f4b94", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "replace": { - "tecnickcom/tcpdf": "self.version" - }, - "time": "2020-09-28T12:19:09+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "classmap": [ - "config", - "include", - "tcpdf.php", - "tcpdf_parser.php", - "tcpdf_import.php", - "tcpdf_barcodes_1d.php", - "tcpdf_barcodes_2d.php", - "include/tcpdf_colors.php", - "include/tcpdf_filters.php", - "include/tcpdf_font_data.php", - "include/tcpdf_fonts.php", - "include/tcpdf_images.php", - "include/tcpdf_static.php", - "include/barcodes/datamatrix.php", - "include/barcodes/pdf417.php", - "include/barcodes/qrcode.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-only" - ], - "authors": [ - { - "name": "Nicola Asuni", - "email": "info@tecnick.com", - "role": "lead" +{ + "packages": [ + { + "name": "combodo/tcpdf", + "version": "6.3.5", + "version_normalized": "6.3.5.0", + "source": { + "type": "git", + "url": "https://github.com/combodo-itop-libs/TCPDF.git", + "reference": "aedd4b7b8cf7fcc24e617c405c9d3304150f4b94" }, - { - "name": "Combodo", - "email": "contact@combodo.com" - } - ], - "description": "TCPDF fork adding requirements for iTop: Specific fonts.", - "homepage": "https://github.com/combodo-itop-libs/TCPDF" - }, - { - "name": "nikic/php-parser", - "version": "v3.1.5", - "version_normalized": "3.1.5.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/bb87e28e7d7b8d9a7fda231d37457c9210faf6ce", - "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "~4.0|~5.0" - }, - "time": "2018-02-28T20:30:58+00:00", - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ] - }, - { - "name": "paragonie/random_compat", - "version": "v2.0.18", - "version_normalized": "2.0.18.0", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/0a58ef6e3146256cc3dc7cc393927bcc7d1b72db", - "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db", - "shasum": "" - }, - "require": { - "php": ">=5.2.0" - }, - "require-dev": { - "phpunit/phpunit": "4.*|5.*" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "time": "2019-01-03T20:59:08+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "lib/random.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" - ] - }, - { - "name": "pear/archive_tar", - "version": "1.4.10", - "version_normalized": "1.4.10.0", - "source": { - "type": "git", - "url": "https://github.com/pear/Archive_Tar.git", - "reference": "bbb4f10f71a1da2715ec6d9a683f4f23c507a49b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/bbb4f10f71a1da2715ec6d9a683f4f23c507a49b", - "reference": "bbb4f10f71a1da2715ec6d9a683f4f23c507a49b", - "shasum": "" - }, - "require": { - "pear/pear-core-minimal": "^1.10.0alpha2", - "php": ">=5.2.0" - }, - "require-dev": { - "phpunit/phpunit": "*" - }, - "suggest": { - "ext-bz2": "Bz2 compression support.", - "ext-xz": "Lzma2 compression support.", - "ext-zlib": "Gzip compression support." - }, - "time": "2020-09-15T14:13:23+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "Archive_Tar": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "./" - ], - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Vincent Blavet", - "email": "vincent@phpconcept.net" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/combodo-itop-libs/TCPDF/zipball/aedd4b7b8cf7fcc24e617c405c9d3304150f4b94", + "reference": "aedd4b7b8cf7fcc24e617c405c9d3304150f4b94", + "shasum": "" }, - { - "name": "Greg Beaver", - "email": "greg@chiaraquartet.net" + "require": { + "php": ">=5.3.0" }, - { - "name": "Michiel Rook", - "email": "mrook@php.net" - } - ], - "description": "Tar file management class with compression support (gzip, bzip2, lzma2)", - "homepage": "https://github.com/pear/Archive_Tar", - "keywords": [ - "archive", - "tar" - ] - }, - { - "name": "pear/console_getopt", - "version": "v1.4.3", - "version_normalized": "1.4.3.0", - "source": { - "type": "git", - "url": "https://github.com/pear/Console_Getopt.git", - "reference": "a41f8d3e668987609178c7c4a9fe48fecac53fa0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pear/Console_Getopt/zipball/a41f8d3e668987609178c7c4a9fe48fecac53fa0", - "reference": "a41f8d3e668987609178c7c4a9fe48fecac53fa0", - "shasum": "" - }, - "time": "2019-11-20T18:27:48+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-0": { - "Console": "./" - } - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "./" - ], - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Andrei Zmievski", - "email": "andrei@php.net", - "role": "Lead" + "replace": { + "tecnickcom/tcpdf": "self.version" }, - { - "name": "Stig Bakken", - "email": "stig@php.net", - "role": "Developer" + "time": "2020-09-28T12:19:09+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "config", + "include", + "tcpdf.php", + "tcpdf_parser.php", + "tcpdf_import.php", + "tcpdf_barcodes_1d.php", + "tcpdf_barcodes_2d.php", + "include/tcpdf_colors.php", + "include/tcpdf_filters.php", + "include/tcpdf_font_data.php", + "include/tcpdf_fonts.php", + "include/tcpdf_images.php", + "include/tcpdf_static.php", + "include/barcodes/datamatrix.php", + "include/barcodes/pdf417.php", + "include/barcodes/qrcode.php" + ] }, - { - "name": "Greg Beaver", - "email": "cellog@php.net", - "role": "Helper" - } - ], - "description": "More info available on: http://pear.php.net/package/Console_Getopt" - }, - { - "name": "pear/pear-core-minimal", - "version": "v1.10.10", - "version_normalized": "1.10.10.0", - "source": { - "type": "git", - "url": "https://github.com/pear/pear-core-minimal.git", - "reference": "625a3c429d9b2c1546438679074cac1b089116a7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/625a3c429d9b2c1546438679074cac1b089116a7", - "reference": "625a3c429d9b2c1546438679074cac1b089116a7", - "shasum": "" - }, - "require": { - "pear/console_getopt": "~1.4", - "pear/pear_exception": "~1.0" - }, - "replace": { - "rsky/pear-core-min": "self.version" - }, - "time": "2019-11-19T19:00:24+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-0": { - "": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "src/" - ], - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Christian Weiske", - "email": "cweiske@php.net", - "role": "Lead" - } - ], - "description": "Minimal set of PEAR core files to be used as composer dependency" - }, - { - "name": "pear/pear_exception", - "version": "v1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/pear/PEAR_Exception.git", - "reference": "dbb42a5a0e45f3adcf99babfb2a1ba77b8ac36a7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pear/PEAR_Exception/zipball/dbb42a5a0e45f3adcf99babfb2a1ba77b8ac36a7", - "reference": "dbb42a5a0e45f3adcf99babfb2a1ba77b8ac36a7", - "shasum": "" - }, - "require": { - "php": ">=4.4.0" - }, - "require-dev": { - "phpunit/phpunit": "*" - }, - "time": "2019-12-10T10:24:42+00:00", - "type": "class", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "PEAR/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "." - ], - "license": [ - "BSD-2-Clause" - ], - "authors": [ - { - "name": "Helgi Thormar", - "email": "dufuz@php.net" - }, - { - "name": "Greg Beaver", - "email": "cellog@php.net" - } - ], - "description": "The PEAR Exception base class.", - "homepage": "https://github.com/pear/PEAR_Exception", - "keywords": [ - "exception" - ] - }, - { - "name": "pelago/emogrifier", - "version": "v2.1.0", - "version_normalized": "2.1.0.0", - "source": { - "type": "git", - "url": "https://github.com/MyIntervals/emogrifier.git", - "reference": "40c3d4f475d44ffc7265a760d1dd0e81f579f96f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/MyIntervals/emogrifier/zipball/40c3d4f475d44ffc7265a760d1dd0e81f579f96f", - "reference": "40c3d4f475d44ffc7265a760d1dd0e81f579f96f", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "php": "^5.5.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0", - "symfony/css-selector": "^3.4.0 || ^4.0.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.2.0", - "phpmd/phpmd": "^2.6.0", - "phpunit/phpunit": "^4.8.0", - "squizlabs/php_codesniffer": "^3.3.2" - }, - "time": "2018-12-08T13:55:46+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Pelago\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Reeve", - "email": "jreeve@pelagodesign.com" - }, - { - "name": "Cameron Brooks" - }, - { - "name": "Jaime Prado" - }, - { - "name": "Oliver Klee", - "email": "github@oliverklee.de" - }, - { - "name": "Zoli Szabó", - "email": "zoli.szabo+github@gmail.com" - }, - { - "name": "Jake Hotson", - "email": "jake@qzdesign.co.uk" - } - ], - "description": "Converts CSS styles into inline style attributes in your HTML code", - "homepage": "https://www.myintervals.com/emogrifier.php", - "keywords": [ - "css", - "email", - "pre-processing" - ] - }, - { - "name": "psr/cache", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2016-08-06T20:24:11+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ] - }, - { - "name": "psr/container", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2017-02-14T16:28:37+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ] - }, - { - "name": "psr/log", - "version": "1.1.2", - "version_normalized": "1.1.2.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", - "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2019-11-01T11:05:21+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ] - }, - { - "name": "psr/simple-cache", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2017-10-23T01:57:42+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ] - }, - { - "name": "scssphp/scssphp", - "version": "1.0.6", - "version_normalized": "1.0.6.0", - "source": { - "type": "git", - "url": "https://github.com/scssphp/scssphp.git", - "reference": "5b3c9d704950d8f9637f5110c36c281ec47dc13c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/scssphp/scssphp/zipball/5b3c9d704950d8f9637f5110c36c281ec47dc13c", - "reference": "5b3c9d704950d8f9637f5110c36c281ec47dc13c", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "php": ">=5.6.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3", - "squizlabs/php_codesniffer": "~2.5", - "twbs/bootstrap": "~4.3", - "zurb/foundation": "~6.5" - }, - "time": "2019-12-12T05:00:52+00:00", - "bin": [ - "bin/pscss" - ], - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "ScssPhp\\ScssPhp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Anthon Pang", - "email": "apang@softwaredevelopment.ca", - "homepage": "https://github.com/robocoder" - }, - { - "name": "Cédric Morin", - "email": "cedric@yterium.com", - "homepage": "https://github.com/Cerdic" - } - ], - "description": "scssphp is a compiler for SCSS written in PHP.", - "homepage": "http://scssphp.github.io/scssphp/", - "keywords": [ - "css", - "less", - "sass", - "scss", - "stylesheet" - ] - }, - { - "name": "swiftmailer/swiftmailer", - "version": "v5.4.12", - "version_normalized": "5.4.12.0", - "source": { - "type": "git", - "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "181b89f18a90f8925ef805f950d47a7190e9b950" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/181b89f18a90f8925ef805f950d47a7190e9b950", - "reference": "181b89f18a90f8925ef805f950d47a7190e9b950", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "mockery/mockery": "~0.9.1", - "symfony/phpunit-bridge": "~3.2" - }, - "time": "2018-07-31T09:26:32+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "lib/swift_required.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Corbyn" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "https://swiftmailer.symfony.com", - "keywords": [ - "email", - "mail", - "mailer" - ] - }, - { - "name": "symfony/cache", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "3d9f46a6960fd5cd7f030f86adc5b4b63bcfa4e3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/3d9f46a6960fd5cd7f030f86adc5b4b63bcfa4e3", - "reference": "3d9f46a6960fd5cd7f030f86adc5b4b63bcfa4e3", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "psr/cache": "~1.0", - "psr/log": "~1.0", - "psr/simple-cache": "^1.0", - "symfony/polyfill-apcu": "~1.1" - }, - "conflict": { - "symfony/var-dumper": "<3.3" - }, - "provide": { - "psr/cache-implementation": "1.0", - "psr/simple-cache-implementation": "1.0" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/cache": "~1.6", - "doctrine/dbal": "~2.4", - "predis/predis": "~1.0" - }, - "time": "2019-12-01T10:45:41+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Cache\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Cache component with PSR-6, PSR-16, and tags", - "homepage": "https://symfony.com", - "keywords": [ - "caching", - "psr6" - ] - }, - { - "name": "symfony/class-loader", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/class-loader.git", - "reference": "e212b06996819a2bce026a63da03b7182d05a690" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/class-loader/zipball/e212b06996819a2bce026a63da03b7182d05a690", - "reference": "e212b06996819a2bce026a63da03b7182d05a690", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "require-dev": { - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/polyfill-apcu": "~1.1" - }, - "suggest": { - "symfony/polyfill-apcu": "For using ApcClassLoader on HHVM" - }, - "time": "2019-08-20T13:31:17+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\ClassLoader\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony ClassLoader Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/config", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "a599a867d0e4a07c342b5f1e656b3915a540ddbe" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/a599a867d0e4a07c342b5f1e656b3915a540ddbe", - "reference": "a599a867d0e4a07c342b5f1e656b3915a540ddbe", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/filesystem": "~2.8|~3.0|~4.0", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/dependency-injection": "<3.3", - "symfony/finder": "<3.3" - }, - "require-dev": { - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/event-dispatcher": "~3.3|~4.0", - "symfony/finder": "~3.3|~4.0", - "symfony/yaml": "~3.0|~4.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, - "time": "2019-12-01T10:45:41+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Config Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/console", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "1ee23b3b659b06c622f2bd2492a229e416eb4586" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/1ee23b3b659b06c622f2bd2492a229e416eb4586", - "reference": "1ee23b3b659b06c622f2bd2492a229e416eb4586", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/process": "<3.3" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~3.3|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.3|~4.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "time": "2019-12-01T10:04:45+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/css-selector", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/css-selector.git", - "reference": "f819f71ae3ba6f396b4c015bd5895de7d2f1f85f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/f819f71ae3ba6f396b4c015bd5895de7d2f1f85f", - "reference": "f819f71ae3ba6f396b4c015bd5895de7d2f1f85f", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "time": "2019-10-01T11:57:37+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\CssSelector\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony CssSelector Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/debug", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "f72e33fdb1170b326e72c3157f0cd456351dd086" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/f72e33fdb1170b326e72c3157f0cd456351dd086", - "reference": "f72e33fdb1170b326e72c3157f0cd456351dd086", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "psr/log": "~1.0" - }, - "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" - }, - "require-dev": { - "symfony/http-kernel": "~2.8|~3.0|~4.0" - }, - "time": "2019-10-24T15:33:53+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Debug\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Debug Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/dependency-injection", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "0d201916bfb3af939fec3c0c8815ea16c60ac1a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/0d201916bfb3af939fec3c0c8815ea16c60ac1a2", - "reference": "0d201916bfb3af939fec3c0c8815ea16c60ac1a2", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "psr/container": "^1.0" - }, - "conflict": { - "symfony/config": "<3.3.7", - "symfony/finder": "<3.3", - "symfony/proxy-manager-bridge": "<3.4", - "symfony/yaml": "<3.4" - }, - "provide": { - "psr/container-implementation": "1.0" - }, - "require-dev": { - "symfony/config": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/yaml": "~3.4|~4.0" - }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" - }, - "time": "2019-12-01T08:33:36+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DependencyInjection Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/dotenv", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/dotenv.git", - "reference": "c7e8e471fea74e868ae797970b383dea89ae548a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/c7e8e471fea74e868ae797970b383dea89ae548a", - "reference": "c7e8e471fea74e868ae797970b383dea89ae548a", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "require-dev": { - "symfony/process": "^3.4.2|^4.0" - }, - "time": "2019-10-18T10:00:34+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Dotenv\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Registers environment variables from a .env file", - "homepage": "https://symfony.com", - "keywords": [ - "dotenv", - "env", - "environment" - ] - }, - { - "name": "symfony/event-dispatcher", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "f9031c22ec127d4a2450760f81a8677fe8a10177" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f9031c22ec127d4a2450760f81a8677fe8a10177", - "reference": "f9031c22ec127d4a2450760f81a8677fe8a10177", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "conflict": { - "symfony/dependency-injection": "<3.3" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "time": "2019-10-24T15:33:53+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/filesystem", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "00cdad0936d06fab136944bc2342b762b1c3a4a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/00cdad0936d06fab136944bc2342b762b1c3a4a2", - "reference": "00cdad0936d06fab136944bc2342b762b1c3a4a2", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-ctype": "~1.8" - }, - "time": "2019-11-25T16:36:22+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Filesystem Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/finder", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "290ae21279b37bfd287cdcce640d51204e84afdf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/290ae21279b37bfd287cdcce640d51204e84afdf", - "reference": "290ae21279b37bfd287cdcce640d51204e84afdf", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "time": "2019-11-17T21:55:15+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Finder Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/framework-bundle", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/framework-bundle.git", - "reference": "0d61117c7a770da0bd8bbe7ccfa34d8063f272ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/0d61117c7a770da0bd8bbe7ccfa34d8063f272ea", - "reference": "0d61117c7a770da0bd8bbe7ccfa34d8063f272ea", - "shasum": "" - }, - "require": { - "ext-xml": "*", - "php": "^5.5.9|>=7.0.8", - "symfony/cache": "~3.4.31|^4.3.4", - "symfony/class-loader": "~3.2", - "symfony/config": "^3.4.31|^4.3.4", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "^3.4.24|^4.2.5", - "symfony/event-dispatcher": "~3.4|~4.0", - "symfony/filesystem": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "^3.4.13|~4.3", - "symfony/http-kernel": "^3.4.31|^4.3.4", - "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "^3.4.5|^4.0.5" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "<3.0", - "phpdocumentor/type-resolver": "<0.2.1", - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", - "symfony/asset": "<3.3", - "symfony/console": "<3.4", - "symfony/form": "<3.4", - "symfony/property-info": "<3.3", - "symfony/serializer": "<3.3", - "symfony/stopwatch": "<3.4", - "symfony/translation": "<3.4", - "symfony/validator": "<3.4", - "symfony/workflow": "<3.3" - }, - "require-dev": { - "doctrine/annotations": "~1.7", - "doctrine/cache": "~1.0", - "fig/link-util": "^1.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0", - "symfony/asset": "~3.3|~4.0", - "symfony/browser-kit": "~2.8|~3.0|~4.0", - "symfony/console": "~3.4.31|^4.3.4", - "symfony/css-selector": "~2.8|~3.0|~4.0", - "symfony/dom-crawler": "~2.8|~3.0|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/form": "^3.4.31|^4.3.4", - "symfony/lock": "~3.4|~4.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "~2.8|~3.0|~4.0", - "symfony/property-info": "~3.3|~4.0", - "symfony/security-core": "~3.2|~4.0", - "symfony/security-csrf": "^2.8.31|^3.3.13|~4.0", - "symfony/serializer": "~3.3|~4.0", - "symfony/stopwatch": "~3.4|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/translation": "~3.4|~4.0", - "symfony/validator": "~3.4|~4.0", - "symfony/var-dumper": "~3.3|~4.0", - "symfony/web-link": "~3.3|~4.0", - "symfony/workflow": "~3.3|~4.0", - "symfony/yaml": "~3.2|~4.0", - "twig/twig": "~1.34|~2.4" - }, - "suggest": { - "ext-apcu": "For best performance of the system caches", - "symfony/console": "For using the console commands", - "symfony/form": "For using forms", - "symfony/property-info": "For using the property_info service", - "symfony/serializer": "For using the serializer service", - "symfony/validator": "For using validation", - "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", - "symfony/yaml": "For using the debug:config and lint:yaml commands" - }, - "time": "2019-11-23T20:30:33+00:00", - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\FrameworkBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony FrameworkBundle", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/http-foundation", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "d2d0cfe8e319d9df44c4cca570710fcf221d4593" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d2d0cfe8e319d9df44c4cca570710fcf221d4593", - "reference": "d2d0cfe8e319d9df44c4cca570710fcf221d4593", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php70": "~1.6" - }, - "require-dev": { - "symfony/expression-language": "~2.8|~3.0|~4.0" - }, - "time": "2019-11-28T12:52:59+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony HttpFoundation Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/http-kernel", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "c42c8339acb28cfff0fb1786948db4d23d609ff7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/c42c8339acb28cfff0fb1786948db4d23d609ff7", - "reference": "c42c8339acb28cfff0fb1786948db4d23d609ff7", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "psr/log": "~1.0", - "symfony/debug": "^3.3.3|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~3.4.12|~4.0.12|^4.1.1", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php56": "~1.8" - }, - "conflict": { - "symfony/config": "<2.8", - "symfony/dependency-injection": "<3.4.10|<4.0.10,>=4", - "symfony/var-dumper": "<3.3", - "twig/twig": "<1.34|<2.4,>=2" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/cache": "~1.0", - "symfony/browser-kit": "~2.8|~3.0|~4.0", - "symfony/class-loader": "~2.8|~3.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/console": "~2.8|~3.0|~4.0", - "symfony/css-selector": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "^3.4.10|^4.0.10", - "symfony/dom-crawler": "~2.8|~3.0|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/process": "~2.8|~3.0|~4.0", - "symfony/routing": "~3.4|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/translation": "~2.8|~3.0|~4.0", - "symfony/var-dumper": "~3.3|~4.0" - }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "", - "symfony/finder": "", - "symfony/var-dumper": "" - }, - "time": "2019-12-01T13:50:37+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony HttpKernel Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/polyfill-apcu", - "version": "v1.13.1", - "version_normalized": "1.13.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-apcu.git", - "reference": "a8e961c841b9ec52927a87914f8820a1ad8f8116" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/a8e961c841b9ec52927a87914f8820a1ad8f8116", - "reference": "a8e961c841b9ec52927a87914f8820a1ad8f8116", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "time": "2019-11-27T13:56:44+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.13-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Apcu\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting apcu_* functions to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "apcu", - "compatibility", - "polyfill", - "portable", - "shim" - ] - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.13.1", - "version_normalized": "1.13.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", - "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "time": "2019-11-27T13:56:44+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.13-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ] - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.13.1", - "version_normalized": "1.13.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f", - "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "time": "2019-11-27T14:18:11+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.13-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ] - }, - { - "name": "symfony/polyfill-php56", - "version": "v1.13.1", - "version_normalized": "1.13.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php56.git", - "reference": "53dd1cdf3cb986893ccf2b96665b25b3abb384f4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/53dd1cdf3cb986893ccf2b96665b25b3abb384f4", - "reference": "53dd1cdf3cb986893ccf2b96665b25b3abb384f4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "symfony/polyfill-util": "~1.0" - }, - "time": "2019-11-27T13:56:44+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.13-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php56\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ] - }, - { - "name": "symfony/polyfill-php70", - "version": "v1.13.1", - "version_normalized": "1.13.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "af23c7bb26a73b850840823662dda371484926c4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/af23c7bb26a73b850840823662dda371484926c4", - "reference": "af23c7bb26a73b850840823662dda371484926c4", - "shasum": "" - }, - "require": { - "paragonie/random_compat": "~1.0|~2.0|~9.99", - "php": ">=5.3.3" - }, - "time": "2019-11-27T13:56:44+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.13-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php70\\": "" - }, - "files": [ - "bootstrap.php" + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-only" ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ] - }, - { - "name": "symfony/polyfill-util", - "version": "v1.13.1", - "version_normalized": "1.13.1.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-util.git", - "reference": "964a67f293b66b95883a5ed918a65354fcd2258f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/964a67f293b66b95883a5ed918a65354fcd2258f", - "reference": "964a67f293b66b95883a5ed918a65354fcd2258f", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "time": "2019-11-27T13:56:44+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.13-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Util\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony utilities for portability of PHP codes", - "homepage": "https://symfony.com", - "keywords": [ - "compat", - "compatibility", - "polyfill", - "shim" - ] - }, - { - "name": "symfony/routing", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "b689ccd48e234ea404806d94b07eeb45f9f6f06a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/b689ccd48e234ea404806d94b07eeb45f9f6f06a", - "reference": "b689ccd48e234ea404806d94b07eeb45f9f6f06a", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "conflict": { - "symfony/config": "<3.3.1", - "symfony/dependency-injection": "<3.3", - "symfony/yaml": "<3.4" - }, - "require-dev": { - "doctrine/annotations": "~1.0", - "psr/log": "~1.0", - "symfony/config": "^3.3.1|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~2.8|~3.0|~4.0", - "symfony/yaml": "~3.4|~4.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation loader", - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" - }, - "time": "2019-12-01T08:33:36+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Routing Component", - "homepage": "https://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ] - }, - { - "name": "symfony/stopwatch", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "efe0af281ad336bc3b10375c88b117499f1d8494" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/efe0af281ad336bc3b10375c88b117499f1d8494", - "reference": "efe0af281ad336bc3b10375c88b117499f1d8494", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "time": "2019-11-03T17:17:59+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Stopwatch Component", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/twig-bridge", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bridge.git", - "reference": "49b824ddc7f2d250a1f172349cd9a111d63287c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/49b824ddc7f2d250a1f172349cd9a111d63287c0", - "reference": "49b824ddc7f2d250a1f172349cd9a111d63287c0", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "twig/twig": "^1.41|^2.10" - }, - "conflict": { - "symfony/console": "<3.4", - "symfony/form": "<3.4.31|>=4.0,<4.3.4" - }, - "require-dev": { - "fig/link-util": "^1.0", - "symfony/asset": "~2.8|~3.0|~4.0", - "symfony/console": "~3.4|~4.0", - "symfony/dependency-injection": "~2.8|~3.0|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/form": "^3.4.31|^4.3.4", - "symfony/http-foundation": "^3.3.11|~4.0", - "symfony/http-kernel": "~3.2|~4.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/routing": "~2.8|~3.0|~4.0", - "symfony/security": "^2.8.31|^3.3.13|~4.0", - "symfony/security-acl": "~2.8|~3.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/translation": "~2.8|~3.0|~4.0", - "symfony/var-dumper": "~2.8.10|~3.1.4|~3.2|~4.0", - "symfony/web-link": "~3.3|~4.0", - "symfony/workflow": "~3.3|~4.0", - "symfony/yaml": "~2.8|~3.0|~4.0" - }, - "suggest": { - "symfony/asset": "For using the AssetExtension", - "symfony/expression-language": "For using the ExpressionExtension", - "symfony/finder": "", - "symfony/form": "For using the FormExtension", - "symfony/http-kernel": "For using the HttpKernelExtension", - "symfony/routing": "For using the RoutingExtension", - "symfony/security": "For using the SecurityExtension", - "symfony/stopwatch": "For using the StopwatchExtension", - "symfony/templating": "For using the TwigEngine", - "symfony/translation": "For using the TranslationExtension", - "symfony/var-dumper": "For using the DumpExtension", - "symfony/web-link": "For using the WebLinkExtension", - "symfony/yaml": "For using the YamlExtension" - }, - "time": "2019-11-30T08:19:08+00:00", - "type": "symfony-bridge", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Twig\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Twig Bridge", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/twig-bundle", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bundle.git", - "reference": "d39ed8f5df62aeeeb27a6f3bf7f58a6c02a58ea9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/d39ed8f5df62aeeeb27a6f3bf7f58a6c02a58ea9", - "reference": "d39ed8f5df62aeeeb27a6f3bf7f58a6c02a58ea9", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/config": "~3.2|~4.0", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~2.8|~3.0|~4.0", - "symfony/http-kernel": "^3.3|~4.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/twig-bridge": "^3.4.3|^4.0.3", - "twig/twig": "~1.41|~2.10" - }, - "conflict": { - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<3.3.1" - }, - "require-dev": { - "doctrine/annotations": "~1.7", - "doctrine/cache": "~1.0", - "symfony/asset": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.4.24|^4.2.5", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/form": "~2.8|~3.0|~4.0", - "symfony/framework-bundle": "^3.3.11|~4.0", - "symfony/routing": "~2.8|~3.0|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/web-link": "~3.3|~4.0", - "symfony/yaml": "~2.8|~3.0|~4.0" - }, - "time": "2019-10-01T15:13:36+00:00", - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\TwigBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony TwigBundle", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/var-dumper", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "569e261461600810845a8305ca3f64abd3e712c0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/569e261461600810845a8305ca3f64abd3e712c0", - "reference": "569e261461600810845a8305ca3f64abd3e712c0", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" - }, - "require-dev": { - "ext-iconv": "*", - "twig/twig": "~1.34|~2.4" - }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "ext-symfony_debug": "" - }, - "time": "2019-10-10T11:03:19+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "Resources/functions/dump.php" + "authors": [ + { + "name": "Nicola Asuni", + "email": "info@tecnick.com", + "role": "lead" + }, + { + "name": "Combodo", + "email": "contact@combodo.com" + } ], - "psr-4": { - "Symfony\\Component\\VarDumper\\": "" + "description": "TCPDF fork adding requirements for iTop: Specific fonts.", + "homepage": "https://github.com/combodo-itop-libs/TCPDF", + "install-path": "../combodo/tcpdf" + }, + { + "name": "nikic/php-parser", + "version": "v3.1.5", + "version_normalized": "3.1.5.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/bb87e28e7d7b8d9a7fda231d37457c9210faf6ce", + "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce", + "shasum": "" }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony mechanism for exploring and dumping PHP variables", - "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ] - }, - { - "name": "symfony/web-profiler-bundle", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "3ae27cf1b2776cd68aa15fdb57089970f78bcf11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/3ae27cf1b2776cd68aa15fdb57089970f78bcf11", - "reference": "3ae27cf1b2776cd68aa15fdb57089970f78bcf11", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/http-kernel": "~3.4.25|^4.2.6", - "symfony/polyfill-php70": "~1.0", - "symfony/routing": "~2.8|~3.0|~4.0", - "symfony/twig-bundle": "~2.8|~3.0|~4.0", - "symfony/var-dumper": "~3.3|~4.0", - "twig/twig": "~1.34|~2.4" - }, - "conflict": { - "symfony/config": "<3.4", - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<3.3.1", - "symfony/var-dumper": "<3.3" - }, - "require-dev": { - "symfony/config": "~3.4|~4.0", - "symfony/console": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.4|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0" - }, - "time": "2019-11-14T15:04:06+00:00", - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\WebProfilerBundle\\": "" + "require": { + "ext-tokenizer": "*", + "php": ">=5.5" }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "require-dev": { + "phpunit/phpunit": "~4.0|~5.0" }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony WebProfilerBundle", - "homepage": "https://symfony.com" - }, - { - "name": "symfony/yaml", - "version": "v3.4.36", - "version_normalized": "3.4.36.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "dab657db15207879217fc81df4f875947bf68804" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/dab657db15207879217fc81df4f875947bf68804", - "reference": "dab657db15207879217fc81df4f875947bf68804", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/console": "<3.4" - }, - "require-dev": { - "symfony/console": "~3.4|~4.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "time": "2019-10-24T15:33:53+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" + "time": "2018-02-28T20:30:58+00:00", + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "installation-source": "dist", + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com" - }, - { - "name": "twig/twig", - "version": "v1.42.4", - "version_normalized": "1.42.4.0", - "source": { - "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "e587180584c3d2d6cb864a0454e777bb6dcb6152" + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "install-path": "../nikic/php-parser" }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/e587180584c3d2d6cb864a0454e777bb6dcb6152", - "reference": "e587180584c3d2d6cb864a0454e777bb6dcb6152", - "shasum": "" - }, - "require": { - "php": ">=5.5.0", - "symfony/polyfill-ctype": "^1.8" - }, - "require-dev": { - "psr/container": "^1.0", - "symfony/debug": "^3.4|^4.2", - "symfony/phpunit-bridge": "^4.4@dev|^5.0" - }, - "time": "2019-11-11T16:49:32+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.42-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "Twig_": "lib/" + { + "name": "paragonie/random_compat", + "version": "v2.0.18", + "version_normalized": "2.0.18.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db" }, - "psr-4": { - "Twig\\": "src/" - } + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/0a58ef6e3146256cc3dc7cc393927bcc7d1b72db", + "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "time": "2019-01-03T20:59:08+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "lib/random.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "install-path": "../paragonie/random_compat" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" + { + "name": "pear/archive_tar", + "version": "1.4.13", + "version_normalized": "1.4.13.0", + "source": { + "type": "git", + "url": "https://github.com/pear/Archive_Tar.git", + "reference": "2b87b41178cc6d4ad3cba678a46a1cae49786011" }, - { - "name": "Twig Team", - "homepage": "https://twig.symfony.com/contributors", - "role": "Contributors" + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/2b87b41178cc6d4ad3cba678a46a1cae49786011", + "reference": "2b87b41178cc6d4ad3cba678a46a1cae49786011", + "shasum": "" }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", - "keywords": [ - "templating" - ] - } -] + "require": { + "pear/pear-core-minimal": "^1.10.0alpha2", + "php": ">=5.2.0" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-bz2": "Bz2 compression support.", + "ext-xz": "Lzma2 compression support.", + "ext-zlib": "Gzip compression support." + }, + "time": "2021-02-16T10:50:50+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Archive_Tar": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "./" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Vincent Blavet", + "email": "vincent@phpconcept.net" + }, + { + "name": "Greg Beaver", + "email": "greg@chiaraquartet.net" + }, + { + "name": "Michiel Rook", + "email": "mrook@php.net" + } + ], + "description": "Tar file management class with compression support (gzip, bzip2, lzma2)", + "homepage": "https://github.com/pear/Archive_Tar", + "keywords": [ + "archive", + "tar" + ], + "support": { + "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Archive_Tar", + "source": "https://github.com/pear/Archive_Tar" + }, + "funding": [ + { + "url": "https://github.com/mrook", + "type": "github" + }, + { + "url": "https://www.patreon.com/michielrook", + "type": "patreon" + } + ], + "install-path": "../pear/archive_tar" + }, + { + "name": "pear/console_getopt", + "version": "v1.4.3", + "version_normalized": "1.4.3.0", + "source": { + "type": "git", + "url": "https://github.com/pear/Console_Getopt.git", + "reference": "a41f8d3e668987609178c7c4a9fe48fecac53fa0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pear/Console_Getopt/zipball/a41f8d3e668987609178c7c4a9fe48fecac53fa0", + "reference": "a41f8d3e668987609178c7c4a9fe48fecac53fa0", + "shasum": "" + }, + "time": "2019-11-20T18:27:48+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Console": "./" + } + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "./" + ], + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Andrei Zmievski", + "email": "andrei@php.net", + "role": "Lead" + }, + { + "name": "Stig Bakken", + "email": "stig@php.net", + "role": "Developer" + }, + { + "name": "Greg Beaver", + "email": "cellog@php.net", + "role": "Helper" + } + ], + "description": "More info available on: http://pear.php.net/package/Console_Getopt", + "install-path": "../pear/console_getopt" + }, + { + "name": "pear/pear-core-minimal", + "version": "v1.10.10", + "version_normalized": "1.10.10.0", + "source": { + "type": "git", + "url": "https://github.com/pear/pear-core-minimal.git", + "reference": "625a3c429d9b2c1546438679074cac1b089116a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/625a3c429d9b2c1546438679074cac1b089116a7", + "reference": "625a3c429d9b2c1546438679074cac1b089116a7", + "shasum": "" + }, + "require": { + "pear/console_getopt": "~1.4", + "pear/pear_exception": "~1.0" + }, + "replace": { + "rsky/pear-core-min": "self.version" + }, + "time": "2019-11-19T19:00:24+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "src/" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Christian Weiske", + "email": "cweiske@php.net", + "role": "Lead" + } + ], + "description": "Minimal set of PEAR core files to be used as composer dependency", + "install-path": "../pear/pear-core-minimal" + }, + { + "name": "pear/pear_exception", + "version": "v1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/pear/PEAR_Exception.git", + "reference": "dbb42a5a0e45f3adcf99babfb2a1ba77b8ac36a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pear/PEAR_Exception/zipball/dbb42a5a0e45f3adcf99babfb2a1ba77b8ac36a7", + "reference": "dbb42a5a0e45f3adcf99babfb2a1ba77b8ac36a7", + "shasum": "" + }, + "require": { + "php": ">=4.4.0" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "time": "2019-12-10T10:24:42+00:00", + "type": "class", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "PEAR/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "." + ], + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Helgi Thormar", + "email": "dufuz@php.net" + }, + { + "name": "Greg Beaver", + "email": "cellog@php.net" + } + ], + "description": "The PEAR Exception base class.", + "homepage": "https://github.com/pear/PEAR_Exception", + "keywords": [ + "exception" + ], + "install-path": "../pear/pear_exception" + }, + { + "name": "pelago/emogrifier", + "version": "v2.1.0", + "version_normalized": "2.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/MyIntervals/emogrifier.git", + "reference": "40c3d4f475d44ffc7265a760d1dd0e81f579f96f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MyIntervals/emogrifier/zipball/40c3d4f475d44ffc7265a760d1dd0e81f579f96f", + "reference": "40c3d4f475d44ffc7265a760d1dd0e81f579f96f", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0", + "symfony/css-selector": "^3.4.0 || ^4.0.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.2.0", + "phpmd/phpmd": "^2.6.0", + "phpunit/phpunit": "^4.8.0", + "squizlabs/php_codesniffer": "^3.3.2" + }, + "time": "2018-12-08T13:55:46+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Pelago\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Reeve", + "email": "jreeve@pelagodesign.com" + }, + { + "name": "Cameron Brooks" + }, + { + "name": "Jaime Prado" + }, + { + "name": "Oliver Klee", + "email": "github@oliverklee.de" + }, + { + "name": "Zoli Szabó", + "email": "zoli.szabo+github@gmail.com" + }, + { + "name": "Jake Hotson", + "email": "jake@qzdesign.co.uk" + } + ], + "description": "Converts CSS styles into inline style attributes in your HTML code", + "homepage": "https://www.myintervals.com/emogrifier.php", + "keywords": [ + "css", + "email", + "pre-processing" + ], + "install-path": "../pelago/emogrifier" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2016-08-06T20:24:11+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "install-path": "../psr/cache" + }, + { + "name": "psr/container", + "version": "1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2017-02-14T16:28:37+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "install-path": "../psr/container" + }, + { + "name": "psr/log", + "version": "1.1.2", + "version_normalized": "1.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", + "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2019-11-01T11:05:21+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "install-path": "../psr/log" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2017-10-23T01:57:42+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "install-path": "../psr/simple-cache" + }, + { + "name": "scssphp/scssphp", + "version": "1.0.6", + "version_normalized": "1.0.6.0", + "source": { + "type": "git", + "url": "https://github.com/scssphp/scssphp.git", + "reference": "5b3c9d704950d8f9637f5110c36c281ec47dc13c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/scssphp/scssphp/zipball/5b3c9d704950d8f9637f5110c36c281ec47dc13c", + "reference": "5b3c9d704950d8f9637f5110c36c281ec47dc13c", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3", + "squizlabs/php_codesniffer": "~2.5", + "twbs/bootstrap": "~4.3", + "zurb/foundation": "~6.5" + }, + "time": "2019-12-12T05:00:52+00:00", + "bin": [ + "bin/pscss" + ], + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "ScssPhp\\ScssPhp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Anthon Pang", + "email": "apang@softwaredevelopment.ca", + "homepage": "https://github.com/robocoder" + }, + { + "name": "Cédric Morin", + "email": "cedric@yterium.com", + "homepage": "https://github.com/Cerdic" + } + ], + "description": "scssphp is a compiler for SCSS written in PHP.", + "homepage": "http://scssphp.github.io/scssphp/", + "keywords": [ + "css", + "less", + "sass", + "scss", + "stylesheet" + ], + "install-path": "../scssphp/scssphp" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v5.4.12", + "version_normalized": "5.4.12.0", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "181b89f18a90f8925ef805f950d47a7190e9b950" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/181b89f18a90f8925ef805f950d47a7190e9b950", + "reference": "181b89f18a90f8925ef805f950d47a7190e9b950", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "mockery/mockery": "~0.9.1", + "symfony/phpunit-bridge": "~3.2" + }, + "time": "2018-07-31T09:26:32+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "install-path": "../swiftmailer/swiftmailer" + }, + { + "name": "symfony/cache", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "3d9f46a6960fd5cd7f030f86adc5b4b63bcfa4e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/3d9f46a6960fd5cd7f030f86adc5b4b63bcfa4e3", + "reference": "3d9f46a6960fd5cd7f030f86adc5b4b63bcfa4e3", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "psr/cache": "~1.0", + "psr/log": "~1.0", + "psr/simple-cache": "^1.0", + "symfony/polyfill-apcu": "~1.1" + }, + "conflict": { + "symfony/var-dumper": "<3.3" + }, + "provide": { + "psr/cache-implementation": "1.0", + "psr/simple-cache-implementation": "1.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/cache": "~1.6", + "doctrine/dbal": "~2.4", + "predis/predis": "~1.0" + }, + "time": "2019-12-01T10:45:41+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Cache component with PSR-6, PSR-16, and tags", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "install-path": "../symfony/cache" + }, + { + "name": "symfony/class-loader", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/class-loader.git", + "reference": "e212b06996819a2bce026a63da03b7182d05a690" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/class-loader/zipball/e212b06996819a2bce026a63da03b7182d05a690", + "reference": "e212b06996819a2bce026a63da03b7182d05a690", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "require-dev": { + "symfony/finder": "~2.8|~3.0|~4.0", + "symfony/polyfill-apcu": "~1.1" + }, + "suggest": { + "symfony/polyfill-apcu": "For using ApcClassLoader on HHVM" + }, + "time": "2019-08-20T13:31:17+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\ClassLoader\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony ClassLoader Component", + "homepage": "https://symfony.com", + "install-path": "../symfony/class-loader" + }, + { + "name": "symfony/config", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "a599a867d0e4a07c342b5f1e656b3915a540ddbe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/a599a867d0e4a07c342b5f1e656b3915a540ddbe", + "reference": "a599a867d0e4a07c342b5f1e656b3915a540ddbe", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/filesystem": "~2.8|~3.0|~4.0", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/dependency-injection": "<3.3", + "symfony/finder": "<3.3" + }, + "require-dev": { + "symfony/dependency-injection": "~3.3|~4.0", + "symfony/event-dispatcher": "~3.3|~4.0", + "symfony/finder": "~3.3|~4.0", + "symfony/yaml": "~3.0|~4.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "time": "2019-12-01T10:45:41+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "install-path": "../symfony/config" + }, + { + "name": "symfony/console", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "1ee23b3b659b06c622f2bd2492a229e416eb4586" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/1ee23b3b659b06c622f2bd2492a229e416eb4586", + "reference": "1ee23b3b659b06c622f2bd2492a229e416eb4586", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/debug": "~2.8|~3.0|~4.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/process": "<3.3" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.3|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.3|~4.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "time": "2019-12-01T10:04:45+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "install-path": "../symfony/console" + }, + { + "name": "symfony/css-selector", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "f819f71ae3ba6f396b4c015bd5895de7d2f1f85f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/f819f71ae3ba6f396b4c015bd5895de7d2f1f85f", + "reference": "f819f71ae3ba6f396b4c015bd5895de7d2f1f85f", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "time": "2019-10-01T11:57:37+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony CssSelector Component", + "homepage": "https://symfony.com", + "install-path": "../symfony/css-selector" + }, + { + "name": "symfony/debug", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "f72e33fdb1170b326e72c3157f0cd456351dd086" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/f72e33fdb1170b326e72c3157f0cd456351dd086", + "reference": "f72e33fdb1170b326e72c3157f0cd456351dd086", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/http-kernel": "~2.8|~3.0|~4.0" + }, + "time": "2019-10-24T15:33:53+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "install-path": "../symfony/debug" + }, + { + "name": "symfony/dependency-injection", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "0d201916bfb3af939fec3c0c8815ea16c60ac1a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/0d201916bfb3af939fec3c0c8815ea16c60ac1a2", + "reference": "0d201916bfb3af939fec3c0c8815ea16c60ac1a2", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "psr/container": "^1.0" + }, + "conflict": { + "symfony/config": "<3.3.7", + "symfony/finder": "<3.3", + "symfony/proxy-manager-bridge": "<3.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "psr/container-implementation": "1.0" + }, + "require-dev": { + "symfony/config": "~3.3|~4.0", + "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "time": "2019-12-01T08:33:36+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com", + "install-path": "../symfony/dependency-injection" + }, + { + "name": "symfony/dotenv", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "c7e8e471fea74e868ae797970b383dea89ae548a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/c7e8e471fea74e868ae797970b383dea89ae548a", + "reference": "c7e8e471fea74e868ae797970b383dea89ae548a", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "require-dev": { + "symfony/process": "^3.4.2|^4.0" + }, + "time": "2019-10-18T10:00:34+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Registers environment variables from a .env file", + "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "install-path": "../symfony/dotenv" + }, + { + "name": "symfony/event-dispatcher", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "f9031c22ec127d4a2450760f81a8677fe8a10177" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f9031c22ec127d4a2450760f81a8677fe8a10177", + "reference": "f9031c22ec127d4a2450760f81a8677fe8a10177", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "conflict": { + "symfony/dependency-injection": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.8|~3.0|~4.0", + "symfony/dependency-injection": "~3.3|~4.0", + "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/stopwatch": "~2.8|~3.0|~4.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "time": "2019-10-24T15:33:53+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "install-path": "../symfony/event-dispatcher" + }, + { + "name": "symfony/filesystem", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "00cdad0936d06fab136944bc2342b762b1c3a4a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/00cdad0936d06fab136944bc2342b762b1c3a4a2", + "reference": "00cdad0936d06fab136944bc2342b762b1c3a4a2", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-ctype": "~1.8" + }, + "time": "2019-11-25T16:36:22+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "install-path": "../symfony/filesystem" + }, + { + "name": "symfony/finder", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "290ae21279b37bfd287cdcce640d51204e84afdf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/290ae21279b37bfd287cdcce640d51204e84afdf", + "reference": "290ae21279b37bfd287cdcce640d51204e84afdf", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "time": "2019-11-17T21:55:15+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "install-path": "../symfony/finder" + }, + { + "name": "symfony/framework-bundle", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "0d61117c7a770da0bd8bbe7ccfa34d8063f272ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/0d61117c7a770da0bd8bbe7ccfa34d8063f272ea", + "reference": "0d61117c7a770da0bd8bbe7ccfa34d8063f272ea", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": "^5.5.9|>=7.0.8", + "symfony/cache": "~3.4.31|^4.3.4", + "symfony/class-loader": "~3.2", + "symfony/config": "^3.4.31|^4.3.4", + "symfony/debug": "~2.8|~3.0|~4.0", + "symfony/dependency-injection": "^3.4.24|^4.2.5", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/filesystem": "~2.8|~3.0|~4.0", + "symfony/finder": "~2.8|~3.0|~4.0", + "symfony/http-foundation": "^3.4.13|~4.3", + "symfony/http-kernel": "^3.4.31|^4.3.4", + "symfony/polyfill-mbstring": "~1.0", + "symfony/routing": "^3.4.5|^4.0.5" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.0", + "phpdocumentor/type-resolver": "<0.2.1", + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/asset": "<3.3", + "symfony/console": "<3.4", + "symfony/form": "<3.4", + "symfony/property-info": "<3.3", + "symfony/serializer": "<3.3", + "symfony/stopwatch": "<3.4", + "symfony/translation": "<3.4", + "symfony/validator": "<3.4", + "symfony/workflow": "<3.3" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.0", + "fig/link-util": "^1.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0", + "symfony/asset": "~3.3|~4.0", + "symfony/browser-kit": "~2.8|~3.0|~4.0", + "symfony/console": "~3.4.31|^4.3.4", + "symfony/css-selector": "~2.8|~3.0|~4.0", + "symfony/dom-crawler": "~2.8|~3.0|~4.0", + "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/form": "^3.4.31|^4.3.4", + "symfony/lock": "~3.4|~4.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "~2.8|~3.0|~4.0", + "symfony/property-info": "~3.3|~4.0", + "symfony/security-core": "~3.2|~4.0", + "symfony/security-csrf": "^2.8.31|^3.3.13|~4.0", + "symfony/serializer": "~3.3|~4.0", + "symfony/stopwatch": "~3.4|~4.0", + "symfony/templating": "~2.8|~3.0|~4.0", + "symfony/translation": "~3.4|~4.0", + "symfony/validator": "~3.4|~4.0", + "symfony/var-dumper": "~3.3|~4.0", + "symfony/web-link": "~3.3|~4.0", + "symfony/workflow": "~3.3|~4.0", + "symfony/yaml": "~3.2|~4.0", + "twig/twig": "~1.34|~2.4" + }, + "suggest": { + "ext-apcu": "For best performance of the system caches", + "symfony/console": "For using the console commands", + "symfony/form": "For using forms", + "symfony/property-info": "For using the property_info service", + "symfony/serializer": "For using the serializer service", + "symfony/validator": "For using validation", + "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", + "symfony/yaml": "For using the debug:config and lint:yaml commands" + }, + "time": "2019-11-23T20:30:33+00:00", + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony FrameworkBundle", + "homepage": "https://symfony.com", + "install-path": "../symfony/framework-bundle" + }, + { + "name": "symfony/http-foundation", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "d2d0cfe8e319d9df44c4cca570710fcf221d4593" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d2d0cfe8e319d9df44c4cca570710fcf221d4593", + "reference": "d2d0cfe8e319d9df44c4cca570710fcf221d4593", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php70": "~1.6" + }, + "require-dev": { + "symfony/expression-language": "~2.8|~3.0|~4.0" + }, + "time": "2019-11-28T12:52:59+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com", + "install-path": "../symfony/http-foundation" + }, + { + "name": "symfony/http-kernel", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "c42c8339acb28cfff0fb1786948db4d23d609ff7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/c42c8339acb28cfff0fb1786948db4d23d609ff7", + "reference": "c42c8339acb28cfff0fb1786948db4d23d609ff7", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "psr/log": "~1.0", + "symfony/debug": "^3.3.3|~4.0", + "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/http-foundation": "~3.4.12|~4.0.12|^4.1.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-php56": "~1.8" + }, + "conflict": { + "symfony/config": "<2.8", + "symfony/dependency-injection": "<3.4.10|<4.0.10,>=4", + "symfony/var-dumper": "<3.3", + "twig/twig": "<1.34|<2.4,>=2" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/cache": "~1.0", + "symfony/browser-kit": "~2.8|~3.0|~4.0", + "symfony/class-loader": "~2.8|~3.0", + "symfony/config": "~2.8|~3.0|~4.0", + "symfony/console": "~2.8|~3.0|~4.0", + "symfony/css-selector": "~2.8|~3.0|~4.0", + "symfony/dependency-injection": "^3.4.10|^4.0.10", + "symfony/dom-crawler": "~2.8|~3.0|~4.0", + "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/finder": "~2.8|~3.0|~4.0", + "symfony/process": "~2.8|~3.0|~4.0", + "symfony/routing": "~3.4|~4.0", + "symfony/stopwatch": "~2.8|~3.0|~4.0", + "symfony/templating": "~2.8|~3.0|~4.0", + "symfony/translation": "~2.8|~3.0|~4.0", + "symfony/var-dumper": "~3.3|~4.0" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "", + "symfony/finder": "", + "symfony/var-dumper": "" + }, + "time": "2019-12-01T13:50:37+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpKernel Component", + "homepage": "https://symfony.com", + "install-path": "../symfony/http-kernel" + }, + { + "name": "symfony/polyfill-apcu", + "version": "v1.13.1", + "version_normalized": "1.13.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-apcu.git", + "reference": "a8e961c841b9ec52927a87914f8820a1ad8f8116" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/a8e961c841b9ec52927a87914f8820a1ad8f8116", + "reference": "a8e961c841b9ec52927a87914f8820a1ad8f8116", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2019-11-27T13:56:44+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Apcu\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting apcu_* functions to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "apcu", + "compatibility", + "polyfill", + "portable", + "shim" + ], + "install-path": "../symfony/polyfill-apcu" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.13.1", + "version_normalized": "1.13.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", + "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "time": "2019-11-27T13:56:44+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "install-path": "../symfony/polyfill-ctype" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.13.1", + "version_normalized": "1.13.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f", + "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "time": "2019-11-27T14:18:11+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "install-path": "../symfony/polyfill-mbstring" + }, + { + "name": "symfony/polyfill-php56", + "version": "v1.13.1", + "version_normalized": "1.13.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php56.git", + "reference": "53dd1cdf3cb986893ccf2b96665b25b3abb384f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/53dd1cdf3cb986893ccf2b96665b25b3abb384f4", + "reference": "53dd1cdf3cb986893ccf2b96665b25b3abb384f4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-util": "~1.0" + }, + "time": "2019-11-27T13:56:44+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php56\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "install-path": "../symfony/polyfill-php56" + }, + { + "name": "symfony/polyfill-php70", + "version": "v1.13.1", + "version_normalized": "1.13.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "af23c7bb26a73b850840823662dda371484926c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/af23c7bb26a73b850840823662dda371484926c4", + "reference": "af23c7bb26a73b850840823662dda371484926c4", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0|~9.99", + "php": ">=5.3.3" + }, + "time": "2019-11-27T13:56:44+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "install-path": "../symfony/polyfill-php70" + }, + { + "name": "symfony/polyfill-util", + "version": "v1.13.1", + "version_normalized": "1.13.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-util.git", + "reference": "964a67f293b66b95883a5ed918a65354fcd2258f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/964a67f293b66b95883a5ed918a65354fcd2258f", + "reference": "964a67f293b66b95883a5ed918a65354fcd2258f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2019-11-27T13:56:44+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Util\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony utilities for portability of PHP codes", + "homepage": "https://symfony.com", + "keywords": [ + "compat", + "compatibility", + "polyfill", + "shim" + ], + "install-path": "../symfony/polyfill-util" + }, + { + "name": "symfony/routing", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "b689ccd48e234ea404806d94b07eeb45f9f6f06a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/b689ccd48e234ea404806d94b07eeb45f9f6f06a", + "reference": "b689ccd48e234ea404806d94b07eeb45f9f6f06a", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "conflict": { + "symfony/config": "<3.3.1", + "symfony/dependency-injection": "<3.3", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "~1.0", + "psr/log": "~1.0", + "symfony/config": "^3.3.1|~4.0", + "symfony/dependency-injection": "~3.3|~4.0", + "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/http-foundation": "~2.8|~3.0|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "time": "2019-12-01T08:33:36+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Routing Component", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "install-path": "../symfony/routing" + }, + { + "name": "symfony/stopwatch", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "efe0af281ad336bc3b10375c88b117499f1d8494" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/efe0af281ad336bc3b10375c88b117499f1d8494", + "reference": "efe0af281ad336bc3b10375c88b117499f1d8494", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "time": "2019-11-03T17:17:59+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Stopwatch Component", + "homepage": "https://symfony.com", + "install-path": "../symfony/stopwatch" + }, + { + "name": "symfony/twig-bridge", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "49b824ddc7f2d250a1f172349cd9a111d63287c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/49b824ddc7f2d250a1f172349cd9a111d63287c0", + "reference": "49b824ddc7f2d250a1f172349cd9a111d63287c0", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "twig/twig": "^1.41|^2.10" + }, + "conflict": { + "symfony/console": "<3.4", + "symfony/form": "<3.4.31|>=4.0,<4.3.4" + }, + "require-dev": { + "fig/link-util": "^1.0", + "symfony/asset": "~2.8|~3.0|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/dependency-injection": "~2.8|~3.0|~4.0", + "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/finder": "~2.8|~3.0|~4.0", + "symfony/form": "^3.4.31|^4.3.4", + "symfony/http-foundation": "^3.3.11|~4.0", + "symfony/http-kernel": "~3.2|~4.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/routing": "~2.8|~3.0|~4.0", + "symfony/security": "^2.8.31|^3.3.13|~4.0", + "symfony/security-acl": "~2.8|~3.0", + "symfony/stopwatch": "~2.8|~3.0|~4.0", + "symfony/templating": "~2.8|~3.0|~4.0", + "symfony/translation": "~2.8|~3.0|~4.0", + "symfony/var-dumper": "~2.8.10|~3.1.4|~3.2|~4.0", + "symfony/web-link": "~3.3|~4.0", + "symfony/workflow": "~3.3|~4.0", + "symfony/yaml": "~2.8|~3.0|~4.0" + }, + "suggest": { + "symfony/asset": "For using the AssetExtension", + "symfony/expression-language": "For using the ExpressionExtension", + "symfony/finder": "", + "symfony/form": "For using the FormExtension", + "symfony/http-kernel": "For using the HttpKernelExtension", + "symfony/routing": "For using the RoutingExtension", + "symfony/security": "For using the SecurityExtension", + "symfony/stopwatch": "For using the StopwatchExtension", + "symfony/templating": "For using the TwigEngine", + "symfony/translation": "For using the TranslationExtension", + "symfony/var-dumper": "For using the DumpExtension", + "symfony/web-link": "For using the WebLinkExtension", + "symfony/yaml": "For using the YamlExtension" + }, + "time": "2019-11-30T08:19:08+00:00", + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Twig\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Twig Bridge", + "homepage": "https://symfony.com", + "install-path": "../symfony/twig-bridge" + }, + { + "name": "symfony/twig-bundle", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "d39ed8f5df62aeeeb27a6f3bf7f58a6c02a58ea9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/d39ed8f5df62aeeeb27a6f3bf7f58a6c02a58ea9", + "reference": "d39ed8f5df62aeeeb27a6f3bf7f58a6c02a58ea9", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/config": "~3.2|~4.0", + "symfony/debug": "~2.8|~3.0|~4.0", + "symfony/http-foundation": "~2.8|~3.0|~4.0", + "symfony/http-kernel": "^3.3|~4.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/twig-bridge": "^3.4.3|^4.0.3", + "twig/twig": "~1.41|~2.10" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<3.3.1" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.0", + "symfony/asset": "~2.8|~3.0|~4.0", + "symfony/dependency-injection": "~3.4.24|^4.2.5", + "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/finder": "~2.8|~3.0|~4.0", + "symfony/form": "~2.8|~3.0|~4.0", + "symfony/framework-bundle": "^3.3.11|~4.0", + "symfony/routing": "~2.8|~3.0|~4.0", + "symfony/stopwatch": "~2.8|~3.0|~4.0", + "symfony/templating": "~2.8|~3.0|~4.0", + "symfony/web-link": "~3.3|~4.0", + "symfony/yaml": "~2.8|~3.0|~4.0" + }, + "time": "2019-10-01T15:13:36+00:00", + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\TwigBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony TwigBundle", + "homepage": "https://symfony.com", + "install-path": "../symfony/twig-bundle" + }, + { + "name": "symfony/var-dumper", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "569e261461600810845a8305ca3f64abd3e712c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/569e261461600810845a8305ca3f64abd3e712c0", + "reference": "569e261461600810845a8305ca3f64abd3e712c0", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" + }, + "require-dev": { + "ext-iconv": "*", + "twig/twig": "~1.34|~2.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "ext-symfony_debug": "" + }, + "time": "2019-10-10T11:03:19+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "install-path": "../symfony/var-dumper" + }, + { + "name": "symfony/web-profiler-bundle", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/web-profiler-bundle.git", + "reference": "3ae27cf1b2776cd68aa15fdb57089970f78bcf11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/3ae27cf1b2776cd68aa15fdb57089970f78bcf11", + "reference": "3ae27cf1b2776cd68aa15fdb57089970f78bcf11", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/http-kernel": "~3.4.25|^4.2.6", + "symfony/polyfill-php70": "~1.0", + "symfony/routing": "~2.8|~3.0|~4.0", + "symfony/twig-bundle": "~2.8|~3.0|~4.0", + "symfony/var-dumper": "~3.3|~4.0", + "twig/twig": "~1.34|~2.4" + }, + "conflict": { + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<3.3.1", + "symfony/var-dumper": "<3.3" + }, + "require-dev": { + "symfony/config": "~3.4|~4.0", + "symfony/console": "~2.8|~3.0|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/stopwatch": "~2.8|~3.0|~4.0" + }, + "time": "2019-11-14T15:04:06+00:00", + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\WebProfilerBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony WebProfilerBundle", + "homepage": "https://symfony.com", + "install-path": "../symfony/web-profiler-bundle" + }, + { + "name": "symfony/yaml", + "version": "v3.4.36", + "version_normalized": "3.4.36.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "dab657db15207879217fc81df4f875947bf68804" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/dab657db15207879217fc81df4f875947bf68804", + "reference": "dab657db15207879217fc81df4f875947bf68804", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<3.4" + }, + "require-dev": { + "symfony/console": "~3.4|~4.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "time": "2019-10-24T15:33:53+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "install-path": "../symfony/yaml" + }, + { + "name": "twig/twig", + "version": "v1.42.4", + "version_normalized": "1.42.4.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "e587180584c3d2d6cb864a0454e777bb6dcb6152" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/e587180584c3d2d6cb864a0454e777bb6dcb6152", + "reference": "e587180584c3d2d6cb864a0454e777bb6dcb6152", + "shasum": "" + }, + "require": { + "php": ">=5.5.0", + "symfony/polyfill-ctype": "^1.8" + }, + "require-dev": { + "psr/container": "^1.0", + "symfony/debug": "^3.4|^4.2", + "symfony/phpunit-bridge": "^4.4@dev|^5.0" + }, + "time": "2019-11-11T16:49:32+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.42-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Twig_": "lib/" + }, + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "homepage": "https://twig.symfony.com/contributors", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "install-path": "../twig/twig" + } + ], + "dev": true, + "dev-package-names": [ + "symfony/stopwatch", + "symfony/var-dumper", + "symfony/web-profiler-bundle" + ] +} diff --git a/lib/composer/installed.php b/lib/composer/installed.php new file mode 100644 index 000000000..2a3443304 --- /dev/null +++ b/lib/composer/installed.php @@ -0,0 +1,444 @@ + + array ( + 'pretty_version' => 'dev-develop', + 'version' => 'dev-develop', + 'aliases' => + array ( + ), + 'reference' => '2d2a6857de55d005dbc4836e558e611ce7f52bb8', + 'name' => '__root__', + ), + 'versions' => + array ( + '__root__' => + array ( + 'pretty_version' => 'dev-develop', + 'version' => 'dev-develop', + 'aliases' => + array ( + ), + 'reference' => '2d2a6857de55d005dbc4836e558e611ce7f52bb8', + ), + 'combodo/tcpdf' => + array ( + 'pretty_version' => '6.3.5', + 'version' => '6.3.5.0', + 'aliases' => + array ( + ), + 'reference' => 'aedd4b7b8cf7fcc24e617c405c9d3304150f4b94', + ), + 'nikic/php-parser' => + array ( + 'pretty_version' => 'v3.1.5', + 'version' => '3.1.5.0', + 'aliases' => + array ( + ), + 'reference' => 'bb87e28e7d7b8d9a7fda231d37457c9210faf6ce', + ), + 'paragonie/random_compat' => + array ( + 'pretty_version' => 'v2.0.18', + 'version' => '2.0.18.0', + 'aliases' => + array ( + ), + 'reference' => '0a58ef6e3146256cc3dc7cc393927bcc7d1b72db', + ), + 'pear/archive_tar' => + array ( + 'pretty_version' => '1.4.13', + 'version' => '1.4.13.0', + 'aliases' => + array ( + ), + 'reference' => '2b87b41178cc6d4ad3cba678a46a1cae49786011', + ), + 'pear/console_getopt' => + array ( + 'pretty_version' => 'v1.4.3', + 'version' => '1.4.3.0', + 'aliases' => + array ( + ), + 'reference' => 'a41f8d3e668987609178c7c4a9fe48fecac53fa0', + ), + 'pear/pear-core-minimal' => + array ( + 'pretty_version' => 'v1.10.10', + 'version' => '1.10.10.0', + 'aliases' => + array ( + ), + 'reference' => '625a3c429d9b2c1546438679074cac1b089116a7', + ), + 'pear/pear_exception' => + array ( + 'pretty_version' => 'v1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => 'dbb42a5a0e45f3adcf99babfb2a1ba77b8ac36a7', + ), + 'pelago/emogrifier' => + array ( + 'pretty_version' => 'v2.1.0', + 'version' => '2.1.0.0', + 'aliases' => + array ( + ), + 'reference' => '40c3d4f475d44ffc7265a760d1dd0e81f579f96f', + ), + 'psr/cache' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8', + ), + 'psr/cache-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + ), + ), + 'psr/container' => + array ( + 'pretty_version' => '1.0.0', + 'version' => '1.0.0.0', + 'aliases' => + array ( + ), + 'reference' => 'b7ce3b176482dbbc1245ebf52b181af44c2cf55f', + ), + 'psr/container-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + ), + ), + 'psr/log' => + array ( + 'pretty_version' => '1.1.2', + 'version' => '1.1.2.0', + 'aliases' => + array ( + ), + 'reference' => '446d54b4cb6bf489fc9d75f55843658e6f25d801', + ), + 'psr/log-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + ), + ), + 'psr/simple-cache' => + array ( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'aliases' => + array ( + ), + 'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b', + ), + 'psr/simple-cache-implementation' => + array ( + 'provided' => + array ( + 0 => '1.0', + ), + ), + 'rsky/pear-core-min' => + array ( + 'replaced' => + array ( + 0 => 'v1.10.10', + ), + ), + 'scssphp/scssphp' => + array ( + 'pretty_version' => '1.0.6', + 'version' => '1.0.6.0', + 'aliases' => + array ( + ), + 'reference' => '5b3c9d704950d8f9637f5110c36c281ec47dc13c', + ), + 'swiftmailer/swiftmailer' => + array ( + 'pretty_version' => 'v5.4.12', + 'version' => '5.4.12.0', + 'aliases' => + array ( + ), + 'reference' => '181b89f18a90f8925ef805f950d47a7190e9b950', + ), + 'symfony/cache' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '3d9f46a6960fd5cd7f030f86adc5b4b63bcfa4e3', + ), + 'symfony/class-loader' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'e212b06996819a2bce026a63da03b7182d05a690', + ), + 'symfony/config' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'a599a867d0e4a07c342b5f1e656b3915a540ddbe', + ), + 'symfony/console' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '1ee23b3b659b06c622f2bd2492a229e416eb4586', + ), + 'symfony/css-selector' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'f819f71ae3ba6f396b4c015bd5895de7d2f1f85f', + ), + 'symfony/debug' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'f72e33fdb1170b326e72c3157f0cd456351dd086', + ), + 'symfony/dependency-injection' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '0d201916bfb3af939fec3c0c8815ea16c60ac1a2', + ), + 'symfony/dotenv' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'c7e8e471fea74e868ae797970b383dea89ae548a', + ), + 'symfony/event-dispatcher' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'f9031c22ec127d4a2450760f81a8677fe8a10177', + ), + 'symfony/filesystem' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '00cdad0936d06fab136944bc2342b762b1c3a4a2', + ), + 'symfony/finder' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '290ae21279b37bfd287cdcce640d51204e84afdf', + ), + 'symfony/framework-bundle' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '0d61117c7a770da0bd8bbe7ccfa34d8063f272ea', + ), + 'symfony/http-foundation' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'd2d0cfe8e319d9df44c4cca570710fcf221d4593', + ), + 'symfony/http-kernel' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'c42c8339acb28cfff0fb1786948db4d23d609ff7', + ), + 'symfony/polyfill-apcu' => + array ( + 'pretty_version' => 'v1.13.1', + 'version' => '1.13.1.0', + 'aliases' => + array ( + ), + 'reference' => 'a8e961c841b9ec52927a87914f8820a1ad8f8116', + ), + 'symfony/polyfill-ctype' => + array ( + 'pretty_version' => 'v1.13.1', + 'version' => '1.13.1.0', + 'aliases' => + array ( + ), + 'reference' => 'f8f0b461be3385e56d6de3dbb5a0df24c0c275e3', + ), + 'symfony/polyfill-mbstring' => + array ( + 'pretty_version' => 'v1.13.1', + 'version' => '1.13.1.0', + 'aliases' => + array ( + ), + 'reference' => '7b4aab9743c30be783b73de055d24a39cf4b954f', + ), + 'symfony/polyfill-php56' => + array ( + 'pretty_version' => 'v1.13.1', + 'version' => '1.13.1.0', + 'aliases' => + array ( + ), + 'reference' => '53dd1cdf3cb986893ccf2b96665b25b3abb384f4', + ), + 'symfony/polyfill-php70' => + array ( + 'pretty_version' => 'v1.13.1', + 'version' => '1.13.1.0', + 'aliases' => + array ( + ), + 'reference' => 'af23c7bb26a73b850840823662dda371484926c4', + ), + 'symfony/polyfill-util' => + array ( + 'pretty_version' => 'v1.13.1', + 'version' => '1.13.1.0', + 'aliases' => + array ( + ), + 'reference' => '964a67f293b66b95883a5ed918a65354fcd2258f', + ), + 'symfony/routing' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'b689ccd48e234ea404806d94b07eeb45f9f6f06a', + ), + 'symfony/stopwatch' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'efe0af281ad336bc3b10375c88b117499f1d8494', + ), + 'symfony/twig-bridge' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '49b824ddc7f2d250a1f172349cd9a111d63287c0', + ), + 'symfony/twig-bundle' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'd39ed8f5df62aeeeb27a6f3bf7f58a6c02a58ea9', + ), + 'symfony/var-dumper' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '569e261461600810845a8305ca3f64abd3e712c0', + ), + 'symfony/web-profiler-bundle' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => '3ae27cf1b2776cd68aa15fdb57089970f78bcf11', + ), + 'symfony/yaml' => + array ( + 'pretty_version' => 'v3.4.36', + 'version' => '3.4.36.0', + 'aliases' => + array ( + ), + 'reference' => 'dab657db15207879217fc81df4f875947bf68804', + ), + 'tecnickcom/tcpdf' => + array ( + 'replaced' => + array ( + 0 => '6.3.5', + ), + ), + 'twig/twig' => + array ( + 'pretty_version' => 'v1.42.4', + 'version' => '1.42.4.0', + 'aliases' => + array ( + ), + 'reference' => 'e587180584c3d2d6cb864a0454e777bb6dcb6152', + ), + ), +); diff --git a/lib/composer/platform_check.php b/lib/composer/platform_check.php new file mode 100644 index 000000000..8b379f446 --- /dev/null +++ b/lib/composer/platform_check.php @@ -0,0 +1,26 @@ += 50600)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 5.6.0". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + trigger_error( + 'Composer detected issues in your platform: ' . implode(' ', $issues), + E_USER_ERROR + ); +} diff --git a/lib/pear/archive_tar/.github/FUNDING.yml b/lib/pear/archive_tar/.github/FUNDING.yml new file mode 100644 index 000000000..4a0f72b64 --- /dev/null +++ b/lib/pear/archive_tar/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: [mrook] +patreon: michielrook diff --git a/lib/pear/archive_tar/.github/dependabot.yml b/lib/pear/archive_tar/.github/dependabot.yml new file mode 100644 index 000000000..a51bb0bd4 --- /dev/null +++ b/lib/pear/archive_tar/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "composer" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" diff --git a/lib/pear/archive_tar/.github/workflows/build.yml b/lib/pear/archive_tar/.github/workflows/build.yml new file mode 100644 index 000000000..5bcc73b50 --- /dev/null +++ b/lib/pear/archive_tar/.github/workflows/build.yml @@ -0,0 +1,40 @@ +on: + push: + branches: + - master + pull_request: + +jobs: + test: + runs-on: ${{ matrix.operating-system }} + strategy: + fail-fast: false + matrix: + operating-system: [ ubuntu-latest ] + php: [ '5.4', '5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0' ] + dependencies: [ 'locked' ] + + name: PHP ${{ matrix.php }} on ${{ matrix.operating-system }} with ${{ matrix.dependencies }} dependencies + + steps: + - uses: actions/checkout@v2 + name: Checkout repository + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + + - uses: ramsey/composer-install@v1 + with: + dependency-versions: ${{ matrix.dependencies }} + + - name: Install PEAR + run: | + sudo apt-get install php-pear + + - name: Run tests + run: | + sudo pear install -f package.xml + pear version + pear run-tests -qr tests/ || { cat run-tests.log; for i in `find tests/ -name '*.out'`; do echo "$i"; cat "$i"; done; exit 1; } diff --git a/lib/pear/archive_tar/Archive/Tar.php b/lib/pear/archive_tar/Archive/Tar.php index 5a52ce818..a8c9501cc 100644 --- a/lib/pear/archive_tar/Archive/Tar.php +++ b/lib/pear/archive_tar/Archive/Tar.php @@ -257,7 +257,7 @@ class Archive_Tar extends PEAR { $this->_close(); // ----- Look for a local copy to delete - if ($this->_temp_tarname != '') { + if ($this->_temp_tarname != '' && (bool) preg_match('/^tar[[:alnum:]]*\.tmp$/', $this->_temp_tarname)) { @unlink($this->_temp_tarname); } } @@ -1397,16 +1397,20 @@ class Archive_Tar extends PEAR $v_magic = 'ustar '; $v_version = ' '; + $v_uname = ''; + $v_gname = ''; if (function_exists('posix_getpwuid')) { $userinfo = posix_getpwuid($v_info[4]); $groupinfo = posix_getgrgid($v_info[5]); - $v_uname = $userinfo['name']; - $v_gname = $groupinfo['name']; - } else { - $v_uname = ''; - $v_gname = ''; + if (isset($userinfo['name'])) { + $v_uname = $userinfo['name']; + } + + if (isset($groupinfo['name'])) { + $v_gname = $groupinfo['name']; + } } $v_devmajor = ''; @@ -1730,7 +1734,7 @@ class Archive_Tar extends PEAR // ----- Extract the properties $v_header['filename'] = rtrim($v_data['filename'], "\0"); - if ($this->_maliciousFilename($v_header['filename'])) { + if ($this->_isMaliciousFilename($v_header['filename'])) { $this->_error( 'Malicious .tar detected, file "' . $v_header['filename'] . '" will not install in desired directory tree' @@ -1800,9 +1804,9 @@ class Archive_Tar extends PEAR * * @return bool */ - private function _maliciousFilename($file) + private function _isMaliciousFilename($file) { - if (strpos($file, 'phar://') === 0) { + if (strpos($file, '://') !== false) { return true; } if (strpos($file, '../') !== false || strpos($file, '..\\') !== false) { @@ -1838,7 +1842,7 @@ class Archive_Tar extends PEAR $v_filename = rtrim(substr($v_filename, 0, $v_filesize), "\0"); $v_header['filename'] = $v_filename; - if ($this->_maliciousFilename($v_filename)) { + if ($this->_isMaliciousFilename($v_filename)) { $this->_error( 'Malicious .tar detected, file "' . $v_filename . '" will not install in desired directory tree' @@ -2120,6 +2124,32 @@ class Archive_Tar extends PEAR } } } elseif ($v_header['typeflag'] == "2") { + $link_depth = 0; + foreach (explode("/", $v_header['filename']) as $dir) { + if ($dir === "..") { + $link_depth--; + } elseif ($dir !== "" && $dir !== "." ) { + $link_depth++; + } + } + foreach (explode("/", $v_header['link']) as $dir){ + if ($link_depth <= 0) { + break; + } + if ($dir === "..") { + $link_depth--; + } elseif ($dir !== "" && $dir !== ".") { + $link_depth++; + } + } + if (strpos($v_header['link'], "/") === 0 or $link_depth <= 0) { + $this->_error( + 'Out-of-path file extraction {' + . $v_header['filename'] . ' --> ' . + $v_header['link'] . '}' + ); + return false; + } if (!$p_symlinks) { $this->_warning('Symbolic links are not allowed. ' . 'Unable to extract {' diff --git a/lib/pear/archive_tar/README.md b/lib/pear/archive_tar/README.md index 96e95713a..f9c53be1a 100644 --- a/lib/pear/archive_tar/README.md +++ b/lib/pear/archive_tar/README.md @@ -1,7 +1,7 @@ Archive_Tar ========== -[![Build Status](https://secure.travis-ci.org/pear/Archive_Tar.png?branch=master)](https://travis-ci.org/pear/Archive_Tar) +![.github/workflows/build.yml](https://github.com/pear/Archive_Tar/workflows/.github/workflows/build.yml/badge.svg) This package provides handling of tar files in PHP. It supports creating, listing, extracting and adding to tar files. diff --git a/lib/pear/archive_tar/package.xml b/lib/pear/archive_tar/package.xml index f1f8040b2..8da0d40c9 100644 --- a/lib/pear/archive_tar/package.xml +++ b/lib/pear/archive_tar/package.xml @@ -32,10 +32,10 @@ Also Lzma2 compressed archives are supported with xz extension. stig@php.net no - 2020-09-15 - + 2021-02-16 + - 1.4.10 + 1.4.13 1.4.0 @@ -44,8 +44,7 @@ Also Lzma2 compressed archives are supported with xz extension. New BSD License -* Fix block padding when the file buffer length is a multiple of 512 and smaller than Archive_Tar buffer length -* Don't try to copy username/groupname in chroot jail +* Fix Bug #27010: Relative symlinks failing (out-of path file extraction) [mrook] @@ -75,6 +74,52 @@ Also Lzma2 compressed archives are supported with xz extension. + + + 1.4.12 + 1.4.0 + + + stable + stable + + 2021-01-18 + New BSD License + +* Fix Bug #27008: Symlink out-of-path write vulnerability (CVE-2020-36193) [mrook] + + + + + 1.4.11 + 1.4.0 + + + stable + stable + + 2020-11-19 + New BSD License + +* Fix Bug #27002: Filename manipulation vulnerabilities (CVE-2020-28948 / CVE-2020-28949) [mrook] + + + + + 1.4.10 + 1.4.0 + + + stable + stable + + 2020-09-15 + New BSD License + + * Fix block padding when the file buffer length is a multiple of 512 and smaller than Archive_Tar buffer length + * Don't try to copy username/groupname in chroot jail + + 1.4.9 From 0de6f98addbd8c05f9fb7a8b9c59d56bc19fe24a Mon Sep 17 00:00:00 2001 From: Pierre Goiffon Date: Tue, 8 Jun 2021 18:43:43 +0200 Subject: [PATCH 29/31] :loud_sound: When ordering objects search list, log problems due to low `max_input_vars` php.ini option (#211) iTop is sending large volume of data to the server, and those data can be truncated due to this php.ini option. Now we are checking for common issues : if the data is truncated a log is done (IssueLog, warning level, no channel) and the corresponding column is set as not selected. User will still see an inconsistent result, but we won't have PHP notices generated anymore, and a log can tell what caused the issue. --- pages/ajax.render.php | 73 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/pages/ajax.render.php b/pages/ajax.render.php index fcba420a1..c19f8c12c 100644 --- a/pages/ajax.render.php +++ b/pages/ajax.render.php @@ -132,6 +132,79 @@ try $aClassAliases = utils::ReadParam('class_aliases', array()); $iListId = utils::ReadParam('list_id', 0); + foreach ($aColumns as $sClass => $aAttCodes) { + foreach ($aAttCodes as $sAttCode => $aAttProperties) { + if (!array_key_exists('checked', $aAttProperties)) { + /** + * For data passed in XHR queries with some volume, on some servers data can be cut off because of a php.ini's `max_input_vars` set too low + * + * Normal format is : + * ``` + * array ( + * 'UserRequest' => + * array ( + * '_key_' => + * array ( + * 'label' => 'User Request (Link)', + * 'checked' => 'true', + * 'disabled' => 'true', + * 'alias' => 'UserRequest', + * 'code' => '_key_', + * 'sort' => 'none', + * ), + * // ... + * 'parent_request_id_friendlyname' => + * array ( + * 'label' => 'parent_request_id_friendlyname (Friendly Name)', + * 'checked' => 'false', + * 'disabled' => 'false', + * 'alias' => 'UserRequest', + * 'code' => 'parent_request_id_friendlyname', + * 'sort' => 'none', + * ), + * ) + * ``` + * + * While with a low max_input_vars we can get : + * ``` + * array ( + * 'UserRequest' => + * array ( + * '_key_' => + * array ( + * 'label' => 'User Request (Link)', + * 'checked' => 'true', + * 'disabled' => 'true', + * 'alias' => 'UserRequest', + * 'code' => '_key_', + * 'sort' => 'none', + * ), + * // ... + * 'parent_request_id_friendlyname' => + * array ( + * 'label' => 'parent_request_id_friendlyname (Friendly Name)', + * ), + * ) + * ``` + * + * @link https://www.php.net/manual/fr/info.configuration.php#ini.max-input-vars PHP doc on `max_input_vars` + * @link https://www.itophub.io/wiki/page?id=latest%3Ainstall%3Aphp_and_mysql_configuration#php_mysql_mariadb_settings Combodo's recommended options + */ + $iMaxInputVarsValue = ini_get('max_input_vars'); + IssueLog::Warning( + "ajax.render.php received an invalid array for columns : check max_input_vars value in php.ini !", + null, + array( + 'operation' => $operation, + 'max_input_vars' => $iMaxInputVarsValue, + 'class.attcode with invalid format' => "$sClass.$sAttCode", + ) + ); + $aColumns[$sClass][$sAttCode]['checked'] = 'false'; + } + } + } + // Filter the list to removed linked set since we are not able to display them here $aOrderBy = array(); $iSortIndex = 0; From 147916062b3a3d3c2624f54816d8f16253403bf0 Mon Sep 17 00:00:00 2001 From: Pierre Goiffon Date: Thu, 10 Jun 2021 16:28:17 +0200 Subject: [PATCH 30/31] :art: Fix local variable names Was copy/paste and wasn't consistent with the functionnality :/ --- core/log.class.inc.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/log.class.inc.php b/core/log.class.inc.php index f16e42d95..e90af34ed 100644 --- a/core/log.class.inc.php +++ b/core/log.class.inc.php @@ -398,10 +398,10 @@ class MonthlyRotatingLogFileNameBuilder extends RotatingLogFileNameBuilder */ protected function GetFileSuffix($oDate) { - $sWeekYear = $oDate->format('o'); - $sWeekNumber = $oDate->format('m'); + $sMonthYear = $oDate->format('o'); + $sMonthNumber = $oDate->format('m'); - return $sWeekYear.'-month'.$sWeekNumber; + return $sMonthYear.'-month'.$sMonthNumber; } /** From 3a876d5c7500d6098845b0354cf6ff9dc9cef559 Mon Sep 17 00:00:00 2001 From: Eric Date: Fri, 11 Jun 2021 09:36:01 +0200 Subject: [PATCH 31/31] Log complete error on Memory Limit or max execution time --- application/startup.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/startup.inc.php b/application/startup.inc.php index 15514807a..8683691cc 100644 --- a/application/startup.inc.php +++ b/application/startup.inc.php @@ -45,7 +45,7 @@ register_shutdown_function(function() $sMessage = substr($sMessage, 0, $iStackTracePos); } } - IssueLog::error($sMessage); + IssueLog::error($sMessage, null, $err); if (strpos($err['message'], 'Allowed memory size of') !== false) { $sLimit = ini_get('memory_limit');
    '.Dict::S('DBTools:Class').''.Dict::S('DBTools:Count').''.Dict::S('DBTools:Error').'