diff --git a/application/itopwebpage.class.inc.php b/application/itopwebpage.class.inc.php index faaf59ccd9..62cd8005c7 100644 --- a/application/itopwebpage.class.inc.php +++ b/application/itopwebpage.class.inc.php @@ -582,7 +582,7 @@ EOF } echo "\n"; } - echo "\n"; + echo "\n"; echo "\n"; echo "\n"; @@ -606,7 +606,7 @@ EOF } // Render the text of the global search form - $sText = Utils::ReadParam('text', ''); + $sText = htmlentities(utils::ReadParam('text', ''), ENT_QUOTES, 'UTF-8'); $sOnClick = ""; if (empty($sText)) { diff --git a/core/metamodel.class.php b/core/metamodel.class.php index 3701bc1bb4..87c4a79717 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -310,13 +310,23 @@ abstract class MetaModel return self::GetName($sClass); } } - final static public function GetClassFromLabel($sClassLabel) + final static public function GetClassFromLabel($sClassLabel, $bCaseSensitive = true) { foreach(self::GetClasses() as $sClass) { - if (self::GetName($sClass) == $sClassLabel) + if ($bCaseSensitive) { - return $sClass; + if (self::GetName($sClass) == $sClassLabel) + { + return $sClass; + } + } + else + { + if (strcasecmp(self::GetName($sClass), $sClassLabel) == 0) + { + return $sClass; + } } } return null; diff --git a/pages/UI.php b/pages/UI.php index a8f6ae36e0..85ae6afb43 100644 --- a/pages/UI.php +++ b/pages/UI.php @@ -627,6 +627,22 @@ try $iBlock = 0; // Search in full text mode in all the classes $aMatches = array(); + $sClassName = ''; + + // Check if a class name/label is supplied to limit the search + if (preg_match('/^(.+):(.+)$/', $sFullText, $aMatches)) + { + $sClassName = $aMatches[1]; + if (MetaModel::IsValidClass($sClassName)) + { + $sFullText = $aMatches[2]; + } + elseif ($sClassName = MetaModel::GetClassFromLabel($sClassName, false /* => not case sensitive */)) + { + $sFullText = $aMatches[2]; + } + } + if (preg_match('/^"(.*)"$/', $sFullText, $aMatches)) { // The text is surrounded by double-quotes, remove the quotes and treat it as one single expression @@ -637,7 +653,18 @@ try // Split the text on the blanks and treat this as a search for AND AND $aFullTextNeedles = explode(' ', $sFullText); } - foreach(MetaModel::GetClasses('searchable') as $sClassName) + + // Search is limited ot a given class, or not... + if (empty($sClassName)) + { + $aSearchClasses = MetaModel::GetClasses('searchable'); + } + else + { + $aSearchClasses = MetaModel::EnumChildClasses($sClassName, ENUM_CHILD_CLASSES_ALL); + } + + foreach($aSearchClasses as $sClassName) { $oFilter = new DBObjectSearch($sClassName); foreach($aFullTextNeedles as $sSearchText)