Compare commits

..

7 Commits

7914 changed files with 193926 additions and 481219 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 MiB

View File

@@ -1,14 +1,7 @@
# iTop version history # iTop version history
```mermaid ```mermaid
%%{init: { 'logLevel': 'debug', 'theme': 'base', 'themeVariables': { %%{init: { 'logLevel': 'debug', 'theme': 'base', 'gitGraph': {'showBranches': true,'mainBranchName': 'develop','rotateCommitLabel': true}} }%%
'git0': 'lawngreen',
'git3': 'dodgerblue',
'git4': 'grey',
'git5': 'grey',
'git6': 'grey',
'git7': 'grey'
}, 'gitGraph': {'showBranches': true,'mainBranchName': 'develop','rotateCommitLabel': true}} }%%
gitGraph gitGraph
commit id: "2016-07-06" tag: "2.3.0" type: HIGHLIGHT commit id: "2016-07-06" tag: "2.3.0" type: HIGHLIGHT
branch support/2.3 order: 900 branch support/2.3 order: 900
@@ -69,36 +62,6 @@ gitGraph
commit id: "2022-12-28" tag: "2.7.8" commit id: "2022-12-28" tag: "2.7.8"
checkout support/3.0 checkout support/3.0
commit id: "2023-04-12" tag: "3.0.3" commit id: "2023-04-12" tag: "3.0.3"
checkout develop
commit id: "2023-06-19" tag: "3.1.0-beta" type: REVERSE
commit id: "2023-07-26" tag: "3.1.0-1" type: HIGHLIGHT
branch support/3.1 order: 840
checkout support/3.1
commit id: "2023-08-09" tag: "3.1.0-2"
checkout support/2.7
commit id: "2023-08-10" tag: "2.7.9"
checkout support/3.1
commit id: "2023-12-20" tag: "3.1.1"
checkout develop
commit id: "2024-01-15" tag: "Start 3.2" type: HIGHLIGHT
branch support/3.2 order: 830
checkout support/2.7
commit id: "2024-01-17a" tag: "2.7.10"
checkout support/3.0
commit id: "2024-01-17b" tag: "3.0.4"
checkout support/2.7
commit id: "2024-09-28" tag: "2.7.11"
checkout support/3.1
commit id: "2024-09-27" tag: "3.1.2"
checkout support/3.2
commit id: "2024-06-25" tag: "3.2.0-beta1" type: REVERSE
commit id: "2024-08-07" tag: "3.2.0"
checkout support/2.7
commit id: "2025-02-25" tag: "2.7.12"
checkout support/3.1
commit id: "2025-02-25 " tag: "3.1.3"
checkout support/3.2
commit id: "2025-02-25 " tag: "3.2.1"
``` ```
To learn more, check the [iTop community versions history on the official wiki](https://www.itophub.io/wiki/page?id=latest:release:start). To learn more, check the [iTop community versions history on the official wiki](https://www.itophub.io/wiki/page?id=latest:release:start).

View File

@@ -1,83 +0,0 @@
<!--
IMPORTANT: Please follow the guidelines within this PR template before submitting it, it will greatly help us process your PR. 🙏
Any PRs not following the guidelines or with missing information will not be considered.
-->
## Base information
| Question | Answer
|---------------------------------------------------------------|--------
| Related to a SourceForge thead / Another PR / Combodo ticket? | <!-- Put the URL -->
| Type of change? | Bug fix / Enhancement / Translations
## Symptom (bug) / Objective (enhancement)
<!--
If it's a bug
- Explain the symptom in details
- If possible put error messages, logs or screenshots (you can paste image directly in this editor).
If it's an enhancement
- Describe what is blocking you, what is the objective with as much details as possible.
- Add screenshots if it's related to UI.
-->
## Reproduction procedure (bug)
<!--
Remove this section only if it's NOT a bug.
Otherwise, explain step by step how to reproduce the issue on a standard iTop Community.
If it requires a custom datamodel, provide the minimal XML delta to reproduce it on a standard iTop Community.
-->
1. On iTop x.y.z <!-- Put complete iTop version (eg. 3.1.0-2) -->
2. With PHP x.y.z <!-- Put complete PHP version (eg. 8.1.24) -->
2. First go there
2. Then do that
3. ...
4. Finally, see that...
## Cause (bug)
<!--
Remove this section only if it's NOT a bug.
Otherwise, explain what is the cause of the issue (where in the code and why)
-->
## Proposed solution (bug and enhancement)
<!--
Explain in details how you are proposing to solve this:
- What did you do in the code and why
- If you changed something in the UI, put before / after screenshots (you can paste image directly in this editor)
-->
## Checklist before requesting a review
<!--
Don't remove these lines, check them once done.
-->
- [ ] I have performed a self-review of my code
- [ ] I have tested all changes I made on an iTop instance
- [ ] I have added a unit test, otherwise I have explained why I couldn't
- [ ] Is the PR clear and detailed enough so anyone can understand digging in the code?
## Checklist of things to do before PR is ready to merge
<!--
Things that needs to be done in the PR before it can be considered as ready to be merged
Examples:
- Changes requested in the review
- Unit test to add
- Dictionary entries to translate
- ...
-->
- [ ] ...
- [ ] ...
- [ ] ...

View File

@@ -1,43 +0,0 @@
name: Add PRs to Combodo PRs Dashboard
on:
pull_request_target:
types:
- opened
jobs:
add-to-project:
name: Add PR to Combodo Project
runs-on: ubuntu-latest
steps:
- name: Check if author is a member of the organization
id: check-membership
run: |
ORG="Combodo"
AUTHOR=$(jq -r .pull_request.user.login "$GITHUB_EVENT_PATH")
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: token ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}" \
"https://api.github.com/orgs/$ORG/members/$AUTHOR")
if [ "$RESPONSE" == "404" ]; then
echo "project_url=https://github.com/orgs/Combodo/projects/5" >> $GITHUB_ENV
echo "is_member=false" >> $GITHUB_ENV
else
echo "project_url=https://github.com/orgs/Combodo/projects/4" >> $GITHUB_ENV
echo "is_member=true" >> $GITHUB_ENV
fi
- name: Add internal tag if member
if: env.is_member == 'true'
run: |
curl -X POST -H "Authorization: token ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/Combodo/iTop/issues/${{ github.event.pull_request.number }}/labels \
-d '{"labels":["internal"]}'
env:
is_member: ${{ env.is_member }}
- name: Add PR to the appropriate project
uses: actions/add-to-project@v1.0.2
with:
project-url: ${{ env.project_url }}
github-token: ${{ secrets.PR_AUTOMATICALLY_ADD_TO_PROJECT }}

12
.gitignore vendored
View File

@@ -37,9 +37,7 @@ tests/*/vendor/*
# iTop extensions # iTop extensions
/extensions/** /extensions/**
!/extensions/.htaccess
!/extensions/readme.txt !/extensions/readme.txt
!/extensions/web.config
# all logs but listing prevention # all logs but listing prevention
/log/** /log/**
@@ -47,16 +45,8 @@ tests/*/vendor/*
!/log/index.php !/log/index.php
!/log/web.config !/log/web.config
# NPM: `jquery-ui` package is just there for vulnerability scans, so we don't want to version its files (only `jquery-ui-dist` is used within the code base) # PHPUnit cache file
/node_modules/jquery-ui/**
# Symfony: Local env file
/resources/symfony/.env.local
# PHPUnit: Cache file, local XML working copies
/tests/php-unit-tests/.phpunit.result.cache /tests/php-unit-tests/.phpunit.result.cache
/tests/php-unit-tests/phpunit.xml
/tests/php-unit-tests/postbuild_integration.xml
# Jetbrains # Jetbrains

View File

@@ -4,7 +4,7 @@ $iBeginTime = time();
chdir(__DIR__); chdir(__DIR__);
$aCommands = [ $aCommands = [
'php composer/rmUnnecessaryFolders.php', 'php composer/rmDeniedTestDir.php',
'php build/commands/setupCssCompiler.php', 'php build/commands/setupCssCompiler.php',
// 'bash /tmp/gabuzomeu.sh', // 'bash /tmp/gabuzomeu.sh',
]; ];
@@ -22,13 +22,13 @@ $iElapsed = time() - $iBeginTime;
if (count($aFailedCommands)) if (count($aFailedCommands))
{ {
fwrite(STDERR, "\nafterBuild execution failed! (in {$iElapsed}s)\n"); fwrite(STDERR, "\nafterBuild execution failed! (in ${iElapsed}s)\n");
fwrite(STDERR, "List of failling commands:\n - " . implode("\n - ", $aFailedCommands) . "\n"); fwrite(STDERR, "List of failling commands:\n - " . implode("\n - ", $aFailedCommands) . "\n");
exit(1); exit(1);
} }
echo "\nDone ({$iElapsed}s)\n"; echo "\nDone (${iElapsed}s)\n";
exit(0); exit(0);
/** /**
@@ -74,7 +74,7 @@ function ExecCommand($cmd) {
} }
else else
{ {
echo "| elapsed:{$iElapsed}s \n"; echo "| elapsed:${iElapsed}s \n";
} }
if (!empty($stderr)) if (!empty($stderr))

View File

@@ -1,7 +1,7 @@
<?php <?php
/** /**
* Copyright (C) 2010-2024 Combodo SAS * Copyright (C) 2010-2023 Combodo SARL
* *
* This file is part of iTop. * This file is part of iTop.
* *
@@ -27,7 +27,7 @@ $iTopFolder = __DIR__."/../../../";
require_once("$iTopFolder/approot.inc.php"); require_once("$iTopFolder/approot.inc.php");
require_once(APPROOT."/application/utils.inc.php"); require_once(APPROOT."/application/utils.inc.php");
if (PHP_SAPI !== 'cli') if (php_sapi_name() !== 'cli')
{ {
throw new \Exception('This script can only run from CLI'); throw new \Exception('This script can only run from CLI');
} }
@@ -48,4 +48,4 @@ if (!file_exists($sCssFile))
{ {
fwrite(STDERR, "Failed to compile $sCssFile, exiting."); fwrite(STDERR, "Failed to compile $sCssFile, exiting.");
exit(1); exit(1);
} }

View File

@@ -1,6 +1,6 @@
<?php <?php
/** /**
* Copyright (C) 2010-2024 Combodo SAS * Copyright (C) 2010-2023 Combodo SARL
* *
* This file is part of iTop. * This file is part of iTop.
* *
@@ -26,7 +26,7 @@
* @link https://getcomposer.org/doc/03-cli.md#show * @link https://getcomposer.org/doc/03-cli.md#show
*/ */
$iTopFolder = __DIR__."/../../../"; $iTopFolder = __DIR__."/../../";
require_once("$iTopFolder/approot.inc.php"); require_once("$iTopFolder/approot.inc.php");
$sApproot = APPROOT; $sApproot = APPROOT;

View File

@@ -0,0 +1,73 @@
<?php
/**
* Copyright (C) 2010-2023 Combodo SARL
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with iTop. If not, see <http: *www.gnu.org/licenses/>
*
*/
use Combodo\iTop\Composer\iTopComposer;
$iTopFolder = __DIR__ . "/../../" ;
require_once ("$iTopFolder/approot.inc.php");
require_once (APPROOT."/setup/setuputils.class.inc.php");
if (php_sapi_name() !== 'cli')
{
throw new \Exception('This script can only run from CLI');
}
clearstatcache();
$oiTopComposer = new iTopComposer();
$aDeniedButStillPresent = $oiTopComposer->ListDeniedButStillPresent();
echo "\n";
foreach ($aDeniedButStillPresent as $sDir)
{
if (false === iTopComposer::IsTestDir($sDir))
{
echo "ERROR found INVALID denied test dir: '$sDir'\n";
throw new \Exception("$sDir must end with /Test/ or /test/");
}
if (false === file_exists($sDir)) {
echo "INFO $sDir is in denied list, but not existing on disk => skipping !\n";
continue;
}
try {
SetupUtils::rrmdir($sDir);
echo "OK Remove denied test dir: '$sDir'\n";
}
catch (\Exception $e) {
echo "\nFAILED to remove denied test dir: '$sDir'\n";
}
}
$aAllowedAndDeniedDirs = array_merge(
$oiTopComposer->ListAllowedTestDir(),
$oiTopComposer->ListDeniedTestDir()
);
$aExistingDirs = $oiTopComposer->ListAllTestDir();
$aMissing = array_diff($aExistingDirs, $aAllowedAndDeniedDirs);
if (false === empty($aMissing)) {
echo "Some new tests dirs exists !\n"
.' They must be declared either in the allowed or denied list in '.iTopComposer::class." (see N°2651).\n"
.' List of dirs:'."\n".var_export($aMissing, true);
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,56 +0,0 @@
courier.php
courierb.php
courierbi.php
courieri.php
dejavusans.ctg.z
dejavusans.php
dejavusans.z
dejavusansb.ctg.z
dejavusansb.php
dejavusansb.z
dejavusansbi.ctg.z
dejavusansbi.php
dejavusansbi.z
dejavusanscondensed.ctg.z
dejavusanscondensed.php
dejavusanscondensed.z
dejavusanscondensedb.ctg.z
dejavusanscondensedb.php
dejavusanscondensedb.z
dejavusanscondensedbi.ctg.z
dejavusanscondensedbi.php
dejavusanscondensedbi.z
dejavusanscondensedi.ctg.z
dejavusanscondensedi.php
dejavusanscondensedi.z
dejavusansextralight.ctg.z
dejavusansextralight.php
dejavusansextralight.z
dejavusansi.ctg.z
dejavusansi.php
dejavusansi.z
dejavusansmono.ctg.z
dejavusansmono.php
dejavusansmono.z
dejavusansmonob.ctg.z
dejavusansmonob.php
dejavusansmonob.z
dejavusansmonobi.ctg.z
dejavusansmonobi.php
dejavusansmonobi.z
dejavusansmonoi.ctg.z
dejavusansmonoi.php
dejavusansmonoi.z
droidsansfallback.ctg.z
droidsansfallback.php
droidsansfallback.z
helvetica.php
helveticab.php
helveticabi.php
helveticai.php
symbol.php
times.php
timesb.php
timesbi.php
timesi.php
zapfdingbats.php

View File

@@ -1,101 +0,0 @@
<?php
/**
* This script will copy custom fonts in the TCPDF lib fonts directory.
* If you need to add other files :
* - add the corresponding files in this script directory
* - modify this script to copy also your files
*
* @since 2.7.0 N°1947 add DroidSansFallback font (see also PR #49 in the links below)
* @since 2.7.0 N°2435 TCPPDF lib forked and added in composer.json (at that time the lib was announced as deprecated and rewritten in tecnickcom/tc-lib-pdf)
* @since 3.2.0 N°7175 switch back to TCPDF original lib (which is finally still maintained, tecnickcom/tc-lib-pdf us still under dev), script creation to keep custom DroidSansFallback font
*
* @link https://github.com/Combodo/iTop/pull/49 add DroidSansFallback font
* @link https://github.com/tecnickcom/TCPDF?tab=readme-ov-file#note TCPDF is in support only mode
*/
$sItopRootFolder = realpath(__DIR__ . "/../../../../");
$sCurrentScriptFileName = basename(__FILE__);
require_once ("$sItopRootFolder/lib/autoload.php");
$sTcPdfRootFolder = $sItopRootFolder.'/lib/tecnickcom/tcpdf';
if (false === file_exists($sTcPdfRootFolder)) {
echo $sCurrentScriptFileName.": No TCPDF lib detected, exiting !\n";
return;
}
$sTcPdfFontsFolder = $sTcPdfRootFolder.'/Fonts/';
/**
* 1) Cleaning up the fonts directory to keep only the ones we want in iTop
*/
echo $sCurrentScriptFileName.": ---1) Cleaning up the fonts files\n";
$aTcpdfDefaultFontsToKeepInItop = file(__DIR__.'/tcpdfDefaultFontsToKeepInItop.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$aTcpdfFontsDirContent = scandir($sTcPdfFontsFolder);
foreach ($aTcpdfFontsDirContent as $sTcpdfFontResourceName) {
if ($sTcpdfFontResourceName === '.') {
continue;
}
if ($sTcpdfFontResourceName === '..') {
continue;
}
if (!in_array($sTcpdfFontResourceName, $aTcpdfDefaultFontsToKeepInItop, true)) {
echo $sCurrentScriptFileName.": Removing $sTcpdfFontResourceName !\n";
$sTcpdfFontResourceFullPath = $sTcPdfFontsFolder.$sTcpdfFontResourceName;
if (is_file($sTcpdfFontResourceFullPath)) {
unlink($sTcpdfFontResourceFullPath);
} elseif (is_dir($sTcpdfFontResourceFullPath)) {
rrmdir($sTcpdfFontResourceFullPath);
}
}
}
/**
* 2) Then adding the DroidSansFallback font (useful for CJK data for example)
*/
echo $sCurrentScriptFileName.": ---2) Copying font files to TCPDF ($sTcPdfFontsFolder)...\n";
$aFontFilesToCopy = glob(__DIR__.'\droidsansfallback.*');
foreach ($aFontFilesToCopy as $sFontFileToCopy) {
$sFontFileName = basename($sFontFileToCopy);
echo $sCurrentScriptFileName.': copying '.$sFontFileName."\n";
copy($sFontFileToCopy, $sTcPdfFontsFolder.$sFontFileName);
}
echo $sCurrentScriptFileName.": Done !\n";
/*-----------------------------------------------------------------------------------------------*/
/**
* Recursively delete a directory and its content
*
* @param $sDirToRemovePath
*
* @return void
*/
function rrmdir($sDirToRemovePath):void
{
if (is_dir($sDirToRemovePath)) {
$objects = scandir($sDirToRemovePath);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (filetype($sDirToRemovePath."/".$object) == "dir") {
rrmdir($sDirToRemovePath."/".$object);
} else {
unlink($sDirToRemovePath."/".$object);
}
}
}
reset($objects);
rmdir($sDirToRemovePath);
}
}

View File

@@ -1,51 +0,0 @@
<?php
/**
* Copyright (C) 2010-2024 Combodo SAS
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with iTop. If not, see <http: *www.gnu.org/licenses/>
*
*/
/**
* Ensure that the files for folder browsing protection (.htaccess, web.config) are kept after an "npm install/update" command
*/
$iTopFolder = __DIR__."/../../../";
require_once("$iTopFolder/approot.inc.php");
$sDependenciesRootFolderAbsPath = APPROOT . "node_modules/";
$aFilesToCheck = [
".htaccess",
"web.config",
];
echo "This command aims at ensuring that folder browsing protection files (.htaccess, web.config) are present in the dependencies folder even after an install/upgrade command\n";
echo "Checking files:\n";
foreach($aFilesToCheck as $sFileToCheck) {
if (file_exists($sDependenciesRootFolderAbsPath . $sFileToCheck)) {
echo "✔️ $sFileToCheck is present\n";
continue;
}
// If missing, copy the one from /lib as it contains the necessary allow/deny directives for third-parties
copy(APPROOT . "lib/$sFileToCheck", $sDependenciesRootFolderAbsPath . $sFileToCheck);
echo "✔️ $sFileToCheck was missing and has been re-created\n";
}
// Ensure separation with following scripts
echo "\n";

View File

@@ -1,100 +0,0 @@
<?php
/**
* Copyright (C) 2010-2024 Combodo SAS
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with iTop. If not, see <http: *www.gnu.org/licenses/>
*
*/
$iTopFolder = __DIR__ . "/../../" ;
require_once ("$iTopFolder/approot.inc.php");
require_once (APPROOT."/setup/setuputils.class.inc.php");
if (php_sapi_name() !== 'cli')
{
throw new \Exception('This script can only run from CLI');
}
clearstatcache();
// Read params
$key = array_search("--manager", $argv);
if (false === $key || false === isset($argv[$key + 1]) ) {
throw new \InvalidArgumentException("Usage: " . __FILE__ . " --manager composer|npm");
}
$sDependenciesHandlerCode = $argv[$key + 1];
switch ($sDependenciesHandlerCode) {
case "composer":
$sDependenciesHandlerFQCN = \Combodo\iTop\Dependencies\Composer\iTopComposer::class;
break;
case "npm":
$sDependenciesHandlerFQCN = \Combodo\iTop\Dependencies\NPM\iTopNPM::class;
break;
default:
throw new \Exception("Invalid dependencies handler code, $sDependenciesHandlerCode given, expected composer|npm");
}
// Start handler
$oDependenciesHandler = new $sDependenciesHandlerFQCN();
$aDeniedButStillPresent = $oDependenciesHandler->ListDeniedButStillPresentFilesAbsPaths();
echo "\n";
foreach ($aDeniedButStillPresent as $sDir)
{
if (false === $oDependenciesHandler::IsQuestionnableFile($sDir))
{
echo "ERROR found INVALID denied test dir: '$sDir'\n";
throw new \RuntimeException("$sDir is in the denied list but doesn't comply with the rule (see IsQuestionnableFolder method)");
}
if (false === file_exists($sDir)) {
echo "INFO $sDir is in denied list, but not existing on disk => skipping !\n";
continue;
}
try {
if(is_dir($sDir)){
SetupUtils::rrmdir($sDir);
}
else{
unlink($sDir);
}
echo "✔️ Remove denied test dir: '$sDir'\n";
}
catch (\Exception $e) {
echo "\n❌ FAILED to remove denied test dir: '$sDir'\n";
}
}
$aAllowedAndDeniedDirs = array_merge(
$oDependenciesHandler->ListAllowedFilesAbsPaths(),
$oDependenciesHandler->ListDeniedFilesAbsPaths()
);
$aExistingDirs = $oDependenciesHandler->ListAllFilesAbsPaths();
$aMissing = array_diff($aExistingDirs, $aAllowedAndDeniedDirs);
if (false === empty($aMissing)) {
echo "Some new tests dirs exists !\n"
." They must be declared either in the allowed or denied list in {$sDependenciesHandlerFQCN}\n"
.' List of dirs:'."\n".var_export($aMissing, true)."\n";
}
// Ensure separation with following scripts
echo "\n";

View File

@@ -19,24 +19,17 @@
* The target license file path is in `$xmlFilePath` * The target license file path is in `$xmlFilePath`
*/ */
$iTopFolder = __DIR__."/../../"; $iTopFolder = __DIR__ . "/../../" ;
$xmlFilePath = $iTopFolder."setup/licenses/community-licenses.xml"; $xmlFilePath = $iTopFolder . "setup/licenses/community-licenses.xml";
$jqExec = shell_exec("jq -V"); // a param is mandatory otherwise the script will freeze function get_scope($product_node)
if ((null === $jqExec) || (false === $jqExec)) { {
echo "/!\ JQ is required but cannot be launched :( \n";
echo "Check this script PHPDoc block for instructions\n";
die(-1);
}
function get_scope($product_node) {
$scope = $product_node->getAttribute("scope"); $scope = $product_node->getAttribute("scope");
if ($scope === "") { //put iTop first if ($scope === "")
{ //put iTop first
return "aaaaaaaaa"; return "aaaaaaaaa";
} }
return $scope; return $scope;
} }

View File

