diff --git a/application/dashboard.class.inc.php b/application/dashboard.class.inc.php index f480bbde2..73aa9947f 100644 --- a/application/dashboard.class.inc.php +++ b/application/dashboard.class.inc.php @@ -563,8 +563,8 @@ JS } if (!$bEditMode) { - $oPage->add_linked_script('../js/dashlet.js'); - $oPage->add_linked_script('../js/dashboard.js'); + $oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot() . 'js/dashlet.js'); + $oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot() . 'js/dashboard.js'); } return $oDashboard; diff --git a/application/ui.extkeywidget.class.inc.php b/application/ui.extkeywidget.class.inc.php index dcfb067b9..87ca6934f 100644 --- a/application/ui.extkeywidget.class.inc.php +++ b/application/ui.extkeywidget.class.inc.php @@ -161,8 +161,8 @@ class UIExtKeyWidget public function DisplaySelect(WebPage $oPage, $iMaxComboLength, $bAllowTargetCreation, $sTitle, DBObjectset $oAllowedValues, $value, $bMandatory, $sFieldName, $sFormPrefix = '', $aArgs = array(), &$sInputType = '') { $sTitle = addslashes($sTitle); - $oPage->add_linked_script('../js/extkeywidget.js'); - $oPage->add_linked_script('../js/forms-json-utils.js'); + $oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot() . 'js/extkeywidget.js'); + $oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot() . 'js/forms-json-utils.js'); $bCreate = (!$this->bSearchMode) && (UserRights::IsActionAllowed($this->sTargetClass, UR_ACTION_MODIFY) && $bAllowTargetCreation); $bExtensions = true; @@ -368,7 +368,7 @@ JS */ public function DisplayRadio(WebPage $oPage, $iMaxComboLength, $bAllowTargetCreation, DBObjectset $oAllowedValues, $value, $sFieldName, $sDisplayStyle) { - $oPage->add_linked_script('../js/forms-json-utils.js'); + $oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot() . 'js/forms-json-utils.js'); $bCreate = (!$this->bSearchMode) && (UserRights::IsActionAllowed($this->sTargetClass, UR_ACTION_BULK_MODIFY) && $bAllowTargetCreation); $bExtensions = true; @@ -477,8 +477,8 @@ JS $this->bSearchMode = $bSearchMode; } $sTitle = addslashes($sTitle); - $oPage->add_linked_script('../js/extkeywidget.js'); - $oPage->add_linked_script('../js/forms-json-utils.js'); + $oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot() . 'js/extkeywidget.js'); + $oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot() . 'js/forms-json-utils.js'); $bCreate = (!$this->bSearchMode) && (UserRights::IsActionAllowed($this->sTargetClass, UR_ACTION_BULK_MODIFY) && $bAllowTargetCreation); $bExtensions = true; diff --git a/pages/UI.php b/pages/UI.php index aef1f3cd0..673ce2391 100644 --- a/pages/UI.php +++ b/pages/UI.php @@ -350,7 +350,7 @@ try case 'stimulus': // Form displayed when applying a stimulus (state change) case 'apply_stimulus': // Form displayed when applying a stimulus (state change) foreach (ObjectController::EnumRequiredForModificationJsFilesRelPaths() as $sJsFileRelPath) { - $oP->add_linked_script("../$sJsFileRelPath"); + $oP->add_linked_script(utils::GetAbsoluteUrlAppRoot() . "$sJsFileRelPath"); } break; } diff --git a/pages/UniversalSearch.php b/pages/UniversalSearch.php index 4c8dc4585..f1ea3bc40 100644 --- a/pages/UniversalSearch.php +++ b/pages/UniversalSearch.php @@ -33,11 +33,11 @@ ApplicationMenu::CheckMenuIdEnabled('UniversalSearchMenu'); $oAppContext = new ApplicationContext(); $oP = new iTopWebPage(Dict::S('UI:UniversalSearchTitle')); -$oP->add_linked_script("../js/forms-json-utils.js"); -$oP->add_linked_script("../js/wizardhelper.js"); -$oP->add_linked_script("../js/wizard.utils.js"); -$oP->add_linked_script("../js/extkeywidget.js"); -$oP->add_linked_script("../js/jquery.blockUI.js"); +$oP->add_linked_script(utils::GetAbsoluteUrlAppRoot() . "js/forms-json-utils.js"); +$oP->add_linked_script(utils::GetAbsoluteUrlAppRoot() . "js/wizardhelper.js"); +$oP->add_linked_script(utils::GetAbsoluteUrlAppRoot() . "js/wizard.utils.js"); +$oP->add_linked_script(utils::GetAbsoluteUrlAppRoot() . "js/extkeywidget.js"); +$oP->add_linked_script(utils::GetAbsoluteUrlAppRoot() . "js/jquery.blockUI.js"); // From now on the context is limited to the the selected organization ?? diff --git a/pages/tagadmin.php b/pages/tagadmin.php index 9f0aa8c4b..324b153a6 100644 --- a/pages/tagadmin.php +++ b/pages/tagadmin.php @@ -37,11 +37,11 @@ try // Main program // $oP = new iTopWebPage(Dict::S('Menu:TagAdminMenu+')); - $oP->add_linked_script("../js/forms-json-utils.js"); - $oP->add_linked_script("../js/wizardhelper.js"); - $oP->add_linked_script("../js/wizard.utils.js"); - $oP->add_linked_script("../js/extkeywidget.js"); - $oP->add_linked_script("../js/jquery.blockUI.js"); + $oP->add_linked_script(utils::GetAbsoluteUrlAppRoot() . "js/forms-json-utils.js"); + $oP->add_linked_script(utils::GetAbsoluteUrlAppRoot() . "js/wizardhelper.js"); + $oP->add_linked_script(utils::GetAbsoluteUrlAppRoot() . "js/wizard.utils.js"); + $oP->add_linked_script(utils::GetAbsoluteUrlAppRoot() . "js/extkeywidget.js"); + $oP->add_linked_script(utils::GetAbsoluteUrlAppRoot() . "js/jquery.blockUI.js"); $sBaseClass = 'TagSetFieldData'; $sClass = utils::ReadParam('class', '', false, 'class'); diff --git a/setup/setuppage.class.inc.php b/setup/setuppage.class.inc.php index e856d5722..bc3c5d2df 100644 --- a/setup/setuppage.class.inc.php +++ b/setup/setuppage.class.inc.php @@ -39,10 +39,10 @@ class SetupPage extends NiceWebPage public function __construct($sTitle) { parent::__construct($sTitle); - $this->add_linked_script("../js/jquery.blockUI.js"); + $this->add_linked_script(utils::GetAbsoluteUrlAppRoot() . "js/jquery.blockUI.js"); $this->add_linked_script(utils::GetAbsoluteUrlAppRoot().'node_modules/@popperjs/core/dist/umd/popper.js'); $this->add_linked_script(utils::GetAbsoluteUrlAppRoot().'node_modules/tippy.js/dist/tippy-bundle.umd.js'); - $this->add_linked_script("../setup/setup.js"); + $this->add_linked_script(utils::GetAbsoluteUrlAppRoot() . "setup/setup.js"); $this->add_linked_stylesheet(utils::GetAbsoluteUrlAppRoot().'css/font-awesome/css/all.min.css'); $this->add_linked_stylesheet(utils::GetAbsoluteUrlAppRoot().'css/font-combodo/font-combodo.css'); $this->add_linked_stylesheet(utils::GetAbsoluteUrlAppRoot().'node_modules/tippy.js/dist/tippy.css'); diff --git a/setup/wizardcontroller.class.inc.php b/setup/wizardcontroller.class.inc.php index 1f0846f34..25a912b67 100644 --- a/setup/wizardcontroller.class.inc.php +++ b/setup/wizardcontroller.class.inc.php @@ -217,7 +217,7 @@ HTML; } } } - $oPage->add_linked_script('../setup/setup.js'); + $oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot() . 'setup/setup.js'); $oPage->add_script("function CanMoveForward()\n{\n".$oStep->JSCanMoveForward()."\n}\n"); $oPage->add_script("function CanMoveBackward()\n{\n".$oStep->JSCanMoveBackward()."\n}\n"); $oPage->add('
'); diff --git a/setup/wizardsteps.class.inc.php b/setup/wizardsteps.class.inc.php index 25baef6f3..a26f16846 100644 --- a/setup/wizardsteps.class.inc.php +++ b/setup/wizardsteps.class.inc.php @@ -2307,7 +2307,7 @@ class WizStepSummary extends WizardStep $oPage->add('
Progress of the installation'); $oPage->add('
'); - $oPage->add_linked_script('../setup/jquery.progression.js'); + $oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot() . 'setup/jquery.progression.js'); $oPage->add('

