ComputeAndReport("Session Start"); $sEnvFullPath = APPROOT.'env-'.$sEnvironment; $sPageRelativePath = $sModule.'/'.$sPage; $sPageEnvFullPath = $sEnvFullPath.'/'.$sPageRelativePath; if (is_link($sPageEnvFullPath)) { $oConfig = utils::GetConfig(); $sSourceDir = $oConfig->Get('source_dir'); // generated at compile time, works for legacy build with datamodels/1.x // in case module was compiled to symlink, we need to check against real linked path as symlink is resolved $aPossibleBasePaths = [ APPROOT.$sSourceDir, APPROOT.'extensions', APPROOT.'data/'.$sEnvironment.'-modules', APPROOT.'data/downloaded-extensions', // Hub connector ]; } else { $aPossibleBasePaths = [$sEnvFullPath]; } $sTargetPage = CheckPageExists($sPageEnvFullPath, $aPossibleBasePaths); if ($sTargetPage === false || $sModule === 'core' || $sModule === 'dictionaries') { // Do not recall the page parameters (security takes precedence) echo "Wrong module, page name or environment..."; exit; } ///////////////////////////////////////// // // GO! // // check module white list // check conf param // force login if needed $aModuleDelegatedAuthenticationEndpointsList = GetModuleDelegatedAuthenticationEndpoints($sModule); // If module doesn't have the delegated authentication endpoints list defined, we rely on the conf. param. to decide if we force login or not. if (is_null($aModuleDelegatedAuthenticationEndpointsList)) { $bForceLoginWhenNoDelegatedAuthenticationEndpoints = !utils::GetConfig()->Get('security.disable_exec_forced_login_for_all_enpoints'); if ($bForceLoginWhenNoDelegatedAuthenticationEndpoints) { require_once(APPROOT.'/application/startup.inc.php'); LoginWebPage::DoLoginEx(); } } // If module defined a delegated authentication endpoints but not for the current page, we consider that the page is not allowed to be executed without login if (is_array($aModuleDelegatedAuthenticationEndpointsList) && !in_array($sPage, $aModuleDelegatedAuthenticationEndpointsList)) { require_once(APPROOT.'/application/startup.inc.php'); LoginWebPage::DoLoginEx(); } // If user is not logged in, log a warning in the log file as the page is executed without login, which is not recommended for security reason if (is_null($aModuleDelegatedAuthenticationEndpointsList) && !UserRights::IsLoggedIn()) { require_once(APPROOT.'/application/startup.inc.php'); IssueLog::Debug("The '$sPage' page is executed without logging in. This call will be blocked in the future and will likely cause unwanted behaviour in the '$sModule' module. Please define a delegated authentication endpoint for the module, as described at https://www.itophub.io/wiki/page?id=latest:customization:new_extension#security."); } require_once($sTargetPage); function GetModuleDelegatedAuthenticationEndpoints(string $sModuleName): ?array { $sModuleFile = utils::GetAbsoluteModulePath($sModuleName).'/module.'.$sModuleName.'.php'; if (!file_exists($sModuleFile)) { echo 'Wrong module, page name or environment...'; exit; } require_once APPROOT.'setup/extensionsmap.class.inc.php'; $oExtensionMap = new iTopExtensionsMap(); $aModuleParam = $oExtensionMap->GetModuleInfo($sModuleFile)[2]; return $aModuleParam['delegated_authentication_endpoints'] ?? null; }