@@ -140,7 +140,7 @@ When your code is working, please:
* Pull request description: mind to add all the information useful to understand why you're suggesting this modification and anything necessary to dive into your work. Especially: * Pull request description: mind to add all the information useful to understand why you're suggesting this modification and anything necessary to dive into your work. Especially:
- Bugfixes: exact steps to reproduce the bug (given/when/then), description of the bug cause and what solution is implemented - Bugfixes: exact steps to reproduce the bug (given/when/then), description of the bug cause and what solution is implemented
- Enhancements: use cases, implementation details if needed - Enhancements: use cases, implementation details if needed
* Mind to check the "[Allow edits from maintainers](https://docs.github.com/en/github-ae@latest/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork)" option ! (note that if you are working with an org fork, this option [won't be available](https://github.com/orgs/community/discussions/5634)) * Mind to check the "[Allow edits from maintainers](https://docs.github.com/en/github-ae@latest/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork)" option !
## 🙏 We are thankful ## 🙏 We are thankful
@@ -159,6 +159,6 @@ We have one sticker per contribution type. You might get multiple stickers with
* Beta tester: Test and give feedback on beta releases * Beta tester: Test and give feedback on beta releases
* Extension developer: Develop and publish an extension * Extension developer: Develop and publish an extension
Here is the design of each stickers for year 2024: Here is the design of each stickers for year 2022:
![iTop stickers 2024](.doc/contributing-guide/2024.contributing-stickers-side-by-side.png) ![iTop stickers 2022](.doc/contributing-guide/2022.contributing-stickers-side-by-side.png)

View File

@@ -1,9 +1,5 @@
<p align="center"><a href="https://www.combodo.com/itop-193" target="_blank"> <p align="center"><a href="https://www.combodo.com/itop-193" target="_blank">
<picture> <img src="https://www.combodo.com/logos/logo-itop-baseline.svg" width=350>
<source media="(prefers-color-scheme: dark)" srcset="/images/logos/logo-itop-baseline-light.svg">
<source media="(prefers-color-scheme: light)" srcset="/images/logos/logo-itop-baseline-dark.svg">
<img src="/images/logos/logo-itop-baseline-light.svg" width="350" alt="Logo iTop with baseline" />
</picture>
</a></p> </a></p>
@@ -91,11 +87,9 @@ We would like to give a special thank you 🤗 to the people from the community
- Castro, Randall Badilla - Castro, Randall Badilla
- Colantoni, Maria Laura - Colantoni, Maria Laura
- Couronné, Guy - Couronné, Guy
- Dejin, Bie (a.k.a [@bdejin](https://github.com/bdejin))
- Dvořák, Lukáš - Dvořák, Lukáš
- Goethals, Stefan - Goethals, Stefan
- Gumble, David - Gumble, David
- Ji, Leeb (冀利斌) (a.k.a [@chileeb](https://github.com/chileeb))
- Kaltefleiter, Lars (a.k.a [@larhip](https://www.github.com/larhip)) - Kaltefleiter, Lars (a.k.a [@larhip](https://www.github.com/larhip))
- Khamit, Shamil - Khamit, Shamil
- Kincel, Martin - Kincel, Martin
@@ -110,17 +104,12 @@ We would like to give a special thank you 🤗 to the people from the community
- Raenker, Martin - Raenker, Martin
- Roháč, Richard (a.k.a [@RohacRichard](https://github.com/RohacRichard)) - Roháč, Richard (a.k.a [@RohacRichard](https://github.com/RohacRichard))
- Rosenke, Stephan - Rosenke, Stephan
- Rossi, Tommaso (a.k.a [@tomrss](https://www.github.com/tomrss))
- Rudner, Björn (a.k.a [@rudnerbjoern](https://github.com/rudnerbjoern)) - Rudner, Björn (a.k.a [@rudnerbjoern](https://github.com/rudnerbjoern))
- Šafránek, Jaroslav (a.k.a [jkcinik](https://sourceforge.net/u/jkcinik/profile/) on SourceForge)
- Seki, Shoji - Seki, Shoji
- Shilov, Vladimir - Shilov, Vladimir
- Stetina, Pavel (a.k.a [@Stetinac](https://github.com/Stetinac))
- Stukalov, Ilya (a.k.a [@ilya](https://www.github.com/ilya)-stukalov) - Stukalov, Ilya (a.k.a [@ilya](https://www.github.com/ilya)-stukalov)
- Tarjányi, Csaba (a.k.a [@tacsaby](https://github.com/tacsaby))
- Tulio, Marco - Tulio, Marco
- Turrubiates, Miguel - Turrubiates, Miguel
- Vlk, Karel (a.k.a [@vlk-charles](https://www.github.com/vlk-charles))
### Aliases ### Aliases

View File

@@ -1,5 +1,5 @@
<?php <?php
// Copyright (C) 2010-2024 Combodo SAS // Copyright (C) 2010-2023 Combodo SARL
// //
// This file is part of iTop. // This file is part of iTop.
// //
@@ -19,7 +19,7 @@
/** /**
* UserRightsMatrix (User management Module) * UserRightsMatrix (User management Module)
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,5 +1,5 @@
<?php <?php
// Copyright (C) 2010-2024 Combodo SAS // Copyright (C) 2010-2023 Combodo SARL
// //
// This file is part of iTop. // This file is part of iTop.
// //
@@ -20,7 +20,7 @@
* UserRightsNull * UserRightsNull
* User management Module - say Yeah! to everything * User management Module - say Yeah! to everything
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,11 +1,9 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
use Combodo\iTop\Application\WebPage\WebPage;
define('ADMIN_PROFILE_NAME', 'Administrator'); define('ADMIN_PROFILE_NAME', 'Administrator');
define('PORTAL_PROFILE_NAME', 'Portal user'); define('PORTAL_PROFILE_NAME', 'Portal user');
@@ -230,7 +228,6 @@ class URP_UserProfile extends UserRightsBaseClassGUI
"db_table" => "priv_urp_userprofile", "db_table" => "priv_urp_userprofile",
"db_key_field" => "id", "db_key_field" => "id",
"db_finalclass_field" => "", "db_finalclass_field" => "",
"is_link" => true, /** @since 3.1.0 N°6482 */
'uniqueness_rules' => array( 'uniqueness_rules' => array(
'no_duplicate' => array( 'no_duplicate' => array(
'attributes' => array( 'attributes' => array(
@@ -448,12 +445,6 @@ class UserRightsProfile extends UserRightsAddOnAPI
UR_ACTION_BULK_DELETE => 'bd', UR_ACTION_BULK_DELETE => 'bd',
); );
/**
* @var array $aUsersProfilesList Cache of users' profiles. Hash array of user ID => [profile ID => profile friendlyname, profile ID => profile friendlyname, ...]
* @since 2.7.10 3.0.4 3.1.1 3.2.0 N°6887
*/
private $aUsersProfilesList = [];
// Installation: create the very first user // Installation: create the very first user
public function CreateAdministrator($sAdminUser, $sAdminPwd, $sLanguage = 'EN US') public function CreateAdministrator($sAdminUser, $sAdminPwd, $sLanguage = 'EN US')
{ {
@@ -510,7 +501,6 @@ class UserRightsProfile extends UserRightsAddOnAPI
} }
protected $m_aUserOrgs = array(); // userid -> array of orgid protected $m_aUserOrgs = array(); // userid -> array of orgid
protected $m_aAdministrators = null; // [user id]
// Built on demand, could be optimized if necessary (doing a query for each attribute that needs to be read) // Built on demand, could be optimized if necessary (doing a query for each attribute that needs to be read)
protected $m_aObjectActionGrants = array(); protected $m_aObjectActionGrants = array();
@@ -567,7 +557,6 @@ class UserRightsProfile extends UserRightsAddOnAPI
// Cache // Cache
$this->m_aObjectActionGrants = array(); $this->m_aObjectActionGrants = array();
$this->m_aAdministrators = null;
} }
public function LoadCache() public function LoadCache()
@@ -710,10 +699,12 @@ class UserRightsProfile extends UserRightsAddOnAPI
*/ */
private function GetAdministrators() private function GetAdministrators()
{ {
if ($this->m_aAdministrators === null) static $aAdministrators = null;
if ($aAdministrators === null)
{ {
// Find all administrators // Find all administrators
$this->m_aAdministrators = array(); $aAdministrators = array();
$oAdministratorsFilter = new DBObjectSearch('User'); $oAdministratorsFilter = new DBObjectSearch('User');
$oLnkFilter = new DBObjectSearch('URP_UserProfile'); $oLnkFilter = new DBObjectSearch('URP_UserProfile');
$oExpression = new FieldExpression('profileid', 'URP_UserProfile'); $oExpression = new FieldExpression('profileid', 'URP_UserProfile');
@@ -726,10 +717,10 @@ class UserRightsProfile extends UserRightsAddOnAPI
$oSet->OptimizeColumnLoad(array('User' => array('login'))); $oSet->OptimizeColumnLoad(array('User' => array('login')));
while($oUser = $oSet->Fetch()) while($oUser = $oSet->Fetch())
{ {
$this->m_aAdministrators[] = $oUser->GetKey(); $aAdministrators[] = $oUser->GetKey();
} }
} }
return $this->m_aAdministrators; return $aAdministrators;
} }
/** /**
@@ -766,12 +757,8 @@ class UserRightsProfile extends UserRightsAddOnAPI
$sAction = self::$m_aActionCodes[$iActionCode]; $sAction = self::$m_aActionCodes[$iActionCode];
$bStatus = null; $bStatus = null;
// Cache user's profiles
if(false === array_key_exists($iUser, $this->aUsersProfilesList)){
$this->aUsersProfilesList[$iUser] = UserRights::ListProfiles($oUser);
}
// Call the API of UserRights because it caches the list for us // Call the API of UserRights because it caches the list for us
foreach($this->aUsersProfilesList[$iUser] as $iProfile => $oProfile) foreach(UserRights::ListProfiles($oUser) as $iProfile => $oProfile)
{ {
$bGrant = $this->GetProfileActionGrant($iProfile, $sClass, $sAction); $bGrant = $this->GetProfileActionGrant($iProfile, $sClass, $sAction);
if (!is_null($bGrant)) if (!is_null($bGrant))
@@ -825,37 +812,48 @@ class UserRightsProfile extends UserRightsAddOnAPI
{ {
// We are protected by GetSelectFilter: the object set contains objects allowed or shared for reading // We are protected by GetSelectFilter: the object set contains objects allowed or shared for reading
// We have to answer NO for objects shared for reading purposes // We have to answer NO for objects shared for reading purposes
if (self::HasSharing() && SharedObject::GetSharedClassProperties($sClass)) { if (self::HasSharing())
// This class is shared, GetSelectFilter may allow some objects for read only {
// But currently we are checking whether the objects might be written... $aClassProps = SharedObject::GetSharedClassProperties($sClass);
// Let's exclude the objects based on the relevant criteria if ($aClassProps)
{
// This class is shared, GetSelectFilter may allow some objects for read only
// But currently we are checking wether the objects might be written...
// Let's exclude the objects based on the relevant criteria
// Use $oInstanceSet only if sClass is the main class $sOrgAttCode = self::GetOwnerOrganizationAttCode($sClass);
if (!is_a($oInstanceSet->GetClass(), $sClass, true)) { if (!is_null($sOrgAttCode))
/** @var \DBObjectSet $oInstanceSet */ {
throw new CoreException(__FUNCTION__.': Expecting object set to be of class '.$sClass.' but it is of class '.$oInstanceSet->GetClass(), ['OQL_Query' => $oInstanceSet->GetFilter()->ToOQL(), 'classes' => $oInstanceSet->GetSelectedClasses()]); $aUserOrgs = $this->GetUserOrgs($oUser, $sClass);
} if (!is_null($aUserOrgs) && count($aUserOrgs) > 0)
$sOrgAttCode = self::GetOwnerOrganizationAttCode($sClass); {
if (!is_null($sOrgAttCode)) { $iCountNO = 0;
$aUserOrgs = $this->GetUserOrgs($oUser, $sClass); $iCountYES = 0;
if (!is_null($aUserOrgs) && count($aUserOrgs) > 0) { $oInstanceSet->Rewind();
$iCountNO = 0; while($oObject = $oInstanceSet->Fetch())
$iCountYES = 0; {
$oInstanceSet->Rewind(); $iOrg = $oObject->Get($sOrgAttCode);
while ($oObject = $oInstanceSet->Fetch()) { if (in_array($iOrg, $aUserOrgs))
$iOrg = $oObject->Get($sOrgAttCode); {
if (in_array($iOrg, $aUserOrgs)) { $iCountYES++;
$iCountYES++; }
} else { else
$iCountNO++; {
$iCountNO++;
}
}
if ($iCountNO == 0)
{
$iPermission = UR_ALLOWED_YES;
}
elseif ($iCountYES == 0)
{
$iPermission = UR_ALLOWED_NO;
}
else
{
$iPermission = UR_ALLOWED_DEPENDS;
} }
}
if ($iCountNO == 0) {
$iPermission = UR_ALLOWED_YES;
} elseif ($iCountYES == 0) {
$iPermission = UR_ALLOWED_NO;
} else {
$iPermission = UR_ALLOWED_DEPENDS;
} }
} }
} }
@@ -886,16 +884,11 @@ class UserRightsProfile extends UserRightsAddOnAPI
// Note: this code is VERY close to the code of IsActionAllowed() // Note: this code is VERY close to the code of IsActionAllowed()
$iUser = $oUser->GetKey(); $iUser = $oUser->GetKey();
// Cache user's profiles
if(false === array_key_exists($iUser, $this->aUsersProfilesList)){
$this->aUsersProfilesList[$iUser] = UserRights::ListProfiles($oUser);
}
// Note: The object set is ignored because it was interesting to optimize for huge data sets // Note: The object set is ignored because it was interesting to optimize for huge data sets
// and acceptable to consider only the root class of the object set // and acceptable to consider only the root class of the object set
$bStatus = null; $bStatus = null;
// Call the API of UserRights because it caches the list for us // Call the API of UserRights because it caches the list for us
foreach($this->aUsersProfilesList[$iUser] as $iProfile => $oProfile) foreach(UserRights::ListProfiles($oUser) as $iProfile => $oProfile)
{ {
$bGrant = $this->GetClassStimulusGrant($iProfile, $sClass, $sStimulusCode); $bGrant = $this->GetClassStimulusGrant($iProfile, $sClass, $sStimulusCode);
if (!is_null($bGrant)) if (!is_null($bGrant))
@@ -924,9 +917,8 @@ class UserRightsProfile extends UserRightsAddOnAPI
} }
/** /**
* @param string $sClass * Find out which attribute is corresponding the the dimension 'owner org'
* @return string|null Find out which attribute is corresponding the dimension 'owner org' * returns null if no such attribute has been found (no filtering should occur)
* returns null if no such attribute has been found (no filtering should occur)
*/ */
public static function GetOwnerOrganizationAttCode($sClass) public static function GetOwnerOrganizationAttCode($sClass)
{ {
@@ -971,3 +963,4 @@ class UserRightsProfile extends UserRightsAddOnAPI
UserRights::SelectModule('UserRightsProfile'); UserRights::SelectModule('UserRightsProfile');
?>

View File

@@ -1,6 +1,6 @@
<?php <?php
/** /**
* Copyright (C) 2013-2024 Combodo SAS * Copyright (C) 2013-2023 Combodo SARL
* *
* This file is part of iTop. * This file is part of iTop.
* *
@@ -17,8 +17,6 @@
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
*/ */
use Combodo\iTop\Application\WebPage\WebPage;
define('ADMIN_PROFILE_NAME', 'Administrator'); define('ADMIN_PROFILE_NAME', 'Administrator');
define('PORTAL_PROFILE_NAME', 'Portal user'); define('PORTAL_PROFILE_NAME', 'Portal user');
@@ -336,7 +334,6 @@ class URP_UserProfile extends UserRightsBaseClassGUI
"db_table" => "priv_urp_userprofile", "db_table" => "priv_urp_userprofile",
"db_key_field" => "id", "db_key_field" => "id",
"db_finalclass_field" => "", "db_finalclass_field" => "",
"is_link" => true, /** @since 3.1.0 N°6482 */
); );
MetaModel::Init_Params($aParams); MetaModel::Init_Params($aParams);
//MetaModel::Init_InheritAttributes(); //MetaModel::Init_InheritAttributes();
@@ -582,10 +579,10 @@ class UserRightsProfile extends UserRightsAddOnAPI
/** /**
* Read and cache organizations allowed to the given user * Read and cache organizations allowed to the given user
* *
* @param User $oUser * @param $oUser
* @param string $sClass (not used here but can be used in overloads) * @param $sClass (not used here but can be used in overloads)
* *
* @return array keys of the User allowed org * @return array
* @throws \CoreException * @throws \CoreException
* @throws \Exception * @throws \Exception
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/** /**
* Copyright (C) 2013-2024 Combodo SAS * Copyright (C) 2013-2023 Combodo SARL
* *
* This file is part of iTop. * This file is part of iTop.
* *
@@ -17,8 +17,6 @@
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
*/ */
use Combodo\iTop\Application\WebPage\WebPage;
define('ADMIN_PROFILE_ID', 1); define('ADMIN_PROFILE_ID', 1);
class UserRightsBaseClass extends cmdbAbstractObject class UserRightsBaseClass extends cmdbAbstractObject
@@ -279,7 +277,6 @@ class URP_UserProfile extends UserRightsBaseClass
"db_table" => "priv_urp_userprofile", "db_table" => "priv_urp_userprofile",
"db_key_field" => "id", "db_key_field" => "id",
"db_finalclass_field" => "", "db_finalclass_field" => "",
"is_link" => true, /** @since 3.1.0 N°6482 */
); );
MetaModel::Init_Params($aParams); MetaModel::Init_Params($aParams);
//MetaModel::Init_InheritAttributes(); //MetaModel::Init_InheritAttributes();

29
app.php
View File

@@ -1,29 +0,0 @@
<?php
/**
* Copyright (C) 2013-2024 Combodo SAS
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
*/
use Combodo\iTop\Kernel;
require_once __DIR__.'/lib/autoload_runtime.php';
require_once('approot.inc.php');
require_once('application/startup.inc.php');
return function (array $context) {
return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
};

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

331
application/Html2Text.php Normal file
View File

@@ -0,0 +1,331 @@
<?php
namespace Html2Text;
if (!function_exists('mb_split'))
{
function mb_split($pattern, $subject, $limit = -1)
{
return preg_split('/'.$pattern.'/', $subject, $limit);
}
}
/**
* Replace all occurrences of the search string with the replacement string.
*
* @author Sean Murphy <sean@iamseanmurphy.com>
* @copyright Copyright 2012 Sean Murphy. All rights reserved.
* @license http://creativecommons.org/publicdomain/zero/1.0/
* @link http://php.net/manual/function.str-replace.php
*
* @param mixed $search
* @param mixed $replace
* @param mixed $subject
* @param int $count
* @return mixed
*/
function mb_str_replace($search, $replace, $subject, &$count = 0) {
if (!is_array($subject)) {
// Normalize $search and $replace so they are both arrays of the same length
$searches = is_array($search) ? array_values($search) : array($search);
$replacements = is_array($replace) ? array_values($replace) : array($replace);
$replacements = array_pad($replacements, count($searches), '');
foreach ($searches as $key => $search) {
$parts = mb_split(preg_quote($search), $subject);
if (is_array($parts))
{
$count += count($parts) - 1;
$subject = implode($replacements[$key], $parts);
}
}
} else {
// Call mb_str_replace for each subject in array, recursively
foreach ($subject as $key => $value) {
$subject[$key] = mb_str_replace($search, $replace, $value, $count);
}
}
return $subject;
}
/******************************************************************************
* Copyright (c) 2010 Jevon Wright and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* or
*
* LGPL which is available at http://www.gnu.org/licenses/lgpl.html
*
*
* Contributors:
* Jevon Wright - initial API and implementation
* Denis Flaven - some fixes for properly handling UTF-8 characters
****************************************************************************/
class Html2Text {
/**
* Tries to convert the given HTML into a plain text format - best suited for
* e-mail display, etc.
*
* <p>In particular, it tries to maintain the following features:
* <ul>
* <li>Links are maintained, with the 'href' copied over
* <li>Information in the &lt;head&gt; is lost
* </ul>
*
* @param string html the input HTML
* @return string the HTML converted, as best as possible, to text
* @throws Html2TextException if the HTML could not be loaded as a {@link DOMDocument}
*/
static function convert($html) {
// replace &nbsp; with spaces
$html = str_replace("&nbsp;", " ", $html);
$html = mb_str_replace("\xc2\xa0", " ", $html); // DO NOT USE str_replace since it breaks the "à" character which is \xc3 \xa0 in UTF-8
$html = static::fixNewlines($html);
$doc = new \DOMDocument();
if (!@$doc->loadHTML('<?xml encoding="UTF-8">'.$html)) // Forces the UTF-8 character set for HTML fragments
{
throw new Html2TextException("Could not load HTML - badly formed?", $html);
}
$output = static::iterateOverNode($doc);
// remove leading and trailing spaces on each line
$output = preg_replace("/[ \t]*\n[ \t]*/im", "\n", $output);
$output = preg_replace("/ *\t */im", "\t", $output);
// remove unnecessary empty lines
$output = preg_replace("/\n\n\n*/im", "\n\n", $output);
// remove leading and trailing whitespace
$output = trim($output);
return $output;
}
/**
* Unify newlines; in particular, \r\n becomes \n, and
* then \r becomes \n. This means that all newlines (Unix, Windows, Mac)
* all become \ns.
*
* @param string text text with any number of \r, \r\n and \n combinations
* @return string the fixed text
*/
static function fixNewlines($text) {
// replace \r\n to \n
$text = str_replace("\r\n", "\n", $text);
// remove \rs
$text = str_replace("\r", "\n", $text);
return $text;
}
static function nextChildName($node) {
// get the next child
$nextNode = $node->nextSibling;
while ($nextNode != null) {
if ($nextNode instanceof \DOMElement) {
break;
}
$nextNode = $nextNode->nextSibling;
}
$nextName = null;
if ($nextNode instanceof \DOMElement && $nextNode != null) {
$nextName = strtolower($nextNode->nodeName);
}
return $nextName;
}
static function prevChildName($node) {
// get the previous child
$nextNode = $node->previousSibling;
while ($nextNode != null) {
if ($nextNode instanceof \DOMElement) {
break;
}
$nextNode = $nextNode->previousSibling;
}
$nextName = null;
if ($nextNode instanceof \DOMElement && $nextNode != null) {
$nextName = strtolower($nextNode->nodeName);
}
return $nextName;
}
static function iterateOverNode($node) {
if ($node instanceof \DOMText) {
// Replace whitespace characters with a space (equivilant to \s)
return preg_replace("/[\\t\\n\\f\\r ]+/im", " ", $node->wholeText);
}
if ($node instanceof \DOMDocumentType) {
// ignore
return "";
}
$nextName = static::nextChildName($node);
$prevName = static::prevChildName($node);
$name = strtolower($node->nodeName);
// start whitespace
switch ($name) {
case "hr":
return "---------------------------------------------------------------\n";
case "style":
case "head":
case "title":
case "meta":
case "script":
// ignore these tags
return "";
case "h1":
case "h2":
case "h3":
case "h4":
case "h5":
case "h6":
case "ol":
case "ul":
// add two newlines, second line is added below
$output = "\n";
break;
case "td":
case "th":
// add tab char to separate table fields
$output = "\t";
break;
case "tr":
case "p":
case "div":
// add one line
$output = "\n";
break;
case "li":
$output = "- ";
break;
default:
// print out contents of unknown tags
$output = "";
break;
}
// debug
//$output .= "[$name,$nextName]";
if (isset($node->childNodes)) {
for ($i = 0; $i < $node->childNodes->length; $i++) {
$n = $node->childNodes->item($i);
$text = static::iterateOverNode($n);
$output .= $text;
}
}
// end whitespace
switch ($name) {
case "h1":
case "h2":
case "h3":
case "h4":
case "h5":
case "h6":
$output .= "\n";
break;
case "p":
case "br":
// add one line
if ($nextName != "div")
$output .= "\n";
break;
case "div":
// add one line only if the next child isn't a div
if ($nextName != "div" && $nextName != null)
$output .= "\n";
break;
case "a":
// links are returned in [text](link) format
$href = $node->getAttribute("href");
$output = trim($output);
// remove double [[ ]] s from linking images
if (substr($output, 0, 1) == "[" && substr($output, -1) == "]") {
$output = substr($output, 1, strlen($output) - 2);
// for linking images, the title of the <a> overrides the title of the <img>
if ($node->getAttribute("title")) {
$output = $node->getAttribute("title");
}
}
// if there is no link text, but a title attr
if (!$output && $node->getAttribute("title")) {
$output = $node->getAttribute("title");
}
if ($href == null) {
// it doesn't link anywhere
if ($node->getAttribute("name") != null) {
$output = "[$output]";
}
} else {
if ($href == $output || $href == "mailto:$output" || $href == "http://$output" || $href == "https://$output") {
// link to the same address: just use link
$output;
} else {
// replace it
if ($output) {
$output = "[$output]($href)";
} else {
// empty string
$output = $href;
}
}
}
// does the next node require additional whitespace?
switch ($nextName) {
case "h1": case "h2": case "h3": case "h4": case "h5": case "h6":
$output .= "\n";
break;
}
break;
case "img":
if ($node->getAttribute("title")) {
$output = "[" . $node->getAttribute("title") . "]";
} elseif ($node->getAttribute("alt")) {
$output = "[" . $node->getAttribute("alt") . "]";
} else {
$output = "";
}
break;
case "li":
$output .= "\n";
break;
default:
// do nothing
}
return $output;
}
}

View File

@@ -0,0 +1,28 @@
<?php
/******************************************************************************
* Copyright (c) 2010 Jevon Wright and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* or
*
* LGPL which is available at http://www.gnu.org/licenses/lgpl.html
*
*
* Contributors:
* Jevon Wright - initial API and implementation
****************************************************************************/
namespace Html2Text;
class Html2TextException extends \Exception {
var $more_info;
public function __construct($message = "", $more_info = "") {
parent::__construct($message);
$this->more_info = $more_info;
}
}

View File

@@ -1,13 +1,12 @@
<?php <?php
/** /**
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/AjaxPage.php, now loadable using autoloader * @deprecated will be removed in 3.1.0 - moved to sources/Application/WebPage/AjaxPage.php, now loadable using autoloader
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
*/ */
// cannot notify depreciation for now as this is still load in autoloader // cannot notify depreciation for now as this is still load in autoloader
//DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/AjaxPage.php, now loadable using autoloader'); //DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/AjaxPage.php, now loadable using autoloader');
use Combodo\iTop\Application\WebPage\AjaxPage;
/** /**
* Class ajax_page * Class ajax_page

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,5 +1,5 @@
<?php <?php
// Copyright (C) 2010-2024 Combodo SAS // Copyright (C) 2010-2023 Combodo SARL
// //
// This file is part of iTop. // This file is part of iTop.
// //
@@ -20,7 +20,7 @@
/** /**
* Class ApplicationContext * Class ApplicationContext
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
@@ -195,31 +195,16 @@ class ApplicationContext
/** /**
* Returns the context as string with the format name1=value1&name2=value2.... * Returns the context as string with the format name1=value1&name2=value2....
* @return string The context as a string to be appended to an href property * @return string The context as a string to be appended to an href property
*
*/ */
public function GetForLink(bool $bWithLeadingAmpersand = false) public function GetForLink()
{ {
// If there are no parameters, return an empty string
if(empty($this->aValues)){
return '';
}
// Build the query string with ampersand separated parameters
$aParams = array(); $aParams = array();
foreach($this->aValues as $sName => $sValue) foreach($this->aValues as $sName => $sValue)
{ {
$aParams[] = "c[$sName]".'='.urlencode($sValue); $aParams[] = "c[$sName]".'='.urlencode($sValue);
} }
$sReturnValue = implode('&', $aParams); return implode("&", $aParams);
// add the leading ampersand if requested
if($bWithLeadingAmpersand){
$sReturnValue = '&' . $sReturnValue;
}
return $sReturnValue;
} }
/** /**
* @since 3.0.0 N°2534 - dashboard: bug with autorefresh that deactivates filtering on organisation * @since 3.0.0 N°2534 - dashboard: bug with autorefresh that deactivates filtering on organisation
* Returns the params as c[menu]:..., c[org_id]:.... * Returns the params as c[menu]:..., c[org_id]:....
@@ -253,7 +238,7 @@ class ApplicationContext
{ {
$aContextInputBlocks = []; $aContextInputBlocks = [];
foreach ($this->aValues as $sName => $sValue) { foreach ($this->aValues as $sName => $sValue) {
$aContextInputBlocks[] = InputUIBlockFactory::MakeForHidden("c[$sName]", $sValue); $aContextInputBlocks[] = InputUIBlockFactory::MakeForHidden("c[$sName]", utils::EscapeHtml($sValue));
} }
return $aContextInputBlocks; return $aContextInputBlocks;
} }
@@ -397,7 +382,7 @@ class ApplicationContext
$sUrl = call_user_func(array($sUrlMakerClass, 'MakeObjectUrl'), $sObjClass, $sObjKey); $sUrl = call_user_func(array($sUrlMakerClass, 'MakeObjectUrl'), $sObjClass, $sObjKey);
if (utils::StrLen($sUrl) > 0) { if (utils::StrLen($sUrl) > 0) {
if ($bWithNavigationContext) { if ($bWithNavigationContext) {
return $sUrl.$oAppContext->GetForLink(true); return $sUrl."&".$oAppContext->GetForLink();
} else { } else {
return $sUrl; return $sUrl;
} }

View File

@@ -1,7 +1,7 @@
<?php <?php
/** /**
* Copyright (C) 2013-2024 Combodo SAS * Copyright (C) 2013-2023 Combodo SARL
* *
* This file is part of iTop. * This file is part of iTop.
* *
@@ -19,8 +19,6 @@
*/ */
use Combodo\iTop\Application\UI\Base\iUIBlock; use Combodo\iTop\Application\UI\Base\iUIBlock;
use Combodo\iTop\Application\WebPage\iTopWebPage;
use Combodo\iTop\Application\WebPage\WebPage;
use Symfony\Component\DependencyInjection\Container; use Symfony\Component\DependencyInjection\Container;
require_once(APPROOT.'application/newsroomprovider.class.inc.php'); require_once(APPROOT.'application/newsroomprovider.class.inc.php');
@@ -31,7 +29,7 @@ require_once(APPROOT.'application/newsroomprovider.class.inc.php');
* Definition of interfaces that can be implemented to customize iTop. * Definition of interfaces that can be implemented to customize iTop.
* You may implement such interfaces in a module file (e.g. main.mymodule.php) * You may implement such interfaces in a module file (e.g. main.mymodule.php)
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
* @since 2.7.0 * @since 2.7.0
*/ */
@@ -64,13 +62,13 @@ interface iLoginFSMExtension extends iLoginExtension
* If a page is displayed, the action must exit at this point * If a page is displayed, the action must exit at this point
* if LoginWebPage::LOGIN_FSM_RETURN_ERROR is returned $iErrorCode must be set * if LoginWebPage::LOGIN_FSM_RETURN_ERROR is returned $iErrorCode must be set
* if LoginWebPage::LOGIN_FSM_RETURN_OK is returned then the login is OK and terminated * if LoginWebPage::LOGIN_FSM_RETURN_OK is returned then the login is OK and terminated
* if LoginWebPage::LOGIN_FSM_CONTINUE is returned then the FSM will proceed to next plugin or state * if LoginWebPage::LOGIN_FSM_RETURN_IGNORE is returned then the FSM will proceed to next plugin or state
* *
* @api * @api
* @param string $sLoginState (see LoginWebPage::LOGIN_STATE_...) * @param string $sLoginState (see LoginWebPage::LOGIN_STATE_...)
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...) * @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
* *
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE * @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
*/ */
public function LoginAction($sLoginState, &$iErrorCode); public function LoginAction($sLoginState, &$iErrorCode);
} }
@@ -83,7 +81,7 @@ interface iLoginFSMExtension extends iLoginExtension
* * If a page is displayed, the action must exit at this point * * If a page is displayed, the action must exit at this point
* * if LoginWebPage::LOGIN_FSM_RETURN_ERROR is returned $iErrorCode must be set * * if LoginWebPage::LOGIN_FSM_RETURN_ERROR is returned $iErrorCode must be set
* * if LoginWebPage::LOGIN_FSM_RETURN_OK is returned then the login is OK and terminated * * if LoginWebPage::LOGIN_FSM_RETURN_OK is returned then the login is OK and terminated
* * if LoginWebPage::LOGIN_FSM_CONTINUE is returned then the FSM will proceed to next plugin or to next state * * if LoginWebPage::LOGIN_FSM_RETURN_IGNORE is returned then the FSM will proceed to next plugin or to next state
* *
* @api * @api
* @package LoginExtensibilityAPI * @package LoginExtensibilityAPI
@@ -136,7 +134,7 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
* @api * @api
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...) * @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
* *
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE * @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
*/ */
protected function OnStart(&$iErrorCode) protected function OnStart(&$iErrorCode)
{ {
@@ -150,7 +148,7 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
* @api * @api
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...) * @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
* *
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE * @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
*/ */
protected function OnModeDetection(&$iErrorCode) protected function OnModeDetection(&$iErrorCode)
{ {
@@ -167,7 +165,7 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
* @api * @api
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...) * @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
* *
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE * @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
*/ */
protected function OnReadCredentials(&$iErrorCode) protected function OnReadCredentials(&$iErrorCode)
{ {
@@ -181,7 +179,7 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
* @api * @api
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...) * @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
* *
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE * @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
*/ */
protected function OnCheckCredentials(&$iErrorCode) protected function OnCheckCredentials(&$iErrorCode)
{ {
@@ -192,7 +190,7 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
* @api * @api
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...) * @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
* *
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE * @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
*/ */
protected function OnCredentialsOK(&$iErrorCode) protected function OnCredentialsOK(&$iErrorCode)
{ {
@@ -203,7 +201,7 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
* @api * @api
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...) * @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
* *
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE * @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
*/ */
protected function OnUsersOK(&$iErrorCode) protected function OnUsersOK(&$iErrorCode)
{ {
@@ -214,7 +212,7 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
* @api * @api
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...) * @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
* *
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE * @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
*/ */
protected function OnConnected(&$iErrorCode) protected function OnConnected(&$iErrorCode)
{ {
@@ -225,7 +223,7 @@ abstract class AbstractLoginFSMExtension implements iLoginFSMExtension
* @api * @api
* @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...) * @param int $iErrorCode (see LoginWebPage::EXIT_CODE_...)
* *
* @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_CONTINUE * @return int LoginWebPage::LOGIN_FSM_RETURN_ERROR, LoginWebPage::LOGIN_FSM_RETURN_OK or LoginWebPage::LOGIN_FSM_RETURN_IGNORE
*/ */
protected function OnError(&$iErrorCode) protected function OnError(&$iErrorCode)
{ {
@@ -272,14 +270,14 @@ interface iPreferencesExtension
{ {
/** /**
* @api * @api
* @param WebPage $oPage * @param \WebPage $oPage
* *
*/ */
public function DisplayPreferences(WebPage $oPage); public function DisplayPreferences(WebPage $oPage);
/** /**
* @api * @api
* @param WebPage $oPage * @param \WebPage $oPage
* @param string $sOperation * @param string $sOperation
* *
* @return bool true if the operation has been used * @return bool true if the operation has been used
@@ -337,6 +335,7 @@ abstract class AbstractPreferencesExtension implements iPreferencesExtension
* A recommended pattern is to cache data by the mean of static members. * A recommended pattern is to cache data by the mean of static members.
* *
* @api * @api
* @deprecated 3.1.0 N°4756 use the new event service instead, see {@see DBObject::FireEvent()} method
* @package UIExtensibilityAPI * @package UIExtensibilityAPI
*/ */
interface iApplicationUIExtension interface iApplicationUIExtension
@@ -488,6 +487,7 @@ interface iApplicationUIExtension
* @api * @api
* @package UIExtensibilityAPI * @package UIExtensibilityAPI
* @since 2.7.0 * @since 2.7.0
* @deprecated
*/ */
abstract class AbstractApplicationUIExtension implements iApplicationUIExtension abstract class AbstractApplicationUIExtension implements iApplicationUIExtension
{ {
@@ -560,7 +560,6 @@ abstract class AbstractApplicationUIExtension implements iApplicationUIExtension
* or through the GUI. * or through the GUI.
* *
* @api * @api
* @deprecated 3.1.0 N°4756 use the new event service instead, see {@see DBObject::FireEvent()} method. More details on each method PHPDoc.
* @package ORMExtensibilityAPI * @package ORMExtensibilityAPI
*/ */
interface iApplicationObjectExtension interface iApplicationObjectExtension
@@ -575,7 +574,6 @@ interface iApplicationObjectExtension
* Otherwise, the answer is definitively "yes, the object has changed". * Otherwise, the answer is definitively "yes, the object has changed".
* *
* @api * @api
* @deprecated 3.1.0 N°4756 No alternative available, this API was unstable and is abandoned
* @param \cmdbAbstractObject $oObject The target object * @param \cmdbAbstractObject $oObject The target object
* *
* @return boolean True if something has changed for the target object * @return boolean True if something has changed for the target object
@@ -589,7 +587,6 @@ interface iApplicationObjectExtension
* Anyhow, this API can be called in other contexts such as the CSV import tool. * Anyhow, this API can be called in other contexts such as the CSV import tool.
* *
* @api * @api
* @deprecated 3.1.0 N°4756 Use EVENT_DB_CHECK_TO_WRITE event instead
* @param \cmdbAbstractObject $oObject The target object * @param \cmdbAbstractObject $oObject The target object
* *
* @return string[] A list of errors message. An error message is made of one line and it can be displayed to the end-user. * @return string[] A list of errors message. An error message is made of one line and it can be displayed to the end-user.
@@ -604,7 +601,6 @@ interface iApplicationObjectExtension
* Please not that it is not possible to cascade deletion by this mean: only stopper issues can be handled. * Please not that it is not possible to cascade deletion by this mean: only stopper issues can be handled.
* *
* @api * @api
* @deprecated 3.1.0 N°4756 Use EVENT_DB_CHECK_TO_DELETE event instead
* @param \cmdbAbstractObject $oObject The target object * @param \cmdbAbstractObject $oObject The target object
* *
* @return string[] A list of errors message. An error message is made of one line and it can be displayed to the end-user. * @return string[] A list of errors message. An error message is made of one line and it can be displayed to the end-user.
@@ -621,7 +617,6 @@ interface iApplicationObjectExtension
* * {@see DBObject::Get()} : for a given attribute the new value that was persisted * * {@see DBObject::Get()} : for a given attribute the new value that was persisted
* *
* @api * @api
* @deprecated 3.1.0 N°4756 Use EVENT_DB_AFTER_WRITE event instead
* @param \cmdbAbstractObject $oObject The target object * @param \cmdbAbstractObject $oObject The target object
* @param CMDBChange|null $oChange A change context. Since 2.0 it is fine to ignore it, as the framework does maintain this information * @param CMDBChange|null $oChange A change context. Since 2.0 it is fine to ignore it, as the framework does maintain this information
* once for all the changes made within the current page * once for all the changes made within the current page
@@ -638,7 +633,6 @@ interface iApplicationObjectExtension
* The method is called right <b>after</b> the object has been written to the database. * The method is called right <b>after</b> the object has been written to the database.
* *
* @api * @api
* @deprecated 3.1.0 N°4756 Use EVENT_DB_AFTER_WRITE event instead
* @param \cmdbAbstractObject $oObject The target object * @param \cmdbAbstractObject $oObject The target object
* @param CMDBChange|null $oChange A change context. Since 2.0 it is fine to ignore it, as the framework does maintain this information * @param CMDBChange|null $oChange A change context. Since 2.0 it is fine to ignore it, as the framework does maintain this information
* once for all the changes made within the current page * once for all the changes made within the current page
@@ -653,7 +647,6 @@ interface iApplicationObjectExtension
* The method is called right <b>before</b> the object will be deleted from the database. * The method is called right <b>before</b> the object will be deleted from the database.
* *
* @api * @api
* @deprecated 3.1.0 N°4756 Use EVENT_DB_AFTER_DELETE event instead
* @param \cmdbAbstractObject $oObject The target object * @param \cmdbAbstractObject $oObject The target object
* @param CMDBChange|null $oChange A change context. Since 2.0 it is fine to ignore it, as the framework does maintain this information * @param CMDBChange|null $oChange A change context. Since 2.0 it is fine to ignore it, as the framework does maintain this information
* once for all the changes made within the current page * once for all the changes made within the current page
@@ -667,7 +660,6 @@ interface iApplicationObjectExtension
* Extend this class instead of iApplicationObjectExtension if you don't need to overload all methods * Extend this class instead of iApplicationObjectExtension if you don't need to overload all methods
* *
* @api * @api
* @deprecated 3.1.0 N°4756 use the new event service instead, see {@see DBObject::FireEvent()} method
* @package ORMExtensibilityAPI * @package ORMExtensibilityAPI
* @since 2.7.0 * @since 2.7.0
*/ */
@@ -1274,6 +1266,8 @@ abstract class AbstractPageUIExtension implements iPageUIExtension
*/ */
public function GetNorthPaneHtml(iTopWebPage $oPage) public function GetNorthPaneHtml(iTopWebPage $oPage)
{ {
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('use iPageUIBlockExtension instead');
return ''; return '';
} }
@@ -1282,6 +1276,8 @@ abstract class AbstractPageUIExtension implements iPageUIExtension
*/ */
public function GetSouthPaneHtml(iTopWebPage $oPage) public function GetSouthPaneHtml(iTopWebPage $oPage)
{ {
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('use iPageUIBlockExtension instead');
return ''; return '';
} }
@@ -1290,6 +1286,8 @@ abstract class AbstractPageUIExtension implements iPageUIExtension
*/ */
public function GetBannerHtml(iTopWebPage $oPage) public function GetBannerHtml(iTopWebPage $oPage)
{ {
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('use iPageUIBlockExtension instead');
return ''; return '';
} }
@@ -1711,11 +1709,6 @@ interface iRestServiceProvider
public function ExecOperation($sVersion, $sVerb, $aParams); public function ExecOperation($sVersion, $sVerb, $aParams);
} }
interface iRestInputSanitizer
{
public function SanitizeJsonInput(string $sJsonInput): string;
}
/** /**
* Minimal REST response structure. Derive this structure to add response data and error codes. * Minimal REST response structure. Derive this structure to add response data and error codes.
* *
@@ -1807,14 +1800,6 @@ class RestResult
* @api * @api
*/ */
public $message; public $message;
/**
* Sanitize the content of this result to hide sensitive information
*/
public function SanitizeContent()
{
// The default implementation does nothing
}
} }
/** /**
@@ -2024,8 +2009,6 @@ class RestUtils
* *
* @return DBObject The object found * @return DBObject The object found
* @throws Exception If the input structure is not valid or it could not find exactly one object * @throws Exception If the input structure is not valid or it could not find exactly one object
*
* @see DBObject::CheckChangedExtKeysValues() generic method to check that we can access the linked object isn't used in that use case because values can be literal, OQL, friendlyname
*/ */
public static function FindObjectFromKey($sClass, $key, $bAllowNullValue = false) public static function FindObjectFromKey($sClass, $key, $bAllowNullValue = false)
{ {
@@ -2112,16 +2095,8 @@ class RestUtils
elseif (is_string($key)) elseif (is_string($key))
{ {
// OQL // OQL
try { $oSearch = DBObjectSearch::FromOQL($key);
$oSearch = DBObjectSearch::FromOQL($key); }
} catch (Exception $e) {
throw new CoreOqlException('Query failed to execute', [
'query' => $key,
'exception_class' => get_class($e),
'exception_message' => $e->getMessage(),
]);
}
}
else else
{ {
throw new Exception("Wrong format for key"); throw new Exception("Wrong format for key");
@@ -2271,114 +2246,3 @@ interface iModuleExtension
*/ */
public function __construct(); public function __construct();
} }
/**
* KPI logging extensibility point
*
* KPI Logger extension
*/
interface iKPILoggerExtension
{
/**
* Init the statistics collected
*
* @return void
*/
public function InitStats();
/**
* Add a new KPI to the stats
*
* @param \Combodo\iTop\Core\Kpi\KpiLogData $oKpiLogData
*
* @return mixed
*/
public function LogOperation($oKpiLogData);
}
/**
* Implement this interface to add files to the backup
*
* @api
* @since 3.2.0
*/
interface iBackupExtraFilesExtension
{
/**
* @api
* @return string[] Array of relative paths (from app root) for files and directories to be included in the backup
*/
public function GetExtraFilesRelPaths(): array;
}
/**
* Interface to provide messages to be displayed in the "Welcome Popup"
*
* @api
* @since 3.2.0
*/
interface iWelcomePopupExtension
{
// Importance for ordering messages
// Just two levels since less important messages have nothing to do in the welcome popup
public const ENUM_IMPORTANCE_CRITICAL = 0;
public const ENUM_IMPORTANCE_HIGH = 1;
public const DEFAULT_IMPORTANCE = self::ENUM_IMPORTANCE_HIGH;
/**
* Overload this method if you need to display an icon representing the provider (eg. your own company logo, module icon, ...)
*
* @api
* @return string Relative path (from app. root) of the icon representing the provider
*/
public function GetIconRelPath(): string;
/**
* @api
* @return \Combodo\iTop\Application\WelcomePopup\Message[]
*/
public function GetMessages(): array;
/**
* Overload this method if the provider needs to do some additional processing after the message ($sMessageId) has been acknowledged by the current user
*
* @param string $sMessageId
* @api
*/
public function AcknowledgeMessage(string $sMessageId): void;
}
/**
* Inherit from this class to provide messages to be displayed in the "Welcome Popup"
*
* @api
* @since 3.2.0
*/
abstract class AbstractWelcomePopupExtension implements iWelcomePopupExtension
{
/**
* @inheritDoc
*/
public function GetIconRelPath(): string
{
return \Combodo\iTop\Application\Branding::$aLogoPaths[\Combodo\iTop\Application\Branding::ENUM_LOGO_TYPE_MAIN_LOGO_COMPACT]['default'];
}
/**
* @inheritDoc
*/
public function GetMessages(): array
{
return [];
}
/**
* @inheritDoc
*/
public function AcknowledgeMessage(string $sMessageId): void
{
// No need to process the acknowledgment notice by default
return;
}
}

View File

@@ -1,5 +1,5 @@
<?php <?php
// Copyright (C) 2010-2024 Combodo SAS // Copyright (C) 2010-2023 Combodo SARL
// //
// This file is part of iTop. // This file is part of iTop.
// //
@@ -22,7 +22,7 @@
* to check and is linked to a set of rules that determine the valid or invalid objects * to check and is linked to a set of rules that determine the valid or invalid objects
* inside the set * inside the set
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
@@ -34,15 +34,15 @@ class AuditCategory extends cmdbAbstractObject
{ {
$aParams = array $aParams = array
( (
"category" => "application,grant_by_profile", "category" => "application, grant_by_profile",
"key_type" => "autoincrement", "key_type" => "autoincrement",
"name_attcode" => "name", "name_attcode" => "name",
"state_attcode" => "", "state_attcode" => "",
"reconc_keys" => array('name'), "reconc_keys" => array('name'),
"db_table" => "priv_auditcategory", "db_table" => "priv_auditcategory",
"db_key_field" => "id", "db_key_field" => "id",
"db_finalclass_field" => "", "db_finalclass_field" => "",
'style' => new ormStyle(null, null, null, null, null, '../images/icons/icons8-audit-folder.svg'), 'style' => new ormStyle(null, null, null, null, null, '../images/icons/icons8-audit-folder.svg'),
); );
MetaModel::Init_Params($aParams); MetaModel::Init_Params($aParams);
MetaModel::Init_AddAttribute(new AttributeString("name", array("description"=>"Short name for this category", "allowed_values"=>null, "sql"=>"name", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array()))); MetaModel::Init_AddAttribute(new AttributeString("name", array("description"=>"Short name for this category", "allowed_values"=>null, "sql"=>"name", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
@@ -74,23 +74,15 @@ class AuditCategory extends cmdbAbstractObject
public function GetReportColor($iTotal, $iErrors) public function GetReportColor($iTotal, $iErrors)
{ {
$sResult = 'red'; $sResult = 'red';
if ( ($iTotal == 0) || ($iErrors / $iTotal) <= ($this->Get('ok_error_tolerance') / 100) ) { if ( ($iTotal == 0) || ($iErrors / $iTotal) <= ($this->Get('ok_error_tolerance') / 100) )
{
$sResult = 'green'; $sResult = 'green';
} else if (($iErrors / $iTotal) <= ($this->Get('warning_error_tolerance') / 100)) { }
else if ( ($iErrors / $iTotal) <= ($this->Get('warning_error_tolerance') / 100) )
{
$sResult = 'orange'; $sResult = 'orange';
} }
return $sResult; return $sResult;
} }
public static function GetShortcutActions($sFinalClass)
{
$aShortcutActions = parent::GetShortcutActions($sFinalClass);
if (!in_array('UI:Menu:RunAudit', $aShortcutActions)) {
$aShortcutActions[] = 'UI:Menu:RunAudit';
}
return $aShortcutActions;
}
} }
?> ?>

View File

@@ -1,5 +1,5 @@
<?php <?php
// Copyright (C) 2010-2024 Combodo SAS // Copyright (C) 2010-2023 Combodo SARL
// //
// This file is part of iTop. // This file is part of iTop.
// //
@@ -22,7 +22,7 @@
* to check and is linked to a set of rules that determine the valid or invalid objects * to check and is linked to a set of rules that determine the valid or invalid objects
* inside the set * inside the set
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
@@ -35,42 +35,30 @@ class AuditDomain extends cmdbAbstractObject
{ {
$aParams = array $aParams = array
( (
"category" => "application,grant_by_profile", "category" => "application, grant_by_profile",
"key_type" => "autoincrement", "key_type" => "autoincrement",
"name_attcode" => "name", "name_attcode" => "name",
"complementary_name_attcode" => array('description'), "state_attcode" => "",
"state_attcode" => "", "reconc_keys" => array('name'),
"reconc_keys" => array('name'), "db_table" => "priv_auditdomain",
"db_table" => "priv_auditdomain", "db_key_field" => "id",
"db_key_field" => "id", "db_finalclass_field" => "",
"db_finalclass_field" => "", 'style' => new ormStyle(null, null, null, null, null, '../images/icons/icons8-audit-album.svg'),
'style' => new ormStyle(null, null, null, null, null, '../images/icons/icons8-audit-album.svg'),
); );
MetaModel::Init_Params($aParams); MetaModel::Init_Params($aParams);
MetaModel::Init_AddAttribute(new AttributeString("name", array("description" => "Short name for this category", "allowed_values" => null, "sql" => "name", "default_value" => "", "is_null_allowed" => false, "depends_on" => array()))); MetaModel::Init_AddAttribute(new AttributeString("name", array("description"=>"Short name for this category", "allowed_values"=>null, "sql"=>"name", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeString("description", array("allowed_values" => null, "sql" => "description", "default_value" => "", "is_null_allowed" => true, "depends_on" => array()))); MetaModel::Init_AddAttribute(new AttributeString("description", array("allowed_values"=>null, "sql"=>"description", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeImage("icon", array("is_null_allowed" => true, "depends_on" => array(), "display_max_width" => 96, "display_max_height" => 96, "storage_max_width" => 256, "storage_max_height" => 256, "default_image" => null, "always_load_in_tables" => false))); MetaModel::Init_AddAttribute(new AttributeImage("icon", array("is_null_allowed"=>true, "depends_on"=>array(), "display_max_width"=>96, "display_max_height"=>96, "storage_max_width"=>256, "storage_max_height"=>256, "default_image"=>null, "always_load_in_tables"=>false)));
MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("categories_list", MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("categories_list", array("linked_class" => "lnkAuditCategoryToAuditDomain", "ext_key_to_me" => "domain_id", "ext_key_to_remote" => "category_id", "allowed_values" => null, "count_min" => 0, "count_max" => 0, "depends_on" => array())));
array("linked_class" => "lnkAuditCategoryToAuditDomain", "ext_key_to_me" => "domain_id", "ext_key_to_remote" => "category_id", "allowed_values" => null, "count_min" => 0, "count_max" => 0, "depends_on" => array())));
// Display lists // Display lists
MetaModel::Init_SetZListItems('details', array('name', 'description', 'icon', 'categories_list')); // Attributes to be displayed for the complete details MetaModel::Init_SetZListItems('details', array('name', 'description', 'icon', 'categories_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('description',)); // Attributes to be displayed for a list MetaModel::Init_SetZListItems('list', array('description', )); // Attributes to be displayed for a list
// Search criteria // Search criteria
MetaModel::Init_SetZListItems('standard_search', array('description')); // Criteria of the std search form MetaModel::Init_SetZListItems('standard_search', array('description')); // Criteria of the std search form
MetaModel::Init_SetZListItems('default_search', array('name', 'description')); // Criteria of the default search form MetaModel::Init_SetZListItems('default_search', array('name', 'description')); // Criteria of the default search form
} }
public static function GetShortcutActions($sFinalClass)
{
$aShortcutActions = parent::GetShortcutActions($sFinalClass);
if (!in_array('UI:Menu:RunAudit', $aShortcutActions)) {
$aShortcutActions[] = 'UI:Menu:RunAudit';
}
return $aShortcutActions;
}
} }
/** /**
@@ -86,26 +74,15 @@ class lnkAuditCategoryToAuditDomain extends cmdbAbstractObject
{ {
$aParams = array $aParams = array
( (
"category" => "application,grant_by_profile", "category" => "application, grant_by_profile",
"key_type" => "autoincrement", "key_type" => "autoincrement",
"name_attcode" => "", "name_attcode" => "",
"state_attcode" => "", "state_attcode" => "",
"reconc_keys" => array('category_id', 'domain_id'), "reconc_keys" => array('category_id', 'domain_id'),
"db_table" => "priv_link_audit_category_domain", "db_table" => "priv_link_audit_category_domain",
"db_key_field" => "id", "db_key_field" => "id",
"db_finalclass_field" => "", "db_finalclass_field" => "",
"is_link" => true, "is_link" => true,
'uniqueness_rules' => array(
'no_duplicate' => array(
'attributes' => array(
0 => 'category_id',
1 => 'domain_id',
),
'filter' => '',
'disabled' => false,
'is_blocking' => true,
),
),
); );
MetaModel::Init_Params($aParams); MetaModel::Init_Params($aParams);
MetaModel::Init_AddAttribute(new AttributeExternalKey("category_id", array("targetclass" => "AuditCategory", "jointype" => '', "allowed_values" => null, "sql" => "category_id", "is_null_allowed" => false, "on_target_delete" => DEL_AUTO, "depends_on" => array()))); MetaModel::Init_AddAttribute(new AttributeExternalKey("category_id", array("targetclass" => "AuditCategory", "jointype" => '', "allowed_values" => null, "sql" => "category_id", "is_null_allowed" => false, "on_target_delete" => DEL_AUTO, "depends_on" => array())));

View File

@@ -1,5 +1,5 @@
<?php <?php
// Copyright (C) 2010-2024 Combodo SAS // Copyright (C) 2010-2023 Combodo SARL
// //
// This file is part of iTop. // This file is part of iTop.
// //
@@ -23,7 +23,7 @@
* or the "bad" ones. The core audit engines computes the complement to the definition * or the "bad" ones. The core audit engines computes the complement to the definition
* set when needed to obtain either the valid objects, or the ones with an error * set when needed to obtain either the valid objects, or the ones with an error
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
@@ -35,23 +35,23 @@ class AuditRule extends cmdbAbstractObject
{ {
$aParams = array $aParams = array
( (
"category" => "application,grant_by_profile", "category" => "application, grant_by_profile",
"key_type" => "autoincrement", "key_type" => "autoincrement",
"name_attcode" => "name", "name_attcode" => "name",
"state_attcode" => "", "state_attcode" => "",
"reconc_keys" => array('name'), "reconc_keys" => array('name'),
"db_table" => "priv_auditrule", "db_table" => "priv_auditrule",
"db_key_field" => "id", "db_key_field" => "id",
"db_finalclass_field" => "", "db_finalclass_field" => "",
'style' => new ormStyle(null, null, null, null, null, '../images/icons/icons8-audit.svg'), 'style' => new ormStyle(null, null, null, null, null, '../images/icons/icons8-audit.svg'),
); );
MetaModel::Init_Params($aParams); MetaModel::Init_Params($aParams);
MetaModel::Init_AddAttribute(new AttributeString("name", array("allowed_values" => null, "sql" => "name", "default_value" => "", "is_null_allowed" => false, "depends_on" => array()))); MetaModel::Init_AddAttribute(new AttributeString("name", array("allowed_values"=>null, "sql"=>"name", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeString("description", array("allowed_values" => null, "sql" => "description", "default_value" => "", "is_null_allowed" => true, "depends_on" => array()))); MetaModel::Init_AddAttribute(new AttributeString("description", array("allowed_values"=>null, "sql"=>"description", "default_value"=>"", "is_null_allowed"=>true, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeOQL("query", array("allowed_values" => null, "sql" => "query", "default_value" => "", "is_null_allowed" => false, "depends_on" => array()))); MetaModel::Init_AddAttribute(new AttributeOQL("query", array("allowed_values"=>null, "sql"=>"query", "default_value"=>"", "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeEnum("valid_flag", array("allowed_values" => new ValueSetEnum('true,false'), "sql" => "valid_flag", "default_value" => "true", "is_null_allowed" => false, "depends_on" => array()))); MetaModel::Init_AddAttribute(new AttributeEnum("valid_flag", array("allowed_values"=>new ValueSetEnum('true,false'), "sql"=>"valid_flag", "default_value"=>"true", "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeExternalKey("category_id", array("allowed_values" => null, "sql" => "category_id", "targetclass" => "AuditCategory", "is_null_allowed" => false, "on_target_delete" => DEL_MANUAL, "depends_on" => array()))); MetaModel::Init_AddAttribute(new AttributeExternalKey("category_id", array("allowed_values"=>null, "sql"=>"category_id", "targetclass"=>"AuditCategory", "is_null_allowed"=>false, "on_target_delete"=>DEL_MANUAL, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeExternalField("category_name", array("allowed_values" => null, "extkey_attcode" => 'category_id', "target_attcode" => "name"))); MetaModel::Init_AddAttribute(new AttributeExternalField("category_name", array("allowed_values"=>null, "extkey_attcode"=> 'category_id', "target_attcode"=>"name")));
// Display lists // Display lists
MetaModel::Init_SetZListItems('details', array('category_id', 'name', 'description', 'query', 'valid_flag')); // Attributes to be displayed for the complete details MetaModel::Init_SetZListItems('details', array('category_id', 'name', 'description', 'query', 'valid_flag')); // Attributes to be displayed for the complete details
@@ -60,16 +60,5 @@ class AuditRule extends cmdbAbstractObject
MetaModel::Init_SetZListItems('standard_search', array('category_id', 'name', 'description', 'valid_flag', 'query')); // Criteria of the std search form MetaModel::Init_SetZListItems('standard_search', array('category_id', 'name', 'description', 'valid_flag', 'query')); // Criteria of the std search form
MetaModel::Init_SetZListItems('default_search', array('name', 'description', 'category_id')); // Criteria of the advanced search form MetaModel::Init_SetZListItems('default_search', array('name', 'description', 'category_id')); // Criteria of the advanced search form
} }
public static function GetShortcutActions($sFinalClass)
{
$aShortcutActions = parent::GetShortcutActions($sFinalClass);
if (!in_array('UI:Menu:RunAudit', $aShortcutActions)) {
$aShortcutActions[] = 'UI:Menu:RunAudit';
}
return $aShortcutActions;
}
} }
?> ?>

View File

@@ -1,8 +1,8 @@
<?php <?php
/** /**
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/CaptureWebPage.php, now loadable using autoloader * @deprecated will be removed in 3.1.0 - moved to sources/Application/WebPage/CaptureWebPage.php, now loadable using autoloader
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
*/ */
DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/CaptureWebPage.php, now loadable using autoloader'); DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/CaptureWebPage.php, now loadable using autoloader');

View File

@@ -1,8 +1,8 @@
<?php <?php
/** /**
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/CLIPage.php, now loadable using autoloader * @deprecated will be removed in 3.1.0 - moved to sources/Application/WebPage/CLIPage.php, now loadable using autoloader
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
*/ */
DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/CLIPage.php, now loadable using autoloader'); DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/CLIPage.php, now loadable using autoloader');

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
<?php <?php
/** /**
* Copyright (C) 2013-2024 Combodo SAS * Copyright (C) 2013-2023 Combodo SARL
* *
* This file is part of iTop. * This file is part of iTop.
* *

View File

@@ -1,8 +1,8 @@
<?php <?php
/** /**
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/CSVPage.php, now loadable using autoloader * @deprecated will be removed in 3.1.0 - moved to sources/Application/WebPage/CSVPage.php, now loadable using autoloader
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
*/ */
DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/CSVPage.php, now loadable using autoloader'); DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/CSVPage.php, now loadable using autoloader');

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
@@ -9,8 +9,6 @@ use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableSettings;
use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenu; use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenu;
use Combodo\iTop\Application\UI\Base\Component\Toolbar\ToolbarUIBlockFactory; use Combodo\iTop\Application\UI\Base\Component\Toolbar\ToolbarUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardLayout as DashboardLayoutUIBlock; use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardLayout as DashboardLayoutUIBlock;
use Combodo\iTop\Application\WebPage\iTopWebPage;
use Combodo\iTop\Application\WebPage\WebPage;
require_once(APPROOT.'application/dashboardlayout.class.inc.php'); require_once(APPROOT.'application/dashboardlayout.class.inc.php');
require_once(APPROOT.'application/dashlet.class.inc.php'); require_once(APPROOT.'application/dashlet.class.inc.php');
@@ -424,7 +422,7 @@ abstract class Dashboard
} }
/** /**
* @param WebPage $oPage * * @param \WebPage $oPage *
* @param array $aExtraParams * @param array $aExtraParams
* *
* @throws \ReflectionException * @throws \ReflectionException
@@ -480,7 +478,7 @@ abstract class Dashboard
CombodoTooltip.InitTooltipFromMarkup($("#attr_auto_reload_sec")); CombodoTooltip.InitTooltipFromMarkup($("#attr_auto_reload_sec"));
$("#attr_auto_reload_sec").prop('disabled', !$('#attr_auto_reload').is(':checked')); $("#attr_auto_reload_sec").prop('disabled', !$('#attr_auto_reload').is(':checked'));
$('#attr_auto_reload').on('change', function(ev) { $('#attr_auto_reload').change( function(ev) {
$("#attr_auto_reload_sec").prop('disabled', !$(this).is(':checked')); $("#attr_auto_reload_sec").prop('disabled', !$(this).is(':checked'));
} ); } );
@@ -515,7 +513,7 @@ EOF
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param bool $bEditMode * @param bool $bEditMode
* @param array $aExtraParams * @param array $aExtraParams
* @param bool $bCanEdit * @param bool $bCanEdit
@@ -524,7 +522,9 @@ EOF
*/ */
public function Render($oPage, $bEditMode = false, $aExtraParams = array(), $bCanEdit = true) public function Render($oPage, $bEditMode = false, $aExtraParams = array(), $bCanEdit = true)
{ {
$aExtraParams['dashboard_div_id'] = utils::Sanitize($aExtraParams['dashboard_div_id'] ?? null, $this->GetId(), utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER); if (!array_key_exists('dashboard_div_id', $aExtraParams)) {
$aExtraParams['dashboard_div_id'] = utils::Sanitize($this->GetId(), '', 'element_identifier');
}
/** @var \DashboardLayoutMultiCol $oLayout */ /** @var \DashboardLayoutMultiCol $oLayout */
$oLayout = new $this->sLayoutClass(); $oLayout = new $this->sLayoutClass();
@@ -561,15 +561,15 @@ JS
} }
if (!$bEditMode) { if (!$bEditMode) {
$oPage->LinkScriptFromAppRoot('js/dashlet.js'); $oPage->add_linked_script('../js/dashlet.js');
$oPage->LinkScriptFromAppRoot('js/dashboard.js'); $oPage->add_linked_script('../js/dashboard.js');
} }
return $oDashboard; return $oDashboard;
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* *
* @throws \ReflectionException * @throws \ReflectionException
* @throws \Exception * @throws \Exception
@@ -592,7 +592,7 @@ JS
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param array $aExtraParams * @param array $aExtraParams
*/ */
public function RenderDashletsProperties(WebPage $oPage, $aExtraParams = array()) public function RenderDashletsProperties(WebPage $oPage, $aExtraParams = array())
@@ -918,11 +918,6 @@ class RuntimeDashboard extends Dashboard
{ {
$bCustomized = false; $bCustomized = false;
$sDashboardFileSanitized = utils::RealPath(APPROOT.$sDashboardFile, APPROOT);
if (false === $sDashboardFileSanitized) {
throw new SecurityException('Invalid dashboard file !');
}
// Search for an eventual user defined dashboard // Search for an eventual user defined dashboard
$oUDSearch = new DBObjectSearch('UserDashboard'); $oUDSearch = new DBObjectSearch('UserDashboard');
$oUDSearch->AddCondition('user_id', UserRights::GetUserId(), '='); $oUDSearch->AddCondition('user_id', UserRights::GetUserId(), '=');
@@ -934,7 +929,7 @@ class RuntimeDashboard extends Dashboard
$sDashboardDefinition = $oUserDashboard->Get('contents'); $sDashboardDefinition = $oUserDashboard->Get('contents');
$bCustomized = true; $bCustomized = true;
} else { } else {
$sDashboardDefinition = @file_get_contents($sDashboardFileSanitized); $sDashboardDefinition = @file_get_contents($sDashboardFile);
} }
@@ -942,7 +937,7 @@ class RuntimeDashboard extends Dashboard
$oDashboard = new RuntimeDashboard($sDashBoardId); $oDashboard = new RuntimeDashboard($sDashBoardId);
$oDashboard->FromXml($sDashboardDefinition); $oDashboard->FromXml($sDashboardDefinition);
$oDashboard->SetCustomFlag($bCustomized); $oDashboard->SetCustomFlag($bCustomized);
$oDashboard->SetDefinitionFile($sDashboardFileSanitized); $oDashboard->SetDefinitionFile($sDashboardFile);
} else { } else {
$oDashboard = null; $oDashboard = null;
} }
@@ -1050,7 +1045,7 @@ EOF
$sSelectorHtml .= '</div>'; $sSelectorHtml .= '</div>';
$sFile = addslashes($this->GetDefinitionFile()); $sFile = addslashes($this->GetDefinitionFile());
$sReloadURL = json_encode($this->GetReloadURL()); $sReloadURL = $this->GetReloadURL();
$bFromDashboardPage = isset($aAjaxParams['from_dashboard_page']) ? isset($aAjaxParams['from_dashboard_page']) : false; $bFromDashboardPage = isset($aAjaxParams['from_dashboard_page']) ? isset($aAjaxParams['from_dashboard_page']) : false;
if ($bFromDashboardPage) { if ($bFromDashboardPage) {
@@ -1109,15 +1104,15 @@ JS
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param array $aExtraParams * @param array $aExtraParams
* *
* @throws \Exception * @throws \Exception
*/ */
protected function RenderEditionTools(WebPage $oPage, DashboardLayoutUIBlock $oDashboard, $aExtraParams) protected function RenderEditionTools(WebPage $oPage, DashboardLayoutUIBlock $oDashboard, $aExtraParams)
{ {
$oPage->LinkScriptFromAppRoot('node_modules/blueimp-file-upload/js/jquery.iframe-transport.js'); $oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/jquery.iframe-transport.js');
$oPage->LinkScriptFromAppRoot('node_modules/blueimp-file-upload/js/jquery.fileupload.js'); $oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/jquery.fileupload.js');
$sId = utils::Sanitize($this->GetId(), '', 'element_identifier'); $sId = utils::Sanitize($this->GetId(), '', 'element_identifier');
$sMenuTogglerId = "ibo-dashboard-menu-toggler-{$sId}"; $sMenuTogglerId = "ibo-dashboard-menu-toggler-{$sId}";
@@ -1139,8 +1134,9 @@ JS
->AddCSSClass('ibo-action-button'); ->AddCSSClass('ibo-action-button');
$oToolbar->AddSubBlock($oActionButton); $oToolbar->AddSubBlock($oActionButton);
$aActions = array(); $aActions = array();
$sFile = addslashes(utils::LocalPath($this->sDefinitionFile)); $sFile = addslashes($this->sDefinitionFile);
$sJSExtraParams = json_encode($aExtraParams); $sJSExtraParams = json_encode($aExtraParams);
if ($this->HasCustomDashboard()) { if ($this->HasCustomDashboard()) {
$oEdit = new JSPopupMenuItem('UI:Dashboard:Edit', Dict::S('UI:Dashboard:EditCustom'), "return EditDashboard('{$this->sId}', '$sFile', $sJSExtraParams)"); $oEdit = new JSPopupMenuItem('UI:Dashboard:Edit', Dict::S('UI:Dashboard:EditCustom'), "return EditDashboard('{$this->sId}', '$sFile', $sJSExtraParams)");
@@ -1163,7 +1159,7 @@ JS
$oToolbar->AddSubBlock($oActionButton) $oToolbar->AddSubBlock($oActionButton)
->AddSubBlock($oActionsMenu); ->AddSubBlock($oActionsMenu);
$sReloadURL = json_encode($this->GetReloadURL()); $sReloadURL = $this->GetReloadURL();
$oPage->add_script( $oPage->add_script(
<<<EOF <<<EOF
function EditDashboard(sId, sDashboardFile, aExtraParams) function EditDashboard(sId, sDashboardFile, aExtraParams)
@@ -1227,7 +1223,7 @@ EOF
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* *
* @param array $aExtraParams * @param array $aExtraParams
* *
@@ -1263,14 +1259,14 @@ EOF
$sOkButtonLabel = Dict::S('UI:Button:Save'); $sOkButtonLabel = Dict::S('UI:Button:Save');
$sCancelButtonLabel = Dict::S('UI:Button:Cancel'); $sCancelButtonLabel = Dict::S('UI:Button:Cancel');
$sId = json_encode($this->sId); $sId = addslashes($this->sId);
$sLayoutClass = json_encode($this->sLayoutClass); $sLayoutClass = addslashes($this->sLayoutClass);
$sAutoReload = $this->bAutoReload ? 'true' : 'false'; $sAutoReload = $this->bAutoReload ? 'true' : 'false';
$sAutoReloadSec = (string) $this->iAutoReloadSec; $sAutoReloadSec = (string) $this->iAutoReloadSec;
$sTitle = json_encode($this->sTitle); $sTitle = addslashes($this->sTitle);
$sFile = json_encode($this->GetDefinitionFile()); $sFile = addslashes($this->GetDefinitionFile());
$sUrl = utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php'; $sUrl = utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php';
$sReloadURL = json_encode($this->GetReloadURL()); $sReloadURL = $this->GetReloadURL();
$sExitConfirmationMessage = addslashes(Dict::S('UI:NavigateAwayConfirmationMessage')); $sExitConfirmationMessage = addslashes(Dict::S('UI:NavigateAwayConfirmationMessage'));
$sCancelConfirmationMessage = addslashes(Dict::S('UI:CancelConfirmationMessage')); $sCancelConfirmationMessage = addslashes(Dict::S('UI:CancelConfirmationMessage'));
@@ -1324,15 +1320,15 @@ $('#dashboard_editor').dialog({
}); });
$('#dashboard_editor .ui-layout-center').runtimedashboard({ $('#dashboard_editor .ui-layout-center').runtimedashboard({
dashboard_id: $sId, dashboard_id: '$sId',
layout_class: $sLayoutClass, layout_class: '$sLayoutClass',
title: $sTitle, title: '$sTitle',
auto_reload: $sAutoReload, auto_reload: $sAutoReload,
auto_reload_sec: $sAutoReloadSec, auto_reload_sec: $sAutoReloadSec,
submit_to: '$sUrl', submit_to: '$sUrl',
submit_parameters: {operation: 'save_dashboard', file: $sFile, extra_params: $sJSExtraParams, reload_url: '$sReloadURL'}, submit_parameters: {operation: 'save_dashboard', file: '$sFile', extra_params: $sJSExtraParams, reload_url: '$sReloadURL'},
render_to: '$sUrl', render_to: '$sUrl',
render_parameters: {operation: 'render_dashboard', file: $sFile, extra_params: $sJSExtraParams, reload_url: '$sReloadURL'}, render_parameters: {operation: 'render_dashboard', file: '$sFile', extra_params: $sJSExtraParams, reload_url: '$sReloadURL'},
new_dashlet_parameters: {operation: 'new_dashlet'} new_dashlet_parameters: {operation: 'new_dashlet'}
}); });
@@ -1487,7 +1483,7 @@ JS
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param $sOQL * @param $sOQL
* *
* @throws \DictExceptionMissingString * @throws \DictExceptionMissingString

View File

@@ -1,5 +1,5 @@
<?php <?php
// Copyright (C) 2010-2024 Combodo SAS // Copyright (C) 2010-2023 Combodo SARL
// //
// This file is part of iTop. // This file is part of iTop.
// //
@@ -19,12 +19,11 @@ use Combodo\iTop\Application\UI\Base\Component\Html\Html;
use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardColumn; use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardColumn;
use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardLayout as DashboardLayoutUIBlock; use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardLayout as DashboardLayoutUIBlock;
use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardRow; use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardRow;
use Combodo\iTop\Application\WebPage\WebPage;
/** /**
* Dashboard presentation * Dashboard presentation
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
abstract class DashboardLayout abstract class DashboardLayout
@@ -107,7 +106,7 @@ abstract class DashboardLayoutMultiCol extends DashboardLayout
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param $aCells * @param $aCells
* @param bool $bEditMode * @param bool $bEditMode
* @param array $aExtraParams * @param array $aExtraParams

View File

@@ -1,5 +1,5 @@
<?php <?php
// Copyright (C) 2012-2024 Combodo SAS // Copyright (C) 2012-2023 Combodo SARL
// //
// This file is part of iTop. // This file is part of iTop.
// //
@@ -23,14 +23,13 @@ use Combodo\iTop\Application\UI\Base\Component\Html\Html;
use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory; use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;
use Combodo\iTop\Application\UI\Base\iUIBlock; use Combodo\iTop\Application\UI\Base\iUIBlock;
use Combodo\iTop\Application\UI\Base\UIBlock; use Combodo\iTop\Application\UI\Base\UIBlock;
use Combodo\iTop\Application\WebPage\WebPage;
require_once(APPROOT.'application/forms.class.inc.php'); require_once(APPROOT.'application/forms.class.inc.php');
/** /**
* Base class for all 'dashlets' (i.e. widgets to be inserted into a dashboard) * Base class for all 'dashlets' (i.e. widgets to be inserted into a dashboard)
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
abstract class Dashlet abstract class Dashlet
@@ -223,7 +222,7 @@ abstract class Dashlet
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param bool $bEditMode * @param bool $bEditMode
* @param bool $bEnclosingDiv * @param bool $bEnclosingDiv
* @param array $aExtraParams * @param array $aExtraParams
@@ -299,7 +298,7 @@ EOF
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param bool $bEditMode * @param bool $bEditMode
* @param array $aExtraParams * @param array $aExtraParams
* *
@@ -310,7 +309,7 @@ EOF
/** /**
* Rendering without the real data * Rendering without the real data
* *
* @param WebPage $oPage * @param \WebPage $oPage
* @param bool $bEditMode * @param bool $bEditMode
* @param array $aExtraParams * @param array $aExtraParams
* *
@@ -668,7 +667,7 @@ class DashletUnknown extends Dashlet
*/ */
public function GetPropertiesFields(DesignerForm $oForm) public function GetPropertiesFields(DesignerForm $oForm)
{ {
$oField = new DesignerXMLField('xml', Dict::S('UI:DashletUnknown:Prop-XMLConfiguration'), $this->sOriginalDashletXML); $oField = new DesignerLongTextField('xml', Dict::S('UI:DashletUnknown:Prop-XMLConfiguration'), $this->sOriginalDashletXML);
$oForm->AddField($oField); $oForm->AddField($oField);
} }
@@ -870,7 +869,7 @@ class DashletPlainText extends Dashlet
public function Render($oPage, $bEditMode = false, $aExtraParams = array()) public function Render($oPage, $bEditMode = false, $aExtraParams = array())
{ {
$sText = $this->aProperties['text']; $sText = $this->aProperties['text'];
$sText = utils::EscapeHtml(Dict::S($sText)); $sText = utils::EscapeHtml($sText);
$sText = str_replace(array("\r\n", "\n", "\r"), "<br/>", $sText); $sText = str_replace(array("\r\n", "\n", "\r"), "<br/>", $sText);
$sId = 'plaintext_'.($bEditMode ? 'edit_' : '').$this->sId; $sId = 'plaintext_'.($bEditMode ? 'edit_' : '').$this->sId;
@@ -2138,7 +2137,7 @@ class DashletHeaderDynamic extends Dashlet
$oSet = new DBObjectSet($oFilter); $oSet = new DBObjectSet($oFilter);
$iCount = $oSet->Count(); $iCount = $oSet->Count();
$oAppContext = new ApplicationContext(); $oAppContext = new ApplicationContext();
$sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search'.$oAppContext->GetForLink(true).'&filter='.rawurlencode($oFilter->serialize()); $sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.rawurlencode($oFilter->serialize());
$oSubTitle->AddHtml('<a class="summary" href="'.$sHyperlink.'">'.Dict::Format(str_replace('_', ':', $sSubtitle), $iCount).'</a>'); $oSubTitle->AddHtml('<a class="summary" href="'.$sHyperlink.'">'.Dict::Format(str_replace('_', ':', $sSubtitle), $iCount).'</a>');
return $oPanel; return $oPanel;

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2"> <itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.1">
<classes> <classes>
<class id="AbstractResource" _delta="define"> <class id="AbstractResource" _delta="define">
<parent>cmdbAbstractObject</parent> <parent>cmdbAbstractObject</parent>
@@ -40,36 +40,6 @@
<presentation/> <presentation/>
<methods/> <methods/>
</class> </class>
<class id="WelcomePopupAcknowledge" _delta="define">
<parent>DBObject</parent>
<properties>
<comment>/** Acknowledge welcome popup messages */</comment>
<abstract>false</abstract>
<category></category>
<key_type>autoincrement</key_type>
<db_table>priv_welcome_popup_acknowledge</db_table>
</properties>
<fields>
<field id="message_uuid" xsi:type="AttributeString">
<sql>message_uuid</sql>
<default_value/>
<is_null_allowed>false</is_null_allowed>
</field>
<field id="user_id" xsi:type="AttributeExternalKey">
<sql>user_id</sql>
<target_class>User</target_class>
<is_null_allowed>false</is_null_allowed>
<on_target_delete>DEL_SILENT</on_target_delete>
</field>
<field id="acknowledge_date" xsi:type="AttributeDateTime">
<sql>acknowledge_date</sql>
<default_value/>
<is_null_allowed>false</is_null_allowed>
</field>
</fields>
<presentation/>
<methods/>
</class>
</classes> </classes>
<portals> <portals>
<portal id="backoffice" _delta="define"> <portal id="backoffice" _delta="define">
@@ -185,11 +155,6 @@
<decoration_classes>fas fa-cog</decoration_classes> <decoration_classes>fas fa-cog</decoration_classes>
</style> </style>
</menu> </menu>
<menu id="Integrations" xsi:type="TemplateMenuNode" _delta="define">
<rank>50</rank>
<parent>ConfigurationTools</parent>
<template_file/>
</menu>
<menu id="DataSources" xsi:type="OQLMenuNode" _delta="define"> <menu id="DataSources" xsi:type="OQLMenuNode" _delta="define">
<rank>20</rank> <rank>20</rank>
<parent>ConfigurationTools</parent> <parent>ConfigurationTools</parent>
@@ -221,39 +186,8 @@
</menu> </menu>
</menus> </menus>
<events> <events>
<event id="EVENT_DB_BEFORE_WRITE" _delta="define">
<name>Before create or update</name>
<description><![CDATA[An object is about to be written into the database.
The object can be modified.]]></description>
<sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources>
<replaces>DBObject::OnInsert</replaces>
<event_data>
<event_datum id="object">
<description>The object inserted</description>
<type>DBObject</type>
</event_datum>
<event_datum id="is_new">
<description>Creation flag</description>
<type>boolean</type>
</event_datum>
<event_datum id="stimulus_applied">
<description>Life cycle stimulus applied (null if not within a transition)</description>
<type>string</type>
</event_datum>
<event_datum id="debug_info">
<description>Debug string</description>
<type>string</type>
</event_datum>
</event_data>
</event>
<event id="EVENT_DB_CHECK_TO_WRITE" _delta="define"> <event id="EVENT_DB_CHECK_TO_WRITE" _delta="define">
<name>Check to write</name> <description>Check an object before it is written into the database (no change possible). Call DBObject::AddCheckIssue() to signal an issue</description>
<description><![CDATA[Check an object before it is written into the database (no change possible).
Call $this->AddCheckIssue($sErrorMessage) to report a blocking issue.
Call $this->AddCheckWarning($sWarningMessage) to display a warning.
]]></description>
<sources> <sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source> <source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources> </sources>
@@ -263,24 +197,14 @@ Call $this->AddCheckWarning($sWarningMessage) to display a warning.
<description>The object to check</description> <description>The object to check</description>
<type>DBObject</type> <type>DBObject</type>
</event_datum> </event_datum>
<event_datum id="is_new">
<description>Creation flag</description>
<type>boolean</type>
</event_datum>
<event_datum id="stimulus_applied">
<description>Life cycle stimulus applied (null if not within a transition)</description>
<type>string</type>
</event_datum>
<event_datum id="debug_info"> <event_datum id="debug_info">
<description>Debug string</description> <description>Debug string</description>
<type>string</type> <type>string</type>
</event_datum> </event_datum>
</event_data> </event_data>
</event> </event>
<event id="EVENT_DB_AFTER_WRITE" _delta="define"> <event id="EVENT_DB_CREATE_DONE" _delta="define">
<name>After create or update</name> <description>An object has been created into the database. The modifications can be propagated to other objects.</description>
<description><![CDATA[An object has been written into the database.
The modifications can be propagated to other objects.]]></description>
<sources> <sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source> <source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources> </sources>
@@ -290,18 +214,23 @@ The modifications can be propagated to other objects.]]></description>
<description>The object inserted</description> <description>The object inserted</description>
<type>DBObject</type> <type>DBObject</type>
</event_datum> </event_datum>
<event_datum id="is_new"> <event_datum id="debug_info">
<description>Creation flag</description> <description>Debug string</description>
<type>boolean</type>
</event_datum>
<event_datum id="changes">
<description><![CDATA[For updates, the list of changes done during this operation]]></description>
<type>array</type>
</event_datum>
<event_datum id="stimulus_applied">
<description>Life cycle stimulus applied (null if not within a transition)</description>
<type>string</type> <type>string</type>
</event_datum> </event_datum>
</event_data>
</event>
<event id="EVENT_DB_UPDATE_DONE" _delta="define">
<description>An object has been updated into the database and reloaded.</description>
<sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources>
<replaces>DBObject::AfterUpdate</replaces>
<event_data>
<event_datum id="object">
<description>The object updated</description>
<type>DBObject</type>
</event_datum>
<event_datum id="debug_info"> <event_datum id="debug_info">
<description>Debug string</description> <description>Debug string</description>
<type>string</type> <type>string</type>
@@ -309,9 +238,7 @@ The modifications can be propagated to other objects.]]></description>
</event_data> </event_data>
</event> </event>
<event id="EVENT_DB_CHECK_TO_DELETE" _delta="define"> <event id="EVENT_DB_CHECK_TO_DELETE" _delta="define">
<name>Check to delete</name> <description>Check an object before it is deleted from the database. Call DBObject::AddDeleteIssue() to signal an issue</description>
<description><![CDATA[Check an object before it is deleted from the database.
Call $this->AddDeleteIssue($sIssueMessage) to signal an issue.]]></description>
<sources> <sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source> <source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources> </sources>
@@ -327,27 +254,8 @@ Call $this->AddDeleteIssue($sIssueMessage) to signal an issue.]]></description>
</event_datum> </event_datum>
</event_data> </event_data>
</event> </event>
<event id="EVENT_DB_ABOUT_TO_DELETE" _delta="define"> <event id="EVENT_DB_DELETE_DONE" _delta="define">
<name>Before delete</name> <description>An object has been deleted into the database</description>
<description><![CDATA[An object is about to be deleted from the database]]></description>
<sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources>
<replaces>cmdbAbstractObject::OnDelete</replaces>
<event_data>
<event_datum id="object">
<description>The object about to be deleted</description>
<type>DBObject</type>
</event_datum>
<event_datum id="debug_info">
<description>Debug string</description>
<type>string</type>
</event_datum>
</event_data>
</event>
<event id="EVENT_DB_AFTER_DELETE" _delta="define">
<name>After delete</name>
<description><![CDATA[An object has been deleted into the database]]></description>
<sources> <sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source> <source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources> </sources>
@@ -363,10 +271,8 @@ Call $this->AddDeleteIssue($sIssueMessage) to signal an issue.]]></description>
</event_datum> </event_datum>
</event_data> </event_data>
</event> </event>
<event id="EVENT_ENUM_TRANSITIONS" _delta="define"> <event id="EVENT_DB_BEFORE_APPLY_STIMULUS" _delta="define">
<name>Enum transitions</name> <description>A stimulus is about to be applied to an object</description>
<description><![CDATA[Manage the allowed transitions in current object state.
The only action allowed is to deny transitions with $this->DenyTransition($sTransitionCode)]]></description>
<sources> <sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source> <source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources> </sources>
@@ -375,9 +281,89 @@ The only action allowed is to deny transitions with $this->DenyTransition($sTran
<description>The object where the stimulus is targeted</description> <description>The object where the stimulus is targeted</description>
<type>DBObject</type> <type>DBObject</type>
</event_datum> </event_datum>
<event_datum id="allowed_stimuli"> <event_datum id="stimulus">
<description>The list of available stimuli in the current state</description> <description>Current stimulus applied</description>
<type>array</type> <type>string</type>
</event_datum>
<event_datum id="previous_state">
<description>Object previous state</description>
<type>string</type>
</event_datum>
<event_datum id="new_state">
<description>Object new state</description>
<type>string</type>
</event_datum>
<event_datum id="save_object">
<description>The object must be saved in the database</description>
<type>boolean</type>
</event_datum>
<event_datum id="debug_info">
<description>Debug string</description>
<type>string</type>
</event_datum>
</event_data>
</event>
<event id="EVENT_DB_AFTER_APPLY_STIMULUS" _delta="define">
<description>A stimulus has been applied to an object</description>
<sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources>
<event_data>
<event_datum id="object">
<description>The object where the stimulus is targeted</description>
<type>DBObject</type>
</event_datum>
<event_datum id="stimulus">
<description>Current stimulus applied</description>
<type>string</type>
</event_datum>
<event_datum id="previous_state">
<description>Object previous state</description>
<type>string</type>
</event_datum>
<event_datum id="new_state">
<description>Object new state</description>
<type>string</type>
</event_datum>
<event_datum id="save_object">
<description>The object is asked to be saved in the database</description>
<type>boolean</type>
</event_datum>
<event_datum id="debug_info">
<description>Debug string</description>
<type>string</type>
</event_datum>
</event_data>
</event>
<event id="EVENT_DB_APPLY_STIMULUS_FAILED" _delta="define">
<description>A stimulus has failed</description>
<sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources>
<event_data>
<event_datum id="action">
<description>The action that failed to apply the stimulus</description>
<type>string</type>
</event_datum>
<event_datum id="object">
<description>The object where the stimulus is targeted</description>
<type>DBObject</type>
</event_datum>
<event_datum id="stimulus">
<description>Current stimulus applied</description>
<type>string</type>
</event_datum>
<event_datum id="previous_state">
<description>Object previous state</description>
<type>string</type>
</event_datum>
<event_datum id="new_state">
<description>Object new state</description>
<type>string</type>
</event_datum>
<event_datum id="save_object">
<description>The object must be saved in the database</description>
<type>boolean</type>
</event_datum> </event_datum>
<event_datum id="debug_info"> <event_datum id="debug_info">
<description>Debug string</description> <description>Debug string</description>
@@ -386,8 +372,7 @@ The only action allowed is to deny transitions with $this->DenyTransition($sTran
</event_data> </event_data>
</event> </event>
<event id="EVENT_DB_LINKS_CHANGED" _delta="define"> <event id="EVENT_DB_LINKS_CHANGED" _delta="define">
<name>Links on object have changed</name> <description>At least one link class was changed</description>
<description><![CDATA[At least one link class was changed]]></description>
<sources> <sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source> <source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources> </sources>
@@ -403,9 +388,7 @@ The only action allowed is to deny transitions with $this->DenyTransition($sTran
</event_data> </event_data>
</event> </event>
<event id="EVENT_DB_OBJECT_RELOAD" _delta="define"> <event id="EVENT_DB_OBJECT_RELOAD" _delta="define">
<name>Object reload</name> <description>An object has been re-loaded from the database</description>
<internal>true</internal>
<description><![CDATA[An object has been re-loaded from the database]]></description>
<sources> <sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source> <source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources> </sources>
@@ -421,8 +404,7 @@ The only action allowed is to deny transitions with $this->DenyTransition($sTran
</event_data> </event_data>
</event> </event>
<event id="EVENT_DB_COMPUTE_VALUES" _delta="define"> <event id="EVENT_DB_COMPUTE_VALUES" _delta="define">
<name>Recompute object values</name> <description>An object needs to be recomputed after changes</description>
<description><![CDATA[An object needs to be recomputed after changes]]></description>
<sources> <sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source> <source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources> </sources>
@@ -432,14 +414,6 @@ The only action allowed is to deny transitions with $this->DenyTransition($sTran
<description>The object inserted</description> <description>The object inserted</description>
<type>DBObject</type> <type>DBObject</type>
</event_datum> </event_datum>
<event_datum id="is_new">
<description>Creation flag</description>
<type>boolean</type>
</event_datum>
<event_datum id="stimulus_applied">
<description>Life cycle stimulus applied (null if not within a transition)</description>
<type>string</type>
</event_datum>
<event_datum id="debug_info"> <event_datum id="debug_info">
<description>Debug string</description> <description>Debug string</description>
<type>string</type> <type>string</type>
@@ -447,8 +421,7 @@ The only action allowed is to deny transitions with $this->DenyTransition($sTran
</event_data> </event_data>
</event> </event>
<event id="EVENT_DB_ARCHIVE" _delta="define"> <event id="EVENT_DB_ARCHIVE" _delta="define">
<name>Object archived</name> <description>An object has been archived</description>
<description><![CDATA[An object has been archived]]></description>
<sources> <sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source> <source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources> </sources>
@@ -464,8 +437,7 @@ The only action allowed is to deny transitions with $this->DenyTransition($sTran
</event_data> </event_data>
</event> </event>
<event id="EVENT_DB_UNARCHIVE" _delta="define"> <event id="EVENT_DB_UNARCHIVE" _delta="define">
<name>Object unarchived</name> <description>An object has been unarchived</description>
<description><![CDATA[An object has been unarchived]]></description>
<sources> <sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source> <source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources> </sources>
@@ -481,9 +453,7 @@ The only action allowed is to deny transitions with $this->DenyTransition($sTran
</event_data> </event_data>
</event> </event>
<event id="EVENT_DB_SET_ATTRIBUTES_FLAGS" _delta="define"> <event id="EVENT_DB_SET_ATTRIBUTES_FLAGS" _delta="define">
<name>Set attributes flags</name> <description>Set object attributes flags. Call cmdbAbstractObject::AddAttributeFlags() for all the attributes to be set for this target state.</description>
<description><![CDATA[Set object attributes flags.
Call $this->AddAttributeFlags($sAttCode, $iFlags) for all the attributes to be set for this target state.]]></description>
<sources> <sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source> <source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources> </sources>
@@ -494,7 +464,7 @@ Call $this->AddAttributeFlags($sAttCode, $iFlags) for all the attributes to be s
</event_datum> </event_datum>
<event_datum id="target_state"> <event_datum id="target_state">
<description>The target state in which to evaluate the flags</description> <description>The target state in which to evaluate the flags</description>
<type>string</type> <type>array</type>
</event_datum> </event_datum>
<event_datum id="debug_info"> <event_datum id="debug_info">
<description>Debug string</description> <description>Debug string</description>
@@ -503,9 +473,7 @@ Call $this->AddAttributeFlags($sAttCode, $iFlags) for all the attributes to be s
</event_data> </event_data>
</event> </event>
<event id="EVENT_DB_SET_INITIAL_ATTRIBUTES_FLAGS" _delta="define"> <event id="EVENT_DB_SET_INITIAL_ATTRIBUTES_FLAGS" _delta="define">
<name>Set initial attributes flags</name> <description>Set object initial attributes flags. Call cmdbAbstractObject::AddInitialAttributeFlags() for all the initial attributes to be set initially.</description>
<description><![CDATA[Set object initial attributes flags.
Call $this->AddInitialAttributeFlags($sAttCode, $iFlags) for all the initial attributes to be set initially.]]></description>
<sources> <sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source> <source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources> </sources>
@@ -521,8 +489,7 @@ Call $this->AddInitialAttributeFlags($sAttCode, $iFlags) for all the initial att
</event_data> </event_data>
</event> </event>
<event id="EVENT_DOWNLOAD_DOCUMENT" _delta="define"> <event id="EVENT_DOWNLOAD_DOCUMENT" _delta="define">
<name>Document downloaded</name> <description>A document has been downloaded from the GUI</description>
<description><![CDATA[A document has been downloaded from the GUI]]></description>
<sources> <sources>
<source id="Document">Document</source> <source id="Document">Document</source>
</sources> </sources>
@@ -531,18 +498,10 @@ Call $this->AddInitialAttributeFlags($sAttCode, $iFlags) for all the initial att
<description>The object containing the document</description> <description>The object containing the document</description>
<type>DBObject</type> <type>DBObject</type>
</event_datum> </event_datum>
<event_datum id="att_code">
<description>The optional object attribute code hosting the document</description>
<type>string</type>
</event_datum>
<event_datum id="document"> <event_datum id="document">
<description>The document downloaded</description> <description>The document downloaded</description>
<type>ormDocument</type> <type>ormDocument</type>
</event_datum> </event_datum>
<event_datum id="content_disposition">
<description>The content disposition of the document ("inline" or "attachment")</description>
<type>string</type>
</event_datum>
<event_datum id="debug_info"> <event_datum id="debug_info">
<description>Debug string</description> <description>Debug string</description>
<type>string</type> <type>string</type>
@@ -550,9 +509,7 @@ Call $this->AddInitialAttributeFlags($sAttCode, $iFlags) for all the initial att
</event_data> </event_data>
</event> </event>
<event id="EVENT_LOGIN" _delta="define"> <event id="EVENT_LOGIN" _delta="define">
<name>Login</name> <description>Inform the listeners about the connection states</description>
<internal>true</internal>
<description><![CDATA[Inform the listeners about the connection states]]></description>
<event_data> <event_data>
<event_datum id="code"> <event_datum id="code">
<description>The login step result code (LoginWebPage::EXIT_CODE_...) </description> <description>The login step result code (LoginWebPage::EXIT_CODE_...) </description>

View File

@@ -1,11 +1,9 @@
<?php <?php
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableSettings;
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Renderer\Console\ConsoleBlockRenderer; use Combodo\iTop\Renderer\Console\ConsoleBlockRenderer;
/** /**
* Copyright (C) 2013-2024 Combodo SAS * Copyright (C) 2013-2023 Combodo SARL
* *
* This file is part of iTop. * This file is part of iTop.
* *
@@ -63,8 +61,8 @@ class DataTable
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param DataTableSettings $oSettings * @param \DataTableSettings $oSettings
* @param $bActionsMenu * @param $bActionsMenu
* @param $sSelectMode * @param $sSelectMode
* @param $bViewLink * @param $bViewLink
@@ -143,7 +141,7 @@ class DataTable
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param $iPageSize * @param $iPageSize
* @param $iDefaultPageSize * @param $iDefaultPageSize
* @param $iPageIndex * @param $iPageIndex
@@ -238,7 +236,7 @@ class DataTable
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param $sSelectMode * @param $sSelectMode
* *
* @return string * @return string
@@ -257,7 +255,7 @@ class DataTable
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param $iPageSize * @param $iPageSize
* @param $iDefaultPageSize * @param $iDefaultPageSize
* @param $iPageIndex * @param $iPageIndex
@@ -326,7 +324,6 @@ class DataTable
$sPagesLinks = implode('', $aPagesToDisplay); $sPagesLinks = implode('', $aPagesToDisplay);
$sPagesList = '['.implode(',', array_keys($aPagesToDisplay)).']'; $sPagesList = '['.implode(',', array_keys($aPagesToDisplay)).']';
$sAppRootUrl = utils::GetAbsoluteUrlAppRoot();
$sSelectionMode = ($iNbPages == 1) ? '' : 'positive'; $sSelectionMode = ($iNbPages == 1) ? '' : 'positive';
$sHtml = $sHtml =
<<<EOF <<<EOF
@@ -334,11 +331,11 @@ class DataTable
<div $sPagerStyle> <div $sPagerStyle>
<table id="pager{$this->iListId}" class="pager"><tr> <table id="pager{$this->iListId}" class="pager"><tr>
<td>$sPages</td> <td>$sPages</td>
<td><img src="{$sAppRootUrl}images/first.png" class="first"/>AAAA</td> <td><img src="../images/first.png" class="first"/></td>
<td><img src="{$sAppRootUrl}images/prev.png" class="prev"/></td> <td><img src="../images/prev.png" class="prev"/></td>
<td><span id="index">$sPagesLinks</span></td> <td><span id="index">$sPagesLinks</span></td>
<td><img src="{$sAppRootUrl}images/next.png" class="next"/></td> <td><img src="../images/next.png" class="next"/></td>
<td><img src="{$sAppRootUrl}images/last.png" class="last"/></td> <td><img src="../images/last.png" class="last"/></td>
<td>$sPageSizeCombo</td> <td>$sPageSizeCombo</td>
<td><span id="loading">&nbsp;</span><input type="hidden" name="selectionMode" value="$sSelectionMode"></input> <td><span id="loading">&nbsp;</span><input type="hidden" name="selectionMode" value="$sSelectionMode"></input>
</td> </td>
@@ -351,7 +348,7 @@ EOF;
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param $aExtraParams * @param $aExtraParams
* *
* @return string * @return string
@@ -378,7 +375,7 @@ EOF;
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param $aExtraParams * @param $aExtraParams
* *
* @return string * @return string
@@ -408,7 +405,7 @@ EOF;
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param $aColumns * @param $aColumns
* @param $bViewLink * @param $bViewLink
* @param $iDefaultPageSize * @param $iDefaultPageSize
@@ -566,7 +563,7 @@ EOF;
{ {
if (is_object($aObjects[$sAlias])) if (is_object($aObjects[$sAlias]))
{ {
$sHilightClass = MetaModel::GetHilightClass($sClassName, $aObjects[$sAlias]); $sHilightClass = $aObjects[$sAlias]->GetHilightClass();
if ($sHilightClass != '') if ($sHilightClass != '')
{ {
$aRow['@class'] = $sHilightClass; $aRow['@class'] = $sHilightClass;
@@ -661,7 +658,7 @@ EOF;
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param $aColumns * @param $aColumns
* @param $sSelectMode * @param $sSelectMode
* @param $iPageSize * @param $iPageSize
@@ -793,7 +790,7 @@ JS
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param $iDefaultPageSize * @param $iDefaultPageSize
* @param $iStart * @param $iStart
*/ */
@@ -821,7 +818,7 @@ JS
class PrintableDataTable extends DataTable class PrintableDataTable extends DataTable
{ {
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param $iPageSize * @param $iPageSize
* @param $iDefaultPageSize * @param $iDefaultPageSize
* @param $iPageIndex * @param $iPageIndex
@@ -847,7 +844,7 @@ class PrintableDataTable extends DataTable
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param $aColumns * @param $aColumns
* @param $sSelectMode * @param $sSelectMode
* @param $iPageSize * @param $iPageSize

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
@@ -24,8 +24,6 @@ use Combodo\iTop\Application\UI\DisplayBlock\BlockChartAjaxBars\BlockChartAjaxBa
use Combodo\iTop\Application\UI\DisplayBlock\BlockChartAjaxPie\BlockChartAjaxPie; use Combodo\iTop\Application\UI\DisplayBlock\BlockChartAjaxPie\BlockChartAjaxPie;
use Combodo\iTop\Application\UI\DisplayBlock\BlockCsv\BlockCsv; use Combodo\iTop\Application\UI\DisplayBlock\BlockCsv\BlockCsv;
use Combodo\iTop\Application\UI\DisplayBlock\BlockList\BlockList; use Combodo\iTop\Application\UI\DisplayBlock\BlockList\BlockList;
use Combodo\iTop\Application\WebPage\iTopWebPage;
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Service\Router\Router; use Combodo\iTop\Service\Router\Router;
require_once(APPROOT.'/application/utils.inc.php'); require_once(APPROOT.'/application/utils.inc.php');
@@ -570,7 +568,7 @@ class DisplayBlock
} else { } else {
// render it as an Ajax (asynchronous) call // render it as an Ajax (asynchronous) call
$oHtml->AddCSSClass("loading"); $oHtml->AddCSSClass("loading");
$oHtml->AddHtml("<p><img src=\"".utils::GetAbsoluteUrlAppRoot()."images/indicator_arrows.gif\"> ".Dict::S('UI:Loading').'</p>'); $oHtml->AddHtml("<p><img src=\"../images/indicator_arrows.gif\"> ".Dict::S('UI:Loading').'</p>');
$oPage->add_script(' $oPage->add_script('
$.post("ajax.render.php?style='.$this->m_sStyle.'", $.post("ajax.render.php?style='.$this->m_sStyle.'",
{ operation: "ajax", filter: "'.$sFilter.'", extra_params: "'.$sExtraParams.'" }, { operation: "ajax", filter: "'.$sFilter.'", extra_params: "'.$sExtraParams.'" },
@@ -597,7 +595,7 @@ class DisplayBlock
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param array $aExtraParams * @param array $aExtraParams
* *
* @throws \ApplicationException * @throws \ApplicationException
@@ -706,7 +704,7 @@ class DisplayBlock
if ($bDoSearch) if ($bDoSearch)
{ {
// Keep the table_id identifying this table if we're performing a search // Keep the table_id identifying this table if we're performing a search
$sTableId = utils::ReadParam('_table_id_', null, false, utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER); $sTableId = utils::ReadParam('_table_id_', null, false, 'raw_data');
if ($sTableId != null) if ($sTableId != null)
{ {
$aExtraParams['table_id'] = $sTableId; $aExtraParams['table_id'] = $sTableId;
@@ -1085,7 +1083,6 @@ JS
$this->m_oSet = new CMDBObjectSet($this->m_oFilter, array(), $aQueryParams); $this->m_oSet = new CMDBObjectSet($this->m_oFilter, array(), $aQueryParams);
$this->m_oSet->SetShowObsoleteData($this->m_bShowObsoleteData); $this->m_oSet->SetShowObsoleteData($this->m_bShowObsoleteData);
} }
// Summary details // Summary details
$aCounts = array(); $aCounts = array();
$aStateLabels = array(); $aStateLabels = array();
@@ -1124,7 +1121,7 @@ JS
$oSingleGroupByValueFilter->SetShowObsoleteData($this->m_bShowObsoleteData); $oSingleGroupByValueFilter->SetShowObsoleteData($this->m_bShowObsoleteData);
} }
$sHyperlink = utils::GetAbsoluteUrlAppRoot() $sHyperlink = utils::GetAbsoluteUrlAppRoot()
.'pages/UI.php?operation=search'.$oAppContext->GetForLink(true) .'pages/UI.php?operation=search&'.$oAppContext->GetForLink()
.'&filter='.rawurlencode($oSingleGroupByValueFilter->serialize()); .'&filter='.rawurlencode($oSingleGroupByValueFilter->serialize());
$aCounts[$sStateValue] = ['link' => $sHyperlink, 'label' => $aCounts[$sStateValue]]; $aCounts[$sStateValue] = ['link' => $sHyperlink, 'label' => $aCounts[$sStateValue]];
} }
@@ -1132,18 +1129,6 @@ JS
} }
$oBlock = new UIContentBlockWithJSRefreshCallback(null, ["ibo-dashlet-header-dynamic--container"]); $oBlock = new UIContentBlockWithJSRefreshCallback(null, ["ibo-dashlet-header-dynamic--container"]);
// N°6394 Make sure to sort elements as defined in the datamodel
if (utils::IsNotNullOrEmptyString($sStateAttrCode)) {
$oAttDef = MetaModel::GetAttributeDef($sClass, $sStateAttrCode);
$aAllowedValues = $oAttDef->GetAllowedValues() ?? [];
$AllowedValuesKeys = array_keys($aAllowedValues);
uksort($aStateLabels, function ($sKey1, $sKey2) use ($AllowedValuesKeys) {
return array_search($sKey1, $AllowedValuesKeys) > array_search($sKey2, $AllowedValuesKeys) ? 1 : -1;
});
}
foreach ($aStateLabels as $sStateValue => $sStateLabel) { foreach ($aStateLabels as $sStateValue => $sStateLabel) {
$aCount = $aCounts[$sStateValue]; $aCount = $aCounts[$sStateValue];
$sHyperlink = $aCount['link']; $sHyperlink = $aCount['link'];
@@ -1232,7 +1217,7 @@ JS
$iCount = $this->m_oSet->Count(); $iCount = $this->m_oSet->Count();
$sClassLabel = MetaModel::GetName($sClass); $sClassLabel = MetaModel::GetName($sClass);
$sClassIconUrl = MetaModel::GetClassIcon($sClass, false); $sClassIconUrl = MetaModel::GetClassIcon($sClass, false);
$sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search'.$oAppContext->GetForLink(true).'&filter='.rawurlencode($this->m_oFilter->serialize()); $sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.rawurlencode($this->m_oFilter->serialize());
$aExtraParams['query_params'] = $this->m_oFilter->GetInternalParams(); $aExtraParams['query_params'] = $this->m_oFilter->GetInternalParams();
$aRefreshParams = [ $aRefreshParams = [
@@ -1241,17 +1226,13 @@ JS
]; ];
if (UserRights::IsActionAllowed($sClass, UR_ACTION_MODIFY)) { if (UserRights::IsActionAllowed($sClass, UR_ACTION_MODIFY)) {
$sCreateActionUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=new&class='.$sClass.$oAppContext->GetForLink(true); $sCreateActionUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=new&class='.$sClass.'&'.$oAppContext->GetForLink();
$sCreateActionLabel = Dict::Format('UI:Button:Create'); $sCreateActionLabel = Dict::Format('UI:Button:Create');
$oBlock = DashletFactory::MakeForDashletBadge($sClassIconUrl, $sHyperlink, $iCount, $sClassLabel, $sCreateActionUrl, $oBlock = DashletFactory::MakeForDashletBadge($sClassIconUrl, $sHyperlink, $iCount, $sClassLabel, $sCreateActionUrl,
$sCreateActionLabel, $aRefreshParams); $sCreateActionLabel, $aRefreshParams);
} else { } else {
$oBlock = DashletFactory::MakeForDashletBadge($sClassIconUrl, $sHyperlink, $iCount, $sClassLabel, null, null, $aRefreshParams); $oBlock = DashletFactory::MakeForDashletBadge($sClassIconUrl, $sHyperlink, $iCount, $sClassLabel, null, null, $aRefreshParams);
} }
$sClassDescription = MetaModel::GetClassDescription($sClass);
if (utils::IsNotNullOrEmptyString($sClassDescription)) {
$oBlock->SetClassDescription($sClassDescription);
}
return $oBlock; return $oBlock;
} }
@@ -1289,7 +1270,7 @@ JS
$aData = array(); $aData = array();
$oAppContext = new ApplicationContext(); $oAppContext = new ApplicationContext();
$sParams = $oAppContext->GetForLink(true); $sParams = $oAppContext->GetForLink();
foreach ($aGroupBy as $iRow => $iCount) { foreach ($aGroupBy as $iRow => $iCount) {
// Build the search for this subset // Build the search for this subset
$oSubsetSearch = $this->m_oFilter->DeepClone(); $oSubsetSearch = $this->m_oFilter->DeepClone();
@@ -1304,7 +1285,7 @@ JS
$aData[] = array( $aData[] = array(
'group' => $aLabels[$iRow], 'group' => $aLabels[$iRow],
'value' => "<a href=\"".utils::GetAbsoluteUrlAppRoot()."pages/UI.php?operation=search&dosearch=1$sParams&filter=$sFilter\">$iCount</a>" 'value' => "<a href=\"".utils::GetAbsoluteUrlAppRoot()."pages/UI.php?operation=search&dosearch=1&$sParams&filter=$sFilter\">$iCount</a>"
); // TO DO: add the context information ); // TO DO: add the context information
} }
$aAttribs = array( $aAttribs = array(
@@ -1356,7 +1337,7 @@ JS
} }
/** /**
* @param WebPage $oPage * @param \WebPage $oPage
* @param array $aExtraParams * @param array $aExtraParams
* *
* @return \Combodo\iTop\Application\UI\Base\iUIBlock * @return \Combodo\iTop\Application\UI\Base\iUIBlock
@@ -1380,7 +1361,7 @@ JS
/** /**
* @param array $aExtraParams * @param array $aExtraParams
* @param WebPage $oPage * @param \WebPage $oPage
* *
* @throws \ArchivedObjectException * @throws \ArchivedObjectException
* @throws \ConfigException * @throws \ConfigException
@@ -1458,7 +1439,7 @@ JS
/** /**
* @param array $aExtraParams * @param array $aExtraParams
* @param WebPage $oPage * @param \WebPage $oPage
* *
* @return \Combodo\iTop\Application\UI\Base\Layout\UIContentBlock * @return \Combodo\iTop\Application\UI\Base\Layout\UIContentBlock
* @throws \ApplicationException * @throws \ApplicationException
@@ -1566,7 +1547,7 @@ JS
/** /**
* @deprecated 3.1.0 N°5957 * @deprecated 3.1.0 N°5957
* *
* @param WebPage $oPage * @param \WebPage $oPage
* @param array $aExtraParams * @param array $aExtraParams
* *
* @return \Combodo\iTop\Application\UI\Base\Component\Html\Html|\Combodo\iTop\Application\UI\Base\Layout\UIContentBlock|string * @return \Combodo\iTop\Application\UI\Base\Component\Html\Html|\Combodo\iTop\Application\UI\Base\Layout\UIContentBlock|string
@@ -1636,7 +1617,7 @@ JS
$sGroupByExpr = isset($aExtraParams['group_by_expr']) ? '&params[group_by_expr]='.$aExtraParams['group_by_expr'] : ''; $sGroupByExpr = isset($aExtraParams['group_by_expr']) ? '&params[group_by_expr]='.$aExtraParams['group_by_expr'] : '';
$sFilter = $this->m_oFilter->serialize(false, $aQueryParams); $sFilter = $this->m_oFilter->serialize(false, $aQueryParams);
$oContext = new ApplicationContext(); $oContext = new ApplicationContext();
$sContextParam = $oContext->GetForLink(true); $sContextParam = $oContext->GetForLink();
$sAggregationFunction = isset($aExtraParams['aggregation_function']) ? $aExtraParams['aggregation_function'] : ''; $sAggregationFunction = isset($aExtraParams['aggregation_function']) ? $aExtraParams['aggregation_function'] : '';
$sAggregationAttr = isset($aExtraParams['aggregation_attribute']) ? $aExtraParams['aggregation_attribute'] : ''; $sAggregationAttr = isset($aExtraParams['aggregation_attribute']) ? $aExtraParams['aggregation_attribute'] : '';
$sLimit = isset($aExtraParams['limit']) ? $aExtraParams['limit'] : ''; $sLimit = isset($aExtraParams['limit']) ? $aExtraParams['limit'] : '';
@@ -1644,7 +1625,7 @@ JS
$sOrderDirection = isset($aExtraParams['order_direction']) ? $aExtraParams['order_direction'] : ''; $sOrderDirection = isset($aExtraParams['order_direction']) ? $aExtraParams['order_direction'] : '';
if (isset($aExtraParams['group_by_label'])) { if (isset($aExtraParams['group_by_label'])) {
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[group_by_label]={$aExtraParams['group_by_label']}&params[chart_type]=$sChartType&params[currentId]=$sChartId{$iChartCounter}&params[order_direction]=$sOrderDirection&params[order_by]=$sOrderBy&params[limit]=$sLimit&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sChartId{$iChartCounter}&filter=".rawurlencode($sFilter).$sContextParam; $sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[group_by_label]={$aExtraParams['group_by_label']}&params[chart_type]=$sChartType&params[currentId]=$sChartId{$iChartCounter}&params[order_direction]=$sOrderDirection&params[order_by]=$sOrderBy&params[limit]=$sLimit&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sChartId{$iChartCounter}&filter=".rawurlencode($sFilter).'&'.$sContextParam;
} else { } else {
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[chart_type]=$sChartType&params[currentId]=$sChartId{$iChartCounter}&params[order_direction]=$sOrderDirection&params[order_by]=$sOrderBy&params[limit]=$sLimit&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sChartId{$iChartCounter}&filter=".rawurlencode($sFilter).'&'.$sContextParam; $sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[chart_type]=$sChartType&params[currentId]=$sChartId{$iChartCounter}&params[order_direction]=$sOrderDirection&params[order_by]=$sOrderBy&params[limit]=$sLimit&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sChartId{$iChartCounter}&filter=".rawurlencode($sFilter).'&'.$sContextParam;
} }
@@ -1666,7 +1647,7 @@ JS
/** /**
* @param array $aExtraParams * @param array $aExtraParams
* @param WebPage $oPage * @param \WebPage $oPage
* *
* @throws \ArchivedObjectException * @throws \ArchivedObjectException
* @throws \CoreException * @throws \CoreException
@@ -1681,14 +1662,11 @@ JS
$oBlock = null; $oBlock = null;
$sJSURLs = ''; $sJSURLs = '';
$oContext = new ApplicationContext();
$sContextParam = $oContext->GetForLink(true);
if (isset($aExtraParams['group_by'])) { if (isset($aExtraParams['group_by'])) {
$this->MakeGroupByQuery($aExtraParams, $oGroupByExp, $sGroupByLabel, $aGroupBy, $sAggregationFunction, $sFctVar, $sAggregationAttr, $sSql); $this->MakeGroupByQuery($aExtraParams, $oGroupByExp, $sGroupByLabel, $aGroupBy, $sAggregationFunction, $sFctVar, $sAggregationAttr, $sSql);
$aRes = CMDBSource::QueryToArray($sSql); $aRes = CMDBSource::QueryToArray($sSql);
$oContext = new ApplicationContext();
$sContextParam = $oContext->GetForLink();
$iTotalCount = 0; $iTotalCount = 0;
$aURLs = array(); $aURLs = array();
@@ -1708,14 +1686,14 @@ JS
$oSubsetSearch = $this->m_oFilter->DeepClone(); $oSubsetSearch = $this->m_oFilter->DeepClone();
$oCondition = new BinaryExpression($oGroupByExp, '=', new ScalarExpression($sValue)); $oCondition = new BinaryExpression($oGroupByExp, '=', new ScalarExpression($sValue));
$oSubsetSearch->AddConditionExpression($oCondition); $oSubsetSearch->AddConditionExpression($oCondition);
$aURLs[] = utils::GetAbsoluteUrlAppRoot()."pages/UI.php?operation=search&format=html&filter=".rawurlencode($oSubsetSearch->serialize()).$sContextParam; $aURLs[] = utils::GetAbsoluteUrlAppRoot()."pages/UI.php?operation=search&format=html&filter=".rawurlencode($oSubsetSearch->serialize()).'&'.$sContextParam;
} }
$sJSURLs = json_encode($aURLs); $sJSURLs = json_encode($aURLs);
} }
if (isset($aExtraParams['group_by_label'])) { if (isset($aExtraParams['group_by_label'])) {
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$aExtraParams[group_by]&params[group_by_label]={$aExtraParams['group_by_label']}&params[chart_type]=$sChartType&params[currentId]=$aExtraParams[currentId]&params[order_direction]=$aExtraParams[order_direction]&params[order_by]=$aExtraParams[order_by]&params[limit]=$aExtraParams[limit]&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sId&filter=".rawurlencode($this->m_oFilter->ToOQL()).$sContextParam; $sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$aExtraParams[group_by]&params[group_by_label]={$aExtraParams['group_by_label']}&params[chart_type]=$sChartType&params[currentId]=$aExtraParams[currentId]&params[order_direction]=$aExtraParams[order_direction]&params[order_by]=$aExtraParams[order_by]&params[limit]=$aExtraParams[limit]&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sId&filter=".rawurlencode($this->m_oFilter->ToOQL()).'&'.$sContextParam;
} else { } else {
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$aExtraParams[group_by]&params[chart_type]=$sChartType&params[currentId]=$aExtraParams[currentId]&params[order_direction]=$aExtraParams[order_direction]&params[order_by]=$aExtraParams[order_by]&params[limit]=$aExtraParams[limit]&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sId&filter=".rawurlencode($this->m_oFilter->ToOQL()).$sContextParam; $sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$aExtraParams[group_by]&params[chart_type]=$sChartType&params[currentId]=$aExtraParams[currentId]&params[order_direction]=$aExtraParams[order_direction]&params[order_by]=$aExtraParams[order_by]&params[limit]=$aExtraParams[limit]&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sId&filter=".rawurlencode($this->m_oFilter->ToOQL()).'&'.$sContextParam;
} }
switch ($sChartType) { switch ($sChartType) {
@@ -1788,7 +1766,7 @@ JS
$oBlock->sCsvFile = strtolower($this->m_oFilter->GetClass()).'.csv'; $oBlock->sCsvFile = strtolower($this->m_oFilter->GetClass()).'.csv';
$oBlock->sDownloadLink = utils::GetAbsoluteUrlAppRoot().'webservices/export.php?expression='.urlencode($this->m_oFilter->ToOQL(true)).'&format=csv&filename='.urlencode($oBlock->sCsvFile); $oBlock->sDownloadLink = utils::GetAbsoluteUrlAppRoot().'webservices/export.php?expression='.urlencode($this->m_oFilter->ToOQL(true)).'&format=csv&filename='.urlencode($oBlock->sCsvFile);
$oBlock->sLinkToToggle = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search'.$oAppContext->GetForLink(true).'&filter='.rawurlencode($this->m_oFilter->serialize()).'&format=csv'; $oBlock->sLinkToToggle = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.rawurlencode($this->m_oFilter->serialize()).'&format=csv';
// Pass the parameters via POST, since expression may be very long // Pass the parameters via POST, since expression may be very long
$aParamsToPost = array( $aParamsToPost = array(
'expression' => $this->m_oFilter->ToOQL(true), 'expression' => $this->m_oFilter->ToOQL(true),
@@ -1835,7 +1813,7 @@ class MenuBlock extends DisplayBlock
* an object in with the same tab active by default as the tab that was active when selecting * an object in with the same tab active by default as the tab that was active when selecting
* the "Modify..." action. * the "Modify..." action.
* *
* @param WebPage $oPage * @param \WebPage $oPage
* @param array $aExtraParams * @param array $aExtraParams
* @param string|null $sId * @param string|null $sId
* *
@@ -1880,15 +1858,12 @@ class MenuBlock extends DisplayBlock
/** @var array $aToolkitActions Any "legacy" toolkit menu item, which are now displayed in the same menu as the $aRegularActions, after them */ /** @var array $aToolkitActions Any "legacy" toolkit menu item, which are now displayed in the same menu as the $aRegularActions, after them */
$aToolkitActions = []; $aToolkitActions = [];
// Display menu actions only if... if (!isset($aExtraParams['selection_mode']) || ($aExtraParams['selection_mode'] == "")) {
if (
// ... NOT in a selection mode
(!isset($aExtraParams['selection_mode']) || ($aExtraParams['selection_mode'] == ""))
// ... "menu" parameter is NOT EXPLICITLY disabled
&& (!isset($aExtraParams['menu']) || $aExtraParams['menu'] === "1" || $aExtraParams['menu'] === true)
) {
$oAppContext = new ApplicationContext(); $oAppContext = new ApplicationContext();
$sContext = $oAppContext->GetForLink(true); $sContext = $oAppContext->GetForLink();
if (utils::IsNotNullOrEmptyString($sContext)) {
$sContext = '&'.$sContext;
}
$sFilter = $this->GetFilter()->serialize(); $sFilter = $this->GetFilter()->serialize();
@@ -2024,8 +1999,8 @@ class MenuBlock extends DisplayBlock
$sSelectedClassName = MetaModel::GetName($sSelectedClass); $sSelectedClassName = MetaModel::GetName($sSelectedClass);
// Check rights on class // Check rights on class
$bIsBulkModifyAllowed = (!MetaModel::IsAbstract($sSelectedClass)) && UserRights::IsActionAllowed($sSelectedClass, UR_ACTION_BULK_MODIFY) && ($oReflectionClass->IsSubclassOf('cmdbAbstractObject')); $bIsBulkModifyAllowed = (!MetaModel::IsAbstract($sSelectedClass)) && UserRights::IsActionAllowed($sSelectedClass, UR_ACTION_BULK_MODIFY, $oSet) && ($oReflectionClass->IsSubclassOf('cmdbAbstractObject'));
$bIsBulkDeleteAllowed = (bool) UserRights::IsActionAllowed($sSelectedClass, UR_ACTION_BULK_DELETE); $bIsBulkDeleteAllowed = (bool) UserRights::IsActionAllowed($sSelectedClass, UR_ACTION_BULK_DELETE, $sSelectedClass);
// Refine filter on selected class so bullk actions occur on the right class // Refine filter on selected class so bullk actions occur on the right class
$oSelectedClassFilter = $this->GetFilter()->DeepClone(); $oSelectedClassFilter = $this->GetFilter()->DeepClone();
@@ -2044,7 +2019,7 @@ class MenuBlock extends DisplayBlock
} }
//---------------------------------------------------- //----------------------------------------------------
// Any style but NOT \DisplayBlock::ENUM_STYLE_LIST_IN_OBJECT (linksets) actions // Any style but NOT "listInObject" (linksets) actions
//---------------------------------------------------- //----------------------------------------------------
if ($this->m_sStyle !== static::ENUM_STYLE_LIST_IN_OBJECT) { if ($this->m_sStyle !== static::ENUM_STYLE_LIST_IN_OBJECT) {
switch ($iSetCount) { switch ($iSetCount) {
@@ -2346,15 +2321,10 @@ class MenuBlock extends DisplayBlock
false false
); );
// creation form title
if (array_key_exists('creation_in_modal_form_title', $aExtraParams) && $aExtraParams['creation_in_modal_form_title'] !== null) {
$oAddLinkActionButton->AddDataAttribute('modal-title', $aExtraParams['creation_in_modal_form_title']);
}
// - If we are used in a Datatable, 'datatable_' will be prefixed to our $sId, so we do the same here // - If we are used in a Datatable, 'datatable_' will be prefixed to our $sId, so we do the same here
$sRealId = $sId; $sRealId = $sId;
if (in_array($this->m_sStyle, [static::ENUM_STYLE_LIST, 'links', static::ENUM_STYLE_LIST_IN_OBJECT])) { if(in_array($this->m_sStyle, [static::ENUM_STYLE_LIST, 'links', static::ENUM_STYLE_LIST_IN_OBJECT])){
$sRealId = 'datatable_'.$sId; $sRealId = 'datatable_' . $sId;
} }
$oAddLinkActionButton->AddCSSClasses(['ibo-action-button', 'ibo-regular-action-button']) $oAddLinkActionButton->AddCSSClasses(['ibo-action-button', 'ibo-regular-action-button'])
->SetOnClickJsCode("$('#$sRealId').trigger('open_creation_modal.object.itop');"); ->SetOnClickJsCode("$('#$sRealId').trigger('open_creation_modal.object.itop');");
@@ -2578,8 +2548,11 @@ class MenuBlock extends DisplayBlock
$sUrl = "{$sRootUrl}pages/{$sUIPage}?{$sUrlParams}"; $sUrl = "{$sRootUrl}pages/{$sUIPage}?{$sUrlParams}";
$oAppContext = new ApplicationContext(); $oAppContext = new ApplicationContext();
$sContext = $oAppContext->GetForLink(true); $sContext = $oAppContext->GetForLink();
if (utils::IsNotNullOrEmptyString($sContext)) {
$sUrl .= '&'.$sContext;
}
return $sUrl . $sContext; return $sUrl;
} }
} }

View File

@@ -1,8 +1,8 @@
<?php <?php
/** /**
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/ErrorPage.php, now loadable using autoloader * @deprecated will be removed in 3.1.0 - moved to sources/Application/WebPage/ErrorPage.php, now loadable using autoloader
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
*/ */
DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/ErrorPage.php, now loadable using autoloader'); DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/ErrorPage.php, now loadable using autoloader');

View File

@@ -1,8 +1,4 @@
<?php <?php
use Combodo\iTop\Application\WebPage\CLIPage;
use Combodo\iTop\Application\WebPage\Page;
require_once('xlsxwriter.class.php'); require_once('xlsxwriter.class.php');
class ExcelExporter class ExcelExporter

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
@@ -60,24 +60,6 @@ class CoreCannotSaveObjectException extends CoreException
return $sContent; return $sContent;
} }
public function getTextMessage()
{
$sTitle = Dict::S('UI:Error:SaveFailed');
$sContent = $sTitle;
if (count($this->aIssues) == 1) {
$sIssue = reset($this->aIssues);
$sContent .= $sIssue;
} else {
foreach ($this->aIssues as $sError) {
$sContent .= " " . $sError . ", ";
}
}
return $sContent;
}
public function getIssues() public function getIssues()
{ {
return $this->aIssues; return $this->aIssues;

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
@@ -67,7 +67,7 @@ class CoreException extends Exception
public function getHtmlDesc($sHighlightHtmlBegin = '<b>', $sHighlightHtmlEnd = '</b>') public function getHtmlDesc($sHighlightHtmlBegin = '<b>', $sHighlightHtmlEnd = '</b>')
{ {
return utils::EscapeHtml($this->getMessage()); return $this->getMessage();
} }
/** /**

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,36 +0,0 @@
<?php
/**
* @since 2.7.10 3.0.4 3.1.1 3.2.0 N°6458 object creation
*/
class InvalidExternalKeyValueException extends CoreUnexpectedValue
{
private const ENUM_PARAMS_OBJECT = 'current_object';
private const ENUM_PARAMS_ATTCODE = 'attcode';
private const ENUM_PARAMS_ATTVALUE = 'attvalue';
private const ENUM_PARAMS_USER = 'current_user';
public function __construct($oObject, $sAttCode, $aContextData = null, $oPrevious = null)
{
$aContextData[self::ENUM_PARAMS_OBJECT] = get_class($oObject) . '::' . $oObject->GetKey();
$aContextData[self::ENUM_PARAMS_ATTCODE] = $sAttCode;
$aContextData[self::ENUM_PARAMS_ATTVALUE] = $oObject->Get($sAttCode);
$oCurrentUser = UserRights::GetUserObject();
if (false === is_null($oCurrentUser)) {
$aContextData[self::ENUM_PARAMS_USER] = get_class($oCurrentUser) . '::' . $oCurrentUser->GetKey();
}
parent::__construct('Attribute pointing to an object that is either non existing or not readable by the current user', $aContextData, '', $oPrevious);
}
public function GetAttCode(): string
{
return $this->getContextData()[self::ENUM_PARAMS_ATTCODE];
}
public function GetAttValue(): string
{
return $this->getContextData()[self::ENUM_PARAMS_ATTVALUE];
}
}

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/** /**
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,6 +1,6 @@
<?php <?php
/** /**
* Copyright (C) 2013-2024 Combodo SAS * Copyright (C) 2013-2023 Combodo SARL
* *
* This file is part of iTop. * This file is part of iTop.
* *

View File

@@ -1,5 +1,5 @@
<?php <?php
// Copyright (C) 2010-2024 Combodo SAS // Copyright (C) 2010-2023 Combodo SARL
// //
// This file is part of iTop. // This file is part of iTop.
// //
@@ -15,13 +15,12 @@
// //
// You should have received a copy of the GNU Affero General Public License // You should have received a copy of the GNU Affero General Public License
// along with iTop. If not, see <http://www.gnu.org/licenses/> // along with iTop. If not, see <http://www.gnu.org/licenses/>
use Combodo\iTop\Application\WebPage\WebPage;
/** /**
* Helper class to build interactive forms to be used either in stand-alone * Helper class to build interactive forms to be used either in stand-alone
* modal dialog or in "property-sheet" panes. * modal dialog or in "property-sheet" panes.
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
class DesignerForm class DesignerForm
@@ -209,7 +208,7 @@ class DesignerForm
public function RenderAsPropertySheet($oP, $bReturnHTML = false, $sNotifyParentSelector = null) public function RenderAsPropertySheet($oP, $bReturnHTML = false, $sNotifyParentSelector = null)
{ {
$sReturn = ''; $sReturn = '';
$sActionUrl = addslashes($this->sSubmitTo ?? ''); $sActionUrl = addslashes($this->sSubmitTo);
$sJSSubmitParams = json_encode($this->aSubmitParams); $sJSSubmitParams = json_encode($this->aSubmitParams);
$sFormId = $this->GetFormId(); $sFormId = $this->GetFormId();
if ($this->oParentForm == null) { if ($this->oParentForm == null) {
@@ -829,7 +828,7 @@ class DesignerFormField
} }
/** /**
* @param WebPage $oP * @param \WebPage $oP
* @param string $sFormId * @param string $sFormId
* @param string $sRenderMode * @param string $sRenderMode
* *
@@ -1111,41 +1110,13 @@ $('#$sId').on('change keyup validate', function() { ValidateWithPattern('$sId',
} }
EOF EOF
); );
$sValue = "<textarea $sCSSClasses id=\"$sId\" name=\"$sName\">".$this->PrepareValueForRendering()."</textarea>"; $sValue = "<textarea $sCSSClasses id=\"$sId\" name=\"$sName\">".utils::EscapeHtml($this->defaultValue)."</textarea>";
} }
else { else {
$sValue = "<div $sCSSClasses id=\"$sId\">".$this->PrepareValueForRendering()."</div>"; $sValue = "<div $sCSSClasses id=\"$sId\">".utils::EscapeHtml($this->defaultValue)."</div>";
} }
return array('label' => $this->sLabel, 'value' => $sValue); return array('label' => $this->sLabel, 'value' => $sValue);
} }
/**
* @return string|null The value itself as expected for rendering. May it be encoded, escaped or else.
* @since 3.1.0 N°6405
*/
protected function PrepareValueForRendering(): ?string
{
return utils::EscapeHtml($this->defaultValue);
}
}
/**
* Class DesignerXMLField
*
* Field to display XML content
*
* @author Guillaume Lajarige <guillaume.lajarige@combodo.com>
* @since 3.1.0 N°6405
*/
class DesignerXMLField extends DesignerLongTextField
{
/**
* @inheritDoc
*/
protected function PrepareValueForRendering(): ?string
{
return utils::EscapeHtml($this->defaultValue, true);
}
} }
class DesignerIntegerField extends DesignerFormField class DesignerIntegerField extends DesignerFormField
@@ -1330,8 +1301,7 @@ class DesignerComboField extends DesignerFormField
{ {
if ($this->bMultipleSelection) if ($this->bMultipleSelection)
{ {
$iSize = max(1, min(8, count($this->aAllowedValues))); $sHtml = "<span><select $sCSSClasses multiple size=\"8\"id=\"$sId\" name=\"$sName\">";
$sHtml = "<span><select $sCSSClasses multiple size=\"$iSize\" id=\"$sId\" name=\"$sName\">";
} }
else else
{ {

View File

@@ -1,5 +1,5 @@
<?php <?php
// Copyright (C) 2010-2024 Combodo SAS // Copyright (C) 2010-2023 Combodo SARL
// //
// This file is part of iTop. // This file is part of iTop.
// //
@@ -20,7 +20,7 @@
/** /**
* Persistent class InputOutputTask * Persistent class InputOutputTask
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,8 +1,8 @@
<?php <?php
/** /**
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/iTopWebPage.php, now loadable using autoloader * @deprecated will be removed in 3.1.0 - moved to sources/Application/WebPage/iTopWebPage.php, now loadable using autoloader
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
*/ */
// cannot notify depreciation for now as this is still MASSIVELY used in iTop core ! // cannot notify depreciation for now as this is still MASSIVELY used in iTop core !

View File

@@ -1,8 +1,8 @@
<?php <?php
/** /**
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/iTopWizardWebPage.php, now loadable using autoloader * @deprecated will be removed in 3.1.0 - moved to sources/Application/WebPage/iTopWizardWebPage.php, now loadable using autoloader
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
*/ */
DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/iTopWizardWebPage.php, now loadable using autoloader'); DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/iTopWizardWebPage.php, now loadable using autoloader');

View File

@@ -5,7 +5,7 @@ use Combodo\iTop\Application\Helper\Session;
/** /**
* Class LoginBasic * Class LoginBasic
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
@@ -80,11 +80,6 @@ class LoginBasic extends AbstractLoginFSMExtension
{ {
if (Session::Get('login_mode') == 'basic') if (Session::Get('login_mode') == 'basic')
{ {
$iOnExit = LoginWebPage::getIOnExit();
if ($iOnExit === LoginWebPage::EXIT_RETURN)
{
return LoginWebPage::LOGIN_FSM_RETURN; // Error, exit FSM
}
LoginWebPage::HTTP401Error(); LoginWebPage::HTTP401Error();
} }
return LoginWebPage::LOGIN_FSM_CONTINUE; return LoginWebPage::LOGIN_FSM_CONTINUE;

View File

@@ -1,6 +1,6 @@
<?php <?php
/** /**
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
@@ -53,12 +53,6 @@ class LoginDefaultBefore extends AbstractLoginFSMExtension
{ {
// Force login mode // Force login mode
LoginWebPage::SetLoginModeAndReload($sProposedLoginMode); LoginWebPage::SetLoginModeAndReload($sProposedLoginMode);
} else {
$sRawLoginMode = utils::ReadParam('login_mode', '', false, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
if ($sProposedLoginMode !== $sRawLoginMode) {
IssueLog::Error("Authentication issue due to login_mode parameter sanitization. Please avoid special characters", null, ['sRawLoginMode' => $sRawLoginMode]);
//IssueLog::Error("Authentication issue due to login_mode parameter sanitization. Please avoid special characters", null, ['sRawLoginMode' => utils::HtmlEntities($sRawLoginMode)]);
}
} }
return LoginWebPage::LOGIN_FSM_CONTINUE; return LoginWebPage::LOGIN_FSM_CONTINUE;
} }
@@ -85,7 +79,7 @@ class LoginDefaultAfter extends AbstractLoginFSMExtension implements iLogoutExte
{ {
self::ResetLoginSession(); self::ResetLoginSession();
$iOnExit = LoginWebPage::getIOnExit(); $iOnExit = LoginWebPage::getIOnExit();
if ($iOnExit === LoginWebPage::EXIT_RETURN) if ($iOnExit == LoginWebPage::EXIT_RETURN)
{ {
return LoginWebPage::LOGIN_FSM_RETURN; // Error, exit FSM return LoginWebPage::LOGIN_FSM_RETURN; // Error, exit FSM
} }
@@ -101,12 +95,6 @@ class LoginDefaultAfter extends AbstractLoginFSMExtension implements iLogoutExte
{ {
if (!Session::IsSet('login_mode')) if (!Session::IsSet('login_mode'))
{ {
// N°6358 - if EXIT_RETURN was asked, send an error
if (LoginWebPage::getIOnExit() === LoginWebPage::EXIT_RETURN) {
$iErrorCode = LoginWebPage::EXIT_CODE_WRONGCREDENTIALS;
return LoginWebPage::LOGIN_FSM_ERROR;
}
// If no plugin validated the user, exit // If no plugin validated the user, exit
self::ResetLoginSession(); self::ResetLoginSession();
exit(); exit();
@@ -125,11 +113,6 @@ class LoginDefaultAfter extends AbstractLoginFSMExtension implements iLogoutExte
protected function OnConnected(&$iErrorCode) protected function OnConnected(&$iErrorCode)
{ {
Session::Unset('login_temp_auth_user'); Session::Unset('login_temp_auth_user');
if (is_null(UserRights::GetUserObject())){
//N°7085 avoid infinite loop
IssueLog::Error("No user logged in. exit");
exit(-1);
}
return LoginWebPage::LOGIN_FSM_CONTINUE; return LoginWebPage::LOGIN_FSM_CONTINUE;
} }
@@ -145,4 +128,4 @@ class LoginDefaultAfter extends AbstractLoginFSMExtension implements iLogoutExte
} }
} }
} }
} }

View File

@@ -5,7 +5,7 @@ use Combodo\iTop\Application\Helper\Session;
/** /**
* Class LoginExternal * Class LoginExternal
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
@@ -73,11 +73,6 @@ class LoginExternal extends AbstractLoginFSMExtension
{ {
if (Session::Get('login_mode') == 'external') if (Session::Get('login_mode') == 'external')
{ {
$iOnExit = LoginWebPage::getIOnExit();
if ($iOnExit === LoginWebPage::EXIT_RETURN)
{
return LoginWebPage::LOGIN_FSM_RETURN; // Error, exit FSM
}
LoginWebPage::HTTP401Error(); LoginWebPage::HTTP401Error();
} }
return LoginWebPage::LOGIN_FSM_CONTINUE; return LoginWebPage::LOGIN_FSM_CONTINUE;

View File

@@ -1,7 +1,7 @@
<?php <?php
/** /**
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
@@ -44,10 +44,6 @@ class LoginForm extends AbstractLoginFSMExtension implements iLoginUIExtension
exit; exit;
} }
if (LoginWebPage::getIOnExit() === LoginWebPage::EXIT_RETURN) {
return LoginWebPage::LOGIN_FSM_CONTINUE;
}
// No credentials yet, display the form // No credentials yet, display the form
$oPage = LoginWebPage::NewLoginWebPage(); $oPage = LoginWebPage::NewLoginWebPage();
$oPage->DisplayLoginForm($this->bForceFormOnError); $oPage->DisplayLoginForm($this->bForceFormOnError);
@@ -140,11 +136,7 @@ class LoginForm extends AbstractLoginFSMExtension implements iLoginUIExtension
$oLoginContext->AddBlockExtension('login_form_footer', new LoginBlockExtension('extensionblock/loginformfooter.html.twig')); $oLoginContext->AddBlockExtension('login_form_footer', new LoginBlockExtension('extensionblock/loginformfooter.html.twig'));
$bEnableResetPassword = MetaModel::GetConfig()->Get('forgot_password'); $bEnableResetPassword = MetaModel::GetConfig()->Get('forgot_password');
$sResetPasswordUrl = MetaModel::GetConfig()->Get('forgot_password.url'); $sResetPasswordUrl = utils::GetAbsoluteUrlAppRoot() . 'pages/UI.php?loginop=forgot_pwd';
if ($sResetPasswordUrl == '')
{
$sResetPasswordUrl = utils::GetAbsoluteUrlAppRoot() . 'pages/UI.php?loginop=forgot_pwd';
}
$aData = array( $aData = array(
'bEnableResetPassword' => $bEnableResetPassword, 'bEnableResetPassword' => $bEnableResetPassword,
'sResetPasswordUrl' => $sResetPasswordUrl, 'sResetPasswordUrl' => $sResetPasswordUrl,

View File

@@ -2,14 +2,13 @@
/** /**
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
use Combodo\iTop\Application\Branding; use Combodo\iTop\Application\Branding;
use Combodo\iTop\Application\TwigBase\Twig\Extension; use Combodo\iTop\Application\TwigBase\Twig\Extension;
use Combodo\iTop\Application\WebPage\NiceWebPage;
use Twig\Environment; use Twig\Environment;
use Twig\Loader\ChainLoader; use Twig\Loader\ChainLoader;
use Twig\Loader\FilesystemLoader; use Twig\Loader\FilesystemLoader;
@@ -52,13 +51,12 @@ class LoginTwigContext
/** /**
* Set the absolute path on disk of the folder containing the twig templates * Set the absolute path on disk of the folder containing the twig templates
* *
* @param string $sPath absolute path of twig templates directory
* @api * @api
*
*@param string $sAbsPath Absolute path of twig templates directory
*/ */
public function SetLoaderPath($sAbsPath) public function SetLoaderPath($sPath)
{ {
$this->sTwigLoaderPath = $sAbsPath; $this->sTwigLoaderPath = $sPath;
} }
/** /**
@@ -85,27 +83,24 @@ class LoginTwigContext
} }
/** /**
* Add the absolute URL of a CSS file to link to the login screen * Add the URL of a CSS file to link to the login screen
* *
* @param string $sFile URL of the CSS file to link
* @api * @api
*
* @param string $sFileAbsURL Absolute URL of the CSS file to link
*/ */
public function AddCSSFile($sFileAbsURL) public function AddCSSFile($sFile)
{ {
$this->aCSSFiles[] = $sFileAbsURL; $this->aCSSFiles[] = $sFile;
} }
/** /**
* Add the absolute URL of a javascript file to link to the login screen * Add the URL of a javascript file to link to the login screen
* * @param string $sFile URL of the javascript file to link
* @api * @api
*
* @param string $sFileAbsURL Absolute URL of the javascript file to link
*/ */
public function AddJsFile($sFileAbsURL) public function AddJsFile($sFile)
{ {
$this->aJsFiles[] = $sFileAbsURL; $this->aJsFiles[] = $sFile;
} }
/** /**
@@ -137,7 +132,7 @@ class LoginTwigContext
} }
/** /**
* @return array Absolute URLs of the CSS files * @return array
*/ */
public function GetCSSFiles() public function GetCSSFiles()
{ {
@@ -145,7 +140,7 @@ class LoginTwigContext
} }
/** /**
* @return array Absolute URLs of the JS files * @return array
*/ */
public function GetJsFiles() public function GetJsFiles()
{ {
@@ -278,12 +273,12 @@ class LoginTwigRenderer
$aCSSFiles = $oFormData->GetCSSFiles(); $aCSSFiles = $oFormData->GetCSSFiles();
foreach ($aCSSFiles as $sCSSFile) foreach ($aCSSFiles as $sCSSFile)
{ {
$oPage->LinkStylesheetFromURI($sCSSFile); $oPage->add_linked_stylesheet($sCSSFile);
} }
$aJsFiles = $oFormData->GetJsFiles(); $aJsFiles = $oFormData->GetJsFiles();
foreach ($aJsFiles as $sJsFile) foreach ($aJsFiles as $sJsFile)
{ {
$oPage->LinkScriptFromURI($sJsFile); $oPage->add_linked_script($sJsFile);
} }
} }

View File

@@ -5,7 +5,7 @@ use Combodo\iTop\Application\Helper\Session;
/** /**
* Class LoginURL * Class LoginURL
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */

View File

@@ -1,5 +1,5 @@
<?php <?php
// Copyright (C) 2010-2024 Combodo SAS // Copyright (C) 2010-2023 Combodo SARL
// //
// This file is part of iTop. // This file is part of iTop.
// //
@@ -20,14 +20,12 @@
/** /**
* Class LoginWebPage * Class LoginWebPage
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
use Combodo\iTop\Application\Branding; use Combodo\iTop\Application\Branding;
use Combodo\iTop\Application\Helper\Session; use Combodo\iTop\Application\Helper\Session;
use Combodo\iTop\Application\WebPage\ErrorPage;
use Combodo\iTop\Application\WebPage\NiceWebPage;
use Combodo\iTop\Service\Events\EventData; use Combodo\iTop\Service\Events\EventData;
use Combodo\iTop\Service\Events\EventService; use Combodo\iTop\Service\Events\EventService;
@@ -82,7 +80,7 @@ class LoginWebPage extends NiceWebPage
} }
protected static $m_sLoginFailedMessage = ''; protected static $m_sLoginFailedMessage = '';
public function __construct($sTitle = null) public function __construct($sTitle = null)
{ {
if ($sTitle === null) { if ($sTitle === null) {
@@ -92,22 +90,13 @@ class LoginWebPage extends NiceWebPage
parent::__construct($sTitle); parent::__construct($sTitle);
$this->SetStyleSheet(); $this->SetStyleSheet();
$this->no_cache(); $this->no_cache();
$this->add_http_headers(); $this->add_xframe_options();
} }
public function SetStyleSheet() public function SetStyleSheet()
{ {
$this->LinkStylesheetFromAppRoot('css/login.css'); $this->add_linked_stylesheet(utils::GetAbsoluteUrlAppRoot().'css/login.css');
$this->LinkStylesheetFromAppRoot('css/font-awesome/css/all.min.css'); $this->add_linked_stylesheet(utils::GetAbsoluteUrlAppRoot().'css/font-awesome/css/all.min.css');
}
/**
* @inheritDoc
* @since 3.2.0
*/
protected function GetFaviconAbsoluteUrl()
{
return Branding::GetLoginFavIconAbsoluteUrl();
} }
public static function SetLoginFailedMessage($sMessage) public static function SetLoginFailedMessage($sMessage)
@@ -259,7 +248,6 @@ class LoginWebPage extends NiceWebPage
$oEmail = new Email(); $oEmail = new Email();
$oEmail->SetRecipientTO($sTo); $oEmail->SetRecipientTO($sTo);
$sFrom = MetaModel::GetConfig()->Get('forgot_password_from'); $sFrom = MetaModel::GetConfig()->Get('forgot_password_from');
$sFrom = utils::IsNullOrEmptyString($sFrom) ? MetaModel::GetConfig()->Get('email_default_sender_address') : $sFrom;
$oEmail->SetRecipientFrom($sFrom); $oEmail->SetRecipientFrom($sFrom);
$oEmail->SetSubject(Dict::S('UI:ResetPwd-EmailSubject', $oUser->Get('login'))); $oEmail->SetSubject(Dict::S('UI:ResetPwd-EmailSubject', $oUser->Get('login')));
$sResetUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?loginop=reset_pwd&auth_user='.urlencode($oUser->Get('login')).'&token='.urlencode($sToken); $sResetUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?loginop=reset_pwd&auth_user='.urlencode($oUser->Get('login')).'&token='.urlencode($sToken);
@@ -403,11 +391,6 @@ class LoginWebPage extends NiceWebPage
Session::Unset('can_logoff'); Session::Unset('can_logoff');
Session::Unset('archive_mode'); Session::Unset('archive_mode');
Session::Unset('impersonate_user'); Session::Unset('impersonate_user');
Session::Unset('PluginProperties');
Session::Unset('UrlMakerClass');
Session::Unset('itop_env');
Session::Unset('obj_messages');
Session::Unset('profile_list');
UserRights::_ResetSessionCache(); UserRights::_ResetSessionCache();
// If it's desired to kill the session, also delete the session cookie. // If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data! // Note: This will destroy the session, and not just the session data!
@@ -919,13 +902,13 @@ class LoginWebPage extends NiceWebPage
$aAllProfiles = array(); $aAllProfiles = array();
while ($oProfile = $oProfilesSet->Fetch()) while ($oProfile = $oProfilesSet->Fetch())
{ {
$aAllProfiles[mb_strtolower($oProfile->GetName())] = $oProfile->GetKey(); $aAllProfiles[strtolower($oProfile->GetName())] = $oProfile->GetKey();
} }
$aProfiles = array(); $aProfiles = array();
foreach ($aRequestedProfiles as $sRequestedProfile) foreach ($aRequestedProfiles as $sRequestedProfile)
{ {
$sRequestedProfile = mb_strtolower($sRequestedProfile); $sRequestedProfile = strtolower($sRequestedProfile);
if (isset($aAllProfiles[$sRequestedProfile])) if (isset($aAllProfiles[$sRequestedProfile]))
{ {
$aProfiles[] = $aAllProfiles[$sRequestedProfile]; $aProfiles[] = $aAllProfiles[$sRequestedProfile];
@@ -971,7 +954,7 @@ class LoginWebPage extends NiceWebPage
} }
else if($ret === false) else if($ret === false)
{ {
throw new Exception('Nowhere to go: Your combination of user Profiles denies you access to any '.ITOP_APPLICATION_SHORT.' portal. Please contact your administrator'); throw new Exception('Nowhere to go??');
} }
else else
{ {

View File

@@ -1,6 +1,6 @@
<?php <?php
/** /**
* Copyright (C) 2013-2024 Combodo SAS * Copyright (C) 2013-2023 Combodo SARL
* *
* This file is part of iTop. * This file is part of iTop.
* *
@@ -22,7 +22,6 @@
// Maintenance message display functions // Maintenance message display functions
// Only included by approot.inc.php // Only included by approot.inc.php
// //
use Combodo\iTop\Application\WebPage\ErrorPage;
/** /**
* Use a setup page to display the maintenance message * Use a setup page to display the maintenance message

View File

@@ -1,13 +1,10 @@
<?php <?php
/* /*
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
use Combodo\iTop\Application\Helper\WebResourcesHelper; use Combodo\iTop\Application\Helper\WebResourcesHelper;
use Combodo\iTop\Application\WebPage\ErrorPage;
use Combodo\iTop\Application\WebPage\iTopWebPage;
use Combodo\iTop\Application\WebPage\WebPage;
require_once(APPROOT.'/application/utils.inc.php'); require_once(APPROOT.'/application/utils.inc.php');
require_once(APPROOT.'/application/template.class.inc.php'); require_once(APPROOT.'/application/template.class.inc.php');
@@ -106,7 +103,7 @@ class ApplicationMenu
{ {
self::$sFavoriteSiloQuery = $sOQL; self::$sFavoriteSiloQuery = $sOQL;
} }
/** /**
* Get the query used to limit the list of displayed organizations in the drop-down menu * Get the query used to limit the list of displayed organizations in the drop-down menu
* @return string The OQL query returning a list of Organization objects * @return string The OQL query returning a list of Organization objects
@@ -125,7 +122,9 @@ class ApplicationMenu
*/ */
public static function CheckMenuIdEnabled($sMenuId) public static function CheckMenuIdEnabled($sMenuId)
{ {
if (self::IsMenuIdEnabled($sMenuId) === false) self::LoadAdditionalMenus();
$oMenuNode = self::GetMenuNode(self::GetMenuIndexById($sMenuId));
if (is_null($oMenuNode) || !$oMenuNode->IsEnabled())
{ {
require_once(APPROOT.'/setup/setuppage.class.inc.php'); require_once(APPROOT.'/setup/setuppage.class.inc.php');
$oP = new ErrorPage(Dict::S('UI:PageTitle:FatalError')); $oP = new ErrorPage(Dict::S('UI:PageTitle:FatalError'));
@@ -136,19 +135,6 @@ class ApplicationMenu
} }
} }
/**
* @param $sMenuId
*
* @return bool true if the menu exists and current user is allowed to see the menu
* @since 3.2.0
*/
public static function IsMenuIdEnabled($sMenuId):bool
{
self::LoadAdditionalMenus();
$oMenuNode = self::GetMenuNode(self::GetMenuIndexById($sMenuId));
return is_null($oMenuNode) === false && $oMenuNode->IsEnabled();
}
/** /**
* Main function to add a menu entry into the application, can be called during the definition * Main function to add a menu entry into the application, can be called during the definition
* of the data model objects * of the data model objects
@@ -280,11 +266,9 @@ class ApplicationMenu
$oMenuNode = static::GetMenuNode($sMenuGroupIdx); $oMenuNode = static::GetMenuNode($sMenuGroupIdx);
if (!($oMenuNode instanceof MenuGroup)) { if (!($oMenuNode instanceof MenuGroup)) {
IssueLog::Error('Menu node without parent (root menu) must be of type menu group. Parent menu is missing or not visible to user.', LogChannels::CONSOLE, [ IssueLog::Error('Menu node was not displayed as a menu group as it is actually not a menu group', LogChannels::CONSOLE, [
'menu_node_class' => get_class($oMenuNode), 'menu_node_class' => get_class($oMenuNode),
'menu_node_id' => $oMenuNode->GetMenuID(),
'menu_node_label' => $oMenuNode->GetLabel(), 'menu_node_label' => $oMenuNode->GetLabel(),
'current_user_id' => UserRights::GetUserId(),
]); ]);
continue; continue;
} }
@@ -361,7 +345,7 @@ class ApplicationMenu
/** /**
* Entry point to display the whole menu into the web page, used by iTopWebPage * Entry point to display the whole menu into the web page, used by iTopWebPage
* @param WebPage $oPage * @param \WebPage $oPage
* @param array $aExtraParams * @param array $aExtraParams
* @throws DictExceptionMissingString * @throws DictExceptionMissingString
* *
@@ -435,7 +419,7 @@ EOF
/** /**
* Handles the display of the sub-menus (called recursively if necessary) * Handles the display of the sub-menus (called recursively if necessary)
* *
* @param WebPage $oPage * @param \WebPage $oPage
* @param array $aMenus * @param array $aMenus
* @param array $aExtraParams * @param array $aExtraParams
* @param int $iActiveMenu * @param int $iActiveMenu
@@ -552,7 +536,7 @@ EOF
return -1; return -1;
} }
/** /**
* Retrieves the currently active menu (if any, otherwise the first menu is the default) * Retrieves the currently active menu (if any, otherwise the first menu is the default)
* @return string The Id of the currently active menu * @return string The Id of the currently active menu
@@ -560,7 +544,7 @@ EOF
public static function GetActiveNodeId() public static function GetActiveNodeId()
{ {
$oAppContext = new ApplicationContext(); $oAppContext = new ApplicationContext();
$sMenuId = $oAppContext->GetCurrentValue('menu', null); $sMenuId = $oAppContext->GetCurrentValue('menu', null);
if ($sMenuId === null) if ($sMenuId === null)
{ {
$sMenuId = self::GetDefaultMenuId(); $sMenuId = self::GetDefaultMenuId();
@@ -670,7 +654,7 @@ abstract class MenuNode
/** /**
* Stimulus to check: if the user can 'apply' this stimulus, then she/he can see this menu * Stimulus to check: if the user can 'apply' this stimulus, then she/he can see this menu
*/ */
protected $m_aEnableStimuli; protected $m_aEnableStimuli;
/** /**
@@ -830,7 +814,7 @@ abstract class MenuNode
{ {
return false; return false;
} }
/** /**
* Add a limiting display condition for the same menu node. The conditions will be combined with a AND * Add a limiting display condition for the same menu node. The conditions will be combined with a AND
* @param $oMenuNode MenuNode Another definition of the same menu node, with potentially different access restriction * @param $oMenuNode MenuNode Another definition of the same menu node, with potentially different access restriction
@@ -1003,7 +987,7 @@ class TemplateMenuNode extends MenuNode
* @var string * @var string
*/ */
protected $sTemplateFile; protected $sTemplateFile;
/** /**
* Create a menu item based on a custom template and inserts it into the application's main menu * Create a menu item based on a custom template and inserts it into the application's main menu
* @param string $sMenuId Unique identifier of the menu (used to identify the menu for bookmarking, and for getting the labels from the dictionary) * @param string $sMenuId Unique identifier of the menu (used to identify the menu for bookmarking, and for getting the labels from the dictionary)
@@ -1074,7 +1058,7 @@ class OQLMenuNode extends MenuNode
* @var bool|null * @var bool|null
*/ */
protected $bSearchFormOpen; protected $bSearchFormOpen;
/** /**
* Extra parameters to be passed to the display block to fine tune its appearence * Extra parameters to be passed to the display block to fine tune its appearence
*/ */
@@ -1107,7 +1091,7 @@ class OQLMenuNode extends MenuNode
// Enhancement: we could set as the "enable" condition that the user has enough rights to "read" the objects // Enhancement: we could set as the "enable" condition that the user has enough rights to "read" the objects
// of the class specified by the OQL... // of the class specified by the OQL...
} }
/** /**
* Set some extra parameters to be passed to the display block to fine tune its appearence * Set some extra parameters to be passed to the display block to fine tune its appearence
* @param array $aParams paramCode => value. See DisplayBlock::GetDisplay for the meaning of the parameters * @param array $aParams paramCode => value. See DisplayBlock::GetDisplay for the meaning of the parameters
@@ -1127,7 +1111,7 @@ class OQLMenuNode extends MenuNode
*/ */
public function RenderContent(WebPage $oPage, $aExtraParams = array()) public function RenderContent(WebPage $oPage, $aExtraParams = array())
{ {
$oTag = new ContextTag(ContextTag::TAG_OBJECT_SEARCH); ContextTag::AddContext(ContextTag::TAG_OBJECT_SEARCH);
ApplicationMenu::CheckMenuIdEnabled($this->GetMenuId()); ApplicationMenu::CheckMenuIdEnabled($this->GetMenuId());
OQLMenuNode::RenderOQLSearch OQLMenuNode::RenderOQLSearch
( (
@@ -1136,7 +1120,7 @@ class OQLMenuNode extends MenuNode
'Menu_'.$this->GetMenuId(), 'Menu_'.$this->GetMenuId(),
$this->bSearch, // Search pane $this->bSearch, // Search pane
$this->bSearchFormOpen, // Search open $this->bSearchFormOpen, // Search open
$oPage, $oPage,
array_merge($this->m_aParams, $aExtraParams), array_merge($this->m_aParams, $aExtraParams),
true true
); );
@@ -1159,11 +1143,11 @@ class OQLMenuNode extends MenuNode
{ {
$sUsageId = utils::GetSafeId($sUsageId); $sUsageId = utils::GetSafeId($sUsageId);
$oSearch = DBObjectSearch::FromOQL($sOql); $oSearch = DBObjectSearch::FromOQL($sOql);
$sClass= $oSearch->GetClass(); $sClass= $oSearch->GetClass();
$sIcon = MetaModel::GetClassIcon($sClass, false); $sIcon = MetaModel::GetClassIcon($sClass, false);
if ($bSearchPane) { if ($bSearchPane) {
$aParams = array_merge(['open' => $bSearchOpen, 'table_id' => $sUsageId, 'submit_on_load' => false], $aExtraParams); $aParams = array_merge(['open' => $bSearchOpen, 'table_id' => $sUsageId, 'submit_on_load' => false], $aExtraParams);
$oBlock = new DisplayBlock($oSearch, DisplayBlock::ENUM_STYLE_SEARCH, false /* Asynchronous */, $aParams); $oBlock = new DisplayBlock($oSearch, 'search', false /* Asynchronous */, $aParams);
$oBlock->Display($oPage, 0); $oBlock->Display($oPage, 0);
$oPage->add("<div class='sf_results_area ibo-add-margin-top-250' data-target='search_results'>"); $oPage->add("<div class='sf_results_area ibo-add-margin-top-250' data-target='search_results'>");
} }
@@ -1370,10 +1354,10 @@ class NewObjectMenuNode extends MenuNode
{ {
// Enable this menu, only if the current user has enough rights to create such an object, or an object of // Enable this menu, only if the current user has enough rights to create such an object, or an object of
// any child class // any child class
$aSubClasses = MetaModel::EnumChildClasses($this->sClass, ENUM_CHILD_CLASSES_ALL); // Including the specified class itself $aSubClasses = MetaModel::EnumChildClasses($this->sClass, ENUM_CHILD_CLASSES_ALL); // Including the specified class itself
$bActionIsAllowed = false; $bActionIsAllowed = false;
foreach($aSubClasses as $sCandidateClass) foreach($aSubClasses as $sCandidateClass)
{ {
if (!MetaModel::IsAbstract($sCandidateClass) && (UserRights::IsActionAllowed($sCandidateClass, UR_ACTION_MODIFY) == UR_ALLOWED_YES)) if (!MetaModel::IsAbstract($sCandidateClass) && (UserRights::IsActionAllowed($sCandidateClass, UR_ACTION_MODIFY) == UR_ALLOWED_YES))
@@ -1382,7 +1366,7 @@ class NewObjectMenuNode extends MenuNode
break; // Enough for now break; // Enough for now
} }
} }
return $bActionIsAllowed; return $bActionIsAllowed;
} }
/** /**
@@ -1524,7 +1508,7 @@ class DashboardMenuNode extends MenuNode
throw new Exception("Error: failed to load dashboard file: '{$this->sDashboardFile}'"); throw new Exception("Error: failed to load dashboard file: '{$this->sDashboardFile}'");
} }
} }
} }
/** /**
@@ -1565,7 +1549,7 @@ class ShortcutContainerMenuNode extends MenuNode
$sName = $this->GetMenuId().'_'.$oShortcut->GetKey(); $sName = $this->GetMenuId().'_'.$oShortcut->GetKey();
new ShortcutMenuNode($sName, $oShortcut, $this->GetIndex(), $fRank++); new ShortcutMenuNode($sName, $oShortcut, $this->GetIndex(), $fRank++);
} }
// Complete the tree // Complete the tree
// //
parent::PopulateChildMenus(); parent::PopulateChildMenus();

View File

@@ -1,5 +1,5 @@
<?php <?php
// Copyright (C) 2010-2024 Combodo SAS // Copyright (C) 2010-2023 Combodo SARL
// //
// This file is part of iTop. // This file is part of iTop.
// //

View File

@@ -1,8 +1,8 @@
<?php <?php
/** /**
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/NiceWebPage.php, now loadable using autoloader * @deprecated will be removed in 3.1.0 - moved to sources/Application/WebPage/NiceWebPage.php, now loadable using autoloader
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
*/ */
DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/NiceWebPage.php, now loadable using autoloader'); DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/NiceWebPage.php, now loadable using autoloader');

View File

@@ -1,8 +1,8 @@
<?php <?php
/** /**
* @deprecated 3.0.0 will be removed in 3.1.0 - moved to sources/Application/WebPage/PDFPage.php, now loadable using autoloader * @deprecated will be removed in 3.1.0 - moved to sources/Application/WebPage/PDFPage.php, now loadable using autoloader
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
*/ */
DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/PDFPage.php, now loadable using autoloader'); DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/PDFPage.php, now loadable using autoloader');

View File

@@ -9,17 +9,11 @@ class PortalDispatcher
$this->sPortalid = $sPortalId; $this->sPortalid = $sPortalId;
$this->aData = PortalDispatcherData::GetData($sPortalId); $this->aData = PortalDispatcherData::GetData($sPortalId);
} }
/** public function IsUserAllowed()
* @param \User|null $oUser
*
* @return bool
* @since 3.2.0 N°2039 Add $oUser parameter
*/
public function IsUserAllowed(?User $oUser = null)
{ {
$bRet = true; $bRet = true;
$aProfiles = UserRights::ListProfiles($oUser); $aProfiles = UserRights::ListProfiles();
foreach($this->aData['deny'] as $sDeniedProfile) foreach($this->aData['deny'] as $sDeniedProfile)
{ {

View File

@@ -1,6 +1,6 @@
<?php <?php
/* /*
* Copyright (C) 2010-2024 Combodo SAS * Copyright (C) 2010-2023 Combodo SARL
* *
* This file is part of iTop. * This file is part of iTop.
* *
@@ -21,7 +21,6 @@ use Combodo\iTop\Application\UI\Base\Component\Alert\AlertUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\FieldSet\FieldSetUIBlockFactory; use Combodo\iTop\Application\UI\Base\Component\FieldSet\FieldSetUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Html\Html; use Combodo\iTop\Application\UI\Base\Component\Html\Html;
use Combodo\iTop\Application\UI\Base\Component\Input\TextArea; use Combodo\iTop\Application\UI\Base\Component\Input\TextArea;
use Combodo\iTop\Application\WebPage\WebPage;
abstract class Query extends cmdbAbstractObject abstract class Query extends cmdbAbstractObject
{ {
@@ -75,7 +74,6 @@ abstract class Query extends cmdbAbstractObject
"default_value" => 0, "default_value" => 0,
"is_null_allowed" => false, "is_null_allowed" => false,
"depends_on" => array(), "depends_on" => array(),
"tracking_level" => ATTRIBUTE_TRACKING_NONE,
))); )));
MetaModel::Init_AddAttribute(new AttributeDateTime("export_last_date", array( MetaModel::Init_AddAttribute(new AttributeDateTime("export_last_date", array(
@@ -84,7 +82,6 @@ abstract class Query extends cmdbAbstractObject
"default_value" => null, "default_value" => null,
"is_null_allowed" => true, "is_null_allowed" => true,
"depends_on" => array(), "depends_on" => array(),
"tracking_level" => ATTRIBUTE_TRACKING_NONE,
))); )));
MetaModel::Init_AddAttribute(new AttributeExternalKey("export_last_user_id", MetaModel::Init_AddAttribute(new AttributeExternalKey("export_last_user_id",
@@ -96,16 +93,14 @@ abstract class Query extends cmdbAbstractObject
"depends_on"=>array(), "depends_on"=>array(),
"display_style"=>'select', "display_style"=>'select',
"always_load_in_tables"=>false, "always_load_in_tables"=>false,
"on_target_delete"=>DEL_SILENT, "on_target_delete"=>DEL_SILENT
"tracking_level" => ATTRIBUTE_TRACKING_NONE,
))); )));
MetaModel::Init_AddAttribute(new AttributeExternalField("export_last_user_contact", MetaModel::Init_AddAttribute(new AttributeExternalField("export_last_user_contact",
array( array(
"allowed_values"=>null, "allowed_values"=>null,
"extkey_attcode"=> "export_last_user_id", "extkey_attcode"=> "export_last_user_id",
"target_attcode"=>"contactid", "target_attcode"=>"contactid"
"tracking_level" => ATTRIBUTE_TRACKING_NONE,
))); )));
// Display lists // Display lists
@@ -297,7 +292,7 @@ class QueryOQL extends Query
} }
catch catch
(OQLException $e) { (OQLException $e) {
$oAlert = AlertUIBlockFactory::MakeForFailure(Dict::S('UI:RunQuery:Error'), $e->getHtmlDesc()) $oAlert = AlertUIBlockFactory::MakeForFailure(Dict::Format('UI:RunQuery:Error'), $e->getHtmlDesc())
->SetIsClosable(false) ->SetIsClosable(false)
->SetIsCollapsible(false); ->SetIsCollapsible(false);
$oAlert->AddCSSClass('mb-5'); $oAlert->AddCSSClass('mb-5');

View File

@@ -1,5 +1,5 @@
<?php <?php
// Copyright (C) 2010-2024 Combodo SAS // Copyright (C) 2010-2023 Combodo SARL
// //
// This file is part of iTop. // This file is part of iTop.
// //
@@ -16,14 +16,13 @@
// You should have received a copy of the GNU Affero General Public License // You should have received a copy of the GNU Affero General Public License
// along with iTop. If not, see <http://www.gnu.org/licenses/> // along with iTop. If not, see <http://www.gnu.org/licenses/>
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableSettings; use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableSettings;
use Combodo\iTop\Application\WebPage\WebPage;
/** /**
* Persistent class Shortcut and derived * Persistent class Shortcut and derived
* Shortcuts of any kind * Shortcuts of any kind
* *
* @copyright Copyright (C) 2010-2024 Combodo SAS * @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0 * @license http://opensource.org/licenses/AGPL-3.0
*/ */
@@ -293,7 +292,7 @@ $("#attr_auto_reload_sec").attr('data-tooltip-content', '$sRateTitle');
CombodoTooltip.InitTooltipFromMarkup($("#attr_auto_reload_sec")); CombodoTooltip.InitTooltipFromMarkup($("#attr_auto_reload_sec"));
$("#attr_auto_reload_sec").prop('disabled', !$('#attr_auto_reload').is(':checked')); $("#attr_auto_reload_sec").prop('disabled', !$('#attr_auto_reload').is(':checked'));
$('#attr_auto_reload').on('change', function(ev) { $('#attr_auto_reload').change( function(ev) {
$("#attr_auto_reload_sec").prop('disabled', !$(this).is(':checked')); $("#attr_auto_reload_sec").prop('disabled', !$(this).is(':checked'));
} ); } );

Some files were not shown because too many files have changed in this diff Show More