diff --git a/README.md b/README.md
index 288efbda3..0251a90a8 100644
--- a/README.md
+++ b/README.md
@@ -52,7 +52,7 @@ iTop also offers mass import tools and web services to integrate with your IT
## Last releases
### Versions 2.7.*
- - 2.7.0-1 published on April 8, 2020
+ - 2.7.1 published on April 8, 2020
- [Changes since the previous version][62]
- [New features][63]
- [Migration notes][64]
@@ -125,10 +125,8 @@ We would like to give a special thank you to the people from the community who c
- Lucas, Jonathan
- Malik, Remie
- Rosenke, Stephan
- - Schirrmann, Pascal
- Seki, Shoji
- Shilov, Vladimir
- - Tahri, Ahmed R. (Ousret)
- Tulio, Marco
- Turrubiates, Miguel
diff --git a/application/dashboard.class.inc.php b/application/dashboard.class.inc.php
index 35b9833e6..322e68e38 100644
--- a/application/dashboard.class.inc.php
+++ b/application/dashboard.class.inc.php
@@ -1574,9 +1574,16 @@ JS
private function GetDashletObjectListAppUserPreferencesPrefix(DashletObjectList $oDashlet, $aExtraParams, $sDashletId)
{
$sDataTableId = Dashlet::APPUSERPREFERENCES_PREFIX.$sDashletId;
- $oFilter = $oDashlet->GetDBSearch($aExtraParams);
- $aClassAliases = $oFilter->GetSelectedClasses();
-
+ $aClassAliases = array();
+ try{
+ $oFilter = $oDashlet->GetDBSearch($aExtraParams);
+ $aClassAliases = $oFilter->GetSelectedClasses();
+ }
+ catch (Exception $e)
+ {
+ //on error, return default value
+ return null;
+ }
return DataTableSettings::GetAppUserPreferenceKey($aClassAliases, $sDataTableId);
}
}
diff --git a/application/ui.extkeywidget.class.inc.php b/application/ui.extkeywidget.class.inc.php
index 6426ddf51..a162cc8c5 100644
--- a/application/ui.extkeywidget.class.inc.php
+++ b/application/ui.extkeywidget.class.inc.php
@@ -652,7 +652,6 @@ HTML
$oPage->add('');
$oPage->add_ready_script("\$('#tree_$this->iId ul').treeview({ control: '#treecontrolid', persist: 'false'});\n");
- $oPage->add_ready_script("\$('#tree_$this->iId ul').treeview();\n");
$oPage->add_ready_script("\$('#dlg_tree_$this->iId').dialog({ width: 'auto', height: 'auto', autoOpen: true, modal: true, title: '$sDialogTitle', resizeStop: oACWidget_{$this->iId}.OnHKResize, close: oACWidget_{$this->iId}.OnHKClose });\n");
}
diff --git a/core/backgroundprocess.inc.php b/core/backgroundprocess.inc.php
index 05ec4572e..fde1605c3 100644
--- a/core/backgroundprocess.inc.php
+++ b/core/backgroundprocess.inc.php
@@ -263,13 +263,14 @@ abstract class AbstractWeeklyScheduledProcess implements iScheduledProcess
/**
* Exception for {@link iProcess} implementations.
* An error happened during the processing but we can go on with the next implementations.
+ * @since 2.5.0 N°1195
*/
class ProcessException extends CoreException
{
}
/**
- * @since 2.7.0
+ * @since 2.7.0 PR #89
*/
class ProcessInvalidConfigException extends ProcessException
{
@@ -279,6 +280,7 @@ class ProcessInvalidConfigException extends ProcessException
* Class ProcessFatalException
* Exception for iProcess implementations.
* A big error occurred, we have to stop the iProcess processing.
+ * @since 2.5.0 N°1195
*/
class ProcessFatalException extends CoreException
{
diff --git a/core/dbobjectsearch.class.php b/core/dbobjectsearch.class.php
index 492c503c0..bd461b022 100644
--- a/core/dbobjectsearch.class.php
+++ b/core/dbobjectsearch.class.php
@@ -528,6 +528,8 @@ class DBObjectSearch extends DBSearch
}
/**
+ * Helper method for IN / NOT IN conditions : values won't be parsed in the expression tree, that will save some time !
+ *
* @param string $sFilterCode attribute code to use
* @param array $aValues
* @param bool $bPositiveMatch if true will add a IN filter, else a NOT IN
diff --git a/core/dbobjectset.class.php b/core/dbobjectset.class.php
index fec4798c7..076dbb954 100644
--- a/core/dbobjectset.class.php
+++ b/core/dbobjectset.class.php
@@ -424,7 +424,7 @@ class DBObjectSet implements iDBObjectSetIterator
*
* @api
*
- * @param bool $bWithId
+ * @param bool $bWithId if true array key will be set to object id
*
* @return DBObject[]
*
diff --git a/core/htmlsanitizer.class.inc.php b/core/htmlsanitizer.class.inc.php
index 5bcae80eb..b2a7aa4c7 100644
--- a/core/htmlsanitizer.class.inc.php
+++ b/core/htmlsanitizer.class.inc.php
@@ -160,65 +160,53 @@ class HTMLDOMSanitizer extends HTMLSanitizer
* @see https://www.itophub.io/wiki/page?id=2_6_0%3Aadmin%3Arich_text_limitations
*/
protected static $aTagsWhiteList = array(
- 'a' => array('href', 'name', 'style', 'target', 'title'),
- 'b' => array(),
- 'big' => array(),
- 'blockquote' => array('style'),
+ 'html' => array(),
'body' => array(),
+ 'a' => array('href', 'name', 'style', 'target', 'title'),
+ 'p' => array('style'),
+ 'blockquote' => array('style'),
'br' => array(),
- 'center' => array(),
- 'cite' => array(),
- 'code' => array('style', 'class'),
- 'del' => array(),
+ 'span' => array('style'),
'div' => array('style'),
+ 'b' => array(),
+ 'i' => array(),
+ 'u' => array(),
'em' => array(),
- 'fieldset' => array('style'),
- 'font' => array('face', 'color', 'style', 'size'),
+ 'strong' => array(),
+ 'img' => array('src', 'style', 'alt', 'title'),
+ 'ul' => array('style'),
+ 'ol' => array('style'),
+ 'li' => array('style'),
'h1' => array('style'),
'h2' => array('style'),
'h3' => array('style'),
'h4' => array('style'),
- 'hr' => array('style'),
- 'html' => array(),
- 'i' => array(),
- 'img' => array('src', 'style', 'alt', 'title'),
- 'ins' => array(),
- 'kbd' => array(),
- 'legend' => array('style'),
- 'li' => array('style'),
'nav' => array('style'),
- 'ol' => array('style'),
- 'p' => array('style'),
- 'pre' => array(),
- 'q' => array(),
- 'samp' => array(),
- 's' => array(), // strikethrough
'section' => array('style'),
- 'small' => array(),
- 'span' => array('style'),
- 'strong' => array(),
+ 'code' => array('style', 'class'),
'table' => array('style', 'width', 'summary', 'align', 'border', 'cellpadding', 'cellspacing'),
+ 'thead' => array('style'),
'tbody' => array('style'),
+ 'tr' => array('style', 'colspan', 'rowspan'),
'td' => array('style', 'colspan', 'rowspan'),
'th' => array('style', 'colspan', 'rowspan'),
- 'thead' => array('style'),
- 'tr' => array('style', 'colspan', 'rowspan'),
+ 'fieldset' => array('style'),
+ 'legend' => array('style'),
+ 'font' => array('face', 'color', 'style', 'size'),
+ 'big' => array(),
+ 'small' => array(),
'tt' => array(),
- 'u' => array(),
- 'ul' => array('style'),
+ 'kbd' => array(),
+ 'samp' => array(),
'var' => array(),
- );
-
- protected static $aTagsContentRemovableList = array(
- 'applet',
- 'basefont',
- 'canvas',
- 'code',
- 'dialog',
- 'embed',
- 'object',
- 'script',
- 'style',
+ 'del' => array(),
+ 's' => array(), // strikethrough
+ 'ins' => array(),
+ 'cite' => array(),
+ 'q' => array(),
+ 'hr' => array('style'),
+ 'pre' => array(),
+ 'center' => array(),
);
protected static $aAttrsWhiteList = array(
@@ -314,108 +302,6 @@ class HTMLDOMSanitizer extends HTMLSanitizer
}
protected function CleanNode(DOMNode $oElement)
- {
- $this->CleanNodeRemoveForbiddenTags($oElement);
- $this->CleanNodeHandleImages($oElement);
- $this->CleanNodeRemoveForbiddenAttributes($oElement);
- }
-
- protected function CleanNodeRemoveForbiddenTags(DOMNode $oElement)
- {
- if ($oElement->hasChildNodes())
- {
- $aValidatedNodes = array();
- do
- {
- $bChildRemoved = false;
-
- $aNodes = array();
- foreach($oElement->childNodes as $oNode)
- {
- $aNodes[] = $oNode;
- }
-
- foreach($aNodes as $oNode)
- {
- if (($oNode instanceof DOMElement) && (!array_key_exists(strtolower($oNode->tagName), self::$aTagsWhiteList)))
- {
- $bChildRemoved = true;
- $this->SmartRemoveChild($oElement, $oNode);
- }
- else if ($oNode instanceof DOMComment)
- {
- $oElement->removeChild($oNode);
- }
- else
- {
- //if the node is kept, we can recurse into it, bu we want to perform this only once (see the do/while above?)
- $bAlreadyValidated = false;
- /** @var \DOMNode $oValidatedNode */
- foreach ($aValidatedNodes as $oValidatedNode)
- {
- if ($oValidatedNode->isSameNode($oNode))
- {
- $bAlreadyValidated = true;
- break;
- }
- }
- if (! $bAlreadyValidated)
- {
- $this->CleanNodeRemoveForbiddenTags($oNode);
- $aValidatedNodes[] = $oNode;
- }
- }
- }
- } while ($bChildRemoved);
- }
- }
-
- /**
- * Remove a node, but move its inner nodes in the parent.
- * Note: invalid/forbidden tags may be moved up, so they have to be checked again.
- *
- * @param \DOMNode $oParent
- * @param \DOMElement $oRemovable
- */
- private function SmartRemoveChild(DOMNode $oParent, DOMElement $oRemovable)
- {
- if (!$oRemovable->hasChildNodes())
- {
- $oParent->removeChild($oRemovable);
- }
- else if (in_array(strtolower($oRemovable->tagName), self::$aTagsContentRemovableList))
- {
- $oParent->removeChild($oRemovable);
- }
- else
- {
- /** @var \DOMNode $oNode */
- foreach ($oRemovable->childNodes as $oNode)
- {
- $oNode = $oNode->cloneNode(true);
- $oParent->insertBefore($oNode, $oRemovable);
- }
-
- $oParent->removeChild($oRemovable);
- }
- }
-
- protected function CleanNodeHandleImages(DOMNode $oElement)
- {
- if ($oElement->hasChildNodes())
- {
- foreach($oElement->childNodes as $oNode)
- {
- $this->CleanNodeHandleImages($oNode);
- if (($oNode instanceof DOMElement) && (strtolower($oNode->tagName) == 'img'))
- {
- InlineImage::ProcessImageTag($oNode);
- }
- }
- }
- }
-
- protected function CleanNodeRemoveForbiddenAttributes(DOMNode $oElement)
{
$aAttrToRemove = array();
// Gather the attributes to remove
@@ -455,12 +341,35 @@ class HTMLDOMSanitizer extends HTMLSanitizer
$oElement->removeAttribute($sName);
}
}
-
+
if ($oElement->hasChildNodes())
{
+ $aChildElementsToRemove = array();
+ // Gather the child noes to remove
foreach($oElement->childNodes as $oNode)
{
- $this->CleanNodeRemoveForbiddenAttributes($oNode);
+ if (($oNode instanceof DOMElement) && (!array_key_exists(strtolower($oNode->tagName), self::$aTagsWhiteList)))
+ {
+ $aChildElementsToRemove[] = $oNode;
+ }
+ else if ($oNode instanceof DOMComment)
+ {
+ $aChildElementsToRemove[] = $oNode;
+ }
+ else
+ {
+ // Recurse
+ $this->CleanNode($oNode);
+ if (($oNode instanceof DOMElement) && (strtolower($oNode->tagName) == 'img'))
+ {
+ InlineImage::ProcessImageTag($oNode);
+ }
+ }
+ }
+ // Now remove them
+ foreach($aChildElementsToRemove as $oDomElement)
+ {
+ $oElement->removeChild($oDomElement);
}
}
}
diff --git a/core/ormlinkset.class.inc.php b/core/ormlinkset.class.inc.php
index 0c030b161..7de3624fa 100644
--- a/core/ormlinkset.class.inc.php
+++ b/core/ormlinkset.class.inc.php
@@ -145,7 +145,8 @@ class ormLinkSet implements iDBObjectSetIterator, Iterator, SeekableIterator
/**
* @param DBObject $oObject
* @param string $sClassAlias
- * @deprecated Since iTop 2.4, use ormLinkset->AddItem() instead.
+ *
+ * @deprecated Since iTop 2.4, use {@link \ormLinkSet::AddItem()} instead.
*/
public function AddObject(DBObject $oObject, $sClassAlias = '')
{
diff --git a/datamodels/2.x/itop-portal-base/portal/composer.json b/datamodels/2.x/itop-portal-base/portal/composer.json
index 0042dcb7f..92a2d0e13 100644
--- a/datamodels/2.x/itop-portal-base/portal/composer.json
+++ b/datamodels/2.x/itop-portal-base/portal/composer.json
@@ -1,8 +1,5 @@
{
"license": "AGPLv3",
- "config": {
- "classmap-authoritative": true
- },
"autoload": {
"psr-4": {
"Combodo\\iTop\\Portal\\": "src/"
diff --git a/datamodels/2.x/version.xml b/datamodels/2.x/version.xml
index 57807b22e..dc3738058 100755
--- a/datamodels/2.x/version.xml
+++ b/datamodels/2.x/version.xml
@@ -1,4 +1,4 @@
baz
zabbaz
zabbar
', - 'expected' => 0, - ), - 'basic image' => array( - 'html' => '