Ready to start...

0%
'); $oPage->add('
'); // progress_content $oPage->add('
'); diff --git a/sources/Application/WebPage/ErrorPage.php b/sources/Application/WebPage/ErrorPage.php index a3d978bab..87918acd6 100644 --- a/sources/Application/WebPage/ErrorPage.php +++ b/sources/Application/WebPage/ErrorPage.php @@ -26,8 +26,8 @@ class ErrorPage extends NiceWebPage { $oKpi = new ExecutionKPI(); parent::__construct($sTitle); - $this->add_linked_script("../js/jquery.blockUI.js"); - $this->add_linked_script("../setup/setup.js"); + $this->add_linked_script(utils::GetAbsoluteUrlAppRoot() . "js/jquery.blockUI.js"); + $this->add_linked_script(utils::GetAbsoluteUrlAppRoot() . "setup/setup.js"); $this->add_linked_stylesheet(utils::GetAbsoluteUrlAppRoot().'css/font-awesome/css/all.min.css'); $this->add_linked_stylesheet(utils::GetAbsoluteUrlAppRoot().'css/font-combodo/font-combodo.css'); $this->add_saas("css/setup.scss"); diff --git a/sources/Application/WebPage/WebPage.php b/sources/Application/WebPage/WebPage.php index 1144b97de..43b93e857 100644 --- a/sources/Application/WebPage/WebPage.php +++ b/sources/Application/WebPage/WebPage.php @@ -735,15 +735,28 @@ class WebPage implements Page * Add a script (as an include, i.e. link) to the header of the page.
* Handles duplicates : calling twice with the same script will add the script only once * - * @uses WebPage::$a_linked_scripts - * @param string $s_linked_script + * @param string $sLinkedScriptAbsUrl + * * @return void + * @uses WebPage::$a_linked_scripts + * @since 3.2.0 N°6935 $sLinkedScriptAbsUrl MUST be an absolute URL */ - public function add_linked_script($s_linked_script) + public function add_linked_script($sLinkedScriptAbsUrl) { - if (!empty(trim($s_linked_script))) { - $this->a_linked_scripts[$s_linked_script] = $s_linked_script; + // Ensure there is actually an URI + if (utils::IsNullOrEmptyString(trim($sLinkedScriptAbsUrl))) { + return; } + + // Check if URI is absolute ("://" do allow any protocol), otherwise warn that it's a deprecated behavior + if (false === stripos($sLinkedScriptAbsUrl, "://")) { + IssueLog::Warning("Linked script added to page with a non absolute URL, which may lead to it not being loaded and causing javascript errors.", null, [ + "linked_script_url" => $sLinkedScriptAbsUrl, + "request_uri" => $_SERVER['REQUEST_URI'], + ]); + } + + $this->a_linked_scripts[$sLinkedScriptAbsUrl] = $sLinkedScriptAbsUrl; } /** diff --git a/sources/Controller/Base/Layout/ObjectController.php b/sources/Controller/Base/Layout/ObjectController.php index c8c557b54..3c45090ab 100644 --- a/sources/Controller/Base/Layout/ObjectController.php +++ b/sources/Controller/Base/Layout/ObjectController.php @@ -771,7 +771,7 @@ JS; protected function AddRequiredForModificationJsFilesToPage(iTopWebPage &$oPage): void { foreach (static::EnumRequiredForModificationJsFilesRelPaths() as $sJsFileRelPath) { - $oPage->add_linked_script("../$sJsFileRelPath"); + $oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot() . "$sJsFileRelPath"); } }